
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 <MSG_ZLEVELING_ENFORCED>:
    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 <MSG_MBL_FAILED>:
    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 <MSG_BED_HEATING_SAFETY_DISABLED>:
    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 <MSG_STOPPED>:
    3696:	ff ff 53 54 4f 50 50 45 44 2e 00                    ..STOPPED..

000036a1 <MSG_PAUSED_THERMAL_ERROR>:
    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 <MSG_GCODE_DIFF_CONTINUE>:
    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 <MSG_GCODE_DIFF_CANCELLED>:
    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 <MSG_GCODE_NEWER_FIRMWARE_CONTINUE>:
    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 <MSG_GCODE_NEWER_FIRMWARE_CANCELLED>:
    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 <MSG_GCODE_DIFF_PRINTER_CONTINUE>:
    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 <MSG_GCODE_DIFF_PRINTER_CANCELLED>:
    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 <MSG_PRESS_TO_PREHEAT>:
    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 <MSG_PRESS_TO_UNLOAD>:
    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 <MSG_PRESS>:
    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 <MSG_INSERT_FILAMENT>:
    387d:	ff ff 49 6e 73 65 72 74 20 66 69 6c 61 6d 65 6e     ..Insert filamen
    388d:	74 00                                               t.

0000388f <MSG_NOT_COLOR>:
    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 <MSG_NOT_LOADED>:
    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 <MSG_CORRECTLY>:
    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 <MSG_LOADING_COLOR>:
    38cd:	ff ff 4c 6f 61 64 69 6e 67 20 63 6f 6c 6f 72 00     ..Loading color.

000038dd <MSG_CHANGE_SUCCESS>:
    38dd:	ff ff 43 68 61 6e 67 65 20 73 75 63 63 65 73 73     ..Change success
    38ed:	21 00                                               !.

000038ef <MSG_CHECK_IDLER>:
    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 <MSG_UNLOAD_SUCCESSFUL>:
    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 <MSG_NEW_FIRMWARE_PLEASE_UPGRADE>:
    3943:	ff ff 50 6c 65 61 73 65 20 75 70 67 72 61 64 65     ..Please upgrade
    3953:	2e 00                                               ..

00003955 <MSG_NEW_FIRMWARE_AVAILABLE>:
    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 <MSG_WAITING_TEMP_PINDA>:
    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 <MSG_PLEASE_WAIT>:
    3999:	ff ff 50 6c 65 61 73 65 20 77 61 69 74 00           ..Please wait.

000039a7 <MSG_NO_MOVE>:
    39a7:	ff ff 4e 6f 20 6d 6f 76 65 2e 00                    ..No move..

000039b2 <MSG_USERWAIT>:
    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 <MSG_TEMP_CAL_WARNING>:
    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 <MSG_RUN_XYZ>:
    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 <MSG_EXTRUDER>:
    3a32:	ff ff 45 78 74 72 75 64 65 72 00                    ..Extruder.

00003a3d <MSG_MOVE_Z>:
    3a3d:	ff ff 4d 6f 76 65 20 5a 00                          ..Move Z.

00003a46 <MSG_MOVE_Y>:
    3a46:	ff ff 4d 6f 76 65 20 59 00                          ..Move Y.

00003a4f <MSG_MOVE_X>:
    3a4f:	ff ff 4d 6f 76 65 20 58 00                          ..Move X.

00003a58 <MSG_CRASH_DET_ONLY_IN_NORMAL>:
    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 <MSG_CRASH_DET_STEALTH_FORCE_OFF>:
    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 <MSG_MODE_CHANGE_IN_PROGRESS>:
    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 <MSG_COPY_SEL_LANG>:
    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 <MSG_COMMUNITY_MADE>:
    3afa:	ff ff 43 6f 6d 6d 75 6e 69 74 79 20 6d 61 64 65     ..Community made
	...

00003b0b <MSG_SHEET_OFFSET>:
    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 <MSG_PLEASE_LOAD_PLA>:
    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 <MSG_SELECT_FILAMENT>:
    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 <MSG_CANCEL>:
    3b6f:	ff ff 43 61 6e 63 65 6c 00                          ..Cancel.

00003b78 <MSG_WIZARD_RERUN>:
    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 <MSG_WIZARD_HEATING>:
    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 <MSG_WIZARD_LOAD_FILAMENT>:
    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 <MSG_MMU_INSERT_FILAMENT_FIRST_TUBE>:
    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 <MSG_WIZARD_V2_CAL_2>:
    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 <MSG_SELECT_TEMP_MATCHES_MATERIAL>:
    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 <MSG_SELECT_FIL_1ST_LAYERCAL>:
    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 <MSG_WIZARD_V2_CAL>:
    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 <MSG_Z_CALIBRATION_PROMPT>:
    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 <MSG_REMOVE_STEEL_SHEET>:
    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 <MSG_STEEL_SHEET_CHECK>:
    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 <MSG_WIZARD_CALIBRATION_FAILED>:
    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 <MSG_WIZARD_DONE>:
    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 <MSG_WIZARD_QUIT>:
    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 <MSG_ADDITIONAL_SHEETS>:
    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 <MSG_WIZARD_CLEAN_HEATBED>:
    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 <MSG_WIZARD_REPEAT_V2_CAL>:
    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 <MSG_SEL_PREHEAT_TEMP>:
    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 <MSG_FILAMENT_LOADED>:
    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 <MSG_TM_CAL>:
    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 <MSG_WIZARD_WILL_PREHEAT>:
    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 <MSG_WIZARD_Z_CAL>:
    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 <MSG_REMOVE_TEST_PRINT>:
    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 <MSG_REMOVE_SHIPPING_HELPERS>:
    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 <MSG_WIZARD_XYZ_CAL>:
    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 <MSG_WIZARD_SELFTEST>:
    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 <MSG_WIZARD_WELCOME>:
    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 <MSG_WIZARD_WELCOME_SHIPPING>:
    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 <MSG_EXTRUDER_CORRECTION>:
    42ec:	ff ff 45 2d 63 6f 72 72 65 63 74 00                 ..E-correct.

000042f8 <MSG_Z_CORRECTION>:
    42f8:	ff ff 5a 2d 63 6f 72 72 65 63 74 00                 ..Z-correct.

00004304 <MSG_Y_CORRECTION>:
    4304:	ff ff 59 2d 63 6f 72 72 65 63 74 00                 ..Y-correct.

00004310 <MSG_X_CORRECTION>:
    4310:	ff ff 58 2d 63 6f 72 72 65 63 74 00                 ..X-correct.

0000431c <MSG_PAUSE>:
    431c:	ff ff 50 61 75 73 65 00                             ..Pause.

00004324 <MSG_FS_ACTION>:
    4324:	ff ff 46 53 20 41 63 74 69 6f 6e 00                 ..FS Action.

00004330 <MSG_CONTINUE_SHORT>:
    4330:	ff ff 43 6f 6e 74 2e 00                             ..Cont..

00004338 <MSG_FSENSOR_JAM_DETECTION>:
    4338:	ff ff 46 2e 20 6a 61 6d 20 64 65 74 65 63 74 00     ..F. jam detect.

00004348 <MSG_FSENSOR_AUTOLOAD>:
    4348:	ff ff 46 2e 20 61 75 74 6f 6c 6f 61 64 00           ..F. autoload.

00004356 <MSG_FSENSOR_RUNOUT>:
    4356:	ff ff 46 2e 20 72 75 6e 6f 75 74 00                 ..F. runout.

00004362 <MSG_MMU_MODE>:
    4362:	ff ff 4d 4d 55 20 4d 6f 64 65 00                    ..MMU Mode.

0000436d <MSG_CUTTER>:
    436d:	ff ff 43 75 74 74 65 72 00                          ..Cutter.

00004376 <MSG_STEALTH>:
    4376:	ff ff 53 74 65 61 6c 74 68 00                       ..Stealth.

00004380 <MSG_CRASHDETECT>:
    4380:	ff ff 43 72 61 73 68 20 64 65 74 2e 00              ..Crash det..

0000438d <MSG_FAN_SPEED>:
    438d:	ff ff 46 61 6e 20 73 70 65 65 64 00                 ..Fan speed.

00004399 <MSG_BED>:
    4399:	ff ff 42 65 64 00                                   ..Bed.

0000439f <MSG_FANS_CHECK>:
    439f:	ff ff 46 61 6e 73 20 63 68 65 63 6b 00              ..Fans check.

000043ac <MSG_MODEL>:
    43ac:	ff ff 4d 6f 64 65 6c 00                             ..Model.

000043b4 <MSG_NOZZLE>:
    43b4:	ff ff 4e 6f 7a 7a 6c 65 00                          ..Nozzle.

000043bd <MSG_UNLOAD_FILAMENT_REPEAT>:
    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 <MSG_CHECKS>:
    43fa:	ff ff 43 68 65 63 6b 73 00                          ..Checks.

00004403 <MSG_NOZZLE_CNG_MENU>:
    4403:	ff ff 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 00     ..Nozzle change.

00004413 <MSG_NOZZLE_DIAMETER>:
    4413:	ff ff 4e 6f 7a 7a 6c 65 20 64 2e 00                 ..Nozzle d..

0000441f <MSG_SORT_ALPHA>:
    441f:	ff ff 41 6c 70 68 61 62 65 74 00                    ..Alphabet.

0000442a <MSG_SORT>:
    442a:	ff ff 53 6f 72 74 00                                ..Sort.

00004431 <MSG_SORT_TIME>:
    4431:	ff ff 54 69 6d 65 00                                ..Time.

00004438 <MSG_NORMAL>:
    4438:	ff ff 4e 6f 72 6d 61 6c 00                          ..Normal.

00004441 <MSG_SD_CARD>:
    4441:	ff ff 53 44 20 63 61 72 64 00                       ..SD card.

0000444b <MSG_SELECT_LANGUAGE>:
    444b:	ff ff 53 65 6c 65 63 74 20 6c 61 6e 67 75 61 67     ..Select languag
    445b:	65 00                                               e.

0000445d <MSG_RPI_PORT>:
    445d:	ff ff 52 50 69 20 70 6f 72 74 00                    ..RPi port.

00004468 <MSG_LIN_CORRECTION>:
    4468:	ff ff 4c 69 6e 2e 20 63 6f 72 72 65 63 74 69 6f     ..Lin. correctio
    4478:	6e 00                                               n.

0000447a <MSG_HW_SETUP>:
    447a:	ff ff 48 57 20 53 65 74 75 70 00                    ..HW Setup.

00004485 <MSG_LOADING_TEST>:
    4485:	ff ff 4c 6f 61 64 69 6e 67 20 54 65 73 74 00        ..Loading Test.

00004494 <MSG_DISABLE_STEPPERS>:
    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 <MSG_MOVE_AXIS>:
    44a7:	ff ff 4d 6f 76 65 20 61 78 69 73 00                 ..Move axis.

000044b3 <MSG_TEMPERATURE>:
    44b3:	ff ff 54 65 6d 70 65 72 61 74 75 72 65 00           ..Temperature.

000044c1 <MSG_PINDA_CALIBRATION>:
    44c1:	ff ff 50 49 4e 44 41 20 63 61 6c 2e 00              ..PINDA cal..

000044ce <MSG_CALIBRATE_BED_RESET>:
    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 <MSG_PID_EXTRUDER>:
    44e2:	ff ff 50 49 44 20 63 61 6c 69 62 72 61 74 69 6f     ..PID calibratio
    44f2:	6e 00                                               n.

000044f4 <MSG_BED_CORRECTION_MENU>:
    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 <MSG_MESH_BED_LEVELING>:
    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 <MSG_HOMEYZ>:
    451c:	ff ff 43 61 6c 69 62 72 61 74 65 20 5a 00           ..Calibrate Z.

0000452a <MSG_CALIBRATE_BED>:
    452a:	ff ff 43 61 6c 69 62 72 61 74 65 20 58 59 5a 00     ..Calibrate XYZ.

0000453a <MSG_SELFTEST>:
    453a:	ff ff 53 65 6c 66 74 65 73 74 00                    ..Selftest.

00004545 <MSG_BELTTEST>:
    4545:	ff ff 42 65 6c 74 20 74 65 73 74 00                 ..Belt test.

00004551 <MSG_WIZARD>:
    4551:	ff ff 57 69 7a 61 72 64 00                          ..Wizard.

0000455a <MSG_TESTING_FILAMENT>:
    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 <MSG_LOAD_ALL>:
    456d:	ff ff 4c 6f 61 64 20 41 6c 6c 00                    ..Load All.

00004578 <MSG_PULL_OUT_FILAMENT>:
    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 <MSG_RESET>:
    459f:	ff ff 52 65 73 65 74 00                             ..Reset.

000045a7 <MSG_RENAME>:
    45a7:	ff ff 52 65 6e 61 6d 65 00                          ..Rename.

000045b0 <MSG_V2_CALIBRATION>:
    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 <MSG_SELECT>:
    45c3:	ff ff 53 65 6c 65 63 74 00                          ..Select.

000045cc <MSG_STEEL_SHEETS>:
    45cc:	ff ff 53 74 65 65 6c 20 73 68 65 65 74 73 00        ..Steel sheets.

000045db <MSG_SUPPORT>:
    45db:	ff ff 53 75 70 70 6f 72 74 00                       ..Support.

000045e5 <MSG_MMU_FAIL_STATS>:
    45e5:	ff ff 46 61 69 6c 20 73 74 61 74 73 20 4d 4d 55     ..Fail stats MMU
	...

000045f6 <MSG_FAIL_STATS>:
    45f6:	ff ff 46 61 69 6c 20 73 74 61 74 73 00              ..Fail stats.

00004603 <MSG_STATISTICS>:
    4603:	ff ff 53 74 61 74 69 73 74 69 63 73 00              ..Statistics.

00004610 <MSG_CALIBRATION>:
    4610:	ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 00           ..Calibration.

0000461e <MSG_AUTOLOAD_FILAMENT>:
    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 <MSG_LOAD_FILAMENT>:
    4632:	ff ff 4c 6f 61 64 20 66 69 6c 61 6d 65 6e 74 00     ..Load filament.

00004642 <MSG_UNLOAD_FILAMENT>:
    4642:	ff ff 55 6e 6c 6f 61 64 20 66 69 6c 61 6d 65 6e     ..Unload filamen
    4652:	74 00                                               t.

00004654 <MSG_LOAD_TO_NOZZLE>:
    4654:	ff ff 4c 6f 61 64 20 74 6f 20 6e 6f 7a 7a 6c 65     ..Load to nozzle
	...

00004665 <MSG_PRELOAD_TO_MMU>:
    4665:	ff ff 50 72 65 6c 6f 61 64 20 74 6f 20 4d 4d 55     ..Preload to MMU
	...

00004676 <MSG_NO_CARD>:
    4676:	ff ff 4e 6f 20 53 44 20 63 61 72 64 00              ..No SD card.

00004683 <MSG_CARD_MENU>:
    4683:	ff ff 50 72 69 6e 74 20 66 72 6f 6d 20 53 44 00     ..Print from SD.

00004693 <MSG_TM_ACK_ERROR>:
    4693:	ff ff 43 6c 65 61 72 20 54 4d 20 65 72 72 6f 72     ..Clear TM error
	...

000046a4 <MSG_RESUME_PRINT>:
    46a4:	ff ff 52 65 73 75 6d 65 20 70 72 69 6e 74 00        ..Resume print.

000046b3 <MSG_PAUSE_PRINT>:
    46b3:	ff ff 50 61 75 73 65 20 70 72 69 6e 74 00           ..Pause print.

000046c1 <MSG_SET_READY>:
    46c1:	ff ff 53 65 74 20 52 65 61 64 79 00                 ..Set Ready.

000046cd <MSG_SET_NOT_READY>:
    46cd:	ff ff 53 65 74 20 6e 6f 74 20 52 65 61 64 79 00     ..Set not Ready.

000046dd <MSG_PREHEAT>:
    46dd:	ff ff 50 72 65 68 65 61 74 00                       ..Preheat.

000046e7 <MSG_TUNE>:
    46e7:	ff ff 54 75 6e 65 00                                ..Tune.

000046ee <MSG_BABYSTEP_Z>:
    46ee:	ff ff 4c 69 76 65 20 61 64 6a 75 73 74 20 5a 00     ..Live adjust Z.

000046fe <MSG_REPRINT>:
    46fe:	ff ff 52 65 70 72 69 6e 74 00                       ..Reprint.

00004708 <MSG_INFO_SCREEN>:
    4708:	ff ff 49 6e 66 6f 20 73 63 72 65 65 6e 00           ..Info screen.

00004716 <MSG_BRIGHTNESS>:
    4716:	ff ff 42 72 69 67 68 74 6e 65 73 73 00              ..Brightness.

00004723 <MSG_SOUND_BLIND>:
    4723:	ff ff 41 73 73 69 73 74 00                          ..Assist.

0000472c <MSG_SILENT>:
    472c:	ff ff 53 69 6c 65 6e 74 00                          ..Silent.

00004735 <MSG_SOUND_ONCE>:
    4735:	ff ff 4f 6e 63 65 00                                ..Once.

0000473c <MSG_SOUND>:
    473c:	ff ff 53 6f 75 6e 64 00                             ..Sound.

00004744 <MSG_SOUND_LOUD>:
    4744:	ff ff 4c 6f 75 64 00                                ..Loud.

0000474b <MSG_FSENSOR>:
    474b:	ff ff 46 69 6c 2e 20 73 65 6e 73 6f 72 00           ..Fil. sensor.

00004759 <MSG_FILAMENTCHANGE>:
    4759:	ff ff 43 68 61 6e 67 65 20 66 69 6c 61 6d 65 6e     ..Change filamen
    4769:	74 00                                               t.

0000476b <MSG_FLOW>:
    476b:	ff ff 46 6c 6f 77 00                                ..Flow.

00004772 <MSG_SPEED>:
    4772:	ff ff 53 70 65 65 64 00                             ..Speed.

0000477a <MSG_MAGNETS_COMP>:
    477a:	ff ff 4d 61 67 6e 65 74 73 20 63 6f 6d 70 2e 00     ..Magnets comp..

0000478a <MSG_NA>:
    478a:	ff ff 4e 2f 41 00                                   ..N/A.

00004790 <MSG_Z_PROBE_NR>:
    4790:	ff ff 5a 2d 70 72 6f 62 65 20 6e 72 2e 00           ..Z-probe nr..

0000479e <MSG_MESH>:
    479e:	ff ff 4d 65 73 68 00                                ..Mesh.

000047a5 <MSG_TIMEOUT>:
    47a5:	ff ff 54 69 6d 65 6f 75 74 00                       ..Timeout.

000047af <MSG_MODE>:
    47af:	ff ff 4d 6f 64 65 00                                ..Mode.

000047b6 <MSG_AUTO>:
    47b6:	ff ff 41 75 74 6f 00                                ..Auto.

000047bd <MSG_DIM>:
    47bd:	ff ff 44 69 6d 00                                   ..Dim.

000047c3 <MSG_BRIGHT>:
    47c3:	ff ff 42 72 69 67 68 74 00                          ..Bright.

000047cc <MSG_BL_LOW>:
    47cc:	ff ff 4c 65 76 65 6c 20 44 69 6d 6d 65 64 00        ..Level Dimmed.

000047db <MSG_BL_HIGH>:
    47db:	ff ff 4c 65 76 65 6c 20 42 72 69 67 68 74 00        ..Level Bright.

000047ea <MSG_SETTINGS>:
    47ea:	ff ff 53 65 74 74 69 6e 67 73 00                    ..Settings.

000047f5 <MSG_YES>:
    47f5:	ff ff 59 65 73 00                                   ..Yes.

000047fb <MSG_NO>:
    47fb:	ff ff 4e 6f 00                                      ..No.

00004800 <MSG_STOP_PRINT>:
    4800:	ff ff 53 74 6f 70 20 70 72 69 6e 74 00              ..Stop print.

0000480d <MSG_CHECKING_FILE>:
    480d:	ff ff 43 68 65 63 6b 69 6e 67 20 66 69 6c 65 00     ..Checking file.

0000481d <MSG_FILE_INCOMPLETE>:
    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 <MSG_REFRESH>:
    4830:	ff ff 84 52 65 66 72 65 73 68 00                    ...Refresh.

0000483b <MSG_MAIN>:
    483b:	ff ff 4d 61 69 6e 00                                ..Main.

00004842 <MSG_WAITING_TEMP>:
    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 <MSG_SELFTEST_OK>:
    4867:	ff ff 53 65 6c 66 74 65 73 74 20 4f 4b 00           ..Selftest OK.

00004875 <MSG_SELFTEST_START>:
    4875:	ff ff 53 65 6c 66 74 65 73 74 20 73 74 61 72 74     ..Selftest start
	...

00004886 <MSG_PRINT_FAN_SPEED>:
    4886:	ff ff 50 72 69 6e 74 20 66 61 6e 3a 00              ..Print fan:.

00004893 <MSG_HOTEND_FAN_SPEED>:
    4893:	ff ff 48 6f 74 65 6e 64 20 66 61 6e 3a 00           ..Hotend fan:.

000048a1 <MSG_CALIBRATING_HOME>:
    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 <MSG_SELFTEST_CHECK_ALLCORRECT>:
    48b4:	ff ff 41 6c 6c 20 63 6f 72 72 65 63 74 00           ..All correct.

000048c2 <MSG_SELFTEST_CHECK_FSENSOR>:
    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 <MSG_SELFTEST_CHECK_HOTEND>:
    48d5:	ff ff 43 68 65 63 6b 69 6e 67 20 68 6f 74 65 6e     ..Checking hoten
    48e5:	64 00                                               d.

000048e7 <MSG_SELFTEST_CHECK_BED>:
    48e7:	ff ff 43 68 65 63 6b 69 6e 67 20 62 65 64 00        ..Checking bed.

000048f6 <MSG_SELFTEST_CHECK_Z>:
    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 <MSG_CHECKING_Y>:
    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 <MSG_CHECKING_X>:
    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 <MSG_SELFTEST_CHECK_ENDSTOPS>:
    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 <MSG_SD_REMOVED>:
    4940:	ff ff 43 61 72 64 20 72 65 6d 6f 76 65 64 00        ..Card removed.

0000494f <MSG_BACK>:
    494f:	ff ff 42 61 63 6b 00                                ..Back.

00004956 <MSG_STRICT>:
    4956:	ff ff 53 74 72 69 63 74 00                          ..Strict.

0000495f <MSG_WARN>:
    495f:	ff ff 57 61 72 6e 00                                ..Warn.

00004966 <MSG_NONE>:
    4966:	ff ff 4e 6f 6e 65 00                                ..None.

0000496d <MSG_NOZZLE_CNG_CHANGED>:
    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 <MSG_NOZZLE_CNG_READ_HELP>:
    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 <MSG_PID_FINISHED>:
    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 <MSG_PID_RUNNING>:
    49f1:	ff ff 50 49 44 20 63 61 6c 2e 00                    ..PID cal..

000049fc <MSG_PRINT_PAUSED>:
    49fc:	ff ff 50 72 69 6e 74 20 70 61 75 73 65 64 00        ..Print paused.

00004a0b <MSG_PRINT_ABORTED>:
    4a0b:	ff ff 50 72 69 6e 74 20 61 62 6f 72 74 65 64 00     ..Print aborted.

00004a1b <MSG_NOZZLE_DIFFERS_CONTINUE>:
    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 <MSG_NOZZLE_DIFFERS_CANCELLED>:
    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 <MSG_MISSING_FILAMENT>:
    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 <MSG_FW_MK3_DETECTED>:
    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 <MSG_RECOVER_PRINT>:
    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 <MSG_TM_NOT_CAL>:
    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 <MSG_FOLLOW_Z_CALIBRATION_FLOW>:
    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 <MSG_FOLLOW_CALIBRATION_FLOW>:
    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 <MSG_FORCE_SELFTEST>:
    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 <MSG_DEFAULT_SETTINGS_LOADED>:
    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 <MSG_CHANGED_BOTH>:
    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 <MSG_CHANGED_PRINTER>:
    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 <MSG_CHANGED_MOTHERBOARD>:
    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 <MSG_SHEET>:
    4d0b:	ff ff 53 68 65 65 74 00                             ..Sheet.

00004d13 <MSG_RECOVERING_PRINT>:
    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 <MSG_THERMAL_ANOMALY>:
    4d26:	ff ff 54 48 45 52 4d 41 4c 20 41 4e 4f 4d 41 4c     ..THERMAL ANOMAL
    4d36:	59 00                                               Y.

00004d38 <MSG_RESUMING_PRINT>:
    4d38:	ff ff 52 65 73 75 6d 69 6e 67 20 70 72 69 6e 74     ..Resuming print
	...

00004d49 <MSG_PINDA_PREHEAT>:
    4d49:	ff ff 50 49 4e 44 41 20 48 65 61 74 69 6e 67 00     ..PINDA Heating.

00004d59 <MSG_HOMEYZ_DONE>:
    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 <MSG_CALIBRATE_Z_AUTO>:
    4d6c:	ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 5a 00     ..Calibrating Z.

00004d7c <MSG_BED_DONE>:
    4d7c:	ff ff 42 65 64 20 64 6f 6e 65 00                    ..Bed done.

00004d87 <MSG_BED_HEATING>:
    4d87:	ff ff 42 65 64 20 48 65 61 74 69 6e 67 00           ..Bed Heating.

00004d95 <MSG_HEATING_COMPLETE>:
    4d95:	ff ff 48 65 61 74 69 6e 67 20 64 6f 6e 65 2e 00     ..Heating done..

00004da5 <MSG_HEATING>:
    4da5:	ff ff 48 65 61 74 69 6e 67 00                       ..Heating.

00004daf <MSG_MMU_FAILS>:
    4daf:	ff ff 4d 4d 55 20 66 61 69 6c 73 00                 ..MMU fails.

00004dbb <MSG_MMU_LOAD_FAILS>:
    4dbb:	ff ff 4d 4d 55 20 6c 6f 61 64 20 66 61 69 6c 73     ..MMU load fails
	...

00004dcc <MSG_MMU_POWER_FAILS>:
    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 <MSG_MATERIAL_CHANGES>:
    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 <MSG_TOTAL_FAILURES>:
    4df1:	ff ff 54 6f 74 61 6c 20 66 61 69 6c 75 72 65 73     ..Total failures
	...

00004e02 <MSG_LAST_PRINT_FAILURES>:
    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 <MSG_POWER_FAILURES>:
    4e18:	ff ff 50 6f 77 65 72 20 66 61 69 6c 75 72 65 73     ..Power failures
	...

00004e29 <MSG_FIL_RUNOUTS>:
    4e29:	ff ff 46 69 6c 2e 20 72 75 6e 6f 75 74 73 00        ..Fil. runouts.

00004e38 <MSG_CRASH>:
    4e38:	ff ff 43 72 61 73 68 00                             ..Crash.

00004e40 <MSG_TOTAL>:
    4e40:	ff ff 54 6f 74 61 6c 00                             ..Total.

00004e48 <MSG_LAST_PRINT>:
    4e48:	ff ff 4c 61 73 74 20 70 72 69 6e 74 00              ..Last print.

00004e55 <MSG_AMBIENT>:
    4e55:	ff ff 41 6d 62 69 65 6e 74 00                       ..Ambient.

00004e5f <MSG_MENU_VOLTAGES>:
    4e5f:	ff ff 56 6f 6c 74 61 67 65 73 00                    ..Voltages.

00004e6a <MSG_MENU_TEMPERATURES>:
    4e6a:	ff ff 54 65 6d 70 65 72 61 74 75 72 65 73 00        ..Temperatures.

00004e79 <MSG_BELT_STATUS>:
    4e79:	ff ff 42 65 6c 74 20 73 74 61 74 75 73 00           ..Belt status.

00004e87 <MSG_INFO_SENSORS>:
    4e87:	ff ff 53 65 6e 73 6f 72 20 69 6e 66 6f 00           ..Sensor info.

00004e95 <MSG_INFO_EXTRUDER>:
    4e95:	ff ff 45 78 74 72 75 64 65 72 20 69 6e 66 6f 00     ..Extruder info.

00004ea5 <MSG_XYZ_DETAILS>:
    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 <MSG_PRINTER_IP>:
    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 <MSG_UNKNOWN>:
    4ecb:	ff ff 75 6e 6b 6e 6f 77 6e 00                       ..unknown.

00004ed5 <MSG_MMU_CONNECTED>:
    4ed5:	ff ff 4d 4d 55 20 63 6f 6e 6e 65 63 74 65 64 00     ..MMU connected.

00004ee5 <MSG_DATE>:
    4ee5:	ff ff 44 61 74 65 3a 00                             ..Date:.

00004eed <MSG_TO_UNLOAD_FIL>:
    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 <MSG_TO_LOAD_FIL>:
    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 <MSG_PRESS_KNOB>:
    4f15:	ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62     ..Press the knob
	...

00004f26 <MSG_PREHEATING_TO_CUT>:
    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 <MSG_PREHEATING_TO_EJECT>:
    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 <MSG_PREHEATING_TO_UNLOAD>:
    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 <MSG_PREHEATING_TO_LOAD>:
    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 <MSG_COOLDOWN>:
    4f7c:	ff ff 43 6f 6f 6c 64 6f 77 6e 00                    ..Cooldown.

00004f87 <MSG_FILAMENT_CLEAN>:
    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 <MSG_EJECT>:
    4fb2:	ff ff 45 6a 65 63 74 00                             ..Eject.

00004fba <MSG_AUTOLOADING_ENABLED>:
    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 <MSG_TOTAL_FILAMENT>:
    5007:	ff ff 54 6f 74 61 6c 20 66 69 6c 61 6d 65 6e 74     ..Total filament
	...

00005018 <MSG_TOTAL_PRINT_TIME>:
    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 <MSG_FILAMENT_USED>:
    502b:	ff ff 46 69 6c 61 6d 65 6e 74 20 75 73 65 64 00     ..Filament used.

0000503b <MSG_PRINT_TIME>:
    503b:	ff ff 50 72 69 6e 74 20 74 69 6d 65 00              ..Print time.

00005048 <MSG_PREHEAT_NOZZLE>:
    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 <MSG_ERROR>:
    505e:	ff ff 45 52 52 4f 52 3a 00                          ..ERROR:.

00005067 <MSG_Y_DIST_FROM_MIN>:
    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 <MSG_LEFT>:
    507d:	ff ff 4c 65 66 74 00                                ..Left.

00005084 <MSG_RIGHT>:
    5084:	ff ff 52 69 67 68 74 00                             ..Right.

0000508c <MSG_MEASURED_SKEW>:
    508c:	ff ff 4d 65 61 73 75 72 65 64 20 73 6b 65 77 00     ..Measured skew.

0000509c <MSG_SLIGHT_SKEW>:
    509c:	ff ff 53 6c 69 67 68 74 20 73 6b 65 77 00           ..Slight skew.

000050aa <MSG_SEVERE_SKEW>:
    50aa:	ff ff 53 65 76 65 72 65 20 73 6b 65 77 00           ..Severe skew.

000050b8 <MSG_MEASURED_OFFSET>:
    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 <MSG_BABYSTEPPING_Z>:
    50cd:	ff ff 41 64 6a 75 73 74 69 6e 67 20 5a 00           ..Adjusting Z.

000050db <MSG_BED_CORRECTION_REAR>:
    50db:	ff ff 52 65 61 72 20 73 69 64 65 20 5b e4 6d 5d     ..Rear side [.m]
	...

000050ec <MSG_BED_CORRECTION_FRONT>:
    50ec:	ff ff 46 72 6f 6e 74 20 73 69 64 65 5b e4 6d 5d     ..Front side[.m]
	...

000050fd <MSG_BED_CORRECTION_RIGHT>:
    50fd:	ff ff 52 69 67 68 74 20 73 69 64 65 5b e4 6d 5d     ..Right side[.m]
	...

0000510e <MSG_BED_CORRECTION_LEFT>:
    510e:	ff ff 4c 65 66 74 20 73 69 64 65 20 5b e4 6d 5d     ..Left side [.m]
	...

0000511f <MSG_SET_TEMPERATURE>:
    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 <MSG_PINDA_CAL_FAILED>:
    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 <MSG_PINDA_CALIBRATION_DONE>:
    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 <MMU2::MSG_PROGRESS_FEED_FSENSOR>:
    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 <MMU2::MSG_PROGRESS_MOVING_SELECTOR>:
    51be:	ff ff 4d 6f 76 69 6e 67 20 73 65 6c 65 63 74 6f     ..Moving selecto
    51ce:	72 00                                               r.

000051d0 <MMU2::MSG_PROGRESS_HOMING>:
    51d0:	ff ff 48 6f 6d 69 6e 67 00                          ..Homing.

000051d9 <MMU2::MSG_PROGRESS_RETRACT_FINDA>:
    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 <MMU2::MSG_PROGRESS_EJECT_FILAMENT>:
    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 <MMU2::MSG_PROGRESS_PARK_SELECTOR>:
    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 <MMU2::MSG_PROGRESS_RETURN_SELECTOR>:
    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 <MMU2::MSG_PROGRESS_PERFORM_CUT>:
    522a:	ff ff 50 65 72 66 6f 72 6d 69 6e 67 20 63 75 74     ..Performing cut
	...

0000523b <MMU2::MSG_PROGRESS_PUSH_FILAMENT>:
    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 <MMU2::MSG_PROGRESS_PREPARE_BLADE>:
    524e:	ff ff 50 72 65 70 61 72 69 6e 67 20 62 6c 61 64     ..Preparing blad
    525e:	65 00                                               e.

00005260 <MMU2::MSG_PROGRESS_SELECT_SLOT>:
    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 <MSG_UNLOADING_FILAMENT>:
    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 <MMU2::MSG_PROGRESS_ERR_TMC>:
    528b:	ff ff 45 52 52 20 54 4d 43 20 66 61 69 6c 65 64     ..ERR TMC failed
	...

0000529c <MMU2::MSG_PROGRESS_ERR_HELP_FIL>:
    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 <MMU2::MSG_PROGRESS_ERR_INTERNAL>:
    52b0:	ff ff 45 52 52 20 49 6e 74 65 72 6e 61 6c 00        ..ERR Internal.

000052bf <MMU2::MSG_PROGRESS_WAIT_USER>:
    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 <MSG_FINISHING_MOVEMENTS>:
    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 <MMU2::MSG_PROGRESS_AVOID_GRIND>:
    52e9:	ff ff 41 76 6f 69 64 69 6e 67 20 67 72 69 6e 64     ..Avoiding grind
	...

000052fa <MMU2::MSG_PROGRESS_FEED_NOZZLE>:
    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 <MMU2::MSG_PROGRESS_FEED_EXTRUDER>:
    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 <MMU2::MSG_PROGRESS_FEED_FINDA>:
    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 <MMU2::MSG_PROGRESS_UNLOAD_PULLEY>:
    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 <MMU2::MSG_PROGRESS_UNLOAD_FINDA>:
    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 <MMU2::MSG_PROGRESS_DISENGAGE_IDLER>:
    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 <MMU2::MSG_PROGRESS_ENGAGE_IDLER>:
    5376:	ff ff 45 6e 67 61 67 69 6e 67 20 69 64 6c 65 72     ..Engaging idler
	...

00005387 <MMU2::MSG_PROGRESS_OK>:
    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 <MSG_SELFTEST_FAN_NO>:
    55fa:	ff ff 4e 6f 74 20 73 70 69 6e 6e 69 6e 67 00        ..Not spinning.

00005609 <MSG_SELFTEST_FAN_YES>:
    5609:	ff ff 53 70 69 6e 6e 69 6e 67 00                    ..Spinning.

00005614 <MSG_SELFTEST_FAN>:
    5614:	ff ff 46 61 6e 20 74 65 73 74 00                    ..Fan test.

0000561f <MSG_SELFTEST_FAILED>:
    561f:	ff ff 53 65 6c 66 74 65 73 74 20 66 61 69 6c 65     ..Selftest faile
    562f:	64 00                                               d.

00005631 <MSG_SELFTEST_FILAMENT_SENSOR>:
    5631:	ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f     ..Filament senso
    5641:	72 00                                               r.

00005643 <MSG_SELFTEST_SWAPPED>:
    5643:	ff ff 53 77 61 70 70 65 64 00                       ..Swapped.

0000564d <MSG_SELFTEST_FANS>:
    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 <MSG_SELFTEST_AXIS>:
    565f:	ff ff 41 78 69 73 00                                ..Axis.

00005666 <MSG_SELFTEST_AXIS_LENGTH>:
    5666:	ff ff 41 78 69 73 20 6c 65 6e 67 74 68 00           ..Axis length.

00005674 <MSG_LOOSE_PULLEY>:
    5674:	ff ff 4c 6f 6f 73 65 20 70 75 6c 6c 65 79 00        ..Loose pulley.

00005683 <MSG_SELFTEST_HOTEND_FAN>:
    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 <MSG_SELFTEST_PART_FAN>:
    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 <MSG_SELFTEST_ENDSTOP_NOTHIT>:
    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 <MSG_SELFTEST_ENDSTOP>:
    56bb:	ff ff 45 6e 64 73 74 6f 70 00                       ..Endstop.

000056c5 <MSG_SELFTEST_MOTOR>:
    56c5:	ff ff 4d 6f 74 6f 72 00                             ..Motor.

000056cd <MSG_SELFTEST_ENDSTOPS>:
    56cd:	ff ff 45 6e 64 73 74 6f 70 73 00                    ..Endstops.

000056d8 <MSG_SELFTEST_WIRINGERROR>:
    56d8:	ff ff 57 69 72 69 6e 67 20 65 72 72 6f 72 00        ..Wiring error.

000056e7 <MSG_SELFTEST_BEDHEATER>:
    56e7:	ff ff 42 65 64 2f 48 65 61 74 65 72 00              ..Bed/Heater.

000056f4 <MSG_SELFTEST_NOTCONNECTED>:
    56f4:	ff ff 4e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 00     ..Not connected.

00005704 <MSG_SELFTEST_HEATERTHERMISTOR>:
    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 <MSG_SELFTEST_PLEASECHECK>:
    5718:	ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 3a 00     ..Please check:.

00005728 <MSG_SELFTEST_ERROR>:
    5728:	ff ff 53 65 6c 66 74 65 73 74 20 65 72 72 6f 72     ..Selftest error
    5738:	21 00                                               !.

0000573a <MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_PERFECT>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED>:
    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 <MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND>:
    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 <MSG_PLACE_STEEL_SHEET>:
    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 <MSG_BABYSTEP_Z_NOT_SET>:
    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 <MSG_PAPER>:
    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 <MSG_FIND_BED_OFFSET_AND_SKEW_LINE1>:
    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 <MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1>:
    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 <MSG_CONFIRM_NOZZLE_CLEAN>:
    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 <MSG_AUTO_HOME>:
    5b83:	ff ff 41 75 74 6f 20 68 6f 6d 65 00                 ..Auto home.

00005b8f <MSG_CUT_FILAMENT>:
    5b8f:	ff ff 43 75 74 20 66 69 6c 61 6d 65 6e 74 00        ..Cut filament.

00005b9e <MSG_EJECT_FROM_MMU>:
    5b9e:	ff ff 45 6a 65 63 74 20 66 72 6f 6d 20 4d 4d 55     ..Eject from MMU
	...

00005baf <MSG_LOADING_FILAMENT>:
    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 <MSG_MMU_RESTORE_TEMP>:
    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 <MSG_SORTING_FILES>:
    5be8:	ff ff 53 6f 72 74 69 6e 67 20 66 69 6c 65 73 00     ..Sorting files.

00005bf8 <MSG_FILE_CNT>:
    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 <MSG_OFF>:
    5c4b:	ff ff 4f 66 66 00                                   ..Off.

00005c51 <MSG_ON>:
    5c51:	ff ff 4f 6e 00                                      ..On.

00005c56 <MMU2::MSG_DESC_UNKNOWN_ERROR>:
    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 <MMU2::MSG_DESC_FILAMENT_CHANGE>:
    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 <MMU2::MSG_DESC_FILAMENT_EJECTED>:
    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 <MMU2::MSG_DESC_UNLOAD_MANUALLY>:
    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 <MMU2::MSG_DESC_FW_RUNTIME_ERROR>:
    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 <MMU2::MSG_DESC_FW_UPDATE_NEEDED>:
    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 <MMU2::MSG_DESC_QUEUE_FULL>:
    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 <MMU2::MSG_DESC_INVALID_TOOL>:
    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 <MMU2::MSG_DESC_FILAMENT_ALREADY_LOADED>:
    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 <MMU2::MSG_DESC_COMMUNICATION_ERROR>:
    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 <MMU2::MSG_DESC_MMU_NOT_RESPONDING>:
    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 <MMU2::MSG_DESC_TMC>:
    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 <MMU2::MSG_DESC_IDLER_CANNOT_HOME>:
    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 <MMU2::MSG_DESC_CANNOT_MOVE>:
    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 <MMU2::MSG_DESC_SELECTOR_CANNOT_HOME>:
    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 <MMU2::MSG_DESC_LOAD_TO_EXTRUDER_FAILED>:
    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 <MMU2::MSG_DESC_INSPECT_FINDA>:
    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 <MMU2::MSG_DESC_FSENSOR_TOO_EARLY>:
    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 <MMU2::MSG_DESC_PULLEY_CANNOT_MOVE>:
    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 <MMU2::MSG_DESC_FSENSOR_FILAMENT_STUCK>:
    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 <MMU2::MSG_DESC_FSENSOR_DIDNT_TRIGGER>:
    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 <MMU2::MSG_DESC_FINDA_FILAMENT_STUCK>:
    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 <MMU2::MSG_DESC_FINDA_DIDNT_TRIGGER>:
    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 <MMU2::MSG_BTN_DISABLE_MMU>:
    6395:	ff ff 44 69 73 61 62 6c 65 00                       ..Disable.

0000639f <MMU2::MSG_BTN_STOP>:
    639f:	ff ff 53 74 6f 70 00                                ..Stop.

000063a6 <MMU2::MSG_BTN_LOAD>:
    63a6:	ff ff 4c 6f 61 64 00                                ..Load.

000063ad <MMU2::MSG_BTN_UNLOAD>:
    63ad:	ff ff 55 6e 6c 6f 61 64 00                          ..Unload.

000063b6 <MMU2::MSG_BTN_RESET_MMU>:
    63b6:	ff ff 52 65 73 65 74 4d 4d 55 00                    ..ResetMMU.

000063c1 <MMU2::MSG_BTN_RETRY>:
    63c1:	ff ff 52 65 74 72 79 00                             ..Retry.

000063c9 <MSG_BED_LEVELING_FAILED_POINT_LOW>:
    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 <MSG_MMU_SENSITIVITY>:
    641c:	ff ff 53 65 6e 73 69 74 69 76 69 74 79 00           ..Sensitivity.

0000642a <MSG_DONE>:
    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 <get_command()::__c>:
    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 <get_command()::__c>:
    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 <get_command()::__c>:
    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 <get_command()::__c>:
    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 <get_command()::__c>:
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)::__c>:
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)::__c>:
    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 <gcode_M114()::__c>:
    65ad:	20 43 6f 75 6e 74 20 58 3a 20 00                     Count X: .

000065b8 <gcode_M123()::__c>:
    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 <FlushSerialRequestResend()::__c>:
    65df:	52 65 73 65 6e 64 00                                Resend.

000065e6 <FlushSerialRequestResend()::__c>:
    65e6:	25 53 3a 20 25 6c 64 0a 25 53 0a 00                 %S: %ld.%S..

000065f2 <MSG_HOST_ACTION_NOTIFICATION>:
    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 <MSG_FILAMENT_RUNOUT_DETECTED>:
    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 <MSG_ERR_STOPPED>:
    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 <dcode_22()::__c>:
    665b:	64 75 6d 70 20 63 6c 65 61 72 65 64 0a 00           dump cleared..

00006669 <dcode_22()::__c>:
    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 <dcode_21()::__c>:
    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 <dcode_21()::__c>:
    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 <dcode_20()::__c>:
    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 <dcode_6()::__c>:
    66bf:	58 46 4c 41 53 48 00                                XFLASH.

000066c6 <dcode_3()::__c>:
    66c6:	45 45 50 52 4f 4d 00                                EEPROM.

000066cd <dcode_2()::__c>:
    66cd:	53 52 41 4d 00                                      SRAM.

000066d2 <dcode__1()::__c>:
    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 <TCodes(char*, unsigned char)::__c>:
    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 <TCodes(char*, unsigned char)::__c>:
    66f9:	49 6e 76 61 6c 69 64 20 65 78 74 72 75 64 65 72     Invalid extruder
	...

0000670a <tmc2130_print_currents()::__c>:
    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 <CardReader::getStatus(bool)::__c>:
    6749:	53 44 20 70 72 69 6e 74 69 6e 67 20 62 79 74 65     SD printing byte
    6759:	20 00                                                .

0000675b <MSG_UNKNOWN_COMMAND>:
    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 <MSG_Z_MAX>:
    6785:	7a 5f 6d 61 78 3a 20 00                             z_max: .

0000678d <MSG_Z_MIN>:
    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 <MSG_ENDSTOP_HIT>:
    67ad:	54 52 49 47 47 45 52 45 44 00                       TRIGGERED.

000067b7 <MSG_ENDSTOP_OPEN>:
    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 <MSG_M112_KILL>:
    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 <MSG_HOST_ACTION_UVLO_RECOVERY_READY>:
    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 <MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY>:
    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 <MSG_UNKNOWN_CODE>:
    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 <MSG_G90>:
    69d5:	47 39 30 00                                         G90.

000069d9 <MSG_M107>:
    69d9:	4d 31 30 37 00                                      M107.

000069de <lcd_show_sensors_state()::__c>:
    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 <lcd_show_sensors_state()::__c>:
    6a02:	46 49 4e 44 41 00                                   FINDA.

00006a08 <MSG_PINDA>:
    6a08:	50 49 4e 44 41 00                                   PINDA.

00006a0e <lcd_wizard(WizState)::__c>:
    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 <MSG_SPOOL_JOIN>:
    6a24:	53 70 6f 6f 6c 4a 6f 69 6e 00                       SpoolJoin.

00006a2e <MSG_FIRMWARE>:
    6a2e:	46 69 72 6d 77 61 72 65 00                          Firmware.

00006a37 <lcd_settings_menu()::__c>:
    6a37:	48 42 65 64 20 6f 6e 20 6c 6f 61 64 00              HBed on load.

00006a44 <MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY>:
    6a44:	46 6c 61 73 68 41 69 72 00                          FlashAir.

00006a4d <lcd_calibration_menu()::__c>:
    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 <MSG_FANCHECK_PRINT>:
    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 <MSG_FANCHECK_HOTEND>:
    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 <MSG_HOST_ACTION_RESUMED>:
    6a89:	2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 64     //action:resumed
	...

00006a9a <MSG_HOST_ACTION_ASK_RESUME>:
    6a9a:	2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 00     //action:resume.

00006aaa <MSG_HOST_ACTION_READY>:
    6aaa:	2f 2f 61 63 74 69 6f 6e 3a 72 65 61 64 79 00        //action:ready.

00006ab9 <MSG_HOST_ACTION_NOT_READY>:
    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 <MSG_HOST_ACTION_CANCEL>:
    6acc:	2f 2f 61 63 74 69 6f 6e 3a 63 61 6e 63 65 6c 00     //action:cancel.

00006adc <MSG_M84>:
    6adc:	4d 38 34 00                                         M84.

00006ae0 <lcd_selfcheck_axis_sg(unsigned char)::__c>:
    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 <lcd_selfcheck_axis_sg(unsigned char)::__c>:
    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 <MSG_OK_CAPS>:
    6b18:	4f 4b 00                                            OK.

00006b1b <MSG_LCD_STATUS_CHANGED>:
    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 <lcd_experimental_menu()::__c>:
    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 <lcd_experimental_menu()::__c>:
    6b52:	45 2d 63 6f 6f 6c 20 6d 6f 64 65 00                 E-cool mode.

00006b5e <MSG_HOST_ACTION_START>:
    6b5e:	2f 2f 61 63 74 69 6f 6e 3a 73 74 61 72 74 00        //action:start.

00006b6d <MSG_G91>:
    6b6d:	47 39 31 00                                         G91.

00006b71 <MSG_M702>:
    6b71:	4d 37 30 32 00                                      M702.

00006b76 <MSG_M83>:
    6b76:	4d 38 33 00                                         M83.

00006b7a <G28W>:
    6b7a:	47 32 38 20 57 00                                   G28 W.

00006b80 <MSG_M500>:
    6b80:	4d 35 30 30 00                                      M500.

00006b85 <xflash_err_msg()::__c>:
    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 <xflash_err_msg()::__c>:
    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 <fw_crash_init()::__c>:
    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 <fw_crash_init()::__c>:
    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 <setup::__c>:
    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 <setup::__c>:
    6cb5:	20 46 72 65 65 20 4d 65 6d 6f 72 79 3a 20 00         Free Memory: .

00006cc4 <setup::__c>:
    6cc4:	20 7c 20 41 75 74 68 6f 72 3a 20 00                  | Author: .

00006cd0 <setup::__c>:
    6cd0:	20 4c 61 73 74 20 55 70 64 61 74 65 64 3a 20 00      Last Updated: .

00006ce0 <MSG_SOFTWARE_RESET>:
    6ce0:	20 53 6f 66 74 77 61 72 65 20 52 65 73 65 74 00      Software Reset.

00006cf0 <MSG_WATCHDOG_RESET>:
    6cf0:	20 57 61 74 63 68 64 6f 67 20 52 65 73 65 74 00      Watchdog Reset.

00006d00 <MSG_BROWNOUT_RESET>:
    6d00:	20 42 72 6f 77 6e 20 6f 75 74 20 52 65 73 65 74      Brown out Reset
	...

00006d11 <MSG_EXTERNAL_RESET>:
    6d11:	20 45 78 74 65 72 6e 61 6c 20 52 65 73 65 74 00      External Reset.

00006d21 <MSG_POWERUP>:
    6d21:	50 6f 77 65 72 55 70 00                             PowerUp.

00006d29 <MSG_SD_ERR_WRITE_TO_FILE>:
    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 <MSG_FILE_SAVED>:
    6d3f:	44 6f 6e 65 20 73 61 76 69 6e 67 20 66 69 6c 65     Done saving file
    6d4f:	2e 00                                               ..

00006d51 <MSG_OK>:
    6d51:	6f 6b 00                                            ok.

00006d54 <MSG_FILAMENT>:
    6d54:	46 69 6c 61 6d 65 6e 74 00                          Filament.

00006d5d <MSG_POWERPANIC_DETECTED>:
    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 <uvlo_()::__c>:
    6d72:	55 56 4c 4f 20 2d 20 65 6e 64 20 25 64 0a 00        UVLO - end %d..

00006d81 <uvlo_tiny()::__c>:
    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 <print_world_coordinates()::__c>:
    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 <MSG_M220>:
    6dbc:	4d 32 32 30 20 53 25 64 00                          M220 S%d.

00006dc5 <recover_print(unsigned char)::__c>:
    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 <recover_print(unsigned char)::__c>:
    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 <G1_E_F2700>:
    6df0:	47 31 20 45 25 2d 2e 33 66 20 46 32 37 30 30 00     G1 E%-.3f F2700.

00006e00 <MSG_TMC_OVERTEMP>:
    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 <SetCurrents(unsigned char, MotorCurrents const&)::__c>:
    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 <lcdui_print_temp(char, int, int)::__c>:
    6e3a:	25 63 25 33 64 2f 25 64 81 00                       %c%3d/%d..

00006e44 <lcdui_print_Z_coord()::__c>:
    6e44:	5a 25 36 2e 32 66 25 63 00                          Z%6.2f%c.

00006e4d <lcdui_print_Z_coord()::__c>:
    6e4d:	5a 20 20 20 2d 2d 2d 20 00                          Z   --- .

00006e56 <lcdui_print_feedrate()::__c>:
    6e56:	86 25 33 64 25 25 00                                .%3d%%.

00006e5d <lcdui_print_percent_done()::__c>:
    6e5d:	2d 2d 2d 25 25 00                                   ---%%.

00006e63 <lcdui_print_percent_done()::__c>:
    6e63:	25 33 64 25 25 00                                   %3d%%.

00006e69 <lcdui_print_percent_done()::__c>:
    6e69:	20 53 44 00                                          SD.

00006e6d <lcdui_print_percent_done()::__c>:
    6e6d:	20 20 20 00                                            .

00006e71 <lcdui_print_percent_done()::__c>:
    6e71:	20 48 4f 00                                          HO.

00006e75 <lcdui_print_time()::__c>:
    6e75:	87 2d 2d 3a 2d 2d 20 20 00                          .--:--  .

00006e7e <lcdui_print_time()::__c>:
    6e7e:	87 25 33 75 68 20 25 63 25 63 00                    .%3uh %c%c.

00006e89 <lcdui_print_time()::__c>:
    6e89:	87 25 30 32 75 3a 25 30 32 75 25 63 25 63 00        .%02u:%02u%c%c.

00006e98 <MSG_HOST_ACTION_PAUSED>:
    6e98:	2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 64 00     //action:paused.

00006ea8 <MSG_HOST_ACTION_ASK_PAUSE>:
    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 <lcd_support_menu()::__c>:
    6ec3:	68 65 6c 70 2e 70 72 75 73 61 33 64 2e 63 6f 6d     help.prusa3d.com
	...

00006ed4 <lcd_support_menu()::__c>:
    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 <lcd_support_menu()::__c>:
    6ee6:	70 72 75 73 61 33 64 2e 63 6f 6d 00                 prusa3d.com.

00006ef2 <MSG_M701>:
    6ef2:	4d 37 30 31 00                                      M701.

00006ef7 <lcd_menu_statistics()::__c>:
    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 <lcd_menu_statistics()::__c>:
    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 <lcd_menu_xyz_y_min()::__c>:
    6f3f:	25 36 2e 32 66 6d 6d 00                             %6.2fmm.

00006f47 <lcd_menu_xyz_y_min()::__c>:
    6f47:	25 53 0a 25 53 0a 25 53 3a 0a 25 53 3a 00           %S.%S.%S:.%S:.

00006f55 <lcd_menu_xyz_skew()::__c>:
    6f55:	25 33 2e 32 66 81 00                                %3.2f..

00006f5c <lcd_menu_xyz_skew()::__c>:
    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 <lcd_print_state(unsigned char)::__c>:
    6f89:	20 20 30 00                                           0.

00006f8d <lcd_print_state(unsigned char)::__c>:
    6f8d:	20 20 31 00                                           1.

00006f91 <calculate_machine_skew_and_offset_LS(float const*, unsigned char, float const*, float*, float*, float*, signed char)::__c>:
    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 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    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 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    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 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    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 <gcode_M45(bool, signed char)::__c>:
    7006:	31 2f 34 00                                         1/4.

0000700a <gcode_M45(bool, signed char)::__c>:
    700a:	31 2f 34 00                                         1/4.

0000700e <gcode_M45(bool, signed char)::__c>:
    700e:	31 2f 39 00                                         1/9.

00007012 <MSG_WELCOME>:
    7012:	50 72 75 73 61 20 69 33 20 4d 4b 33 20 4f 4b 2e     Prusa i3 MK3 OK.
	...

00007023 <CardReader::mount(bool)::__c>:
    7023:	53 44 20 63 61 72 64 20 6f 6b 00                    SD card ok.

0000702e <CardReader::mount(bool)::__c>:
    702e:	6f 70 65 6e 52 6f 6f 74 20 66 61 69 6c 65 64 00     openRoot failed.

0000703e <CardReader::mount(bool)::__c>:
    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 <CardReader::mount(bool)::__c>:
    7051:	53 44 20 69 6e 69 74 20 66 61 69 6c 00              SD init fail.

0000705e <MSG_SD_OPEN_FILE_FAIL>:
    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 <CardReader::chdir(char const*, bool)::__c>:
    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 <MSG_M600>:
    7088:	4d 36 30 30 00                                      M600.

0000708d <MSG_M24>:
    708d:	4d 32 34 00                                         M24.

00007091 <MSG_M23>:
    7091:	4d 32 33 20 25 73 00                                M23 %s.

00007098 <sample_mesh_and_store_reference()::__c>:
    7098:	31 2f 39 00                                         1/9.

0000709c <MMU2::MSG_BTN_MORE>:
    709c:	88 00                                               ..

0000709e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c>:
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c>:
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c>:
    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 <MSG_POWERPANIC_DETECTED+0x2>
    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 <MMU2::MSG_DESC_FSENSOR_DIDNT_TRIGGER+0x27>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c+0x5>
    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 <lcd_selfcheck_axis_sg(unsigned char)::__c+0x4>
    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 <default_conf+0xc4>
    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 <default_conf+0x56>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)::__c+0x24>
    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 <lcd_first_layer_calibration_reset()>
    71b4:	0c 94 fd fa 	jmp	0x1f5fa	; 0x1f5fa <lcd_wizard(WizState)+0x292>
    71b8:	0c 94 4c ea 	jmp	0x1d498	; 0x1d498 <analogWrite+0xfa>
    71bc:	0d 94 79 15 	jmp	0x22af2	; 0x22af2 <lcd_set_fan_check() [clone .lto_priv.416]>
    71c0:	0d 94 a3 08 	jmp	0x21146	; 0x21146 <lcd_commands() [clone .part.41]+0x2bc>
    71c4:	0c 94 2e e2 	jmp	0x1c45c	; 0x1c45c <mmu_eject_filament(unsigned char)>
    71c8:	0c 94 87 e0 	jmp	0x1c10e	; 0x1c10e <lcd_sd_refresh()>
    71cc:	0d 94 e8 a6 	jmp	0x34dd0	; 0x34dd0 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x156>
    71d0:	0d 94 26 74 	jmp	0x2e84c	; 0x2e84c <global constructors keyed to 65535_0_adc.cpp.obj.14572>
    71d4:	0c 94 92 cf 	jmp	0x19f24	; 0x19f24 <lcd_mesh_bedleveling()>
    71d8:	0c 94 79 ea 	jmp	0x1d4f2	; 0x1d4f2 <analogWrite+0x154>
    71dc:	0c 94 4e 74 	jmp	0xe89c	; 0xe89c <__vector_23+0x128>
    71e0:	0c 94 d1 f0 	jmp	0x1e1a2	; 0x1e1a2 <UserECool_toggle()>
    71e4:	0c 94 bc e0 	jmp	0x1c178	; 0x1c178 <lcd_backlight_menu()>
    71e8:	0c 94 b0 d2 	jmp	0x1a560	; 0x1a560 <lcd_hw_setup_menu()>
    71ec:	0c 94 04 d1 	jmp	0x1a208	; 0x1a208 <lcd_nozzle_diameter_cycle()>
    71f0:	0c 94 a6 f5 	jmp	0x1eb4c	; 0x1eb4c <lcd_print_stop()>
    71f4:	0c 94 cd d5 	jmp	0x1ab9a	; 0x1ab9a <lcd_main_menu() [clone .lto_priv.451]>
    71f8:	0d 94 47 1a 	jmp	0x2348e	; 0x2348e <lcd_menu_xyz_skew()>
    71fc:	0c 94 a1 ea 	jmp	0x1d542	; 0x1d542 <analogWrite+0x1a4>
    7200:	0c 94 e3 f0 	jmp	0x1e1c6	; 0x1e1c6 <lcd_silent_mode_set()>
    7204:	0c 94 ab d1 	jmp	0x1a356	; 0x1a356 <lcd_fsensor_jam_detection_set()>
    7208:	0c 94 83 ea 	jmp	0x1d506	; 0x1d506 <analogWrite+0x168>
    720c:	0c 94 28 fb 	jmp	0x1f650	; 0x1f650 <lcd_wizard(WizState)+0x2e8>
    7210:	0d 94 8d 40 	jmp	0x2811a	; 0x2811a <lcd_status_screen()>
    7214:	0c 94 8a e3 	jmp	0x1c714	; 0x1c714 <lcd_language_menu()>
    7218:	0d 94 f1 ac 	jmp	0x359e2	; 0x359e2 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x10e>
    721c:	0d 94 c2 9f 	jmp	0x33f84	; 0x33f84 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xc0>
    7220:	0c 94 2b 74 	jmp	0xe856	; 0xe856 <__vector_23+0xe2>
    7224:	0d 94 b6 9f 	jmp	0x33f6c	; 0x33f6c <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xa8>
    7228:	0d 94 c1 0b 	jmp	0x21782	; 0x21782 <lcd_commands() [clone .part.41]+0x8f8>
    722c:	0c 94 f7 cd 	jmp	0x19bee	; 0x19bee <turnOffPWM+0x96>
    7230:	0c 94 46 fa 	jmp	0x1f48c	; 0x1f48c <lcd_wizard(WizState)+0x124>
    7234:	0c 94 8b 70 	jmp	0xe116	; 0xe116 <lcd_putchar(char, __file*) [clone .lto_priv.405]>
    7238:	0c 94 46 da 	jmp	0x1b48c	; 0x1b48c <lcd_tune_menu()>
    723c:	0c 94 c5 ce 	jmp	0x19d8a	; 0x19d8a <lcd_printer_ready_state_toggle()>
    7240:	0c 94 ef cd 	jmp	0x19bde	; 0x19bde <turnOffPWM+0x86>
    7244:	0d 94 37 17 	jmp	0x22e6e	; 0x22e6e <lcd_adjust_bed_reset()>
    7248:	0d 94 02 1a 	jmp	0x23404	; 0x23404 <lcd_menu_xyz_offset()>
    724c:	0d 94 2b 17 	jmp	0x22e56	; 0x22e56 <SpoolJoin::SpoolJoin::toggleSpoolJoin()>
    7250:	0c 94 f1 d0 	jmp	0x1a1e2	; 0x1a1e2 <lcd_sort_type_set()>
    7254:	0d 94 62 28 	jmp	0x250c4	; 0x250c4 <lcd_babystep_z() [clone .lto_priv.406]>
    7258:	0d 94 0c 2c 	jmp	0x25818	; 0x25818 <lcdui_print_status_line()+0x17a>
    725c:	0d 94 ee 51 	jmp	0x2a3dc	; 0x2a3dc <mFilamentItem_PET()>
    7260:	0c 94 ba d4 	jmp	0x1a974	; 0x1a974 <lcd_move_menu_axis()>
    7264:	0c 94 0b ce 	jmp	0x19c16	; 0x19c16 <turnOffPWM+0xbe>
    7268:	0c 94 f6 f9 	jmp	0x1f3ec	; 0x1f3ec <lcd_wizard(WizState)+0x84>
    726c:	0c 94 48 dc 	jmp	0x1b890	; 0x1b890 <lcd_rename_sheet_menu()>
    7270:	0c 94 9d d4 	jmp	0x1a93a	; 0x1a93a <void select_sheet_menu<(unsigned char)5>()>
    7274:	0c 94 ca cd 	jmp	0x19b94	; 0x19b94 <turnOffPWM+0x3c>
    7278:	0d 94 bd 0b 	jmp	0x2177a	; 0x2177a <lcd_commands() [clone .part.41]+0x8f0>
    727c:	0c 94 1a e2 	jmp	0x1c434	; 0x1c434 <mmu_load_to_nozzle_menu() [clone .lto_priv.446]>
    7280:	0c 94 bf ce 	jmp	0x19d7e	; 0x19d7e <lcd_send_action_start()>
    7284:	0c 94 04 ef 	jmp	0x1de08	; 0x1de08 <lcd_reset_sheet()>
    7288:	0d 94 0e 11 	jmp	0x2221c	; 0x2221c <uart2_getchar(__file*) [clone .lto_priv.398]>
    728c:	0c 94 bc fa 	jmp	0x1f578	; 0x1f578 <lcd_wizard(WizState)+0x210>
    7290:	0d 94 dd 51 	jmp	0x2a3ba	; 0x2a3ba <lcd_AutoLoadFilament()>
    7294:	0c 94 c1 e2 	jmp	0x1c582	; 0x1c582 <sheets_menu()>
    7298:	0c 94 e9 cd 	jmp	0x19bd2	; 0x19bd2 <turnOffPWM+0x7a>
    729c:	0d 94 7d 51 	jmp	0x2a2fa	; 0x2a2fa <mFilamentItem(unsigned int, unsigned int)+0x1ca>
    72a0:	0c 94 8d ea 	jmp	0x1d51a	; 0x1d51a <analogWrite+0x17c>
    72a4:	0c 94 e5 cd 	jmp	0x19bca	; 0x19bca <turnOffPWM+0x72>
    72a8:	0c 94 89 e2 	jmp	0x1c512	; 0x1c512 <lcd_community_language_menu()>
    72ac:	0d 94 75 15 	jmp	0x22aea	; 0x22aea <lcd_pause_usb_print()>
    72b0:	0c 94 b3 d0 	jmp	0x1a166	; 0x1a166 <lcd_toshiba_flash_air_compatibility_toggle()>
    72b4:	0d 94 67 1d 	jmp	0x23ace	; 0x23ace <lcd_menu_fails_stats_mmu() [clone .lto_priv.415]>
    72b8:	0d 94 a8 18 	jmp	0x23150	; 0x23150 <lcd_menu_fails_stats_mmu_print()>
    72bc:	0c 94 1e ea 	jmp	0x1d43c	; 0x1d43c <analogWrite+0x9e>
    72c0:	0c 94 c8 fa 	jmp	0x1f590	; 0x1f590 <lcd_wizard(WizState)+0x228>
    72c4:	0c 94 6f ea 	jmp	0x1d4de	; 0x1d4de <analogWrite+0x140>
    72c8:	0c 94 0f ea 	jmp	0x1d41e	; 0x1d41e <analogWrite+0x80>
    72cc:	0c 94 60 ea 	jmp	0x1d4c0	; 0x1d4c0 <analogWrite+0x122>
    72d0:	0d 94 93 29 	jmp	0x25326	; 0x25326 <lcd_move_e()>
    72d4:	0c 94 94 e1 	jmp	0x1c328	; 0x1c328 <mmu_loading_test_menu() [clone .lto_priv.447]>
    72d8:	0c 94 b6 d4 	jmp	0x1a96c	; 0x1a96c <void select_sheet_menu<(unsigned char)0>()>
    72dc:	0c 94 f3 cd 	jmp	0x19be6	; 0x19be6 <turnOffPWM+0x8e>
    72e0:	0d 94 a9 08 	jmp	0x21152	; 0x21152 <lcd_commands() [clone .part.41]+0x2c8>
    72e4:	0d 94 a8 22 	jmp	0x24550	; 0x24550 <mFilamentPrompt()>
    72e8:	0c 94 fb 75 	jmp	0xebf6	; 0xebf6 <eeprom_switch_to_next_sheet()>
    72ec:	0c 94 32 ea 	jmp	0x1d464	; 0x1d464 <analogWrite+0xc6>
    72f0:	0c 94 97 ea 	jmp	0x1d52e	; 0x1d52e <analogWrite+0x190>
    72f4:	0c 94 ac d4 	jmp	0x1a958	; 0x1a958 <void select_sheet_menu<(unsigned char)2>()>
    72f8:	0d 94 44 17 	jmp	0x22e88	; 0x22e88 <lcd_menu_extruder_info()>
    72fc:	0c 94 88 f8 	jmp	0x1f110	; 0x1f110 <lcd_selftest_v()>
    7300:	0c 94 dc cd 	jmp	0x19bb8	; 0x19bb8 <turnOffPWM+0x60>
    7304:	0d 94 dc 1a 	jmp	0x235b8	; 0x235b8 <lcd_menu_xyz_y_min()>
    7308:	0c 94 7f d0 	jmp	0x1a0fe	; 0x1a0fe <lcd_check_filament_set()>
    730c:	0c 94 a4 d1 	jmp	0x1a348	; 0x1a348 <lcd_fsensor_enabled_set()>
    7310:	0c 94 85 e1 	jmp	0x1c30a	; 0x1c30a <lcd_mmuCutFilament()>
    7314:	0c 94 98 d4 	jmp	0x1a930	; 0x1a930 <void select_sheet_menu<(unsigned char)6>()>
    7318:	0c 94 26 da 	jmp	0x1b44c	; 0x1b44c <lcd_control_temperature_menu()>
    731c:	0d 94 34 a0 	jmp	0x34068	; 0x34068 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x1a4>
    7320:	0d 94 1f 2c 	jmp	0x2583e	; 0x2583e <lcdui_print_status_line()+0x1a0>
    7324:	0c 94 e1 d7 	jmp	0x1afc2	; 0x1afc2 <lcd_settings_menu()>
    7328:	0d 94 e8 ac 	jmp	0x359d0	; 0x359d0 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xfc>
    732c:	0c 94 e2 fa 	jmp	0x1f5c4	; 0x1f5c4 <lcd_wizard(WizState)+0x25c>
    7330:	0c 94 e0 e3 	jmp	0x1c7c0	; 0x1c7c0 <lcd_menu_show_sensors_state()>
    7334:	0c 94 3c d5 	jmp	0x1aa78	; 0x1aa78 <lcd_reprint_from_eeprom()>
    7338:	0c 94 2e f5 	jmp	0x1ea5c	; 0x1ea5c <lcd_colorprint_change()>
    733c:	0d 94 73 0c 	jmp	0x218e6	; 0x218e6 <menu_lcd_lcdupdate_func()>
    7340:	0c 94 48 e2 	jmp	0x1c490	; 0x1c490 <load_filament_wrapper(unsigned char)>
    7344:	0c 94 39 e2 	jmp	0x1c472	; 0x1c472 <load_all_wrapper()>
    7348:	0d 94 1e 1d 	jmp	0x23a3c	; 0x23a3c <lcd_move_z() [clone .lto_priv.407]>
    734c:	0c 94 9a f0 	jmp	0x1e134	; 0x1e134 <lcd_experimental_menu()>
    7350:	0c 94 59 d0 	jmp	0x1a0b2	; 0x1a0b2 <mbl_probe_nr_toggle()>
    7354:	0d 94 af 51 	jmp	0x2a35e	; 0x2a35e <mFilamentItem(unsigned int, unsigned int)+0x22e>
    7358:	0d 94 44 51 	jmp	0x2a288	; 0x2a288 <mFilamentItem(unsigned int, unsigned int)+0x158>
    735c:	0c 94 7f e1 	jmp	0x1c2fe	; 0x1c2fe <lcd_mmuUnloadFilament()>
    7360:	0d 94 83 a6 	jmp	0x34d06	; 0x34d06 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x8c>
    7364:	0c 94 f8 d4 	jmp	0x1a9f0	; 0x1a9f0 <lcd_checking_menu()>
    7368:	0c 94 28 ea 	jmp	0x1d450	; 0x1d450 <analogWrite+0xb2>
    736c:	0c 94 7c e1 	jmp	0x1c2f8	; 0x1c2f8 <lcd_mmuLoadFilament()>
    7370:	0c 94 45 d5 	jmp	0x1aa8a	; 0x1aa8a <menu_lcd_longpress_func()>
    7374:	0d 94 26 19 	jmp	0x2324c	; 0x2324c <lcd_menu_fails_stats_total()>
    7378:	0c 94 82 fa 	jmp	0x1f504	; 0x1f504 <lcd_wizard(WizState)+0x19c>
    737c:	0d 94 57 16 	jmp	0x22cae	; 0x22cae <lcd_adjust_bed()>
    7380:	0c 94 22 74 	jmp	0xe844	; 0xe844 <__vector_23+0xd0>
    7384:	0d 94 c5 ac 	jmp	0x3598a	; 0x3598a <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xb6>
    7388:	0d 94 8a 17 	jmp	0x22f14	; 0x22f14 <lcd_menu_temperatures()>
    738c:	0d 94 2e 52 	jmp	0x2a45c	; 0x2a45c <mFilamentItem_FLEX()>
    7390:	0d 94 36 52 	jmp	0x2a46c	; 0x2a46c <lcd_dump_memory()>
    7394:	0d 94 fc 0a 	jmp	0x215f8	; 0x215f8 <lcd_commands() [clone .part.41]+0x76e>
    7398:	0c 94 0a db 	jmp	0x1b614	; 0x1b614 <lcd_language()>
    739c:	0c 94 30 d0 	jmp	0x1a060	; 0x1a060 <lcd_fsensor_autoload_set()>
    73a0:	0d 94 9b 2c 	jmp	0x25936	; 0x25936 <lcdui_print_status_line()+0x298>
    73a4:	0d 94 4c a0 	jmp	0x34098	; 0x34098 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x1d4>
    73a8:	0c 94 0f ce 	jmp	0x19c1e	; 0x19c1e <turnOffPWM+0xc6>
    73ac:	0c 94 99 cf 	jmp	0x19f32	; 0x19f32 <lcd_calibrate_pinda()>
    73b0:	0d 94 6b 0a 	jmp	0x214d6	; 0x214d6 <lcd_commands() [clone .part.41]+0x64c>
    73b4:	0d 94 12 51 	jmp	0x2a224	; 0x2a224 <mFilamentItem(unsigned int, unsigned int)+0xf4>
    73b8:	0d 94 3c 17 	jmp	0x22e78	; 0x22e78 <lcd_menu_AutoLoadFilament() [clone .lto_priv.413]>
    73bc:	0d 94 26 52 	jmp	0x2a44c	; 0x2a44c <mFilamentItem_PP()>
    73c0:	0c 94 89 d0 	jmp	0x1a112	; 0x1a112 <lcd_check_version_set()>
    73c4:	0c 94 da d0 	jmp	0x1a1b4	; 0x1a1b4 <lcd_sound_state_set()>
    73c8:	0d 94 2b 10 	jmp	0x22056	; 0x22056 <loading_test_wrapper(unsigned char)>
    73cc:	0c 94 93 d0 	jmp	0x1a126	; 0x1a126 <lcd_check_model_set()>
    73d0:	0d 94 f6 51 	jmp	0x2a3ec	; 0x2a3ec <mFilamentItem_ASA()>
    73d4:	0c 94 e9 df 	jmp	0x1bfd2	; 0x1bfd2 <crash_mode_switch()>
    73d8:	0d 94 c1 0f 	jmp	0x21f82	; 0x21f82 <lcd_mmu_load_to_nozzle_wrapper(unsigned char)>
    73dc:	0d 94 fa 50 	jmp	0x2a1f4	; 0x2a1f4 <mFilamentItem(unsigned int, unsigned int)+0xc4>
    73e0:	0d 94 72 21 	jmp	0x242e4	; 0x242e4 <lcd_generic_preheat_menu()>
    73e4:	0c 94 ef df 	jmp	0x1bfde	; 0x1bfde <lcd_crash_mode_info()>
    73e8:	0c 94 fe 73 	jmp	0xe7fc	; 0xe7fc <__vector_23+0x88>
    73ec:	0c 94 d0 cd 	jmp	0x19ba0	; 0x19ba0 <turnOffPWM+0x48>
    73f0:	0d 94 fe 51 	jmp	0x2a3fc	; 0x2a3fc <mFilamentItem_PC()>
    73f4:	0d 94 a9 51 	jmp	0x2a352	; 0x2a352 <mFilamentItem(unsigned int, unsigned int)+0x222>
    73f8:	0c 94 f3 fa 	jmp	0x1f5e6	; 0x1f5e6 <lcd_wizard(WizState)+0x27e>
    73fc:	0d 94 47 18 	jmp	0x2308e	; 0x2308e <lcd_menu_fails_stats_print()>
    7400:	0d 94 30 1d 	jmp	0x23a60	; 0x23a60 <lcd_move_x() [clone .lto_priv.418]>
    7404:	0c 94 a0 cf 	jmp	0x19f40	; 0x19f40 <nozzle_change()>
    7408:	0d 94 67 0a 	jmp	0x214ce	; 0x214ce <lcd_commands() [clone .part.41]+0x644>
    740c:	0c 94 54 d9 	jmp	0x1b2a8	; 0x1b2a8 <lcd_calibration_menu()>
    7410:	0d 94 9b 19 	jmp	0x23336	; 0x23336 <lcd_menu_fails_stats_mmu_total()>
    7414:	0c 94 fa cf 	jmp	0x19ff4	; 0x19ff4 <fsensor_reinit()>
    7418:	0c 94 d8 cd 	jmp	0x19bb0	; 0x19bb0 <turnOffPWM+0x58>
    741c:	0c 94 a7 e4 	jmp	0x1c94e	; 0x1c94e <mmu_enable_switch()>
    7420:	0c 94 bd d0 	jmp	0x1a17a	; 0x1a17a <lcd_second_serial_set()>
    7424:	0c 94 78 fa 	jmp	0x1f4f0	; 0x1f4f0 <lcd_wizard(WizState)+0x188>
    7428:	0c 94 9d d0 	jmp	0x1a13a	; 0x1a13a <lcd_check_mode_set()>
    742c:	0d 94 93 1f 	jmp	0x23f26	; 0x23f26 <pid_extruder()>
    7430:	0d 94 7f ac 	jmp	0x358fe	; 0x358fe <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x2a>
    7434:	0d 94 1f 17 	jmp	0x22e3e	; 0x22e3e <lcd_cutter_enabled() [clone .lto_priv.417]>
    7438:	0d 94 e1 ac 	jmp	0x359c2	; 0x359c2 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xee>
    743c:	0d 94 ac 2c 	jmp	0x25958	; 0x25958 <lcdui_print_status_line()+0x2ba>
    7440:	0c 94 27 f1 	jmp	0x1e24e	; 0x1e24e <lcd_settings_linearity_correction_menu()>
    7444:	0c 94 cf d0 	jmp	0x1a19e	; 0x1a19e <lcd_temp_calibration_set()>
    7448:	0d 94 26 11 	jmp	0x2224c	; 0x2224c <uart2_putchar(char, __file*) [clone .lto_priv.397]>
    744c:	0c 94 07 ea 	jmp	0x1d40e	; 0x1d40e <analogWrite+0x70>
    7450:	0d 94 1f 22 	jmp	0x2443e	; 0x2443e <lcd_preheat_menu() [clone .lto_priv.409]>
    7454:	0c 94 a2 d4 	jmp	0x1a944	; 0x1a944 <void select_sheet_menu<(unsigned char)4>()>
    7458:	0c 94 d0 f8 	jmp	0x1f1a0	; 0x1f1a0 <lcd_resume_print()>
    745c:	0d 94 e3 51 	jmp	0x2a3c6	; 0x2a3c6 <lcd_unLoadFilament() [clone .lto_priv.412]>
    7460:	0d 94 a3 0d 	jmp	0x21b46	; 0x21b46 <lcd_mesh_bed_leveling_settings()>
    7464:	0c 94 82 e1 	jmp	0x1c304	; 0x1c304 <lcd_mmuEjectFilament()>
    7468:	0c 94 0b fb 	jmp	0x1f616	; 0x1f616 <lcd_wizard(WizState)+0x2ae>
    746c:	0c 94 22 f0 	jmp	0x1e044	; 0x1e044 <activate_calibrate_sheet()>
    7470:	0d 94 e6 51 	jmp	0x2a3cc	; 0x2a3cc <mFilamentItem_PLA()>
    7474:	0d 94 2e a0 	jmp	0x3405c	; 0x3405c <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x198>
    7478:	0c 94 26 d0 	jmp	0x1a04c	; 0x1a04c <lcd_fsensor_runout_set()>
    747c:	0c 94 0a e2 	jmp	0x1c414	; 0x1c414 <mmu_cut_filament_menu() [clone .lto_priv.449]>
    7480:	0d 94 da 9f 	jmp	0x33fb4	; 0x33fb4 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xf0>
    7484:	0d 94 1f a0 	jmp	0x3403e	; 0x3403e <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x17a>
    7488:	0d 94 ad 3f 	jmp	0x27f5a	; 0x27f5a <lcd_menu_statistics()>
    748c:	0c 94 c7 d1 	jmp	0x1a38e	; 0x1a38e <lcd_mmu_mode_toggle()>
    7490:	0d 94 7a d4 	jmp	0x3a8f4	; 0x3a8f4 <MMU2::tuneIdlerStallguardThresholdMenu()>
    7494:	0d 94 09 30 	jmp	0x26012	; 0x26012 <lcd_cooldown() [clone .lto_priv.435]>
    7498:	0d 94 ac 51 	jmp	0x2a358	; 0x2a358 <mFilamentItem(unsigned int, unsigned int)+0x228>
    749c:	0d 94 31 a0 	jmp	0x34062	; 0x34062 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x19e>
    74a0:	0c 94 88 e1 	jmp	0x1c310	; 0x1c310 <lcd_mmuLoadingTest()>
    74a4:	0c 94 3a d0 	jmp	0x1a074	; 0x1a074 <lcd_heat_bed_on_load_toggle()>
    74a8:	0d 94 6a a6 	jmp	0x34cd4	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
    74ac:	0d 94 16 52 	jmp	0x2a42c	; 0x2a42c <mFilamentItem_ABS()>
    74b0:	0c 94 a7 d0 	jmp	0x1a14e	; 0x1a14e <lcd_fsensor_actionNA_set()>
    74b4:	0c 94 d9 73 	jmp	0xe7b2	; 0xe7b2 <__vector_23+0x3e>
    74b8:	0d 94 1e 52 	jmp	0x2a43c	; 0x2a43c <mFilamentItem_HIPS()>
    74bc:	0c 94 93 d4 	jmp	0x1a926	; 0x1a926 <void select_sheet_menu<(unsigned char)7>()>
    74c0:	0c 94 74 d0 	jmp	0x1a0e8	; 0x1a0e8 <mbl_magnets_elimination_toggle()>
    74c4:	0d 94 73 d2 	jmp	0x3a4e6	; 0x3a4e6 <_menu_edit_P()>
    74c8:	0c 94 6c fa 	jmp	0x1f4d8	; 0x1f4d8 <lcd_wizard(WizState)+0x170>
    74cc:	0c 94 1c ce 	jmp	0x19c38	; 0x19c38 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)>
    74d0:	0d 94 40 10 	jmp	0x22080	; 0x22080 <loading_test_all_wrapper()>
    74d4:	0c 94 03 e0 	jmp	0x1c006	; 0x1c006 <lcd_belttest_v()>
    74d8:	0c 94 f3 73 	jmp	0xe7e6	; 0xe7e6 <__vector_23+0x72>
    74dc:	0d 94 06 52 	jmp	0x2a40c	; 0x2a40c <mFilamentItem_PVB()>
    74e0:	0c 94 68 d0 	jmp	0x1a0d0	; 0x1a0d0 <mbl_mesh_toggle()>
    74e4:	0d 94 53 0b 	jmp	0x216a6	; 0x216a6 <lcd_commands() [clone .part.41]+0x81c>
    74e8:	0c 94 a7 d4 	jmp	0x1a94e	; 0x1a94e <void select_sheet_menu<(unsigned char)3>()>
    74ec:	0c 94 e3 76 	jmp	0xedc6	; 0xedc6 <uart_putchar(char, __file*)>
    74f0:	0c 94 b1 d4 	jmp	0x1a962	; 0x1a962 <void select_sheet_menu<(unsigned char)1>()>
    74f4:	0d 94 2b a0 	jmp	0x34056	; 0x34056 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x192>
    74f8:	0c 94 27 f2 	jmp	0x1e44e	; 0x1e44e <lcd_sdcard_menu()>
    74fc:	0c 94 91 e0 	jmp	0x1c122	; 0x1c122 <lcd_sd_updir()>
    7500:	0c 94 60 74 	jmp	0xe8c0	; 0xe8c0 <__vector_23+0x14c>
    7504:	0c 94 fd cd 	jmp	0x19bfa	; 0x19bfa <turnOffPWM+0xa2>
    7508:	0c 94 45 e1 	jmp	0x1c28a	; 0x1c28a <mmu_preload_filament_menu()>
    750c:	0d 94 dc 17 	jmp	0x22fb8	; 0x22fb8 <lcd_menu_voltages()>
    7510:	0c 94 90 e5 	jmp	0x1cb20	; 0x1cb20 <lcd_v2_calibration()>
    7514:	0c 94 0c 74 	jmp	0xe818	; 0xe818 <__vector_23+0xa4>
    7518:	0d 94 e5 a6 	jmp	0x34dca	; 0x34dca <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x150>
    751c:	0c 94 14 fb 	jmp	0x1f628	; 0x1f628 <lcd_wizard(WizState)+0x2c0>
    7520:	0d 94 0e 52 	jmp	0x2a41c	; 0x2a41c <mFilamentItem_PA()>
    7524:	0c 94 0a ce 	jmp	0x19c14	; 0x19c14 <turnOffPWM+0xbc>
    7528:	0c 94 8b e1 	jmp	0x1c316	; 0x1c316 <change_sheet()>
    752c:	0c 94 0d 64 	jmp	0xc81a	; 0xc81a <_GLOBAL__sub_D_card>
    7530:	0d 94 f6 ac 	jmp	0x359ec	; 0x359ec <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x118>
    7534:	0d 94 40 a0 	jmp	0x34080	; 0x34080 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x1bc>
    7538:	0d 94 fa 09 	jmp	0x213f4	; 0x213f4 <lcd_commands() [clone .part.41]+0x56a>
    753c:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>
    7540:	0c 94 ff f8 	jmp	0x1f1fe	; 0x1f1fe <lcd_resume_usb_print()>
    7544:	0d 94 39 1d 	jmp	0x23a72	; 0x23a72 <lcd_menu_fails_stats() [clone .lto_priv.414]>
    7548:	0d 94 68 2c 	jmp	0x258d0	; 0x258d0 <lcdui_print_status_line()+0x232>
    754c:	0d 94 37 51 	jmp	0x2a26e	; 0x2a26e <mFilamentItem(unsigned int, unsigned int)+0x13e>
    7550:	0c 94 56 ea 	jmp	0x1d4ac	; 0x1d4ac <analogWrite+0x10e>
    7554:	0d 94 63 1f 	jmp	0x23ec6	; 0x23ec6 <lcd_menu_toolchange_stats_mmu_total()>
    7558:	0d 94 c5 a6 	jmp	0x34d8a	; 0x34d8a <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x110>
    755c:	0c 94 35 e1 	jmp	0x1c26a	; 0x1c26a <backlight_mode_toggle()>
    7560:	0d 94 c8 2c 	jmp	0x25990	; 0x25990 <lcdui_print_status_line()+0x2f2>
    7564:	0c 94 d4 cd 	jmp	0x19ba8	; 0x19ba8 <turnOffPWM+0x50>
    7568:	0c 94 12 e2 	jmp	0x1c424	; 0x1c424 <mmu_fil_eject_menu() [clone .lto_priv.448]>
    756c:	0c 94 df cd 	jmp	0x19bbe	; 0x19bbe <turnOffPWM+0x66>
    7570:	0d 94 f7 18 	jmp	0x231ee	; 0x231ee <lcd_menu_belt_status()>
    7574:	0c 94 42 ea 	jmp	0x1d484	; 0x1d484 <analogWrite+0xe6>
    7578:	0d 94 e2 a6 	jmp	0x34dc4	; 0x34dc4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x14a>
    757c:	0d 94 58 0d 	jmp	0x21ab0	; 0x21ab0 <lcd_wizard()>
    7580:	0c 94 46 d0 	jmp	0x1a08c	; 0x1a08c <WorkaroundPrusaSN()>
    7584:	0c 94 14 ea 	jmp	0x1d428	; 0x1d428 <analogWrite+0x8a>
    7588:	0d 94 e0 51 	jmp	0x2a3c0	; 0x2a3c0 <lcd_LoadFilament() [clone .lto_priv.411]>
    758c:	0c 94 01 ce 	jmp	0x19c02	; 0x19c02 <turnOffPWM+0xaa>
    7590:	0d 94 74 10 	jmp	0x220e8	; 0x220e8 <lcd_settings_menu()::{lambda()#1}::_FUN()>
    7594:	0c 94 7f d3 	jmp	0x1a6fe	; 0x1a6fe <lcd_fsensor_settings_menu()>
    7598:	0c 94 17 ce 	jmp	0x19c2e	; 0x19c2e <xyzcal_calc_delay(unsigned int, unsigned int)>
    759c:	0d 94 a6 1d 	jmp	0x23b4c	; 0x23b4c <lcd_support_menu() [clone .lto_priv.408]>
    75a0:	0c 94 3a ea 	jmp	0x1d474	; 0x1d474 <analogWrite+0xd6>
    75a4:	0c 94 f9 fa 	jmp	0x1f5f2	; 0x1f5f2 <lcd_wizard(WizState)+0x28a>
    75a8:	0c 94 84 cf 	jmp	0x19f08	; 0x19f08 <lcd_mesh_calibration()>
    75ac:	0d 94 27 1d 	jmp	0x23a4e	; 0x23a4e <lcd_move_y() [clone .lto_priv.419]>
    75b0:	0d 94 41 51 	jmp	0x2a282	; 0x2a282 <mFilamentItem(unsigned int, unsigned int)+0x152>
    75b4:	0d 94 3a 51 	jmp	0x2a274	; 0x2a274 <mFilamentItem(unsigned int, unsigned int)+0x144>
    75b8:	0d 94 e4 ac 	jmp	0x359c8	; 0x359c8 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xf4>
    75bc:	0c 94 22 e2 	jmp	0x1c444	; 0x1c444 <mmu_cut_filament_wrapper(unsigned char)>
    75c0:	0c 94 ad ce 	jmp	0x19d5a	; 0x19d5a <lcd_thermal_model_cal()>
    75c4:	0c 94 13 ce 	jmp	0x19c26	; 0x19c26 <check_pinda_1()>
    75c8:	0c 94 42 d3 	jmp	0x1a684	; 0x1a684 <lcd_sdcard_stop()>
    75cc:	0c 94 f9 df 	jmp	0x1bff2	; 0x1bff2 <lcd_crash_mode_info2()>
    75d0:	0c 94 8b cf 	jmp	0x19f16	; 0x19f16 <lcd_mesh_calibration_z()>
    75d4:	0d 94 34 2a 	jmp	0x25468	; 0x25468 <lcd_pause_print()>
    75d8:	0c 94 05 ce 	jmp	0x19c0a	; 0x19c0a <turnOffPWM+0xb2>

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 <enquecommand(char const*, bool)::__c>:
    76de:	22 00                                               ".

000076e0 <mp_echo_config_state()::__c>:
	...

000076e1 <mp_echo_config_state()::__c>:
    76e1:	20 45 53 50 00                                       ESP.

000076e6 <mp_echo_config_state()::__c>:
    76e6:	20 4e 53 50 00                                       NSP.

000076eb <mp_echo_config_state()::__c>:
    76eb:	20 4f 46 46 00                                       OFF.

000076f0 <mp_echo_config_state()::__c>:
    76f0:	20 4f 4e 00                                          ON.

000076f4 <mp_echo_config_state()::__c>:
    76f4:	50 56 30 31 00                                      PV01.

000076f9 <mp_echo_config_state()::__c>:
    76f9:	20 5b 4d 50 5d 20 00                                 [MP] .

00007700 <get_command()::__c>:
    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 <get_command()::__c>:
    7714:	52 58 20 74 69 6d 65 6f 75 74 00                    RX timeout.

0000771f <get_command()::__c>:
    771f:	4d 33 31 30 00                                      M310.

00007724 <get_command()::__c>:
    7724:	4d 31 31 32 00                                      M112.

00007729 <get_command()::__c>:
    7729:	4d 31 31 30 00                                      M110.

0000772e <get_command()::__c>:
    772e:	46 75 6c 6c 20 52 58 20 42 75 66 66 65 72 00        Full RX Buffer.

0000773d <Config_StoreSettings()::__c>:
    773d:	53 65 74 74 69 6e 67 73 20 53 74 6f 72 65 64 00     Settings Stored.

0000774d <thermal_model_load_settings()::__c>:
    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 <Config_RetrieveSettings()::__c>:
    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 <Config_ResetDefault()::__c>:
    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 <default_conf>:
    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 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7884:	43 75 73 74 6f 6d 00                                Custom.

0000788b <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    788b:	4e 79 6c 6f 6e 50 41 00                             NylonPA.

00007893 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7893:	53 61 74 69 6e 20 20 00                             Satin  .

0000789b <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    789b:	54 65 78 74 75 72 00                                Textur.

000078a2 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    78a2:	53 6d 6f 6f 74 68 00                                Smooth.

000078a9 <fanSpeedError(unsigned char)::__c>:
    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 <fanSpeedError(unsigned char)::__c>:
    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 <la10c_mode_change(LA10C_MODE)::__c>:
    78f8:	31 2e 30 00                                         1.0.

000078fc <la10c_mode_change(LA10C_MODE)::__c>:
    78fc:	31 2e 35 00                                         1.5.

00007900 <la10c_mode_change(LA10C_MODE)::__c>:
    7900:	55 4e 4b 4e 4f 57 4e 00                             UNKNOWN.

00007908 <la10c_mode_change(LA10C_MODE)::__c>:
    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 <la10c_jerk(float)::__c>:
    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 <Font>:
    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<P..pUx%(.
    7ad2:	60 75 79 49 08 89 60 75 3c 12 88 70 70 79 0c 12     `uyI..`u<..ppy..
    7ae2:	88 52 22 59 44 12 f1 24 f0 7a 44 52 f1 24 f0 7a     .R"YD..$.zDR.$.z
    7af2:	8c 52 f0 36 8f 5a 44 20 f1 24 f0 7a                 .R.6.ZD .$.z

00007afe <row_offsets>:
    7afe:	00 40 14 54                                         .@.T

00007b02 <pwr_m10>:
    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 <pwr_p10>:
    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 <pstr_nan>:
    7b32:	4e 41 4e                                            NAN

00007b35 <pstr_inf>:
    7b35:	49 4e 46                                            INF

00007b38 <host_keepalive()::__c>:
    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 <host_keepalive()::__c>:
    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 <host_keepalive()::__c>:
    7b65:	62 75 73 79 3a 20 70 72 6f 63 65 73 73 69 6e 67     busy: processing
	...

00007b76 <base_max_pos_P>:
    7b76:	00 00 7f 43 00 80 54 43 00 00 52 43                 ...C..TC..RC

00007b82 <base_min_pos_P>:
    7b82:	00 00 00 00 00 00 80 c0 9a 99 19 3e                 ...........>

00007b8e <base_home_pos_P>:
    7b8e:	00 00 00 00 00 00 80 c0 9a 99 19 3e                 ...........>

00007b9a <home_retract_mm_P>:
    7b9a:	00 00 a0 40 00 00 a0 40 00 00 00 40                 ...@...@...@

00007ba6 <homeaxis(unsigned char, unsigned char, unsigned char*)::__c>:
    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 <max_length_P>:
    7bbe:	00 00 7f 43 00 80 58 43 9a d9 51 43                 ...C..XC..QC

00007bca <home_dir_P>:
    7bca:	ff ff ff                                            ...

00007bcd <gcode_M105()::__c>:
    7bcd:	20 41 3a 00                                          A:.

00007bd1 <gcode_M105()::__c>:
    7bd1:	20 50 3a 00                                          P:.

00007bd5 <gcode_M105()::__c>:
    7bd5:	20 42 40 3a 00                                       B@:.

00007bda <gcode_M105()::__c>:
    7bda:	20 40 3a 00                                          @:.

00007bde <gcode_M105()::__c>:
    7bde:	20 2f 00                                             /.

00007be1 <gcode_M105()::__c>:
    7be1:	20 54 30 3a 00                                       T0:.

00007be6 <gcode_M105()::__c>:
    7be6:	20 2f 00                                             /.

00007be9 <gcode_M105()::__c>:
    7be9:	20 42 3a 00                                          B:.

00007bed <gcode_M105()::__c>:
    7bed:	20 2f 00                                             /.

00007bf0 <gcode_M105()::__c>:
    7bf0:	54 3a 00                                            T:.

00007bf3 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const::__c>:
    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 <gcode_G80()::__c>:
    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 <gcode_G80()::__c>:
    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 <mesh_bed_leveling::print()::__c>:
    7c8c:	20 20 00                                              .

00007c8f <mesh_bed_leveling::print()::__c>:
    7c8f:	4d 65 61 73 75 72 65 64 20 70 6f 69 6e 74 73 3a     Measured points:
	...

00007ca0 <mesh_bed_leveling::print()::__c>:
    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 <mesh_bed_leveling::print()::__c>:
    7cb6:	4e 75 6d 20 58 2c 59 3a 20 37 2c 37 00              Num X,Y: 7,7.

00007cc3 <gcode_G81_M420()::__c>:
    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 <gcode_M114()::__c>:
    7ce1:	20 45 3a 00                                          E:.

00007ce5 <gcode_M114()::__c>:
    7ce5:	20 5a 3a 00                                          Z:.

00007ce9 <gcode_M114()::__c>:
    7ce9:	20 59 3a 00                                          Y:.

00007ced <gcode_M114()::__c>:
    7ced:	20 45 3a 00                                          E:.

00007cf1 <gcode_M114()::__c>:
    7cf1:	20 5a 3a 00                                          Z:.

00007cf5 <gcode_M114()::__c>:
    7cf5:	20 59 3a 00                                          Y:.

00007cf9 <gcode_M114()::__c>:
    7cf9:	58 3a 00                                            X:.

00007cfc <SpoolJoin::SpoolJoin::nextSlot()::__c>:
    7cfc:	20 2d 3e 20 00                                       -> .

00007d01 <SpoolJoin::SpoolJoin::nextSlot()::__c>:
    7d01:	53 70 6f 6f 6c 4a 6f 69 6e 3a 20 00                 SpoolJoin: .

00007d0d <gcode_M861_print_pinda_cal_eeprom()::comma_sep>:
    7d0d:	2c 20 00                                            , .

00007d10 <manage_inactivity(bool)::__c>:
    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 <kill(char const*)::__c>:
    7d24:	4b 49 4c 4c 45 44 2e 00                             KILLED..

00007d2c <kill(char const*)::__c>:
    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 <check_babystep()::__c>:
    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 <check_babystep()::__c>:
    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 <serialecho_temperatures()::__c>:
    7db1:	20 45 3a 30 20 42 3a 00                              E:0 B:.

00007db9 <serialecho_temperatures()::__c>:
    7db9:	54 3a 00                                            T:.

00007dbc <stop_and_save_print_to_ram(float, float)::__c>:
    7dbc:	47 31 20 5a 25 2d 2e 33 66 20 46 25 2d 2e 33 66     G1 Z%-.3f F%-.3f
	...

00007dcd <TCodeInvalid()::__c>:
    7dcd:	49 6e 76 61 6c 69 64 20 54 20 63 6f 64 65 2e 00     Invalid T code..

00007ddd <duplicate_Tcode_ignored>:
    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 <gcode_M900()::__c>:
    7df7:	41 64 76 61 6e 63 65 20 4b 3d 00                    Advance K=.

00007e02 <gcode_M900()::__c>:
    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 <lcd_wait_for_heater()::__c>:
    7e2a:	25 33 64 2f 25 33 64 00                             %3d/%3d.

00007e32 <M600_wait_for_user()::__c>:
    7e32:	25 33 64 00                                         %3d.

00007e36 <lcd_alright()::__c>:
    7e36:	20 0a 20 0a 20 0a 20 00                              . . . .

00007e3e <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <Config_PrintSettings(unsigned char)::__c>:
    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 <thermal_model_cal::autotune(int)::__c>:
    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 <thermal_model_cal::autotune(int)::__c>:
    8375:	54 4d 3a 20 25 53 20 52 20 25 64 43 00              TM: %S R %dC.

00008382 <thermal_model_cal::autotune(int)::__c>:
    8382:	54 4d 3a 20 25 53 20 43 20 65 73 74 2e 00           TM: %S C est..

00008390 <thermal_model_cal::autotune(int)::__c>:
    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 <thermal_model_cal::autotune(int)::__c>:
    83a3:	72 65 66 69 6e 65 00                                refine.

000083aa <thermal_model_cal::autotune(int)::__c>:
    83aa:	69 6e 69 74 69 61 6c 00                             initial.

000083b2 <thermal_model_autotune(int, bool)::__c>:
    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 <thermal_model_autotune(int, bool)::__c>:
    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 <thermal_model_autotune(int, bool)::__c>:
    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 <cap_line(char const*, bool)::__c>:
    83ee:	43 61 70 3a 25 53 3a 25 63 0a 00                    Cap:%S:%c..

000083f9 <extended_capabilities_report()::__c>:
    83f9:	50 52 55 53 41 5f 4d 4d 55 32 00                    PRUSA_MMU2.

00008404 <extended_capabilities_report()::__c>:
    8404:	45 58 54 45 4e 44 45 44 5f 4d 32 30 00              EXTENDED_M20.

00008411 <extended_capabilities_report()::__c>:
    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 <extended_capabilities_report()::__c>:
    8425:	41 55 54 4f 52 45 50 4f 52 54 5f 46 41 4e 53 00     AUTOREPORT_FANS.

00008435 <extended_capabilities_report()::__c>:
    8435:	41 55 54 4f 52 45 50 4f 52 54 5f 54 45 4d 50 00     AUTOREPORT_TEMP.

00008445 <show_upgrade_dialog_if_version_newer(char const*)::__c>:
	...

00008446 <FW_VERSION_STR>:
    8446:	33 2e 31 34 2e 31 00                                3.14.1.

0000844d <CardReader::removeFile(char const*)::__c>:
    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 <CardReader::removeFile(char const*)::__c>:
    8465:	46 69 6c 65 20 64 65 6c 65 74 65 64 3a 00           File deleted:.

00008473 <CardReader::getStatus(bool)::__c>:
    8473:	4e 6f 74 20 53 44 20 70 72 69 6e 74 69 6e 67 00     Not SD printing.

00008483 <CardReader::getStatus(bool)::__c>:
    8483:	50 72 69 6e 74 20 73 61 76 65 64 00                 Print saved.

0000848f <CardReader::getStatus(bool)::__c>:
    848f:	53 44 20 70 72 69 6e 74 20 70 61 75 73 65 64 00     SD print paused.

0000849f <lcd_wait_for_pinda(float)::__c>:
    849f:	25 33 64 2f 25 33 64 00                             %3d/%3d.

000084a7 <gcode_PRUSA_BadRAMBoFanTest()::__c>:
    84a7:	4f 4b 00                                            OK.

000084aa <gcode_PRUSA_BadRAMBoFanTest()::__c>:
    84aa:	42 41 44 00                                         BAD.

000084ae <gcode_PRUSA_BadRAMBoFanTest()::__c>:
    84ae:	52 41 4d 42 6f 20 46 41 4e 20 00                    RAMBo FAN .

000084b9 <crashdet_detected(unsigned char)::__c>:
    84b9:	43 52 41 53 48 5f 43 41 4e 43 45 4c 00              CRASH_CANCEL.

000084c6 <crashdet_detected(unsigned char)::__c>:
    84c6:	43 52 41 53 48 5f 52 45 43 4f 56 45 52 00           CRASH_RECOVER.

000084d4 <crashdet_detected(unsigned char)::__c>:
    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 <sensitive_pins>:
    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 <process_commands()::__c>:
    87f0:	46 41 4e 00                                         FAN.

000087f4 <process_commands()::__c>:
    87f4:	46 41 4e 50 49 4e 54 53 54 00                       FANPINTST.

000087fe <process_commands()::__c>:
    87fe:	50 52 55 53 41 00                                   PRUSA.

00008804 <process_commands()::__c>:
    8804:	53 45 54 5f 43 48 4f 50 5f 00                       SET_CHOP_.

0000880e <process_commands()::__c>:
    880e:	53 45 54 5f 53 54 45 50 5f 00                       SET_STEP_.

00008818 <process_commands()::__c>:
    8818:	53 45 54 5f 57 41 56 45 5f 00                       SET_WAVE_.

00008822 <process_commands()::__c>:
    8822:	54 4d 43 5f 00                                      TMC_.

00008827 <process_commands()::__c>:
    8827:	43 52 41 53 48 5f 43 41 4e 43 45 4c 00              CRASH_CANCEL.

00008834 <process_commands()::__c>:
    8834:	43 52 41 53 48 5f 52 45 43 4f 56 45 52 00           CRASH_RECOVER.

00008842 <process_commands()::__c>:
    8842:	43 52 41 53 48 5f 44 45 54 45 43 54 45 44 00        CRASH_DETECTED.

00008851 <process_commands()::__c>:
    8851:	43 52 41 53 48 5f 00                                CRASH_.

00008858 <lay1cal_finish()::cmd_cal_finish_8>:
    8858:	4d 31 30 34 53 30 00                                M104S0.

0000885f <lay1cal_finish()::cmd_cal_finish_6>:
    885f:	47 31 58 31 30 59 31 38 30 46 34 30 30 30 00        G1X10Y180F4000.

0000886e <lay1cal_finish()::cmd_cal_finish_5>:
    886e:	47 31 5a 31 30 46 31 33 30 30 00                    G1Z10F1300.

00008879 <lay1cal_finish()::cmd_cal_finish_4>:
    8879:	4d 31 34 30 53 30 00                                M140S0.

00008880 <lay1cal_finish()::cmd_cal_finish_3>:
    8880:	47 31 45 2d 30 2e 30 37 35 46 32 31 30 30 00        G1E-0.075F2100.

0000888f <lay1cal_before_meander()::cmd_pre_meander_6>:
    888f:	4d 32 30 34 53 31 30 30 30 00                       M204S1000.

00008899 <lay1cal_before_meander()::cmd_pre_meander_5>:
    8899:	47 31 5a 35 46 37 32 30 30 00                       G1Z5F7200.

000088a3 <lay1cal_before_meander()::cmd_pre_meander_4>:
    88a3:	47 31 45 2d 31 2e 35 46 32 31 30 30 00              G1E-1.5F2100.

000088b0 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_11>:
    88b0:	47 31 5a 30 2e 32 00                                G1Z0.2.

000088b7 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_10>:
    88b7:	47 31 58 32 30 32 2e 35 45 38 46 31 34 30 30 00     G1X202.5E8F1400.

000088c7 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_9>:
    88c7:	47 31 59 2d 32 46 31 30 30 30 00                    G1Y-2F1000.

000088d2 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_8>:
    88d2:	47 31 58 32 34 30 45 32 35 46 32 32 30 30 00        G1X240E25F2200.

000088e1 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_6>:
    88e1:	47 31 5a 30 2e 33 46 31 30 30 30 00                 G1Z0.3F1000.

000088ed <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_5>:
    88ed:	47 31 58 35 35 45 38 46 32 30 30 30 00              G1X55E8F2000.

000088fa <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_4>:
    88fa:	47 31 58 35 45 32 39 46 31 38 30 30 00              G1X5E29F1800.

00008907 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_3>:
    8907:	47 31 58 35 35 45 32 39 46 31 30 37 33 00           G1X55E29F1073.

00008915 <zero_extrusion>:
    8915:	47 39 32 45 30 00                                   G92E0.

0000891b <lay1cal_wait_preheat()::preheat_cmd_4>:
    891b:	47 32 38 00                                         G28.

0000891f <lay1cal_wait_preheat()::preheat_cmd_3>:
    891f:	4d 31 30 39 00                                      M109.

00008924 <lay1cal_wait_preheat()::preheat_cmd_2>:
    8924:	4d 31 39 30 00                                      M190.

00008929 <lcd_mesh_bedleveling()::__c>:
    8929:	47 38 30 00                                         G80.

0000892d <lcd_mesh_calibration()::__c>:
    892d:	4d 34 35 00                                         M45.

00008931 <lcd_mesh_calibration_z()::__c>:
    8931:	4d 34 35 20 5a 00                                   M45 Z.

00008937 <lcd_calibrate_pinda()::__c>:
    8937:	47 37 36 00                                         G76.

0000893b <lcd_wizard_load()::__c>:
    893b:	4d 37 30 31 20 50 30 00                             M701 P0.

00008943 <lcd_wizard(WizState)::__c>:
    8943:	57 69 7a 61 72 64 20 73 74 61 74 65 3a 20 25 64     Wizard state: %d
    8953:	0a 00                                               ..

00008955 <SETTINGS_SILENT_MODE()::__c>:
    8955:	4d 39 31 34 00                                      M914.

0000895a <SETTINGS_SILENT_MODE()::__c>:
    895a:	4d 39 31 35 00                                      M915.

0000895f <lcd_hw_setup_menu()::__c>:
    895f:	45 78 70 65 72 69 6d 65 6e 74 61 6c 00              Experimental.

0000896c <lcd_hw_setup_menu()::__c>:
    896c:	30 2e 38 30 00                                      0.80.

00008971 <lcd_hw_setup_menu()::__c>:
    8971:	30 2e 36 30 00                                      0.60.

00008976 <lcd_hw_setup_menu()::__c>:
    8976:	30 2e 34 30 00                                      0.40.

0000897b <lcd_hw_setup_menu()::__c>:
    897b:	30 2e 32 35 00                                      0.25.

00008980 <lcd_settings_menu()::__c>:
    8980:	52 65 73 65 74 20 4d 4d 55 00                       Reset MMU.

0000898a <lcd_settings_menu()::__c>:
    898a:	4d 4d 55 00                                         MMU.

0000898e <lcd_calibration_menu()::__c>:
    898e:	4d 34 34 00                                         M44.

00008992 <lcd_tune_menu()::__c>:
    8992:	47 32 38 20 58 59 00                                G28 XY.

00008999 <check_commands()::__c>:
    8999:	4d 20 38 34 00                                      M 84.

0000899e <lcd_sdcard_menu()::__c>:
    899e:	85 2e 2e 00                                         ....

000089a2 <lcd_belttest()::__c>:
    89a2:	59 3a 20 25 75 20 2d 3e 20 2e 2e 2e 00              Y: %u -> ....

000089af <lcd_belttest()::__c>:
    89af:	58 3a 20 25 75 20 2d 3e 20 2e 2e 2e 00              X: %u -> ....

000089bc <lcd_wait_for_cool_down()::__c>:
    89bc:	25 33 64 2f 30 00                                   %3d/0.

000089c2 <lcd_wait_for_cool_down()::__c>:
    89c2:	25 33 64 2f 30 00                                   %3d/0.

000089c8 <lcd_selfcheck_axis_sg(unsigned char)::__c>:
    89c8:	25 63 20 41 58 49 53 20 53 47 31 3d 25 64 0a 00     %c AXIS SG1=%d..

000089d8 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    89d8:	48 6f 74 65 6e 64 00                                Hotend.

000089df <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    89df:	42 65 64 00                                         Bed.

000089e3 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    89e3:	5a 00                                               Z.

000089e5 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    89e5:	59 00                                               Y.

000089e7 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    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 <WorkaroundPrusaSN()::__c>:
    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 <lay1cal_finish()::cmd_cal_finish>:
    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 <extrude_fmt_Y>:
    8a24:	47 31 59 25 2e 34 66 45 25 2e 34 66 00              G1Y%.4fE%.4f.

00008a31 <lay1cal_meander_start(float, float)::fmt1>:
    8a31:	47 31 5a 25 2e 32 66 00                             G1Z%.2f.

00008a39 <lay1cal_meander_start(float, float)::__c>:
    8a39:	47 31 58 35 30 59 31 35 35 00                       G1X50Y155.

00008a43 <lay1cal_before_meander()::cmd_pre_meander>:
    8a43:	15 89 d5 69 76 6b a3 88 99 88 8f 88                 ...ivk......

00008a4f <extrude_fmt_X>:
    8a4f:	47 31 58 25 2e 34 66 45 25 2e 34 66 00              G1X%.4fE%.4f.

00008a5c <feedrate_F1080>:
    8a5c:	47 31 46 31 30 38 30 00                             G1F1080.

00008a64 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu>:
    8a64:	07 89 fa 88 ed 88 e1 88 15 89 d2 88 c7 88 b7 88     ................
    8a74:	b0 88                                               ..

00008a76 <lay1cal_load_filament(unsigned char)::__c>:
    8a76:	54 25 64 00                                         T%d.

00008a7a <lay1cal_load_filament(unsigned char)::__c>:
    8a7a:	47 31 5a 30 2e 34 00                                G1Z0.4.

00008a81 <lay1cal_load_filament(unsigned char)::__c>:
    8a81:	47 31 59 2d 33 46 31 30 30 30 00                    G1Y-3F1000.

00008a8c <lay1cal_wait_preheat()::preheat_cmd>:
    8a8c:	d9 69 24 89 1f 89 1b 89 15 89                       .i$.......

00008a96 <lcd_commands()::__c>:
    8a96:	4d 38 34 20 58 59 00                                M84 XY.

00008a9d <lcd_commands()::__c>:
    8a9d:	4d 31 30 39 20 53 32 38 30 00                       M109 S280.

00008aa7 <lcd_commands()::__c>:
    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 <lcd_commands()::__c>:
    8aba:	4d 33 31 30 20 41 20 46 31 00                       M310 A F1.

00008ac4 <lcd_commands()::__c>:
    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 <lcd_commands()::__c>:
    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 <lcd_commands()::__c>:
    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 <lcd_commands()::__c>:
    8b21:	4d 33 30 33 20 45 30 20 53 25 33 75 00              M303 E0 S%3u.

00008b2e <STR_REVISION_RC>:
    8b2e:	52 43 00                                            RC.

00008b31 <STR_REVISION_DEV>:
    8b31:	44 45 56 00                                         DEV.

00008b35 <STR_REVISION_BETA>:
    8b35:	42 45 54 41 00                                      BETA.

00008b3a <STR_REVISION_ALPHA>:
    8b3a:	41 4c 50 48 41 00                                   ALPHA.

00008b40 <port_to_mode_PGM>:
    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 <port_to_output_PGM>:
    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 <port_to_input_PGM>:
    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 <digital_pin_to_port_PGM>:
    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 <digital_pin_to_bit_mask_PGM>:
    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 <digital_pin_to_timer_PGM>:
    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 <lcd_splash()::__c>:
    8c90:	33 2e 31 34 2e 31 00                                3.14.1.

00008c97 <lcd_splash()::__c>:
    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 <update_sec_lang_from_external_flash()::__c>:
    8cc5:	4c 61 6e 67 75 61 67 65 20 75 70 64 61 74 65 00     Language update.

00008cd5 <get_PRUSA_SN(char*)::__c>:
    8cd5:	43 5a 50 58 00                                      CZPX.

00008cda <get_PRUSA_SN(char*)::__c>:
    8cda:	3b 53 00                                            ;S.

00008cdd <SpoolJoin::SpoolJoin::initSpoolJoinStatus()::__c>:
    8cdd:	53 70 6f 6f 6c 4a 6f 69 6e 20 69 73 20 00           SpoolJoin is .

00008ceb <adc_init()::__c>:
    8ceb:	61 64 63 5f 69 6e 69 74 00                          adc_init.

00008cf4 <reset_menu()::__c>:
    8cf4:	20 0a 20 0a 20 0a 20 00                              . . . .

00008cfc <reset_menu()::__c>:
    8cfc:	41 6c 6c 20 44 61 74 61 00                          All Data.

00008d05 <reset_menu()::__c>:
    8d05:	53 65 72 76 69 63 65 20 70 72 65 70 00              Service prep.

00008d12 <reset_menu()::__c>:
    8d12:	53 68 69 70 70 69 6e 67 20 70 72 65 70 00           Shipping prep.

00008d20 <reset_menu()::__c>:
    8d20:	53 74 61 74 69 73 74 69 63 73 00                    Statistics.

00008d2b <reset_menu()::__c>:
    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 <factory_reset()::__c>:
    8d45:	46 61 63 74 6f 72 79 20 52 45 53 45 54 00           Factory RESET.

00008d53 <FW_PRUSA3D_MAGIC_STR>:
    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 <FW_VERSION_NR>:
    8d62:	03 00 0e 00 01 00 40 00                             ......@.

00008d6a <setup::v3_2_0_4>:
    8d6a:	03 00 02 00 00 00 04 00                             ........

00008d72 <setup::__c>:
    8d72:	70 72 75 73 61 33 64 00                             prusa3d.

00008d7a <setup::__c>:
    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 <setup::__c>:
    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 <setup::__c>:
    8da5:	73 74 61 72 74 00                                   start.

00008dab <setup::__c>:
    8dab:	53 4e 20 75 70 64 61 74 65 20 66 61 69 6c 65 64     SN update failed
	...

00008dbc <setup::__c>:
    8dbc:	53 4e 20 75 70 64 61 74 65 64 00                    SN updated.

00008dc7 <setup::__c>:
    8dc7:	43 5a 50 58 00                                      CZPX.

00008dcc <loop::__c>:
    8dcc:	43 52 41 53 48 5f 44 45 54 45 43 54 45 44 58 59     CRASH_DETECTEDXY
	...

00008ddd <loop::__c>:
    8ddd:	43 52 41 53 48 5f 44 45 54 45 43 54 45 44 59 00     CRASH_DETECTEDY.

00008ded <loop::__c>:
    8ded:	43 52 41 53 48 5f 44 45 54 45 43 54 45 44 58 00     CRASH_DETECTEDX.

00008dfd <loop::__c>:
    8dfd:	4d 32 39 00                                         M29.

00008e01 <menu_format_sheet_select_E(Sheet const&, SheetFormatBuffer&)::__c>:
    8e01:	25 2d 39 2e 39 53 5b 00                             %-9.9S[.

00008e09 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float)::__c>:
    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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float)::__c>:
    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 <choose_menu_P(char const*, char const*, char const*)::__c>:
    8e42:	20 0a 20 0a 20 00                                    . . .

00008e48 <load_to_nozzle_sequence>:
    8e48:	00 00 48 42 00 00 58 41 9a 99 8d 41 33 33 53 40     ..HB..XA...A33S@

00008e58 <mmu2Magic>:
    8e58:	4d 4d 55 32 3a 00                                   MMU2:.

00008e5e <m2bed>:
    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 <m2hotend>:
    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 <recover_machine_state_after_power_panic()::__c>:
    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 <restore_print_from_eeprom(bool)::__c>:
    8ed2:	4d 32 36 20 53 25 6c 75 00                          M26 S%lu.

00008edb <restore_print_from_eeprom(bool)::__c>:
    8edb:	4d 31 30 36 20 53 25 75 00                          M106 S%u.

00008ee4 <restore_print_from_eeprom(bool)::__c>:
    8ee4:	47 31 20 46 25 64 00                                G1 F%d.

00008eeb <restore_print_from_eeprom(bool)::__c>:
    8eeb:	4d 38 32 00                                         M82.

00008eef <restore_print_from_eeprom(bool)::__c>:
    8eef:	47 39 32 20 45 25 2d 2e 33 66 00                    G92 E%-.3f.

00008efa <restore_print_from_eeprom(bool)::__c>:
    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 <restore_print_from_eeprom(bool)::__c>:
    8f14:	47 31 20 5a 25 2d 2e 33 66 00                       G1 Z%-.3f.

00008f1e <restore_print_from_eeprom(bool)::__c>:
    8f1e:	50 52 55 53 41 20 4d 42 4c 20 56 31 00              PRUSA MBL V1.

00008f2b <restore_print_from_eeprom(bool)::__c>:
    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 <restore_print_from_eeprom(bool)::__c>:
    8f42:	2c 20 66 65 65 64 6d 75 6c 74 69 70 6c 79 3a 00     , feedmultiply:.

00008f52 <restore_print_from_eeprom(bool)::__c>:
    8f52:	46 65 65 64 72 61 74 65 3a 00                       Feedrate:.

00008f5c <recover_print(unsigned char)::__c>:
    8f5c:	47 31 20 45 35 20 46 31 32 30 00                    G1 E5 F120.

00008f67 <recover_print(unsigned char)::__c>:
    8f67:	4d 31 30 39 20 53 25 64 00                          M109 S%d.

00008f70 <recover_print(unsigned char)::__c>:
    8f70:	4d 31 34 30 20 53 25 64 00                          M140 S%d.

00008f79 <recover_print(unsigned char)::__c>:
    8f79:	4d 31 30 34 20 53 25 64 00                          M104 S%d.

00008f82 <recover_print(unsigned char)::__c>:
    8f82:	47 32 38 20 58 20 59 00                             G28 X Y.

00008f8a <recover_print(unsigned char)::__c>:
    8f8a:	47 31 20 5a 25 2e 33 66 20 46 38 30 30 00           G1 Z%.3f F800.

00008f98 <crctab>:
    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 <SdBaseFile::make83Name(char const*, unsigned char*, char const**)::__c>:
    9198:	7c 3c 3e 3f 2f 2a 22 5c 00                          |<>?/*"\.

000091a1 <speed_lookuptable_slow>:
    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 <speed_lookuptable_fast>:
    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 <PID_autotune(float, int, int)::__c>:
    9a54:	20 4b 69 3a 20 00                                    Ki: .

00009a5a <PID_autotune(float, int, int)::__c>:
    9a5a:	20 4b 70 3a 20 00                                    Kp: .

00009a60 <PID_autotune(float, int, int)::__c>:
    9a60:	20 43 6c 61 73 73 69 63 20 50 49 44 20 00            Classic PID .

00009a6e <PID_autotune(float, int, int)::__c>:
    9a6e:	20 54 75 3a 20 00                                    Tu: .

00009a74 <PID_autotune(float, int, int)::__c>:
    9a74:	20 4b 75 3a 20 00                                    Ku: .

00009a7a <PID_autotune(float, int, int)::__c>:
    9a7a:	20 6d 61 78 3a 20 00                                 max: .

00009a81 <PID_autotune(float, int, int)::__c>:
    9a81:	20 6d 69 6e 3a 20 00                                 min: .

00009a88 <PID_autotune(float, int, int)::__c>:
    9a88:	20 64 3a 20 00                                       d: .

00009a8d <PID_autotune(float, int, int)::__c>:
    9a8d:	20 62 69 61 73 3a 20 00                              bias: .

00009a95 <PID_autotune(float, int, int)::__c>:
    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 <PID_autotune(float, int, int)::__c>:
    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 <thermal_model::log_usr()::__c>:
    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 <min_temp_error(unsigned char)::err>:
    9ae8:	4d 49 4e 54 45 4d 50 00                             MINTEMP.

00009af0 <bed_min_temp_error()::err>:
    9af0:	4d 49 4e 54 45 4d 50 20 42 45 44 00                 MINTEMP BED.

00009afc <ambient_min_temp_error()::__c>:
    9afc:	4d 49 4e 54 45 4d 50 20 41 4d 42 00                 MINTEMP AMB.

00009b08 <max_temp_error(unsigned char)::__c>:
    9b08:	4d 41 58 54 45 4d 50 00                             MAXTEMP.

00009b10 <bed_max_temp_error()::__c>:
    9b10:	4d 41 58 54 45 4d 50 20 42 45 44 00                 MAXTEMP BED.

00009b1c <ambient_max_temp_error()::__c>:
    9b1c:	4d 41 58 54 45 4d 50 20 41 4d 42 00                 MAXTEMP AMB.

00009b28 <handle_temp_error()::__c>:
    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 <handle_temp_error()::__c>:
    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 <thermal_model::handle_warning()::__c>:
    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 <temptable_1>:
    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 <temptable_2000>:
    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 <temp_runaway_stop(bool, bool)::__c>:
    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 <temp_runaway_stop(bool, bool)::__c>:
    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 <temp_runaway_stop(bool, bool)::__c>:
    9d0f:	54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 00     THERMAL RUNAWAY.

00009d1f <temp_runaway_stop(bool, bool)::__c>:
    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 <temp_runaway_stop(bool, bool)::__c>:
    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 <temp_runaway_stop(bool, bool)::__c>:
    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 <temp_runaway_stop(bool, bool)::__c>:
    9d78:	50 52 45 48 45 41 54 20 45 52 52 4f 52 00           PREHEAT ERROR.

00009d86 <temp_runaway_stop(bool, bool)::__c>:
    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 <temp_error_messagepgm(char const*, unsigned char)::__c>:
    9d98:	20 74 72 69 67 67 65 72 65 64 21 00                  triggered!.

00009da4 <temp_error_messagepgm(char const*, unsigned char)::__c>:
    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 <temp_error_messagepgm(char const*, unsigned char)::__c>:
    9dbb:	3a 20 00                                            : .

00009dbe <temp_error_messagepgm(char const*, unsigned char)::__c>:
    9dbe:	45 72 72 3a 20 00                                   Err: .

00009dc4 <lcd_buttons_update()::encrot_table>:
    9dc4:	00 ff 01 02 01 00 02 ff ff fe 00 01 fe 01 ff 00     ................

00009dd4 <alert_automaton_mintemp::step(float, float)::m1>:
    9dd4:	50 6c 65 61 73 65 20 72 65 73 74 61 72 74 00        Please restart.

00009de3 <thermal_model_set_enabled(bool)::__c>:
    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 <thermal_model_report_settings()::__c>:
    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 <thermal_model_report_settings()::__c>:
    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 <thermal_model_report_settings()::__c>:
    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 <THERMAL_MODEL_R_DEFAULT>:
    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 <eMotorCurrentScalingEnabled>:
    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 <homing_currents_P>:
    9edb:	01 08 08 01 0a 0a 01 14 14 01 12 12                 ............

00009ee7 <tmc2130_home_enter(unsigned char)::__c>:
    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 <tmc2130_home_exit()::__c>:
    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 <tmc2130_home_calibrate(unsigned char)::__c>:
    9f43:	72 65 73 75 6c 74 20 76 61 6c 75 65 3a 20 25 64     result value: %d
    9f53:	0a 00                                               ..

00009f55 <tmc2130_home_calibrate(unsigned char)::__c>:
    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 <tmc2130_home_calibrate(unsigned char)::__c>:
    9f6d:	63 6c 75 73 74 65 72 73 3a 00                       clusters:.

00009f77 <tmc2130_home_calibrate(unsigned char)::__c>:
    9f77:	20 69 3d 25 32 64 20 73 74 65 70 3d 25 32 64 0a      i=%2d step=%2d.
	...

00009f88 <tmc2130_home_calibrate(unsigned char)::__c>:
    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 <lcdui_print_status_line()::__c>:
    9faa:	3a 20 00                                            : .

00009fad <lcdui_print_status_line()::__c>:
    9fad:	25 2d 31 32 2e 31 32 53 25 2d 64 2f 36 00           %-12.12S%-d/6.

00009fbb <lcdui_print_status_line()::__c>:
    9fbb:	25 33 64 2f 25 2d 33 64 00                          %3d/%-3d.

00009fc4 <lcdui_print_status_line()::__c>:
    9fc4:	20 3a 20 00                                          : .

00009fc8 <lcdui_print_percent_done()::__c>:
    9fc8:	25 33 53 00                                         %3S.

00009fcc <lcdui_print_percent_done()::__c>:
    9fcc:	25 2d 37 73 00                                      %-7s.

00009fd1 <lcd_menu_extruder_info()::__c>:
    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 <lcd_menu_fails_stats_mmu_print()::__c>:
    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 <lcd_menu_fails_stats_mmu_total()::__c>:
    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 <failStatsFmt>:
    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 <lcd_menu_temperatures_line(char const*, int)::__c>:
    a06d:	20 25 73 25 33 64 81 20 0a 00                        %s%3d. ..

0000a077 <lcd_menu_voltages()::__c>:
    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 <lcd_menu_belt_status()::__c>:
    a09b:	25 53 0a 20 58 20 25 64 0a 20 59 20 25 64 00        %S. X %d. Y %d.

0000a0aa <ip4_to_str(char*, unsigned char*)::__c>:
    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 <lcd_support_menu()::__c>:
    a0e9:	32 30 32 35 2d 30 34 2d 32 32 00                    2025-04-22.

0000a0f4 <lcd_support_menu()::__c>:
    a0f4:	45 33 44 76 36 66 75 6c 6c 00                       E3Dv6full.

0000a0fe <lcd_support_menu()::__c>:
    a0fe:	45 49 4e 53 79 5f 31 30 61 00                       EINSy_10a.

0000a108 <lcd_support_menu()::__c>:
    a108:	31 5f 37 35 6d 6d 5f 4d 4b 33 00                    1_75mm_MK3.

0000a113 <lcd_support_menu()::__c>:
    a113:	20 48 61 73 68 3a 37 37 33 31 30 32 34 65 64 00      Hash:7731024ed.

0000a123 <lcd_support_menu()::__c>:
    a123:	20 52 65 70 6f 3a 70 72 75 73 61 33 64 00            Repo:prusa3d.

0000a131 <lcd_support_menu()::__c>:
    a131:	20 33 2e 31 34 2e 31 2d 38 32 37 39 00               3.14.1-8279.

0000a13e <lcd_support_menu()::__c>:
    a13e:	46 69 72 6d 77 61 72 65 3a 00                       Firmware:.

0000a148 <mFilamentItem(unsigned int, unsigned int)::__c>:
    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 <lcd_generic_preheat_menu()::__c>:
    a1e3:	50 56 42 20 20 2d 20 20 32 31 35 00                 PVB  -  215.

0000a1ef <lcd_generic_preheat_menu()::__c>:
    a1ef:	50 43 20 20 20 2d 20 20 32 37 35 2f 31 31 30 00     PC   -  275/110.

0000a1ff <lcd_generic_preheat_menu()::__c>:
    a1ff:	50 43 20 20 20 2d 20 20 32 37 35 00                 PC   -  275.

0000a20b <lcd_generic_preheat_menu()::__c>:
    a20b:	41 53 41 20 20 2d 20 20 32 36 30 2f 31 30 35 00     ASA  -  260/105.

0000a21b <lcd_generic_preheat_menu()::__c>:
    a21b:	41 53 41 20 20 2d 20 20 32 36 30 00                 ASA  -  260.

0000a227 <lcd_generic_preheat_menu()::__c>:
    a227:	50 45 54 20 20 2d 20 20 32 33 30 2f 38 35 00        PET  -  230/85.

0000a236 <lcd_generic_preheat_menu()::__c>:
    a236:	50 45 54 20 20 2d 20 20 32 33 30 00                 PET  -  230.

0000a242 <lcd_generic_preheat_menu()::__c>:
    a242:	50 4c 41 20 20 2d 20 20 32 31 35 2f 36 30 00        PLA  -  215/60.

0000a251 <lcd_generic_preheat_menu()::__c>:
    a251:	50 4c 41 20 20 2d 20 20 32 31 35 00                 PLA  -  215.

0000a25d <menu_fmt_float31>:
    a25d:	25 2d 31 32 2e 31 32 53 25 2b 38 2e 31 66 00        %-12.12S%+8.1f.

0000a26c <lcd_move_e()::__c>:
    a26c:	45 78 74 72 75 64 65 72 3a 00                       Extruder:.

0000a276 <lcd_menu_xyz_offset()::__c>:
    a276:	25 63 25 31 37 2e 32 66 6d 6d 00                    %c%17.2fmm.

0000a281 <lcd_move_x()::__c>:
    a281:	58 3a 00                                            X:.

0000a284 <lcd_move_y()::__c>:
    a284:	59 3a 00                                            Y:.

0000a287 <lcd_move_z()::__c>:
    a287:	5a 3a 00                                            Z:.

0000a28a <menu_fmt_float13>:
    a28a:	25 63 25 2d 31 33 2e 31 33 53 25 2b 35 2e 33 66     %c%-13.13S%+5.3f
	...

0000a29b <pid_extruder()::__c>:
    a29b:	25 33 75 00                                         %3u.

0000a29f <lcd_temp_cal_show_result(bool)::__c>:
    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 <lcd_temp_cal_show_result(bool)::__c>:
    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 <temptable_5>:
    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 <xyzcal_measure_enter()::__c>:
    a393:	4d 65 61 73 75 72 65 20 63 65 6e 74 65 72 20 20     Measure center  
	...

0000a3a4 <xyzcal_measure_enter()::__c>:
    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 <xyzcal_spiral8(int, int, int, int, int, unsigned int, signed char, unsigned int*)::__c>:
    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 <xyzcal_searchZ()::__c>:
    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 <xyzcal_searchZ()::__c>:
    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 <xyzcal_searchZ()::__c>:
    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 <print_image(unsigned char const*)::__c>:
    a465:	25 30 32 78 00                                      %02x.

0000a46a <xyzcal_scan_and_process()::__c>:
    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 <xyzcal_scan_and_process()::__c>:
    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 <xyzcal_point_pattern_10>:
    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 <xyzcal_point_pattern_08>:
    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 <xyzcal_measure_leave()::__c>:
    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 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    a4e8:	20 3c 20 00                                          < .

0000a4ec <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    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 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
	...

0000a51f <bed_ref_points_4>:
    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 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    a53f:	25 64 2f 34 00                                      %d/4.

0000a544 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    a544:	49 74 65 72 61 74 69 6f 6e 3a 20 00                 Iteration: .

0000a550 <gcode_M45(bool, signed char)::__c>:
    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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*)::__c>:
    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 <endl>:
    a5ba:	0a 00                                               ..

0000a5bc <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*)::__c>:
    a5bc:	43 6f 75 6e 74 64 6f 77 6e 3a 20 25 64 20 00        Countdown: %d .

0000a5cb <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*)::__c>:
    a5cb:	25 64 0a 00                                         %d..

0000a5cf <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*)::__c>:
    a5cf:	53 63 61 6e 20 63 6f 75 6e 74 64 6f 77 6e 3a 20     Scan countdown: 
	...

0000a5e0 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*)::__c>:
    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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char)::__c>:
    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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int)::__c>:
    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 <MMU2::MMU2::manage_response(bool, bool)::__c>:
    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 <MMU2::MMU2::manage_response(bool, bool)::__c>:
    a6f9:	48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 00     Heater cooldown.

0000a709 <MMU2::MMU2::manage_response(bool, bool)::__c>:
    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 <MMU2::MMU2::SaveAndPark(bool)::__c>:
    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 <MMU2::MMU2::SaveHotendTemp(bool)::__c>:
    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 <MMU2::MMU2::ResumeUnpark()::__c>:
    a74c:	52 65 73 75 6d 69 6e 67 20 58 59 5a 00              Resuming XYZ.

0000a759 <MMU2::MMU2::SetCurrentTool(unsigned char)::__c>:
    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 <ofWritingToFile>:
    a769:	57 72 69 74 69 6e 67 20 74 6f 20 66 69 6c 65 3a     Writing to file:
    a779:	20 00                                                .

0000a77b <CardReader::openFileWrite(char const*)::__c>:
    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 <MMU2::progressTexts>:
    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 <MMU2::MMU2::CheckFINDARunout()::__c>:
    a7c9:	4d 36 30 30 20 41 55 54 4f 00                       M600 AUTO.

0000a7d3 <MMU2::MMU2::CheckFINDARunout()::__c>:
    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 <MMU2::ProtocolLogic::HandleCommunicationTimeout()::__c>:
    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 <MMU2::ProtocolLogic::HandleProtocolError()::__c>:
    a800:	50 72 6f 74 6f 63 6f 6c 20 45 72 72 6f 72 00        Protocol Error.

0000a80f <MMU2::supportedMmuFWVersion>:
    a80f:	03 00 03                                            ...

0000a812 <MMU2::ProtocolLogic::Step()::__c>:
    a812:	56 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68     Version mismatch
	...

0000a823 <MMU2::ProtocolLogic::Step()::__c>:
    a823:	43 6f 6d 6d 61 6e 64 20 45 72 72 6f 72 00           Command Error.

0000a831 <MMU2::ProtocolLogic::Step()::__c>:
    a831:	43 6f 6d 6d 61 6e 64 20 72 65 6a 65 63 74 65 64     Command rejected
	...

0000a842 <MMU2::MMU2::LogicStep(bool)::__c>:
    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 <MMU2::MMU2::RetryIfPossible(ErrorCode)::__c>:
    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     <U%U.U.T.T.T.T.T
    a887:	d2 54 d2 54 bf 54 bf 54 bf 54 ac 54 ac 54 ac 54     .T.T.T.T.T.T.T.T
    a897:	95 54 95 54 95 54 80 54 80 54 80 54 6a 54 6a 54     .T.T.T.T.T.TjTjT
    a8a7:	6a 54 5a 54 45 54 2f 54 19 54 0a 54 fd 53 e6 53     jTZTET/T.T.T.S.S
    a8b7:	d3 53 c1 53 ae 53 9c 53 8c 53                       .S.S.S.S.S

0000a8c1 <MMU2::MMU2::Button(unsigned char)::__c>:
    a8c1:	42 75 74 74 6f 6e 00                                Button.

0000a8c8 <MMU2::MMU2::CheckUserInput()::__c>:
    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 <MMU2::MMU2::ResumeHotendTemp()::__c>:
    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 <MMU2::MMU2::ResumeHotendTemp()::__c>:
    a90f:	52 65 73 75 6d 69 6e 67 20 54 65 6d 70 00           Resuming Temp.

0000a91d <MMU2::MMU2::ResumeHotendTemp()::__c>:
    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 <wait_for_heater(long, unsigned char)::__c>:
    a933:	20 57 3a 00                                          W:.

0000a937 <wait_for_heater(long, unsigned char)::__c>:
    a937:	20 45 3a 00                                          E:.

0000a93b <wait_for_heater(long, unsigned char)::__c>:
    a93b:	54 3a 00                                            T:.

0000a93e <Sd2Card::init(unsigned char)::__c>:
    a93e:	4e 6f 20 30 78 46 46 20 72 65 63 65 69 76 65 64     No 0xFF received
	...

0000a94f <Sd2Card::init(unsigned char)::__c>:
    a94f:	53 65 6e 64 69 6e 67 20 30 78 46 46 00              Sending 0xFF.

0000a95c <ofFileSelected>:
    a95c:	46 69 6c 65 20 73 65 6c 65 63 74 65 64 00           File selected.

0000a96a <ofSize>:
    a96a:	20 53 69 7a 65 3a 20 00                              Size: .

0000a972 <ofFileOpened>:
    a972:	46 69 6c 65 20 6f 70 65 6e 65 64 3a 20 00           File opened: .

0000a980 <ofNowFreshFile>:
    a980:	4e 6f 77 20 66 72 65 73 68 20 66 69 6c 65 3a 20     Now fresh file: 
	...

0000a991 <ofNowDoingFile>:
    a991:	4e 6f 77 20 64 6f 69 6e 67 20 66 69 6c 65 3a 20     Now doing file: 
	...

0000a9a2 <ofPos>:
    a9a2:	22 20 70 6f 73 00                                   " pos.

0000a9a8 <ofParent>:
    a9a8:	22 20 70 61 72 65 6e 74 3a 22 00                    " parent:".

0000a9b3 <ofSubroutineCallTgt>:
    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 <ofKill>:
    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 <pat9125_init_bank1>:
    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 <pat9125_init_bank0>:
    aa34:	09 5a 0d 00 0e f0 19 14 5e 08 20 64 2b 6d 32 2f     .Z......^. d+m2/
    aa44:	ff                                                  .

0000aa45 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    aa45:	20 22 25 73 22 00                                    "%s".

0000aa4b <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    aa4b:	20 25 23 6c 78 00                                    %#lx.

0000aa51 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    aa51:	44 49 52 5f 45 58 49 54 00                          DIR_EXIT.

0000aa5a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    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 <CardReader::checkautostart(bool)::__c>:
    aa6e:	61 75 74 6f 25 69 2e 67 00                          auto%i.g.

0000aa77 <MMU2::ProtocolLogic::regs16Addrs>:
    aa77:	04 1a                                               ..

0000aa79 <MMU2::ProtocolLogic::DecrementRetryAttempts()::__c>:
    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 <MMU2::ProtocolLogic::regs8Addrs>:
    aa90:	08 1b 1c                                            ...

0000aa93 <MMU2::ProtocolLogic::initRegs8Addrs>:
    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 <MMU2::ProtocolLogic::LogError(char const*)::__c>:
    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 <errormagic>:
    aaca:	45 72 72 6f 72 3a 00                                Error:.

0000aad1 <enquecommand_front(char const*, bool)::__c>:
    aad1:	22 00                                               ".

0000aad3 <enqueingFront>:
    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 <echomagic>:
    aaf2:	65 63 68 6f 3a 00                                   echo:.

0000aaf8 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char)::__c>:
    aaf8:	3e 53 30 2a 63 36 2e 00                             >S0*c6..

0000ab00 <MMU2::MMU2::Status()::__c>:
    ab00:	4d 4d 55 20 69 73 20 00                             MMU is .

0000ab08 <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)::__c>:
    ab08:	25 2e 31 30 53 20 00                                %.10S .

0000ab0f <menu_draw_P(char, char const*, int)::__c>:
    ab0f:	25 34 64 00                                         %4d.

0000ab13 <sample_mesh_and_store_reference()::__c>:
    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 <sample_mesh_and_store_reference()::__c>:
    ab30:	25 64 2f 39 00                                      %d/9.

0000ab35 <mmu2Magic>:
    ab35:	4d 4d 55 32 3a 00                                   MMU2:.

0000ab3b <MMU2::ReportErrorHookDynamicRender()::__c>:
    ab3b:	25 33 64 00                                         %3d.

0000ab3f <MMU2::TuneItems>:
    ab3f:	18 01 04 19 02 0a                                   ......

0000ab45 <MMU2::errorDescs>:
    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 <MMU2::errorButtons>:
    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 <MMU2::errorCodes>:
    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 <MMU2::btnOperation>:
    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 <MMU2::ReportErrorHookStaticRender(unsigned char)::__c>:
    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 <optiboot_xflash_enter()::__c>:
    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 <entry_magic_cfm>:
    ac73:	77 32 35 78 32 30 63 6c 5f 63 66 6d 0a 00           w25x20cl_cfm..

0000ac81 <entry_magic_receive>:
    ac81:	77 32 35 78 32 30 63 6c 5f 65 6e 74 65 72 0a 00     w25x20cl_enter..

0000ac91 <entry_magic_send>:
    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 <main>
    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 <vfprintf>:
    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 <vfprintf+0x1f2>
    ad50:	8f ef       	ldi	r24, 0xFF	; 255
    ad52:	9f ef       	ldi	r25, 0xFF	; 255
    ad54:	ee c2       	rjmp	.+1500   	; 0xb332 <vfprintf+0x630>
    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 <vfprintf+0x6c>
    ad60:	8b 32       	cpi	r24, 0x2B	; 43
    ad62:	09 f1       	breq	.+66     	; 0xada6 <vfprintf+0xa4>
    ad64:	90 f4       	brcc	.+36     	; 0xad8a <vfprintf+0x88>
    ad66:	80 32       	cpi	r24, 0x20	; 32
    ad68:	f9 f0       	breq	.+62     	; 0xada8 <vfprintf+0xa6>
    ad6a:	83 32       	cpi	r24, 0x23	; 35
    ad6c:	09 f1       	breq	.+66     	; 0xadb0 <vfprintf+0xae>
    ad6e:	07 fd       	sbrc	r16, 7
    ad70:	34 c0       	rjmp	.+104    	; 0xadda <vfprintf+0xd8>
    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 <vfprintf+0xc0>
    ad7a:	06 ff       	sbrs	r16, 6
    ad7c:	1b c0       	rjmp	.+54     	; 0xadb4 <vfprintf+0xb2>
    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 <vfprintf+0x92>
    ad8a:	8d 32       	cpi	r24, 0x2D	; 45
    ad8c:	79 f0       	breq	.+30     	; 0xadac <vfprintf+0xaa>
    ad8e:	80 33       	cpi	r24, 0x30	; 48
    ad90:	71 f7       	brne	.-36     	; 0xad6e <vfprintf+0x6c>
    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 <vfprintf+0x5a>
    ada4:	1a c0       	rjmp	.+52     	; 0xadda <vfprintf+0xd8>
    ada6:	02 60       	ori	r16, 0x02	; 2
    ada8:	04 60       	ori	r16, 0x04	; 4
    adaa:	f4 cf       	rjmp	.-24     	; 0xad94 <vfprintf+0x92>
    adac:	08 60       	ori	r16, 0x08	; 8
    adae:	f2 cf       	rjmp	.-28     	; 0xad94 <vfprintf+0x92>
    adb0:	00 61       	ori	r16, 0x10	; 16
    adb2:	f0 cf       	rjmp	.-32     	; 0xad94 <vfprintf+0x92>
    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 <vfprintf+0x92>
    adc2:	8e 32       	cpi	r24, 0x2E	; 46
    adc4:	21 f4       	brne	.+8      	; 0xadce <vfprintf+0xcc>
    adc6:	06 fd       	sbrc	r16, 6
    adc8:	b1 c2       	rjmp	.+1378   	; 0xb32c <vfprintf+0x62a>
    adca:	00 64       	ori	r16, 0x40	; 64
    adcc:	e3 cf       	rjmp	.-58     	; 0xad94 <vfprintf+0x92>
    adce:	8c 36       	cpi	r24, 0x6C	; 108
    add0:	11 f4       	brne	.+4      	; 0xadd6 <vfprintf+0xd4>
    add2:	00 68       	ori	r16, 0x80	; 128
    add4:	df cf       	rjmp	.-66     	; 0xad94 <vfprintf+0x92>
    add6:	88 36       	cpi	r24, 0x68	; 104
    add8:	e9 f2       	breq	.-70     	; 0xad94 <vfprintf+0x92>
    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 <vfprintf+0xe2>
    ade2:	5f c0       	rjmp	.+190    	; 0xaea2 <vfprintf+0x1a0>
    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 <vfprintf+0xee>
    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 <vfprintf+0xf8>
    adf8:	5b c0       	rjmp	.+182    	; 0xaeb0 <vfprintf+0x1ae>
    adfa:	10 64       	ori	r17, 0x40	; 64
    adfc:	17 ff       	sbrs	r17, 7
    adfe:	61 c0       	rjmp	.+194    	; 0xaec2 <vfprintf+0x1c0>
    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 <vfprintf+0x108>
    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 <vfprintf+0x13a>
    ae36:	0d e2       	ldi	r16, 0x2D	; 45
    ae38:	f3 ff       	sbrs	r31, 3
    ae3a:	07 c0       	rjmp	.+14     	; 0xae4a <vfprintf+0x148>
    ae3c:	0b e2       	ldi	r16, 0x2B	; 43
    ae3e:	11 fd       	sbrc	r17, 1
    ae40:	04 c0       	rjmp	.+8      	; 0xae4a <vfprintf+0x148>
    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 <vfprintf+0x152>
    ae52:	6b c0       	rjmp	.+214    	; 0xaf2a <vfprintf+0x228>
    ae54:	01 11       	cpse	r16, r1
    ae56:	d8 c2       	rjmp	.+1456   	; 0xb408 <vfprintf+0x706>
    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 <vfprintf+0x186>
    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 <vfprintf+0x178>
    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 <fputc>
    ae74:	ea 94       	dec	r14
    ae76:	e1 10       	cpse	r14, r1
    ae78:	f8 cf       	rjmp	.-16     	; 0xae6a <vfprintf+0x168>
    ae7a:	00 23       	and	r16, r16
    ae7c:	29 f0       	breq	.+10     	; 0xae88 <vfprintf+0x186>
    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 <fputc>
    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 <vfprintf+0x19c>
    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 <vfprintf+0x1e4>
    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 <vfprintf+0x1aa>
    aeaa:	47 c1       	rjmp	.+654    	; 0xb13a <vfprintf+0x438>
    aeac:	0f 7e       	andi	r16, 0xEF	; 239
    aeae:	9c cf       	rjmp	.-200    	; 0xade8 <vfprintf+0xe6>
    aeb0:	86 36       	cpi	r24, 0x66	; 102
    aeb2:	11 f4       	brne	.+4      	; 0xaeb8 <vfprintf+0x1b6>
    aeb4:	10 68       	ori	r17, 0x80	; 128
    aeb6:	a2 cf       	rjmp	.-188    	; 0xadfc <vfprintf+0xfa>
    aeb8:	ff 20       	and	r15, r15
    aeba:	09 f4       	brne	.+2      	; 0xaebe <vfprintf+0x1bc>
    aebc:	9f cf       	rjmp	.-194    	; 0xadfc <vfprintf+0xfa>
    aebe:	fa 94       	dec	r15
    aec0:	9d cf       	rjmp	.-198    	; 0xadfc <vfprintf+0xfa>
    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 <vfprintf+0x1ce>
    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 <vfprintf+0x110>
    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 <fputc>
    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 <vfprintf+0x1d2>
    aeee:	e1 10       	cpse	r14, r1
    aef0:	84 c2       	rjmp	.+1288   	; 0xb3fa <vfprintf+0x6f8>
    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 <vfprintf+0x208>
    af08:	11 c2       	rjmp	.+1058   	; 0xb32c <vfprintf+0x62a>
    af0a:	85 32       	cpi	r24, 0x25	; 37
    af0c:	41 f4       	brne	.+16     	; 0xaf1e <vfprintf+0x21c>
    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 <vfprintf+0x21c>
    af1c:	1c cf       	rjmp	.-456    	; 0xad56 <vfprintf+0x54>
    af1e:	b6 01       	movw	r22, r12
    af20:	90 e0       	ldi	r25, 0x00	; 0
    af22:	0f 94 78 da 	call	0x3b4f0	; 0x3b4f0 <fputc>
    af26:	35 01       	movw	r6, r10
    af28:	e4 cf       	rjmp	.-56     	; 0xaef2 <vfprintf+0x1f0>
    af2a:	17 ff       	sbrs	r17, 7
    af2c:	6f c0       	rjmp	.+222    	; 0xb00c <vfprintf+0x30a>
    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 <vfprintf+0x23c>
    af36:	8a 81       	ldd	r24, Y+2	; 0x02
    af38:	81 33       	cpi	r24, 0x31	; 49
    af3a:	09 f4       	brne	.+2      	; 0xaf3e <vfprintf+0x23c>
    af3c:	4a 94       	dec	r4
    af3e:	14 14       	cp	r1, r4
    af40:	0c f0       	brlt	.+2      	; 0xaf44 <vfprintf+0x242>
    af42:	86 c0       	rjmp	.+268    	; 0xb050 <vfprintf+0x34e>
    af44:	28 e0       	ldi	r18, 0x08	; 8
    af46:	24 15       	cp	r18, r4
    af48:	10 f4       	brcc	.+4      	; 0xaf4e <vfprintf+0x24c>
    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 <vfprintf+0x260>
    af56:	c5 01       	movw	r24, r10
    af58:	b7 fe       	sbrs	r11, 7
    af5a:	02 c0       	rjmp	.+4      	; 0xaf60 <vfprintf+0x25e>
    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 <vfprintf+0x274>
    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 <vfprintf+0x280>
    af7c:	14 f0       	brlt	.+4      	; 0xaf82 <vfprintf+0x280>
    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 <vfprintf+0x28a>
    af88:	e1 10       	cpse	r14, r1
    af8a:	67 c0       	rjmp	.+206    	; 0xb05a <vfprintf+0x358>
    af8c:	00 23       	and	r16, r16
    af8e:	29 f0       	breq	.+10     	; 0xaf9a <vfprintf+0x298>
    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 <fputc>
    af9a:	13 fd       	sbrc	r17, 3
    af9c:	02 c0       	rjmp	.+4      	; 0xafa2 <vfprintf+0x2a0>
    af9e:	e1 10       	cpse	r14, r1
    afa0:	63 c0       	rjmp	.+198    	; 0xb068 <vfprintf+0x366>
    afa2:	17 ff       	sbrs	r17, 7
    afa4:	7c c0       	rjmp	.+248    	; 0xb09e <vfprintf+0x39c>
    afa6:	85 01       	movw	r16, r10
    afa8:	b7 fe       	sbrs	r11, 7
    afaa:	02 c0       	rjmp	.+4      	; 0xafb0 <vfprintf+0x2ae>
    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 <vfprintf+0x2d6>
    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 <fputc>
    afd8:	a0 16       	cp	r10, r16
    afda:	b1 06       	cpc	r11, r17
    afdc:	0c f4       	brge	.+2      	; 0xafe0 <vfprintf+0x2de>
    afde:	4b c0       	rjmp	.+150    	; 0xb076 <vfprintf+0x374>
    afe0:	40 16       	cp	r4, r16
    afe2:	51 06       	cpc	r5, r17
    afe4:	0c f0       	brlt	.+2      	; 0xafe8 <vfprintf+0x2e6>
    afe6:	47 c0       	rjmp	.+142    	; 0xb076 <vfprintf+0x374>
    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 <vfprintf+0x378>
    b002:	b6 01       	movw	r22, r12
    b004:	90 e0       	ldi	r25, 0x00	; 0
    b006:	0f 94 78 da 	call	0x3b4f0	; 0x3b4f0 <fputc>
    b00a:	de cf       	rjmp	.-68     	; 0xafc8 <vfprintf+0x2c6>
    b00c:	16 fd       	sbrc	r17, 6
    b00e:	9f cf       	rjmp	.-194    	; 0xaf4e <vfprintf+0x24c>
    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 <vfprintf+0x324>
    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 <vfprintf+0x324>
    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 <vfprintf+0x32e>
    b02e:	fa 94       	dec	r15
    b030:	ff 20       	and	r15, r15
    b032:	19 f0       	breq	.+6      	; 0xb03a <vfprintf+0x338>
    b034:	82 91       	ld	r24, -Z
    b036:	80 33       	cpi	r24, 0x30	; 48
    b038:	d1 f3       	breq	.-12     	; 0xb02e <vfprintf+0x32c>
    b03a:	17 ff       	sbrs	r17, 7
    b03c:	88 cf       	rjmp	.-240    	; 0xaf4e <vfprintf+0x24c>
    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 <vfprintf+0x354>
    b04a:	2c f0       	brlt	.+10     	; 0xb056 <vfprintf+0x354>
    b04c:	fa 18       	sub	r15, r10
    b04e:	7f cf       	rjmp	.-258    	; 0xaf4e <vfprintf+0x24c>
    b050:	44 24       	eor	r4, r4
    b052:	43 94       	inc	r4
    b054:	7c cf       	rjmp	.-264    	; 0xaf4e <vfprintf+0x24c>
    b056:	f1 2c       	mov	r15, r1
    b058:	7a cf       	rjmp	.-268    	; 0xaf4e <vfprintf+0x24c>
    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 <fputc>
    b064:	ea 94       	dec	r14
    b066:	90 cf       	rjmp	.-224    	; 0xaf88 <vfprintf+0x286>
    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 <fputc>
    b072:	ea 94       	dec	r14
    b074:	94 cf       	rjmp	.-216    	; 0xaf9e <vfprintf+0x29c>
    b076:	80 e3       	ldi	r24, 0x30	; 48
    b078:	bd cf       	rjmp	.-134    	; 0xaff4 <vfprintf+0x2f2>
    b07a:	a0 16       	cp	r10, r16
    b07c:	b1 06       	cpc	r11, r17
    b07e:	41 f4       	brne	.+16     	; 0xb090 <vfprintf+0x38e>
    b080:	9a 81       	ldd	r25, Y+2	; 0x02
    b082:	96 33       	cpi	r25, 0x36	; 54
    b084:	50 f4       	brcc	.+20     	; 0xb09a <vfprintf+0x398>
    b086:	95 33       	cpi	r25, 0x35	; 53
    b088:	19 f4       	brne	.+6      	; 0xb090 <vfprintf+0x38e>
    b08a:	3c 85       	ldd	r19, Y+12	; 0x0c
    b08c:	34 ff       	sbrs	r19, 4
    b08e:	05 c0       	rjmp	.+10     	; 0xb09a <vfprintf+0x398>
    b090:	b6 01       	movw	r22, r12
    b092:	90 e0       	ldi	r25, 0x00	; 0
    b094:	0f 94 78 da 	call	0x3b4f0	; 0x3b4f0 <fputc>
    b098:	2a cf       	rjmp	.-428    	; 0xaeee <vfprintf+0x1ec>
    b09a:	81 e3       	ldi	r24, 0x31	; 49
    b09c:	f9 cf       	rjmp	.-14     	; 0xb090 <vfprintf+0x38e>
    b09e:	8a 81       	ldd	r24, Y+2	; 0x02
    b0a0:	81 33       	cpi	r24, 0x31	; 49
    b0a2:	19 f0       	breq	.+6      	; 0xb0aa <vfprintf+0x3a8>
    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 <fputc>
    b0b2:	ff 20       	and	r15, r15
    b0b4:	a9 f0       	breq	.+42     	; 0xb0e0 <vfprintf+0x3de>
    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 <fputc>
    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 <fputc>
    b0da:	e0 2f       	mov	r30, r16
    b0dc:	0f 11       	cpse	r16, r15
    b0de:	f3 cf       	rjmp	.-26     	; 0xb0c6 <vfprintf+0x3c4>
    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 <vfprintf+0x3ea>
    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 <fputc>
    b0f2:	b7 fc       	sbrc	r11, 7
    b0f4:	06 c0       	rjmp	.+12     	; 0xb102 <vfprintf+0x400>
    b0f6:	a1 14       	cp	r10, r1
    b0f8:	b1 04       	cpc	r11, r1
    b0fa:	c1 f4       	brne	.+48     	; 0xb12c <vfprintf+0x42a>
    b0fc:	ec 85       	ldd	r30, Y+12	; 0x0c
    b0fe:	e4 ff       	sbrs	r30, 4
    b100:	15 c0       	rjmp	.+42     	; 0xb12c <vfprintf+0x42a>
    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 <fputc>
    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 <vfprintf+0x42e>
    b11c:	b6 01       	movw	r22, r12
    b11e:	90 e0       	ldi	r25, 0x00	; 0
    b120:	0f 94 78 da 	call	0x3b4f0	; 0x3b4f0 <fputc>
    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 <vfprintf+0x392>
    b12c:	8b e2       	ldi	r24, 0x2B	; 43
    b12e:	ed cf       	rjmp	.-38     	; 0xb10a <vfprintf+0x408>
    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 <vfprintf+0x412>
    b13a:	83 36       	cpi	r24, 0x63	; 99
    b13c:	c9 f0       	breq	.+50     	; 0xb170 <vfprintf+0x46e>
    b13e:	83 37       	cpi	r24, 0x73	; 115
    b140:	71 f1       	breq	.+92     	; 0xb19e <vfprintf+0x49c>
    b142:	83 35       	cpi	r24, 0x53	; 83
    b144:	09 f0       	breq	.+2      	; 0xb148 <vfprintf+0x446>
    b146:	5b c0       	rjmp	.+182    	; 0xb1fe <vfprintf+0x4fc>
    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 <vfprintf+0x460>
    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 <strnlen_P>
    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 <vfprintf+0x488>
    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 <vfprintf+0x498>
    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 <vfprintf+0x498>
    b198:	a8 f4       	brcc	.+42     	; 0xb1c4 <vfprintf+0x4c2>
    b19a:	e5 2c       	mov	r14, r5
    b19c:	2b c0       	rjmp	.+86     	; 0xb1f4 <vfprintf+0x4f2>
    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 <vfprintf+0x4b6>
    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 <strnlen>
    b1be:	9d 87       	std	Y+13, r25	; 0x0d
    b1c0:	8c 87       	std	Y+12, r24	; 0x0c
    b1c2:	e2 cf       	rjmp	.-60     	; 0xb188 <vfprintf+0x486>
    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 <fputc>
    b1ce:	5a 94       	dec	r5
    b1d0:	de cf       	rjmp	.-68     	; 0xb18e <vfprintf+0x48c>
    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 <fputc>
    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 <vfprintf+0x4d0>
    b1fc:	78 ce       	rjmp	.-784    	; 0xaeee <vfprintf+0x1ec>
    b1fe:	84 36       	cpi	r24, 0x64	; 100
    b200:	19 f0       	breq	.+6      	; 0xb208 <vfprintf+0x506>
    b202:	89 36       	cpi	r24, 0x69	; 105
    b204:	09 f0       	breq	.+2      	; 0xb208 <vfprintf+0x506>
    b206:	74 c0       	rjmp	.+232    	; 0xb2f0 <vfprintf+0x5ee>
    b208:	35 01       	movw	r6, r10
    b20a:	07 ff       	sbrs	r16, 7
    b20c:	66 c0       	rjmp	.+204    	; 0xb2da <vfprintf+0x5d8>
    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 <vfprintf+0x534>
    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 <vfprintf+0x55e>
    b24c:	0e 7f       	andi	r16, 0xFE	; 254
    b24e:	af 14       	cp	r10, r15
    b250:	38 f4       	brcc	.+14     	; 0xb260 <vfprintf+0x55e>
    b252:	14 ff       	sbrs	r17, 4
    b254:	04 c0       	rjmp	.+8      	; 0xb25e <vfprintf+0x55c>
    b256:	12 fd       	sbrc	r17, 2
    b258:	02 c0       	rjmp	.+4      	; 0xb25e <vfprintf+0x55c>
    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 <vfprintf+0x6a8>
    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 <vfprintf+0x570>
    b270:	95 c0       	rjmp	.+298    	; 0xb39c <vfprintf+0x69a>
    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 <vfprintf+0x6c6>
    b27e:	00 ff       	sbrs	r16, 0
    b280:	9f c0       	rjmp	.+318    	; 0xb3c0 <vfprintf+0x6be>
    b282:	fa 2c       	mov	r15, r10
    b284:	b5 14       	cp	r11, r5
    b286:	10 f4       	brcc	.+4      	; 0xb28c <vfprintf+0x58a>
    b288:	f5 0c       	add	r15, r5
    b28a:	fb 18       	sub	r15, r11
    b28c:	04 ff       	sbrs	r16, 4
    b28e:	a2 c0       	rjmp	.+324    	; 0xb3d4 <vfprintf+0x6d2>
    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 <fputc>
    b29a:	02 ff       	sbrs	r16, 2
    b29c:	09 c0       	rjmp	.+18     	; 0xb2b0 <vfprintf+0x5ae>
    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 <vfprintf+0x5a8>
    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 <fputc>
    b2b0:	af 14       	cp	r10, r15
    b2b2:	08 f4       	brcc	.+2      	; 0xb2b6 <vfprintf+0x5b4>
    b2b4:	9b c0       	rjmp	.+310    	; 0xb3ec <vfprintf+0x6ea>
    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 <fputc>
    b2d2:	80 16       	cp	r8, r16
    b2d4:	91 06       	cpc	r9, r17
    b2d6:	b1 f7       	brne	.-20     	; 0xb2c4 <vfprintf+0x5c2>
    b2d8:	0a ce       	rjmp	.-1004   	; 0xaeee <vfprintf+0x1ec>
    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 <vfprintf+0x51c>
    b2f0:	10 2f       	mov	r17, r16
    b2f2:	85 37       	cpi	r24, 0x75	; 117
    b2f4:	a9 f4       	brne	.+42     	; 0xb320 <vfprintf+0x61e>
    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 <vfprintf+0x688>
    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 <vfprintf+0x542>
    b320:	19 7f       	andi	r17, 0xF9	; 249
    b322:	8f 36       	cpi	r24, 0x6F	; 111
    b324:	79 f1       	breq	.+94     	; 0xb384 <vfprintf+0x682>
    b326:	f0 f4       	brcc	.+60     	; 0xb364 <vfprintf+0x662>
    b328:	88 35       	cpi	r24, 0x58	; 88
    b32a:	39 f1       	breq	.+78     	; 0xb37a <vfprintf+0x678>
    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 <vfprintf+0x674>
    b368:	88 37       	cpi	r24, 0x78	; 120
    b36a:	01 f7       	brne	.-64     	; 0xb32c <vfprintf+0x62a>
    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 <vfprintf+0x5fa>
    b376:	10 61       	ori	r17, 0x10	; 16
    b378:	f9 cf       	rjmp	.-14     	; 0xb36c <vfprintf+0x66a>
    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 <vfprintf+0x5fa>
    b384:	28 e0       	ldi	r18, 0x08	; 8
    b386:	30 e0       	ldi	r19, 0x00	; 0
    b388:	b9 cf       	rjmp	.-142    	; 0xb2fc <vfprintf+0x5fa>
    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 <vfprintf+0x610>
    b39c:	02 fd       	sbrc	r16, 2
    b39e:	02 c0       	rjmp	.+4      	; 0xb3a4 <vfprintf+0x6a2>
    b3a0:	b3 94       	inc	r11
    b3a2:	68 cf       	rjmp	.-304    	; 0xb274 <vfprintf+0x572>
    b3a4:	b3 94       	inc	r11
    b3a6:	b3 94       	inc	r11
    b3a8:	65 cf       	rjmp	.-310    	; 0xb274 <vfprintf+0x572>
    b3aa:	80 2f       	mov	r24, r16
    b3ac:	86 78       	andi	r24, 0x86	; 134
    b3ae:	09 f4       	brne	.+2      	; 0xb3b2 <vfprintf+0x6b0>
    b3b0:	61 cf       	rjmp	.-318    	; 0xb274 <vfprintf+0x572>
    b3b2:	f6 cf       	rjmp	.-20     	; 0xb3a0 <vfprintf+0x69e>
    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 <fputc>
    b3be:	b3 94       	inc	r11
    b3c0:	b5 14       	cp	r11, r5
    b3c2:	c0 f3       	brcs	.-16     	; 0xb3b4 <vfprintf+0x6b2>
    b3c4:	e1 2c       	mov	r14, r1
    b3c6:	62 cf       	rjmp	.-316    	; 0xb28c <vfprintf+0x58a>
    b3c8:	e5 2c       	mov	r14, r5
    b3ca:	eb 18       	sub	r14, r11
    b3cc:	b5 14       	cp	r11, r5
    b3ce:	08 f4       	brcc	.+2      	; 0xb3d2 <vfprintf+0x6d0>
    b3d0:	5d cf       	rjmp	.-326    	; 0xb28c <vfprintf+0x58a>
    b3d2:	f8 cf       	rjmp	.-16     	; 0xb3c4 <vfprintf+0x6c2>
    b3d4:	80 2f       	mov	r24, r16
    b3d6:	86 78       	andi	r24, 0x86	; 134
    b3d8:	09 f4       	brne	.+2      	; 0xb3dc <vfprintf+0x6da>
    b3da:	6a cf       	rjmp	.-300    	; 0xb2b0 <vfprintf+0x5ae>
    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 <vfprintf+0x5aa>
    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 <fputc>
    b3f6:	fa 94       	dec	r15
    b3f8:	5b cf       	rjmp	.-330    	; 0xb2b0 <vfprintf+0x5ae>
    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 <fputc>
    b404:	ea 94       	dec	r14
    b406:	73 cd       	rjmp	.-1306   	; 0xaeee <vfprintf+0x1ec>
    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 <vfprintf+0x710>
    b410:	36 cd       	rjmp	.-1428   	; 0xae7e <vfprintf+0x17c>
    b412:	84 e0       	ldi	r24, 0x04	; 4
    b414:	26 cd       	rjmp	.-1460   	; 0xae62 <vfprintf+0x160>

0000b416 <restore_interrupted_gcode()>:

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 <saved_start_position>
    b422:	70 91 84 02 	lds	r23, 0x0284	; 0x800284 <saved_start_position+0x1>
    b426:	80 91 85 02 	lds	r24, 0x0285	; 0x800285 <saved_start_position+0x2>
    b42a:	90 91 86 02 	lds	r25, 0x0286	; 0x800286 <saved_start_position+0x3>
    b42e:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
    b432:	88 23       	and	r24, r24
    b434:	21 f1       	breq	.+72     	; 0xb47e <restore_interrupted_gcode()+0x68>
        (saved_start_position[0] != SAVED_START_POSITION_UNSET) && (
            (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) ||
    b436:	e0 91 91 12 	lds	r30, 0x1291	; 0x801291 <bufindr>
    b43a:	f0 91 92 12 	lds	r31, 0x1292	; 0x801292 <bufindr+0x1>
    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 <restore_interrupted_gcode()+0x68>
            (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 <restore_interrupted_gcode()+0x3e>
        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 <saved_start_position>
    b468:	90 93 84 02 	sts	0x0284, r25	; 0x800284 <saved_start_position+0x1>
    b46c:	a0 93 85 02 	sts	0x0285, r26	; 0x800285 <saved_start_position+0x2>
    b470:	b0 93 86 02 	sts	0x0286, r27	; 0x800286 <saved_start_position+0x3>
        return saved_segment_idx;
    b474:	80 91 68 05 	lds	r24, 0x0568	; 0x800568 <saved_segment_idx>
    b478:	90 91 69 05 	lds	r25, 0x0569	; 0x800569 <saved_segment_idx+0x1>
    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 <axis_is_at_home(unsigned char)>:
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 <set_current_to_destination()>:
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 <set_current_to_destination()+0xa>
    b540:	08 95       	ret

0000b542 <lcd_get_row_offset(unsigned char)>:
/// @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 <lcd_get_row_offset(unsigned char)+0x10>
    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 <cmdqueue_calc_sd_length()>:
  #endif //SDSUPPORT
}

uint16_t cmdqueue_calc_sd_length()
{
    if (buflen == 0)
    b556:	40 91 a2 10 	lds	r20, 0x10A2	; 0x8010a2 <buflen>
    b55a:	50 91 a3 10 	lds	r21, 0x10A3	; 0x8010a3 <buflen+0x1>
        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 <cmdqueue_calc_sd_length()+0x7e>
            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 <bufindr>
    b56c:	30 91 92 12 	lds	r19, 0x1292	; 0x801292 <bufindr+0x1>
            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 <cmdqueue_calc_sd_length()+0x32>
            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 <cmdqueue_calc_sd_length()+0x7e>
    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 <cmdqueue_calc_sd_length()+0x3e>
    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 <cmdqueue_calc_sd_length()+0x64>
    b5ae:	a1 91       	ld	r26, Z+
    b5b0:	a1 11       	cpse	r26, r1
    b5b2:	e0 cf       	rjmp	.-64     	; 0xb574 <cmdqueue_calc_sd_length()+0x1e>
    b5b4:	2f 5f       	subi	r18, 0xFF	; 255
    b5b6:	3f 4f       	sbci	r19, 0xFF	; 255
    b5b8:	f6 cf       	rjmp	.-20     	; 0xb5a6 <cmdqueue_calc_sd_length()+0x50>
        // 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 <cmdqueue_calc_sd_length()+0x1e>
    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 <cmdqueue_calc_sd_length()+0x70>
    b5d2:	d0 cf       	rjmp	.-96     	; 0xb574 <cmdqueue_calc_sd_length()+0x1e>
        }
    }
    return sdlen;
}
    b5d4:	08 95       	ret

0000b5d6 <adc_setmux(unsigned char)>:
    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 <adc_setmux(unsigned char)+0x22>
    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 <adc_setmux(unsigned char)+0xe>

0000b600 <code_value_uint8()>:
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 <strchr_pointer>
    b604:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
    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 <strtol>
    b616:	86 2f       	mov	r24, r22
    b618:	08 95       	ret

0000b61a <code_value_short() [clone .lto_priv.543]>:
// 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 <strchr_pointer>
    b61e:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
    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 <strtol>
    b630:	cb 01       	movw	r24, r22
    b632:	08 95       	ret

0000b634 <code_value_long() [clone .lto_priv.545]>:

// 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 <strchr_pointer>
    b638:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
    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 <strtol>

0000b64a <FlushSerialRequestResend()>:
  // 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 <rx_buffer+0x82>
    b64e:	90 91 9b 04 	lds	r25, 0x049B	; 0x80049b <rx_buffer+0x83>
    b652:	90 93 99 04 	sts	0x0499, r25	; 0x800499 <rx_buffer+0x81>
    b656:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <rx_buffer+0x80>

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 <gcode_LastN>
    b666:	90 91 79 03 	lds	r25, 0x0379	; 0x800379 <gcode_LastN+0x1>
    b66a:	a0 91 7a 03 	lds	r26, 0x037A	; 0x80037a <gcode_LastN+0x2>
    b66e:	b0 91 7b 03 	lds	r27, 0x037B	; 0x80037b <gcode_LastN+0x3>
    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 <printf_P>
    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 <eeprom_is_initialized_block(void const*, unsigned int)>:
bool __attribute__((noinline)) eeprom_is_sheet_initialized(uint8_t sheet_num) {
    return (eeprom_read_word(reinterpret_cast<uint16_t*>(&(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 <eeprom_is_initialized_block(void const*, unsigned int)+0x32>
        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 <eeprom_read_byte>
    b6c4:	8f 3f       	cpi	r24, 0xFF	; 255
    b6c6:	31 f0       	breq	.+12     	; 0xb6d4 <eeprom_is_initialized_block(void const*, unsigned int)+0x2e>
            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 <eeprom_is_initialized_block(void const*, unsigned int)+0xe>
            return true;
    }
    return false;
    b6d8:	80 e0       	ldi	r24, 0x00	; 0
    b6da:	f7 cf       	rjmp	.-18     	; 0xb6ca <eeprom_is_initialized_block(void const*, unsigned int)+0x24>

0000b6dc <code_seen(char) [clone .lto_priv.549]>:
#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 <bufindr>
    b6e6:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
    b6ea:	89 55       	subi	r24, 0x59	; 89
    b6ec:	9f 4e       	sbci	r25, 0xEF	; 239
    b6ee:	0f 94 67 e2 	call	0x3c4ce	; 0x3c4ce <strchr>
    b6f2:	9c 01       	movw	r18, r24
    b6f4:	90 93 94 03 	sts	0x0394, r25	; 0x800394 <strchr_pointer+0x1>
    b6f8:	80 93 93 03 	sts	0x0393, r24	; 0x800393 <strchr_pointer>
    b6fc:	81 e0       	ldi	r24, 0x01	; 1
    b6fe:	23 2b       	or	r18, r19
    b700:	09 f4       	brne	.+2      	; 0xb704 <code_seen(char) [clone .lto_priv.549]+0x28>
    b702:	80 e0       	ldi	r24, 0x00	; 0
    b704:	08 95       	ret

0000b706 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>:
#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 <code_seen(char) [clone .lto_priv.549]>
    b718:	88 23       	and	r24, r24
    b71a:	19 f1       	breq	.+70     	; 0xb762 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x5c>
                // Verify value is within allowed range
                int16_t temp = code_value_short();
    b71c:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
                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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x26>
    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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x52>
                    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 <printf_P>
    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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x50>
                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 <eeprom_read_byte>

0000b778 <failstats_reset_print()>:
        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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>

0000b7b4 <cmdqueue_could_enqueue_back(unsigned int)>:
// 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 <cmdqueue_could_enqueue_back(unsigned int)+0x44>
        return false;

    if (bufindr == bufindw && buflen > 0)
    b7ba:	40 91 91 12 	lds	r20, 0x1291	; 0x801291 <bufindr>
    b7be:	50 91 92 12 	lds	r21, 0x1292	; 0x801292 <bufindr+0x1>
    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 <cmdqueue_could_enqueue_back(unsigned int)+0x2a>
    b7d0:	60 91 a2 10 	lds	r22, 0x10A2	; 0x8010a2 <buflen>
    b7d4:	70 91 a3 10 	lds	r23, 0x10A3	; 0x8010a3 <buflen+0x1>
    b7d8:	16 16       	cp	r1, r22
    b7da:	17 06       	cpc	r1, r23
    b7dc:	6c f0       	brlt	.+26     	; 0xb7f8 <cmdqueue_could_enqueue_back(unsigned int)+0x44>
    // 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 <cmdqueue_could_enqueue_back(unsigned int)+0x48>
        // 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 <cmdqueue_could_enqueue_back(unsigned int)+0x46>
// 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 <cmdqueue_could_enqueue_back(unsigned int)+0x8c>
    // 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 <cmdqueue_could_enqueue_back(unsigned int)+0x5e>
        // 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 <cmdqueue_could_enqueue_back(unsigned int)+0x8c>
        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 <cmdqueue_could_enqueue_back(unsigned int)+0x44>
        // 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 <memset>
        // 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 <temp_comp_interpolation(float)>:
		//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 <temp_comp_interpolation(float)+0x50>
    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 <temp_comp_interpolation(float)+0x64>
	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 <temp_comp_interpolation(float)+0x100>
    b942:	38 c3       	rjmp	.+1648   	; 0xbfb4 <temp_comp_interpolation(float)+0x770>
		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 <temp_comp_interpolation(float)+0x134>
    b976:	02 c3       	rjmp	.+1540   	; 0xbf7c <temp_comp_interpolation(float)+0x738>
    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 <temp_comp_interpolation(float)+0x1f6>
    ba38:	be cf       	rjmp	.-132    	; 0xb9b6 <temp_comp_interpolation(float)+0x172>
    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<n - 1; i++) {
    ba52:	ee 24       	eor	r14, r14
    ba54:	e3 94       	inc	r14
    ba56:	f1 2c       	mov	r15, r1
		m[i][i] = 2 * (h[i - 1] + h[i]);
    ba58:	d4 01       	movw	r26, r8
    ba5a:	4d 90       	ld	r4, X+
    ba5c:	5d 90       	ld	r5, X+
    ba5e:	6d 90       	ld	r6, X+
    ba60:	7d 90       	ld	r7, X+
    ba62:	4d 01       	movw	r8, r26
    ba64:	2d 91       	ld	r18, X+
    ba66:	3d 91       	ld	r19, X+
    ba68:	4d 91       	ld	r20, X+
    ba6a:	5c 91       	ld	r21, X
    ba6c:	c3 01       	movw	r24, r6
    ba6e:	b2 01       	movw	r22, r4
    ba70:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
    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 <temp_comp_interpolation(float)+0x262>
			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<n - 1; i++) {
    baec:	e5 e0       	ldi	r30, 0x05	; 5
    baee:	ee 16       	cp	r14, r30
    baf0:	f1 04       	cpc	r15, r1
    baf2:	09 f0       	breq	.+2      	; 0xbaf6 <temp_comp_interpolation(float)+0x2b2>
    baf4:	b1 cf       	rjmp	.-158    	; 0xba58 <temp_comp_interpolation(float)+0x214>
    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<n - 2; i++) {
		temp = (m[i + 1][i] / m[i][i]);
    bb0e:	d7 01       	movw	r26, r14
    bb10:	2d 91       	ld	r18, X+
    bb12:	3d 91       	ld	r19, X+
    bb14:	4d 91       	ld	r20, X+
    bb16:	5c 91       	ld	r21, X
    bb18:	13 97       	sbiw	r26, 0x03	; 3
    bb1a:	98 96       	adiw	r26, 0x28	; 40
    bb1c:	6d 91       	ld	r22, X+
    bb1e:	7d 91       	ld	r23, X+
    bb20:	8d 91       	ld	r24, X+
    bb22:	9c 91       	ld	r25, X
    bb24:	9b 97       	sbiw	r26, 0x2b	; 43
    bb26:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
    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<n - 2; i++) {
		temp = (m[i + 1][i] / m[i][i]);
		for (j = 1; j <= n - 1; j++)
    bb72:	bf ef       	ldi	r27, 0xFF	; 255
    bb74:	8b 1a       	sub	r8, r27
    bb76:	9b 0a       	sbc	r9, r27
    bb78:	e6 e0       	ldi	r30, 0x06	; 6
    bb7a:	8e 16       	cp	r8, r30
    bb7c:	91 04       	cpc	r9, r1
    bb7e:	e9 f6       	brne	.-70     	; 0xbb3a <temp_comp_interpolation(float)+0x2f6>
    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<n - 2; i++) {
    bb90:	08 33       	cpi	r16, 0x38	; 56
    bb92:	9f ef       	ldi	r25, 0xFF	; 255
    bb94:	19 07       	cpc	r17, r25
    bb96:	09 f0       	breq	.+2      	; 0xbb9a <temp_comp_interpolation(float)+0x356>
    bb98:	ba cf       	rjmp	.-140    	; 0xbb0e <temp_comp_interpolation(float)+0x2ca>
    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 <temp_comp_interpolation(float)+0x380>
			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 <temp_comp_interpolation(float)+0x40c>
    bc4e:	b4 cf       	rjmp	.-152    	; 0xbbb8 <temp_comp_interpolation(float)+0x374>
			sum += m[i][j] * s[j];
		s[i] = (m[i][n - 1] - sum) / m[i][i];
	}

		for (i = 0; i<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > 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 <temp_comp_interpolation(float)+0x4a2>
    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 <temp_comp_interpolation(float)+0x4d2>
    bce6:	04 30       	cpi	r16, 0x04	; 4
    bce8:	11 05       	cpc	r17, r1
    bcea:	09 f0       	breq	.+2      	; 0xbcee <temp_comp_interpolation(float)+0x4aa>
    bcec:	30 c1       	rjmp	.+608    	; 0xbf4e <temp_comp_interpolation(float)+0x70a>
    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 <temp_comp_interpolation(float)+0x70a>
				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 <pow>
    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<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > 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<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > 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<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > 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<n - 1; i++)
    bf74:	05 30       	cpi	r16, 0x05	; 5
    bf76:	11 05       	cpc	r17, r1
    bf78:	09 f0       	breq	.+2      	; 0xbf7c <temp_comp_interpolation(float)+0x738>
    bf7a:	81 ce       	rjmp	.-766    	; 0xbc7e <temp_comp_interpolation(float)+0x43a>
				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 <eeprom_read_word>
    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 <temp_comp_interpolation(float)+0xb6>

0000bfce <gcodes_M704_M705_M706(unsigned int)>:
    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 <MMU2::mmu2+0x6f>
    bfd8:	21 30       	cpi	r18, 0x01	; 1
    bfda:	79 f5       	brne	.+94     	; 0xc03a <gcodes_M704_M705_M706(unsigned int)+0x6c>
    bfdc:	8c 01       	movw	r16, r24
    bfde:	80 e5       	ldi	r24, 0x50	; 80
    bfe0:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
    bfe4:	88 23       	and	r24, r24
    bfe6:	49 f1       	breq	.+82     	; 0xc03a <gcodes_M704_M705_M706(unsigned int)+0x6c>
    {
        mmuSlotIndex = code_value_uint8();
    bfe8:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
    bfec:	c8 2f       	mov	r28, r24
        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
    bfee:	85 30       	cpi	r24, 0x05	; 5
    bff0:	20 f5       	brcc	.+72     	; 0xc03a <gcodes_M704_M705_M706(unsigned int)+0x6c>
            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 <gcodes_M704_M705_M706(unsigned int)+0x3e>
    bffa:	02 3c       	cpi	r16, 0xC2	; 194
    bffc:	12 40       	sbci	r17, 0x02	; 2
    bffe:	69 f0       	breq	.+26     	; 0xc01a <gcodes_M704_M705_M706(unsigned int)+0x4c>
            {
            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 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>
                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 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]>
                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 <eeprom_read_byte>
    c022:	88 23       	and	r24, r24
    c024:	51 f0       	breq	.+20     	; 0xc03a <gcodes_M704_M705_M706(unsigned int)+0x6c>
        IncrementMMUFails();
    }
}

bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) {
    if (!WaitForMMUReady()) {
    c026:	0f 94 78 88 	call	0x310f0	; 0x310f0 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
    c02a:	88 23       	and	r24, r24
    c02c:	31 f0       	breq	.+12     	; 0xc03a <gcodes_M704_M705_M706(unsigned int)+0x6c>
    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 <MMU2::MMU2::cut_filament(unsigned char, bool) [clone .part.39] [clone .constprop.117]>
    c03a:	cf 91       	pop	r28
    c03c:	1f 91       	pop	r17
    c03e:	0f 91       	pop	r16
    c040:	08 95       	ret

0000c042 <change_power_mode_live(unsigned char)>:


#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 <st_synchronize()>
		cli();
    c04a:	f8 94       	cli
		tmc2130_mode = mode;
    c04c:	c0 93 8b 06 	sts	0x068B, r28	; 0x80068b <tmc2130_mode>
		update_mode_profile();
    c050:	0f 94 98 64 	call	0x2c930	; 0x2c930 <update_mode_profile()>
    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 <UserECoolEnabled()>
        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 <tmc2130_init(TMCInitParams)>
    // 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 <st_reset_timer()>
		sei();
    c064:	78 94       	sei
}
    c066:	cf 91       	pop	r28
    c068:	08 95       	ret

0000c06a <code_value() [clone .lto_priv.547]>:
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 <strchr_pointer>
    c086:	10 91 94 03 	lds	r17, 0x0394	; 0x800394 <strchr_pointer+0x1>
    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 <isspace>
    c0a2:	7c 01       	movw	r14, r24
    c0a4:	89 2b       	or	r24, r25
    c0a6:	01 f5       	brne	.+64     	; 0xc0e8 <code_value() [clone .lto_priv.547]+0x7e>

	flag = 0;
	if (c == '-') {
    c0a8:	dd 32       	cpi	r29, 0x2D	; 45
    c0aa:	01 f5       	brne	.+64     	; 0xc0ec <code_value() [clone .lto_priv.547]+0x82>
		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 <strncasecmp_P>
    c0ce:	89 2b       	or	r24, r25
    c0d0:	c1 f4       	brne	.+48     	; 0xc102 <code_value() [clone .lto_priv.547]+0x98>
		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 <code_value() [clone .lto_priv.547]+0x22a>
    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 <code_value() [clone .lto_priv.547]+0x22a>

	if (endptr)
		*endptr = (char*)nptr;

	do {
		c = *nptr++;
    c0e8:	86 01       	movw	r16, r12
    c0ea:	d1 cf       	rjmp	.-94     	; 0xc08e <code_value() [clone .lto_priv.547]+0x24>
	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 <code_value() [clone .lto_priv.547]+0x94>
		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 <code_value() [clone .lto_priv.547]+0x50>
		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 <strncasecmp_P>
    c110:	89 2b       	or	r24, r25
    c112:	09 f4       	brne	.+2      	; 0xc116 <code_value() [clone .lto_priv.547]+0xac>
    c114:	cc c0       	rjmp	.+408    	; 0xc2ae <code_value() [clone .lto_priv.547]+0x244>
    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 <code_value() [clone .lto_priv.547]+0x118>
			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 <code_value() [clone .lto_priv.547]+0xe0>
				if (!(flag & FL_DOT))
    c138:	81 11       	cpse	r24, r1
    c13a:	02 c0       	rjmp	.+4      	; 0xc140 <code_value() [clone .lto_priv.547]+0xd6>
					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 <code_value() [clone .lto_priv.547]+0xb8>
			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 <code_value() [clone .lto_priv.547]+0xe8>
					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 <code_value() [clone .lto_priv.547]+0xd6>
					flag |= FL_OVFL;
    c17c:	c6 60       	ori	r28, 0x06	; 6
    c17e:	bc 2e       	mov	r11, r28
    c180:	df cf       	rjmp	.-66     	; 0xc140 <code_value() [clone .lto_priv.547]+0xd6>
			}

		}
		else if (c == (('.' - '0') & 0xff) && !(flag & FL_DOT)) {
    c182:	de 3f       	cpi	r29, 0xFE	; 254
    c184:	31 f4       	brne	.+12     	; 0xc192 <code_value() [clone .lto_priv.547]+0x128>
    c186:	c3 fd       	sbrc	r28, 3
    c188:	33 c0       	rjmp	.+102    	; 0xc1f0 <code_value() [clone .lto_priv.547]+0x186>
			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 <code_value() [clone .lto_priv.547]+0xd6>
		}
		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 <code_value() [clone .lto_priv.547]+0x186>
	{
		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 <code_value() [clone .lto_priv.547]+0x13e>
			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 <code_value() [clone .lto_priv.547]+0x148>
    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 <code_value() [clone .lto_priv.547]+0x136>

	// 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 <code_value() [clone .lto_priv.547]+0x186>
    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 <code_value() [clone .lto_priv.547]+0x170>
					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 <code_value() [clone .lto_priv.547]+0x150>
			if (flag & FL_MEXP)
    c1e2:	c4 ff       	sbrs	r28, 4
    c1e4:	03 c0       	rjmp	.+6      	; 0xc1ec <code_value() [clone .lto_priv.547]+0x182>
				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 <code_value() [clone .lto_priv.547]+0x196>
		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 <code_value() [clone .lto_priv.547]+0x1aa>
    c212:	3e c0       	rjmp	.+124    	; 0xc290 <code_value() [clone .lto_priv.547]+0x226>
		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 <code_value() [clone .lto_priv.547]+0x1bc>
			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 <code_value() [clone .lto_priv.547]+0x1e6>
			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 <code_value() [clone .lto_priv.547]+0x1cc>
					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 <code_value() [clone .lto_priv.547]+0x1e6>
    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 <code_value() [clone .lto_priv.547]+0x21a>
    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 <code_value() [clone .lto_priv.547]+0x226>
			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 <errno+0x1>
    c28c:	80 93 13 18 	sts	0x1813, r24	; 0x801813 <errno>
	}

	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 <code_value() [clone .lto_priv.547]+0x22a>

0000c2b8 <get_coordinates()>:
		}
	}
}
#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 <get_coordinates()+0x26>
    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 <code_seen(char) [clone .lto_priv.549]>
    c30a:	28 2e       	mov	r2, r24
    c30c:	88 23       	and	r24, r24
    c30e:	09 f4       	brne	.+2      	; 0xc312 <get_coordinates()+0x5a>
    c310:	a6 c0       	rjmp	.+332    	; 0xc45e <get_coordinates()+0x1a6>
    {
      bool relative = axis_relative_modes & mask;
    c312:	10 91 e3 03 	lds	r17, 0x03E3	; 0x8003e3 <axis_relative_modes>
    c316:	13 21       	and	r17, r3
      destination[i] = code_value();
    c318:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
    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 <get_coordinates()+0x7a>
    c330:	46 c0       	rjmp	.+140    	; 0xc3be <get_coordinates()+0x106>

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 <get_coordinates()+0x84>
    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 <extruder_multiplier>
    c340:	90 90 94 02 	lds	r9, 0x0294	; 0x800294 <extruder_multiplier+0x1>
    c344:	a0 90 95 02 	lds	r10, 0x0295	; 0x800295 <extruder_multiplier+0x2>
    c348:	b0 90 96 02 	lds	r11, 0x0296	; 0x800296 <extruder_multiplier+0x3>
        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 <get_coordinates()+0xfe>
          if (! relative) {
    c360:	11 11       	cpse	r17, r1
    c362:	15 c0       	rjmp	.+42     	; 0xc38e <get_coordinates()+0xd6>
            destination[i] -= current_position[i];
    c364:	20 91 9d 06 	lds	r18, 0x069D	; 0x80069d <current_position+0xc>
    c368:	30 91 9e 06 	lds	r19, 0x069E	; 0x80069e <current_position+0xd>
    c36c:	40 91 9f 06 	lds	r20, 0x069F	; 0x80069f <current_position+0xe>
    c370:	50 91 a0 06 	lds	r21, 0x06A0	; 0x8006a0 <current_position+0xf>
    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 <destination+0xc>
    c380:	70 93 80 06 	sts	0x0680, r23	; 0x800680 <destination+0xd>
    c384:	80 93 81 06 	sts	0x0681, r24	; 0x800681 <destination+0xe>
    c388:	90 93 82 06 	sts	0x0682, r25	; 0x800682 <destination+0xf>
            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 <destination+0xc>
    c396:	70 91 80 06 	lds	r23, 0x0680	; 0x800680 <destination+0xd>
    c39a:	80 91 81 06 	lds	r24, 0x0681	; 0x800681 <destination+0xe>
    c39e:	90 91 82 06 	lds	r25, 0x0682	; 0x800682 <destination+0xf>
    c3a2:	0f 94 dd d6 	call	0x3adba	; 0x3adba <__mulsf3>
    c3a6:	60 93 7f 06 	sts	0x067F, r22	; 0x80067f <destination+0xc>
    c3aa:	70 93 80 06 	sts	0x0680, r23	; 0x800680 <destination+0xd>
    c3ae:	80 93 81 06 	sts	0x0681, r24	; 0x800681 <destination+0xe>
    c3b2:	90 93 82 06 	sts	0x0682, r25	; 0x800682 <destination+0xf>
        }
      }
      if (relative)
    c3b6:	e9 81       	ldd	r30, Y+1	; 0x01
    c3b8:	e1 11       	cpse	r30, r1
    c3ba:	03 c0       	rjmp	.+6      	; 0xc3c2 <get_coordinates()+0x10a>
    c3bc:	22 c0       	rjmp	.+68     	; 0xc402 <get_coordinates()+0x14a>
    c3be:	11 23       	and	r17, r17
    c3c0:	99 f0       	breq	.+38     	; 0xc3e8 <get_coordinates()+0x130>
        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 <get_coordinates()+0x14a>
    c400:	7f cf       	rjmp	.-258    	; 0xc300 <get_coordinates()+0x48>
	  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 <code_seen(char) [clone .lto_priv.549]>
    c408:	88 23       	and	r24, r24
    c40a:	99 f0       	breq	.+38     	; 0xc432 <get_coordinates()+0x17a>
    const float next_feedrate = code_value();
    c40c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
    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 <get_coordinates()+0x17a>
    c422:	c0 92 b8 02 	sts	0x02B8, r12	; 0x8002b8 <feedrate>
    c426:	d0 92 b9 02 	sts	0x02B9, r13	; 0x8002b9 <feedrate+0x1>
    c42a:	e0 92 ba 02 	sts	0x02BA, r14	; 0x8002ba <feedrate+0x2>
    c42e:	f0 92 bb 02 	sts	0x02BB, r15	; 0x8002bb <feedrate+0x3>
  }
}
    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 <get_coordinates()+0x130>

0000c476 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)>:
    }
}

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 <busy_state>
    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 <printf_P>
    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 <code_seen(char) [clone .lto_priv.549]>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xa0>
        addr_start = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value();
    c4ee:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
    c4f2:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x8a>
    c4fe:	69 c0       	rjmp	.+210    	; 0xc5d2 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x15c>
    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 <strtol>
    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 <code_seen(char) [clone .lto_priv.549]>
    c51c:	88 23       	and	r24, r24
    c51e:	09 f4       	brne	.+2      	; 0xc522 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xac>
    c520:	65 c0       	rjmp	.+202    	; 0xc5ec <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x176>
        count = code_value_long();
    c522:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xca>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xea>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xf6>
        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 <code_seen(char) [clone .lto_priv.549]>
    c572:	88 23       	and	r24, r24
    c574:	09 f4       	brne	.+2      	; 0xc578 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x102>
    c576:	91 c0       	rjmp	.+290    	; 0xc69a <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x224>
    {
        uint8_t data[16];
        count = parse_hex(strchr_pointer + 1, data, 16);
    c578:	20 91 93 03 	lds	r18, 0x0393	; 0x800393 <strchr_pointer>
    c57c:	30 91 94 03 	lds	r19, 0x0394	; 0x800394 <strchr_pointer+0x1>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x126>
    c59a:	3f c0       	rjmp	.+126    	; 0xc61a <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1a4>
	{
		if (count && (parsed >= count)) break;
    c59c:	00 31       	cpi	r16, 0x10	; 16
    c59e:	11 05       	cpc	r17, r1
    c5a0:	e1 f1       	breq	.+120    	; 0xc61a <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1a4>
		char c = *(hex++);
		if (c == ' ') continue;
    c5a2:	80 32       	cpi	r24, 0x20	; 32
    c5a4:	a1 f3       	breq	.-24     	; 0xc58e <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x118>
		if (c == '\n') break;
    c5a6:	8a 30       	cpi	r24, 0x0A	; 10
    c5a8:	c1 f1       	breq	.+112    	; 0xc61a <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1a4>
		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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x180>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x190>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x118>
{
    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 <code_value() [clone .lto_priv.547]>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xa0>
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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0xb4>
		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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x19e>
    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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x140>
		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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x19e>
    c60e:	97 55       	subi	r25, 0x57	; 87
    c610:	89 2b       	or	r24, r25
    c612:	db cf       	rjmp	.-74     	; 0xc5ca <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x154>
		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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1f8>
    {
        switch (type)
    c632:	33 20       	and	r3, r3
    c634:	39 f0       	breq	.+14     	; 0xc644 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1ce>
    c636:	31 e0       	ldi	r19, 0x01	; 1
    c638:	33 16       	cp	r3, r19
    c63a:	71 f0       	breq	.+28     	; 0xc658 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1e2>
}

// 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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1b6>
    {
        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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1c6>
        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 <eeprom_write_byte>
    c66c:	e7 cf       	rjmp	.-50     	; 0xc63c <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)+0x1c6>
    {
        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 <printf_P>
    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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]>
}
    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 <print_hex_nibble(unsigned char)>:

#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 <print_hex_nibble(unsigned char)+0x16>
    c6e8:	89 5a       	subi	r24, 0xA9	; 169
    c6ea:	9f 4f       	sbci	r25, 0xFF	; 255
    c6ec:	0d 94 78 da 	jmp	0x3b4f0	; 0x3b4f0 <fputc>
    c6f0:	c0 96       	adiw	r24, 0x30	; 48
    c6f2:	fc cf       	rjmp	.-8      	; 0xc6ec <print_hex_nibble(unsigned char)+0x12>

0000c6f4 <lcd_writebits(unsigned char)>:
	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 <lcd_writebits(unsigned char)+0x34>
    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 <lcd_writebits(unsigned char)+0x38>
    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 <lcd_writebits(unsigned char)+0x3c>
    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 <lcd_writebits(unsigned char)+0x46>
    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 <lcd_writebits(unsigned char)+0x2a>
    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 <lcd_writebits(unsigned char)+0x6>
	WRITE(LCD_PINS_D5, value & 0x20);
    c72c:	a4 98       	cbi	0x14, 4	; 20
    c72e:	e8 cf       	rjmp	.-48     	; 0xc700 <lcd_writebits(unsigned char)+0xc>
	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 <lcd_writebits(unsigned char)+0x1a>
	WRITE(LCD_PINS_D7, value & 0x80);
    c73a:	a3 98       	cbi	0x14, 3	; 20
    c73c:	ee cf       	rjmp	.-36     	; 0xc71a <lcd_writebits(unsigned char)+0x26>

0000c73e <lcd_send(unsigned char, unsigned char, unsigned int)>:

	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 <lcd_send(unsigned char, unsigned char, unsigned int)+0x3c>
    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 <lcd_send(unsigned char, unsigned char, unsigned int)+0x16>
    c758:	00 c0       	rjmp	.+0      	; 0xc75a <lcd_send(unsigned char, unsigned char, unsigned int)+0x1c>
	_delay_us(5);
	lcd_writebits(data);
    c75a:	8c 2f       	mov	r24, r28
    c75c:	0e 94 7a 63 	call	0xc6f4	; 0xc6f4 <lcd_writebits(unsigned char)>
#ifndef LCD_8BIT
	if (!(flags & LCD_HALF_FLAG)) {
    c760:	d1 fd       	sbrc	r29, 1
    c762:	04 c0       	rjmp	.+8      	; 0xc76c <lcd_send(unsigned char, unsigned char, unsigned int)+0x2e>
		// _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 <lcd_writebits(unsigned char)>
	}
#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 <delayMicroseconds>
	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 <lcd_send(unsigned char, unsigned char, unsigned int)+0x14>

0000c77e <eeprom_init_default_float(float*, float)>:
        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 <eeprom_read_dword>
    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 <eeprom_init_default_float(float*, float)+0x36>
    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 <eeprom_write_dword>
}

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 <refresh_print_state_in_ram() [clone .part.39]>:
/// 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 <refresh_print_state_in_ram() [clone .part.39]+0xa>
    saved_feedmultiply2 = feedmultiply; //save feedmultiply
    c7d4:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
    c7d8:	90 91 3a 02 	lds	r25, 0x023A	; 0x80023a <feedmultiply+0x1>
    c7dc:	90 93 70 03 	sts	0x0370, r25	; 0x800370 <saved_feedmultiply2+0x1>
    c7e0:	80 93 6f 03 	sts	0x036F, r24	; 0x80036f <saved_feedmultiply2>
    saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder);
    c7e4:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
    c7e8:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
    c7ec:	90 93 ac 05 	sts	0x05AC, r25	; 0x8005ac <saved_extruder_temperature+0x1>
    c7f0:	80 93 ab 05 	sts	0x05AB, r24	; 0x8005ab <saved_extruder_temperature>
    saved_bed_temperature = (uint8_t)degTargetBed();
    c7f4:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
    c7f8:	80 93 ad 05 	sts	0x05AD, r24	; 0x8005ad <saved_bed_temperature>
    saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
    c7fc:	80 91 e3 03 	lds	r24, 0x03E3	; 0x8003e3 <axis_relative_modes>
    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_extruder_relative_mode>
    saved_fan_speed = fanSpeed;
    c80a:	80 91 e5 03 	lds	r24, 0x03E5	; 0x8003e5 <fanSpeed>
    c80e:	80 93 aa 05 	sts	0x05AA, r24	; 0x8005aa <saved_fan_speed>
    isPartialBackupAvailable = true;
    c812:	81 e0       	ldi	r24, 0x01	; 1
    c814:	80 93 a1 06 	sts	0x06A1, r24	; 0x8006a1 <isPartialBackupAvailable>
}
    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 <SdBaseFile::~SdBaseFile()>
#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 <SdBaseFile::~SdBaseFile()>
    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 <SdBaseFile::~SdBaseFile()>
    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 <SdBaseFile::~SdBaseFile()>

0000c856 <load_filament_final_feed()>:
    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 <plan_buffer_line_curposXYZE(float)>

0000c88a <cancel_saved_printing()>:
        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 <eeprom_update_byte>
    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 <eeprom_update_byte>
// 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 <saved_start_position>
    c8aa:	90 93 84 02 	sts	0x0284, r25	; 0x800284 <saved_start_position+0x1>
    c8ae:	a0 93 85 02 	sts	0x0285, r26	; 0x800285 <saved_start_position+0x2>
    c8b2:	b0 93 86 02 	sts	0x0286, r27	; 0x800286 <saved_start_position+0x3>
    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_type>
    saved_printing = false;
    c8bc:	10 92 a8 0d 	sts	0x0DA8, r1	; 0x800da8 <saved_printing>
}
    c8c0:	08 95       	ret

0000c8c2 <restore_extruder_temperature_from_ram()>:

    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 <saved_extruder_temperature>
    c8c6:	90 91 ac 05 	lds	r25, 0x05AC	; 0x8005ac <saved_extruder_temperature+0x1>
    c8ca:	20 91 b5 0d 	lds	r18, 0x0DB5	; 0x800db5 <target_temperature>
    c8ce:	30 91 b6 0d 	lds	r19, 0x0DB6	; 0x800db6 <target_temperature+0x1>
    c8d2:	28 17       	cp	r18, r24
    c8d4:	39 07       	cpc	r19, r25
    c8d6:	71 f0       	breq	.+28     	; 0xc8f4 <restore_extruder_temperature_from_ram()+0x32>
  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 <target_temperature+0x1>
    c8dc:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <target_temperature>
    {
        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 <heating_status>
        wait_for_heater(_millis(), active_extruder);
    c8e6:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    c8ea:	0f 94 d8 82 	call	0x305b0	; 0x305b0 <wait_for_heater(long, unsigned char) [clone .constprop.214]>
        heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE;
    c8ee:	82 e0       	ldi	r24, 0x02	; 2
    c8f0:	80 93 e1 03 	sts	0x03E1, r24	; 0x8003e1 <heating_status>
    }
}
    c8f4:	08 95       	ret

0000c8f6 <refresh_saved_feedrate_multiplier_in_ram()>:
    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 <saved_printing>
    c8fa:	88 23       	and	r24, r24
    c8fc:	41 f0       	breq	.+16     	; 0xc90e <refresh_saved_feedrate_multiplier_in_ram()+0x18>
        // There is no saved print, therefore nothing to refresh
        return;
    }

    saved_feedmultiply2 = feedmultiply;
    c8fe:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
    c902:	90 91 3a 02 	lds	r25, 0x023A	; 0x80023a <feedmultiply+0x1>
    c906:	90 93 70 03 	sts	0x0370, r25	; 0x800370 <saved_feedmultiply2+0x1>
    c90a:	80 93 6f 03 	sts	0x036F, r24	; 0x80036f <saved_feedmultiply2>
}
    c90e:	08 95       	ret

0000c910 <save_planner_global_state()>:
      //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 <current_block>
    c914:	90 91 a1 05 	lds	r25, 0x05A1	; 0x8005a1 <current_block+0x1>
    c918:	00 97       	sbiw	r24, 0x00	; 0
    c91a:	29 f1       	breq	.+74     	; 0xc966 <save_planner_global_state()+0x56>
    c91c:	20 91 a7 0d 	lds	r18, 0x0DA7	; 0x800da7 <mesh_bed_leveling_flag>
    c920:	21 11       	cpse	r18, r1
    c922:	21 c0       	rjmp	.+66     	; 0xc966 <save_planner_global_state()+0x56>
    c924:	20 91 a6 0d 	lds	r18, 0x0DA6	; 0x800da6 <homing_flag>
    c928:	21 11       	cpse	r18, r1
    c92a:	1d c0       	rjmp	.+58     	; 0xc966 <save_planner_global_state()+0x56>
    {
        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 <save_planner_global_state()+0x28>
        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 <saved_feedrate2+0x1>
    c94e:	20 93 5d 05 	sts	0x055D, r18	; 0x80055d <saved_feedrate2>
        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 <saved_segment_idx+0x1>
    c960:	80 93 68 05 	sts	0x0568, r24	; 0x800568 <saved_segment_idx>
    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 <saved_start_position>
    c972:	90 93 84 02 	sts	0x0284, r25	; 0x800284 <saved_start_position+0x1>
    c976:	a0 93 85 02 	sts	0x0285, r26	; 0x800285 <saved_start_position+0x2>
    c97a:	b0 93 86 02 	sts	0x0286, r27	; 0x800286 <saved_start_position+0x3>
        saved_feedrate2 = feedrate;
    c97e:	60 91 b8 02 	lds	r22, 0x02B8	; 0x8002b8 <feedrate>
    c982:	70 91 b9 02 	lds	r23, 0x02B9	; 0x8002b9 <feedrate+0x1>
    c986:	80 91 ba 02 	lds	r24, 0x02BA	; 0x8002ba <feedrate+0x2>
    c98a:	90 91 bb 02 	lds	r25, 0x02BB	; 0x8002bb <feedrate+0x3>
    c98e:	0f 94 b0 de 	call	0x3bd60	; 0x3bd60 <__fixunssfsi>
    c992:	70 93 5e 05 	sts	0x055E, r23	; 0x80055e <saved_feedrate2+0x1>
    c996:	60 93 5d 05 	sts	0x055D, r22	; 0x80055d <saved_feedrate2>
        saved_segment_idx = 0;
    c99a:	10 92 69 05 	sts	0x0569, r1	; 0x800569 <saved_segment_idx+0x1>
    c99e:	10 92 68 05 	sts	0x0568, r1	; 0x800568 <saved_segment_idx>
    }
}
    c9a2:	08 95       	ret

0000c9a4 <save_print_file_state()>:
	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 <card+0x2>
    c9b0:	88 23       	and	r24, r24
    c9b2:	d9 f1       	breq	.+118    	; 0xca2a <save_print_file_state()+0x86>
        saved_sdpos = sdpos_atomic; //atomic sd position of last command added in queue
    c9b4:	80 91 80 03 	lds	r24, 0x0380	; 0x800380 <sdpos_atomic>
    c9b8:	90 91 81 03 	lds	r25, 0x0381	; 0x800381 <sdpos_atomic+0x1>
    c9bc:	a0 91 82 03 	lds	r26, 0x0382	; 0x800382 <sdpos_atomic+0x2>
    c9c0:	b0 91 83 03 	lds	r27, 0x0383	; 0x800383 <sdpos_atomic+0x3>
    c9c4:	80 93 5f 05 	sts	0x055F, r24	; 0x80055f <saved_sdpos>
    c9c8:	90 93 60 05 	sts	0x0560, r25	; 0x800560 <saved_sdpos+0x1>
    c9cc:	a0 93 61 05 	sts	0x0561, r26	; 0x800561 <saved_sdpos+0x2>
    c9d0:	b0 93 62 05 	sts	0x0562, r27	; 0x800562 <saved_sdpos+0x3>
        sdlen_planner = planner_calc_sd_length(); //length of sd commands in planner
    c9d4:	0f 94 26 64 	call	0x2c84c	; 0x2c84c <planner_calc_sd_length()>
        saved_sdpos -= sdlen_planner;
    c9d8:	c0 90 5f 05 	lds	r12, 0x055F	; 0x80055f <saved_sdpos>
    c9dc:	d0 90 60 05 	lds	r13, 0x0560	; 0x800560 <saved_sdpos+0x1>
    c9e0:	e0 90 61 05 	lds	r14, 0x0561	; 0x800561 <saved_sdpos+0x2>
    c9e4:	f0 90 62 05 	lds	r15, 0x0562	; 0x800562 <saved_sdpos+0x3>
    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 <saved_sdpos>
    c9f4:	d0 92 60 05 	sts	0x0560, r13	; 0x800560 <saved_sdpos+0x1>
    c9f8:	e0 92 61 05 	sts	0x0561, r14	; 0x800561 <saved_sdpos+0x2>
    c9fc:	f0 92 62 05 	sts	0x0562, r15	; 0x800562 <saved_sdpos+0x3>
        sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue
    ca00:	0e 94 ab 5a 	call	0xb556	; 0xb556 <cmdqueue_calc_sd_length()>
        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 <saved_sdpos>
    ca10:	d0 92 60 05 	sts	0x0560, r13	; 0x800560 <saved_sdpos+0x1>
    ca14:	e0 92 61 05 	sts	0x0561, r14	; 0x800561 <saved_sdpos+0x2>
    ca18:	f0 92 62 05 	sts	0x0562, r15	; 0x800562 <saved_sdpos+0x3>
        saved_printing_type = PowerPanic::PRINT_TYPE_SD;
    ca1c:	10 92 6a 02 	sts	0x026A, r1	; 0x80026a <saved_printing_type>
    }
    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 <usb_timer>
    ca2e:	88 23       	and	r24, r24
    ca30:	b1 f1       	breq	.+108    	; 0xca9e <save_print_file_state()+0xfa>
        saved_sdpos = gcode_LastN; //start with line number of command added recently to cmd queue
    ca32:	80 91 78 03 	lds	r24, 0x0378	; 0x800378 <gcode_LastN>
    ca36:	90 91 79 03 	lds	r25, 0x0379	; 0x800379 <gcode_LastN+0x1>
    ca3a:	a0 91 7a 03 	lds	r26, 0x037A	; 0x80037a <gcode_LastN+0x2>
    ca3e:	b0 91 7b 03 	lds	r27, 0x037B	; 0x80037b <gcode_LastN+0x3>
    ca42:	80 93 5f 05 	sts	0x055F, r24	; 0x80055f <saved_sdpos>
    ca46:	90 93 60 05 	sts	0x0560, r25	; 0x800560 <saved_sdpos+0x1>
    ca4a:	a0 93 61 05 	sts	0x0561, r26	; 0x800561 <saved_sdpos+0x2>
    ca4e:	b0 93 62 05 	sts	0x0562, r27	; 0x800562 <saved_sdpos+0x3>
        //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 <planner_calc_sd_length()>
        saved_sdpos -= nlines;
    ca56:	40 91 5f 05 	lds	r20, 0x055F	; 0x80055f <saved_sdpos>
    ca5a:	50 91 60 05 	lds	r21, 0x0560	; 0x800560 <saved_sdpos+0x1>
    ca5e:	60 91 61 05 	lds	r22, 0x0561	; 0x800561 <saved_sdpos+0x2>
    ca62:	70 91 62 05 	lds	r23, 0x0562	; 0x800562 <saved_sdpos+0x3>
    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 <buflen>
    ca72:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
    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 <saved_sdpos>
    ca8a:	50 93 60 05 	sts	0x0560, r21	; 0x800560 <saved_sdpos+0x1>
    ca8e:	60 93 61 05 	sts	0x0561, r22	; 0x800561 <saved_sdpos+0x2>
    ca92:	70 93 62 05 	sts	0x0562, r23	; 0x800562 <saved_sdpos+0x3>
        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 <saved_printing_type>
    ca9c:	c1 cf       	rjmp	.-126    	; 0xca20 <save_print_file_state()+0x7c>
    ca9e:	82 e0       	ldi	r24, 0x02	; 2
    caa0:	fb cf       	rjmp	.-10     	; 0xca98 <save_print_file_state()+0xf4>

0000caa2 <calculate_extruder_multipliers()>:
  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 <cs+0x98>
    caae:	d0 90 56 0e 	lds	r13, 0x0E56	; 0x800e56 <cs+0x99>
    cab2:	e0 90 57 0e 	lds	r14, 0x0E57	; 0x800e57 <cs+0x9a>
    cab6:	f0 90 58 0e 	lds	r15, 0x0E58	; 0x800e58 <cs+0x9b>
    }
}

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 <cs+0x97>
    cabe:	88 23       	and	r24, r24
    cac0:	09 f4       	brne	.+2      	; 0xcac4 <calculate_extruder_multipliers()+0x22>
    cac2:	4e c0       	rjmp	.+156    	; 0xcb60 <calculate_extruder_multipliers()+0xbe>
    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 <calculate_extruder_multipliers()+0x36>
    cad6:	44 c0       	rjmp	.+136    	; 0xcb60 <calculate_extruder_multipliers()+0xbe>
    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 <extrudemultiply>
    cb14:	70 91 bd 02 	lds	r23, 0x02BD	; 0x8002bd <extrudemultiply+0x1>
    cb18:	64 36       	cpi	r22, 0x64	; 100
    cb1a:	71 05       	cpc	r23, r1
    cb1c:	a1 f0       	breq	.+40     	; 0xcb46 <calculate_extruder_multipliers()+0xa4>
    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 <extruder_multiplier>
    cb4a:	d0 92 94 02 	sts	0x0294, r13	; 0x800294 <extruder_multiplier+0x1>
    cb4e:	e0 92 95 02 	sts	0x0295, r14	; 0x800295 <extruder_multiplier+0x2>
    cb52:	f0 92 96 02 	sts	0x0296, r15	; 0x800296 <extruder_multiplier+0x3>
	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 <calculate_extruder_multipliers()+0x6e>

0000cb6e <save_statistics()>:

  }
}
#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 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.246]>
    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 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.246]>
    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 <Stopwatch::duration()>
    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>
    eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, _previous_filament + (total_filament_used / 1000));
    cbba:	60 91 64 06 	lds	r22, 0x0664	; 0x800664 <total_filament_used>
    cbbe:	70 91 65 06 	lds	r23, 0x0665	; 0x800665 <total_filament_used+0x1>
    cbc2:	80 91 66 06 	lds	r24, 0x0666	; 0x800666 <total_filament_used+0x2>
    cbc6:	90 91 67 06 	lds	r25, 0x0667	; 0x800667 <total_filament_used+0x3>
    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 <eeprom_update_dword>

    print_job_timer.reset();
    cbea:	0f 94 33 43 	call	0x28666	; 0x28666 <Stopwatch::reset()>
    total_filament_used = 0;
    cbee:	10 92 64 06 	sts	0x0664, r1	; 0x800664 <total_filament_used>
    cbf2:	10 92 65 06 	sts	0x0665, r1	; 0x800665 <total_filament_used+0x1>
    cbf6:	10 92 66 06 	sts	0x0666, r1	; 0x800666 <total_filament_used+0x2>
    cbfa:	10 92 67 06 	sts	0x0667, r1	; 0x800667 <total_filament_used+0x3>

    if (MMU2::mmu2.Enabled()) {
    cbfe:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
    cc02:	81 30       	cpi	r24, 0x01	; 1
    cc04:	81 f4       	brne	.+32     	; 0xcc26 <save_statistics()+0xb8>
        eeprom_add_dword((uint32_t *)EEPROM_MMU_MATERIAL_CHANGES, MMU2::mmu2.ToolChangeCounter());
    cc06:	60 91 bd 13 	lds	r22, 0x13BD	; 0x8013bd <MMU2::mmu2+0x73>
    cc0a:	70 91 be 13 	lds	r23, 0x13BE	; 0x8013be <MMU2::mmu2+0x74>
    cc0e:	90 e0       	ldi	r25, 0x00	; 0
    cc10:	80 e0       	ldi	r24, 0x00	; 0
    cc12:	0f 94 3c 7b 	call	0x2f678	; 0x2f678 <eeprom_add_dword(unsigned long*, unsigned long) [clone .constprop.247]>

    /// @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 <MMU2::mmu2+0x74>
    cc1a:	10 92 bd 13 	sts	0x13BD, r1	; 0x8013bd <MMU2::mmu2+0x73>

    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 <MMU2::mmu2+0x76>
    cc22:	10 92 bf 13 	sts	0x13BF, r1	; 0x8013bf <MMU2::mmu2+0x75>
        // @@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 <gcode_M123()>:
}

#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 <fanSpeed>
    cc3c:	1f 92       	push	r1
    cc3e:	8f 93       	push	r24
    cc40:	80 91 69 03 	lds	r24, 0x0369	; 0x800369 <newFanSpeed>
    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 <printf_P>
    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 <force_high_power_mode(bool)>:
    // 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 <eeprom_read_byte>
	if (silent == 1 || tmc2130_mode == TMC2130_MODE_SILENT) {
    cc9c:	81 30       	cpi	r24, 0x01	; 1
    cc9e:	21 f0       	breq	.+8      	; 0xcca8 <force_high_power_mode(bool)+0x18>
    cca0:	80 91 8b 06 	lds	r24, 0x068B	; 0x80068b <tmc2130_mode>
    cca4:	81 30       	cpi	r24, 0x01	; 1
    cca6:	29 f4       	brne	.+10     	; 0xccb2 <force_high_power_mode(bool)+0x22>
		//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 <change_power_mode_live(unsigned char)>
	}
}
    ccb2:	cf 91       	pop	r28
    ccb4:	08 95       	ret

0000ccb6 <refresh_cmd_timeout()>:
    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 <Timer<unsigned long>::start()>

0000ccbe <get_feedrate_mm_s(float)>:
	}
}
#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 <clean_up_after_endstop_move(int) [clone .lto_priv.393]>:
}

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 <saved_feedrate>
    ccd4:	50 91 65 03 	lds	r21, 0x0365	; 0x800365 <saved_feedrate+0x1>
    ccd8:	60 91 66 03 	lds	r22, 0x0366	; 0x800366 <saved_feedrate+0x2>
    ccdc:	70 91 67 03 	lds	r23, 0x0367	; 0x800367 <saved_feedrate+0x3>
    cce0:	40 93 b8 02 	sts	0x02B8, r20	; 0x8002b8 <feedrate>
    cce4:	50 93 b9 02 	sts	0x02B9, r21	; 0x8002b9 <feedrate+0x1>
    cce8:	60 93 ba 02 	sts	0x02BA, r22	; 0x8002ba <feedrate+0x2>
    ccec:	70 93 bb 02 	sts	0x02BB, r23	; 0x8002bb <feedrate+0x3>
    feedmultiply = original_feedmultiply;
    ccf0:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <feedmultiply+0x1>
    ccf4:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>
    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 <Timer<unsigned long>::start()>

0000cd00 <setup_for_endstop_move(bool) [clone .lto_priv.392]>:
  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 <feedrate>
    cd0c:	90 91 b9 02 	lds	r25, 0x02B9	; 0x8002b9 <feedrate+0x1>
    cd10:	a0 91 ba 02 	lds	r26, 0x02BA	; 0x8002ba <feedrate+0x2>
    cd14:	b0 91 bb 02 	lds	r27, 0x02BB	; 0x8002bb <feedrate+0x3>
    cd18:	80 93 64 03 	sts	0x0364, r24	; 0x800364 <saved_feedrate>
    cd1c:	90 93 65 03 	sts	0x0365, r25	; 0x800365 <saved_feedrate+0x1>
    cd20:	a0 93 66 03 	sts	0x0366, r26	; 0x800366 <saved_feedrate+0x2>
    cd24:	b0 93 67 03 	sts	0x0367, r27	; 0x800367 <saved_feedrate+0x3>
    int l_feedmultiply = feedmultiply;
    cd28:	c0 91 39 02 	lds	r28, 0x0239	; 0x800239 <feedmultiply>
    cd2c:	d0 91 3a 02 	lds	r29, 0x023A	; 0x80023a <feedmultiply+0x1>
    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 <feedmultiply+0x1>
    cd38:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>
    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 <Timer<unsigned long>::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 <factory_reset_stats() [clone .lto_priv.429]>:
    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 <eeprom_update_dword>
    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 <eeprom_update_dword>

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 <failstats_reset_print()>
        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 <eeprom_update_word>
    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 <eeprom_update_word>
    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 <eeprom_update_word>
    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 <eeprom_update_word>
    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 <eeprom_update_word>
    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 <eeprom_update_word>
        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 <eeprom_update_dword>

0000cdc8 <softReset>:
      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 <softReset+0x16>

0000cde0 <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>:
#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>
    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 <xfdump_full_dump_and_reset(dump_crash_reason)>
#elif defined(EMERGENCY_SERIAL_DUMP)
    if(emergency_serial_dump)
        serial_dump_and_reset(reason);
#endif
    softReset();
    ce02:	0e 94 e4 66 	call	0xcdc8	; 0xcdc8 <softReset>

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 <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>

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 <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>

0000ce26 <printer_recovering()>:
}
#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 <eeprom_read_byte>
    ce2e:	91 e0       	ldi	r25, 0x01	; 1
    ce30:	81 11       	cpse	r24, r1
    ce32:	01 c0       	rjmp	.+2      	; 0xce36 <printer_recovering()+0x10>
    ce34:	90 e0       	ldi	r25, 0x00	; 0
}
    ce36:	89 2f       	mov	r24, r25
    ce38:	08 95       	ret

0000ce3a <printingIsPaused()>:
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 <did_pause_print>
    ce3e:	81 11       	cpse	r24, r1
    ce40:	06 c0       	rjmp	.+12     	; 0xce4e <printingIsPaused()+0x14>
    ce42:	81 e0       	ldi	r24, 0x01	; 1
    ce44:	90 91 9b 03 	lds	r25, 0x039B	; 0x80039b <Stopwatch::state>
    ce48:	92 30       	cpi	r25, 0x02	; 2
    ce4a:	09 f0       	breq	.+2      	; 0xce4e <printingIsPaused()+0x14>
    ce4c:	80 e0       	ldi	r24, 0x00	; 0
}
    ce4e:	08 95       	ret

0000ce50 <printJobOngoing()>:
    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 <card+0x2>
    ce54:	81 11       	cpse	r24, r1
    ce56:	0a c0       	rjmp	.+20     	; 0xce6c <printJobOngoing()+0x1c>
    ce58:	80 91 0d 05 	lds	r24, 0x050D	; 0x80050d <usb_timer>
    ce5c:	81 11       	cpse	r24, r1
    ce5e:	06 c0       	rjmp	.+12     	; 0xce6c <printJobOngoing()+0x1c>
    ce60:	81 e0       	ldi	r24, 0x01	; 1
    ce62:	90 91 9b 03 	lds	r25, 0x039B	; 0x80039b <Stopwatch::state>
    ce66:	91 30       	cpi	r25, 0x01	; 1
    ce68:	09 f0       	breq	.+2      	; 0xce6c <printJobOngoing()+0x1c>
    ce6a:	80 e0       	ldi	r24, 0x00	; 0
}
    ce6c:	08 95       	ret

0000ce6e <babystep_allowed()>:
        && !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 <homing_flag>
        && !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 <babystep_allowed()+0x4a>
        && e_active();
}

bool __attribute__((noinline)) babystep_allowed() {
    return ( !homing_flag
        && !mesh_bed_leveling_flag
    ce7a:	80 91 a7 0d 	lds	r24, 0x0DA7	; 0x800da7 <mesh_bed_leveling_flag>
    ce7e:	81 11       	cpse	r24, r1
    ce80:	1c c0       	rjmp	.+56     	; 0xceba <babystep_allowed()+0x4c>
        && !printingIsPaused()
    ce82:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
    ce86:	81 11       	cpse	r24, r1
    ce88:	18 c0       	rjmp	.+48     	; 0xceba <babystep_allowed()+0x4c>
        && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS)
    ce8a:	d0 91 b3 0d 	lds	r29, 0x0DB3	; 0x800db3 <lcd_commands_type>
    ce8e:	d4 30       	cpi	r29, 0x04	; 4
    ce90:	61 f4       	brne	.+24     	; 0xceaa <babystep_allowed()+0x3c>
    ce92:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
    ce96:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
    ce9a:	89 2b       	or	r24, r25
    ce9c:	91 f4       	brne	.+36     	; 0xcec2 <babystep_allowed()+0x54>
    ce9e:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
    cea2:	90 91 72 06 	lds	r25, 0x0672	; 0x800672 <target_temperature_bed+0x1>
    cea6:	89 2b       	or	r24, r25
    cea8:	61 f4       	brne	.+24     	; 0xcec2 <babystep_allowed()+0x54>
            || printJobOngoing()
    ceaa:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
    ceae:	c8 2f       	mov	r28, r24
    ceb0:	81 11       	cpse	r24, r1
    ceb2:	03 c0       	rjmp	.+6      	; 0xceba <babystep_allowed()+0x4c>
            || 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 <babystep_allowed()+0x4c>

0000cec6 <babystep_allowed_strict()>:
        )
    );
}

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 <babystep_allowed()>
    ceca:	88 23       	and	r24, r24
    cecc:	89 f0       	breq	.+34     	; 0xcef0 <babystep_allowed_strict()+0x2a>
    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 <current_position+0x8>
    ceda:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
    cede:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
    cee2:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
    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 <printer_active()>:
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 <printJobOngoing()>
        || 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 <printer_active()+0x38>
  return did_pause_print || print_job_timer.isPaused();
}

bool __attribute__((noinline)) printer_active() {
    return printJobOngoing()
        || printingIsPaused()
    cefa:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
    cefe:	81 11       	cpse	r24, r1
    cf00:	14 c0       	rjmp	.+40     	; 0xcf2a <printer_active()+0x38>
        || saved_printing
    cf02:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
    cf06:	81 11       	cpse	r24, r1
    cf08:	10 c0       	rjmp	.+32     	; 0xcf2a <printer_active()+0x38>
        || (lcd_commands_type != LcdCommands::Idle)
    cf0a:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
    cf0e:	81 11       	cpse	r24, r1
    cf10:	0b c0       	rjmp	.+22     	; 0xcf28 <printer_active()+0x36>
        || MMU2::mmu2.MMU_PRINT_SAVED()
    cf12:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
    cf16:	81 11       	cpse	r24, r1
    cf18:	07 c0       	rjmp	.+14     	; 0xcf28 <printer_active()+0x36>
        || homing_flag
    cf1a:	80 91 a6 0d 	lds	r24, 0x0DA6	; 0x800da6 <homing_flag>
    cf1e:	81 11       	cpse	r24, r1
    cf20:	04 c0       	rjmp	.+8      	; 0xcf2a <printer_active()+0x38>
        || mesh_bed_leveling_flag;
    cf22:	80 91 a7 0d 	lds	r24, 0x0DA7	; 0x800da7 <mesh_bed_leveling_flag>
    cf26:	08 95       	ret
    cf28:	81 e0       	ldi	r24, 0x01	; 1
}
    cf2a:	08 95       	ret

0000cf2c <MotorCurrents::setiHold(unsigned char)>:
        // 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 <MotorCurrents::setiHold(unsigned char)+0xa>
    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 <MotorCurrents::setiRun(unsigned char)>:
    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 <MotorCurrents::setiRun(unsigned char)+0xc>
    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 <MotorCurrents::setiRun(unsigned char)+0x32>
    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 <MotorCurrents::setiRun(unsigned char)+0x2c>
                // 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 <MotorCurrents::setiRun(unsigned char)+0x28>
            }

            // Update vSense
            vSense = newvSense;
        } else if (!vSense) {
    cf6e:	21 11       	cpse	r18, r1
    cf70:	04 c0       	rjmp	.+8      	; 0xcf7a <MotorCurrents::setiRun(unsigned char)+0x3e>
            // 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 <code_seen_P(char const*) [clone .lto_priv.437]>:
}
#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 <bufindr>
    cf80:	30 91 92 12 	lds	r19, 0x1292	; 0x801292 <bufindr+0x1>
    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 <strstr_P>
    cf90:	9c 01       	movw	r18, r24
    cf92:	90 93 94 03 	sts	0x0394, r25	; 0x800394 <strchr_pointer+0x1>
    cf96:	80 93 93 03 	sts	0x0393, r24	; 0x800393 <strchr_pointer>
    cf9a:	81 e0       	ldi	r24, 0x01	; 1
    cf9c:	23 2b       	or	r18, r19
    cf9e:	09 f4       	brne	.+2      	; 0xcfa2 <code_seen_P(char const*) [clone .lto_priv.437]+0x26>
    cfa0:	80 e0       	ldi	r24, 0x00	; 0
    cfa2:	08 95       	ret

0000cfa4 <set_destination_to_current()>:
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 <set_destination_to_current()+0xa>
    cfb6:	08 95       	ret

0000cfb8 <restore_print_from_ram_and_continue(float)>:
//!
//! 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 <restore_print_from_ram_and_continue(float)+0x22>
    cfda:	00 d0       	rcall	.+0      	; 0xcfdc <restore_print_from_ram_and_continue(float)+0x24>
    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 <saved_printing>
    cfe8:	22 23       	and	r18, r18
    cfea:	09 f4       	brne	.+2      	; 0xcfee <restore_print_from_ram_and_continue(float)+0x36>
    cfec:	73 c1       	rjmp	.+742    	; 0xd2d4 <restore_print_from_ram_and_continue(float)+0x31c>

#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 <fan_check_error>
    cff2:	22 30       	cpi	r18, 0x02	; 2
    cff4:	09 f4       	brne	.+2      	; 0xcff8 <restore_print_from_ram_and_continue(float)+0x40>
    cff6:	6e c1       	rjmp	.+732    	; 0xd2d4 <restore_print_from_ram_and_continue(float)+0x31c>
    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 <fan_check_error>
    cffc:	21 30       	cpi	r18, 0x01	; 1
    cffe:	11 f4       	brne	.+4      	; 0xd004 <restore_print_from_ram_and_continue(float)+0x4c>
    d000:	10 92 e4 03 	sts	0x03E4, r1	; 0x8003e4 <fan_check_error>
    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 <fanSpeed>

    // 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 <saved_bed_temperature>
    d010:	60 91 ed 04 	lds	r22, 0x04ED	; 0x8004ed <current_temperature_bed>
    d014:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
    d018:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
    d01c:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
    d020:	0f 94 b0 de 	call	0x3bd60	; 0x3bd60 <__fixunssfsi>
    d024:	61 17       	cp	r22, r17
    d026:	31 f0       	breq	.+12     	; 0xd034 <restore_print_from_ram_and_continue(float)+0x7c>
  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 <target_temperature_bed+0x1>
    d030:	80 93 71 06 	sts	0x0671, r24	; 0x800671 <target_temperature_bed>
        setTargetBed(saved_bed_temperature);
    restore_extruder_temperature_from_ram();
    d034:	0e 94 61 64 	call	0xc8c2	; 0xc8c2 <restore_extruder_temperature_from_ram()>

    // Restore saved fan speed
    fanSpeed = saved_fan_speed;
    d038:	80 91 aa 05 	lds	r24, 0x05AA	; 0x8005aa <saved_fan_speed>
    d03c:	80 93 e5 03 	sts	0x03E5, r24	; 0x8003e5 <fanSpeed>
    axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
    d040:	90 91 e3 03 	lds	r25, 0x03E3	; 0x8003e3 <axis_relative_modes>
    d044:	80 91 63 05 	lds	r24, 0x0563	; 0x800563 <saved_extruder_relative_mode>
    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 <axis_relative_modes>
    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 <saved_pos+0xc>
    d05c:	70 91 80 02 	lds	r23, 0x0280	; 0x800280 <saved_pos+0xd>
    d060:	80 91 81 02 	lds	r24, 0x0281	; 0x800281 <saved_pos+0xe>
    d064:	90 91 82 02 	lds	r25, 0x0282	; 0x800282 <saved_pos+0xf>
    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 <plan_set_e_position(float const&)>

  #ifdef FANCHECK
    fans_check_enabled = false;
    d07c:	10 92 38 02 	sts	0x0238, r1	; 0x800238 <fans_check_enabled>
  #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 <saved_pos>
    d08c:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
    d090:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
    d094:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
    d098:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
    d09c:	81 11       	cpse	r24, r1
    d09e:	20 c0       	rjmp	.+64     	; 0xd0e0 <restore_print_from_ram_and_continue(float)+0x128>
    {
        saved_pos[X_AXIS] = current_position[X_AXIS];
    d0a0:	80 91 91 06 	lds	r24, 0x0691	; 0x800691 <current_position>
    d0a4:	90 91 92 06 	lds	r25, 0x0692	; 0x800692 <current_position+0x1>
    d0a8:	a0 91 93 06 	lds	r26, 0x0693	; 0x800693 <current_position+0x2>
    d0ac:	b0 91 94 06 	lds	r27, 0x0694	; 0x800694 <current_position+0x3>
    d0b0:	80 93 73 02 	sts	0x0273, r24	; 0x800273 <saved_pos>
    d0b4:	90 93 74 02 	sts	0x0274, r25	; 0x800274 <saved_pos+0x1>
    d0b8:	a0 93 75 02 	sts	0x0275, r26	; 0x800275 <saved_pos+0x2>
    d0bc:	b0 93 76 02 	sts	0x0276, r27	; 0x800276 <saved_pos+0x3>
        saved_pos[Y_AXIS] = current_position[Y_AXIS];
    d0c0:	80 91 95 06 	lds	r24, 0x0695	; 0x800695 <current_position+0x4>
    d0c4:	90 91 96 06 	lds	r25, 0x0696	; 0x800696 <current_position+0x5>
    d0c8:	a0 91 97 06 	lds	r26, 0x0697	; 0x800697 <current_position+0x6>
    d0cc:	b0 91 98 06 	lds	r27, 0x0698	; 0x800698 <current_position+0x7>
    d0d0:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <saved_pos+0x4>
    d0d4:	90 93 78 02 	sts	0x0278, r25	; 0x800278 <saved_pos+0x5>
    d0d8:	a0 93 79 02 	sts	0x0279, r26	; 0x800279 <saved_pos+0x6>
    d0dc:	b0 93 7a 02 	sts	0x027A, r27	; 0x80027a <saved_pos+0x7>
    }

	//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 <saved_pos+0xc>
    d0e8:	70 91 80 02 	lds	r23, 0x0280	; 0x800280 <saved_pos+0xd>
    d0ec:	80 91 81 02 	lds	r24, 0x0281	; 0x800281 <saved_pos+0xe>
    d0f0:	90 91 82 02 	lds	r25, 0x0282	; 0x800282 <saved_pos+0xf>
    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 <current_position+0x8>
    d104:	f0 90 9a 06 	lds	r15, 0x069A	; 0x80069a <current_position+0x9>
    d108:	00 91 9b 06 	lds	r16, 0x069B	; 0x80069b <current_position+0xa>
    d10c:	10 91 9c 06 	lds	r17, 0x069C	; 0x80069c <current_position+0xb>
    d110:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <saved_pos+0x4>
    d114:	30 91 78 02 	lds	r19, 0x0278	; 0x800278 <saved_pos+0x5>
    d118:	40 91 79 02 	lds	r20, 0x0279	; 0x800279 <saved_pos+0x6>
    d11c:	50 91 7a 02 	lds	r21, 0x027A	; 0x80027a <saved_pos+0x7>
    d120:	60 91 73 02 	lds	r22, 0x0273	; 0x800273 <saved_pos>
    d124:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
    d128:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
    d12c:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
	//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 <saved_pos+0xc>
    d15a:	70 91 80 02 	lds	r23, 0x0280	; 0x800280 <saved_pos+0xd>
    d15e:	80 91 81 02 	lds	r24, 0x0281	; 0x800281 <saved_pos+0xe>
    d162:	90 91 82 02 	lds	r25, 0x0282	; 0x800282 <saved_pos+0xf>
    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 <saved_pos+0x8>
    d176:	f0 90 7c 02 	lds	r15, 0x027C	; 0x80027c <saved_pos+0x9>
    d17a:	00 91 7d 02 	lds	r16, 0x027D	; 0x80027d <saved_pos+0xa>
    d17e:	10 91 7e 02 	lds	r17, 0x027E	; 0x80027e <saved_pos+0xb>
    d182:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <saved_pos+0x4>
    d186:	30 91 78 02 	lds	r19, 0x0278	; 0x800278 <saved_pos+0x5>
    d18a:	40 91 79 02 	lds	r20, 0x0279	; 0x800279 <saved_pos+0x6>
    d18e:	50 91 7a 02 	lds	r21, 0x027A	; 0x80027a <saved_pos+0x7>
    d192:	60 91 73 02 	lds	r22, 0x0273	; 0x800273 <saved_pos>
    d196:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
    d19a:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
    d19e:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
	//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 <saved_pos+0x8>
    d1b2:	f0 90 7c 02 	lds	r15, 0x027C	; 0x80027c <saved_pos+0x9>
    d1b6:	00 91 7d 02 	lds	r16, 0x027D	; 0x80027d <saved_pos+0xa>
    d1ba:	10 91 7e 02 	lds	r17, 0x027E	; 0x80027e <saved_pos+0xb>
    d1be:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <saved_pos+0x4>
    d1c2:	30 91 78 02 	lds	r19, 0x0278	; 0x800278 <saved_pos+0x5>
    d1c6:	40 91 79 02 	lds	r20, 0x0279	; 0x800279 <saved_pos+0x6>
    d1ca:	50 91 7a 02 	lds	r21, 0x027A	; 0x80027a <saved_pos+0x7>
    d1ce:	60 91 73 02 	lds	r22, 0x0273	; 0x800273 <saved_pos>
    d1d2:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
    d1d6:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
    d1da:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
	st_synchronize();
    d1fe:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

  #ifdef FANCHECK
    fans_check_enabled = true;
    d202:	11 e0       	ldi	r17, 0x01	; 1
    d204:	10 93 38 02 	sts	0x0238, r17	; 0x800238 <fans_check_enabled>
  #endif

    // restore original feedrate/feedmultiply _after_ restoring the extruder position
	feedrate = saved_feedrate2;
    d208:	60 91 5d 05 	lds	r22, 0x055D	; 0x80055d <saved_feedrate2>
    d20c:	70 91 5e 05 	lds	r23, 0x055E	; 0x80055e <saved_feedrate2+0x1>
    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 <feedrate>
    d21c:	70 93 b9 02 	sts	0x02B9, r23	; 0x8002b9 <feedrate+0x1>
    d220:	80 93 ba 02 	sts	0x02BA, r24	; 0x8002ba <feedrate+0x2>
    d224:	90 93 bb 02 	sts	0x02BB, r25	; 0x8002bb <feedrate+0x3>
	feedmultiply = saved_feedmultiply2;
    d228:	80 91 6f 03 	lds	r24, 0x036F	; 0x80036f <saved_feedmultiply2>
    d22c:	90 91 70 03 	lds	r25, 0x0370	; 0x800370 <saved_feedmultiply2+0x1>
    d230:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <feedmultiply+0x1>
    d234:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>

	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 <restore_print_from_ram_and_continue(float)+0x28a>
	set_destination_to_current();
    d24a:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
        //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 <saved_printing_type>
    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 <restore_print_from_ram_and_continue(float)+0x34a>
        card.setIndex(saved_sdpos);
    d260:	60 91 5f 05 	lds	r22, 0x055F	; 0x80055f <saved_sdpos>
    d264:	70 91 60 05 	lds	r23, 0x0560	; 0x800560 <saved_sdpos+0x1>
    d268:	80 91 61 05 	lds	r24, 0x0561	; 0x800561 <saved_sdpos+0x2>
    d26c:	90 91 62 05 	lds	r25, 0x0562	; 0x800562 <saved_sdpos+0x3>
  {
      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 <card+0x316>
    d274:	70 93 a4 17 	sts	0x17A4, r23	; 0x8017a4 <card+0x317>
    d278:	80 93 a5 17 	sts	0x17A5, r24	; 0x8017a5 <card+0x318>
    d27c:	90 93 a6 17 	sts	0x17A6, r25	; 0x8017a6 <card+0x319>
    d280:	0f 94 93 76 	call	0x2ed26	; 0x2ed26 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]>
        sdpos_atomic = saved_sdpos;
    d284:	80 91 5f 05 	lds	r24, 0x055F	; 0x80055f <saved_sdpos>
    d288:	90 91 60 05 	lds	r25, 0x0560	; 0x800560 <saved_sdpos+0x1>
    d28c:	a0 91 61 05 	lds	r26, 0x0561	; 0x800561 <saved_sdpos+0x2>
    d290:	b0 91 62 05 	lds	r27, 0x0562	; 0x800562 <saved_sdpos+0x3>
    d294:	80 93 80 03 	sts	0x0380, r24	; 0x800380 <sdpos_atomic>
    d298:	90 93 81 03 	sts	0x0381, r25	; 0x800381 <sdpos_atomic+0x1>
    d29c:	a0 93 82 03 	sts	0x0382, r26	; 0x800382 <sdpos_atomic+0x2>
    d2a0:	b0 93 83 03 	sts	0x0383, r27	; 0x800383 <sdpos_atomic+0x3>
        card.sdprinting = true;
    d2a4:	10 93 8f 14 	sts	0x148F, r17	; 0x80148f <card+0x2>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>
	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 <lcd_setstatuspgm(char const*)>
    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_type>
	saved_printing = false;
    d2ca:	10 92 a8 0d 	sts	0x0DA8, r1	; 0x800da8 <saved_printing>
    planner_aborted = true; // unroll the stack
    d2ce:	81 e0       	ldi	r24, 0x01	; 1
    d2d0:	80 93 ab 0d 	sts	0x0DAB, r24	; 0x800dab <planner_aborted>
}
    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 <restore_print_from_ram_and_continue(float)+0x2f0>
        gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing
    d306:	80 91 5f 05 	lds	r24, 0x055F	; 0x80055f <saved_sdpos>
    d30a:	90 91 60 05 	lds	r25, 0x0560	; 0x800560 <saved_sdpos+0x1>
    d30e:	a0 91 61 05 	lds	r26, 0x0561	; 0x800561 <saved_sdpos+0x2>
    d312:	b0 91 62 05 	lds	r27, 0x0562	; 0x800562 <saved_sdpos+0x3>
    d316:	80 93 78 03 	sts	0x0378, r24	; 0x800378 <gcode_LastN>
    d31a:	90 93 79 03 	sts	0x0379, r25	; 0x800379 <gcode_LastN+0x1>
    d31e:	a0 93 7a 03 	sts	0x037A, r26	; 0x80037a <gcode_LastN+0x2>
    d322:	b0 93 7b 03 	sts	0x037B, r27	; 0x80037b <gcode_LastN+0x3>
        serial_count = 0;
    d326:	10 92 9e 10 	sts	0x109E, r1	; 0x80109e <serial_count+0x1>
    d32a:	10 92 9d 10 	sts	0x109D, r1	; 0x80109d <serial_count>
        FlushSerialRequestResend();
    d32e:	0e 94 25 5b 	call	0xb64a	; 0xb64a <FlushSerialRequestResend()>
    d332:	ba cf       	rjmp	.-140    	; 0xd2a8 <restore_print_from_ram_and_continue(float)+0x2f0>

0000d334 <world2machine(float&, float&)>:
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 <world2machine_correction_mode>
    d35a:	33 20       	and	r3, r3
    d35c:	09 f4       	brne	.+2      	; 0xd360 <world2machine(float&, float&)+0x2c>
    d35e:	80 c0       	rjmp	.+256    	; 0xd460 <world2machine(float&, float&)+0x12c>
    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 <world2machine(float&, float&)+0xdc>
			// 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 <world2machine_rotation_and_skew+0x8>
    d37e:	30 91 e4 17 	lds	r19, 0x17E4	; 0x8017e4 <world2machine_rotation_and_skew+0x9>
    d382:	40 91 e5 17 	lds	r20, 0x17E5	; 0x8017e5 <world2machine_rotation_and_skew+0xa>
    d386:	50 91 e6 17 	lds	r21, 0x17E6	; 0x8017e6 <world2machine_rotation_and_skew+0xb>
    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 <world2machine_rotation_and_skew+0xc>
    d39a:	30 91 e8 17 	lds	r19, 0x17E8	; 0x8017e8 <world2machine_rotation_and_skew+0xd>
    d39e:	40 91 e9 17 	lds	r20, 0x17E9	; 0x8017e9 <world2machine_rotation_and_skew+0xe>
    d3a2:	50 91 ea 17 	lds	r21, 0x17EA	; 0x8017ea <world2machine_rotation_and_skew+0xf>
    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 <world2machine_rotation_and_skew>
    d3c2:	30 91 dc 17 	lds	r19, 0x17DC	; 0x8017dc <world2machine_rotation_and_skew+0x1>
    d3c6:	40 91 dd 17 	lds	r20, 0x17DD	; 0x8017dd <world2machine_rotation_and_skew+0x2>
    d3ca:	50 91 de 17 	lds	r21, 0x17DE	; 0x8017de <world2machine_rotation_and_skew+0x3>
    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 <world2machine_rotation_and_skew+0x4>
    d3de:	30 91 e0 17 	lds	r19, 0x17E0	; 0x8017e0 <world2machine_rotation_and_skew+0x5>
    d3e2:	40 91 e1 17 	lds	r20, 0x17E1	; 0x8017e1 <world2machine_rotation_and_skew+0x6>
    d3e6:	50 91 e2 17 	lds	r21, 0x17E2	; 0x8017e2 <world2machine_rotation_and_skew+0x7>
    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 <world2machine(float&, float&)+0x12c>
			// Then add the offset.
			x += world2machine_shift[0];
    d414:	20 91 06 18 	lds	r18, 0x1806	; 0x801806 <world2machine_shift>
    d418:	30 91 07 18 	lds	r19, 0x1807	; 0x801807 <world2machine_shift+0x1>
    d41c:	40 91 08 18 	lds	r20, 0x1808	; 0x801808 <world2machine_shift+0x2>
    d420:	50 91 09 18 	lds	r21, 0x1809	; 0x801809 <world2machine_shift+0x3>
    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 <world2machine_shift+0x4>
    d43c:	30 91 0b 18 	lds	r19, 0x180B	; 0x80180b <world2machine_shift+0x5>
    d440:	40 91 0c 18 	lds	r20, 0x180C	; 0x80180c <world2machine_shift+0x6>
    d444:	50 91 0d 18 	lds	r21, 0x180D	; 0x80180d <world2machine_shift+0x7>
    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 <world2machine_clamp(float&, float&)>:
		}
	}
}

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 <world2machine_clamp(float&, float&)+0x26>
    d4aa:	00 d0       	rcall	.+0      	; 0xd4ac <world2machine_clamp(float&, float&)+0x28>
    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 <world2machine(float&, float&)>
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 <world2machine_clamp(float&, float&)+0xea>
        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 <world2machine_clamp(float&, float&)+0x112>
        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 <world2machine_correction_mode>
    d550:	71 10       	cpse	r7, r1
    d552:	4c c0       	rjmp	.+152    	; 0xd5ec <world2machine_clamp(float&, float&)+0x168>
		// 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 <world2machine_clamp(float&, float&)+0x134>
	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 <world2machine_clamp(float&, float&)+0x8c>
        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 <world2machine_clamp(float&, float&)+0x88>
    }

    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 <world2machine_clamp(float&, float&)+0x130>
        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 <world2machine_clamp(float&, float&)+0xb0>
        clamped = true;
    }
    if (clamped)
    d5b4:	f1 10       	cpse	r15, r1
    d5b6:	c2 cf       	rjmp	.-124    	; 0xd53c <world2machine_clamp(float&, float&)+0xb8>
        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 <world2machine_clamp(float&, float&)+0x1a4>
			// Then add the offset.
			x -= world2machine_shift[0];
    d5f0:	20 91 06 18 	lds	r18, 0x1806	; 0x801806 <world2machine_shift>
    d5f4:	30 91 07 18 	lds	r19, 0x1807	; 0x801807 <world2machine_shift+0x1>
    d5f8:	40 91 08 18 	lds	r20, 0x1808	; 0x801808 <world2machine_shift+0x2>
    d5fc:	50 91 09 18 	lds	r21, 0x1809	; 0x801809 <world2machine_shift+0x3>
    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 <world2machine_shift+0x4>
    d610:	30 91 0b 18 	lds	r19, 0x180B	; 0x80180b <world2machine_shift+0x5>
    d614:	40 91 0c 18 	lds	r20, 0x180C	; 0x80180c <world2machine_shift+0x6>
    d618:	50 91 0d 18 	lds	r21, 0x180D	; 0x80180d <world2machine_shift+0x7>
    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 <world2machine_clamp(float&, float&)+0xe4>
			// 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 <world2machine_rotation_and_skew_inv>
    d630:	30 91 f7 17 	lds	r19, 0x17F7	; 0x8017f7 <world2machine_rotation_and_skew_inv+0x1>
    d634:	40 91 f8 17 	lds	r20, 0x17F8	; 0x8017f8 <world2machine_rotation_and_skew_inv+0x2>
    d638:	50 91 f9 17 	lds	r21, 0x17F9	; 0x8017f9 <world2machine_rotation_and_skew_inv+0x3>
    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 <world2machine_rotation_and_skew_inv+0x4>
    d64c:	30 91 fb 17 	lds	r19, 0x17FB	; 0x8017fb <world2machine_rotation_and_skew_inv+0x5>
    d650:	40 91 fc 17 	lds	r20, 0x17FC	; 0x8017fc <world2machine_rotation_and_skew_inv+0x6>
    d654:	50 91 fd 17 	lds	r21, 0x17FD	; 0x8017fd <world2machine_rotation_and_skew_inv+0x7>
    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 <world2machine_rotation_and_skew_inv+0x8>
    d67a:	30 91 ff 17 	lds	r19, 0x17FF	; 0x8017ff <world2machine_rotation_and_skew_inv+0x9>
    d67e:	40 91 00 18 	lds	r20, 0x1800	; 0x801800 <world2machine_rotation_and_skew_inv+0xa>
    d682:	50 91 01 18 	lds	r21, 0x1801	; 0x801801 <world2machine_rotation_and_skew_inv+0xb>
    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 <world2machine_rotation_and_skew_inv+0xc>
    d696:	30 91 03 18 	lds	r19, 0x1803	; 0x801803 <world2machine_rotation_and_skew_inv+0xd>
    d69a:	40 91 04 18 	lds	r20, 0x1804	; 0x801804 <world2machine_rotation_and_skew_inv+0xe>
    d69e:	50 91 05 18 	lds	r21, 0x1805	; 0x801805 <world2machine_rotation_and_skew_inv+0xf>
    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 <world2machine_clamp(float&, float&)+0xe4>

0000d6c2 <clamp_to_software_endstops(float*)>:
    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 <world2machine_clamp(float&, float&)>

    // 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 <min_pos+0x8>
    d6de:	d0 90 2a 02 	lds	r13, 0x022A	; 0x80022a <min_pos+0x9>
    d6e2:	e0 90 2b 02 	lds	r14, 0x022B	; 0x80022b <min_pos+0xa>
    d6e6:	f0 90 2c 02 	lds	r15, 0x022C	; 0x80022c <min_pos+0xb>
    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 <clamp_to_software_endstops(float*)+0x44>
    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 <max_pos+0x8>
    d70a:	d0 90 1e 02 	lds	r13, 0x021E	; 0x80021e <max_pos+0x9>
    d70e:	e0 90 1f 02 	lds	r14, 0x021F	; 0x80021f <max_pos+0xa>
    d712:	f0 90 20 02 	lds	r15, 0x0220	; 0x800220 <max_pos+0xb>
    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 <clamp_to_software_endstops(float*)+0x70>
    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 <prepare_move(unsigned int)>:
        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 <clamp_to_software_endstops(float*)>
  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 <Timer<unsigned long>::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 <current_position>
    d78a:	50 90 92 06 	lds	r5, 0x0692	; 0x800692 <current_position+0x1>
    d78e:	60 90 93 06 	lds	r6, 0x0693	; 0x800693 <current_position+0x2>
    d792:	70 90 94 06 	lds	r7, 0x0694	; 0x800694 <current_position+0x3>
    d796:	c0 90 73 06 	lds	r12, 0x0673	; 0x800673 <destination>
    d79a:	d0 90 74 06 	lds	r13, 0x0674	; 0x800674 <destination+0x1>
    d79e:	e0 90 75 06 	lds	r14, 0x0675	; 0x800675 <destination+0x2>
    d7a2:	f0 90 76 06 	lds	r15, 0x0676	; 0x800676 <destination+0x3>
    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 <prepare_move(unsigned int)+0xf4>
    d7b6:	20 91 77 06 	lds	r18, 0x0677	; 0x800677 <destination+0x4>
    d7ba:	30 91 78 06 	lds	r19, 0x0678	; 0x800678 <destination+0x5>
    d7be:	40 91 79 06 	lds	r20, 0x0679	; 0x800679 <destination+0x6>
    d7c2:	50 91 7a 06 	lds	r21, 0x067A	; 0x80067a <destination+0x7>
    d7c6:	60 91 95 06 	lds	r22, 0x0695	; 0x800695 <current_position+0x4>
    d7ca:	70 91 96 06 	lds	r23, 0x0696	; 0x800696 <current_position+0x5>
    d7ce:	80 91 97 06 	lds	r24, 0x0697	; 0x800697 <current_position+0x6>
    d7d2:	90 91 98 06 	lds	r25, 0x0698	; 0x800698 <current_position+0x7>
    d7d6:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
    d7da:	81 11       	cpse	r24, r1
    d7dc:	2b c0       	rjmp	.+86     	; 0xd834 <prepare_move(unsigned int)+0xf4>
      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 <feedrate>
    d7ea:	70 91 b9 02 	lds	r23, 0x02B9	; 0x8002b9 <feedrate+0x1>
    d7ee:	80 91 ba 02 	lds	r24, 0x02BA	; 0x8002ba <feedrate+0x2>
    d7f2:	90 91 bb 02 	lds	r25, 0x02BB	; 0x8002bb <feedrate+0x3>
    d7f6:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
    d7fa:	0f 94 0a c0 	call	0x38014	; 0x38014 <plan_buffer_line_destinationXYZE(float)>
#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 <set_current_to_destination()>
}
    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 <feedmultiply>
    d838:	70 91 3a 02 	lds	r23, 0x023A	; 0x80023a <feedmultiply+0x1>
    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 <feedrate>
    d84c:	30 91 b9 02 	lds	r19, 0x02B9	; 0x8002b9 <feedrate+0x1>
    d850:	40 91 ba 02 	lds	r20, 0x02BA	; 0x8002ba <feedrate+0x2>
    d854:	50 91 bb 02 	lds	r21, 0x02BB	; 0x8002bb <feedrate+0x3>
    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 <mbl>
    d874:	88 23       	and	r24, r24
    d876:	09 f4       	brne	.+2      	; 0xd87a <prepare_move(unsigned int)+0x13a>
    d878:	0f c1       	rjmp	.+542    	; 0xda98 <prepare_move(unsigned int)+0x358>
        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 <current_position+0x4>
    d88e:	30 91 96 06 	lds	r19, 0x0696	; 0x800696 <current_position+0x5>
    d892:	40 91 97 06 	lds	r20, 0x0697	; 0x800697 <current_position+0x6>
    d896:	50 91 98 06 	lds	r21, 0x0698	; 0x800698 <current_position+0x7>
    d89a:	60 91 77 06 	lds	r22, 0x0677	; 0x800677 <destination+0x4>
    d89e:	70 91 78 06 	lds	r23, 0x0678	; 0x800678 <destination+0x5>
    d8a2:	80 91 79 06 	lds	r24, 0x0679	; 0x800679 <destination+0x6>
    d8a6:	90 91 7a 06 	lds	r25, 0x067A	; 0x80067a <destination+0x7>
    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 <prepare_move(unsigned int)+0x19e>
    d8dc:	dd c0       	rjmp	.+442    	; 0xda98 <prepare_move(unsigned int)+0x358>
                // 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 <ceil>
    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 <prepare_move(unsigned int)+0x1c2>
    d900:	cb c0       	rjmp	.+406    	; 0xda98 <prepare_move(unsigned int)+0x358>
    d902:	21 14       	cp	r2, r1
    d904:	31 04       	cpc	r3, r1
    d906:	09 f4       	brne	.+2      	; 0xd90a <prepare_move(unsigned int)+0x1ca>
    d908:	c7 c0       	rjmp	.+398    	; 0xda98 <prepare_move(unsigned int)+0x358>

            float dz = z - current_position[Z_AXIS];
    d90a:	20 91 99 06 	lds	r18, 0x0699	; 0x800699 <current_position+0x8>
    d90e:	30 91 9a 06 	lds	r19, 0x069A	; 0x80069a <current_position+0x9>
    d912:	40 91 9b 06 	lds	r20, 0x069B	; 0x80069b <current_position+0xa>
    d916:	50 91 9c 06 	lds	r21, 0x069C	; 0x80069c <current_position+0xb>
    d91a:	60 91 7b 06 	lds	r22, 0x067B	; 0x80067b <destination+0x8>
    d91e:	70 91 7c 06 	lds	r23, 0x067C	; 0x80067c <destination+0x9>
    d922:	80 91 7d 06 	lds	r24, 0x067D	; 0x80067d <destination+0xa>
    d926:	90 91 7e 06 	lds	r25, 0x067E	; 0x80067e <destination+0xb>
    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 <current_position+0xc>
    d93a:	30 91 9e 06 	lds	r19, 0x069E	; 0x80069e <current_position+0xd>
    d93e:	40 91 9f 06 	lds	r20, 0x069F	; 0x80069f <current_position+0xe>
    d942:	50 91 a0 06 	lds	r21, 0x06A0	; 0x8006a0 <current_position+0xf>
    d946:	60 91 7f 06 	lds	r22, 0x067F	; 0x80067f <destination+0xc>
    d94a:	70 91 80 06 	lds	r23, 0x0680	; 0x800680 <destination+0xd>
    d94e:	80 91 81 06 	lds	r24, 0x0681	; 0x800681 <destination+0xe>
    d952:	90 91 82 06 	lds	r25, 0x0682	; 0x800682 <destination+0xf>
    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 <prepare_move(unsigned int)+0x240>
    d97e:	8c c0       	rjmp	.+280    	; 0xda98 <prepare_move(unsigned int)+0x358>
                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 <current_position+0xc>
    d9c2:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
    d9c6:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
    d9ca:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
    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 <current_position+0x8>
    d9ee:	30 91 9a 06 	lds	r19, 0x069A	; 0x80069a <current_position+0x9>
    d9f2:	40 91 9b 06 	lds	r20, 0x069B	; 0x80069b <current_position+0xa>
    d9f6:	50 91 9c 06 	lds	r21, 0x069C	; 0x80069c <current_position+0xb>
    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 <current_position+0x4>
    da1a:	30 91 96 06 	lds	r19, 0x0696	; 0x800696 <current_position+0x5>
    da1e:	40 91 97 06 	lds	r20, 0x0697	; 0x800697 <current_position+0x6>
    da22:	50 91 98 06 	lds	r21, 0x0698	; 0x800698 <current_position+0x7>
    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 <current_position>
    da42:	30 91 92 06 	lds	r19, 0x0692	; 0x800692 <current_position+0x1>
    da46:	40 91 93 06 	lds	r20, 0x0693	; 0x800693 <current_position+0x2>
    da4a:	50 91 94 06 	lds	r21, 0x0694	; 0x800694 <current_position+0x3>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
                                 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 <planner_aborted>
    da8c:	81 11       	cpse	r24, r1
    da8e:	b7 ce       	rjmp	.-658    	; 0xd7fe <prepare_move(unsigned int)+0xbe>
        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 <prepare_move(unsigned int)+0x234>
                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 <destination+0x8>
    da9c:	f0 90 7c 06 	lds	r15, 0x067C	; 0x80067c <destination+0x9>
    daa0:	00 91 7d 06 	lds	r16, 0x067D	; 0x80067d <destination+0xa>
    daa4:	10 91 7e 06 	lds	r17, 0x067E	; 0x80067e <destination+0xb>
    daa8:	20 91 77 06 	lds	r18, 0x0677	; 0x800677 <destination+0x4>
    daac:	30 91 78 06 	lds	r19, 0x0678	; 0x800678 <destination+0x5>
    dab0:	40 91 79 06 	lds	r20, 0x0679	; 0x800679 <destination+0x6>
    dab4:	50 91 7a 06 	lds	r21, 0x067A	; 0x80067a <destination+0x7>
    dab8:	60 91 73 06 	lds	r22, 0x0673	; 0x800673 <destination>
    dabc:	70 91 74 06 	lds	r23, 0x0674	; 0x800674 <destination+0x1>
    dac0:	80 91 75 06 	lds	r24, 0x0675	; 0x800675 <destination+0x2>
    dac4:	90 91 76 06 	lds	r25, 0x0676	; 0x800676 <destination+0x3>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
    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 <prepare_move(unsigned int)+0xbe>

0000daf2 <raise_z(float)>:

/// @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 <current_position+0x8>
    db04:	d0 90 9a 06 	lds	r13, 0x069A	; 0x80069a <current_position+0x9>
    db08:	e0 90 9b 06 	lds	r14, 0x069B	; 0x80069b <current_position+0xa>
    db0c:	f0 90 9c 06 	lds	r15, 0x069C	; 0x80069c <current_position+0xb>

    // 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 <current_position+0x8>
    db1c:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
    db20:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
    db24:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>

#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 <axis_known_position+0x2>
    db2e:	91 11       	cpse	r25, r1
    db30:	02 c0       	rjmp	.+4      	; 0xdb36 <raise_z(float)+0x44>
    db32:	84 ff       	sbrs	r24, 4
    db34:	26 c0       	rjmp	.+76     	; 0xdb82 <raise_z(float)+0x90>
    {
        // 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 <clamp_to_software_endstops(float*)>
        plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
    db3e:	e0 91 71 02 	lds	r30, 0x0271	; 0x800271 <max_feedrate>
    db42:	f0 91 72 02 	lds	r31, 0x0272	; 0x800272 <max_feedrate+0x1>
    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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
    db52:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

        // 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 <current_position+0x8>
    db5e:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
    db62:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
    db66:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
    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 <st_synchronize()>

        // 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 <enable_z_endstop(bool)>
    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 <tmc2130_home_enter(unsigned char)>
#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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
    dba2:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

        // 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 <st_get_position_mm(unsigned char)>
    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 <endstop_z_hit_on_purpose()>
    dbbc:	88 23       	and	r24, r24
    dbbe:	91 f0       	breq	.+36     	; 0xdbe4 <raise_z(float)+0xf2>
        {
            // 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 <max_pos+0x8>
    dbc4:	90 91 1e 02 	lds	r25, 0x021E	; 0x80021e <max_pos+0x9>
    dbc8:	a0 91 1f 02 	lds	r26, 0x021F	; 0x80021f <max_pos+0xa>
    dbcc:	b0 91 20 02 	lds	r27, 0x0220	; 0x800220 <max_pos+0xb>
    dbd0:	80 93 99 06 	sts	0x0699, r24	; 0x800699 <current_position+0x8>
    dbd4:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
    dbd8:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
    dbdc:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
            plan_set_position_curposXYZE();
    dbe0:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
        }
        tmc2130_home_exit();
    dbe4:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
#endif //TMC2130
        enable_z_endstop(z_endstop_enabled);
    dbe8:	8c 2f       	mov	r24, r28
    dbea:	0f 94 a3 4e 	call	0x29d46	; 0x29d46 <enable_z_endstop(bool)>
    dbee:	c1 cf       	rjmp	.-126    	; 0xdb72 <raise_z(float)+0x80>

0000dbf0 <raise_z_above(float)>:
//
// 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 <current_position+0x8>
    dc08:	d0 90 9a 06 	lds	r13, 0x069A	; 0x80069a <current_position+0x9>
    dc0c:	e0 90 9b 06 	lds	r14, 0x069B	; 0x80069b <current_position+0xa>
    dc10:	f0 90 9c 06 	lds	r15, 0x069C	; 0x80069c <current_position+0xb>
    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 <raise_z_above(float)+0x56>
        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 <raise_z(float)>
}
    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 <lcd_frame_start()>:

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 <lcd_frame_start()+0x18>
    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_frame_start()+0x22>
			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 <lcd_frame_start()+0x6>
	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 <lcd_frame_start()+0x18>

0000dc7e <lcd_update(unsigned char)>:
	}
}

void lcd_update(uint8_t lcdDrawUpdateOverride)
{
	if (lcd_draw_update < lcdDrawUpdateOverride)
    dc7e:	90 91 6d 02 	lds	r25, 0x026D	; 0x80026d <lcd_draw_update>
    dc82:	98 17       	cp	r25, r24
    dc84:	10 f4       	brcc	.+4      	; 0xdc8a <lcd_update(unsigned char)+0xc>
		lcd_draw_update = lcdDrawUpdateOverride;
    dc86:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>

	if (!lcd_update_enabled) return;
    dc8a:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <lcd_update_enabled>
    dc8e:	88 23       	and	r24, r24
    dc90:	39 f0       	breq	.+14     	; 0xdca0 <lcd_update(unsigned char)+0x22>

	if (lcd_lcdupdate_func)
    dc92:	e0 91 14 04 	lds	r30, 0x0414	; 0x800414 <lcd_lcdupdate_func>
    dc96:	f0 91 15 04 	lds	r31, 0x0415	; 0x800415 <lcd_lcdupdate_func+0x1>
    dc9a:	30 97       	sbiw	r30, 0x00	; 0
    dc9c:	09 f0       	breq	.+2      	; 0xdca0 <lcd_update(unsigned char)+0x22>
		lcd_lcdupdate_func();
    dc9e:	19 94       	eijmp
}
    dca0:	08 95       	ret

0000dca2 <lcd_printf_P(char const*, ...)>:
	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 <vfprintf_P>
	va_end(args);
	return ret;
}
    dcc0:	df 91       	pop	r29
    dcc2:	cf 91       	pop	r28
    dcc4:	08 95       	ret

0000dcc6 <lcd_puts_P(char const*)>:
	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 <fputs_P>

0000dcce <lcd_putc(char)>:
	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 <fputc>

0000dcdc <lcd_space(unsigned char)>:
	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 <lcd_space(unsigned char)+0x10>
    dce4:	80 e2       	ldi	r24, 0x20	; 32
    dce6:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
    dcea:	fa cf       	rjmp	.-12     	; 0xdce0 <lcd_space(unsigned char)+0x4>
}
    dcec:	cf 91       	pop	r28
    dcee:	08 95       	ret

0000dcf0 <lcd_set_cursor(unsigned char, unsigned char)>:
{
	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 <lcd_set_cursor(unsigned char, unsigned char)+0xc>
    dcfa:	83 e0       	ldi	r24, 0x03	; 3
    dcfc:	80 93 5b 03 	sts	0x035B, r24	; 0x80035b <lcd_currline>
}

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 <lcd_get_row_offset(unsigned char)>
    dd04:	8c 0f       	add	r24, r28
	lcd_ddram_address = addr;
    dd06:	80 93 5a 03 	sts	0x035A, r24	; 0x80035a <lcd_ddram_address>
	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 <lcd_send(unsigned char, unsigned char, unsigned int)>

0000dd18 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>:
{
	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 <lcd_set_cursor(unsigned char, unsigned char)>
	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 <fputs_P>

0000dd30 <lcd_putc_at(unsigned char, unsigned char, char)>:
{
	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 <lcd_set_cursor(unsigned char, unsigned char)>
	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 <fputc>

0000dd48 <lcd_home()>:
}

// 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_set_cursor(unsigned char, unsigned char)>
	lcd_ddram_address = 0;
    dd50:	10 92 5a 03 	sts	0x035A, r1	; 0x80035a <lcd_ddram_address>
}
    dd54:	08 95       	ret

0000dd56 <lcd_clear()>:
	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 <lcd_send(unsigned char, unsigned char, unsigned int)>

// 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_currline>
	lcd_ddram_address = 0;
    dd66:	10 92 5a 03 	sts	0x035A, r1	; 0x80035a <lcd_ddram_address>
	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 <memset>

0000dd7a <lcd_update_enable(unsigned char)>:
}

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 <lcd_update_enabled>
    dd7e:	98 17       	cp	r25, r24
    dd80:	09 f1       	breq	.+66     	; 0xddc4 <lcd_update_enable(unsigned char)+0x4a>
	{
		lcd_update_enabled = enabled;
    dd82:	80 93 6e 02 	sts	0x026E, r24	; 0x80026e <lcd_update_enabled>
		if (enabled)
    dd86:	88 23       	and	r24, r24
    dd88:	e9 f0       	breq	.+58     	; 0xddc4 <lcd_update_enable(unsigned char)+0x4a>
		{ // Reset encoder position. This is equivalent to re-entering a menu.
			lcd_encoder = 0;
    dd8a:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
    dd8e:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
			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 <Timer<unsigned long>::start()>
			// Force the keypad update now.
			lcd_next_update_millis = _millis() - 1;
    dd9e:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    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 <lcd_next_update_millis>
    ddae:	70 93 d7 03 	sts	0x03D7, r23	; 0x8003d7 <lcd_next_update_millis+0x1>
    ddb2:	80 93 d8 03 	sts	0x03D8, r24	; 0x8003d8 <lcd_next_update_millis+0x2>
    ddb6:	90 93 d9 03 	sts	0x03D9, r25	; 0x8003d9 <lcd_next_update_millis+0x3>
			// Full update.
			lcd_clear();
    ddba:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
			lcd_update(2);
    ddbe:	82 e0       	ldi	r24, 0x02	; 2
    ddc0:	0c 94 3f 6e 	jmp	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
		} else
		{
			// Clear the LCD always, or let it to the caller?
		}
	}
}
    ddc4:	08 95       	ret

0000ddc6 <lcd_begin(unsigned char) [clone .lto_priv.433]>:
		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_currline>
	lcd_ddram_address = 0;
    ddce:	10 92 5a 03 	sts	0x035A, r1	; 0x80035a <lcd_ddram_address>
	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 <memset>
	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 <lcd_send(unsigned char, unsigned char, unsigned int)>
	// 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 <lcd_send(unsigned char, unsigned char, unsigned int)>
	// 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 <lcd_send(unsigned char, unsigned char, unsigned int)>
#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 <lcd_send(unsigned char, unsigned char, unsigned int)>
#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 <lcd_send(unsigned char, unsigned char, unsigned int)>
}

// 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 <lcd_displaycontrol>
	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_send(unsigned char, unsigned char, unsigned int)>
	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 <lcd_clear()>
	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 <lcd_send(unsigned char, unsigned char, unsigned int)>

0000de48 <lcd_refresh()>:
	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 <lcd_begin(unsigned char) [clone .lto_priv.433]>

0000de4e <lcd_write(unsigned char) [clone .lto_priv.432]>:
{
	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 <lcd_write(unsigned char) [clone .lto_priv.432]+0x10>
    de5e:	00 d0       	rcall	.+0      	; 0xde60 <lcd_write(unsigned char) [clone .lto_priv.432]+0x12>
    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 <lcd_write(unsigned char) [clone .lto_priv.432]+0x54>
		if (lcd_currline > 3) lcd_currline = -1;
    de6c:	80 91 5b 03 	lds	r24, 0x035B	; 0x80035b <lcd_currline>
    de70:	84 30       	cpi	r24, 0x04	; 4
    de72:	18 f0       	brcs	.+6      	; 0xde7a <lcd_write(unsigned char) [clone .lto_priv.432]+0x2c>
    de74:	8f ef       	ldi	r24, 0xFF	; 255
    de76:	80 93 5b 03 	sts	0x035B, r24	; 0x80035b <lcd_currline>
		lcd_set_cursor(0, lcd_currline + 1); // LF
    de7a:	60 91 5b 03 	lds	r22, 0x035B	; 0x80035b <lcd_currline>
    de7e:	6f 5f       	subi	r22, 0xFF	; 255
    de80:	80 e0       	ldi	r24, 0x00	; 0
    de82:	0e 94 78 6e 	call	0xdcf0	; 0xdcf0 <lcd_set_cursor(unsigned char, unsigned char)>
		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 <lcd_write(unsigned char) [clone .lto_priv.432]+0xa4>
// 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_write(unsigned char) [clone .lto_priv.432]+0xb4>
			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_send(unsigned char, unsigned char, unsigned int)>
		lcd_ddram_address++; // no need for preventing ddram overflow
    def6:	80 91 5a 03 	lds	r24, 0x035A	; 0x80035a <lcd_ddram_address>
    defa:	8f 5f       	subi	r24, 0xFF	; 255
    defc:	80 93 5a 03 	sts	0x035A, r24	; 0x80035a <lcd_ddram_address>
    df00:	c2 cf       	rjmp	.-124    	; 0xde86 <lcd_write(unsigned char) [clone .lto_priv.432]+0x38>
			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 <lcd_write(unsigned char) [clone .lto_priv.432]+0xba>
    df06:	3c c0       	rjmp	.+120    	; 0xdf80 <forBegin_7108+0x58>
			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 <forBegin_7108>:
    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 <forBegin_7108>

	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 <lcd_send(unsigned char, unsigned char, unsigned int)>
    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 <lcd_send(unsigned char, unsigned char, unsigned int)>
		: "=&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 <forBegin_7108+0x30>
		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 <lcd_ddram_address>
	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 <lcd_send(unsigned char, unsigned char, unsigned int)>
    df7e:	b5 cf       	rjmp	.-150    	; 0xdeea <lcd_write(unsigned char) [clone .lto_priv.432]+0x9c>
			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 <forBegin_7108+0x68>
    df8e:	a3 cf       	rjmp	.-186    	; 0xded6 <lcd_write(unsigned char) [clone .lto_priv.432]+0x88>
	}

	// 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 <forBegin_7108+0x6e>
    df94:	be cf       	rjmp	.-132    	; 0xdf12 <lcd_write(unsigned char) [clone .lto_priv.432]+0xc4>
    df96:	a9 cf       	rjmp	.-174    	; 0xdeea <lcd_write(unsigned char) [clone .lto_priv.432]+0x9c>

0000df98 <lcd_printNumber(unsigned long, unsigned char)>:
	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 <lcd_printNumber(unsigned long, unsigned char)+0x54>
}

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 <lcd_write(unsigned char) [clone .lto_priv.432]>
}

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 <lcd_printNumber(unsigned long, unsigned char)+0x66>
    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_printNumber(unsigned long, unsigned char)+0xa8>
		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 <lcd_printNumber(unsigned long, unsigned char)+0xa4>
    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 <lcd_write(unsigned char) [clone .lto_priv.432]>
    e03a:	f4 cf       	rjmp	.-24     	; 0xe024 <lcd_printNumber(unsigned long, unsigned char)+0x8c>
	{
		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 <lcd_printNumber(unsigned long, unsigned char)+0x9e>
}
    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 <lcd_print(long, int) [clone .part.3]>:
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 <lcd_print(long, int) [clone .part.3]+0x26>
}

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 <lcd_write(unsigned char) [clone .lto_priv.432]>
	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 <lcd_printNumber(unsigned long, unsigned char)>

0000e09a <lcd_print_pad_P(char const*, unsigned char)>:
    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 <lcd_print_pad_P(char const*, unsigned char)+0x24>
    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_print_pad_P(char const*, unsigned char)+0x24>
        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 <lcd_write(unsigned char) [clone .lto_priv.432]>
        --len;
    e0ba:	c1 50       	subi	r28, 0x01	; 1
    e0bc:	f3 cf       	rjmp	.-26     	; 0xe0a4 <lcd_print_pad_P(char const*, unsigned char)+0xa>
    }
    lcd_space(len);
    e0be:	8c 2f       	mov	r24, r28
    e0c0:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>
    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 <lcd_print_pad(char const*, unsigned char)>:
{
	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 <lcd_print_pad(char const*, unsigned char)+0x20>
    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_print_pad(char const*, unsigned char)+0x20>
        lcd_write(*(s++));
    e0e6:	0e 94 27 6f 	call	0xde4e	; 0xde4e <lcd_write(unsigned char) [clone .lto_priv.432]>
        --len;
    e0ea:	c1 50       	subi	r28, 0x01	; 1
    e0ec:	f5 cf       	rjmp	.-22     	; 0xe0d8 <lcd_print_pad(char const*, unsigned char)+0xa>
    }
    lcd_space(len);
    e0ee:	8c 2f       	mov	r24, r28
    e0f0:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>
    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 <lcd_print(char const*)>:
	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 <lcd_print(char const*)+0x12>
    e10a:	0e 94 27 6f 	call	0xde4e	; 0xde4e <lcd_write(unsigned char) [clone .lto_priv.432]>
    e10e:	fa cf       	rjmp	.-12     	; 0xe104 <lcd_print(char const*)+0x6>
}
    e110:	df 91       	pop	r29
    e112:	cf 91       	pop	r28
    e114:	08 95       	ret

0000e116 <lcd_putchar(char, __file*) [clone .lto_priv.405]>:
	lcd_command(LCD_ENTRYMODESET | lcd_displaymode);
}

static int lcd_putchar(char c, FILE *)
{
	lcd_write(c);
    e116:	0e 94 27 6f 	call	0xde4e	; 0xde4e <lcd_write(unsigned char) [clone .lto_priv.432]>
	return 0;
}
    e11a:	90 e0       	ldi	r25, 0x00	; 0
    e11c:	80 e0       	ldi	r24, 0x00	; 0
    e11e:	08 95       	ret

0000e120 <lcd_consume_click()>:
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_click_trigger>
    lcd_longpress_trigger = 0;
    e124:	10 92 d3 05 	sts	0x05D3, r1	; 0x8005d3 <lcd_longpress_trigger>
}
    e128:	08 95       	ret

0000e12a <lcd_clicked()>:
//! 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 <lcd_click_trigger>
    e130:	c1 e0       	ldi	r28, 0x01	; 1
    e132:	81 11       	cpse	r24, r1
    e134:	04 c0       	rjmp	.+8      	; 0xe13e <lcd_clicked()+0x14>
    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 <lcd_consume_click()>
    e142:	fa cf       	rjmp	.-12     	; 0xe138 <lcd_clicked()+0xe>

0000e144 <lang_get_code.part.3>:
	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 <lang_get_code.part.3+0x20>
		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 <lang_is_selected>:
	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 <eeprom_read_byte>
	return (lang_eeprom != LANG_ID_FORCE_SELECTION) && (lang_eeprom == lang_selected);
    e172:	8e 3f       	cpi	r24, 0xFE	; 254
    e174:	39 f0       	breq	.+14     	; 0xe184 <lang_is_selected+0x1a>
    e176:	91 e0       	ldi	r25, 0x01	; 1
    e178:	20 91 58 03 	lds	r18, 0x0358	; 0x800358 <lang_selected>
    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 <lang_reset>:
	return _n("??");
}

void lang_reset(void)
{
	lang_selected = 0;
    e188:	10 92 58 03 	sts	0x0358, r1	; 0x800358 <lang_selected>
	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 <eeprom_update_byte>

0000e196 <lang_get_name_by_code>:
	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 <lang_get_name_by_code+0xa>
    e19e:	59 c0       	rjmp	.+178    	; 0xe252 <lang_get_name_by_code+0xbc>
    e1a0:	f8 f4       	brcc	.+62     	; 0xe1e0 <lang_get_name_by_code+0x4a>
    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 <lang_get_name_by_code+0x16>
    e1aa:	59 c0       	rjmp	.+178    	; 0xe25e <lang_get_name_by_code+0xc8>
    e1ac:	50 f4       	brcc	.+20     	; 0xe1c2 <lang_get_name_by_code+0x2c>
    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 <lang_get_name_by_code+0x8c>
    e1b6:	85 36       	cpi	r24, 0x65	; 101
    e1b8:	94 46       	sbci	r25, 0x64	; 100
    e1ba:	b1 f1       	breq	.+108    	; 0xe228 <lang_get_name_by_code+0x92>
//#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 <lang_get_name_by_code+0x98>
    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 <lang_get_name_by_code+0x3e>
    e1d2:	42 c0       	rjmp	.+132    	; 0xe258 <lang_get_name_by_code+0xc2>
    e1d4:	83 37       	cpi	r24, 0x73	; 115
    e1d6:	95 46       	sbci	r25, 0x65	; 101
    e1d8:	89 f7       	brne	.-30     	; 0xe1bc <lang_get_name_by_code+0x26>
	{
	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 <lang_get_name_by_code+0x9e>
    e1e8:	70 f4       	brcc	.+28     	; 0xe206 <lang_get_name_by_code+0x70>
    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 <lang_get_name_by_code+0xa4>
    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 <lang_get_name_by_code+0xb0>
    e1fa:	84 37       	cpi	r24, 0x74	; 116
    e1fc:	99 46       	sbci	r25, 0x69	; 105
    e1fe:	f1 f6       	brne	.-68     	; 0xe1bc <lang_get_name_by_code+0x26>
	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 <lang_get_name_by_code+0xb6>
    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 <lang_get_name_by_code+0xaa>
    e216:	8f 36       	cpi	r24, 0x6F	; 111
    e218:	92 47       	sbci	r25, 0x72	; 114
    e21a:	81 f6       	brne	.-96     	; 0xe1bc <lang_get_name_by_code+0x26>
#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 <lang_get_code>:
#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 <lang_get_code+0x92>
    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 <lang_get_code+0x48>
    e28c:	0e 94 a2 70 	call	0xe144	; 0xe144 <lang_get_code.part.3>
		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 <xflash_rd_data>
		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 <lang_get_code+0x98>
		if (--lang == 0) return header.code;
    e2de:	11 50       	subi	r17, 0x01	; 1
    e2e0:	19 f4       	brne	.+6      	; 0xe2e8 <lang_get_code+0x84>
    e2e2:	8b 85       	ldd	r24, Y+11	; 0x0b
    e2e4:	9c 85       	ldd	r25, Y+12	; 0x0c
    e2e6:	d4 cf       	rjmp	.-88     	; 0xe290 <lang_get_code+0x2c>
		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 <lang_get_code+0x56>
	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 <lang_get_code+0x2c>
		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 <lang_get_code+0x2c>

0000e302 <lang_get_count>:
	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 <lang_get_count+0x78>
	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 <xflash_rd_data>
		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 <lang_get_count+0x78>
		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 <lang_get_count+0x44>
		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 <lang_select>:
		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_select+0x18>
	{
		lang_table = 0;
    e3a4:	10 92 57 03 	sts	0x0357, r1	; 0x800357 <lang_table+0x1>
    e3a8:	10 92 56 03 	sts	0x0356, r1	; 0x800356 <lang_table>
		lang_selected = lang;
    e3ac:	10 92 58 03 	sts	0x0358, r1	; 0x800358 <lang_selected>
	}
#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 <lang_get_code>
    e3b6:	8c 01       	movw	r16, r24
    e3b8:	0e 94 a2 70 	call	0xe144	; 0xe144 <lang_get_code.part.3>
    e3bc:	08 17       	cp	r16, r24
    e3be:	19 07       	cpc	r17, r25
    e3c0:	19 f0       	breq	.+6      	; 0xe3c8 <lang_select+0x30>
	if (lang == LANG_ID_SEC) //current secondary language
    e3c2:	c1 30       	cpi	r28, 0x01	; 1
    e3c4:	09 f0       	breq	.+2      	; 0xe3c8 <lang_select+0x30>
    e3c6:	3e c0       	rjmp	.+124    	; 0xe444 <lang_select+0xac>
	{
		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 <lang_select+0x48>
    e3de:	31 c0       	rjmp	.+98     	; 0xe442 <lang_select+0xaa>
}

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 <lang_select+0xc8>
		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 <lang_select+0xaa>
				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_select+0xaa>
				{
					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 <lang_table+0x1>
    e438:	80 93 56 03 	sts	0x0356, r24	; 0x800356 <lang_table>
					lang_selected = lang; // set language id
    e43c:	81 e0       	ldi	r24, 0x01	; 1
    e43e:	80 93 58 03 	sts	0x0358, r24	; 0x800358 <lang_selected>
	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 <lang_selected>
    e448:	8c 13       	cpse	r24, r28
    e44a:	1c c0       	rjmp	.+56     	; 0xe484 <lang_select+0xec>
	{
		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 <eeprom_update_byte>
		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 <lang_select+0xde>
    e472:	ee 0f       	add	r30, r30
    e474:	ff 1f       	adc	r31, r31
    e476:	aa 95       	dec	r26
    e478:	e2 f7       	brpl	.-8      	; 0xe472 <lang_select+0xda>
    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 <lang_select+0x60>
	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 <lang_select+0xc0>

0000e488 <lang_get_translation>:
//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 <lang_selected>
    e48c:	21 11       	cpse	r18, r1
    e48e:	04 c0       	rjmp	.+8      	; 0xe498 <lang_get_translation+0x10>
    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 <lang_table>
    e49c:	50 91 57 03 	lds	r21, 0x0357	; 0x800357 <lang_table+0x1>
    e4a0:	41 15       	cp	r20, r1
    e4a2:	51 05       	cpc	r21, r1
    e4a4:	a9 f3       	breq	.-22     	; 0xe490 <lang_get_translation+0x8>
	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 <lang_get_translation+0x8>
	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 <lang_get_translation+0x8>
    e4ce:	e2 cf       	rjmp	.-60     	; 0xe494 <lang_get_translation+0xc>

0000e4d0 <M600_load_filament_movements(char const*)>:
		}
		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 <current_position+0xc>
    e4e2:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
    e4e6:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
    e4ea:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
    e4ee:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
    e4f2:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
    e4f6:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
    e4fa:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
    e4fe:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
	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 <plan_buffer_line_curposXYZE(float)>
	load_filament_final_feed();
    e50e:	0e 94 2b 64 	call	0xc856	; 0xc856 <load_filament_final_feed()>
}


void lcd_loading_filament(const char* filament_name) {

  lcd_clear();
    e512:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>

  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 <lang_get_translation>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  if (filament_name[0]) {
    e528:	88 81       	ld	r24, Y
    e52a:	88 23       	and	r24, r24
    e52c:	39 f0       	breq	.+14     	; 0xe53c <M600_load_filament_movements(char const*)+0x6c>
      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_set_cursor(unsigned char, unsigned char)>
      lcd_print(filament_name);
    e536:	ce 01       	movw	r24, r28
    e538:	0e 94 7f 70 	call	0xe0fe	; 0xe0fe <lcd_print(char const*)>
  }
  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 <lang_get_translation>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  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_progress_bar(unsigned int) [clone .lto_priv.560]>
	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 <st_synchronize()>

0000e55e <mmu_M600_unload_filament()>:
 * 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 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
    e562:	8f 3f       	cpi	r24, 0xFF	; 255
    e564:	11 f1       	breq	.+68     	; 0xe5aa <mmu_M600_unload_filament()+0x4c>

    lcd_update_enable(false);
    e566:	80 e0       	ldi	r24, 0x00	; 0
    e568:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
    lcd_clear();
    e56c:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
    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 <lang_get_translation>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
}

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_write(unsigned char) [clone .lto_priv.432]>
    lcd_print(' ');
    lcd_print(MMU2::mmu2.get_current_tool() + 1);
    e588:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
    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 <lcd_print(long, int) [clone .part.3]>

    // unload just current filament for multimaterial printers (used also in M702)
    MMU2::mmu2.unload();
    e5a0:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>
    lcd_update_enable(true);
    e5a4:	81 e0       	ldi	r24, 0x01	; 1
    e5a6:	0c 94 bd 6e 	jmp	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
}
    e5aa:	08 95       	ret

0000e5ac <calibrate_z_auto()>:
}


#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_clear()>
	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 <lang_get_translation>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  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 <tmc2130_home_enter(unsigned char)>
	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 <plan_set_position_curposXYZE()>
	set_destination_to_current();
    e60a:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>

#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 <calibrate_z_auto()+0x7c>
    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 <feedrate>
    e67a:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    e67e:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    e682:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
	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 <plan_buffer_line_destinationXYZE(float)>
	st_synchronize();
    e692:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
	//	current_position[axis] = 0;
	//	plan_set_position_curposXYZE();
	tmc2130_home_exit();
    e696:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
    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 <plan_set_position_curposXYZE()>
	set_destination_to_current();
    e6ac:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
	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 <feedrate>
    e6ec:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    e6f0:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    e6f4:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
	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 <plan_buffer_line_destinationXYZE(float)>
	st_synchronize();
    e704:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <plan_set_position_curposXYZE()>
	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 <crashdet_fmt_error(char*, unsigned char)>:
  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 <crashdet_fmt_error(char*, unsigned char)+0x10>
    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 <crashdet_fmt_error(char*, unsigned char)+0x1a>
    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 <lang_get_translation>
    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 <strcpy_P>

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 <state>
    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 <bedPWMDisabled>
    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 <soft_pwm_bed>
    e7be:	88 0f       	add	r24, r24
    e7c0:	80 93 50 03 	sts	0x0350, r24	; 0x800350 <pwm>
		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 <state>
		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 <slowCounter>
    e7ea:	8f 5f       	subi	r24, 0xFF	; 255
    e7ec:	80 93 4f 03 	sts	0x034F, r24	; 0x80034f <slowCounter>
		if( slowCounter > pwm ){
    e7f0:	90 91 50 03 	lds	r25, 0x0350	; 0x800350 <pwm>
    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 <state>
		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 <fastCounter>
		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 <fastCounter>
    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 <fastCounter>
    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 <fastCounter>
    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 <state>
			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 <state>
		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 <bedPWMDisabled>
    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 <slowCounter>
    e866:	8f 5f       	subi	r24, 0xFF	; 255
    e868:	80 93 4f 03 	sts	0x034F, r24	; 0x80034f <slowCounter>
		if( slowCounter < pwm ){
    e86c:	90 91 50 03 	lds	r25, 0x0350	; 0x800350 <pwm>
    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 <soft_pwm_bed>
    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 <state>
		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 <fastCounter>
		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 <fastCounter>
    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 <fastCounter>
    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 <state>
			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 <state>
		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 <Filament_sensor::setEnabled(bool)>:
#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>
    eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR, enabled);
    if (enabled) {
    e8dc:	cc 23       	and	r28, r28
    e8de:	19 f0       	breq	.+6      	; 0xe8e6 <Filament_sensor::setEnabled(bool)+0x18>
        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 <PAT9125_sensor::init() [clone .constprop.230]>
}

void PAT9125_sensor::deinit() {
//    puts_P(PSTR("fsensor::deinit()"));
    ; //
    state = State::disabled;
    e8e6:	10 92 a9 17 	sts	0x17A9, r1	; 0x8017a9 <fsensor>
    filter = 0;
    e8ea:	10 92 b5 17 	sts	0x17B5, r1	; 0x8017b5 <fsensor+0xc>
    if (enabled) {
        fsensor.init();
    } else {
        fsensor.deinit();
    }
}
    e8ee:	cf 91       	pop	r28
    e8f0:	08 95       	ret

0000e8f2 <resetFanCheck()>:
#endif
#endif //DEBUG_DISABLE_FANCHECK
}

void resetFanCheck() {
    fan_measuring = false;
    e8f2:	10 92 6e 06 	sts	0x066E, r1	; 0x80066e <fan_measuring>
    extruder_autofan_last_check = _millis();
    e8f6:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    e8fa:	60 93 bf 17 	sts	0x17BF, r22	; 0x8017bf <extruder_autofan_last_check>
    e8fe:	70 93 c0 17 	sts	0x17C0, r23	; 0x8017c0 <extruder_autofan_last_check+0x1>
    e902:	80 93 c1 17 	sts	0x17C1, r24	; 0x8017c1 <extruder_autofan_last_check+0x2>
    e906:	90 93 c2 17 	sts	0x17C2, r25	; 0x8017c2 <extruder_autofan_last_check+0x3>
}
    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 <fan_measuring>
    e92c:	88 23       	and	r24, r24
    e92e:	f1 f0       	breq	.+60     	; 0xe96c <__vector_8+0x60>
    e930:	80 91 a5 04 	lds	r24, 0x04A5	; 0x8004a5 <fanSpeedSoftPwm>
    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 <timer2_millis>
    e944:	90 91 3b 06 	lds	r25, 0x063B	; 0x80063b <timer2_millis+0x1>
    e948:	a0 91 3c 06 	lds	r26, 0x063C	; 0x80063c <timer2_millis+0x2>
    e94c:	b0 91 3d 06 	lds	r27, 0x063D	; 0x80063d <timer2_millis+0x3>
		t_fan_rising_edge = millis_nc();
    e950:	80 93 47 03 	sts	0x0347, r24	; 0x800347 <t_fan_rising_edge>
    e954:	90 93 48 03 	sts	0x0348, r25	; 0x800348 <t_fan_rising_edge+0x1>
    e958:	a0 93 49 03 	sts	0x0349, r26	; 0x800349 <t_fan_rising_edge+0x2>
    e95c:	b0 93 4a 03 	sts	0x034A, r27	; 0x80034a <t_fan_rising_edge+0x3>
	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 <timer2_millis>
    e98c:	90 91 3b 06 	lds	r25, 0x063B	; 0x80063b <timer2_millis+0x1>
    e990:	a0 91 3c 06 	lds	r26, 0x063C	; 0x80063c <timer2_millis+0x2>
    e994:	b0 91 3d 06 	lds	r27, 0x063D	; 0x80063d <timer2_millis+0x3>

	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 <t_fan_rising_edge>
    e99c:	50 91 48 03 	lds	r21, 0x0348	; 0x800348 <t_fan_rising_edge+0x1>
    e9a0:	60 91 49 03 	lds	r22, 0x0349	; 0x800349 <t_fan_rising_edge+0x2>
    e9a4:	70 91 4a 03 	lds	r23, 0x034A	; 0x80034a <t_fan_rising_edge+0x3>
    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 <fanSpeed>
    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 <fan_edge_counter+0x2>
    e9d6:	90 91 e4 05 	lds	r25, 0x05E4	; 0x8005e4 <fan_edge_counter+0x3>
    e9da:	02 96       	adiw	r24, 0x02	; 2
    e9dc:	90 93 e4 05 	sts	0x05E4, r25	; 0x8005e4 <fan_edge_counter+0x3>
    e9e0:	80 93 e3 05 	sts	0x05E3, r24	; 0x8005e3 <fan_edge_counter+0x2>
    e9e4:	bd cf       	rjmp	.-134    	; 0xe960 <__vector_8+0x54>

0000e9e6 <setExtruderAutoFanState(unsigned char)>:
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 <fanState>
    newFanSpeed = 0;
    if (fanState & 0x01)
    e9ea:	80 fd       	sbrc	r24, 0
    e9ec:	1c c0       	rjmp	.+56     	; 0xea26 <setExtruderAutoFanState(unsigned char)+0x40>
{
    //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 <newFanSpeed>
        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 <newFanSpeed>
}

#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 <setExtruderAutoFanState(unsigned char)+0x52>
	{
		// 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 <setExtruderAutoFanState(unsigned char)+0x48>
    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 <newFanSpeed>
    ea2c:	e2 cf       	rjmp	.-60     	; 0xe9f2 <setExtruderAutoFanState(unsigned char)+0xc>
    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 <setExtruderAutoFanState(unsigned char)+0x38>
	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 <setExtruderAutoFanState(unsigned char)+0x76>
    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 <checkExtruderAutoFans()>:
}

#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 <fanState>
    ea88:	d1 fd       	sbrc	r29, 1
    ea8a:	1d c0       	rjmp	.+58     	; 0xeac6 <checkExtruderAutoFans()+0x48>
    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 <current_temperature>
    ea9e:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
    eaa2:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
    eaa6:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
    eaaa:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
    eaae:	18 16       	cp	r1, r24
    eab0:	0c f0       	brlt	.+2      	; 0xeab4 <checkExtruderAutoFans()+0x36>
    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 <checkExtruderAutoFans()+0x42>
    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 <fanState>
    }
    setExtruderAutoFanState(fanState);
    eac6:	80 91 4b 03 	lds	r24, 0x034B	; 0x80034b <fanState>
#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 <setExtruderAutoFanState(unsigned char)>

0000ead4 <eeprom_init_default_block(void*, unsigned int, void const*)>:
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 <eeprom_is_initialized_block(void const*, unsigned int)>
    eaea:	81 11       	cpse	r24, r1
    eaec:	0b c0       	rjmp	.+22     	; 0xeb04 <eeprom_init_default_block(void*, unsigned int, void const*)+0x30>
#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 <eeprom_update_block>
}

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 <eeprom_init_default_word(unsigned int*, unsigned int)>:
        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 <eeprom_read_word>
    if (val == EEPROM_EMPTY_VALUE16) {
    eb24:	8f 3f       	cpi	r24, 0xFF	; 255
    eb26:	98 07       	cpc	r25, r24
    eb28:	39 f4       	brne	.+14     	; 0xeb38 <eeprom_init_default_word(unsigned int*, unsigned int)+0x26>
    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 <eeprom_write_word>

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 <eeprom_init_default_byte(unsigned char*, unsigned char)>:
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 <eeprom_read_byte>
    if (val == EEPROM_EMPTY_VALUE) {
    eb50:	8f 3f       	cpi	r24, 0xFF	; 255
    eb52:	29 f4       	brne	.+10     	; 0xeb5e <eeprom_init_default_byte(unsigned char*, unsigned char)+0x1c>
    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 <eeprom_write_byte>

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 <eeprom_increment_word(unsigned int*)>:

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 <eeprom_read_word>
    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 <eeprom_write_word>

0000eb80 <eeprom_increment_byte(unsigned char*)>:

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 <eeprom_read_byte>
    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 <eeprom_write_byte>

0000eb98 <eeprom_toggle(unsigned char*)>:
    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 <eeprom_read_byte>
    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 <eeprom_write_byte>

0000ebb2 <eeprom_is_sheet_initialized(unsigned char)>:
    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<uint16_t*>(&(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 <eeprom_read_word>
    ebc2:	21 e0       	ldi	r18, 0x01	; 1
    ebc4:	01 96       	adiw	r24, 0x01	; 1
    ebc6:	09 f4       	brne	.+2      	; 0xebca <eeprom_is_sheet_initialized(unsigned char)+0x18>
    ebc8:	20 e0       	ldi	r18, 0x00	; 0
}
    ebca:	82 2f       	mov	r24, r18
    ebcc:	08 95       	ret

0000ebce <eeprom_next_initialized_sheet(signed char)>:
//!
//! @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<int8_t>(sizeof(Sheets::s)/sizeof(Sheet)); ++i)
    {
        ++sheet;
    ebd6:	cf 5f       	subi	r28, 0xFF	; 255
        if (sheet >= static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0;
    ebd8:	c8 30       	cpi	r28, 0x08	; 8
    ebda:	0c f0       	brlt	.+2      	; 0xebde <eeprom_next_initialized_sheet(signed char)+0x10>
    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 <eeprom_is_sheet_initialized(unsigned char)>
    ebe4:	81 11       	cpse	r24, r1
    ebe6:	03 c0       	rjmp	.+6      	; 0xebee <eeprom_next_initialized_sheet(signed char)+0x20>
    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<int8_t>(sizeof(Sheets::s)/sizeof(Sheet)); ++i)
    ebea:	a9 f7       	brne	.-22     	; 0xebd6 <eeprom_next_initialized_sheet(signed char)+0x8>
    {
        ++sheet;
        if (sheet >= static_cast<int8_t>(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 <eeprom_switch_to_next_sheet()>:
#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 <eeprom_read_byte>

    sheet = eeprom_next_initialized_sheet(sheet);
    ebfe:	0e 94 e7 75 	call	0xebce	; 0xebce <eeprom_next_initialized_sheet(signed char)>
    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 <eeprom_switch_to_next_sheet()+0x1a>
        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 <eeprom_update_byte>
{
    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 <eeprom_default_sheet_name(unsigned char, SheetName&)>:
//! | 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 <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        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 <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        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 <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        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 <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        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 <strcpy_P>
    }
    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 <eeprom_default_sheet_name(unsigned char, SheetName&)+0x46>
    {
        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 <eeprom_adjust_bed_reset()>:
        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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>
    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 <eeprom_update_byte>

0000ec92 <print_hex_byte(unsigned char)>:
}

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(unsigned char)>
	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 <print_hex_nibble(unsigned char)>

0000eca8 <cmdqueue_pop_front()>:

// 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 <buflen>
    ecac:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
    ecb0:	18 16       	cp	r1, r24
    ecb2:	19 06       	cpc	r1, r25
    ecb4:	0c f0       	brlt	.+2      	; 0xecb8 <cmdqueue_pop_front()+0x10>
    ecb6:	43 c0       	rjmp	.+134    	; 0xed3e <cmdqueue_pop_front()+0x96>
        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 <buflen+0x1>
    ecbe:	80 93 a2 10 	sts	0x10A2, r24	; 0x8010a2 <buflen>
    ecc2:	89 2b       	or	r24, r25
    ecc4:	a1 f4       	brne	.+40     	; 0xecee <cmdqueue_pop_front()+0x46>
            // Empty buffer.
            if (serial_count == 0)
    ecc6:	80 91 9d 10 	lds	r24, 0x109D	; 0x80109d <serial_count>
    ecca:	90 91 9e 10 	lds	r25, 0x109E	; 0x80109e <serial_count+0x1>
    ecce:	89 2b       	or	r24, r25
    ecd0:	21 f4       	brne	.+8      	; 0xecda <cmdqueue_pop_front()+0x32>
                // 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 <bufindr+0x1>
    ece6:	80 93 91 12 	sts	0x1291, r24	; 0x801291 <bufindr>
            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 <bufindr>
    ecf2:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
    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 <cmdqueue_pop_front()+0x50>
    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 <cmdqueue_pop_front()+0x7c>
    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 <cmdqueue_pop_front()+0x3a>
    ed20:	c9 01       	movw	r24, r18
    ed22:	f4 cf       	rjmp	.-24     	; 0xed0c <cmdqueue_pop_front()+0x64>
            // 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 <cmdqueue_pop_front()+0x3a>
    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 <cmdqueue_pop_front()+0x88>
    ed3c:	d2 cf       	rjmp	.-92     	; 0xece2 <cmdqueue_pop_front()+0x3a>
            SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */
        }
        return true;
    }
    return false;
    ed3e:	80 e0       	ldi	r24, 0x00	; 0
}
    ed40:	08 95       	ret

0000ed42 <MarlinSerial::available()>:
    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 <rx_buffer+0x80>
    ed46:	90 91 99 04 	lds	r25, 0x0499	; 0x800499 <rx_buffer+0x81>
    ed4a:	20 91 9a 04 	lds	r18, 0x049A	; 0x80049a <rx_buffer+0x82>
    ed4e:	30 91 9b 04 	lds	r19, 0x049B	; 0x80049b <rx_buffer+0x83>
    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 <createFilename(char*, directoryEntry const&)>:
  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 <createFilename(char*, directoryEntry const&)+0x22>
    if (i == 8)
    ed6c:	28 30       	cpi	r18, 0x08	; 8
    ed6e:	11 f4       	brne	.+4      	; 0xed74 <createFilename(char*, directoryEntry const&)+0x18>
    {
      *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 <createFilename(char*, directoryEntry const&)+0x6>
    {
      *pos++='.';
    }
    *pos++=p.name[i];
  }
  *pos++=0;
    ed84:	10 82       	st	Z, r1
  return buffer;
}
    ed86:	08 95       	ret

0000ed88 <SdBaseFile::rewind()>:
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 <SdBaseFile::seekSet(unsigned long)>

0000ed92 <SdBaseFile::~SdBaseFile()>:
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 <SdBaseFile::close()>
    ed9c:	08 95       	ret

0000ed9e <MarlinSerial::write(unsigned char)>:
      M_UDRx = c;
    }
    */
	static void write(uint8_t c)
	{
		if (selectedSerialPort == 0)
    ed9e:	90 91 38 05 	lds	r25, 0x0538	; 0x800538 <selectedSerialPort>
    eda2:	91 11       	cpse	r25, r1
    eda4:	07 c0       	rjmp	.+14     	; 0xedb4 <MarlinSerial::write(unsigned char)+0x16>
		{
			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 <MarlinSerial::write(unsigned char)+0x8>
			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 <MarlinSerial::write(unsigned char)+0x26>
		{
			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 <MarlinSerial::write(unsigned char)+0x1a>
			UDR1 = c;
    edc0:	80 93 ce 00 	sts	0x00CE, r24	; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce>
		}
	}
    edc4:	08 95       	ret

0000edc6 <uart_putchar(char, __file*)>:
static FILE _uartout;
#define uartout (&_uartout)

int uart_putchar(char c, FILE *)
{
	MYSERIAL.write(c);
    edc6:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
	return 0;
}
    edca:	90 e0       	ldi	r25, 0x00	; 0
    edcc:	80 e0       	ldi	r24, 0x00	; 0
    edce:	08 95       	ret

0000edd0 <serialprintPGM(char const*)>:
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 <serialprintPGM(char const*)+0x16>
        MYSERIAL.write((char)ch);
    edde:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
        ++str;
    ede2:	21 96       	adiw	r28, 0x01	; 1
    ede4:	f8 cf       	rjmp	.-16     	; 0xedd6 <serialprintPGM(char const*)+0x6>
    }
}
    ede6:	df 91       	pop	r29
    ede8:	cf 91       	pop	r28
    edea:	08 95       	ret

0000edec <serialecho_temperatures()>:
        // 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 <current_temperature>
    edf8:	d0 90 b0 0d 	lds	r13, 0x0DB0	; 0x800db0 <current_temperature+0x1>
    edfc:	e0 90 b1 0d 	lds	r14, 0x0DB1	; 0x800db1 <current_temperature+0x2>
    ee00:	f0 90 b2 0d 	lds	r15, 0x0DB2	; 0x800db2 <current_temperature+0x3>
	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 <serialprintPGM(char const*)>
  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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
    ee1e:	60 91 ed 04 	lds	r22, 0x04ED	; 0x8004ed <current_temperature_bed>
    ee22:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
    ee26:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
    ee2a:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
    ee2e:	41 e0       	ldi	r20, 0x01	; 1
    ee30:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
	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 <MarlinSerial::println()>

0000ee40 <gcode_M861_print_pinda_cal_eeprom()>:
    }
}

/// @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 <gcode_M861_print_pinda_cal_eeprom()+0x48>
    ee86:	5d c0       	rjmp	.+186    	; 0xef42 <gcode_M861_print_pinda_cal_eeprom()+0x102>
            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 <eeprom_read_word>
    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 <cs+0xc>
    eea0:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
    eea4:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
    eea8:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
    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 <MarlinSerial::print(long, int) [clone .part.1]>
            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 <serialprintPGM(char const*)>
    eec4:	c5 01       	movw	r24, r10
    eec6:	b4 01       	movw	r22, r8
    eec8:	0f 94 5f d5 	call	0x3aabe	; 0x3aabe <MarlinSerial::print(long, int) [clone .part.1]>
        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 <serialprintPGM(char const*)>
  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 <MarlinSerial::print(long, int) [clone .part.1]>
        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 <serialprintPGM(char const*)>
        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 <MarlinSerial::println(double, int) [clone .constprop.367]>
    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 <gcode_M861_print_pinda_cal_eeprom()+0xe0>
    ef1e:	b0 cf       	rjmp	.-160    	; 0xee80 <gcode_M861_print_pinda_cal_eeprom()+0x40>
        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 <serialprintPGM(char const*)>
    ef4a:	b8 cf       	rjmp	.-144    	; 0xeebc <gcode_M861_print_pinda_cal_eeprom()+0x7c>

0000ef4c <mmu_M600_load_filament(bool)>:

/// @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 <mmu_M600_load_filament(bool)+0x60>
    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 <serialprintPGM(char const*)>
    ef58:	60 91 48 13 	lds	r22, 0x1348	; 0x801348 <SpoolJoin::spooljoin>
    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 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_ECHO((int)currentMMUSlot);

    if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0;
    ef66:	80 91 48 13 	lds	r24, 0x1348	; 0x801348 <SpoolJoin::spooljoin>
    ef6a:	84 30       	cpi	r24, 0x04	; 4
    ef6c:	d8 f0       	brcs	.+54     	; 0xefa4 <mmu_M600_load_filament(bool)+0x58>
    ef6e:	10 92 48 13 	sts	0x1348, r1	; 0x801348 <SpoolJoin::spooljoin>
    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 <serialprintPGM(char const*)>
    SERIAL_ECHOLN((int)currentMMUSlot);
    ef7a:	80 91 48 13 	lds	r24, 0x1348	; 0x801348 <SpoolJoin::spooljoin>
    ef7e:	90 e0       	ldi	r25, 0x00	; 0
    ef80:	0f 94 ec 75 	call	0x2ebd8	; 0x2ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>

    return currentMMUSlot;
    ef84:	80 91 48 13 	lds	r24, 0x1348	; 0x801348 <SpoolJoin::spooljoin>
  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 <saved_extruder_temperature>
    ef8c:	30 91 ac 05 	lds	r19, 0x05AC	; 0x8005ac <saved_extruder_temperature+0x1>
    ef90:	30 93 b6 0d 	sts	0x0DB6, r19	; 0x800db6 <target_temperature+0x1>
    ef94:	20 93 b5 0d 	sts	0x0DB5, r18	; 0x800db5 <target_temperature>
        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 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]>

    load_filament_final_feed(); // @@TODO verify
    ef9c:	0e 94 2b 64 	call	0xc856	; 0xc856 <load_filament_final_feed()>
    st_synchronize();
    efa0:	0d 94 a9 43 	jmp	0x28752	; 0x28752 <st_synchronize()>
{
    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 <SpoolJoin::spooljoin>
    efaa:	e3 cf       	rjmp	.-58     	; 0xef72 <mmu_M600_load_filament(bool)+0x26>
    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 <lang_get_translation>
    efb4:	70 e0       	ldi	r23, 0x00	; 0
    efb6:	60 e0       	ldi	r22, 0x00	; 0
    efb8:	0e 94 bc e4 	call	0x1c978	; 0x1c978 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]>
    efbc:	e5 cf       	rjmp	.-54     	; 0xef88 <mmu_M600_load_filament(bool)+0x3c>

0000efbe <gcode_M114()>:

	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 <serialprintPGM(char const*)>
	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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
    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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
    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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
    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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
	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 <st_get_position(unsigned char)>
    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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
	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 <st_get_position(unsigned char)>
    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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
	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 <st_get_position(unsigned char)>
    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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
	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 <st_get_position(unsigned char)>
    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 <MarlinSerial::println(double, int) [clone .constprop.367]>

0000f0b4 <gcode_M105()>:
#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 <serialprintPGM(char const*)>
    f0bc:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
    f0c0:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
    f0c4:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
    f0c8:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
    f0cc:	41 e0       	ldi	r20, 0x01	; 1
    f0ce:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
    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 <serialprintPGM(char const*)>
  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 <target_temperature>
    f0de:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
    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 <MarlinSerial::printFloat(double, unsigned char)>
    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 <serialprintPGM(char const*)>
    f0fc:	60 91 ed 04 	lds	r22, 0x04ED	; 0x8004ed <current_temperature_bed>
    f100:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
    f104:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
    f108:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
    f10c:	41 e0       	ldi	r20, 0x01	; 1
    f10e:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
    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 <serialprintPGM(char const*)>
};

FORCE_INLINE float degTargetBed() {
  return target_temperature_bed;
    f11a:	60 91 71 06 	lds	r22, 0x0671	; 0x800671 <target_temperature_bed>
    f11e:	70 91 72 06 	lds	r23, 0x0672	; 0x800672 <target_temperature_bed+0x1>
    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 <MarlinSerial::printFloat(double, unsigned char)>
    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 <serialprintPGM(char const*)>
    f13c:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
    f140:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
    f144:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
    f148:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
    f14c:	41 e0       	ldi	r20, 0x01	; 1
    f14e:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
    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 <serialprintPGM(char const*)>
  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 <target_temperature>
    f15e:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
    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 <MarlinSerial::printFloat(double, unsigned char)>
#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 <serialprintPGM(char const*)>
  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 <MarlinSerial::print(long, int) [clone .part.1]>
    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 <serialprintPGM(char const*)>
    f192:	60 91 1c 06 	lds	r22, 0x061C	; 0x80061c <soft_pwm_bed>
    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 <MarlinSerial::print(long, int) [clone .part.1]>
#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 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
    f1a8:	60 91 97 03 	lds	r22, 0x0397	; 0x800397 <current_temperature_pinda>
    f1ac:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
    f1b0:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
    f1b4:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
    f1b8:	41 e0       	ldi	r20, 0x01	; 1
    f1ba:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
    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 <serialprintPGM(char const*)>
    f1c6:	60 91 55 06 	lds	r22, 0x0655	; 0x800655 <current_temperature_ambient>
    f1ca:	70 91 56 06 	lds	r23, 0x0656	; 0x800656 <current_temperature_ambient+0x1>
    f1ce:	80 91 57 06 	lds	r24, 0x0657	; 0x800657 <current_temperature_ambient+0x2>
    f1d2:	90 91 58 06 	lds	r25, 0x0658	; 0x800658 <current_temperature_ambient+0x3>
    f1d6:	41 e0       	ldi	r20, 0x01	; 1
    f1d8:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
        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 <MarlinSerial::println()>

0000f1e0 <host_autoreport()>:
        }
    }

    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 <autoReportFeatures+0x1>
    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 <Timer<unsigned long>::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 <host_autoreport()+0x44>
    f1fe:	80 91 86 14 	lds	r24, 0x1486	; 0x801486 <autoReportFeatures>
    {
        if(autoReportFeatures.Temp()){
    f202:	80 fd       	sbrc	r24, 0
            gcode_M105();
    f204:	0e 94 5a 78 	call	0xf0b4	; 0xf0b4 <gcode_M105()>
    f208:	80 91 86 14 	lds	r24, 0x1486	; 0x801486 <autoReportFeatures>
        }
        if(autoReportFeatures.Pos()){
    f20c:	82 fd       	sbrc	r24, 2
            gcode_M114();
    f20e:	0e 94 df 77 	call	0xefbe	; 0xefbe <gcode_M114()>
    f212:	80 91 86 14 	lds	r24, 0x1486	; 0x801486 <autoReportFeatures>
        }
#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 <gcode_M123()>
        } 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 <Timer<unsigned long>::start()>
            gcode_M123();
        }
#endif //AUTO_REPORT and (FANCHECK and TACH_0 or TACH_1)
        autoReportFeatures.TimerStart();
    }
}
    f224:	08 95       	ret

0000f226 <serialprintlnPGM(char const*)>:
        ++str;
    }
}

void serialprintlnPGM(const char *str) {
    serialprintPGM(str);
    f226:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
    MYSERIAL.println();
    f22a:	0d 94 f1 d5 	jmp	0x3abe2	; 0x3abe2 <MarlinSerial::println()>

0000f22e <check_babystep()>:
#endif //TEMP_RESIDENCY_TIME
	}
}

void check_babystep()
{
    f22e:	cf 93       	push	r28
	int babystep_z = eeprom_read_word(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_byte>
	}
}

void check_babystep()
{
	int babystep_z = eeprom_read_word(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_word>
            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 <check_babystep()+0x56>
		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 <serialprintlnPGM(char const*)>
		eeprom_write_word_notify(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_byte>
            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<uint16_t *>(&(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 <eeprom_write_word>
            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_show_fullscreen_message_and_wait_P(char const*)>
		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<uint16_t *>(&(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 <lcd_update_enable(unsigned char)>
	}
}
    f284:	cf 91       	pop	r28
    f286:	08 95       	ret

0000f288 <ThermalStop(bool)>:
// 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 <Stopped>
    f296:	91 11       	cpse	r25, r1
    f298:	4f c0       	rjmp	.+158    	; 0xf338 <ThermalStop(bool)+0xb0>
    f29a:	c8 2f       	mov	r28, r24
        Stopped = true;
    f29c:	81 e0       	ldi	r24, 0x01	; 1
    f29e:	80 93 10 05 	sts	0x0510, r24	; 0x800510 <Stopped>

        // Either pause or stop the print
        if(allow_recovery && printJobOngoing()) {
    f2a2:	cc 23       	and	r28, r28
    f2a4:	11 f1       	breq	.+68     	; 0xf2ea <ThermalStop(bool)+0x62>
    f2a6:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
    f2aa:	88 23       	and	r24, r24
    f2ac:	f1 f0       	breq	.+60     	; 0xf2ea <ThermalStop(bool)+0x62>
            if (!printingIsPaused()) {
    f2ae:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
    f2b2:	81 11       	cpse	r24, r1
    f2b4:	22 c0       	rjmp	.+68     	; 0xf2fa <ThermalStop(bool)+0x72>
                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 <lang_get_translation>
    f2be:	63 e0       	ldi	r22, 0x03	; 3
    f2c0:	0e 94 d6 f1 	call	0x1e3ac	; 0x1e3ac <lcd_setalertstatuspgm(char const*, unsigned char)>
                // 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 <saved_bed_temperature>
                uint16_t ext_temp = saved_extruder_temperature;
    f2c8:	00 91 ab 05 	lds	r16, 0x05AB	; 0x8005ab <saved_extruder_temperature>
    f2cc:	10 91 ac 05 	lds	r17, 0x05AC	; 0x8005ac <saved_extruder_temperature+0x1>
                uint8_t fan_speed = saved_fan_speed;
    f2d0:	d0 91 aa 05 	lds	r29, 0x05AA	; 0x8005aa <saved_fan_speed>
                lcd_pause_print();
    f2d4:	0f 94 34 2a 	call	0x25468	; 0x25468 <lcd_pause_print()>
                saved_bed_temperature = bed_temp;
    f2d8:	f0 92 ad 05 	sts	0x05AD, r15	; 0x8005ad <saved_bed_temperature>
                saved_extruder_temperature = ext_temp;
    f2dc:	10 93 ac 05 	sts	0x05AC, r17	; 0x8005ac <saved_extruder_temperature+0x1>
    f2e0:	00 93 ab 05 	sts	0x05AB, r16	; 0x8005ab <saved_extruder_temperature>
                saved_fan_speed = fan_speed;
    f2e4:	d0 93 aa 05 	sts	0x05AA, r29	; 0x8005aa <saved_fan_speed>
    f2e8:	08 c0       	rjmp	.+16     	; 0xf2fa <ThermalStop(bool)+0x72>
            }
        } 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 <print_stop(bool, bool)>
        }

        // 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 <ThermalStop(bool)+0x76>
    f2fa:	82 ef       	ldi	r24, 0xF2	; 242
    f2fc:	9a ea       	ldi	r25, 0xAA	; 170
    f2fe:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
        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 <serialprintlnPGM(char const*)>

        // 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 <lang_get_translation>
    f312:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>

        // 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 <lcd_return_to_status()>

        if(!allow_recovery) {
    f32a:	c1 11       	cpse	r28, r1
    f32c:	05 c0       	rjmp	.+10     	; 0xf338 <ThermalStop(bool)+0xb0>
            // prevent menu access for all fatal errors
            menu_set_block(MENU_BLOCK_THERMAL_ERROR);
    f32e:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
    f332:	81 60       	ori	r24, 0x01	; 1
    f334:	80 93 d4 03 	sts	0x03D4, r24	; 0x8003d4 <menu_block_mask>
        }
    }
}
    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 <kill(char const*)>:
#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_heater()>

    disable_x();
    f34c:	17 9a       	sbi	0x02, 7	; 2
    f34e:	10 92 8e 06 	sts	0x068E, r1	; 0x80068e <axis_known_position>
    disable_y();
    f352:	16 9a       	sbi	0x02, 6	; 2
    f354:	10 92 8f 06 	sts	0x068F, r1	; 0x80068f <axis_known_position+0x1>
    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 <serialprintPGM(char const*)>
    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 <serialprintlnPGM(char const*)>

    if (full_screen_message != NULL) {
    f36a:	20 97       	sbiw	r28, 0x00	; 0
    f36c:	79 f0       	breq	.+30     	; 0xf38c <kill(char const*)+0x48>
        SERIAL_ERRORLNRPGM(full_screen_message);
    f36e:	ce 01       	movw	r24, r28
    f370:	0e 94 13 79 	call	0xf226	; 0xf226 <serialprintlnPGM(char const*)>
    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 <eeprom_write_word>
    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 <eeprom_write_byte>

    // 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 <softReset>
    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 <kill(char const*)+0x30>

0000f392 <check_Z_crash()>:
#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 <check_Z_crash()+0x72>
		FORCE_HIGH_POWER_END;
    f39a:	80 e0       	ldi	r24, 0x00	; 0
    f39c:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
		current_position[Z_AXIS] = 0;
    f3a0:	10 92 99 06 	sts	0x0699, r1	; 0x800699 <current_position+0x8>
    f3a4:	10 92 9a 06 	sts	0x069A, r1	; 0x80069a <current_position+0x9>
    f3a8:	10 92 9b 06 	sts	0x069B, r1	; 0x80069b <current_position+0xa>
    f3ac:	10 92 9c 06 	sts	0x069C, r1	; 0x80069c <current_position+0xb>
		plan_set_position_curposXYZE();
    f3b0:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
		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 <current_position+0x8>
    f3c0:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
    f3c4:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
    f3c8:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
    f3cc:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
    f3d0:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
    f3d4:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
    f3d8:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
    f3dc:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
		plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
    f3e0:	e0 91 71 02 	lds	r30, 0x0271	; 0x800271 <max_feedrate>
    f3e4:	f0 91 72 02 	lds	r31, 0x0272	; 0x800272 <max_feedrate+0x1>
    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 <plan_buffer_line_curposXYZE(float)>
		st_synchronize();
    f3f4:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
		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 <lang_get_translation>
    f400:	0e 94 a2 79 	call	0xf344	; 0xf344 <kill(char const*)>
	}
}
    f404:	08 95       	ret

0000f406 <homeaxis(unsigned char, unsigned char, unsigned char*)>:
#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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x52>
    f456:	d4 c1       	rjmp	.+936    	; 0xf800 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x3fa>
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 <feedrate>
    f498:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    f49c:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    f4a0:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
        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 <get_feedrate_mm_s(float)>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0xb2>
    f4b6:	88 0f       	add	r24, r24
    f4b8:	0a 94       	dec	r0
    f4ba:	ea f7       	brpl	.-6      	; 0xf4b6 <homeaxis(unsigned char, unsigned char, unsigned char*)+0xb0>
    f4bc:	0f 94 b4 26 	call	0x24d68	; 0x24d68 <tmc2130_home_enter(unsigned char)>


        // 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 <plan_set_position_curposXYZE()>
		set_destination_to_current();
    f4da:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
//        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 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f520:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        // 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 <endstops_hit_on_purpose()>
    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 <plan_set_position_curposXYZE()>
        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 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f552:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f596:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <endstops_hit_on_purpose()>
    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 <plan_set_position_curposXYZE()>
			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 <plan_buffer_line_destinationXYZE(float)>
			st_synchronize();
    f5de:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
			endstops_hit_on_purpose();
    f5e2:	0f 94 bf 4e 	call	0x29d7e	; 0x29d7e <endstops_hit_on_purpose()>
    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 <feedrate>
    f616:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    f61a:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    f61e:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
#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 <plan_buffer_line_destinationXYZE(float)>
			st_synchronize();
    f62a:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
#ifdef TMC2130
			uint16_t mscnt = tmc2130_rd_MSCNT(axis);
    f62e:	82 2d       	mov	r24, r2
    f630:	0f 94 51 25 	call	0x24aa2	; 0x24aa2 <tmc2130_rd_MSCNT(unsigned char)>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x232>
			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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x24a>
    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 <printf_P>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x27a>
    f67e:	91 cf       	rjmp	.-222    	; 0xf5a2 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x19c>
			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 <endstops_hit_on_purpose()>
    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 <tmc2130_home_enabled>
    f68c:	88 23       	and	r24, r24
    f68e:	09 f4       	brne	.+2      	; 0xf692 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x28c>
    f690:	b2 c0       	rjmp	.+356    	; 0xf7f6 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x3f0>
		}
		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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x29a>
    f69e:	ab c0       	rjmp	.+342    	; 0xf7f6 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x3f0>
		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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x2b6>
    f6b8:	56 95       	lsr	r21
    f6ba:	47 95       	ror	r20
    f6bc:	8a 95       	dec	r24
    f6be:	e2 f7       	brpl	.-8      	; 0xf6b8 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x2b2>
		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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]>
			if (back > 0)
    f6c6:	bb 81       	ldd	r27, Y+3	; 0x03
    f6c8:	bb 23       	and	r27, r27
    f6ca:	39 f0       	breq	.+14     	; 0xf6da <homeaxis(unsigned char, unsigned char, unsigned char*)+0x2d4>
				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_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]>
		tmc2130_home_exit();
    f6da:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
#endif //TMC2130

        axis_is_at_home(axis);
    f6de:	82 2d       	mov	r24, r2
    f6e0:	0e 94 42 5a 	call	0xb484	; 0xb484 <axis_is_at_home(unsigned char)>
        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 <plan_set_position_curposXYZE()>
        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 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f7aa:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

   		feedrate = 0.0;
    f7ae:	10 92 b8 02 	sts	0x02B8, r1	; 0x8002b8 <feedrate>
    f7b2:	10 92 b9 02 	sts	0x02B9, r1	; 0x8002b9 <feedrate+0x1>
    f7b6:	10 92 ba 02 	sts	0x02BA, r1	; 0x8002ba <feedrate+0x2>
    f7ba:	10 92 bb 02 	sts	0x02BB, r1	; 0x8002bb <feedrate+0x3>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)+0x2ce>
   		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 <force_high_power_mode(bool)>
#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 <current_position+0x8>
    f812:	10 92 9a 06 	sts	0x069A, r1	; 0x80069a <current_position+0x9>
    f816:	10 92 9b 06 	sts	0x069B, r1	; 0x80069b <current_position+0xa>
    f81a:	10 92 9c 06 	sts	0x069C, r1	; 0x80069c <current_position+0xb>
        plan_set_position_curposXYZE();
    f81e:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>

#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 <destination+0x8>
    f85e:	70 93 7c 06 	sts	0x067C, r23	; 0x80067c <destination+0x9>
    f862:	80 93 7d 06 	sts	0x067D, r24	; 0x80067d <destination+0xa>
    f866:	90 93 7e 06 	sts	0x067E, r25	; 0x80067e <destination+0xb>
        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 <feedrate>
    f876:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    f87a:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    f87e:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
        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 <get_feedrate_mm_s(float)>
    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 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f892:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
#ifdef TMC2130
        check_Z_crash();
    f896:	0e 94 c9 79 	call	0xf392	; 0xf392 <check_Z_crash()>
#endif //TMC2130
        current_position[axis] = 0;
    f89a:	10 92 99 06 	sts	0x0699, r1	; 0x800699 <current_position+0x8>
    f89e:	10 92 9a 06 	sts	0x069A, r1	; 0x80069a <current_position+0x9>
    f8a2:	10 92 9b 06 	sts	0x069B, r1	; 0x80069b <current_position+0xa>
    f8a6:	10 92 9c 06 	sts	0x069C, r1	; 0x80069c <current_position+0xb>
        plan_set_position_curposXYZE();
    f8aa:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>

#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 <destination+0x8>
    f8c8:	70 93 7c 06 	sts	0x067C, r23	; 0x80067c <destination+0x9>
    f8cc:	80 93 7d 06 	sts	0x067D, r24	; 0x80067d <destination+0xa>
    f8d0:	90 93 7e 06 	sts	0x067E, r25	; 0x80067e <destination+0xb>
        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 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f8dc:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

#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 <destination+0x8>
    f900:	70 93 7c 06 	sts	0x067C, r23	; 0x80067c <destination+0x9>
    f904:	80 93 7d 06 	sts	0x067D, r24	; 0x80067d <destination+0xa>
    f908:	90 93 7e 06 	sts	0x067E, r25	; 0x80067e <destination+0xb>
        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 <feedrate>
    f918:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    f91c:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    f920:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
        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 <get_feedrate_mm_s(float)>
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
    f92c:	0f 94 0a c0 	call	0x38014	; 0x38014 <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
    f930:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
#ifdef TMC2130
        check_Z_crash();
    f934:	0e 94 c9 79 	call	0xf392	; 0xf392 <check_Z_crash()>
#endif //TMC2130
        axis_is_at_home(axis);
    f938:	82 e0       	ldi	r24, 0x02	; 2
    f93a:	0e 94 42 5a 	call	0xb484	; 0xb484 <axis_is_at_home(unsigned char)>
        destination[axis] = current_position[axis];
    f93e:	80 91 99 06 	lds	r24, 0x0699	; 0x800699 <current_position+0x8>
    f942:	90 91 9a 06 	lds	r25, 0x069A	; 0x80069a <current_position+0x9>
    f946:	a0 91 9b 06 	lds	r26, 0x069B	; 0x80069b <current_position+0xa>
    f94a:	b0 91 9c 06 	lds	r27, 0x069C	; 0x80069c <current_position+0xb>
    f94e:	80 93 7b 06 	sts	0x067B, r24	; 0x80067b <destination+0x8>
    f952:	90 93 7c 06 	sts	0x067C, r25	; 0x80067c <destination+0x9>
    f956:	a0 93 7d 06 	sts	0x067D, r26	; 0x80067d <destination+0xa>
    f95a:	b0 93 7e 06 	sts	0x067E, r27	; 0x80067e <destination+0xb>
        feedrate = 0.0;
    f95e:	10 92 b8 02 	sts	0x02B8, r1	; 0x8002b8 <feedrate>
    f962:	10 92 b9 02 	sts	0x02B9, r1	; 0x8002b9 <feedrate+0x1>
    f966:	10 92 ba 02 	sts	0x02BA, r1	; 0x8002ba <feedrate+0x2>
    f96a:	10 92 bb 02 	sts	0x02BB, r1	; 0x8002bb <feedrate+0x3>
        endstops_hit_on_purpose();
    f96e:	0f 94 bf 4e 	call	0x29d7e	; 0x29d7e <endstops_hit_on_purpose()>
        axis_known_position[axis] = true;
    f972:	70 92 90 06 	sts	0x0690, r7	; 0x800690 <axis_known_position+0x2>
#ifdef TMC2130
		FORCE_HIGH_POWER_END;
    f976:	80 e0       	ldi	r24, 0x00	; 0
    f978:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
    f97c:	20 cf       	rjmp	.-448    	; 0xf7be <homeaxis(unsigned char, unsigned char, unsigned char*)+0x3b8>

0000f97e <gcode_G28(bool, long, bool, long, bool, long, bool, bool)>:
#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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x26>
    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 <st_synchronize()>
	homing_flag = true;
    f9c0:	81 e0       	ldi	r24, 0x01	; 1
    f9c2:	80 93 a6 0d 	sts	0x0DA6, r24	; 0x800da6 <homing_flag>
	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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x70>
    f9ce:	ed 2c       	mov	r14, r13
    f9d0:	dc 10       	cpse	r13, r12
    f9d2:	0d c0       	rjmp	.+26     	; 0xf9ee <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x70>
		// 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 <raise_z_above(float)>

	// 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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x72>
	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 <world2machine_revert_to_uncorrected()>
      // 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 <mbl>
    f9f8:	8d 83       	std	Y+5, r24	; 0x05
      mbl.active = 0;
    f9fa:	10 92 c1 13 	sts	0x13C1, r1	; 0x8013c1 <mbl>
      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 <st_get_position_mm(unsigned char)>
    fa04:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
    fa08:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
    fa0c:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
    fa10:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
#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 <babystep_undo()>

      int l_feedmultiply = setup_for_endstop_move();
    fa1a:	81 e0       	ldi	r24, 0x01	; 1
    fa1c:	0e 94 80 66 	call	0xcd00	; 0xcd00 <setup_for_endstop_move(bool) [clone .lto_priv.392]>
    fa20:	8c 01       	movw	r16, r24

      set_destination_to_current();
    fa22:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
      feedrate = 0.0;
    fa26:	10 92 b8 02 	sts	0x02B8, r1	; 0x8002b8 <feedrate>
    fa2a:	10 92 b9 02 	sts	0x02B9, r1	; 0x8002b9 <feedrate+0x1>
    fa2e:	10 92 ba 02 	sts	0x02BA, r1	; 0x8002ba <feedrate+0x2>
    fa32:	10 92 bb 02 	sts	0x02BB, r1	; 0x8002bb <feedrate+0x3>
        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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0xbe>
    fa3a:	77 c1       	rjmp	.+750    	; 0xfd2a <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x3ac>
	  {
		if (!calib)
    fa3c:	9b 8d       	ldd	r25, Y+27	; 0x1b
    fa3e:	91 11       	cpse	r25, r1
    fa40:	6a c1       	rjmp	.+724    	; 0xfd16 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x398>
			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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
		else
			tmc2130_home_calibrate(X_AXIS);
	  }

      if(home_y)
    fa4e:	ee 20       	and	r14, r14
    fa50:	31 f0       	breq	.+12     	; 0xfa5e <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0xe0>
	  {
		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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
      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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x11e>
    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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x11e>
        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 <cs+0x58>
    fa7c:	70 91 16 0e 	lds	r23, 0x0E16	; 0x800e16 <cs+0x59>
    fa80:	80 91 17 0e 	lds	r24, 0x0E17	; 0x800e17 <cs+0x5a>
    fa84:	90 91 18 0e 	lds	r25, 0x0E18	; 0x800e18 <cs+0x5b>
    fa88:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
    fa8c:	60 93 91 06 	sts	0x0691, r22	; 0x800691 <current_position>
    fa90:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
    fa94:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
    fa98:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>

      if(home_y_axis && home_y_value != 0)
    fa9c:	33 20       	and	r3, r3
    fa9e:	01 f1       	breq	.+64     	; 0xfae0 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x162>
    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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x162>
        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 <cs+0x5c>
    fac0:	70 91 1a 0e 	lds	r23, 0x0E1A	; 0x800e1a <cs+0x5d>
    fac4:	80 91 1b 0e 	lds	r24, 0x0E1B	; 0x800e1b <cs+0x5e>
    fac8:	90 91 1c 0e 	lds	r25, 0x0E1C	; 0x800e1c <cs+0x5f>
    facc:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
    fad0:	60 93 95 06 	sts	0x0695, r22	; 0x800695 <current_position+0x4>
    fad4:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
    fad8:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
    fadc:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>

      #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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x168>
    fae4:	a2 c0       	rjmp	.+324    	; 0xfc2a <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x2ac>
            #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 <raise_z_above(float)>
              if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS);
    faf2:	80 91 8e 06 	lds	r24, 0x068E	; 0x80068e <axis_known_position>
    faf6:	81 11       	cpse	r24, r1
    faf8:	05 c0       	rjmp	.+10     	; 0xfb04 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x186>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
              if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS);
    fb04:	80 91 8f 06 	lds	r24, 0x068F	; 0x80068f <axis_known_position+0x1>
    fb08:	81 11       	cpse	r24, r1
    fb0a:	06 c0       	rjmp	.+12     	; 0xfb18 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x19a>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
              // 1st mesh bed leveling measurement point, corrected.
              world2machine_initialize();
    fb18:	0f 94 8f ce 	call	0x39d1e	; 0x39d1e <world2machine_initialize()>
              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 <destination>
    fb38:	50 93 74 06 	sts	0x0674, r21	; 0x800674 <destination+0x1>
    fb3c:	60 93 75 06 	sts	0x0675, r22	; 0x800675 <destination+0x2>
    fb40:	70 93 76 06 	sts	0x0676, r23	; 0x800676 <destination+0x3>
    out_y = y;
    fb44:	80 93 77 06 	sts	0x0677, r24	; 0x800677 <destination+0x4>
    fb48:	90 93 78 06 	sts	0x0678, r25	; 0x800678 <destination+0x5>
    fb4c:	a0 93 79 06 	sts	0x0679, r26	; 0x800679 <destination+0x6>
    fb50:	b0 93 7a 06 	sts	0x067A, r27	; 0x80067a <destination+0x7>
    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(float&, float&)>
              world2machine_reset();
    fb60:	0f 94 f1 cd 	call	0x39be2	; 0x39be2 <world2machine_reset()>
              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 <destination+0x4>
    fb70:	70 91 78 06 	lds	r23, 0x0678	; 0x800678 <destination+0x5>
    fb74:	80 91 79 06 	lds	r24, 0x0679	; 0x800679 <destination+0x6>
    fb78:	90 91 7a 06 	lds	r25, 0x067A	; 0x80067a <destination+0x7>
    fb7c:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
    fb80:	87 ff       	sbrs	r24, 7
    fb82:	0c c0       	rjmp	.+24     	; 0xfb9c <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x21e>
                  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 <destination+0x4>
    fb90:	90 93 78 06 	sts	0x0678, r25	; 0x800678 <destination+0x5>
    fb94:	a0 93 79 06 	sts	0x0679, r26	; 0x800679 <destination+0x6>
    fb98:	b0 93 7a 06 	sts	0x067A, r27	; 0x80067a <destination+0x7>
              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 <feedrate>
    fba8:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
    fbac:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
    fbb0:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>
    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 <plan_set_position_curposXYZE()>
              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 <feedrate>
    fbc0:	70 91 b9 02 	lds	r23, 0x02B9	; 0x8002b9 <feedrate+0x1>
    fbc4:	80 91 ba 02 	lds	r24, 0x02BA	; 0x8002ba <feedrate+0x2>
    fbc8:	90 91 bb 02 	lds	r25, 0x02BB	; 0x8002bb <feedrate+0x3>
    fbcc:	0f 94 0a c0 	call	0x38014	; 0x38014 <plan_buffer_line_destinationXYZE(float)>
              st_synchronize();
    fbd0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
              current_position[X_AXIS] = destination[X_AXIS];
    fbd4:	80 91 73 06 	lds	r24, 0x0673	; 0x800673 <destination>
    fbd8:	90 91 74 06 	lds	r25, 0x0674	; 0x800674 <destination+0x1>
    fbdc:	a0 91 75 06 	lds	r26, 0x0675	; 0x800675 <destination+0x2>
    fbe0:	b0 91 76 06 	lds	r27, 0x0676	; 0x800676 <destination+0x3>
    fbe4:	80 93 91 06 	sts	0x0691, r24	; 0x800691 <current_position>
    fbe8:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
    fbec:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
    fbf0:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
              current_position[Y_AXIS] = destination[Y_AXIS];
    fbf4:	80 91 77 06 	lds	r24, 0x0677	; 0x800677 <destination+0x4>
    fbf8:	90 91 78 06 	lds	r25, 0x0678	; 0x800678 <destination+0x5>
    fbfc:	a0 91 79 06 	lds	r26, 0x0679	; 0x800679 <destination+0x6>
    fc00:	b0 91 7a 06 	lds	r27, 0x067A	; 0x80067a <destination+0x7>
    fc04:	80 93 95 06 	sts	0x0695, r24	; 0x800695 <current_position+0x4>
    fc08:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
    fc0c:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
    fc10:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
    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 <endstops_hit_on_purpose()>
              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(unsigned char, unsigned char, unsigned char*)>
              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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x2ea>
    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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x2ea>
        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 <cs+0x60>
    fc48:	70 91 1e 0e 	lds	r23, 0x0E1E	; 0x800e1e <cs+0x61>
    fc4c:	80 91 1f 0e 	lds	r24, 0x0E1F	; 0x800e1f <cs+0x62>
    fc50:	90 91 20 0e 	lds	r25, 0x0E20	; 0x800e20 <cs+0x63>
    fc54:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
    fc58:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
    fc5c:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
    fc60:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
    fc64:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>

      // 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 <plan_set_position_curposXYZE()>

      clean_up_after_endstop_move(l_feedmultiply);
    fc6c:	c8 01       	movw	r24, r16
    fc6e:	0e 94 66 66 	call	0xcccc	; 0xcccc <clean_up_after_endstop_move(int) [clone .lto_priv.393]>
      endstops_hit_on_purpose();
    fc72:	0f 94 bf 4e 	call	0x29d7e	; 0x29d7e <endstops_hit_on_purpose()>

    // Load the machine correction matrix
    world2machine_initialize();
    fc76:	0f 94 8f ce 	call	0x39d1e	; 0x39d1e <world2machine_initialize()>
    // and correct the current_position XY axes to match the transformed coordinate system.
    world2machine_update_current();
    fc7a:	0f 94 2d cc 	call	0x3985a	; 0x3985a <world2machine_update_current()>

#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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x312>
    fc82:	31 10       	cpse	r3, r1
    fc84:	05 c0       	rjmp	.+10     	; 0xfc90 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x312>
    fc86:	8c 8d       	ldd	r24, Y+28	; 0x1c
    fc88:	81 11       	cpse	r24, r1
    fc8a:	02 c0       	rjmp	.+4      	; 0xfc90 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x312>
    fc8c:	cc 20       	and	r12, r12
    fc8e:	39 f1       	breq	.+78     	; 0xfcde <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x360>
    {
      if (! home_z && mbl_was_active) {
    fc90:	f1 10       	cpse	r15, r1
    fc92:	25 c0       	rjmp	.+74     	; 0xfcde <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x360>
    fc94:	9d 81       	ldd	r25, Y+5	; 0x05
    fc96:	99 23       	and	r25, r25
    fc98:	11 f1       	breq	.+68     	; 0xfcde <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x360>
        // 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 <mbl>
        // 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 <st_get_position_mm(unsigned char)>
    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 <st_get_position_mm(unsigned char)>
    fcae:	a7 01       	movw	r20, r14
    fcb0:	96 01       	movw	r18, r12
    fcb2:	0f 94 a5 a1 	call	0x3434a	; 0x3434a <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]>
    fcb6:	9b 01       	movw	r18, r22
    fcb8:	ac 01       	movw	r20, r24
    fcba:	60 91 99 06 	lds	r22, 0x0699	; 0x800699 <current_position+0x8>
    fcbe:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
    fcc2:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
    fcc6:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
    fcca:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
    fcce:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
    fcd2:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
    fcd6:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
    fcda:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
    }
#endif

      prusa_statistics(20);

      st_synchronize();
    fcde:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
	  homing_flag = false;
    fce2:	10 92 a6 0d 	sts	0x0DA6, r1	; 0x800da6 <homing_flag>
#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 <tmc2130_home_calibrate(unsigned char)>
	  }

      if(home_y)
    fd1c:	ee 20       	and	r14, r14
    fd1e:	09 f4       	brne	.+2      	; 0xfd22 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x3a4>
    fd20:	9e ce       	rjmp	.-708    	; 0xfa5e <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0xe0>
	  {
		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 <tmc2130_home_calibrate(unsigned char)>
    fd28:	9a ce       	rjmp	.-716    	; 0xfa5e <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0xe0>
			homeaxis(X_AXIS);
		else
			tmc2130_home_calibrate(X_AXIS);
	  }

      if(home_y)
    fd2a:	ee 20       	and	r14, r14
    fd2c:	09 f4       	brne	.+2      	; 0xfd30 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x3b2>
    fd2e:	97 ce       	rjmp	.-722    	; 0xfa5e <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0xe0>
	  {
		if (!calib)
    fd30:	ab 8d       	ldd	r26, Y+27	; 0x1b
    fd32:	aa 23       	and	r26, r26
    fd34:	09 f4       	brne	.+2      	; 0xfd38 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x3ba>
    fd36:	8d ce       	rjmp	.-742    	; 0xfa52 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0xd4>
    fd38:	f4 cf       	rjmp	.-24     	; 0xfd22 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)+0x3a4>

0000fd3a <gcode_G28(bool, bool, bool)>:
      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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)>
    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 <ClearToSend()>:

// 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 <Timer<unsigned long>::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 <buflen>
    fd90:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
    fd94:	89 2b       	or	r24, r25
    fd96:	79 f0       	breq	.+30     	; 0xfdb6 <ClearToSend()+0x32>
    fd98:	e0 91 91 12 	lds	r30, 0x1291	; 0x801291 <bufindr>
    fd9c:	f0 91 92 12 	lds	r31, 0x1292	; 0x801292 <bufindr+0x1>
    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 <ClearToSend()+0x2a>
    fdaa:	86 30       	cpi	r24, 0x06	; 6
    fdac:	21 f4       	brne	.+8      	; 0xfdb6 <ClearToSend()+0x32>
		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 <serialprintlnPGM(char const*)>
}
    fdb6:	08 95       	ret

0000fdb8 <cmdqueue_reset()>:

void cmdqueue_reset()
{
	while (buflen)
    fdb8:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
    fdbc:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
    fdc0:	89 2b       	or	r24, r25
    fdc2:	29 f0       	breq	.+10     	; 0xfdce <cmdqueue_reset()+0x16>
	{
		// printf_P(PSTR("dumping: \"%s\" of type %u\n"), cmdbuffer+bufindr+CMDHDRSIZE, CMDBUFFER_CURRENT_TYPE);
		ClearToSend();
    fdc4:	0e 94 c2 7e 	call	0xfd84	; 0xfd84 <ClearToSend()>
		cmdqueue_pop_front();
    fdc8:	0e 94 54 76 	call	0xeca8	; 0xeca8 <cmdqueue_pop_front()>
    fdcc:	f5 cf       	rjmp	.-22     	; 0xfdb8 <cmdqueue_reset()>
	}
	bufindr = 0;
    fdce:	10 92 92 12 	sts	0x1292, r1	; 0x801292 <bufindr+0x1>
    fdd2:	10 92 91 12 	sts	0x1291, r1	; 0x801291 <bufindr>
	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 <cmdbuffer_front_already_processed>
}
    fde4:	08 95       	ret

0000fde6 <gcode_G81_M420()>:
}

// 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 <mbl>
    fdf6:	88 23       	and	r24, r24
    fdf8:	89 f1       	breq	.+98     	; 0xfe5c <gcode_G81_M420()+0x76>
        }
    }
}

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 <serialprintlnPGM(char const*)>
    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 <serialprintlnPGM(char const*)>
    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 <serialprintlnPGM(char const*)>
    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 <gcode_G81_M420()+0x8a>
    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 <serialprintPGM(char const*)>
            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 <MarlinSerial::printFloat(double, unsigned char)>
    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 <gcode_G81_M420()+0x3e>
            SERIAL_PROTOCOLPGM("  ");
            SERIAL_PROTOCOL_F(z_values[y][x], 5);
        }
        SERIAL_PROTOCOLLN();
    fe56:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
    fe5a:	dd cf       	rjmp	.-70     	; 0xfe16 <gcode_G81_M420()+0x30>
        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 <serialprintlnPGM(char const*)>
    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 <host_keepalive()>:

/**
* 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 <millis2>
    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 <host_keepalive_interval>
    fe9a:	22 23       	and	r18, r18
    fe9c:	09 f1       	breq	.+66     	; 0xfee0 <host_keepalive()+0x62>
    fe9e:	40 91 be 02 	lds	r20, 0x02BE	; 0x8002be <busy_state>
    fea2:	41 30       	cpi	r20, 0x01	; 1
    fea4:	e9 f0       	breq	.+58     	; 0xfee0 <host_keepalive()+0x62>
    if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
    fea6:	80 91 10 02 	lds	r24, 0x0210	; 0x800210 <prev_busy_signal_ms>
    feaa:	90 91 11 02 	lds	r25, 0x0211	; 0x800211 <prev_busy_signal_ms+0x1>
    feae:	a0 91 12 02 	lds	r26, 0x0212	; 0x800212 <prev_busy_signal_ms+0x2>
    feb2:	b0 91 13 02 	lds	r27, 0x0213	; 0x800213 <prev_busy_signal_ms+0x3>
    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 <host_keepalive()+0x72>
     switch (busy_state) {
    fed6:	44 30       	cpi	r20, 0x04	; 4
    fed8:	31 f1       	breq	.+76     	; 0xff26 <host_keepalive()+0xa8>
    feda:	9c f4       	brge	.+38     	; 0xff02 <host_keepalive()+0x84>
    fedc:	42 30       	cpi	r20, 0x02	; 2
    fede:	d4 f4       	brge	.+52     	; 0xff14 <host_keepalive()+0x96>
        break;
      default:
	break;
    }
  }
  prev_busy_signal_ms = ms;
    fee0:	c0 92 10 02 	sts	0x0210, r12	; 0x800210 <prev_busy_signal_ms>
    fee4:	d0 92 11 02 	sts	0x0211, r13	; 0x800211 <prev_busy_signal_ms+0x1>
    fee8:	e0 92 12 02 	sts	0x0212, r14	; 0x800212 <prev_busy_signal_ms+0x2>
    feec:	f0 92 13 02 	sts	0x0213, r15	; 0x800213 <prev_busy_signal_ms+0x3>
}
    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 <host_keepalive()+0x62>
      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 <serialprintPGM(char const*)>
        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 <host_keepalive()+0xa2>
  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 <serialprintPGM(char const*)>
        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 <serialprintlnPGM(char const*)>
    ff24:	dd cf       	rjmp	.-70     	; 0xfee0 <host_keepalive()+0x62>
      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 <serialprintPGM(char const*)>
        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 <host_keepalive()+0xa2>

0000ff34 <checkFans()>:
    //}
}
#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 <millis2>
    ff50:	00 91 bf 17 	lds	r16, 0x17BF	; 0x8017bf <extruder_autofan_last_check>
    ff54:	10 91 c0 17 	lds	r17, 0x17C0	; 0x8017c0 <extruder_autofan_last_check+0x1>
    ff58:	20 91 c1 17 	lds	r18, 0x17C1	; 0x8017c1 <extruder_autofan_last_check+0x2>
    ff5c:	30 91 c2 17 	lds	r19, 0x17C2	; 0x8017c2 <extruder_autofan_last_check+0x3>
    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 <checkFans()+0x72>
    ff72:	80 91 6e 06 	lds	r24, 0x066E	; 0x80066e <fan_measuring>
    ff76:	81 11       	cpse	r24, r1
    ff78:	16 c0       	rjmp	.+44     	; 0xffa6 <checkFans()+0x72>
	  extruder_autofan_last_check = _millis();
    ff7a:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    ff7e:	60 93 bf 17 	sts	0x17BF, r22	; 0x8017bf <extruder_autofan_last_check>
    ff82:	70 93 c0 17 	sts	0x17C0, r23	; 0x8017c0 <extruder_autofan_last_check+0x1>
    ff86:	80 93 c1 17 	sts	0x17C1, r24	; 0x8017c1 <extruder_autofan_last_check+0x2>
    ff8a:	90 93 c2 17 	sts	0x17C2, r25	; 0x8017c2 <extruder_autofan_last_check+0x3>
	  fanSpeedBckp = fanSpeedSoftPwm;
    ff8e:	80 91 a5 04 	lds	r24, 0x04A5	; 0x8004a5 <fanSpeedSoftPwm>
    ff92:	80 93 14 02 	sts	0x0214, r24	; 0x800214 <fanSpeedBckp>

	  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 <checkFans()+0x6c>
		//  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 <fanSpeedSoftPwm>
	  }
	  fan_measuring = true;
    ffa0:	81 e0       	ldi	r24, 0x01	; 1
    ffa2:	80 93 6e 06 	sts	0x066E, r24	; 0x80066e <fan_measuring>
  }
  if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) {
    ffa6:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    ffaa:	00 91 bf 17 	lds	r16, 0x17BF	; 0x8017bf <extruder_autofan_last_check>
    ffae:	10 91 c0 17 	lds	r17, 0x17C0	; 0x8017c0 <extruder_autofan_last_check+0x1>
    ffb2:	20 91 c1 17 	lds	r18, 0x17C1	; 0x8017c1 <extruder_autofan_last_check+0x2>
    ffb6:	30 91 c2 17 	lds	r19, 0x17C2	; 0x8017c2 <extruder_autofan_last_check+0x3>
    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 <checkFans()+0x9a>
    ffcc:	57 c1       	rjmp	.+686    	; 0x1027c <checkFans()+0x348>
    ffce:	80 91 6e 06 	lds	r24, 0x066E	; 0x80066e <fan_measuring>
    ffd2:	88 23       	and	r24, r24
    ffd4:	09 f4       	brne	.+2      	; 0xffd8 <checkFans()+0xa4>
    ffd6:	52 c1       	rjmp	.+676    	; 0x1027c <checkFans()+0x348>
#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 <fan_edge_counter>
    ffdc:	70 91 e2 05 	lds	r23, 0x05E2	; 0x8005e2 <fan_edge_counter+0x1>
    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 <millis2>
    fff4:	00 91 bf 17 	lds	r16, 0x17BF	; 0x8017bf <extruder_autofan_last_check>
    fff8:	10 91 c0 17 	lds	r17, 0x17C0	; 0x8017c0 <extruder_autofan_last_check+0x1>
    fffc:	20 91 c1 17 	lds	r18, 0x17C1	; 0x8017c1 <extruder_autofan_last_check+0x2>
   10000:	30 91 c2 17 	lds	r19, 0x17C2	; 0x8017c2 <extruder_autofan_last_check+0x3>
   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 <fan_speed+0x1>
   10030:	60 93 c7 03 	sts	0x03C7, r22	; 0x8003c7 <fan_speed>
    fan_speed[1] = (fan_edge_counter[1] * (float(250) / (_millis() - extruder_autofan_last_check)));
   10034:	60 91 e3 05 	lds	r22, 0x05E3	; 0x8005e3 <fan_edge_counter+0x2>
   10038:	70 91 e4 05 	lds	r23, 0x05E4	; 0x8005e4 <fan_edge_counter+0x3>
   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 <millis2>
   10050:	00 91 bf 17 	lds	r16, 0x17BF	; 0x8017bf <extruder_autofan_last_check>
   10054:	10 91 c0 17 	lds	r17, 0x17C0	; 0x8017c0 <extruder_autofan_last_check+0x1>
   10058:	20 91 c1 17 	lds	r18, 0x17C1	; 0x8017c1 <extruder_autofan_last_check+0x2>
   1005c:	30 91 c2 17 	lds	r19, 0x17C2	; 0x8017c2 <extruder_autofan_last_check+0x3>
   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 <fan_speed+0x3>
   1008e:	60 93 c9 03 	sts	0x03C9, r22	; 0x8003c9 <fan_speed+0x2>
    /*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 <fan_edge_counter+0x1>
   10096:	10 92 e1 05 	sts	0x05E1, r1	; 0x8005e1 <fan_edge_counter>
    fan_edge_counter[1] = 0;
   1009a:	10 92 e4 05 	sts	0x05E4, r1	; 0x8005e4 <fan_edge_counter+0x3>
   1009e:	10 92 e3 05 	sts	0x05E3, r1	; 0x8005e3 <fan_edge_counter+0x2>

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 <fans_check_enabled>
   100ae:	88 23       	and	r24, r24
   100b0:	51 f0       	breq	.+20     	; 0x100c6 <checkFans()+0x192>
        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 <eeprom_read_byte>
   100ba:	91 e0       	ldi	r25, 0x01	; 1
   100bc:	81 11       	cpse	r24, r1
   100be:	01 c0       	rjmp	.+2      	; 0x100c2 <checkFans()+0x18e>
   100c0:	90 e0       	ldi	r25, 0x00	; 0
   100c2:	90 93 38 02 	sts	0x0238, r25	; 0x800238 <fans_check_enabled>
    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 <fan_speed>
   100ca:	90 91 c8 03 	lds	r25, 0x03C8	; 0x8003c8 <fan_speed+0x1>
   100ce:	44 97       	sbiw	r24, 0x14	; 20
   100d0:	0c f0       	brlt	.+2      	; 0x100d4 <checkFans()+0x1a0>
   100d2:	9d c0       	rjmp	.+314    	; 0x1020e <checkFans()+0x2da>
   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 <current_temperature>
   100e0:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   100e4:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   100e8:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   100ec:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   100f0:	18 16       	cp	r1, r24
   100f2:	0c f0       	brlt	.+2      	; 0x100f6 <checkFans()+0x1c2>
   100f4:	8c c0       	rjmp	.+280    	; 0x1020e <checkFans()+0x2da>
   100f6:	80 91 4c 03 	lds	r24, 0x034C	; 0x80034c <checkFanSpeed()::fan_speed_errors>
   100fa:	8f 5f       	subi	r24, 0xFF	; 255
   100fc:	80 93 4c 03 	sts	0x034C, r24	; 0x80034c <checkFanSpeed()::fan_speed_errors>
    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 <checkFans()+0x1d4>
   10106:	89 c0       	rjmp	.+274    	; 0x1021a <checkFans()+0x2e6>
  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 <block_buffer_head>
   1010c:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   10110:	98 17       	cp	r25, r24
   10112:	09 f4       	brne	.+2      	; 0x10116 <checkFans()+0x1e2>
   10114:	7f c0       	rjmp	.+254    	; 0x10214 <checkFans()+0x2e0>
   10116:	e0 91 a5 0d 	lds	r30, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <checkFans()+0x1fa>
   1012c:	76 c0       	rjmp	.+236    	; 0x1021a <checkFans()+0x2e6>
   1012e:	80 91 4d 03 	lds	r24, 0x034D	; 0x80034d <checkFanSpeed()::fan_speed_errors+0x1>
   10132:	8f 5f       	subi	r24, 0xFF	; 255
   10134:	80 93 4d 03 	sts	0x034D, r24	; 0x80034d <checkFanSpeed()::fan_speed_errors+0x1>
    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 <checkFanSpeed()::fan_speed_errors>
   1013c:	81 11       	cpse	r24, r1
   1013e:	0b c0       	rjmp	.+22     	; 0x10156 <checkFans()+0x222>
   10140:	80 91 4d 03 	lds	r24, 0x034D	; 0x80034d <checkFanSpeed()::fan_speed_errors+0x1>
   10144:	81 11       	cpse	r24, r1
   10146:	07 c0       	rjmp	.+14     	; 0x10156 <checkFans()+0x222>
   10148:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   1014c:	82 30       	cpi	r24, 0x02	; 2
   1014e:	19 f4       	brne	.+6      	; 0x10156 <checkFans()+0x222>
        // 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 <fan_check_error>
    }
    if ((fan_check_error == EFCE_FIXED) && !printer_active()){
   10156:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   1015a:	81 30       	cpi	r24, 0x01	; 1
   1015c:	61 f4       	brne	.+24     	; 0x10176 <checkFans()+0x242>
   1015e:	0e 94 79 67 	call	0xcef2	; 0xcef2 <printer_active()>
   10162:	81 11       	cpse	r24, r1
   10164:	08 c0       	rjmp	.+16     	; 0x10176 <checkFans()+0x242>
        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 <fan_check_error>
    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 <lcd_setstatuspgm(char const*)>
    }
    if (fans_check_enabled && (fan_check_error != EFCE_REPORTED))
   10176:	80 91 38 02 	lds	r24, 0x0238	; 0x800238 <fans_check_enabled>
   1017a:	88 23       	and	r24, r24
   1017c:	09 f4       	brne	.+2      	; 0x10180 <checkFans()+0x24c>
   1017e:	6e c0       	rjmp	.+220    	; 0x1025c <checkFans()+0x328>
   10180:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   10184:	82 30       	cpi	r24, 0x02	; 2
   10186:	09 f4       	brne	.+2      	; 0x1018a <checkFans()+0x256>
   10188:	69 c0       	rjmp	.+210    	; 0x1025c <checkFans()+0x328>
   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 <checkFans()+0x2d2>
            {
                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 <fan_check_error>
   101b6:	82 30       	cpi	r24, 0x02	; 2
   101b8:	31 f1       	breq	.+76     	; 0x10206 <checkFans()+0x2d2>
    fan_check_error = EFCE_REPORTED;
   101ba:	00 93 e4 03 	sts	0x03E4, r16	; 0x8003e4 <fan_check_error>

    if (printJobOngoing()) {
   101be:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
   101c2:	88 23       	and	r24, r24
   101c4:	81 f1       	breq	.+96     	; 0x10226 <checkFans()+0x2f2>
        // A print is ongoing, pause the print normally
        if(!printingIsPaused()) {
   101c6:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   101ca:	81 11       	cpse	r24, r1
   101cc:	06 c0       	rjmp	.+12     	; 0x101da <checkFans()+0x2a6>
            if (usb_timer.running())
   101ce:	80 91 0d 05 	lds	r24, 0x050D	; 0x80050d <usb_timer>
   101d2:	88 23       	and	r24, r24
   101d4:	29 f1       	breq	.+74     	; 0x10220 <checkFans()+0x2ec>
                lcd_pause_usb_print();
   101d6:	0f 94 75 15 	call	0x22aea	; 0x22aea <lcd_pause_usb_print()>
    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 <checkFans()+0x300>
//! 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 <serialprintlnPGM(char const*)>
    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 <checkFans()+0x2d2>
        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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        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_setalertstatuspgm(char const*, unsigned char)>
        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 <checkFans()+0x328>
   1020a:	11 e0       	ldi	r17, 0x01	; 1
   1020c:	c7 cf       	rjmp	.-114    	; 0x1019c <checkFans()+0x268>
    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 <checkFanSpeed()::fan_speed_errors>
   10212:	76 cf       	rjmp	.-276    	; 0x10100 <checkFans()+0x1cc>
#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 <fanSpeed>
   10218:	87 cf       	rjmp	.-242    	; 0x10128 <checkFans()+0x1f4>
    else fan_speed_errors[1] = 0;
   1021a:	10 92 4d 03 	sts	0x034D, r1	; 0x80034d <checkFanSpeed()::fan_speed_errors+0x1>
   1021e:	8c cf       	rjmp	.-232    	; 0x10138 <checkFans()+0x204>
        // 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 <lcd_pause_print()>
   10224:	da cf       	rjmp	.-76     	; 0x101da <checkFans()+0x2a6>
  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 <target_temperature+0x1>
   1022a:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
        }
    }
    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 <heating_status>
   10232:	d3 cf       	rjmp	.-90     	; 0x101da <checkFans()+0x2a6>
//! 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 <serialprintlnPGM(char const*)>
    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 <checkFans()+0x328>
        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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        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 <lcd_setalertstatuspgm(char const*, unsigned char)>
  }
  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 <fanSpeedBckp>
   10260:	80 93 a5 04 	sts	0x04A5, r24	; 0x8004a5 <fanSpeedSoftPwm>
	  //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 <millis2>
   10268:	60 93 bf 17 	sts	0x17BF, r22	; 0x8017bf <extruder_autofan_last_check>
   1026c:	70 93 c0 17 	sts	0x17C0, r23	; 0x8017c0 <extruder_autofan_last_check+0x1>
   10270:	80 93 c1 17 	sts	0x17C1, r24	; 0x8017c1 <extruder_autofan_last_check+0x2>
   10274:	90 93 c2 17 	sts	0x17C2, r25	; 0x8017c2 <extruder_autofan_last_check+0x3>
	  fan_measuring = false;
   10278:	10 92 6e 06 	sts	0x066E, r1	; 0x80066e <fan_measuring>
  }
#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 <checkExtruderAutoFans()>

00010294 <la10c_jerk(float)>:
        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 <la10c_orig_jerk>
   102a4:	d0 92 53 03 	sts	0x0353, r13	; 0x800353 <la10c_orig_jerk+0x1>
   102a8:	e0 92 54 03 	sts	0x0354, r14	; 0x800354 <la10c_orig_jerk+0x2>
   102ac:	f0 92 55 03 	sts	0x0355, r15	; 0x800355 <la10c_orig_jerk+0x3>

    if(la10c_mode != LA10C_LA10)
   102b0:	80 91 6e 03 	lds	r24, 0x036E	; 0x80036e <la10c_mode>
   102b4:	82 30       	cpi	r24, 0x02	; 2
   102b6:	b1 f4       	brne	.+44     	; 0x102e4 <la10c_jerk(float)+0x50>
        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 <la10c_jerk(float)+0x5e>
   102ca:	80 91 ed 0d 	lds	r24, 0x0DED	; 0x800ded <cs+0x30>
   102ce:	90 91 ee 0d 	lds	r25, 0x0DEE	; 0x800dee <cs+0x31>
   102d2:	a0 91 ef 0d 	lds	r26, 0x0DEF	; 0x800def <cs+0x32>
   102d6:	b0 91 f0 0d 	lds	r27, 0x0DF0	; 0x800df0 <cs+0x33>
   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 <la10c_jerk(float)+0x98>
        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 <la10c_jerk(float)+0x86>
   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 <serialprintPGM(char const*)>
    SERIAL_ECHOLN(j);
   10322:	c7 01       	movw	r24, r14
   10324:	b6 01       	movw	r22, r12
   10326:	0f 94 ab 75 	call	0x2eb56	; 0x2eb56 <MarlinSerial::println(double, int) [clone .constprop.367]>
   1032a:	dc cf       	rjmp	.-72     	; 0x102e4 <la10c_jerk(float)+0x50>

    // 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 <la10c_jerk(float)+0x72>
        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 <la10c_jerk(float)+0x82>

0001035e <la10c_mode_change(LA10C_MODE)>:
    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 <la10c_mode>
   1036c:	98 17       	cp	r25, r24
   1036e:	b9 f1       	breq	.+110    	; 0x103de <la10c_mode_change(LA10C_MODE)+0x80>
   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 <la10c_orig_jerk>
   10376:	d0 90 53 03 	lds	r13, 0x0353	; 0x800353 <la10c_orig_jerk+0x1>
   1037a:	e0 90 54 03 	lds	r14, 0x0354	; 0x800354 <la10c_orig_jerk+0x2>
   1037e:	f0 90 55 03 	lds	r15, 0x0355	; 0x800355 <la10c_orig_jerk+0x3>
   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 <la10c_mode_change(LA10C_MODE)+0x46>
        cs.max_jerk[E_AXIS] = la10c_orig_jerk;
   10394:	c0 92 11 0e 	sts	0x0E11, r12	; 0x800e11 <cs+0x54>
   10398:	d0 92 12 0e 	sts	0x0E12, r13	; 0x800e12 <cs+0x55>
   1039c:	e0 92 13 0e 	sts	0x0E13, r14	; 0x800e13 <cs+0x56>
   103a0:	f0 92 14 0e 	sts	0x0E14, r15	; 0x800e14 <cs+0x57>

    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 <serialprintPGM(char const*)>
    switch(mode)
   103ac:	c1 30       	cpi	r28, 0x01	; 1
   103ae:	11 f1       	breq	.+68     	; 0x103f4 <la10c_mode_change(LA10C_MODE)+0x96>
   103b0:	e0 f0       	brcs	.+56     	; 0x103ea <la10c_mode_change(LA10C_MODE)+0x8c>
   103b2:	c2 30       	cpi	r28, 0x02	; 2
   103b4:	11 f1       	breq	.+68     	; 0x103fa <la10c_mode_change(LA10C_MODE)+0x9c>
    {
    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 <la10c_mode>

    // 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 <cs+0x54>
   103be:	70 91 12 0e 	lds	r23, 0x0E12	; 0x800e12 <cs+0x55>
   103c2:	80 91 13 0e 	lds	r24, 0x0E13	; 0x800e13 <cs+0x56>
   103c6:	90 91 14 0e 	lds	r25, 0x0E14	; 0x800e14 <cs+0x57>
   103ca:	0e 94 4a 81 	call	0x10294	; 0x10294 <la10c_jerk(float)>
   103ce:	60 93 11 0e 	sts	0x0E11, r22	; 0x800e11 <cs+0x54>
   103d2:	70 93 12 0e 	sts	0x0E12, r23	; 0x800e12 <cs+0x55>
   103d6:	80 93 13 0e 	sts	0x0E13, r24	; 0x800e13 <cs+0x56>
   103da:	90 93 14 0e 	sts	0x0E14, r25	; 0x800e14 <cs+0x57>
}
   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 <serialprintlnPGM(char const*)>
   103f2:	e1 cf       	rjmp	.-62     	; 0x103b6 <la10c_mode_change(LA10C_MODE)+0x58>

    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 <la10c_mode_change(LA10C_MODE)+0x90>
    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 <la10c_mode_change(LA10C_MODE)+0x90>

00010400 <finishAndDisableSteppers()>:

bool IsStopped() { return Stopped; };

void finishAndDisableSteppers()
{
  st_synchronize();
   10400:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
  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 <la10c_mode_change(LA10C_MODE)>
    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 <print_time_remaining_normal+0x1>
   10420:	80 93 b1 02 	sts	0x02B1, r24	; 0x8002b1 <print_time_remaining_normal>
    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_percent_done_normal>
    print_time_remaining_silent = PRINT_TIME_REMAINING_INIT;
   1042a:	90 93 b6 02 	sts	0x02B6, r25	; 0x8002b6 <print_time_remaining_silent+0x1>
   1042e:	80 93 b5 02 	sts	0x02B5, r24	; 0x8002b5 <print_time_remaining_silent>
    print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
   10432:	20 93 ad 02 	sts	0x02AD, r18	; 0x8002ad <print_percent_done_silent>
    print_time_to_change_normal = PRINT_TIME_REMAINING_INIT;
   10436:	90 93 b0 02 	sts	0x02B0, r25	; 0x8002b0 <print_time_to_change_normal+0x1>
   1043a:	80 93 af 02 	sts	0x02AF, r24	; 0x8002af <print_time_to_change_normal>
    print_time_to_change_silent = PRINT_TIME_REMAINING_INIT;
   1043e:	90 93 b4 02 	sts	0x02B4, r25	; 0x8002b4 <print_time_to_change_silent+0x1>
   10442:	80 93 b3 02 	sts	0x02B3, r24	; 0x8002b3 <print_time_to_change_silent>
  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 <Config_ResetDefault()>:
}
#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 <memcpy_P>

  // 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 <reset_acceleration_rates()>

#ifdef PIDTEMP
    updatePID();
   1045c:	0f 94 ab 3b 	call	0x27756	; 0x27756 <updatePID()>
#endif//PIDTEMP
#ifdef THERMAL_MODEL
    thermal_model_reset_settings();
   10460:	0f 94 84 32 	call	0x26508	; 0x26508 <thermal_model_reset_settings()>
#endif

  calculate_extruder_multipliers();
   10464:	0e 94 51 65 	call	0xcaa2	; 0xcaa2 <calculate_extruder_multipliers()>

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 <serialprintPGM(char const*)>
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 <serialprintlnPGM(char const*)>

00010478 <Config_StoreSettings()>:
    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 <strcpy_P>
#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 <eeprom_update_block>
        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 <eeprom_update_byte>
}

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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
        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 <eeprom_update_word>
#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 <eeprom_update_block>
        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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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_dword>
  eeprom_update_block_notify(reinterpret_cast<uint8_t*>(&cs), reinterpret_cast<uint8_t*>(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 <serialprintPGM(char const*)>
  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 <serialprintlnPGM(char const*)>

00010570 <get_command()>:
{
    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 <cmdqueue_could_enqueue_back(unsigned int)>
   105ac:	88 23       	and	r24, r24
   105ae:	09 f4       	brne	.+2      	; 0x105b2 <get_command()+0x42>
   105b0:	91 c0       	rjmp	.+290    	; 0x106d4 <get_command()+0x164>
      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 <MarlinSerial::available()>
   105b6:	8f 37       	cpi	r24, 0x7F	; 127
   105b8:	91 05       	cpc	r25, r1
   105ba:	61 f4       	brne	.+24     	; 0x105d4 <get_command()+0x64>
  // 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 <rx_buffer+0x82>
   105c0:	90 91 9b 04 	lds	r25, 0x049B	; 0x80049b <rx_buffer+0x83>
   105c4:	90 93 99 04 	sts	0x0499, r25	; 0x800499 <rx_buffer+0x81>
   105c8:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <rx_buffer+0x80>
		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 <serialprintlnPGM(char const*)>
   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 <MarlinSerial::available()>
   105e4:	18 16       	cp	r1, r24
   105e6:	19 06       	cpc	r1, r25
   105e8:	0c f0       	brlt	.+2      	; 0x105ec <get_command()+0x7c>
   105ea:	68 c0       	rjmp	.+208    	; 0x106bc <get_command()+0x14c>
   105ec:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
   105f0:	88 23       	and	r24, r24
   105f2:	29 f0       	breq	.+10     	; 0x105fe <get_command()+0x8e>
   105f4:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   105f8:	88 23       	and	r24, r24
   105fa:	09 f4       	brne	.+2      	; 0x105fe <get_command()+0x8e>
   105fc:	5f c0       	rjmp	.+190    	; 0x106bc <get_command()+0x14c>
   105fe:	80 91 a4 03 	lds	r24, 0x03A4	; 0x8003a4 <cmdqueue_serial_disabled>
   10602:	81 11       	cpse	r24, r1
   10604:	5b c0       	rjmp	.+182    	; 0x106bc <get_command()+0x14c>

#ifdef ENABLE_MEATPACK
    // MeatPack Changes
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      const int rec = MYSERIAL.read();
   10606:	0f 94 f8 d5 	call	0x3abf0	; 0x3abf0 <MarlinSerial::read()>
      if (rec < 0) continue;
   1060a:	97 fd       	sbrc	r25, 7
   1060c:	e9 cf       	rjmp	.-46     	; 0x105e0 <get_command()+0x70>

      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 <get_command()+0xa6>
   10614:	7b c0       	rjmp	.+246    	; 0x1070c <get_command()+0x19c>
        if (mp_cmd_count > 0) {
   10616:	80 91 3e 03 	lds	r24, 0x033E	; 0x80033e <mp_cmd_count>
   1061a:	88 23       	and	r24, r24
   1061c:	09 f4       	brne	.+2      	; 0x10620 <get_command()+0xb0>
   1061e:	73 c0       	rjmp	.+230    	; 0x10706 <get_command()+0x196>
            mp_cmd_active = 1;
   10620:	d0 92 3d 03 	sts	0x033D, r13	; 0x80033d <mp_cmd_active>
            mp_cmd_count = 0;
   10624:	10 92 3e 03 	sts	0x033E, r1	; 0x80033e <mp_cmd_count>
      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 <mp_char_out_count>
   10630:	cc 20       	and	r12, r12
   10632:	b1 f2       	breq	.-84     	; 0x105e0 <get_command()+0x70>
        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 <mp_char_out_buf>
   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 <get_command()+0xd6>
            out[i] = (char)mp_char_out_buf[i];
   10640:	80 91 40 03 	lds	r24, 0x0340	; 0x800340 <mp_char_out_buf+0x1>
   10644:	88 a3       	std	Y+32, r24	; 0x20
        mp_char_out_count = 0;
   10646:	10 92 41 03 	sts	0x0341, r1	; 0x800341 <mp_char_out_count>
   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 <get_command()+0x70>
   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 <Timer<unsigned short>::start()>

    if (serial_char < 0)
   10668:	17 fd       	sbrc	r17, 7
   1066a:	f1 cf       	rjmp	.-30     	; 0x1064e <get_command()+0xde>
   1066c:	80 91 9d 10 	lds	r24, 0x109D	; 0x80109d <serial_count>
   10670:	90 91 9e 10 	lds	r25, 0x109E	; 0x80109e <serial_count+0x1>
        // 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 <get_command()+0x10a>
   10678:	4a c1       	rjmp	.+660    	; 0x1090e <get_command()+0x39e>
   1067a:	1d 30       	cpi	r17, 0x0D	; 13
   1067c:	09 f4       	brne	.+2      	; 0x10680 <get_command()+0x110>
   1067e:	47 c1       	rjmp	.+654    	; 0x1090e <get_command()+0x39e>
       serial_char == '\r' ||
   10680:	8f 35       	cpi	r24, 0x5F	; 95
   10682:	91 05       	cpc	r25, r1
   10684:	0c f0       	brlt	.+2      	; 0x10688 <get_command()+0x118>
   10686:	48 c1       	rjmp	.+656    	; 0x10918 <get_command()+0x3a8>
      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 <get_command()+0x120>
   1068c:	d0 92 43 03 	sts	0x0343, r13	; 0x800343 <comment_mode>
      if(!comment_mode) cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char;
   10690:	20 91 43 03 	lds	r18, 0x0343	; 0x800343 <comment_mode>
   10694:	21 11       	cpse	r18, r1
   10696:	db cf       	rjmp	.-74     	; 0x1064e <get_command()+0xde>
   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 <serial_count+0x1>
   106a2:	20 93 9d 10 	sts	0x109D, r18	; 0x80109d <serial_count>
   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 <get_command()+0xde>
    #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 <serial_count>
   106c0:	90 91 9e 10 	lds	r25, 0x109E	; 0x80109e <serial_count+0x1>
   106c4:	18 16       	cp	r1, r24
   106c6:	19 06       	cpc	r1, r25
   106c8:	0c f4       	brge	.+2      	; 0x106cc <get_command()+0x15c>
   106ca:	56 c2       	rjmp	.+1196   	; 0x10b78 <get_command()+0x608>
        SERIAL_ECHOLNPGM("RX timeout");
        return;
    }

  #ifdef SDSUPPORT
  if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){
   106cc:	80 91 8f 14 	lds	r24, 0x148F	; 0x80148f <card+0x2>
   106d0:	81 11       	cpse	r24, r1
   106d2:	66 c2       	rjmp	.+1228   	; 0x10ba0 <get_command()+0x630>
            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 <mp_cmd_count>
   1070a:	8e cf       	rjmp	.-228    	; 0x10628 <get_command()+0xb8>
        return;
    }

    if (mp_cmd_active > 0) {
   1070c:	30 91 3d 03 	lds	r19, 0x033D	; 0x80033d <mp_cmd_active>
   10710:	33 23       	and	r19, r19
   10712:	09 f4       	brne	.+2      	; 0x10716 <get_command()+0x1a6>
   10714:	57 c0       	rjmp	.+174    	; 0x107c4 <get_command()+0x254>

}

//==========================================================================
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 <get_command()+0x1ac>
   1071a:	3f c0       	rjmp	.+126    	; 0x1079a <get_command()+0x22a>
   1071c:	80 f5       	brcc	.+96     	; 0x1077e <get_command()+0x20e>
   1071e:	86 3f       	cpi	r24, 0xF6	; 246
   10720:	09 f4       	brne	.+2      	; 0x10724 <get_command()+0x1b4>
   10722:	48 c0       	rjmp	.+144    	; 0x107b4 <get_command()+0x244>
#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 <mp_config>
   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 <get_command()+0x21c>
        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 <serialprintPGM(char const*)>

    // 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 <serialprintPGM(char const*)>

    // Echo current state
    if (mp_config & MPConfig_Active)
   1073e:	10 91 3c 03 	lds	r17, 0x033C	; 0x80033c <mp_config>
        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 <get_command()+0x1de>
        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 <serialprintPGM(char const*)>

    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 <get_command()+0x1f2>
        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 <serialprintPGM(char const*)>

    SERIAL_ECHOLNPGM("");
   10766:	80 ee       	ldi	r24, 0xE0	; 224
   10768:	96 e7       	ldi	r25, 0x76	; 118
   1076a:	0e 94 13 79 	call	0xf226	; 0xf226 <serialprintlnPGM(char const*)>

    // Validate config vars
#ifdef USE_LOOKUP_TABLE
    if (mp_config & MPConfig_NoSpaces)
   1076e:	00 23       	and	r16, r16
   10770:	29 f1       	breq	.+74     	; 0x107bc <get_command()+0x24c>
        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 <mp_cmd_active>
   1077c:	55 cf       	rjmp	.-342    	; 0x10628 <get_command()+0xb8>

}

//==========================================================================
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 <get_command()+0x222>
    case MPCommand_EnablePacking: {
        mp_config |= MPConfig_Active;
   10782:	80 91 3c 03 	lds	r24, 0x033C	; 0x80033c <mp_config>
   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 <get_command()+0x1be>
#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 <mp_config>
   10790:	ce cf       	rjmp	.-100    	; 0x1072e <get_command()+0x1be>
#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 <mp_config>
   10796:	8e 7f       	andi	r24, 0xFE	; 254
   10798:	f9 cf       	rjmp	.-14     	; 0x1078c <get_command()+0x21c>
    return out;
}

//==============================================================================
void FORCE_INLINE mp_reset_state() {
    mp_char_out_count = 0;
   1079a:	10 92 41 03 	sts	0x0341, r1	; 0x800341 <mp_char_out_count>
    mp_cmd_active = MPCommand_None;
   1079e:	10 92 3d 03 	sts	0x033D, r1	; 0x80033d <mp_cmd_active>
    mp_config = MPConfig_None;
   107a2:	10 92 3c 03 	sts	0x033C, r1	; 0x80033c <mp_config>
    mp_char_buf = 0;
   107a6:	10 92 3b 03 	sts	0x033B, r1	; 0x80033b <mp_char_buf>
    mp_cmd_count = 0;
   107aa:	10 92 3e 03 	sts	0x033E, r1	; 0x80033e <mp_cmd_count>
    mp_cmd_active = 0;
    mp_full_char_queue = 0;
   107ae:	10 92 3a 03 	sts	0x033A, r1	; 0x80033a <mp_full_char_queue>
   107b2:	bd cf       	rjmp	.-134    	; 0x1072e <get_command()+0x1be>
#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 <mp_config>
   107b8:	8d 7f       	andi	r24, 0xFD	; 253
   107ba:	e8 cf       	rjmp	.-48     	; 0x1078c <get_command()+0x21c>
    // 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 <get_command()+0x208>
        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 <mp_cmd_count>
   107c8:	40 91 3c 03 	lds	r20, 0x033C	; 0x80033c <mp_config>
   107cc:	22 23       	and	r18, r18
   107ce:	31 f1       	breq	.+76     	; 0x1081c <get_command()+0x2ac>
   107d0:	e0 91 41 03 	lds	r30, 0x0341	; 0x800341 <mp_char_out_count>
//==========================================================================
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 <get_command()+0x2fa>
        if (mp_full_char_queue > 0) {
   107d8:	30 91 3a 03 	lds	r19, 0x033A	; 0x80033a <mp_full_char_queue>
   107dc:	33 23       	and	r19, r19
   107de:	09 f4       	brne	.+2      	; 0x107e2 <get_command()+0x272>
   107e0:	40 c0       	rjmp	.+128    	; 0x10862 <get_command()+0x2f2>
#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 <mp_char_out_count>
   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 <mp_char_buf>
   107fa:	55 23       	and	r21, r21
   107fc:	51 f0       	breq	.+20     	; 0x10812 <get_command()+0x2a2>
#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 <mp_char_out_count>
   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_char_buf>
                }
            --mp_full_char_queue;
   10812:	31 50       	subi	r19, 0x01	; 1
   10814:	30 93 3a 03 	sts	0x033A, r19	; 0x80033a <mp_full_char_queue>
        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 <mp_cmd_count>
   1081c:	e0 91 41 03 	lds	r30, 0x0341	; 0x800341 <mp_char_out_count>
//==========================================================================
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 <get_command()+0x38c>
        if (mp_full_char_queue > 0) {
   10824:	20 91 3a 03 	lds	r18, 0x033A	; 0x80033a <mp_full_char_queue>
   10828:	22 23       	and	r18, r18
   1082a:	49 f1       	breq	.+82     	; 0x1087e <get_command()+0x30e>
#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 <mp_char_out_count>
   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 <mp_char_buf>
   10842:	88 23       	and	r24, r24
   10844:	51 f0       	breq	.+20     	; 0x1085a <get_command()+0x2ea>
#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 <mp_char_out_count>
   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_char_buf>
                }
            --mp_full_char_queue;
   1085a:	21 50       	subi	r18, 0x01	; 1
   1085c:	20 93 3a 03 	sts	0x033A, r18	; 0x80033a <mp_full_char_queue>
   10860:	e3 ce       	rjmp	.-570    	; 0x10628 <get_command()+0xb8>
            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 <mp_full_char_queue>
   10868:	d7 cf       	rjmp	.-82     	; 0x10818 <get_command()+0x2a8>
#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 <mp_char_out_count>
   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 <get_command()+0x2a8>
   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 <get_command()+0x324>
   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 <get_command()+0x342>
   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 <get_command()+0x358>
                ++mp_full_char_queue;
   108a2:	d0 92 3a 03 	sts	0x033A, r13	; 0x80033a <mp_full_char_queue>
                if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
   108a6:	31 ff       	sbrs	r19, 1
   108a8:	0c c0       	rjmp	.+24     	; 0x108c2 <get_command()+0x352>
   108aa:	82 e0       	ldi	r24, 0x02	; 2
   108ac:	80 93 3a 03 	sts	0x033A, r24	; 0x80033a <mp_full_char_queue>
   108b0:	bb ce       	rjmp	.-650    	; 0x10628 <get_command()+0xb8>
    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 <get_command()+0x32e>
            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 <mp_char_buf>
   108c6:	b0 ce       	rjmp	.-672    	; 0x10628 <get_command()+0xb8>
#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 <mp_char_out_count>
   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 <get_command()+0x370>
   108de:	a4 ce       	rjmp	.-696    	; 0x10628 <get_command()+0xb8>
                    if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
   108e0:	31 ff       	sbrs	r19, 1
   108e2:	03 c0       	rjmp	.+6      	; 0x108ea <get_command()+0x37a>
   108e4:	d0 92 3a 03 	sts	0x033A, r13	; 0x80033a <mp_full_char_queue>
   108e8:	9f ce       	rjmp	.-706    	; 0x10628 <get_command()+0xb8>
#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 <mp_char_out_count>
   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 <get_command()+0xb8>
   108fc:	91 e0       	ldi	r25, 0x01	; 1
   108fe:	9e 0f       	add	r25, r30
   10900:	90 93 41 03 	sts	0x0341, r25	; 0x800341 <mp_char_out_count>
   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 <get_command()+0xb8>
        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 <get_command()+0x3a8>
        comment_mode = false; //for new command
   10912:	10 92 43 03 	sts	0x0343, r1	; 0x800343 <comment_mode>
   10916:	de ce       	rjmp	.-580    	; 0x106d4 <get_command()+0x164>
   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 <comment_mode>
   10934:	81 11       	cpse	r24, r1
   10936:	03 c1       	rjmp	.+518    	; 0x10b3e <get_command()+0x5ce>
		  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 <get_command()+0x3d2>
   10940:	8a c0       	rjmp	.+276    	; 0x10a56 <get_command()+0x4e6>

			  // 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 <strtol>
   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 <get_command()+0x400>
   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 <get_command()+0x3e8>

			  // 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 <gcode_LastN>
   10974:	90 90 79 03 	lds	r9, 0x0379	; 0x800379 <gcode_LastN+0x1>
   10978:	a0 90 7a 03 	lds	r10, 0x037A	; 0x80037a <gcode_LastN+0x2>
   1097c:	b0 90 7b 03 	lds	r11, 0x037B	; 0x80037b <gcode_LastN+0x3>
   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 <get_command()+0x436>
   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 <strncmp_P>
   109a2:	89 2b       	or	r24, r25
   109a4:	a1 f4       	brne	.+40     	; 0x109ce <get_command()+0x45e>
				  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 <strchr>
   109b0:	90 93 94 03 	sts	0x0394, r25	; 0x800394 <strchr_pointer+0x1>
   109b4:	80 93 93 03 	sts	0x0393, r24	; 0x800393 <strchr_pointer>
   109b8:	00 97       	sbiw	r24, 0x00	; 0
   109ba:	09 f4       	brne	.+2      	; 0x109be <get_command()+0x44e>
   109bc:	45 c0       	rjmp	.+138    	; 0x10a48 <get_command()+0x4d8>
   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 <get_command()+0x474>
					  checksum = checksum^(*p++);
   109c8:	21 91       	ld	r18, Z+
   109ca:	f2 26       	eor	r15, r18
   109cc:	fa cf       	rjmp	.-12     	; 0x109c2 <get_command()+0x452>
			  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 <serialprintPGM(char const*)>
				  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 <serialprintPGM(char const*)>
   109de:	c5 01       	movw	r24, r10
   109e0:	b4 01       	movw	r22, r8
   109e2:	15 c0       	rjmp	.+42     	; 0x10a0e <get_command()+0x49e>
			  {
				  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 <code_value_short() [clone .lto_priv.543]>
   109e8:	f8 16       	cp	r15, r24
   109ea:	19 06       	cpc	r1, r25
   109ec:	d9 f0       	breq	.+54     	; 0x10a24 <get_command()+0x4b4>
					  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 <serialprintPGM(char const*)>
					  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 <serialprintPGM(char const*)>
   109fe:	60 91 78 03 	lds	r22, 0x0378	; 0x800378 <gcode_LastN>
   10a02:	70 91 79 03 	lds	r23, 0x0379	; 0x800379 <gcode_LastN+0x1>
   10a06:	80 91 7a 03 	lds	r24, 0x037A	; 0x80037a <gcode_LastN+0x2>
   10a0a:	90 91 7b 03 	lds	r25, 0x037B	; 0x80037b <gcode_LastN+0x3>
   10a0e:	0f 94 5f d5 	call	0x3aabe	; 0x3aabe <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::println(long n, int base)
{
  print(n, base);
  println();
   10a12:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
					  SERIAL_ERRORLN(gcode_LastN);
					  FlushSerialRequestResend();
   10a16:	0e 94 25 5b 	call	0xb64a	; 0xb64a <FlushSerialRequestResend()>
					  serial_count = 0;
   10a1a:	10 92 9e 10 	sts	0x109E, r1	; 0x80109e <serial_count+0x1>
   10a1e:	10 92 9d 10 	sts	0x109D, r1	; 0x80109d <serial_count>
   10a22:	58 ce       	rjmp	.-848    	; 0x106d4 <get_command()+0x164>
					  return;
				  }
				  // If no errors, remove the checksum and continue parsing.
				  *strchr_pointer = 0;
   10a24:	e0 91 93 03 	lds	r30, 0x0393	; 0x800393 <strchr_pointer>
   10a28:	f0 91 94 03 	lds	r31, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <strcmp_P>
   10a3c:	89 2b       	or	r24, r25
   10a3e:	39 f5       	brne	.+78     	; 0x10a8e <get_command()+0x51e>
          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 <kill(char const*)>
				  // 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 <serialprintPGM(char const*)>
				  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 <get_command()+0x46a>
			  }
		}
        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 <get_command()+0x4fa>
   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 <get_command()+0x4e6>

            // 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 <strchr>
   10a72:	89 2b       	or	r24, r25
   10a74:	39 f0       	breq	.+14     	; 0x10a84 <get_command()+0x514>
            {
                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 <serialprintPGM(char const*)>
                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 <get_command()+0x48a>
      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 <get_command()+0x4be>
        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 <strncmp_P>
   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 <get_command()+0x556>
   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 <get_command()+0x556>
            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 <Timer<unsigned short>::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 <eeprom_update_byte>
            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 <get_command()+0x562>
   10aca:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   10ace:	81 11       	cpse	r24, r1
   10ad0:	a4 cf       	rjmp	.-184    	; 0x10a1a <get_command()+0x4aa>
        }

        // 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 <get_command()+0x5ee>
            cmd_len = strlen(cmd_start) + 1;
   10af6:	01 90       	ld	r0, Z+
   10af8:	00 20       	and	r0, r0
   10afa:	e9 f7       	brne	.-6      	; 0x10af6 <get_command()+0x586>
   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 <get_command()+0x5fe>
            // 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 <buflen>
   10b1c:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   10b20:	01 96       	adiw	r24, 0x01	; 1
   10b22:	90 93 a3 10 	sts	0x10A3, r25	; 0x8010a3 <buflen+0x1>
   10b26:	80 93 a2 10 	sts	0x10A2, r24	; 0x8010a2 <buflen>

        // Update the processed gcode line
        if (gcode_N >= 0)
   10b2a:	77 fc       	sbrc	r7, 7
   10b2c:	08 c0       	rjmp	.+16     	; 0x10b3e <get_command()+0x5ce>
            gcode_LastN = gcode_N;
   10b2e:	40 92 78 03 	sts	0x0378, r4	; 0x800378 <gcode_LastN>
   10b32:	50 92 79 03 	sts	0x0379, r5	; 0x800379 <gcode_LastN+0x1>
   10b36:	60 92 7a 03 	sts	0x037A, r6	; 0x80037a <gcode_LastN+0x2>
   10b3a:	70 92 7b 03 	sts	0x037B, r7	; 0x80037b <gcode_LastN+0x3>
        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 <serial_count+0x1>
   10b42:	10 92 9d 10 	sts	0x109D, r1	; 0x80109d <serial_count>
      // 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 <MarlinSerial::available()>
   10b4a:	89 2b       	or	r24, r25
   10b4c:	09 f4       	brne	.+2      	; 0x10b50 <get_command()+0x5e0>
   10b4e:	c2 cd       	rjmp	.-1148   	; 0x106d4 <get_command()+0x164>
   10b50:	8f e5       	ldi	r24, 0x5F	; 95
   10b52:	90 e0       	ldi	r25, 0x00	; 0
   10b54:	0e 94 da 5b 	call	0xb7b4	; 0xb7b4 <cmdqueue_could_enqueue_back(unsigned int)>
   10b58:	81 11       	cpse	r24, r1
   10b5a:	79 cd       	rjmp	.-1294   	; 0x1064e <get_command()+0xde>
   10b5c:	bb cd       	rjmp	.-1162   	; 0x106d4 <get_command()+0x164>
        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 <get_command()+0x5ee>
   10b6c:	ca cf       	rjmp	.-108    	; 0x10b02 <get_command()+0x592>
        }
        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 <get_command()+0x5a8>
    #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 <Timer<unsigned short>::expired(unsigned short)>
   10b84:	88 23       	and	r24, r24
   10b86:	09 f4       	brne	.+2      	; 0x10b8a <get_command()+0x61a>
   10b88:	a1 cd       	rjmp	.-1214   	; 0x106cc <get_command()+0x15c>
        comment_mode = false;
   10b8a:	10 92 43 03 	sts	0x0343, r1	; 0x800343 <comment_mode>
        serial_count = 0;
   10b8e:	10 92 9e 10 	sts	0x109E, r1	; 0x80109e <serial_count+0x1>
   10b92:	10 92 9d 10 	sts	0x109D, r1	; 0x80109d <serial_count>
        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 <serialprintlnPGM(char const*)>
   10b9e:	9a cd       	rjmp	.-1228   	; 0x106d4 <get_command()+0x164>
        return;
    }

  #ifdef SDSUPPORT
  if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){
   10ba0:	80 91 22 17 	lds	r24, 0x1722	; 0x801722 <card+0x295>
   10ba4:	88 23       	and	r24, r24
   10ba6:	09 f4       	brne	.+2      	; 0x10baa <get_command()+0x63a>
   10ba8:	95 cd       	rjmp	.-1238   	; 0x106d4 <get_command()+0x164>
   10baa:	80 91 9d 10 	lds	r24, 0x109D	; 0x80109d <serial_count>
   10bae:	90 91 9e 10 	lds	r25, 0x109E	; 0x80109e <serial_count+0x1>
   10bb2:	89 2b       	or	r24, r25
   10bb4:	09 f0       	breq	.+2      	; 0x10bb8 <get_command()+0x648>
   10bb6:	8e cd       	rjmp	.-1252   	; 0x106d4 <get_command()+0x164>
  //'#' 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 <buflen>
   10bbc:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   10bc0:	89 2b       	or	r24, r25
   10bc2:	11 f4       	brne	.+4      	; 0x10bc8 <get_command()+0x658>
   10bc4:	10 92 42 03 	sts	0x0342, r1	; 0x800342 <get_command()::stop_buffering>

}

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 <card+0x316>
   10bdc:	50 91 a4 17 	lds	r21, 0x17A4	; 0x8017a4 <card+0x317>
   10be0:	60 91 a5 17 	lds	r22, 0x17A5	; 0x8017a5 <card+0x318>
   10be4:	70 91 a6 17 	lds	r23, 0x17A6	; 0x8017a6 <card+0x319>
   10be8:	80 91 9c 17 	lds	r24, 0x179C	; 0x80179c <card+0x30f>
   10bec:	90 91 9d 17 	lds	r25, 0x179D	; 0x80179d <card+0x310>
   10bf0:	a0 91 9e 17 	lds	r26, 0x179E	; 0x80179e <card+0x311>
   10bf4:	b0 91 9f 17 	lds	r27, 0x179F	; 0x80179f <card+0x312>
   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 <get_command()+0x694>
   10c02:	2f c1       	rjmp	.+606    	; 0x10e62 <cycle+0x236>
   10c04:	80 91 42 03 	lds	r24, 0x0342	; 0x800342 <get_command()::stop_buffering>
   10c08:	81 11       	cpse	r24, r1
   10c0a:	2b c1       	rjmp	.+598    	; 0x10e62 <cycle+0x236>
: "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 <SdFile::gfEnsureBlock() [clone .constprop.243]>
   10c10:	88 23       	and	r24, r24
   10c12:	49 f1       	breq	.+82     	; 0x10c66 <cycle+0x3a>
        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 <card+0x2ad>
   10c18:	30 91 3b 17 	lds	r19, 0x173B	; 0x80173b <card+0x2ae>
    // 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 <cycle+0x52>
            //   11c68:	brne	.-12     	; 0x11c5e <get_command()+0x524>

            // 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 <cycle>:
   10c2c:	61 91       	ld	r22, Z+
   10c2e:	6a 30       	cpi	r22, 0x0A	; 10
   10c30:	e9 f7       	brne	.-6      	; 0x10c2c <cycle>
   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 <cycle+0x48>
                // 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 <SdFile::gfUpdateCurrentPosition(unsigned int) [clone .constprop.245]>
                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 <SdFile::gfComputeNextFileBlock()>
   10c54:	88 23       	and	r24, r24
   10c56:	39 f0       	breq	.+14     	; 0x10c66 <cycle+0x3a>
                if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM
   10c58:	0f 94 7a 7b 	call	0x2f6f4	; 0x2f6f4 <SdFile::gfEnsureBlock() [clone .constprop.243]>
                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 <get_command()+0x6ba>

}

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 <card+0x2ae>
   10c6a:	e0 92 3a 17 	sts	0x173A, r14	; 0x80173a <card+0x2ad>
    return -1;
   10c6e:	0f ef       	ldi	r16, 0xFF	; 255
   10c70:	1f ef       	ldi	r17, 0xFF	; 255
   10c72:	37 c0       	rjmp	.+110    	; 0x10ce2 <cycle+0xb6>
   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 <cycle+0x1f8>
                // 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 <SdFile::gfUpdateCurrentPosition(unsigned int) [clone .constprop.245]>
        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 <card+0x29a>
   10c98:	90 90 28 17 	lds	r9, 0x1728	; 0x801728 <card+0x29b>
   10c9c:	a0 90 29 17 	lds	r10, 0x1729	; 0x801729 <card+0x29c>
   10ca0:	b0 90 2a 17 	lds	r11, 0x172A	; 0x80172a <card+0x29d>
   10ca4:	40 91 30 17 	lds	r20, 0x1730	; 0x801730 <card+0x2a3>
   10ca8:	50 91 31 17 	lds	r21, 0x1731	; 0x801731 <card+0x2a4>
   10cac:	60 91 32 17 	lds	r22, 0x1732	; 0x801732 <card+0x2a5>
   10cb0:	70 91 33 17 	lds	r23, 0x1733	; 0x801733 <card+0x2a6>
   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 <cycle+0x3a>
            // 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 <cycle+0xae>
            // 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 <SdFile::gfComputeNextFileBlock()>
   10cd2:	88 23       	and	r24, r24
   10cd4:	41 f2       	breq	.-112    	; 0x10c66 <cycle+0x3a>
            // 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 <card+0x2ae>
   10cde:	80 93 3a 17 	sts	0x173A, r24	; 0x80173a <card+0x2ad>
  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 <card+0x29a>
   10ce6:	50 91 28 17 	lds	r21, 0x1728	; 0x801728 <card+0x29b>
   10cea:	60 91 29 17 	lds	r22, 0x1729	; 0x801729 <card+0x29c>
   10cee:	70 91 2a 17 	lds	r23, 0x172A	; 0x80172a <card+0x29d>
  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 <card+0x316>
   10cf6:	50 93 a4 17 	sts	0x17A4, r21	; 0x8017a4 <card+0x317>
   10cfa:	60 93 a5 17 	sts	0x17A5, r22	; 0x8017a5 <card+0x318>
   10cfe:	70 93 a6 17 	sts	0x17A6, r23	; 0x8017a6 <card+0x319>
   10d02:	80 91 9d 10 	lds	r24, 0x109D	; 0x80109d <serial_count>
   10d06:	90 91 9e 10 	lds	r25, 0x109E	; 0x80109e <serial_count+0x1>
    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 <cycle+0xfa>
     || serial_char == '\r'
   10d0e:	0d 30       	cpi	r16, 0x0D	; 13
   10d10:	51 f0       	breq	.+20     	; 0x10d26 <cycle+0xfa>
     || serial_char == '#'
   10d12:	03 32       	cpi	r16, 0x23	; 35
   10d14:	09 f4       	brne	.+2      	; 0x10d18 <cycle+0xec>
   10d16:	8c c0       	rjmp	.+280    	; 0x10e30 <cycle+0x204>
     || 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 <cycle+0x100>
     || n==-1
   10d1e:	0f 3f       	cpi	r16, 0xFF	; 255
   10d20:	10 07       	cpc	r17, r16
   10d22:	09 f0       	breq	.+2      	; 0x10d26 <cycle+0xfa>
   10d24:	8c c0       	rjmp	.+280    	; 0x10e3e <cycle+0x212>
    ){
      if(serial_char=='#')
        stop_buffering=true;

      if(!serial_count)
   10d26:	00 97       	sbiw	r24, 0x00	; 0
   10d28:	09 f4       	brne	.+2      	; 0x10d2c <cycle+0x100>
   10d2a:	d4 cc       	rjmp	.-1624   	; 0x106d4 <get_command()+0x164>
      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 <card+0x295>
   10d30:	21 11       	cpse	r18, r1
   10d32:	03 c0       	rjmp	.+6      	; 0x10d3a <cycle+0x10e>
   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 <sdpos_atomic>
   10d3e:	30 91 81 03 	lds	r19, 0x0381	; 0x800381 <sdpos_atomic+0x1>
   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 <cycle+0x142>
   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 <buflen>
   10d80:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   10d84:	01 96       	adiw	r24, 0x01	; 1
   10d86:	90 93 a3 10 	sts	0x10A3, r25	; 0x8010a3 <buflen+0x1>
   10d8a:	80 93 a2 10 	sts	0x10A2, r24	; 0x8010a2 <buflen>
      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 <card+0x295>
   10daa:	88 23       	and	r24, r24
   10dac:	09 f4       	brne	.+2      	; 0x10db0 <cycle+0x184>
   10dae:	43 c0       	rjmp	.+134    	; 0x10e36 <cycle+0x20a>
   10db0:	80 91 a3 17 	lds	r24, 0x17A3	; 0x8017a3 <card+0x316>
   10db4:	90 91 a4 17 	lds	r25, 0x17A4	; 0x8017a4 <card+0x317>
   10db8:	a0 91 a5 17 	lds	r26, 0x17A5	; 0x8017a5 <card+0x318>
   10dbc:	b0 91 a6 17 	lds	r27, 0x17A6	; 0x8017a6 <card+0x319>
      sdpos_atomic = card.get_sdpos();
   10dc0:	80 93 80 03 	sts	0x0380, r24	; 0x800380 <sdpos_atomic>
   10dc4:	90 93 81 03 	sts	0x0381, r25	; 0x800381 <sdpos_atomic+0x1>
   10dc8:	a0 93 82 03 	sts	0x0382, r26	; 0x800382 <sdpos_atomic+0x2>
   10dcc:	b0 93 83 03 	sts	0x0383, r27	; 0x800383 <sdpos_atomic+0x3>
      if (bufindw == sizeof(cmdbuffer))
   10dd0:	ed 3e       	cpi	r30, 0xED	; 237
   10dd2:	f1 40       	sbci	r31, 0x01	; 1
   10dd4:	21 f4       	brne	.+8      	; 0x10dde <cycle+0x1b2>
          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 <comment_mode>
      serial_count = 0; //clear buffer
   10de4:	10 92 9e 10 	sts	0x109E, r1	; 0x80109e <serial_count+0x1>
   10de8:	10 92 9d 10 	sts	0x109D, r1	; 0x80109d <serial_count>

      if(card.eof()) break;
   10dec:	40 91 a3 17 	lds	r20, 0x17A3	; 0x8017a3 <card+0x316>
   10df0:	50 91 a4 17 	lds	r21, 0x17A4	; 0x8017a4 <card+0x317>
   10df4:	60 91 a5 17 	lds	r22, 0x17A5	; 0x8017a5 <card+0x318>
   10df8:	70 91 a6 17 	lds	r23, 0x17A6	; 0x8017a6 <card+0x319>
   10dfc:	80 91 9c 17 	lds	r24, 0x179C	; 0x80179c <card+0x30f>
   10e00:	90 91 9d 17 	lds	r25, 0x179D	; 0x80179d <card+0x310>
   10e04:	a0 91 9e 17 	lds	r26, 0x179E	; 0x80179e <card+0x311>
   10e08:	b0 91 9f 17 	lds	r27, 0x179F	; 0x80179f <card+0x312>
   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 <cycle+0x236>

      // 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 <cmdqueue_could_enqueue_back(unsigned int)>
   10e1e:	81 11       	cpse	r24, r1
   10e20:	db ce       	rjmp	.-586    	; 0x10bd8 <get_command()+0x668>
   10e22:	58 cc       	rjmp	.-1872   	; 0x106d4 <get_command()+0x164>
                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 <cycle+0x202>
   10e2c:	fa ce       	rjmp	.-524    	; 0x10c22 <get_command()+0x6b2>
   10e2e:	25 cf       	rjmp	.-438    	; 0x10c7a <cycle+0x4e>
     || 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 <get_command()::stop_buffering>
   10e34:	78 cf       	rjmp	.-272    	; 0x10d26 <cycle+0xfa>
   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 <cycle+0x194>
          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 <serial_count+0x1>
   10e48:	20 93 9d 10 	sts	0x109D, r18	; 0x80109d <serial_count>
   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 <get_command()+0x668>
    }
  }
  if(card.eof())
   10e62:	40 91 a3 17 	lds	r20, 0x17A3	; 0x8017a3 <card+0x316>
   10e66:	50 91 a4 17 	lds	r21, 0x17A4	; 0x8017a4 <card+0x317>
   10e6a:	60 91 a5 17 	lds	r22, 0x17A5	; 0x8017a5 <card+0x318>
   10e6e:	70 91 a6 17 	lds	r23, 0x17A6	; 0x8017a6 <card+0x319>
   10e72:	80 91 9c 17 	lds	r24, 0x179C	; 0x80179c <card+0x30f>
   10e76:	90 91 9d 17 	lds	r25, 0x179D	; 0x80179d <card+0x310>
   10e7a:	a0 91 9e 17 	lds	r26, 0x179E	; 0x80179e <card+0x311>
   10e7e:	b0 91 9f 17 	lds	r27, 0x179F	; 0x80179f <card+0x312>
   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 <cycle+0x262>
   10e8c:	23 cc       	rjmp	.-1978   	; 0x106d4 <get_command()+0x164>
  {
      // 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 <cmdqueue_calc_sd_length()>
   10e92:	89 2b       	or	r24, r25
   10e94:	09 f0       	breq	.+2      	; 0x10e98 <cycle+0x26c>
   10e96:	1e cc       	rjmp	.-1988   	; 0x106d4 <get_command()+0x164>
    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 <SdBaseFile::sync()>
  file.close();
   10ea0:	8f e1       	ldi	r24, 0x1F	; 31
   10ea2:	97 e1       	ldi	r25, 0x17	; 23
   10ea4:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
  saving = false;
   10ea8:	10 92 8d 14 	sts	0x148D, r1	; 0x80148d <card>
  logging = false;
   10eac:	10 92 8e 14 	sts	0x148E, r1	; 0x80148e <card+0x1>
      {
          // 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 <serialprintlnPGM(char const*)>
          char time[30];
          uint32_t t = print_job_timer.duration() / 60;
   10eb8:	0f 94 7b 3f 	call	0x27ef6	; 0x27ef6 <Stopwatch::duration()>
   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 <save_statistics()>
          // 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 <sprintf_P>
          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 <serialprintPGM(char const*)>
          SERIAL_ECHOLN(time);
   10f1c:	c8 01       	movw	r24, r16
   10f1e:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
#ifndef SHOW_FILENAME_AFTER_FINISH
          lcd_setstatus(time);
   10f22:	c8 01       	movw	r24, r16
   10f24:	0e 94 42 f5 	call	0x1ea84	; 0x1ea84 <lcd_setstatus(char const*)>
#endif //SHOW_FILENAME_AFTER_FINISH
          card.printingHasFinished();
   10f28:	0f 94 7a 81 	call	0x302f4	; 0x302f4 <CardReader::printingHasFinished() [clone .constprop.220]>
    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 <card+0x3>
   10f3e:	88 23       	and	r24, r24
   10f40:	19 f0       	breq	.+6      	; 0x10f48 <cycle+0x31c>
   10f42:	0f 94 ae 76 	call	0x2ed5c	; 0x2ed5c <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]>
   10f46:	c6 cb       	rjmp	.-2164   	; 0x106d4 <get_command()+0x164>
  {
    mount();
   10f48:	81 e0       	ldi	r24, 0x01	; 1
   10f4a:	0f 94 b9 81 	call	0x30372	; 0x30372 <CardReader::mount(bool) [clone .constprop.216]>
    if(!mounted) //fail
   10f4e:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   10f52:	81 11       	cpse	r24, r1
   10f54:	f6 cf       	rjmp	.-20     	; 0x10f42 <cycle+0x316>
   10f56:	be cb       	rjmp	.-2180   	; 0x106d4 <get_command()+0x164>

00010f58 <MarlinSerial::write(char const*)>:
    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 <MarlinSerial::write(char const*)+0x12>
        write(*str++);
   10f64:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
   10f68:	fa cf       	rjmp	.-12     	; 0x10f5e <MarlinSerial::write(char const*)+0x6>
    }
   10f6a:	df 91       	pop	r29
   10f6c:	cf 91       	pop	r28
   10f6e:	08 95       	ret

00010f70 <enquecommand(char const*, bool)>:
//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 <enquecommand(char const*, bool)+0x14>
   10f82:	4b c0       	rjmp	.+150    	; 0x1101a <enquecommand(char const*, bool)+0xaa>
#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 <cmdqueue_could_enqueue_back(unsigned int)>
   10f90:	88 23       	and	r24, r24
   10f92:	09 f4       	brne	.+2      	; 0x10f96 <enquecommand(char const*, bool)+0x26>
   10f94:	53 c0       	rjmp	.+166    	; 0x1103c <enquecommand(char const*, bool)+0xcc>
        // 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 <enquecommand(char const*, bool)+0xbc>
            strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
   10fb2:	0f 94 c7 d9 	call	0x3b38e	; 0x3b38e <strcpy_P>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
        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 <MarlinSerial::write(char const*)>
        SERIAL_ECHOLNPGM("\"");
   10fd6:	8e ed       	ldi	r24, 0xDE	; 222
   10fd8:	96 e7       	ldi	r25, 0x76	; 118
   10fda:	0e 94 13 79 	call	0xf226	; 0xf226 <serialprintlnPGM(char const*)>
        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 <enquecommand(char const*, bool)+0xc2>
            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 <buflen>
   11000:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   11004:	01 96       	adiw	r24, 0x01	; 1
   11006:	90 93 a3 10 	sts	0x10A3, r25	; 0x8010a3 <buflen+0x1>
   1100a:	80 93 a2 10 	sts	0x10A2, r24	; 0x8010a2 <buflen>
        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 <enquecommand(char const*, bool)+0xac>
   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 <enquecommand(char const*, bool)+0x1a>
        // 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 <strcpy>
   11030:	c2 cf       	rjmp	.-124    	; 0x10fb6 <enquecommand(char const*, bool)+0x46>
        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 <enquecommand(char const*, bool)+0x8c>
        ++ 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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
        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 <enquecommand(char const*, bool)+0xf8>
            SERIAL_PROTOCOLRPGM(cmd);
   11052:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
        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 <serialprintlnPGM(char const*)>
   11068:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
   1106c:	f4 cf       	rjmp	.-24     	; 0x11056 <enquecommand(char const*, bool)+0xe6>

0001106e <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.436]>:
{
    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 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.436]+0x24>
   1108a:	20 91 b9 13 	lds	r18, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1108e:	21 30       	cpi	r18, 0x01	; 1
   11090:	19 f4       	brne	.+6      	; 0x11098 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.436]+0x2a>
            continue;
        }

        enquecommand_P(static_cast<char*>(pgm_ptr));
   11092:	61 e0       	ldi	r22, 0x01	; 1
   11094:	0e 94 b8 87 	call	0x10f70	; 0x10f70 <enquecommand(char const*, bool)>
    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 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.436]+0xe>
            continue;
        }

        enquecommand_P(static_cast<char*>(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 <enquecommandf_P(char const*, ...)>:
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 <vsnprintf_P>
    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 <enquecommand(char const*, bool)>
}
   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 <restore_file_from_sd()>:
  }
}

/// @brief Read saved filename from EEPROM and send g-code command: M23 <filename>
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 <eeprom_read_byte>
   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 <restore_file_from_sd()+0x52>
        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 <eeprom_read_block>
        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 <CardReader::chdir(char const*, bool) [clone .constprop.224]>
    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 <restore_file_from_sd()+0x2c>
        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 <eeprom_read_block>

    // 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 <eeprom_read_block>
    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 <strcat>

    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 <enquecommandf_P(char const*, ...)>
   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 <stop_and_save_print_to_ram(float, float)>:
//! 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 <saved_printing>
   111c4:	e1 11       	cpse	r30, r1
   111c6:	b1 c0       	rjmp	.+354    	; 0x1132a <stop_and_save_print_to_ram(float, float)+0x17c>
   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_print_file_state()>

    // 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 <mesh_bed_leveling_flag>
   111dc:	b1 10       	cpse	r11, r1
   111de:	02 c0       	rjmp	.+4      	; 0x111e4 <stop_and_save_print_to_ram(float, float)+0x36>
   111e0:	b0 90 a6 0d 	lds	r11, 0x0DA6	; 0x800da6 <homing_flag>
    save_planner_global_state();
   111e4:	0e 94 88 64 	call	0xc910	; 0xc910 <save_planner_global_state()>

	planner_abort_hard(); //abort printing
   111e8:	0f 94 b7 c1 	call	0x3836e	; 0x3836e <planner_abort_hard()>

	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 <stop_and_save_print_to_ram(float, float)+0x48>
    if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID;
   111fe:	bb 20       	and	r11, r11
   11200:	61 f0       	breq	.+24     	; 0x1121a <stop_and_save_print_to_ram(float, float)+0x6c>
   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 <saved_pos>
   1120e:	90 93 74 02 	sts	0x0274, r25	; 0x800274 <saved_pos+0x1>
   11212:	a0 93 75 02 	sts	0x0275, r26	; 0x800275 <saved_pos+0x2>
   11216:	b0 93 76 02 	sts	0x0276, r27	; 0x800276 <saved_pos+0x3>

    saved_feedmultiply2 = feedmultiply; //save feedmultiply
   1121a:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
   1121e:	90 91 3a 02 	lds	r25, 0x023A	; 0x80023a <feedmultiply+0x1>
   11222:	90 93 70 03 	sts	0x0370, r25	; 0x800370 <saved_feedmultiply2+0x1>
   11226:	80 93 6f 03 	sts	0x036F, r24	; 0x80036f <saved_feedmultiply2>
	saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder);
   1122a:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   1122e:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   11232:	90 93 ac 05 	sts	0x05AC, r25	; 0x8005ac <saved_extruder_temperature+0x1>
   11236:	80 93 ab 05 	sts	0x05AB, r24	; 0x8005ab <saved_extruder_temperature>
	saved_bed_temperature = (uint8_t)degTargetBed();
   1123a:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
   1123e:	80 93 ad 05 	sts	0x05AD, r24	; 0x8005ad <saved_bed_temperature>
	saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
   11242:	80 91 e3 03 	lds	r24, 0x03E3	; 0x8003e3 <axis_relative_modes>
   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_extruder_relative_mode>
	saved_fan_speed = fanSpeed;
   11250:	80 91 e5 03 	lds	r24, 0x03E5	; 0x8003e5 <fanSpeed>
   11254:	80 93 aa 05 	sts	0x05AA, r24	; 0x8005aa <saved_fan_speed>
	cmdqueue_reset(); //empty cmdqueue
   11258:	0e 94 dc 7e 	call	0xfdb8	; 0xfdb8 <cmdqueue_reset()>
	card.sdprinting = false;
   1125c:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>
//	card.closefile();
	saved_printing = true;
   11260:	81 e0       	ldi	r24, 0x01	; 1
   11262:	80 93 a8 0d 	sts	0x0DA8, r24	; 0x800da8 <saved_printing>
  // 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 <st_reset_timer()>
	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 <stop_and_save_print_to_ram(float, float)+0x190>
   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 <stop_and_save_print_to_ram(float, float)+0xea>
   11296:	49 c0       	rjmp	.+146    	; 0x1132a <stop_and_save_print_to_ram(float, float)+0x17c>
    // 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 <saved_extruder_relative_mode>
   1129c:	81 11       	cpse	r24, r1
   1129e:	05 c0       	rjmp	.+10     	; 0x112aa <stop_and_save_print_to_ram(float, float)+0xfc>
            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 <enquecommand(char const*, bool)>
        // 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 <enquecommandf_P(char const*, ...)>
    }

    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 <stop_and_save_print_to_ram(float, float)+0x176>
    {
        // 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 <saved_pos+0x8>
   112ec:	30 91 7c 02 	lds	r19, 0x027C	; 0x80027c <saved_pos+0x9>
   112f0:	40 91 7d 02 	lds	r20, 0x027D	; 0x80027d <saved_pos+0xa>
   112f4:	50 91 7e 02 	lds	r21, 0x027E	; 0x80027e <saved_pos+0xb>
   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 <enquecommandf_P(char const*, ...)>
   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 <cmdbuffer_front_already_processed>

    // 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 <stop_and_save_print_to_ram(float, float)+0x12e>
   1134a:	a6 cf       	rjmp	.-180    	; 0x11298 <stop_and_save_print_to_ram(float, float)+0xea>

0001134c <backlight_update()>:
    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 <backlightSupport>
   11350:	88 23       	and	r24, r24
   11352:	21 f1       	breq	.+72     	; 0x1139c <backlight_update()+0x50>

    if (backlightMode == BACKLIGHT_MODE_AUTO)
   11354:	80 91 4f 02 	lds	r24, 0x024F	; 0x80024f <backlightMode>
   11358:	82 30       	cpi	r24, 0x02	; 2
   1135a:	e9 f4       	brne	.+58     	; 0x11396 <backlight_update()+0x4a>
    {
        if (backlightTimer.expired((uint32_t)backlightTimer_period * 1000ul)) analogWrite(LCD_BL_PIN, backlightLevel_LOW);
   1135c:	a0 91 4d 02 	lds	r26, 0x024D	; 0x80024d <backlightTimer_period>
   11360:	b0 91 4e 02 	lds	r27, 0x024E	; 0x80024e <backlightTimer_period+0x1>
   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 <Timer<unsigned long>::expired(unsigned long)>
   11378:	88 23       	and	r24, r24
   1137a:	31 f0       	breq	.+12     	; 0x11388 <backlight_update()+0x3c>
        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 <backlightLevel_LOW>
    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 <analogWrite>
    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 <backlightTimer>
   1138c:	88 23       	and	r24, r24
   1138e:	31 f0       	breq	.+12     	; 0x1139c <backlight_update()+0x50>
        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 <backlightLevel_HIGH>
   11394:	f5 cf       	rjmp	.-22     	; 0x11380 <backlight_update()+0x34>
    {
        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 <backlight_update()+0x44>
   1139a:	f0 cf       	rjmp	.-32     	; 0x1137c <backlight_update()+0x30>
    else analogWrite(LCD_BL_PIN, backlightLevel_HIGH);
}
   1139c:	08 95       	ret

0001139e <backlight_save()>:
   1139e:	60 91 00 04 	lds	r22, 0x0400	; 0x800400 <backlightLevel_HIGH>
   113a2:	84 e3       	ldi	r24, 0x34	; 52
   113a4:	9d e0       	ldi	r25, 0x0D	; 13
   113a6:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   113aa:	60 91 ff 03 	lds	r22, 0x03FF	; 0x8003ff <backlightLevel_LOW>
   113ae:	83 e3       	ldi	r24, 0x33	; 51
   113b0:	9d e0       	ldi	r25, 0x0D	; 13
   113b2:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   113b6:	60 91 4f 02 	lds	r22, 0x024F	; 0x80024f <backlightMode>
   113ba:	82 e3       	ldi	r24, 0x32	; 50
   113bc:	9d e0       	ldi	r25, 0x0D	; 13
   113be:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
        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 <backlightTimer_period>
   113c6:	70 91 4e 02 	lds	r23, 0x024E	; 0x80024e <backlightTimer_period+0x1>
   113ca:	80 e3       	ldi	r24, 0x30	; 48
   113cc:	9d e0       	ldi	r25, 0x0D	; 13
   113ce:	0d 94 52 dc 	jmp	0x3b8a4	; 0x3b8a4 <eeprom_update_word>

000113d2 <force_bl_on(bool)>:
    backlight_update();
}

void force_bl_on(bool section_start)
{
    if (section_start)
   113d2:	88 23       	and	r24, r24
   113d4:	61 f0       	breq	.+24     	; 0x113ee <force_bl_on(bool)+0x1c>
    {
        backlightMode = BACKLIGHT_MODE_BRIGHT;
   113d6:	81 e0       	ldi	r24, 0x01	; 1
   113d8:	80 93 4f 02 	sts	0x024F, r24	; 0x80024f <backlightMode>
        if (backlightLevel_HIGH < LCD_BACKLIGHT_FORCE_ON) backlightLevel_HIGH = LCD_BACKLIGHT_FORCE_ON;
   113dc:	80 91 00 04 	lds	r24, 0x0400	; 0x800400 <backlightLevel_HIGH>
   113e0:	8e 31       	cpi	r24, 0x1E	; 30
   113e2:	18 f4       	brcc	.+6      	; 0x113ea <force_bl_on(bool)+0x18>
   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 <backlightLevel_HIGH>
    }
    backlight_update();
   113ea:	0c 94 a6 89 	jmp	0x1134c	; 0x1134c <backlight_update()>
        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 <eeprom_read_byte>
   113f6:	80 93 4f 02 	sts	0x024F, r24	; 0x80024f <backlightMode>
        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 <eeprom_read_byte>
   11402:	f1 cf       	rjmp	.-30     	; 0x113e6 <force_bl_on(bool)+0x14>

00011404 <backlightTimer_reset() [clone .lto_priv.434]>:
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 <backlightSupport>
   11408:	88 23       	and	r24, r24
   1140a:	31 f0       	breq	.+12     	; 0x11418 <backlightTimer_reset() [clone .lto_priv.434]+0x14>
    backlightTimer.start();
   1140c:	85 e3       	ldi	r24, 0x35	; 53
   1140e:	93 e0       	ldi	r25, 0x03	; 3
   11410:	0f 94 cb 2c 	call	0x25996	; 0x25996 <Timer<unsigned long>::start()>
    backlight_update();
   11414:	0c 94 a6 89 	jmp	0x1134c	; 0x1134c <backlight_update()>
}
   11418:	08 95       	ret

0001141a <backlight_wake(unsigned char)>:
    }
    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 <backlightSupport>
   11428:	99 23       	and	r25, r25
   1142a:	99 f1       	breq	.+102    	; 0x11492 <backlight_wake(unsigned char)+0x78>

    if (flashNo)
   1142c:	88 23       	and	r24, r24
   1142e:	51 f1       	breq	.+84     	; 0x11484 <backlight_wake(unsigned char)+0x6a>
    {
        uint8_t backlightMode_bck = backlightMode;
   11430:	00 91 4f 02 	lds	r16, 0x024F	; 0x80024f <backlightMode>
        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 <backlightTimer>
   1144a:	8f 25       	eor	r24, r15
   1144c:	02 30       	cpi	r16, 0x02	; 2
   1144e:	09 f0       	breq	.+2      	; 0x11452 <backlight_wake(unsigned char)+0x38>
   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 <backlight_wake(unsigned char)+0x66>
        {
            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 <backlightMode>
   11464:	91 11       	cpse	r25, r1
   11466:	80 e0       	ldi	r24, 0x00	; 0
   11468:	80 93 4f 02 	sts	0x024F, r24	; 0x80024f <backlightMode>
            backlight_update();
   1146c:	0e 94 a6 89 	call	0x1134c	; 0x1134c <backlight_update()>
            _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 <delay2>
    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 <backlight_wake(unsigned char)+0x28>
        {
            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 <backlightMode>
    }
    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 <backlightTimer_reset() [clone .lto_priv.434]>
}
   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 <manage_inactivity(bool)>:
    }
}
#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 <fsensor>
   114ac:	81 30       	cpi	r24, 0x01	; 1
   114ae:	09 f4       	brne	.+2      	; 0x114b2 <manage_inactivity(bool)+0x14>
   114b0:	41 c0       	rjmp	.+130    	; 0x11534 <manage_inactivity(bool)+0x96>
   114b2:	82 30       	cpi	r24, 0x02	; 2
   114b4:	09 f4       	brne	.+2      	; 0x114b8 <manage_inactivity(bool)+0x1a>
   114b6:	57 c0       	rjmp	.+174    	; 0x11566 <manage_inactivity(bool)+0xc8>
 *
 * 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 <printer_active()>
   114bc:	81 11       	cpse	r24, r1
   114be:	f9 c0       	rjmp	.+498    	; 0x116b2 <manage_inactivity(bool)+0x214>
   114c0:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   114c4:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   114c8:	00 97       	sbiw	r24, 0x00	; 0
   114ca:	39 f4       	brne	.+14     	; 0x114da <manage_inactivity(bool)+0x3c>
   114cc:	20 91 71 06 	lds	r18, 0x0671	; 0x800671 <target_temperature_bed>
   114d0:	30 91 72 06 	lds	r19, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   114d4:	23 2b       	or	r18, r19
   114d6:	09 f4       	brne	.+2      	; 0x114da <manage_inactivity(bool)+0x3c>
   114d8:	ec c0       	rjmp	.+472    	; 0x116b2 <manage_inactivity(bool)+0x214>
   114da:	40 91 30 02 	lds	r20, 0x0230	; 0x800230 <safetytimer_inactive_time>
   114de:	50 91 31 02 	lds	r21, 0x0231	; 0x800231 <safetytimer_inactive_time+0x1>
   114e2:	60 91 32 02 	lds	r22, 0x0232	; 0x800232 <safetytimer_inactive_time+0x2>
   114e6:	70 91 33 02 	lds	r23, 0x0233	; 0x800233 <safetytimer_inactive_time+0x3>
   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 <manage_inactivity(bool)+0x58>
   114f4:	de c0       	rjmp	.+444    	; 0x116b2 <manage_inactivity(bool)+0x214>
    {
        safetyTimer.stop();
    }
    else if ((CHECK_ALL_HEATERS) && !safetyTimer.running())
   114f6:	89 2b       	or	r24, r25
   114f8:	31 f4       	brne	.+12     	; 0x11506 <manage_inactivity(bool)+0x68>
   114fa:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
   114fe:	90 91 72 06 	lds	r25, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   11502:	89 2b       	or	r24, r25
   11504:	29 f0       	breq	.+10     	; 0x11510 <manage_inactivity(bool)+0x72>
   11506:	80 91 d9 05 	lds	r24, 0x05D9	; 0x8005d9 <safetyTimer>
   1150a:	88 23       	and	r24, r24
   1150c:	09 f4       	brne	.+2      	; 0x11510 <manage_inactivity(bool)+0x72>
   1150e:	39 c1       	rjmp	.+626    	; 0x11782 <manage_inactivity(bool)+0x2e4>
    {
        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 <Timer<unsigned long>::expired(unsigned long)>
   11518:	88 23       	and	r24, r24
   1151a:	09 f4       	brne	.+2      	; 0x1151e <manage_inactivity(bool)+0x80>
   1151c:	cc c0       	rjmp	.+408    	; 0x116b6 <manage_inactivity(bool)+0x218>
    {
        disable_heater();
   1151e:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
        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 <lang_get_translation>
   1152a:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
        lcd_return_to_status();
   1152e:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
   11532:	c1 c0       	rjmp	.+386    	; 0x116b6 <manage_inactivity(bool)+0x218>
    case State::initializing:
        if (!updatePAT9125()) {
   11534:	0f 94 df 7c 	call	0x2f9be	; 0x2f9be <PAT9125_sensor::updatePAT9125() [clone .constprop.226]>
   11538:	88 23       	and	r24, r24
   1153a:	09 f4       	brne	.+2      	; 0x1153e <manage_inactivity(bool)+0xa0>
   1153c:	bd cf       	rjmp	.-134    	; 0x114b8 <manage_inactivity(bool)+0x1a>
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 <fsensor+0xd>
   11544:	91 11       	cpse	r25, r1
   11546:	01 c0       	rjmp	.+2      	; 0x1154a <manage_inactivity(bool)+0xac>
   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 <fsensor+0x3>
            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 <pat9125_y>
   11552:	90 91 8f 0e 	lds	r25, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   11556:	90 93 b9 17 	sts	0x17B9, r25	; 0x8017b9 <fsensor+0x10>
   1155a:	80 93 b8 17 	sts	0x17B8, r24	; 0x8017b8 <fsensor+0xf>
        state = State::ready;
   1155e:	82 e0       	ldi	r24, 0x02	; 2
   11560:	80 93 a9 17 	sts	0x17A9, r24	; 0x8017a9 <fsensor>
   11564:	a9 cf       	rjmp	.-174    	; 0x114b8 <manage_inactivity(bool)+0x1a>
        break;
    case State::ready: {
        updatePAT9125();
   11566:	0f 94 df 7c 	call	0x2f9be	; 0x2f9be <PAT9125_sensor::updatePAT9125() [clone .constprop.226]>
        postponedLoadEvent = false;
   1156a:	10 92 ad 17 	sts	0x17AD, r1	; 0x8017ad <fsensor+0x4>
        sensorActionOnError = SensorActionOnError::_Continue;
    }
}

bool Filament_sensor::checkFilamentEvents() {
    if (state != State::ready)
   1156e:	80 91 a9 17 	lds	r24, 0x17A9	; 0x8017a9 <fsensor>
   11572:	82 30       	cpi	r24, 0x02	; 2
   11574:	09 f0       	breq	.+2      	; 0x11578 <manage_inactivity(bool)+0xda>
   11576:	a0 cf       	rjmp	.-192    	; 0x114b8 <manage_inactivity(bool)+0x1a>
        return false;
    if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms
   11578:	80 91 ae 17 	lds	r24, 0x17AE	; 0x8017ae <fsensor+0x5>
   1157c:	81 11       	cpse	r24, r1
   1157e:	40 c0       	rjmp	.+128    	; 0x11600 <manage_inactivity(bool)+0x162>
   11580:	d0 91 b6 17 	lds	r29, 0x17B6	; 0x8017b6 <fsensor+0xd>
   11584:	81 e0       	ldi	r24, 0x01	; 1
   11586:	d1 11       	cpse	r29, r1
   11588:	01 c0       	rjmp	.+2      	; 0x1158c <manage_inactivity(bool)+0xee>
   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 <fsensor+0x3>
   11590:	89 17       	cp	r24, r25
   11592:	09 f4       	brne	.+2      	; 0x11596 <manage_inactivity(bool)+0xf8>
   11594:	91 cf       	rjmp	.-222    	; 0x114b8 <manage_inactivity(bool)+0x1a>
        oldFilamentPresent = newFilamentPresent;
   11596:	80 93 ac 17 	sts	0x17AC, r24	; 0x8017ac <fsensor+0x3>
        eventBlankingTimer.start();
   1159a:	8e ea       	ldi	r24, 0xAE	; 174
   1159c:	97 e1       	ldi	r25, 0x17	; 23
   1159e:	0f 94 89 2a 	call	0x25512	; 0x25512 <Timer<unsigned short>::start()>
        if (newFilamentPresent) { // filament insertion
   115a2:	dd 23       	and	r29, r29
   115a4:	b1 f1       	breq	.+108    	; 0x11612 <manage_inactivity(bool)+0x174>
}

void Filament_sensor::triggerFilamentInserted() {
    if (autoLoadEnabled
        && (eFilamentAction == FilamentAction::None)
        && !(
   115a6:	80 91 aa 17 	lds	r24, 0x17AA	; 0x8017aa <fsensor+0x1>
   115aa:	88 23       	and	r24, r24
   115ac:	11 f1       	breq	.+68     	; 0x115f2 <manage_inactivity(bool)+0x154>
    return false;
}

void Filament_sensor::triggerFilamentInserted() {
    if (autoLoadEnabled
        && (eFilamentAction == FilamentAction::None)
   115ae:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   115b2:	81 11       	cpse	r24, r1
   115b4:	1e c0       	rjmp	.+60     	; 0x115f2 <manage_inactivity(bool)+0x154>
        && !(
   115b6:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   115ba:	81 30       	cpi	r24, 0x01	; 1
   115bc:	d1 f0       	breq	.+52     	; 0x115f2 <manage_inactivity(bool)+0x154>
}

//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 <block_buffer_head>
   115c2:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <manage_inactivity(bool)+0x154>
            || printJobOngoing()
   115cc:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
   115d0:	81 11       	cpse	r24, r1
   115d2:	0f c0       	rjmp	.+30     	; 0x115f2 <manage_inactivity(bool)+0x154>
            || (lcd_commands_type == LcdCommands::Layer1Cal)
   115d4:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   115d8:	84 30       	cpi	r24, 0x04	; 4
   115da:	59 f0       	breq	.+22     	; 0x115f2 <manage_inactivity(bool)+0x154>
            || 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 <eeprom_read_byte>
}

void Filament_sensor::triggerFilamentInserted() {
    if (autoLoadEnabled
        && (eFilamentAction == FilamentAction::None)
        && !(
   115e4:	81 11       	cpse	r24, r1
   115e6:	05 c0       	rjmp	.+10     	; 0x115f2 <manage_inactivity(bool)+0x154>
            || 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 <menu_submenu(void (*)(), bool)>
        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 <fsensor+0x4>

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 <lcd_draw_update>
   115fe:	5c cf       	rjmp	.-328    	; 0x114b8 <manage_inactivity(bool)+0x1a>
}

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 <Timer<unsigned short>::expired(unsigned short)>
   1160c:	81 11       	cpse	r24, r1
   1160e:	b8 cf       	rjmp	.-144    	; 0x11580 <manage_inactivity(bool)+0xe2>
   11610:	53 cf       	rjmp	.-346    	; 0x114b8 <manage_inactivity(bool)+0x1a>
        && (eFilamentAction == FilamentAction::None)
        && (
            moves_planned() != 0
            || printJobOngoing()
        )
        && !(
   11612:	80 91 ab 17 	lds	r24, 0x17AB	; 0x8017ab <fsensor+0x2>
   11616:	88 23       	and	r24, r24
   11618:	79 f3       	breq	.-34     	; 0x115f8 <manage_inactivity(bool)+0x15a>
}

void Filament_sensor::triggerFilamentRemoved() {
//    SERIAL_ECHOLNPGM("triggerFilamentRemoved");
    if (runoutEnabled
        && (eFilamentAction == FilamentAction::None)
   1161a:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   1161e:	81 11       	cpse	r24, r1
   11620:	eb cf       	rjmp	.-42     	; 0x115f8 <manage_inactivity(bool)+0x15a>
   11622:	80 91 a4 0d 	lds	r24, 0x0DA4	; 0x800da4 <block_buffer_head>
   11626:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
   1162a:	89 1b       	sub	r24, r25
   1162c:	8f 70       	andi	r24, 0x0F	; 15
        && (
   1162e:	21 f4       	brne	.+8      	; 0x11638 <manage_inactivity(bool)+0x19a>
            moves_planned() != 0
            || printJobOngoing()
   11630:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
   11634:	88 23       	and	r24, r24
   11636:	01 f3       	breq	.-64     	; 0x115f8 <manage_inactivity(bool)+0x15a>
        )
        && !(
   11638:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
   1163c:	81 11       	cpse	r24, r1
   1163e:	dc cf       	rjmp	.-72     	; 0x115f8 <manage_inactivity(bool)+0x15a>
            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 <MMU2::mmu2+0x6f>
   11644:	81 30       	cpi	r24, 0x01	; 1
   11646:	c1 f2       	breq	.-80     	; 0x115f8 <manage_inactivity(bool)+0x15a>
            || (lcd_commands_type == LcdCommands::Layer1Cal)
   11648:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   1164c:	84 30       	cpi	r24, 0x04	; 4
   1164e:	a1 f2       	breq	.-88     	; 0x115f8 <manage_inactivity(bool)+0x15a>
            || 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 <eeprom_read_byte>
        && (eFilamentAction == FilamentAction::None)
        && (
            moves_planned() != 0
            || printJobOngoing()
        )
        && !(
   11658:	81 11       	cpse	r24, r1
   1165a:	ce cf       	rjmp	.-100    	; 0x115f8 <manage_inactivity(bool)+0x15a>
}

//! @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 <printf_P>


void Filament_sensor::filRunout() {
//    SERIAL_ECHOLNPGM("filRunout");
    sendHostNotification_P(MSG_FILAMENT_RUNOUT_DETECTED);
    runoutEnabled = false;
   11670:	10 92 ab 17 	sts	0x17AB, r1	; 0x8017ab <fsensor+0x2>
    autoLoadEnabled = false;
   11674:	10 92 aa 17 	sts	0x17AA, r1	; 0x8017aa <fsensor+0x1>
    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 <stop_and_save_print_to_ram(float, float)>
    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 <restore_print_from_ram_and_continue(float)>
    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_byte(unsigned char*)>
    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 <eeprom_increment_word(unsigned int*)>
    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 <enquecommand_front(char const*, bool) [clone .constprop.323]>
   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 <manage_inactivity(bool)+0x15a>
    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 <safetyTimer>
#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 <buflen>
   116ba:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   116be:	03 97       	sbiw	r24, 0x03	; 3
   116c0:	14 f4       	brge	.+4      	; 0x116c6 <manage_inactivity(bool)+0x228>
        get_command();
   116c2:	0e 94 b8 82 	call	0x10570	; 0x10570 <get_command()>
  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 <block_buffer_head>
   116ca:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
    }

    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 <manage_inactivity(bool)+0x254>
   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 <manage_inactivity(bool)+0x254>
   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 <Timer<unsigned short>::expired(unsigned short)>
   116e6:	88 23       	and	r24, r24
   116e8:	21 f0       	breq	.+8      	; 0x116f2 <manage_inactivity(bool)+0x254>
    {
        // 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 <Timer<unsigned short>::start()>
    }

  if(max_inactive_time && previous_millis_cmd.expired(max_inactive_time))
   116f2:	40 91 7c 03 	lds	r20, 0x037C	; 0x80037c <max_inactive_time>
   116f6:	50 91 7d 03 	lds	r21, 0x037D	; 0x80037d <max_inactive_time+0x1>
   116fa:	60 91 7e 03 	lds	r22, 0x037E	; 0x80037e <max_inactive_time+0x2>
   116fe:	70 91 7f 03 	lds	r23, 0x037F	; 0x80037f <max_inactive_time+0x3>
   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 <manage_inactivity(bool)+0x270>
   1170c:	3f c0       	rjmp	.+126    	; 0x1178c <manage_inactivity(bool)+0x2ee>
    kill(PSTR("Inactivity Shutdown"));
  if(stepper_inactive_time && previous_millis_cmd.expired(stepper_inactive_time)) {
   1170e:	40 91 34 02 	lds	r20, 0x0234	; 0x800234 <stepper_inactive_time>
   11712:	50 91 35 02 	lds	r21, 0x0235	; 0x800235 <stepper_inactive_time+0x1>
   11716:	60 91 36 02 	lds	r22, 0x0236	; 0x800236 <stepper_inactive_time+0x2>
   1171a:	70 91 37 02 	lds	r23, 0x0237	; 0x800237 <stepper_inactive_time+0x3>
   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 <manage_inactivity(bool)+0x2b4>
   11728:	84 e8       	ldi	r24, 0x84	; 132
   1172a:	93 e0       	ldi	r25, 0x03	; 3
   1172c:	0f 94 0c 2b 	call	0x25618	; 0x25618 <Timer<unsigned long>::expired(unsigned long)>
   11730:	88 23       	and	r24, r24
   11732:	79 f0       	breq	.+30     	; 0x11752 <manage_inactivity(bool)+0x2b4>
   11734:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   11738:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
    if(blocks_queued() == false && ignore_stepper_queue == false) {
   1173c:	98 13       	cpse	r25, r24
   1173e:	09 c0       	rjmp	.+18     	; 0x11752 <manage_inactivity(bool)+0x2b4>
   11740:	c1 11       	cpse	r28, r1
   11742:	07 c0       	rjmp	.+14     	; 0x11752 <manage_inactivity(bool)+0x2b4>
      disable_x();
   11744:	17 9a       	sbi	0x02, 7	; 2
   11746:	10 92 8e 06 	sts	0x068E, r1	; 0x80068e <axis_known_position>
      disable_y();
   1174a:	16 9a       	sbi	0x02, 6	; 2
   1174c:	10 92 8f 06 	sts	0x068F, r1	; 0x80068f <axis_known_position+0x1>
      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 <fanSpeed>
  block_t *block;

  if(block_buffer_tail != block_buffer_head)
   11756:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
   1175a:	80 91 a4 0d 	lds	r24, 0x0DA4	; 0x800da4 <block_buffer_head>
   1175e:	98 17       	cp	r25, r24
   11760:	01 f1       	breq	.+64     	; 0x117a2 <manage_inactivity(bool)+0x304>
  {
    uint8_t block_index = block_buffer_tail;
   11762:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
    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 <block_buffer_head>
   11778:	98 17       	cp	r25, r24
   1177a:	99 f0       	breq	.+38     	; 0x117a2 <manage_inactivity(bool)+0x304>
      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 <manage_inactivity(bool)+0x2d6>
    {
        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 <Timer<unsigned long>::start()>
   1178a:	95 cf       	rjmp	.-214    	; 0x116b6 <manage_inactivity(bool)+0x218>
        // 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 <Timer<unsigned long>::expired(unsigned long)>
   11794:	88 23       	and	r24, r24
   11796:	09 f4       	brne	.+2      	; 0x1179a <manage_inactivity(bool)+0x2fc>
   11798:	ba cf       	rjmp	.-140    	; 0x1170e <manage_inactivity(bool)+0x270>
    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 <kill(char const*)>
  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 <manage_inactivity(bool)+0x30a>
   117a6:	9f c0       	rjmp	.+318    	; 0x118e6 <manage_inactivity(bool)+0x448>
      if (fan_kick_end == 0) {
   117a8:	80 91 6a 03 	lds	r24, 0x036A	; 0x80036a <check_axes_activity()::fan_kick_end>
   117ac:	90 91 6b 03 	lds	r25, 0x036B	; 0x80036b <check_axes_activity()::fan_kick_end+0x1>
   117b0:	a0 91 6c 03 	lds	r26, 0x036C	; 0x80036c <check_axes_activity()::fan_kick_end+0x2>
   117b4:	b0 91 6d 03 	lds	r27, 0x036D	; 0x80036d <check_axes_activity()::fan_kick_end+0x3>
   117b8:	89 2b       	or	r24, r25
   117ba:	8a 2b       	or	r24, r26
   117bc:	8b 2b       	or	r24, r27
   117be:	81 f4       	brne	.+32     	; 0x117e0 <manage_inactivity(bool)+0x342>
        // Just starting up fan - run at full power.
        fan_kick_end = _millis() + FAN_KICKSTART_TIME;
   117c0:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <check_axes_activity()::fan_kick_end>
   117d0:	70 93 6b 03 	sts	0x036B, r23	; 0x80036b <check_axes_activity()::fan_kick_end+0x1>
   117d4:	80 93 6c 03 	sts	0x036C, r24	; 0x80036c <check_axes_activity()::fan_kick_end+0x2>
   117d8:	90 93 6d 03 	sts	0x036D, r25	; 0x80036d <check_axes_activity()::fan_kick_end+0x3>
        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 <manage_inactivity(bool)+0x360>
    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 <millis2>
   117e4:	00 91 6a 03 	lds	r16, 0x036A	; 0x80036a <check_axes_activity()::fan_kick_end>
   117e8:	10 91 6b 03 	lds	r17, 0x036B	; 0x80036b <check_axes_activity()::fan_kick_end+0x1>
   117ec:	20 91 6c 03 	lds	r18, 0x036C	; 0x80036c <check_axes_activity()::fan_kick_end+0x2>
   117f0:	30 91 6d 03 	lds	r19, 0x036D	; 0x80036d <check_axes_activity()::fan_kick_end+0x3>
   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 <manage_inactivity(bool)+0x33e>
    } 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 <fan_measuring>
   11802:	88 23       	and	r24, r24
   11804:	09 f4       	brne	.+2      	; 0x11808 <manage_inactivity(bool)+0x36a>
   11806:	78 c0       	rjmp	.+240    	; 0x118f8 <manage_inactivity(bool)+0x45a>
		fanSpeedBckp = tail_fan_speed;
   11808:	c0 93 14 02 	sts	0x0214, r28	; 0x800214 <fanSpeedBckp>
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 <manage_inactivity(bool)+0x384>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]>
    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 <manage_inactivity(bool)+0x404>
		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 <backlight_wake(unsigned char)>
		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 <manage_inactivity(bool)+0x3b0>
   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 <manage_inactivity(bool)+0x3b8>
   11854:	54 c0       	rjmp	.+168    	; 0x118fe <manage_inactivity(bool)+0x460>
				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 <manage_inactivity(bool)+0x3c2>
   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 <lcd_encoder>
   11868:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <lcd_encoder+0x1>
   11878:	20 93 6f 06 	sts	0x066F, r18	; 0x80066f <lcd_encoder>
				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 <manage_inactivity(bool)+0x3ea>
   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 <Sound_MakeSound(eSOUND_TYPE)>

		if (lcd_draw_update == 0) {
   11894:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   11898:	81 11       	cpse	r24, r1
   1189a:	03 c0       	rjmp	.+6      	; 0x118a2 <manage_inactivity(bool)+0x404>
			// 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 <lcd_draw_update>
  #endif
  check_axes_activity();
  MMU2::mmu2.mmu_loop();

  lcd_knob_update();
  backlight_update();
   118a2:	0e 94 a6 89 	call	0x1134c	; 0x1134c <backlight_update()>

  // handle longpress
  if(lcd_longpress_trigger)
   118a6:	80 91 d3 05 	lds	r24, 0x05D3	; 0x8005d3 <lcd_longpress_trigger>
   118aa:	88 23       	and	r24, r24
   118ac:	61 f0       	breq	.+24     	; 0x118c6 <manage_inactivity(bool)+0x428>
  {
      lcd_consume_click(); // Reset trigger to prevent recursion
   118ae:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
      // 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 <lcd_longpress_func>
   118b6:	f0 91 17 04 	lds	r31, 0x0417	; 0x800417 <lcd_longpress_func+0x1>
   118ba:	30 97       	sbiw	r30, 0x00	; 0
   118bc:	21 f0       	breq	.+8      	; 0x118c6 <manage_inactivity(bool)+0x428>
   118be:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <lcd_update_enabled>
   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 <host_autoreport()>
#endif //AUTO_REPORT
  host_keepalive();
   118ca:	0e 94 3f 7f 	call	0xfe7e	; 0xfe7e <host_keepalive()>
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 <Timer<unsigned long>::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 <check_axes_activity()::fan_kick_end>
   118ea:	10 92 6b 03 	sts	0x036B, r1	; 0x80036b <check_axes_activity()::fan_kick_end+0x1>
   118ee:	10 92 6c 03 	sts	0x036C, r1	; 0x80036c <check_axes_activity()::fan_kick_end+0x2>
   118f2:	10 92 6d 03 	sts	0x036D, r1	; 0x80036d <check_axes_activity()::fan_kick_end+0x3>
   118f6:	83 cf       	rjmp	.-250    	; 0x117fe <manage_inactivity(bool)+0x360>
  #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 <fanSpeedSoftPwm>
   118fc:	87 cf       	rjmp	.-242    	; 0x1180c <manage_inactivity(bool)+0x36e>
				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 <manage_inactivity(bool)+0x3f2>

00011908 <delay_keep_alive(unsigned int)>:
#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_heater()>
        // 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 <manage_inactivity(bool)>
        lcd_update(0);
   11918:	80 e0       	ldi	r24, 0x00	; 0
   1191a:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
        if (ms == 0)
   1191e:	20 97       	sbiw	r28, 0x00	; 0
   11920:	99 f0       	breq	.+38     	; 0x11948 <delay_keep_alive(unsigned int)+0x40>
            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_keep_alive(unsigned int)+0x30>
            _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 <delay2>
            ms -= 50;
   11934:	e2 97       	sbiw	r28, 0x32	; 50
   11936:	eb cf       	rjmp	.-42     	; 0x1190e <delay_keep_alive(unsigned int)+0x6>
        } 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 <delay2>
            ms = 0;
   11942:	d0 e0       	ldi	r29, 0x00	; 0
   11944:	c0 e0       	ldi	r28, 0x00	; 0
   11946:	e3 cf       	rjmp	.-58     	; 0x1190e <delay_keep_alive(unsigned int)+0x6>
        }
    }
}
   11948:	df 91       	pop	r29
   1194a:	cf 91       	pop	r28
   1194c:	08 95       	ret

0001194e <mmu_M600_filament_change_screen(unsigned char)>:
/// @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_heater()>
        manage_inactivity(true);
   1195a:	81 e0       	ldi	r24, 0x01	; 1
   1195c:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
   11960:	80 91 b7 13 	lds	r24, 0x13B7	; 0x8013b7 <MMU2::mmu2+0x6d>

        btn = MMU2::mmu2.GetPrinterButtonOperation();
        if (btn != MMU2::Buttons::NoButton)
   11964:	8f 3f       	cpi	r24, 0xFF	; 255
   11966:	d9 f4       	brne	.+54     	; 0x1199e <mmu_M600_filament_change_screen(unsigned char)+0x50>
    // 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 <MMU2::mmu2+0x2>
   1196c:	84 30       	cpi	r24, 0x04	; 4
   1196e:	21 f4       	brne	.+8      	; 0x11978 <mmu_M600_filament_change_screen(unsigned char)+0x2a>
    };
    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 <MMU2::mmu2+0x5>
   11974:	81 11       	cpse	r24, r1
   11976:	ef cf       	rjmp	.-34     	; 0x11956 <mmu_M600_filament_change_screen(unsigned char)+0x8>
        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 <MMU2::mmu2+0x40>
   1197c:	90 91 8b 13 	lds	r25, 0x138B	; 0x80138b <MMU2::mmu2+0x41>
   11980:	01 97       	sbiw	r24, 0x01	; 1
   11982:	49 f7       	brne	.-46     	; 0x11956 <mmu_M600_filament_change_screen(unsigned char)+0x8>
            && lastErrorCode != ec) // The error code is not a duplicate
   11984:	80 91 b1 13 	lds	r24, 0x13B1	; 0x8013b1 <MMU2::mmu2+0x67>
   11988:	90 91 b2 13 	lds	r25, 0x13B2	; 0x8013b2 <MMU2::mmu2+0x68>
   1198c:	89 32       	cpi	r24, 0x29	; 41
   1198e:	90 48       	sbci	r25, 0x80	; 128
   11990:	11 f3       	breq	.-60     	; 0x11956 <mmu_M600_filament_change_screen(unsigned char)+0x8>
        {
            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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]>
   1199c:	dc cf       	rjmp	.-72     	; 0x11956 <mmu_M600_filament_change_screen(unsigned char)+0x8>
    inline Buttons GetPrinterButtonOperation() {
        return printerButtonOperation;
    }

    inline void ClearPrinterButtonOperation() {
        printerButtonOperation = Buttons::NoButton;
   1199e:	d0 93 b7 13 	sts	0x13B7, r29	; 0x8013b7 <MMU2::mmu2+0x6d>
        {
            MMU2::mmu2.ClearPrinterButtonOperation();

            if (btn == MMU2::Buttons::Eject) {
   119a2:	85 30       	cpi	r24, 0x05	; 5
   119a4:	39 f4       	brne	.+14     	; 0x119b4 <mmu_M600_filament_change_screen(unsigned char)+0x66>
                if (eject_slot != (uint8_t)MMU2::FILAMENT_UNKNOWN) {
   119a6:	cf 3f       	cpi	r28, 0xFF	; 255
   119a8:	f9 f2       	breq	.-66     	; 0x11968 <mmu_M600_filament_change_screen(unsigned char)+0x1a>
                    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 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]>
   119b2:	d1 cf       	rjmp	.-94     	; 0x11956 <mmu_M600_filament_change_screen(unsigned char)+0x8>
                    // 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 <mmu_M600_filament_change_screen(unsigned char)+0x1a>
            }
        }

        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 <adc_channel>
   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 <adc_count>
   11a0a:	8f 5f       	subi	r24, 0xFF	; 255
   11a0c:	80 93 23 03 	sts	0x0323, r24	; 0x800323 <adc_count>
   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 <adc_channel>
   11a1a:	8f 5f       	subi	r24, 0xFF	; 255
   11a1c:	80 93 34 03 	sts	0x0334, r24	; 0x800334 <adc_channel>
   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 <adc_values>
   11a2a:	90 91 25 03 	lds	r25, 0x0325	; 0x800325 <adc_values+0x1>
   11a2e:	90 93 0b 06 	sts	0x060B, r25	; 0x80060b <current_temperature_raw+0x1>
   11a32:	80 93 0a 06 	sts	0x060A, r24	; 0x80060a <current_temperature_raw>
    current_temperature_bed_raw = adc_values[ADC_PIN_IDX(TEMP_BED_PIN)];
   11a36:	80 91 28 03 	lds	r24, 0x0328	; 0x800328 <adc_values+0x4>
   11a3a:	90 91 29 03 	lds	r25, 0x0329	; 0x800329 <adc_values+0x5>
   11a3e:	90 93 09 06 	sts	0x0609, r25	; 0x800609 <current_temperature_bed_raw+0x1>
   11a42:	80 93 08 06 	sts	0x0608, r24	; 0x800608 <current_temperature_bed_raw>
#ifdef PINDA_THERMISTOR
    current_temperature_raw_pinda = adc_values[ADC_PIN_IDX(TEMP_PINDA_PIN)];
   11a46:	80 91 2a 03 	lds	r24, 0x032A	; 0x80032a <adc_values+0x6>
   11a4a:	90 91 2b 03 	lds	r25, 0x032B	; 0x80032b <adc_values+0x7>
   11a4e:	90 93 07 06 	sts	0x0607, r25	; 0x800607 <current_temperature_raw_pinda+0x1>
   11a52:	80 93 06 06 	sts	0x0606, r24	; 0x800606 <current_temperature_raw_pinda>
#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 <adc_values+0xa>
   11a5a:	90 91 2f 03 	lds	r25, 0x032F	; 0x80032f <adc_values+0xb>
   11a5e:	90 93 15 06 	sts	0x0615, r25	; 0x800615 <current_temperature_raw_ambient+0x1>
   11a62:	80 93 14 06 	sts	0x0614, r24	; 0x800614 <current_temperature_raw_ambient>
#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 <adc_values+0x8>
   11a6a:	90 91 2d 03 	lds	r25, 0x032D	; 0x80032d <adc_values+0x9>
   11a6e:	90 93 5c 06 	sts	0x065C, r25	; 0x80065c <current_voltage_raw_pwr+0x1>
   11a72:	80 93 5b 06 	sts	0x065B, r24	; 0x80065b <current_voltage_raw_pwr>
#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 <adc_values+0xe>
   11a7a:	90 91 33 03 	lds	r25, 0x0333	; 0x800333 <adc_values+0xf>
   11a7e:	90 93 5a 06 	sts	0x065A, r25	; 0x80065a <current_voltage_raw_bed+0x1>
   11a82:	80 93 59 06 	sts	0x0659, r24	; 0x800659 <current_voltage_raw_bed>
#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_setmux(unsigned char)>
                adc_count = 0;
   11ae8:	10 92 23 03 	sts	0x0323, r1	; 0x800323 <adc_count>
   11aec:	ea cf       	rjmp	.-44     	; 0x11ac2 <__vector_29+0x104>

00011aee <adc_start_cycle()>:
	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_count>
    adc_channel = 0;
   11b00:	10 92 34 03 	sts	0x0334, r1	; 0x800334 <adc_channel>
    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 <adc_setmux(unsigned char)>
    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 <adc_start_cycle()+0x28>
	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 <gcode_G80()>:
}


// 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 <st_synchronize()>
    if (planner_aborted)
   11b60:	80 91 ab 0d 	lds	r24, 0x0DAB	; 0x800dab <planner_aborted>
   11b64:	81 11       	cpse	r24, r1
   11b66:	17 c0       	rjmp	.+46     	; 0x11b96 <gcode_G80()+0x6e>
        return;

    mesh_bed_leveling_flag = true;
   11b68:	81 e0       	ldi	r24, 0x01	; 1
   11b6a:	80 93 a7 0d 	sts	0x0DA7, r24	; 0x800da7 <mesh_bed_leveling_flag>

    // 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 <axis_known_position>
   11b72:	88 23       	and	r24, r24
   11b74:	49 f0       	breq	.+18     	; 0x11b88 <gcode_G80()+0x60>
   11b76:	80 91 8f 06 	lds	r24, 0x068F	; 0x80068f <axis_known_position+0x1>
   11b7a:	88 23       	and	r24, r24
   11b7c:	29 f0       	breq	.+10     	; 0x11b88 <gcode_G80()+0x60>
   11b7e:	20 91 90 06 	lds	r18, 0x0690	; 0x800690 <axis_known_position+0x2>
   11b82:	2f 83       	std	Y+7, r18	; 0x07
   11b84:	21 11       	cpse	r18, r1
   11b86:	20 c0       	rjmp	.+64     	; 0x11bc8 <gcode_G80()+0xa0>
   11b88:	81 e0       	ldi	r24, 0x01	; 1
   11b8a:	80 93 a1 10 	sts	0x10A1, r24	; 0x8010a1 <cmdbuffer_front_already_processed>
        // 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 <enquecommand_front(char const*, bool) [clone .constprop.323]>
    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 <eeprom_read_byte>
   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 <code_seen(char) [clone .lto_priv.549]>
   11bd8:	08 2f       	mov	r16, r24
   11bda:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   11bde:	8e 83       	std	Y+6, r24	; 0x06
   11be0:	00 23       	and	r16, r16
   11be2:	29 f0       	breq	.+10     	; 0x11bee <gcode_G80()+0xc6>
   11be4:	87 30       	cpi	r24, 0x07	; 7
   11be6:	09 f4       	brne	.+2      	; 0x11bea <gcode_G80()+0xc2>
   11be8:	c9 c0       	rjmp	.+402    	; 0x11d7c <gcode_G80()+0x254>
   11bea:	83 30       	cpi	r24, 0x03	; 3
   11bec:	29 f0       	breq	.+10     	; 0x11bf8 <gcode_G80()+0xd0>
      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 <gcode_G80()+0xcc>
   11bf2:	c3 c0       	rjmp	.+390    	; 0x11d7a <gcode_G80()+0x252>
   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 <eeprom_read_byte>
   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 <code_seen(char) [clone .lto_priv.549]>
   11c18:	18 2f       	mov	r17, r24
   11c1a:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   11c1e:	11 23       	and	r17, r17
   11c20:	29 f0       	breq	.+10     	; 0x11c2c <gcode_G80()+0x104>
   11c22:	88 23       	and	r24, r24
   11c24:	19 f0       	breq	.+6      	; 0x11c2c <gcode_G80()+0x104>
   11c26:	8b 30       	cpi	r24, 0x0B	; 11
   11c28:	08 f4       	brcc	.+2      	; 0x11c2c <gcode_G80()+0x104>
   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 <code_seen(char) [clone .lto_priv.549]>
   11c32:	88 23       	and	r24, r24
   11c34:	09 f4       	brne	.+2      	; 0x11c38 <gcode_G80()+0x110>
   11c36:	ab c0       	rjmp	.+342    	; 0x11d8e <gcode_G80()+0x266>
   11c38:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   11c62:	88 23       	and	r24, r24
   11c64:	09 f4       	brne	.+2      	; 0x11c68 <gcode_G80()+0x140>
   11c66:	9c c0       	rjmp	.+312    	; 0x11da0 <gcode_G80()+0x278>
   11c68:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   11c92:	88 23       	and	r24, r24
   11c94:	09 f4       	brne	.+2      	; 0x11c98 <gcode_G80()+0x170>
   11c96:	89 c0       	rjmp	.+274    	; 0x11daa <gcode_G80()+0x282>
   11c98:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   11cc2:	88 23       	and	r24, r24
   11cc4:	09 f4       	brne	.+2      	; 0x11cc8 <gcode_G80()+0x1a0>
   11cc6:	7a c0       	rjmp	.+244    	; 0x11dbc <gcode_G80()+0x294>
   11cc8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <mesh_bed_leveling::reset() [clone .constprop.100]>
    mbl.z_values[0][0] = min_pos[Z_AXIS];
   11cf0:	80 91 29 02 	lds	r24, 0x0229	; 0x800229 <min_pos+0x8>
   11cf4:	90 91 2a 02 	lds	r25, 0x022A	; 0x80022a <min_pos+0x9>
   11cf8:	a0 91 2b 02 	lds	r26, 0x022B	; 0x80022b <min_pos+0xa>
   11cfc:	b0 91 2c 02 	lds	r27, 0x022C	; 0x80022c <min_pos+0xb>
   11d00:	80 93 c2 13 	sts	0x13C2, r24	; 0x8013c2 <mbl+0x1>
   11d04:	90 93 c3 13 	sts	0x13C3, r25	; 0x8013c3 <mbl+0x2>
   11d08:	a0 93 c4 13 	sts	0x13C4, r26	; 0x8013c4 <mbl+0x3>
   11d0c:	b0 93 c5 13 	sts	0x13C5, r27	; 0x8013c5 <mbl+0x4>

    // Reset baby stepping to zero, if the babystepping has already been loaded before.
    babystep_undo();
   11d10:	0f 94 cf c9 	call	0x3939e	; 0x3939e <babystep_undo()>
   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 <eeprom_read_word>
   11d1e:	01 96       	adiw	r24, 0x01	; 1
   11d20:	09 f0       	breq	.+2      	; 0x11d24 <gcode_G80()+0x1fc>
   11d22:	51 c0       	rjmp	.+162    	; 0x11dc6 <gcode_G80()+0x29e>
   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 <gcode_G80()+0x1f0>
		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 <gcode_G80()+0x2a2>
   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 <gcode_G80()+0x2a2>
            if (isOn3x3Mesh) {
                if (has_z && (row || col)) {
   11d68:	21 10       	cpse	r2, r1
   11d6a:	3f c1       	rjmp	.+638    	; 0x11fea <gcode_G80()+0x4c2>
            } 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 <gcode_G80()+0x24c>
   11d72:	70 c0       	rjmp	.+224    	; 0x11e54 <gcode_G80()+0x32c>
   11d74:	8f 81       	ldd	r24, Y+7	; 0x07
   11d76:	8e 87       	std	Y+14, r24	; 0x0e
   11d78:	37 c0       	rjmp	.+110    	; 0x11de8 <gcode_G80()+0x2c0>
    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 <gcode_G80()+0xe0>

    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 <gcode_G80()+0x134>
    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 <gcode_G80()+0x15c>
    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 <gcode_G80()+0x194>
    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 <gcode_G80()+0x1bc>
   11dc6:	2f 80       	ldd	r2, Y+7	; 0x07
   11dc8:	b4 cf       	rjmp	.-152    	; 0x11d32 <gcode_G80()+0x20a>
    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 <gcode_G80()+0x32e>
   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 <BED_X(unsigned char)>
   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 <BED_X(unsigned char)>
   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 <gcode_G80()+0x2ea>
   11e10:	1c c1       	rjmp	.+568    	; 0x1204a <gcode_G80()+0x522>
   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 <gcode_G80()+0x300>
   11e26:	11 c1       	rjmp	.+546    	; 0x1204a <gcode_G80()+0x522>
   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 <gcode_G80()+0x316>
   11e3c:	06 c1       	rjmp	.+524    	; 0x1204a <gcode_G80()+0x522>
   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 <gcode_G80()+0x32c>
   11e52:	fb c0       	rjmp	.+502    	; 0x1204a <gcode_G80()+0x522>
                    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 <gcode_G80()+0x33c>
   11e62:	79 cf       	rjmp	.-270    	; 0x11d56 <gcode_G80()+0x22e>
   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 <gcode_G80()+0x356>
   11e7c:	63 cf       	rjmp	.-314    	; 0x11d44 <gcode_G80()+0x21c>

            // 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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]>

    // 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 <custom_message_type>
   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 <custom_message_state>
   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_type>
    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 <custom_message_state>
    lcd_update(1);
   11e9c:	81 e0       	ldi	r24, 0x01	; 1
   11e9e:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>

    // 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 <current_position+0x8>
   11eae:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   11eb2:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   11eb6:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
    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 <plan_buffer_line_curposXYZE(float)>

    // 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 <setup_for_endstop_move(bool) [clone .lto_priv.392]>
   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 <gcode_G80()+0x3c8>
   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 <gcode_G80()+0x3de>
   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 <BED_X(unsigned char)>
   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 <BED_X(unsigned char)>
   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 <gcode_G80()+0x400>
   11f26:	99 c0       	rjmp	.+306    	; 0x1205a <gcode_G80()+0x532>
            if (!isOn3x3Mesh) {
   11f28:	11 11       	cpse	r17, r1
   11f2a:	c8 c0       	rjmp	.+400    	; 0x120bc <gcode_G80()+0x594>
   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 <gcode_G80()+0x3aa>

        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 <current_position+0x8>
   11f70:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   11f74:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   11f78:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
    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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   11f88:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <gcode_G80()+0x46c>
   11f92:	33 c2       	rjmp	.+1126   	; 0x123fa <gcode_G80()+0x8d2>
        if (g80_fail_cnt++ >= 1) {
   11f94:	80 91 68 03 	lds	r24, 0x0368	; 0x800368 <gcode_G80()::g80_fail_cnt>
   11f98:	91 e0       	ldi	r25, 0x01	; 1
   11f9a:	98 0f       	add	r25, r24
   11f9c:	90 93 68 03 	sts	0x0368, r25	; 0x800368 <gcode_G80()::g80_fail_cnt>
   11fa0:	88 23       	and	r24, r24
   11fa2:	09 f4       	brne	.+2      	; 0x11fa6 <gcode_G80()+0x47e>
   11fa4:	d3 c1       	rjmp	.+934    	; 0x1234c <gcode_G80()+0x824>
            print_stop();
   11fa6:	60 e0       	ldi	r22, 0x00	; 0
   11fa8:	80 e0       	ldi	r24, 0x00	; 0
   11faa:	0e 94 53 f5 	call	0x1eaa6	; 0x1eaa6 <print_stop(bool, bool)>
            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 <lang_get_translation>
   11fb6:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
            lcd_z_calibration_prompt(false);
   11fba:	80 e0       	ldi	r24, 0x00	; 0
   11fbc:	0f 94 92 0d 	call	0x21b24	; 0x21b24 <lcd_z_calibration_prompt(bool)>
        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 <busy_state>
    // 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 <lcd_setstatuspgm(char const*)>
    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_type>
    custom_message_state = custom_message_state_old;
   11fd4:	68 85       	ldd	r22, Y+8	; 0x08
   11fd6:	60 93 f6 03 	sts	0x03F6, r22	; 0x8003f6 <custom_message_state>
    lcd_update(2);
   11fda:	82 e0       	ldi	r24, 0x02	; 2
   11fdc:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>

    st_synchronize();
   11fe0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    mesh_bed_leveling_flag = false;
   11fe4:	10 92 a7 0d 	sts	0x0DA7, r1	; 0x800da7 <mesh_bed_leveling_flag>
   11fe8:	d6 cd       	rjmp	.-1108   	; 0x11b96 <gcode_G80()+0x6e>
    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 <gcode_G80()+0x4cc>
   11fee:	11 23       	and	r17, r17
   11ff0:	09 f4       	brne	.+2      	; 0x11ff4 <gcode_G80()+0x4cc>
   11ff2:	bc ce       	rjmp	.-648    	; 0x11d6c <gcode_G80()+0x244>
                    // 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 <eeprom_read_word>
                    const float z0 = mbl.z_values[0][0] + *reinterpret_cast<int16_t*>(&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 <mbl+0x1>
   1202e:	70 91 c3 13 	lds	r23, 0x13C3	; 0x8013c3 <mbl+0x2>
   12032:	80 91 c4 13 	lds	r24, 0x13C4	; 0x8013c4 <mbl+0x3>
   12036:	90 91 c5 13 	lds	r25, 0x13C5	; 0x8013c5 <mbl+0x4>
   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 <gcode_G80()+0x244>
                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 <gcode_G80()+0x52a>
   12050:	02 cf       	rjmp	.-508    	; 0x11e56 <gcode_G80()+0x32e>
   12052:	22 20       	and	r2, r2
   12054:	09 f4       	brne	.+2      	; 0x12058 <gcode_G80()+0x530>
   12056:	fe ce       	rjmp	.-516    	; 0x11e54 <gcode_G80()+0x32c>
   12058:	fe ce       	rjmp	.-516    	; 0x11e56 <gcode_G80()+0x32e>
            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 <gcode_G80()+0x58a>
   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 <gcode_G80()+0x58a>
   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 <gcode_G80()+0x58a>
   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 <gcode_G80()+0x594>
   120b2:	11 23       	and	r17, r17
   120b4:	09 f4       	brne	.+2      	; 0x120b8 <gcode_G80()+0x590>
   120b6:	52 cf       	rjmp	.-348    	; 0x11f5c <gcode_G80()+0x434>
   120b8:	21 10       	cpse	r2, r1
   120ba:	50 cf       	rjmp	.-352    	; 0x11f5c <gcode_G80()+0x434>
            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 <gcode_G80()+0x5e2>
   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 <current_position+0x8>
   12112:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   12116:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   1211a:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   1211e:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   12122:	87 ff       	sbrs	r24, 7
   12124:	10 c0       	rjmp	.+32     	; 0x12146 <gcode_G80()+0x61e>
            current_position[Z_AXIS] = init_z_bckp;
   12126:	c0 92 99 06 	sts	0x0699, r12	; 0x800699 <current_position+0x8>
   1212a:	d0 92 9a 06 	sts	0x069A, r13	; 0x80069a <current_position+0x9>
   1212e:	e0 92 9b 06 	sts	0x069B, r14	; 0x80069b <current_position+0xa>
   12132:	f0 92 9c 06 	sts	0x069C, r15	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   12142:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        }

        // 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 <current_position>
   12152:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   12156:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   1215a:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
        current_position[Y_AXIS] = y_pos;
   1215e:	80 92 95 06 	sts	0x0695, r8	; 0x800695 <current_position+0x4>
   12162:	90 92 96 06 	sts	0x0696, r9	; 0x800696 <current_position+0x5>
   12166:	a0 92 97 06 	sts	0x0697, r10	; 0x800697 <current_position+0x6>
   1216a:	b0 92 98 06 	sts	0x0698, r11	; 0x800698 <current_position+0x7>

        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 <world2machine_clamp(float&, float&)>

        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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   12186:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        if (planner_aborted)
   1218a:	80 91 ab 0d 	lds	r24, 0x0DAB	; 0x800dab <planner_aborted>
   1218e:	88 23       	and	r24, r24
   12190:	39 f0       	breq	.+14     	; 0x121a0 <gcode_G80()+0x678>
        {
            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_type>
            custom_message_state = custom_message_state_old;
   12198:	88 85       	ldd	r24, Y+8	; 0x08
   1219a:	80 93 f6 03 	sts	0x03F6, r24	; 0x8003f6 <custom_message_state>
   1219e:	fb cc       	rjmp	.-1546   	; 0x11b96 <gcode_G80()+0x6e>
            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 <gcode_G80()+0x69c>
   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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>
   121ce:	81 11       	cpse	r24, r1
   121d0:	0b c0       	rjmp	.+22     	; 0x121e8 <gcode_G80()+0x6c0>
            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 <lang_get_translation>
   121da:	9f 93       	push	r25
   121dc:	8f 93       	push	r24
   121de:	0f 94 d2 da 	call	0x3b5a4	; 0x3b5a4 <printf_P>
   121e2:	0f 90       	pop	r0
   121e4:	0f 90       	pop	r0
   121e6:	be ce       	rjmp	.-644    	; 0x11f64 <gcode_G80()+0x43c>
        // 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 <current_position+0x8>
   121ec:	30 91 9a 06 	lds	r19, 0x069A	; 0x80069a <current_position+0x9>
   121f0:	40 91 9b 06 	lds	r20, 0x069B	; 0x80069b <current_position+0xa>
   121f4:	50 91 9c 06 	lds	r21, 0x069C	; 0x80069c <current_position+0xb>
   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 <gcode_G80()+0x752>
            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 <current_position+0x8>
   1221a:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   1221e:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   12222:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   12232:	0f 94 a9 43 	call	0x28752	; 0x28752 <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
   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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>
   12240:	88 23       	and	r24, r24
   12242:	39 f2       	breq	.-114    	; 0x121d2 <gcode_G80()+0x6aa>
                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 <current_position+0x8>
   12248:	30 91 9a 06 	lds	r19, 0x069A	; 0x80069a <current_position+0x9>
   1224c:	40 91 9b 06 	lds	r20, 0x069B	; 0x80069b <current_position+0xa>
   12250:	50 91 9c 06 	lds	r21, 0x069C	; 0x80069c <current_position+0xb>
   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 <gcode_G80()+0x752>
                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 <puts_P>
   12278:	75 ce       	rjmp	.-790    	; 0x11f64 <gcode_G80()+0x43c>
   1227a:	c0 90 99 06 	lds	r12, 0x0699	; 0x800699 <current_position+0x8>
   1227e:	d0 90 9a 06 	lds	r13, 0x069A	; 0x80069a <current_position+0x9>
   12282:	e0 90 9b 06 	lds	r14, 0x069B	; 0x80069b <current_position+0xa>
   12286:	f0 90 9c 06 	lds	r15, 0x069C	; 0x80069c <current_position+0xb>
            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 <gcode_G80()+0x78e>
   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 <gcode_G80()+0x78e>
            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 <gcode_G80()+0x74c>
}

#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 <eeprom_read_byte>
   122be:	88 23       	and	r24, r24
   122c0:	09 f4       	brne	.+2      	; 0x122c4 <gcode_G80()+0x79c>
   122c2:	40 c0       	rjmp	.+128    	; 0x12344 <gcode_G80()+0x81c>
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 <eeprom_read_byte>
	if (!calibration_status_pinda()) return 0;
   122cc:	88 23       	and	r24, r24
   122ce:	d1 f1       	breq	.+116    	; 0x12344 <gcode_G80()+0x81c>
	return temp_comp_interpolation(temperature_pinda) / cs.axis_steps_per_mm[Z_AXIS];
   122d0:	60 91 97 03 	lds	r22, 0x0397	; 0x800397 <current_temperature_pinda>
   122d4:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   122d8:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   122dc:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   122e0:	0e 94 22 5c 	call	0xb844	; 0xb844 <temp_comp_interpolation(float)>
   122e4:	20 91 c9 0d 	lds	r18, 0x0DC9	; 0x800dc9 <cs+0xc>
   122e8:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   122ec:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   122f0:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <custom_message_state>
   12336:	81 50       	subi	r24, 0x01	; 1
   12338:	80 93 f6 03 	sts	0x03F6, r24	; 0x8003f6 <custom_message_state>
        mesh_point++;
        lcd_update(1);
   1233c:	81 e0       	ldi	r24, 0x01	; 1
   1233e:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   12342:	0c ce       	rjmp	.-1000   	; 0x11f5c <gcode_G80()+0x434>
}

#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 <gcode_G80()+0x7d4>
            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 <Sound_MakeSound(eSOUND_TYPE)>
            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 <lang_get_translation>
   12366:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
#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 <lcd_wait_for_click_delay(unsigned int)>
            calibrate_z_auto();           // Z-leveling (X-assembly stay up!!!)
   12372:	0e 94 d6 72 	call	0xe5ac	; 0xe5ac <calibrate_z_auto()>
#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 <enable_z_endstop(bool)>
   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 <raise_z(float)>
            enable_z_endstop(true);
   1238a:	81 e0       	ldi	r24, 0x01	; 1
   1238c:	0f 94 a3 4e 	call	0x29d46	; 0x29d46 <enable_z_endstop(bool)>
#ifdef TMC2130
            tmc2130_home_enter(Z_AXIS_MASK);
   12390:	84 e0       	ldi	r24, 0x04	; 4
   12392:	0f 94 b4 26 	call	0x24d68	; 0x24d68 <tmc2130_home_enter(unsigned char)>
#endif // TMC2130
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   12396:	c0 92 99 06 	sts	0x0699, r12	; 0x800699 <current_position+0x8>
   1239a:	d0 92 9a 06 	sts	0x069A, r13	; 0x80069a <current_position+0x9>
   1239e:	e0 92 9b 06 	sts	0x069B, r14	; 0x80069b <current_position+0xa>
   123a2:	f0 92 9c 06 	sts	0x069C, r15	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   123b2:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
#ifdef TMC2130
            tmc2130_home_exit();
   123b6:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
#endif // TMC2130
            enable_z_endstop(bState);
   123ba:	81 2f       	mov	r24, r17
   123bc:	0f 94 a3 4e 	call	0x29d46	; 0x29d46 <enable_z_endstop(bool)>
        } 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 <st_get_position_mm(unsigned char)>
   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 <gcode_G80()+0x836>

        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_type>
        custom_message_state = custom_message_state_old;
   123dc:	f8 85       	ldd	r31, Y+8	; 0x08
   123de:	f0 93 f6 03 	sts	0x03F6, r31	; 0x8003f6 <custom_message_state>
        lcd_update_enable(true);           // display / status-line recovery
   123e2:	81 e0       	ldi	r24, 0x01	; 1
   123e4:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
        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 <gcode_G28(bool, bool, bool)>
   123f2:	81 e0       	ldi	r24, 0x01	; 1
   123f4:	80 93 a1 10 	sts	0x10A1, r24	; 0x8010a1 <cmdbuffer_front_already_processed>
   123f8:	ce cb       	rjmp	.-2148   	; 0x11b96 <gcode_G80()+0x6e>
        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 <gcode_G80()::g80_fail_cnt>

    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 <clean_up_after_endstop_move(int) [clone .lto_priv.393]>
    }
}

void babystep_apply()
{
    babystep_load();
   12406:	0f 94 79 c9 	call	0x392f2	; 0x392f2 <babystep_load()>
    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 <cs+0xc>
   12424:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   12428:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   1242c:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   12430:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
   12434:	0f 94 95 c9 	call	0x3932a	; 0x3932a <shift_z(float) [clone .lto_priv.562]>
    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 <eeprom_read_byte>
   12440:	91 e0       	ldi	r25, 0x01	; 1
   12442:	81 30       	cpi	r24, 0x01	; 1
   12444:	09 f0       	breq	.+2      	; 0x12448 <gcode_G80()+0x920>
   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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   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 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   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 <gcode_G80()+0x9a4>
   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 <gcode_G80()+0x996>
                + 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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]>

    { // 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 <code_seen(char) [clone .lto_priv.549]>
   1253a:	88 23       	and	r24, r24
   1253c:	09 f4       	brne	.+2      	; 0x12540 <gcode_G80()+0xa18>
   1253e:	84 c0       	rjmp	.+264    	; 0x12648 <gcode_G80()+0xb20>
   12540:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
        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 <gcode_G80()+0xa24>
   1254a:	94 c0       	rjmp	.+296    	; 0x12674 <gcode_G80()+0xb4c>
   1254c:	88 23       	and	r24, r24
   1254e:	09 f4       	brne	.+2      	; 0x12552 <gcode_G80()+0xa2a>
   12550:	91 c0       	rjmp	.+290    	; 0x12674 <gcode_G80()+0xb4c>
   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 <mbl_point_measurement_valid(unsigned char, unsigned char)>
   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 <gcode_G80()+0xb2e>

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 <mbl_point_measurement_valid(unsigned char, unsigned char)>
}

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 <gcode_G80()+0xa86>
   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 <mbl_point_measurement_valid(unsigned char, unsigned char)>
   125b6:	88 23       	and	r24, r24
   125b8:	69 f0       	breq	.+26     	; 0x125d4 <gcode_G80()+0xaac>
   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 <mbl_point_measurement_valid(unsigned char, unsigned char)>
   125dc:	88 23       	and	r24, r24
   125de:	61 f0       	breq	.+24     	; 0x125f8 <gcode_G80()+0xad0>
   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 <mbl_point_measurement_valid(unsigned char, unsigned char)>
   12602:	88 23       	and	r24, r24
   12604:	31 f1       	breq	.+76     	; 0x12652 <gcode_G80()+0xb2a>
   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 <gcode_G80()+0xb2e>
    }

    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 <eeprom_read_byte>
   12650:	79 cf       	rjmp	.-270    	; 0x12544 <gcode_G80()+0xa1c>
   12652:	71 10       	cpse	r7, r1
   12654:	e5 cf       	rjmp	.-54     	; 0x12620 <gcode_G80()+0xaf8>
		//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 <gcode_G80()+0xa40>
   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 <gcode_G80()+0xa2e>
        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 <mbl>

    if (code_seen('O') && !code_value_uint8()) {
   1267a:	8f e4       	ldi	r24, 0x4F	; 79
   1267c:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   12680:	81 11       	cpse	r24, r1
   12682:	03 c0       	rjmp	.+6      	; 0x1268a <gcode_G80()+0xb62>
        // 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 <go_home_with_z_lift()>
   12688:	9b cc       	rjmp	.-1738   	; 0x11fc0 <gcode_G80()+0x498>
        }
    }

    mbl.active = 1; //activate mesh bed leveling

    if (code_seen('O') && !code_value_uint8()) {
   1268a:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   1268e:	81 11       	cpse	r24, r1
   12690:	f9 cf       	rjmp	.-14     	; 0x12684 <gcode_G80()+0xb5c>
        // Don't let the manage_inactivity() function remove power from the motors.
        refresh_cmd_timeout();
   12692:	0e 94 5b 66 	call	0xccb6	; 0xccb6 <refresh_cmd_timeout()>
   12696:	94 cc       	rjmp	.-1752   	; 0x11fc0 <gcode_G80()+0x498>

00012698 <Config_RetrieveSettings()>:

//! @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<uint8_t*>(cs.version), reinterpret_cast<uint8_t*>(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 <eeprom_read_block>
    //  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 <strncmp_P>
   126da:	89 2b       	or	r24, r25
   126dc:	09 f0       	breq	.+2      	; 0x126e0 <Config_RetrieveSettings()+0x48>
   126de:	9f c1       	rjmp	.+830    	; 0x12a1e <Config_RetrieveSettings()+0x386>
    {
        // 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(float*, float)>
        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_float(float*, float)>
        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_byte(unsigned char*, unsigned char)>
        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(unsigned int*, unsigned int)>
        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 <eeprom_init_default_word(unsigned int*, unsigned int)>

        // 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 <eeprom_init_default_float(float*, float)>

        // 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(void*, unsigned int, void const*)>
        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 <eeprom_init_default_block(void*, unsigned int, void const*)>

#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 <eeprom_init_default_block(void*, unsigned int, void const*)>
#endif // TMC2130

        // load the CS to RAM
        eeprom_read_block(reinterpret_cast<uint8_t*>(&cs), reinterpret_cast<uint8_t*>(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 <eeprom_read_block>
        calculate_extruder_multipliers();
   1278a:	0e 94 51 65 	call	0xcaa2	; 0xcaa2 <calculate_extruder_multipliers()>
   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 <Config_RetrieveSettings()+0x146>
        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 <Config_RetrieveSettings()+0x176>
        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 <Config_RetrieveSettings()+0x194>
        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 <Config_RetrieveSettings()+0x1b2>
        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<uint8_t*>(&cs), reinterpret_cast<uint8_t*>(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 <Config_RetrieveSettings()+0x1c0>
   12856:	ad cf       	rjmp	.-166    	; 0x127b2 <Config_RetrieveSettings()+0x11a>
        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 <cs+0xbc>
   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(unsigned char, unsigned int)>
    tmc2130_set_res(Y_AXIS, cs.axis_ustep_resolution[Y_AXIS]);
   12864:	60 91 7a 0e 	lds	r22, 0x0E7A	; 0x800e7a <cs+0xbd>
   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(unsigned char, unsigned int)>
    tmc2130_set_res(Z_AXIS, cs.axis_ustep_resolution[Z_AXIS]);
   12870:	60 91 7b 0e 	lds	r22, 0x0E7B	; 0x800e7b <cs+0xbe>
   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(unsigned char, unsigned int)>
    tmc2130_set_res(E_AXIS, cs.axis_ustep_resolution[E_AXIS]);
   1287c:	60 91 7c 0e 	lds	r22, 0x0E7C	; 0x800e7c <cs+0xbf>
   12880:	70 e0       	ldi	r23, 0x00	; 0
   12882:	83 e0       	ldi	r24, 0x03	; 3
   12884:	0f 94 d6 25 	call	0x24bac	; 0x24bac <tmc2130_set_res(unsigned char, unsigned int)>
#endif //TMC2130

		reset_acceleration_rates();
   12888:	0f 94 56 64 	call	0x2c8ac	; 0x2c8ac <reset_acceleration_rates()>

    // Call updatePID (similar to when we have processed M301)
    updatePID();
   1288c:	0f 94 ab 3b 	call	0x27756	; 0x27756 <updatePID()>
}

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 <TempMgrGuard::TempMgrGuard()>

    // 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*, float)>
    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*, float)>
    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_float(float*, float)>
    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_word(unsigned int*, unsigned int)>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>

    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 <eeprom_read_byte>
   128e4:	91 e0       	ldi	r25, 0x01	; 1
   128e6:	81 11       	cpse	r24, r1
   128e8:	01 c0       	rjmp	.+2      	; 0x128ec <Config_RetrieveSettings()+0x254>
   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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <eeprom_read_word>
   12970:	0f 94 5e 2f 	call	0x25ebc	; 0x25ebc <thermal_model_set_lag(unsigned int) [clone .lto_priv.556]>
    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 <eeprom_read_block>
    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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <thermal_model::calibrated() [clone .lto_priv.563]>
   129d0:	81 11       	cpse	r24, r1
   129d2:	06 c0       	rjmp	.+12     	; 0x129e0 <Config_RetrieveSettings()+0x348>
        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 <serialprintlnPGM(char const*)>
        thermal_model_reset_settings();
   129dc:	0f 94 84 32 	call	0x26508	; 0x26508 <thermal_model_reset_settings()>
    }
    thermal_model::setup();
   129e0:	0f 94 e5 2f 	call	0x25fca	; 0x25fca <thermal_model::setup() [clone .lto_priv.555]>
}

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 <TempMgrGuard::~TempMgrGuard()>
#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 <serialprintPGM(char const*)>
        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 <serialprintlnPGM(char const*)>
   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 <Config_ResetDefault()>
        //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 <eeprom_is_initialized_block(void const*, unsigned int)>
   12a2e:	91 e0       	ldi	r25, 0x01	; 1
   12a30:	89 27       	eor	r24, r25
   12a32:	e5 cf       	rjmp	.-54     	; 0x129fe <Config_RetrieveSettings()+0x366>

00012a34 <process_commands() [clone .part.46]>:
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 <busy_state>
        - 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 <bufindr>
   12a74:	b0 90 92 12 	lds	r11, 0x1292	; 0x801292 <bufindr+0x1>
   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 <strncmp_P>
   12a8c:	89 2b       	or	r24, r25
   12a8e:	09 f0       	breq	.+2      	; 0x12a92 <process_commands() [clone .part.46]+0x5e>
   12a90:	b8 c0       	rjmp	.+368    	; 0x12c02 <process_commands() [clone .part.46]+0x1ce>
	{

    // ### 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12a9a:	88 23       	and	r24, r24
   12a9c:	09 f4       	brne	.+2      	; 0x12aa0 <process_commands() [clone .part.46]+0x6c>
   12a9e:	91 c0       	rjmp	.+290    	; 0x12bc2 <process_commands() [clone .part.46]+0x18e>
	  {
		  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 <code_seen(char) [clone .lto_priv.549]>
   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 <code_seen(char) [clone .lto_priv.549]>
   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 <st_synchronize()>
	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 <process_commands() [clone .part.46]+0x8e>

    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 <Timer<unsigned long>::expired(unsigned long)>
   12ad8:	81 11       	cpse	r24, r1
        crashDet_counter = 0;
   12ada:	10 92 72 03 	sts	0x0372, r1	; 0x800372 <crashdet_detected(unsigned char)::crashDet_counter>
    }
    if(++crashDet_counter >= CRASHDET_COUNTER_MAX) {
   12ade:	00 91 72 03 	lds	r16, 0x0372	; 0x800372 <crashdet_detected(unsigned char)::crashDet_counter>
   12ae2:	0f 5f       	subi	r16, 0xFF	; 255
   12ae4:	00 93 72 03 	sts	0x0372, r16	; 0x800372 <crashdet_detected(unsigned char)::crashDet_counter>
        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 <Timer<unsigned long>::start()>
    crashDet_axes |= mask;
   12af0:	80 91 71 03 	lds	r24, 0x0371	; 0x800371 <crashdet_detected(unsigned char)::crashDet_axes>
   12af4:	81 2b       	or	r24, r17
   12af6:	80 93 71 03 	sts	0x0371, r24	; 0x800371 <crashdet_detected(unsigned char)::crashDet_axes>

	if (mask & X_AXIS_MASK) {
   12afa:	10 ff       	sbrs	r17, 0
   12afc:	08 c0       	rjmp	.+16     	; 0x12b0e <process_commands() [clone .part.46]+0xda>
		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_byte(unsigned char*)>
		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 <eeprom_increment_word(unsigned int*)>
	}
	if (mask & Y_AXIS_MASK) {
   12b0e:	11 ff       	sbrs	r17, 1
   12b10:	08 c0       	rjmp	.+16     	; 0x12b22 <process_commands() [clone .part.46]+0xee>
		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_byte(unsigned char*)>
		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 <eeprom_increment_word(unsigned int*)>
	}

    lcd_update_enable(true);
   12b22:	81 e0       	ldi	r24, 0x01	; 1
   12b24:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
    lcd_update(2);
   12b28:	82 e0       	ldi	r24, 0x02	; 2
   12b2a:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
    // 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 <crashdet_fmt_error(char*, unsigned char)>
    lcd_setstatus(msg);
   12b38:	ce 01       	movw	r24, r28
   12b3a:	01 96       	adiw	r24, 0x01	; 1
   12b3c:	0e 94 42 f5 	call	0x1ea84	; 0x1ea84 <lcd_setstatus(char const*)>

	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 <gcode_G28(bool, bool, bool)>

	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 <process_commands() [clone .part.46]+0x178>
   12b54:	10 92 b6 0d 	sts	0x0DB6, r1	; 0x800db6 <target_temperature+0x1>
   12b58:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
		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_update_enable(unsigned char)>
        lcd_clear();
   12b62:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
        crashdet_fmt_error(msg, crashDet_axes);
   12b66:	60 91 71 03 	lds	r22, 0x0371	; 0x800371 <crashdet_detected(unsigned char)::crashDet_axes>
   12b6a:	ce 01       	movw	r24, r28
   12b6c:	01 96       	adiw	r24, 0x01	; 1
   12b6e:	0e 94 a1 73 	call	0xe742	; 0xe742 <crashdet_fmt_error(char*, unsigned char)>
        crashDet_axes = 0;
   12b72:	10 92 71 03 	sts	0x0371, r1	; 0x800371 <crashdet_detected(unsigned char)::crashDet_axes>
        lcd_print(msg);
   12b76:	ce 01       	movw	r24, r28
   12b78:	01 96       	adiw	r24, 0x01	; 1
   12b7a:	0e 94 7f 70 	call	0xe0fe	; 0xe0fe <lcd_print(char const*)>

        // 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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
        lcd_putc('?');
   12b90:	8f e3       	ldi	r24, 0x3F	; 63
   12b92:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
//! @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 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
        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 <process_commands() [clone .part.46]+0x188>
		{
			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 <enquecommand(char const*, bool)>
    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 <busy_state>
  ClearToSend();
   12bb6:	0e 94 c2 7e 	call	0xfd84	; 0xfd84 <ClearToSend()>
   12bba:	5e c3       	rjmp	.+1724   	; 0x13278 <process_commands() [clone .part.46]+0x844>
		{
			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 <process_commands() [clone .part.46]+0x178>
		  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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12bca:	88 23       	and	r24, r24
   12bcc:	69 f0       	breq	.+26     	; 0x12be8 <process_commands() [clone .part.46]+0x1b4>
	}
}

void crashdet_recover()
{
	if (!printingIsPaused()) crashdet_restore_print_and_continue();
   12bce:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   12bd2:	81 11       	cpse	r24, r1
   12bd4:	06 c0       	rjmp	.+12     	; 0x12be2 <process_commands() [clone .part.46]+0x1ae>
	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 <restore_print_from_ram_and_continue(float)>
}

void crashdet_recover()
{
	if (!printingIsPaused()) crashdet_restore_print_and_continue();
	crashdet_use_eeprom_setting();
   12be2:	0f 94 31 27 	call	0x24e62	; 0x24e62 <crashdet_use_eeprom_setting()>
   12be6:	e4 cf       	rjmp	.-56     	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
	  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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12bf0:	88 23       	and	r24, r24
   12bf2:	f1 f2       	breq	.-68     	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
}

/// Crash detection cancels the print
void crashdet_cancel() {
    // Restore crash detection
    crashdet_use_eeprom_setting();
   12bf4:	0f 94 31 27 	call	0x24e62	; 0x24e62 <crashdet_use_eeprom_setting()>

    // 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 <print_stop(bool, bool)>
   12c00:	d7 cf       	rjmp	.-82     	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    // ### 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 <strncmp_P>
   12c10:	89 2b       	or	r24, r25
   12c12:	09 f0       	breq	.+2      	; 0x12c16 <process_commands() [clone .part.46]+0x1e2>
   12c14:	fc c0       	rjmp	.+504    	; 0x12e0e <process_commands() [clone .part.46]+0x3da>
	{

    // ### 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 <strncmp_P>
   12c2a:	89 2b       	or	r24, r25
   12c2c:	c9 f4       	brne	.+50     	; 0x12c60 <process_commands() [clone .part.46]+0x22c>
		{
			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 <process_commands() [clone .part.46]+0x228>
   12c3a:	18 55       	subi	r17, 0x58	; 88
			if (axis < 4)
   12c3c:	14 30       	cpi	r17, 0x04	; 4
   12c3e:	08 f0       	brcs	.+2      	; 0x12c42 <process_commands() [clone .part.46]+0x20e>
   12c40:	b7 cf       	rjmp	.-146    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
			{
				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 <strtol>
				tmc2130_set_wave(axis, 247, fac);
   12c54:	81 2f       	mov	r24, r17
   12c56:	0f 94 80 88 	call	0x31100	; 0x31100 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]>
   12c5a:	aa cf       	rjmp	.-172    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    // ### 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 <process_commands() [clone .part.46]+0x20e>
			}
		}

    // ### 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 <strncmp_P>
   12c6e:	89 2b       	or	r24, r25
   12c70:	51 f5       	brne	.+84     	; 0x12cc6 <process_commands() [clone .part.46]+0x292>
		{
			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 <process_commands() [clone .part.46]+0x28e>
   12c7e:	18 55       	subi	r17, 0x58	; 88
			if (axis < 4)
   12c80:	14 30       	cpi	r17, 0x04	; 4
   12c82:	08 f0       	brcs	.+2      	; 0x12c86 <process_commands() [clone .part.46]+0x252>
   12c84:	95 cf       	rjmp	.-214    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
			{
				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 <strtol>
   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 <process_commands() [clone .part.46]+0x278>
   12ca8:	56 95       	lsr	r21
   12caa:	47 95       	ror	r20
   12cac:	8a 95       	dec	r24
   12cae:	e2 f7       	brpl	.-8      	; 0x12ca8 <process_commands() [clone .part.46]+0x274>
				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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]>
   12cc0:	77 cf       	rjmp	.-274    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    // ### 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 <process_commands() [clone .part.46]+0x252>
			}
		}

    // ### 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 <strncmp_P>
   12cd4:	89 2b       	or	r24, r25
   12cd6:	09 f0       	breq	.+2      	; 0x12cda <process_commands() [clone .part.46]+0x2a6>
   12cd8:	6b cf       	rjmp	.-298    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
		{
			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 <process_commands() [clone .part.46]+0x2b4>
   12ce6:	90 c0       	rjmp	.+288    	; 0x12e08 <process_commands() [clone .part.46]+0x3d4>
   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 <process_commands() [clone .part.46]+0x2c2>
   12cf4:	5d cf       	rjmp	.-326    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
			{
				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 <process_commands() [clone .part.46]+0x38c>
				{
					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 <strtol>
   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 <process_commands() [clone .part.46]+0x38c>
   12d62:	fc 01       	movw	r30, r24
   12d64:	20 81       	ld	r18, Z
   12d66:	22 23       	and	r18, r18
   12d68:	59 f1       	breq	.+86     	; 0x12dc0 <process_commands() [clone .part.46]+0x38c>
					{
						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 <strtol>
   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 <process_commands() [clone .part.46]+0x38c>
   12d84:	dc 01       	movw	r26, r24
   12d86:	2c 91       	ld	r18, X
   12d88:	22 23       	and	r18, r18
   12d8a:	d1 f0       	breq	.+52     	; 0x12dc0 <process_commands() [clone .part.46]+0x38c>
						{
							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 <strtol>
   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 <process_commands() [clone .part.46]+0x38c>
   12da6:	fc 01       	movw	r30, r24
   12da8:	20 81       	ld	r18, Z
   12daa:	22 23       	and	r18, r18
   12dac:	49 f0       	breq	.+18     	; 0x12dc0 <process_commands() [clone .part.46]+0x38c>
								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 <strtol>
   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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
   12e06:	d4 ce       	rjmp	.-600    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    // ### 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 <process_commands() [clone .part.46]+0x2c2>
		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 <strncmp_P>
   12e1c:	89 2b       	or	r24, r25
   12e1e:	09 f0       	breq	.+2      	; 0x12e22 <process_commands() [clone .part.46]+0x3ee>
   12e20:	64 c1       	rjmp	.+712    	; 0x130ea <process_commands() [clone .part.46]+0x6b6>
      - `nozzle D<diameter>` - 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12e2a:	88 23       	and	r24, r24
   12e2c:	09 f4       	brne	.+2      	; 0x12e30 <process_commands() [clone .part.46]+0x3fc>
   12e2e:	3c c0       	rjmp	.+120    	; 0x12ea8 <process_commands() [clone .part.46]+0x474>
//! 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 <fan_measuring>
   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 <delay2>
		unsigned long tachMeasure = _micros();
   12e4c:	0f 94 09 28 	call	0x25012	; 0x25012 <micros2>
   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 <process_commands() [clone .part.46]+0x424>
		sei();
   12e5c:	78 94       	sei
		tachMeasure = _micros() - tachMeasure;
   12e5e:	0f 94 09 28 	call	0x25012	; 0x25012 <micros2>
   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 <process_commands() [clone .part.46]+0x448>
   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 <process_commands() [clone .part.46]+0x408>
		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 <serialprintPGM(char const*)>
	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 <process_commands() [clone .part.46]+0x46a>
		// 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 <serialprintlnPGM(char const*)>
    }
	// 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 <process_commands() [clone .part.46]+0x17c>
    */

        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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12eb0:	88 23       	and	r24, r24
   12eb2:	21 f1       	breq	.+72     	; 0x12efc <process_commands() [clone .part.46]+0x4c8>
            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 <fan_speed+0x2>
   12eb8:	50 91 ca 03 	lds	r21, 0x03CA	; 0x8003ca <fan_speed+0x3>
   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 <fan_speed>
   12ed0:	50 91 c8 03 	lds	r21, 0x03C8	; 0x8003c8 <fan_speed+0x1>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x17c>
        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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12f04:	88 23       	and	r24, r24
   12f06:	11 f1       	breq	.+68     	; 0x12f4c <process_commands() [clone .part.46]+0x518>
            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 <eeprom_read_byte>
   12f10:	81 11       	cpse	r24, r1
   12f12:	10 c0       	rjmp	.+32     	; 0x12f34 <process_commands() [clone .part.46]+0x500>
                // 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 <enquecommand(char const*, bool)>
        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 <eeprom_update_byte>
   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 <eeprom_update_byte>
   12f32:	3e ce       	rjmp	.-900    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>

                // 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 <process_commands() [clone .part.46]+0x506>
   12f38:	3b ce       	rjmp	.-906    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
                // 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 <Stopwatch::start()>
                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 <Timer<unsigned short>::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 <lcd_pause_print()>
   12f4a:	32 ce       	rjmp	.-924    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            }
        } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12f54:	88 23       	and	r24, r24
   12f56:	21 f0       	breq	.+8      	; 0x12f60 <process_commands() [clone .part.46]+0x52c>
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   12f58:	80 e0       	ldi	r24, 0x00	; 0
   12f5a:	0f 94 58 10 	call	0x220b0	; 0x220b0 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.48]>
   12f5e:	28 ce       	rjmp	.-944    	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12f68:	88 23       	and	r24, r24
   12f6a:	51 f0       	breq	.+20     	; 0x12f80 <process_commands() [clone .part.46]+0x54c>
#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 <softReset>
        } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12f88:	88 23       	and	r24, r24
   12f8a:	a9 f0       	breq	.+42     	; 0x12fb6 <process_commands() [clone .part.46]+0x582>
            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 <eeprom_read_block>
            if (SN[19])
   12f9c:	8c 89       	ldd	r24, Y+20	; 0x14
   12f9e:	88 23       	and	r24, r24
   12fa0:	29 f0       	breq	.+10     	; 0x12fac <process_commands() [clone .part.46]+0x578>
                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 <puts_P>
   12faa:	02 ce       	rjmp	.-1020   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            else
                puts(SN);
   12fac:	ce 01       	movw	r24, r28
   12fae:	01 96       	adiw	r24, 0x01	; 1
   12fb0:	0f 94 9f e2 	call	0x3c53e	; 0x3c53e <puts>
   12fb4:	fd cd       	rjmp	.-1030   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
        } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12fbe:	88 23       	and	r24, r24
   12fc0:	29 f0       	breq	.+10     	; 0x12fcc <process_commands() [clone .part.46]+0x598>

            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 <serialprintlnPGM(char const*)>
   12fca:	f2 cd       	rjmp	.-1052   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
                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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12fd4:	88 23       	and	r24, r24
   12fd6:	19 f0       	breq	.+6      	; 0x12fde <process_commands() [clone .part.46]+0x5aa>

      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 <process_commands() [clone .part.46]+0x592>

    } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12fe6:	88 23       	and	r24, r24
   12fe8:	19 f0       	breq	.+6      	; 0x12ff0 <process_commands() [clone .part.46]+0x5bc>
	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 <lang_reset>
   12fee:	e0 cd       	rjmp	.-1088   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
      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 <code_seen_P(char const*) [clone .lto_priv.437]>
   12ff8:	88 23       	and	r24, r24
   12ffa:	79 f0       	breq	.+30     	; 0x1301a <process_commands() [clone .part.46]+0x5e6>
      eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_byte>
   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 <eeprom_update_word>
   13018:	cb cd       	rjmp	.-1130   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>

    } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   13022:	88 23       	and	r24, r24
   13024:	51 f0       	breq	.+20     	; 0x1303a <process_commands() [clone .part.46]+0x606>
// 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 <lcd_clear()>
	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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
   13038:	d8 cf       	rjmp	.-80     	; 0x12fea <process_commands() [clone .part.46]+0x5b6>
      eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <code_seen_P(char const*) [clone .lto_priv.437]>
   13042:	88 23       	and	r24, r24
   13044:	e1 f0       	breq	.+56     	; 0x1307e <process_commands() [clone .part.46]+0x64a>
        // 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 <code_seen(char) [clone .lto_priv.549]>
   1304c:	88 23       	and	r24, r24
   1304e:	09 f4       	brne	.+2      	; 0x13052 <process_commands() [clone .part.46]+0x61e>
   13050:	af cd       	rjmp	.-1186   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            bool value = code_value_short();
   13052:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   13056:	11 e0       	ldi	r17, 0x01	; 1
   13058:	89 2b       	or	r24, r25
   1305a:	09 f4       	brne	.+2      	; 0x1305e <process_commands() [clone .part.46]+0x62a>
   1305c:	10 e0       	ldi	r17, 0x00	; 0
            st_synchronize();
   1305e:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            if(value != mbl.active) {
   13062:	80 91 c1 13 	lds	r24, 0x13C1	; 0x8013c1 <mbl>
   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 <process_commands() [clone .part.46]+0x63c>
   1306e:	a0 cd       	rjmp	.-1216   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
                mbl.active = value;
   13070:	10 93 c1 13 	sts	0x13C1, r17	; 0x8013c1 <mbl>
                // 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 <plan_set_z_position(float const&)>
   1307c:	99 cd       	rjmp	.-1230   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            }
        }
    } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
   13086:	88 23       	and	r24, r24
   13088:	09 f4       	brne	.+2      	; 0x1308c <process_commands() [clone .part.46]+0x658>
   1308a:	92 cd       	rjmp	.-1244   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            uint16_t nDiameter;
            if(code_seen('D')) {
   1308c:	84 e4       	ldi	r24, 0x44	; 68
   1308e:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   13092:	88 23       	and	r24, r24
   13094:	a1 f0       	breq	.+40     	; 0x130be <process_commands() [clone .part.46]+0x68a>
                nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
   13096:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <nozzle_diameter_check(unsigned int)>
   130bc:	79 cd       	rjmp	.-1294   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            } 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 <code_seen_P(char const*) [clone .lto_priv.437]>
                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 <eeprom_read_word>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>
   130e8:	63 cd       	rjmp	.-1338   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    }
  }
  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 <process_commands() [clone .part.46]+0x6c2>
   130f2:	0c 94 10 a4 	jmp	0x14820	; 0x14820 <process_commands() [clone .part.46]+0x1dec>
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
   130f6:	10 93 94 03 	sts	0x0394, r17	; 0x800394 <strchr_pointer+0x1>
   130fa:	00 93 93 03 	sts	0x0393, r16	; 0x800393 <strchr_pointer>
	gcode_in_progress = code_value_short();
   130fe:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   13102:	90 93 92 03 	sts	0x0392, r25	; 0x800392 <gcode_in_progress+0x1>
   13106:	80 93 91 03 	sts	0x0391, r24	; 0x800391 <gcode_in_progress>
//	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 <process_commands() [clone .part.46]+0x6de>
   13110:	da c6       	rjmp	.+3508   	; 0x13ec6 <process_commands() [clone .part.46]+0x1492>
   13112:	0c f0       	brlt	.+2      	; 0x13116 <process_commands() [clone .part.46]+0x6e2>
   13114:	45 c1       	rjmp	.+650    	; 0x133a0 <process_commands() [clone .part.46]+0x96c>
   13116:	84 30       	cpi	r24, 0x04	; 4
   13118:	91 05       	cpc	r25, r1
   1311a:	09 f4       	brne	.+2      	; 0x1311e <process_commands() [clone .part.46]+0x6ea>
   1311c:	7e c6       	rjmp	.+3324   	; 0x13e1a <process_commands() [clone .part.46]+0x13e6>
   1311e:	0c f0       	brlt	.+2      	; 0x13122 <process_commands() [clone .part.46]+0x6ee>
   13120:	c5 c0       	rjmp	.+394    	; 0x132ac <process_commands() [clone .part.46]+0x878>
   13122:	97 fd       	sbrc	r25, 7
   13124:	cb c0       	rjmp	.+406    	; 0x132bc <process_commands() [clone .part.46]+0x888>
   13126:	02 97       	sbiw	r24, 0x02	; 2
   13128:	0c f0       	brlt	.+2      	; 0x1312c <process_commands() [clone .part.46]+0x6f8>
   1312a:	fc c1       	rjmp	.+1016   	; 0x13524 <process_commands() [clone .part.46]+0xaf0>

    */
    case 0: // G0 -> G1
    case 1: // G1
        {
        uint16_t start_segment_idx = restore_interrupted_gcode();
   1312c:	0e 94 0b 5a 	call	0xb416	; 0xb416 <restore_interrupted_gcode()>
   13130:	8c 01       	movw	r16, r24
        get_coordinates(); // For X Y Z E F
   13132:	0e 94 5c 61 	call	0xc2b8	; 0xc2b8 <get_coordinates()>

		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 <total_filament_used>
   1313a:	70 91 65 06 	lds	r23, 0x0665	; 0x800665 <total_filament_used+0x1>
   1313e:	80 91 66 06 	lds	r24, 0x0666	; 0x800666 <total_filament_used+0x2>
   13142:	90 91 67 06 	lds	r25, 0x0667	; 0x800667 <total_filament_used+0x3>
   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 <current_position+0xc>
   13152:	50 90 9e 06 	lds	r5, 0x069E	; 0x80069e <current_position+0xd>
   13156:	60 90 9f 06 	lds	r6, 0x069F	; 0x80069f <current_position+0xe>
   1315a:	70 90 a0 06 	lds	r7, 0x06A0	; 0x8006a0 <current_position+0xf>
   1315e:	80 90 7f 06 	lds	r8, 0x067F	; 0x80067f <destination+0xc>
   13162:	90 90 80 06 	lds	r9, 0x0680	; 0x800680 <destination+0xd>
   13166:	a0 90 81 06 	lds	r10, 0x0681	; 0x800681 <destination+0xe>
   1316a:	b0 90 82 06 	lds	r11, 0x0682	; 0x800682 <destination+0xf>
   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 <process_commands() [clone .part.46]+0x796>
			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 <total_filament_used>
   131be:	70 93 65 06 	sts	0x0665, r23	; 0x800665 <total_filament_used+0x1>
   131c2:	80 93 66 06 	sts	0x0666, r24	; 0x800666 <total_filament_used+0x2>
   131c6:	90 93 67 06 	sts	0x0667, r25	; 0x800667 <total_filament_used+0x3>
		}

#ifdef FWRETRACT
        if(cs.autoretract_enabled) {
   131ca:	80 91 3f 0e 	lds	r24, 0x0E3F	; 0x800e3f <cs+0x82>
   131ce:	88 23       	and	r24, r24
   131d0:	09 f4       	brne	.+2      	; 0x131d4 <process_commands() [clone .part.46]+0x7a0>
   131d2:	a4 c1       	rjmp	.+840    	; 0x1351c <process_commands() [clone .part.46]+0xae8>
            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 <code_seen(char) [clone .lto_priv.549]>
   131da:	81 11       	cpse	r24, r1
   131dc:	9f c1       	rjmp	.+830    	; 0x1351c <process_commands() [clone .part.46]+0xae8>
   131de:	89 e5       	ldi	r24, 0x59	; 89
   131e0:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   131e4:	81 11       	cpse	r24, r1
   131e6:	9a c1       	rjmp	.+820    	; 0x1351c <process_commands() [clone .part.46]+0xae8>
   131e8:	8a e5       	ldi	r24, 0x5A	; 90
   131ea:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   131ee:	81 11       	cpse	r24, r1
   131f0:	95 c1       	rjmp	.+810    	; 0x1351c <process_commands() [clone .part.46]+0xae8>
   131f2:	85 e4       	ldi	r24, 0x45	; 69
   131f4:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   131f8:	88 23       	and	r24, r24
   131fa:	09 f4       	brne	.+2      	; 0x131fe <process_commands() [clone .part.46]+0x7ca>
   131fc:	8f c1       	rjmp	.+798    	; 0x1351c <process_commands() [clone .part.46]+0xae8>
                float echange=destination[E_AXIS]-current_position[E_AXIS];
   131fe:	20 91 9d 06 	lds	r18, 0x069D	; 0x80069d <current_position+0xc>
   13202:	30 91 9e 06 	lds	r19, 0x069E	; 0x80069e <current_position+0xd>
   13206:	40 91 9f 06 	lds	r20, 0x069F	; 0x80069f <current_position+0xe>
   1320a:	50 91 a0 06 	lds	r21, 0x06A0	; 0x8006a0 <current_position+0xf>
   1320e:	60 91 7f 06 	lds	r22, 0x067F	; 0x80067f <destination+0xc>
   13212:	70 91 80 06 	lds	r23, 0x0680	; 0x800680 <destination+0xd>
   13216:	80 91 81 06 	lds	r24, 0x0681	; 0x800681 <destination+0xe>
   1321a:	90 91 82 06 	lds	r25, 0x0682	; 0x800682 <destination+0xf>
   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 <process_commands() [clone .part.46]+0xacc>
   13236:	80 91 8d 06 	lds	r24, 0x068D	; 0x80068d <retracted>
   1323a:	81 11       	cpse	r24, r1
   1323c:	0c 94 24 cd 	jmp	0x19a48	; 0x19a48 <process_commands() [clone .part.46]+0x7014>
                    st_synchronize();
   13240:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
                    current_position[E_AXIS] = destination[E_AXIS]; //hide the slicer-generated retract/recover from calculations
   13244:	80 91 7f 06 	lds	r24, 0x067F	; 0x80067f <destination+0xc>
   13248:	90 91 80 06 	lds	r25, 0x0680	; 0x800680 <destination+0xd>
   1324c:	a0 91 81 06 	lds	r26, 0x0681	; 0x800681 <destination+0xe>
   13250:	b0 91 82 06 	lds	r27, 0x0682	; 0x800682 <destination+0xf>
   13254:	80 93 9d 06 	sts	0x069D, r24	; 0x80069d <current_position+0xc>
   13258:	90 93 9e 06 	sts	0x069E, r25	; 0x80069e <current_position+0xd>
   1325c:	a0 93 9f 06 	sts	0x069F, r26	; 0x80069f <current_position+0xe>
   13260:	b0 93 a0 06 	sts	0x06A0, r27	; 0x8006a0 <current_position+0xf>
                    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 <plan_set_e_position(float const&)>
                    retract(!retracted[active_extruder]);
   1326c:	90 91 8d 06 	lds	r25, 0x068D	; 0x80068d <retracted>
   13270:	81 e0       	ldi	r24, 0x01	; 1
   13272:	89 27       	eor	r24, r25
   13274:	0f 94 1c 8a 	call	0x31438	; 0x31438 <retract(bool, bool) [clone .constprop.106]>
    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 <process_commands() [clone .part.46]+0x880>
   132b2:	00 c6       	rjmp	.+3072   	; 0x13eb4 <process_commands() [clone .part.46]+0x1480>
   132b4:	dc f4       	brge	.+54     	; 0x132ec <process_commands() [clone .part.46]+0x8b8>
   132b6:	0a 97       	sbiw	r24, 0x0a	; 10
   132b8:	09 f4       	brne	.+2      	; 0x132bc <process_commands() [clone .part.46]+0x888>
   132ba:	f8 c5       	rjmp	.+3056   	; 0x13eac <process_commands() [clone .part.46]+0x1478>
    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 <bufindr>
   132c0:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0xa02>
  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 <process_commands() [clone .part.46]+0x8c0>
   132f2:	a1 c0       	rjmp	.+322    	; 0x13436 <process_commands() [clone .part.46]+0xa02>
   132f4:	4c 97       	sbiw	r24, 0x1c	; 28
   132f6:	11 f7       	brne	.-60     	; 0x132bc <process_commands() [clone .part.46]+0x888>
    {
      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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x8de>
   1330a:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x8ec>
   1331e:	cc c5       	rjmp	.+2968   	; 0x13eb8 <process_commands() [clone .part.46]+0x1484>
   13320:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x916>
   13342:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   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 <code_seen(char) [clone .lto_priv.549]>
   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 <code_seen(char) [clone .lto_priv.549]>
      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 <gcode_G28(bool, long, bool, long, bool, long, bool, bool)>
#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 <process_commands() [clone .part.46]+0xa02>
   13388:	21 10       	cpse	r2, r1
   1338a:	55 c0       	rjmp	.+170    	; 0x13436 <process_commands() [clone .part.46]+0xa02>
   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 <process_commands() [clone .part.46]+0xa02>
   13396:	d1 10       	cpse	r13, r1
   13398:	4e c0       	rjmp	.+156    	; 0x13436 <process_commands() [clone .part.46]+0xa02>
      - `W` - area width (on X axis)
      - `H` - area height (on Y axis)
    */

	case 80: {
        gcode_G80();
   1339a:	0e 94 94 8d 	call	0x11b28	; 0x11b28 <gcode_G80()>
   1339e:	4b c0       	rjmp	.+150    	; 0x13436 <process_commands() [clone .part.46]+0xa02>
  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 <process_commands() [clone .part.46]+0x976>
   133a6:	0c 94 bf a3 	jmp	0x1477e	; 0x1477e <process_commands() [clone .part.46]+0x1d4a>
   133aa:	b4 f5       	brge	.+108    	; 0x13418 <process_commands() [clone .part.46]+0x9e4>
   133ac:	8c 34       	cpi	r24, 0x4C	; 76
   133ae:	91 05       	cpc	r25, r1
   133b0:	09 f4       	brne	.+2      	; 0x133b4 <process_commands() [clone .part.46]+0x980>
   133b2:	df c5       	rjmp	.+3006   	; 0x13f72 <process_commands() [clone .part.46]+0x153e>
   133b4:	3c f5       	brge	.+78     	; 0x13404 <process_commands() [clone .part.46]+0x9d0>
   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 <process_commands() [clone .part.46]+0x996>
   133c8:	79 cf       	rjmp	.-270    	; 0x132bc <process_commands() [clone .part.46]+0x888>
  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 <temp_comp_interpolation(float)>
   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 <printf_P>
   133ee:	0f 5f       	subi	r16, 0xFF	; 255
   133f0:	1f 4f       	sbci	r17, 0xFF	; 255
  ### G75 - Print temperature interpolation <a href="https://reprap.org/wiki/G-code#G75:_Print_temperature_interpolation">G75: Print temperature interpolation</a>
  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 <process_commands() [clone .part.46]+0x996>
   13402:	19 c0       	rjmp	.+50     	; 0x13436 <process_commands() [clone .part.46]+0xa02>
  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 <process_commands() [clone .part.46]+0x966>
   1340a:	81 35       	cpi	r24, 0x51	; 81
   1340c:	91 05       	cpc	r25, r1
   1340e:	09 f0       	breq	.+2      	; 0x13412 <process_commands() [clone .part.46]+0x9de>
   13410:	55 cf       	rjmp	.-342    	; 0x132bc <process_commands() [clone .part.46]+0x888>
        /*!
        ### G81 - Mesh bed leveling status <a href="https://reprap.org/wiki/G-code#G81:_Mesh_bed_leveling_status">G81: Mesh bed leveling status</a>
        Prints mesh bed leveling status and bed profile if activated.
        */
        case 81: {
            gcode_G81_M420();
   13412:	0e 94 f3 7e 	call	0xfde6	; 0xfde6 <gcode_G81_M420()>
   13416:	0f c0       	rjmp	.+30     	; 0x13436 <process_commands() [clone .part.46]+0xa02>
  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 <process_commands() [clone .part.46]+0x9ee>
   1341e:	0c 94 c9 a3 	jmp	0x14792	; 0x14792 <process_commands() [clone .part.46]+0x1d5e>
   13422:	74 f4       	brge	.+28     	; 0x13440 <process_commands() [clone .part.46]+0xa0c>
   13424:	87 35       	cpi	r24, 0x57	; 87
   13426:	91 05       	cpc	r25, r1
   13428:	11 f4       	brne	.+4      	; 0x1342e <process_commands() [clone .part.46]+0x9fa>
   1342a:	0c 94 c4 a3 	jmp	0x14788	; 0x14788 <process_commands() [clone .part.46]+0x1d54>
   1342e:	88 35       	cpi	r24, 0x58	; 88
   13430:	91 05       	cpc	r25, r1
   13432:	09 f0       	breq	.+2      	; 0x13436 <process_commands() [clone .part.46]+0xa02>
   13434:	43 cf       	rjmp	.-378    	; 0x132bc <process_commands() [clone .part.46]+0x888>
#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 <gcode_in_progress+0x1>
   1343a:	10 92 91 03 	sts	0x0391, r1	; 0x800391 <gcode_in_progress>
   1343e:	b8 cb       	rjmp	.-2192   	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
  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 <process_commands() [clone .part.46]+0xa16>
   13446:	0c 94 d0 a3 	jmp	0x147a0	; 0x147a0 <process_commands() [clone .part.46]+0x1d6c>
   1344a:	8c 35       	cpi	r24, 0x5C	; 92
   1344c:	91 05       	cpc	r25, r1
   1344e:	09 f0       	breq	.+2      	; 0x13452 <process_commands() [clone .part.46]+0xa1e>
   13450:	35 cf       	rjmp	.-406    	; 0x132bc <process_commands() [clone .part.46]+0x888>
   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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0xa64>
            values[i] = code_value();
   13488:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0xa40>
        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 <process_commands() [clone .part.46]+0xa7c>
   134ac:	0c 94 d4 a3 	jmp	0x147a8	; 0x147a8 <process_commands() [clone .part.46]+0x1d74>
   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 <process_commands() [clone .part.46]+0x1d74>
   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 <process_commands() [clone .part.46]+0x1d74>
       (!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 <process_commands() [clone .part.46]+0x1d74>
   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 <process_commands() [clone .part.46]+0x1d74>
    {
        // 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 <current_position+0xc>
   134ec:	10 92 9e 06 	sts	0x069E, r1	; 0x80069e <current_position+0xd>
   134f0:	10 92 9f 06 	sts	0x069F, r1	; 0x80069f <current_position+0xe>
   134f4:	10 92 a0 06 	sts	0x06A0, r1	; 0x8006a0 <current_position+0xf>
  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 <process_commands() [clone .part.46]+0xa02>

#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 <process_commands() [clone .part.46]+0xae8>
   13514:	80 91 8d 06 	lds	r24, 0x068D	; 0x80068d <retracted>
   13518:	81 11       	cpse	r24, r1
   1351a:	92 ce       	rjmp	.-732    	; 0x13240 <process_commands() [clone .part.46]+0x80c>
                }
            }
        }
#endif //FWRETRACT

        prepare_move(start_segment_idx);
   1351c:	c8 01       	movw	r24, r16
   1351e:	0e 94 a0 6b 	call	0xd740	; 0xd740 <prepare_move(unsigned int)>
   13522:	89 cf       	rjmp	.-238    	; 0x13436 <process_commands() [clone .part.46]+0xa02>

    */
    case 2:
    case 3:
    {
        uint16_t start_segment_idx = restore_interrupted_gcode();
   13524:	0e 94 0b 5a 	call	0xb416	; 0xb416 <restore_interrupted_gcode()>
   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 <get_coordinates()>
#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 <code_seen(char) [clone .lto_priv.549]>
   1353a:	88 23       	and	r24, r24
   1353c:	09 f4       	brne	.+2      	; 0x13540 <process_commands() [clone .part.46]+0xb0c>
   1353e:	00 c4       	rjmp	.+2048   	; 0x13d40 <process_commands() [clone .part.46]+0x130c>
   13540:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   13544:	60 93 89 03 	sts	0x0389, r22	; 0x800389 <offset>
   13548:	70 93 8a 03 	sts	0x038A, r23	; 0x80038a <offset+0x1>
   1354c:	80 93 8b 03 	sts	0x038B, r24	; 0x80038b <offset+0x2>
   13550:	90 93 8c 03 	sts	0x038C, r25	; 0x80038c <offset+0x3>
        offset[1] = code_seen('J') ? code_value() : 0.f;
   13554:	8a e4       	ldi	r24, 0x4A	; 74
   13556:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0xb38>
   13564:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   13568:	6b 01       	movw	r12, r22
   1356a:	7c 01       	movw	r14, r24
   1356c:	c0 92 8d 03 	sts	0x038D, r12	; 0x80038d <offset+0x4>
   13570:	d0 92 8e 03 	sts	0x038E, r13	; 0x80038e <offset+0x5>
   13574:	e0 92 8f 03 	sts	0x038F, r14	; 0x80038f <offset+0x6>
   13578:	f0 92 90 03 	sts	0x0390, r15	; 0x800390 <offset+0x7>

        prepare_arc_move((gcode_in_progress == 2), start_segment_idx);
   1357c:	e0 91 91 03 	lds	r30, 0x0391	; 0x800391 <gcode_in_progress>
   13580:	f0 91 92 03 	lds	r31, 0x0392	; 0x800392 <gcode_in_progress+0x1>
   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 <offset>
   13594:	90 90 8a 03 	lds	r9, 0x038A	; 0x80038a <offset+0x1>
   13598:	a0 90 8b 03 	lds	r10, 0x038B	; 0x80038b <offset+0x2>
   1359c:	b0 90 8c 03 	lds	r11, 0x038C	; 0x80038c <offset+0x3>
   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 <hypot>
   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 <feedmultiply>
   135bc:	70 91 3a 02 	lds	r23, 0x023A	; 0x80023a <feedmultiply+0x1>
   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 <feedrate>
   135d0:	30 91 b9 02 	lds	r19, 0x02B9	; 0x8002b9 <feedrate+0x1>
   135d4:	40 91 ba 02 	lds	r20, 0x02BA	; 0x8002ba <feedrate+0x2>
   135d8:	50 91 bb 02 	lds	r21, 0x02BB	; 0x8002bb <feedrate+0x3>
   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 <process_commands() [clone .part.46]+0xbce>

    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 <destination+0x8>
   13692:	70 91 7c 06 	lds	r23, 0x067C	; 0x80067c <destination+0x9>
   13696:	80 91 7d 06 	lds	r24, 0x067D	; 0x80067d <destination+0xa>
   1369a:	90 91 7e 06 	lds	r25, 0x067E	; 0x80067e <destination+0xb>
   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 <destination>
   136b6:	30 91 74 06 	lds	r19, 0x0674	; 0x800674 <destination+0x1>
   136ba:	40 91 75 06 	lds	r20, 0x0675	; 0x800675 <destination+0x2>
   136be:	50 91 76 06 	lds	r21, 0x0676	; 0x800676 <destination+0x3>
   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 <destination+0x4>
   136fa:	90 91 78 06 	lds	r25, 0x0678	; 0x800678 <destination+0x5>
   136fe:	a0 91 79 06 	lds	r26, 0x0679	; 0x800679 <destination+0x6>
   13702:	b0 91 7a 06 	lds	r27, 0x067A	; 0x80067a <destination+0x7>
   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 <cs+0xc4>
   13736:	20 90 82 0e 	lds	r2, 0x0E82	; 0x800e82 <cs+0xc5>
   1373a:	90 91 83 0e 	lds	r25, 0x0E83	; 0x800e83 <cs+0xc6>
   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 <cs+0xc7>
   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 <atan2>
   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 <process_commands() [clone .part.46]+0xdbc>
   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 <cs+0xcd>
   137f4:	70 91 8b 0e 	lds	r23, 0x0E8B	; 0x800e8b <cs+0xce>
   137f8:	61 15       	cp	r22, r1
   137fa:	71 05       	cpc	r23, r1
   137fc:	09 f4       	brne	.+2      	; 0x13800 <process_commands() [clone .part.46]+0xdcc>
   137fe:	a4 c2       	rjmp	.+1352   	; 0x13d48 <process_commands() [clone .part.46]+0x1314>
    {
        // 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 <cs+0xcf>
   13830:	70 91 8d 0e 	lds	r23, 0x0E8D	; 0x800e8d <cs+0xd0>
   13834:	61 15       	cp	r22, r1
   13836:	71 05       	cpc	r23, r1
   13838:	f1 f0       	breq	.+60     	; 0x13876 <process_commands() [clone .part.46]+0xe42>
    {
        // 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 <process_commands() [clone .part.46]+0xe42>
            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 <cs+0xc8>
   1387a:	50 90 86 0e 	lds	r5, 0x0E86	; 0x800e86 <cs+0xc9>
   1387e:	60 90 87 0e 	lds	r6, 0x0E87	; 0x800e87 <cs+0xca>
   13882:	70 90 88 0e 	lds	r7, 0x0E88	; 0x800e88 <cs+0xcb>
   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 <process_commands() [clone .part.46]+0xe92>
    {
        // 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 <process_commands() [clone .part.46]+0xe92>
        // 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 <process_commands() [clone .part.46]+0xeb6>
   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 <process_commands() [clone .part.46]+0xf24>
   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 <process_commands() [clone .part.46]+0xf24>
   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 <process_commands() [clone .part.46]+0xf24>
    {
        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 <hypot>
   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 <process_commands() [clone .part.46]+0x12fe>

    // Calculate the number of arc segments
    unsigned short segments = static_cast<unsigned short>(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 <ceil>
   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 <process_commands() [clone .part.46]+0xf84>
   139b6:	8b c1       	rjmp	.+790    	; 0x13cce <process_commands() [clone .part.46]+0x129a>
   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 <process_commands() [clone .part.46]+0xf92>
   139c4:	84 c1       	rjmp	.+776    	; 0x13cce <process_commands() [clone .part.46]+0x129a>
    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 <cs+0xcc>
   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 <destination+0xc>
   13a1c:	70 91 80 06 	lds	r23, 0x0680	; 0x800680 <destination+0xd>
   13a20:	80 91 81 06 	lds	r24, 0x0681	; 0x800681 <destination+0xe>
   13a24:	90 91 82 06 	lds	r25, 0x0682	; 0x800682 <destination+0xf>
   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 <process_commands() [clone .part.46]+0x1326>
                // 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 <cos>
   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 <sin>
   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 <offset>
   13af6:	d0 90 8a 03 	lds	r13, 0x038A	; 0x80038a <offset+0x1>
   13afa:	e0 90 8b 03 	lds	r14, 0x038B	; 0x80038b <offset+0x2>
   13afe:	f0 90 8c 03 	lds	r15, 0x038C	; 0x80038c <offset+0x3>
   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 <offset+0x4>
   13b0e:	30 91 8e 03 	lds	r19, 0x038E	; 0x80038e <offset+0x5>
   13b12:	40 91 8f 03 	lds	r20, 0x038F	; 0x80038f <offset+0x6>
   13b16:	50 91 90 03 	lds	r21, 0x0390	; 0x800390 <offset+0x7>
   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 <cs+0xcc>
   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 <clamp_to_software_endstops(float*)>
            // 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 <process_commands() [clone .part.46]+0x127c>
                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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   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 <planner_aborted>
   13cb4:	81 11       	cpse	r24, r1
   13cb6:	3d c0       	rjmp	.+122    	; 0x13d32 <process_commands() [clone .part.46]+0x12fe>
            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 <process_commands() [clone .part.46]+0x129a>
   13ccc:	f4 ce       	rjmp	.-536    	; 0x13ab6 <process_commands() [clone .part.46]+0x1082>
            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 <clamp_to_software_endstops(float*)>
    // 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 <destination+0x8>
   13cda:	f0 90 7c 06 	lds	r15, 0x067C	; 0x80067c <destination+0x9>
   13cde:	00 91 7d 06 	lds	r16, 0x067D	; 0x80067d <destination+0xa>
   13ce2:	10 91 7e 06 	lds	r17, 0x067E	; 0x80067e <destination+0xb>
   13ce6:	20 91 77 06 	lds	r18, 0x0677	; 0x800677 <destination+0x4>
   13cea:	30 91 78 06 	lds	r19, 0x0678	; 0x800678 <destination+0x5>
   13cee:	40 91 79 06 	lds	r20, 0x0679	; 0x800679 <destination+0x6>
   13cf2:	50 91 7a 06 	lds	r21, 0x067A	; 0x80067a <destination+0x7>
   13cf6:	60 91 73 06 	lds	r22, 0x0673	; 0x800673 <destination>
   13cfa:	70 91 74 06 	lds	r23, 0x0674	; 0x800674 <destination+0x1>
   13cfe:	80 91 75 06 	lds	r24, 0x0675	; 0x800675 <destination+0x2>
   13d02:	90 91 76 06 	lds	r25, 0x0676	; 0x800676 <destination+0x3>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   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 <set_current_to_destination()>
    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 <Timer<unsigned long>::start()>
   13d3e:	7b cb       	rjmp	.-2314   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
        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 <process_commands() [clone .part.46]+0xb10>
    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 <process_commands() [clone .part.46]+0xdf8>
            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 <process_commands() [clone .part.46]+0x1194>
      - `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 <code_seen(char) [clone .lto_priv.549]>
      - `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 <process_commands() [clone .part.46]+0x1402>
   13e2a:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   13e3c:	88 23       	and	r24, r24
   13e3e:	61 f0       	breq	.+24     	; 0x13e58 <process_commands() [clone .part.46]+0x1424>
   13e40:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x143e>
      {
        if(custom_message_type != CustomMsg::M117)
   13e62:	80 91 c3 06 	lds	r24, 0x06C3	; 0x8006c3 <custom_message_type>
   13e66:	87 30       	cpi	r24, 0x07	; 7
   13e68:	21 f0       	breq	.+8      	; 0x13e72 <process_commands() [clone .part.46]+0x143e>
        {
          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 <lcd_setstatuspgm(char const*)>
        }
      }
      st_synchronize();
   13e72:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
      codenum += _millis();  // keep track of when we started waiting
   13e76:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <Timer<unsigned long>::start()>
      while(_millis() < codenum) {
   13e8a:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <process_commands() [clone .part.46]+0x1466>
   13e98:	ce ca       	rjmp	.-2660   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
        manage_heater();
   13e9a:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
        manage_inactivity();
   13e9e:	80 e0       	ldi	r24, 0x00	; 0
   13ea0:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
        lcd_update(0);
   13ea4:	80 e0       	ldi	r24, 0x00	; 0
   13ea6:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   13eaa:	ef cf       	rjmp	.-34     	; 0x13e8a <process_commands() [clone .part.46]+0x1456>
    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 <retract(bool, bool) [clone .constprop.106]>
   13eb2:	c1 ca       	rjmp	.-2686   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
   13eb4:	80 e0       	ldi	r24, 0x00	; 0
   13eb6:	fb cf       	rjmp	.-10     	; 0x13eae <process_commands() [clone .part.46]+0x147a>
     - `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 <process_commands() [clone .part.46]+0x8fc>
    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 <st_synchronize()>
            homing_flag = true;
   13eca:	81 e0       	ldi	r24, 0x01	; 1
   13ecc:	80 93 a6 0d 	sts	0x0DA6, r24	; 0x800da6 <homing_flag>

            // 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 <setup_for_endstop_move(bool) [clone .lto_priv.392]>
   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 <feedrate>
   13ee2:	90 93 b9 02 	sts	0x02B9, r25	; 0x8002b9 <feedrate+0x1>
   13ee6:	a0 93 ba 02 	sts	0x02BA, r26	; 0x8002ba <feedrate+0x2>
   13eea:	b0 93 bb 02 	sts	0x02BB, r27	; 0x8002bb <feedrate+0x3>

            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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>

			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 <current_position+0x8>
   13f00:	60 90 9a 06 	lds	r6, 0x069A	; 0x80069a <current_position+0x9>
   13f04:	50 90 9b 06 	lds	r5, 0x069B	; 0x80069b <current_position+0xa>
   13f08:	40 90 9c 06 	lds	r4, 0x069C	; 0x80069c <current_position+0xb>
   13f0c:	b0 90 95 06 	lds	r11, 0x0695	; 0x800695 <current_position+0x4>
   13f10:	a0 90 96 06 	lds	r10, 0x0696	; 0x800696 <current_position+0x5>
   13f14:	90 90 97 06 	lds	r9, 0x0697	; 0x800697 <current_position+0x6>
   13f18:	80 90 98 06 	lds	r8, 0x0698	; 0x800698 <current_position+0x7>
   13f1c:	f0 90 91 06 	lds	r15, 0x0691	; 0x800691 <current_position>
   13f20:	e0 90 92 06 	lds	r14, 0x0692	; 0x800692 <current_position+0x1>
   13f24:	d0 90 93 06 	lds	r13, 0x0693	; 0x800693 <current_position+0x2>
   13f28:	c0 90 94 06 	lds	r12, 0x0694	; 0x800694 <current_position+0x3>
   13f2c:	89 e9       	ldi	r24, 0x99	; 153
   13f2e:	93 e4       	ldi	r25, 0x43	; 67
   13f30:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <printf_P>

            clean_up_after_endstop_move(l_feedmultiply);
   13f5c:	c8 01       	movw	r24, r16
   13f5e:	0e 94 66 66 	call	0xcccc	; 0xcccc <clean_up_after_endstop_move(int) [clone .lto_priv.393]>
            homing_flag = false;
   13f62:	10 92 a6 0d 	sts	0x0DA6, r1	; 0x800da6 <homing_flag>
   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 <process_commands() [clone .part.46]+0xa02>
  ```
  */
  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 <current_temperature_pinda>
   13f7e:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   13f82:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   13f86:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   13f8a:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   13f8e:	87 ff       	sbrs	r24, 7
   13f90:	05 c0       	rjmp	.+10     	; 0x13f9c <process_commands() [clone .part.46]+0x1568>
        {
            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 <serialprintlnPGM(char const*)>
   13f9a:	4d ca       	rjmp	.-2918   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
            break;
        }

        if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) {
   13f9c:	82 e0       	ldi	r24, 0x02	; 2
   13f9e:	0e 94 58 ef 	call	0x1deb0	; 0x1deb0 <calibration_status_get(unsigned char)>
   13fa2:	81 11       	cpse	r24, r1
   13fa4:	07 c0       	rjmp	.+14     	; 0x13fb4 <process_commands() [clone .part.46]+0x1580>
            //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 <lang_get_translation>
   13fae:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   13fb2:	41 ca       	rjmp	.-2942   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
            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 <axis_known_position>
   13fb8:	88 23       	and	r24, r24
   13fba:	41 f0       	breq	.+16     	; 0x13fcc <process_commands() [clone .part.46]+0x1598>
   13fbc:	80 91 8f 06 	lds	r24, 0x068F	; 0x80068f <axis_known_position+0x1>
   13fc0:	88 23       	and	r24, r24
   13fc2:	21 f0       	breq	.+8      	; 0x13fcc <process_commands() [clone .part.46]+0x1598>
   13fc4:	10 91 90 06 	lds	r17, 0x0690	; 0x800690 <axis_known_position+0x2>
   13fc8:	11 11       	cpse	r17, r1
   13fca:	08 c0       	rjmp	.+16     	; 0x13fdc <process_commands() [clone .part.46]+0x15a8>
   13fcc:	81 e0       	ldi	r24, 0x01	; 1
   13fce:	80 93 a1 10 	sts	0x10A1, r24	; 0x8010a1 <cmdbuffer_front_already_processed>
        {
            // 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 <enquecommand_front(char const*, bool) [clone .constprop.323]>
   13fda:	2d ca       	rjmp	.-2982   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
            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 <lang_get_translation>
   13fe4:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
        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 <lang_get_translation>
   13ff0:	41 e0       	ldi	r20, 0x01	; 1
   13ff2:	60 e0       	ldi	r22, 0x00	; 0
   13ff4:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>

        if (result == LCD_LEFT_BUTTON_CHOICE)
   13ff8:	81 11       	cpse	r24, r1
   13ffa:	61 c0       	rjmp	.+194    	; 0x140be <process_commands() [clone .part.46]+0x168a>
        {
            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 <current_position+0x8>
   14008:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   1400c:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   14010:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            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 <current_position+0x8>
   1402c:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   14030:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   14034:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
            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 <current_position+0x4>
   14044:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   14048:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   1404c:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   1405c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            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 <lang_get_translation>
   14068:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
            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 <current_position+0x4>
   1407c:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   14080:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   14084:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
            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 <current_position>
   14098:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   1409c:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   140a0:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   140b0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            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 <gcode_G28(bool, bool, bool)>

        }
        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 <current_temperature_pinda>
   140ca:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   140ce:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   140d2:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   140d6:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   140da:	18 16       	cp	r1, r24
   140dc:	0c f0       	brlt	.+2      	; 0x140e0 <process_commands() [clone .part.46]+0x16ac>
   140de:	73 c0       	rjmp	.+230    	; 0x141c6 <process_commands() [clone .part.46]+0x1792>
            //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 <current_position+0x8>
   140ec:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   140f0:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   140f4:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>

}

#ifdef PINDA_THERMISTOR
bool lcd_wait_for_pinda(float temp) {
	disable_heater();
   14104:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
	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 <Timer<unsigned long>::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 <current_temperature_pinda>
   14130:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   14134:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   14138:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   1413c:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   14140:	18 16       	cp	r1, r24
   14142:	c4 f5       	brge	.+112    	; 0x141b4 <process_commands() [clone .part.46]+0x1780>
		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 <lang_get_translation>
   1414c:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>

		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_putc_at(unsigned char, unsigned char, char)>
		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 <current_temperature_pinda>
   14162:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   14166:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   1416a:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   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_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   1417e:	81 e8       	ldi	r24, 0x81	; 129
   14180:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
		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 <delay_keep_alive(unsigned int)>
		serialecho_temperatures();
   1418c:	0e 94 f6 76 	call	0xedec	; 0xedec <serialecho_temperatures()>
		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 <Timer<unsigned long>::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 <process_commands() [clone .part.46]+0x177e>
   141b0:	b9 cf       	rjmp	.-142    	; 0x14124 <process_commands() [clone .part.46]+0x16f0>
			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 <lcd_update_enable(unsigned char)>
            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 <process_commands() [clone .part.46]+0x1792>
                lcd_temp_cal_show_result(false);
   141be:	80 e0       	ldi	r24, 0x00	; 0
   141c0:	0f 94 18 21 	call	0x24230	; 0x24230 <lcd_temp_cal_show_result(bool)>
   141c4:	38 c9       	rjmp	.-3472   	; 0x13436 <process_commands() [clone .part.46]+0xa02>
                break;
            }
        }

        st_synchronize();
   141c6:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        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 <homing_flag>

        lcd_update_enable(true);
   141d0:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
        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 <serialprintlnPGM(char const*)>

        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 <current_temperature_pinda>
   141e0:	90 90 98 03 	lds	r9, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   141e4:	a0 90 99 03 	lds	r10, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   141e8:	b0 90 9a 03 	lds	r11, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   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 <process_commands() [clone .part.46]+0x1804>
   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 <process_commands() [clone .part.46]+0x1830>
   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 <printf_P>

        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 <target_temperature_bed+0x1>
   142a0:	60 93 71 06 	sts	0x0671, r22	; 0x800671 <target_temperature_bed>

        custom_message_type = CustomMsg::TempCal;
   142a4:	84 e0       	ldi	r24, 0x04	; 4
   142a6:	80 93 c3 06 	sts	0x06C3, r24	; 0x8006c3 <custom_message_type>
        custom_message_state = 1;
   142aa:	81 e0       	ldi	r24, 0x01	; 1
   142ac:	80 93 f6 03 	sts	0x03F6, r24	; 0x8003f6 <custom_message_state>
        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 <lang_get_translation>
   142b8:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
        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 <current_position+0x8>
   142c8:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   142cc:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   142d0:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
        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 <plan_buffer_line_curposXYZE(float)>
        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 <current_position>
   142ec:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   142f0:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   142f4:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
        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 <current_position+0x4>
   14304:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   14308:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   1430c:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
        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 <plan_buffer_line_curposXYZE(float)>
        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 <current_position+0x8>
   14328:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   1432c:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   14330:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
        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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   14340:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   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 <current_temperature_pinda>
   14354:	30 91 98 03 	lds	r19, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   14358:	40 91 99 03 	lds	r20, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   1435c:	50 91 9a 03 	lds	r21, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   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 <process_commands() [clone .part.46]+0x194a>
        {
            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 <delay_keep_alive(unsigned int)>
            serialecho_temperatures();
   14378:	0e 94 f6 76 	call	0xedec	; 0xedec <serialecho_temperatures()>
   1437c:	e9 cf       	rjmp	.-46     	; 0x14350 <process_commands() [clone .part.46]+0x191c>
        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>
        }

        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 <current_position+0x8>
   14394:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   14398:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   1439c:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
        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 <plan_buffer_line_curposXYZE(float)>
        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 <current_position>
   143bc:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   143c0:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   143c4:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
        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 <current_position+0x4>
   143d8:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   143dc:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   143e0:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
        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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   143f0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

        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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>
        if (find_z_result == false) {
   14402:	81 11       	cpse	r24, r1
   14404:	06 c0       	rjmp	.+12     	; 0x14412 <process_commands() [clone .part.46]+0x19de>

            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 <lcd_temp_cal_show_result(bool)>
        homing_flag = false;
   1440a:	10 92 a6 0d 	sts	0x0DA6, r1	; 0x800da6 <homing_flag>
   1440e:	0c 94 1b 9a 	jmp	0x13436	; 0x13436 <process_commands() [clone .part.46]+0xa02>
        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 <current_position+0x8>
   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 <current_position+0x9>
   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 <current_position+0xa>
   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 <current_position+0xb>
   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 <printf_P>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x1a7c>
   144ac:	0c 94 32 cd 	jmp	0x19a64	; 0x19a64 <process_commands() [clone .part.46]+0x7030>
        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>
                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 <process_commands() [clone .part.46]+0x1aaa>
        }
        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 <process_commands() [clone .part.46]+0x1aa6>
   144d6:	0c 94 3e cd 	jmp	0x19a7c	; 0x19a7c <process_commands() [clone .part.46]+0x7048>
   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 <process_commands() [clone .part.46]+0x1aea>
   1451c:	d4 c0       	rjmp	.+424    	; 0x146c6 <process_commands() [clone .part.46]+0x1c92>
        {
            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 <printf_P>
            custom_message_state = i + 2;
   14544:	00 93 f6 03 	sts	0x03F6, r16	; 0x8003f6 <custom_message_state>
            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 <target_temperature_bed+0x1>
   14584:	60 93 71 06 	sts	0x0671, r22	; 0x800671 <target_temperature_bed>
            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 <current_position+0x8>
   14594:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   14598:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   1459c:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            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 <current_position>
   145b8:	30 93 92 06 	sts	0x0692, r19	; 0x800692 <current_position+0x1>
   145bc:	40 93 93 06 	sts	0x0693, r20	; 0x800693 <current_position+0x2>
   145c0:	50 93 94 06 	sts	0x0694, r21	; 0x800694 <current_position+0x3>
            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 <current_position+0x4>
   145d0:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   145d4:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   145d8:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
            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 <plan_buffer_line_curposXYZE(float)>
            current_position[Z_AXIS] = PINDA_PREHEAT_Z;
   145e8:	40 92 99 06 	sts	0x0699, r4	; 0x800699 <current_position+0x8>
   145ec:	50 92 9a 06 	sts	0x069A, r5	; 0x80069a <current_position+0x9>
   145f0:	60 92 9b 06 	sts	0x069B, r6	; 0x80069b <current_position+0xa>
   145f4:	70 92 9c 06 	sts	0x069C, r7	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   14604:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   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 <current_temperature_pinda>
   14614:	30 91 98 03 	lds	r19, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   14618:	40 91 99 03 	lds	r20, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   1461c:	50 91 9a 03 	lds	r21, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   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 <process_commands() [clone .part.46]+0x1c06>
            {
                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 <delay_keep_alive(unsigned int)>
                serialecho_temperatures();
   14634:	0e 94 f6 76 	call	0xedec	; 0xedec <serialecho_temperatures()>
   14638:	eb cf       	rjmp	.-42     	; 0x14610 <process_commands() [clone .part.46]+0x1bdc>
            }
            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 <current_position+0x8>
   14646:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   1464a:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   1464e:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
            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 <plan_buffer_line_curposXYZE(float)>
            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 <current_position>
   1466e:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   14672:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   14676:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
            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 <current_position+0x4>
   1468a:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   1468e:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   14692:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
            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 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   146a2:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>
   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 <process_commands() [clone .part.46]+0x1c96>
                lcd_temp_cal_show_result(find_z_result);
   146c2:	0f 94 18 21 	call	0x24230	; 0x24230 <lcd_temp_cal_show_result(bool)>

            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 <process_commands() [clone .part.46]+0x19d2>
            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 <current_position+0x8>
   146ee:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   146f2:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   146f6:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   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 <cs+0xc>
   1470a:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   1470e:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   14712:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <current_temperature_pinda+0x3>
   14742:	8f 93       	push	r24
   14744:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   14748:	8f 93       	push	r24
   1474a:	80 91 98 03 	lds	r24, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   1474e:	8f 93       	push	r24
   14750:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <current_temperature_pinda>
   14754:	8f 93       	push	r24
   14756:	9f 92       	push	r9
   14758:	8f 92       	push	r8
   1475a:	0f 94 d2 da 	call	0x3b5a4	; 0x3b5a4 <printf_P>
   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 <eeprom_update_word>
   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 <process_commands() [clone .part.46]+0x1ae0>

        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 <calibration_status_clear(unsigned char)>
   14784:	0c 94 1b 9a 	jmp	0x13436	; 0x13436 <process_commands() [clone .part.46]+0xa02>

        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 <calibration_status_set(unsigned char)>
   1478e:	0c 94 1b 9a 	jmp	0x13436	; 0x13436 <process_commands() [clone .part.46]+0xa02>
    /*!
    ### G90 - Switch off relative mode <a href="https://reprap.org/wiki/G-code#G90:_Set_to_Absolute_Positioning">G90: Set to Absolute Positioning</a>
    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 <axis_relative_modes>
   14796:	88 7f       	andi	r24, 0xF8	; 248
    /*!
    ### G91 - Switch on relative mode <a href="https://reprap.org/wiki/G-code#G91:_Set_to_Relative_Positioning">G91: Set to Relative Positioning</a>
    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 <axis_relative_modes>
   1479c:	0c 94 1b 9a 	jmp	0x13436	; 0x13436 <process_commands() [clone .part.46]+0xa02>
   147a0:	80 91 e3 03 	lds	r24, 0x03E3	; 0x8003e3 <axis_relative_modes>
   147a4:	87 60       	ori	r24, 0x07	; 7
   147a6:	f8 cf       	rjmp	.-16     	; 0x14798 <process_commands() [clone .part.46]+0x1d64>
        plan_reset_next_e();
    }
    else
    {
        // In any other case we're forced to synchronize
        st_synchronize();
   147a8:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   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 <process_commands() [clone .part.46]+0x1dba>
                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 <process_commands() [clone .part.46]+0x1d7c>
        {
            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 <process_commands() [clone .part.46]+0x1de4>
            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 <current_position+0xc>
   1480c:	90 93 9e 06 	sts	0x069E, r25	; 0x80069e <current_position+0xd>
   14810:	a0 93 9f 06 	sts	0x069F, r26	; 0x80069f <current_position+0xe>
   14814:	b0 93 a0 06 	sts	0x06A0, r27	; 0x8006a0 <current_position+0xf>

        // Set all at once
        plan_set_position_curposXYZE();
   14818:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
   1481c:	0c 94 1b 9a 	jmp	0x13436	; 0x13436 <process_commands() [clone .part.46]+0xa02>
  /*!
  ---------------------------------------------------------------------------------
  # M Commands
  */

  else  if(*CMDBUFFER_CURRENT_STRING == 'M')
   14820:	8d 34       	cpi	r24, 0x4D	; 77
   14822:	11 f0       	breq	.+4      	; 0x14828 <process_commands() [clone .part.46]+0x1df4>
   14824:	0c 94 a3 cb 	jmp	0x19746	; 0x19746 <process_commands() [clone .part.46]+0x6d12>
  {
	  strchr_pointer = CMDBUFFER_CURRENT_STRING;
   14828:	10 93 94 03 	sts	0x0394, r17	; 0x800394 <strchr_pointer+0x1>
   1482c:	00 93 93 03 	sts	0x0393, r16	; 0x800393 <strchr_pointer>
   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 <process_commands() [clone .part.46]+0x1e00>
   1483a:	89 30       	cpi	r24, 0x09	; 9
   1483c:	d9 f3       	breq	.-10     	; 0x14834 <process_commands() [clone .part.46]+0x1e00>

	 /*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 <process_commands() [clone .part.46]+0x1e2c>
		  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 <printf_P>
   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 <process_commands() [clone .part.46]+0x17c>

	  } else
	  {
	  mcode_in_progress = code_value_short();
   14860:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <process_commands() [clone .part.46]+0x1e42>
   14872:	0c 94 5c b8 	jmp	0x170b8	; 0x170b8 <process_commands() [clone .part.46]+0x4684>
   14876:	0c f0       	brlt	.+2      	; 0x1487a <process_commands() [clone .part.46]+0x1e46>
   14878:	40 c3       	rjmp	.+1664   	; 0x14efa <process_commands() [clone .part.46]+0x24c6>
   1487a:	8e 34       	cpi	r24, 0x4E	; 78
   1487c:	91 05       	cpc	r25, r1
   1487e:	11 f4       	brne	.+4      	; 0x14884 <process_commands() [clone .part.46]+0x1e50>
   14880:	0c 94 be b3 	jmp	0x1677c	; 0x1677c <process_commands() [clone .part.46]+0x3d48>
   14884:	0c f0       	brlt	.+2      	; 0x14888 <process_commands() [clone .part.46]+0x1e54>
   14886:	35 c2       	rjmp	.+1130   	; 0x14cf2 <process_commands() [clone .part.46]+0x22be>
   14888:	8c 31       	cpi	r24, 0x1C	; 28
   1488a:	91 05       	cpc	r25, r1
   1488c:	11 f4       	brne	.+4      	; 0x14892 <process_commands() [clone .part.46]+0x1e5e>
   1488e:	0c 94 1d b2 	jmp	0x1643a	; 0x1643a <process_commands() [clone .part.46]+0x3a06>
   14892:	0c f0       	brlt	.+2      	; 0x14896 <process_commands() [clone .part.46]+0x1e62>
   14894:	00 c1       	rjmp	.+512    	; 0x14a96 <process_commands() [clone .part.46]+0x2062>
   14896:	85 31       	cpi	r24, 0x15	; 21
   14898:	91 05       	cpc	r25, r1
   1489a:	11 f4       	brne	.+4      	; 0x148a0 <process_commands() [clone .part.46]+0x1e6c>
   1489c:	0c 94 36 b1 	jmp	0x1626c	; 0x1626c <process_commands() [clone .part.46]+0x3838>
   148a0:	0c f0       	brlt	.+2      	; 0x148a4 <process_commands() [clone .part.46]+0x1e70>
   148a2:	5e c0       	rjmp	.+188    	; 0x14960 <process_commands() [clone .part.46]+0x1f2c>
   148a4:	81 31       	cpi	r24, 0x11	; 17
   148a6:	91 05       	cpc	r25, r1
   148a8:	11 f4       	brne	.+4      	; 0x148ae <process_commands() [clone .part.46]+0x1e7a>
   148aa:	0c 94 2b b1 	jmp	0x16256	; 0x16256 <process_commands() [clone .part.46]+0x3822>
   148ae:	ec f4       	brge	.+58     	; 0x148ea <process_commands() [clone .part.46]+0x1eb6>
   148b0:	02 97       	sbiw	r24, 0x02	; 2
   148b2:	10 f4       	brcc	.+4      	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
   148b4:	0c 94 9f b0 	jmp	0x1613e	; 0x1613e <process_commands() [clone .part.46]+0x370a>

    /*!
    #### End of M-Commands
    */
	default:
		printf_P(MSG_UNKNOWN_CODE, 'M', cmdbuffer + bufindr + CMDHDRSIZE);
   148b8:	80 91 91 12 	lds	r24, 0x1291	; 0x801291 <bufindr>
   148bc:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x1ec0>
   148f0:	0c 94 75 b5 	jmp	0x16aea	; 0x16aea <process_commands() [clone .part.46]+0x40b6>
   148f4:	44 97       	sbiw	r24, 0x14	; 20
   148f6:	01 f7       	brne	.-64     	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    #### 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 <busy_state>
      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 <serialprintlnPGM(char const*)>
      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 <code_seen(char) [clone .lto_priv.549]>
   1490c:	18 2f       	mov	r17, r24
   1490e:	8c e4       	ldi	r24, 0x4C	; 76
   14910:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   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 <SdBaseFile::rewind()>
  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 <process_commands() [clone .part.46]+0x1efc>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   1494c:	ce 01       	movw	r24, r28
   1494e:	01 96       	adiw	r24, 0x01	; 1
   14950:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
      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 <serialprintlnPGM(char const*)>
   1495c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x1f36>
   14966:	0c 94 47 b1 	jmp	0x1628e	; 0x1628e <process_commands() [clone .part.46]+0x385a>
   1496a:	94 f4       	brge	.+36     	; 0x14990 <process_commands() [clone .part.46]+0x1f5c>
   1496c:	86 31       	cpi	r24, 0x16	; 22
   1496e:	91 05       	cpc	r25, r1
   14970:	11 f4       	brne	.+4      	; 0x14976 <process_commands() [clone .part.46]+0x1f42>
   14972:	0c 94 3a b1 	jmp	0x16274	; 0x16274 <process_commands() [clone .part.46]+0x3840>
   14976:	47 97       	sbiw	r24, 0x17	; 23
   14978:	09 f0       	breq	.+2      	; 0x1497c <process_commands() [clone .part.46]+0x1f48>
   1497a:	9e cf       	rjmp	.-196    	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

        M23 [filename]

    */
    case 23:
      card.openFileReadFilteredGcode(strchr_pointer + 4, true);
   1497c:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   14980:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   14984:	61 e0       	ldi	r22, 0x01	; 1
   14986:	04 96       	adiw	r24, 0x04	; 4
   14988:	0f 94 42 80 	call	0x30084	; 0x30084 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]>
   1498c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x1f66>
   14996:	0c 94 8d b1 	jmp	0x1631a	; 0x1631a <process_commands() [clone .part.46]+0x38e6>
   1499a:	14 f0       	brlt	.+4      	; 0x149a0 <process_commands() [clone .part.46]+0x1f6c>
   1499c:	0c 94 af b1 	jmp	0x1635e	; 0x1635e <process_commands() [clone .part.46]+0x392a>
   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 <code_seen(char) [clone .lto_priv.549]>
   149ce:	88 23       	and	r24, r24
   149d0:	21 f1       	breq	.+72     	; 0x14a1a <process_commands() [clone .part.46]+0x1fe6>
            //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 <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x1fda>
   149ec:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x1fda>
   14a06:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x1f90>
            //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 <code_seen(char) [clone .lto_priv.549]>
   14a38:	88 23       	and	r24, r24
   14a3a:	11 f4       	brne	.+4      	; 0x14a40 <process_commands() [clone .part.46]+0x200c>
   14a3c:	0c 94 21 c4 	jmp	0x18842	; 0x18842 <process_commands() [clone .part.46]+0x5e0e>
            if ( code_value_uint8() == 0 ) {
   14a40:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   14a44:	81 11       	cpse	r24, r1
   14a46:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                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 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x206c>
   14a9c:	0c 94 c2 b2 	jmp	0x16584	; 0x16584 <process_commands() [clone .part.46]+0x3b50>
   14aa0:	0c f0       	brlt	.+2      	; 0x14aa4 <process_commands() [clone .part.46]+0x2070>
   14aa2:	f0 c0       	rjmp	.+480    	; 0x14c84 <process_commands() [clone .part.46]+0x2250>
   14aa4:	8f 31       	cpi	r24, 0x1F	; 31
   14aa6:	91 05       	cpc	r25, r1
   14aa8:	11 f4       	brne	.+4      	; 0x14aae <process_commands() [clone .part.46]+0x207a>
   14aaa:	0c 94 4f b2 	jmp	0x1649e	; 0x1649e <process_commands() [clone .part.46]+0x3a6a>
   14aae:	0c f0       	brlt	.+2      	; 0x14ab2 <process_commands() [clone .part.46]+0x207e>
   14ab0:	6a c0       	rjmp	.+212    	; 0x14b86 <process_commands() [clone .part.46]+0x2152>
   14ab2:	8d 31       	cpi	r24, 0x1D	; 29
   14ab4:	91 05       	cpc	r25, r1
   14ab6:	11 f4       	brne	.+4      	; 0x14abc <process_commands() [clone .part.46]+0x2088>
   14ab8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   14abc:	4e 97       	sbiw	r24, 0x1e	; 30
   14abe:	09 f0       	breq	.+2      	; 0x14ac2 <process_commands() [clone .part.46]+0x208e>
   14ac0:	fb ce       	rjmp	.-522    	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

        M30 [filename]

    */
    case 30:
      if (card.mounted){
   14ac2:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   14ac6:	88 23       	and	r24, r24
   14ac8:	11 f4       	brne	.+4      	; 0x14ace <process_commands() [clone .part.46]+0x209a>
   14aca:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <SdBaseFile::sync()>
  file.close();
   14ad6:	8f e1       	ldi	r24, 0x1F	; 31
   14ad8:	97 e1       	ldi	r25, 0x17	; 23
   14ada:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
  saving = false;
   14ade:	10 92 8d 14 	sts	0x148D, r1	; 0x80148d <card>
  logging = false;
   14ae2:	10 92 8e 14 	sts	0x148E, r1	; 0x80148e <card+0x1>
        card.closefile();
        card.removeFile(strchr_pointer + 4);
   14ae6:	00 91 93 03 	lds	r16, 0x0393	; 0x800393 <strchr_pointer>
   14aea:	10 91 94 03 	lds	r17, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <card+0x3>
   14af6:	88 23       	and	r24, r24
   14af8:	11 f4       	brne	.+4      	; 0x14afe <process_commands() [clone .part.46]+0x20ca>
   14afa:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    file.close();
   14afe:	8f e1       	ldi	r24, 0x1F	; 31
   14b00:	97 e1       	ldi	r25, 0x17	; 23
   14b02:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
    sdprinting = false;
   14b06:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>

    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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]>
   14b1c:	88 23       	and	r24, r24
   14b1e:	11 f4       	brne	.+4      	; 0x14b24 <process_commands() [clone .part.46]+0x20f0>
   14b20:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      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 <card+0xab>
   14b30:	70 91 39 15 	lds	r23, 0x1539	; 0x801539 <card+0xac>
 * \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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   14b42:	81 11       	cpse	r24, r1
   14b44:	0c 94 25 b2 	jmp	0x1644a	; 0x1644a <process_commands() [clone .part.46]+0x3a16>
  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 <SdBaseFile::~SdBaseFile()>
   14b52:	11 23       	and	r17, r17
   14b54:	11 f4       	brne	.+4      	; 0x14b5a <process_commands() [clone .part.46]+0x2126>
   14b56:	0c 94 3f b2 	jmp	0x1647e	; 0x1647e <process_commands() [clone .part.46]+0x3a4a>
    {
      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 <serialprintPGM(char const*)>
      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 <MarlinSerial::println(char const*)>
      sdpos = 0;
   14b6e:	10 92 a3 17 	sts	0x17A3, r1	; 0x8017a3 <card+0x316>
   14b72:	10 92 a4 17 	sts	0x17A4, r1	; 0x8017a4 <card+0x317>
   14b76:	10 92 a5 17 	sts	0x17A5, r1	; 0x8017a5 <card+0x318>
   14b7a:	10 92 a6 17 	sts	0x17A6, r1	; 0x8017a6 <card+0x319>
	  #ifdef SDCARD_SORT_ALPHA
		  presort();
   14b7e:	0f 94 89 7d 	call	0x2fb12	; 0x2fb12 <CardReader::presort() [clone .constprop.218]>
   14b82:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x215c>
   14b8c:	0c 94 76 b2 	jmp	0x164ec	; 0x164ec <process_commands() [clone .part.46]+0x3ab8>
   14b90:	8c 32       	cpi	r24, 0x2C	; 44
   14b92:	91 05       	cpc	r25, r1
   14b94:	11 f4       	brne	.+4      	; 0x14b9a <process_commands() [clone .part.46]+0x2166>
   14b96:	0c 94 a9 b2 	jmp	0x16552	; 0x16552 <process_commands() [clone .part.46]+0x3b1e>
   14b9a:	80 97       	sbiw	r24, 0x20	; 32
   14b9c:	09 f0       	breq	.+2      	; 0x14ba0 <process_commands() [clone .part.46]+0x216c>
   14b9e:	8c ce       	rjmp	.-744    	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
      - `S` - Starting file offset

    */
    case 32:
    {
      if(card.sdprinting) {
   14ba0:	80 91 8f 14 	lds	r24, 0x148F	; 0x80148f <card+0x2>
   14ba4:	81 11       	cpse	r24, r1
        st_synchronize();
   14ba6:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

      }

      const char* namestartpos = (strchr(strchr_pointer + 4,'!'));   //find ! to indicate filename string start.
   14baa:	00 91 93 03 	lds	r16, 0x0393	; 0x800393 <strchr_pointer>
   14bae:	10 91 94 03 	lds	r17, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <strchr>
      if(namestartpos==NULL)
   14bc0:	00 97       	sbiw	r24, 0x00	; 0
   14bc2:	19 f0       	breq	.+6      	; 0x14bca <process_commands() [clone .part.46]+0x2196>
      {
        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 <code_seen(char) [clone .lto_priv.549]>
   14bd0:	f8 2e       	mov	r15, r24

      if(strchr_pointer>namestartpos)
   14bd2:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   14bd6:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   14bda:	08 17       	cp	r16, r24
   14bdc:	19 07       	cpc	r17, r25
   14bde:	08 f4       	brcc	.+2      	; 0x14be2 <process_commands() [clone .part.46]+0x21ae>
        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 <card+0x3>
   14be6:	88 23       	and	r24, r24
   14be8:	11 f4       	brne	.+4      	; 0x14bee <process_commands() [clone .part.46]+0x21ba>
   14bea:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        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 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]>
        if(code_seen('S'))
   14bf8:	83 e5       	ldi	r24, 0x53	; 83
   14bfa:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   14bfe:	88 23       	and	r24, r24
   14c00:	99 f0       	breq	.+38     	; 0x14c28 <process_commands() [clone .part.46]+0x21f4>
          if(strchr_pointer<namestartpos) //only if "S" is occuring _before_ the filename
   14c02:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   14c06:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   14c0a:	80 17       	cp	r24, r16
   14c0c:	91 07       	cpc	r25, r17
   14c0e:	60 f4       	brcc	.+24     	; 0x14c28 <process_commands() [clone .part.46]+0x21f4>
            card.setIndex(code_value_long());
   14c10:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
  {
      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 <card+0x316>
   14c18:	70 93 a4 17 	sts	0x17A4, r23	; 0x8017a4 <card+0x317>
   14c1c:	80 93 a5 17 	sts	0x17A5, r24	; 0x8017a5 <card+0x318>
   14c20:	90 93 a6 17 	sts	0x17A6, r25	; 0x8017a6 <card+0x319>
   14c24:	0f 94 93 76 	call	0x2ed26	; 0x2ed26 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]>
  SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
}

void CardReader::startFileprint()
{
  if(mounted)
   14c28:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   14c2c:	88 23       	and	r24, r24
   14c2e:	31 f0       	breq	.+12     	; 0x14c3c <process_commands() [clone .part.46]+0x2208>
  {
    sdprinting = true;
   14c30:	81 e0       	ldi	r24, 0x01	; 1
   14c32:	80 93 8f 14 	sts	0x148F, r24	; 0x80148f <card+0x2>
   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 <process_commands() [clone .part.46]+0x36d2>
  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 <card+0x295>
   14c46:	88 23       	and	r24, r24
   14c48:	61 f0       	breq	.+24     	; 0x14c62 <process_commands() [clone .part.46]+0x222e>
        {
            if(!card.get_sdpos())
   14c4a:	80 91 a3 17 	lds	r24, 0x17A3	; 0x8017a3 <card+0x316>
   14c4e:	90 91 a4 17 	lds	r25, 0x17A4	; 0x8017a4 <card+0x317>
   14c52:	a0 91 a5 17 	lds	r26, 0x17A5	; 0x8017a5 <card+0x318>
   14c56:	b0 91 a6 17 	lds	r27, 0x17A6	; 0x8017a6 <card+0x319>
   14c5a:	89 2b       	or	r24, r25
   14c5c:	8a 2b       	or	r24, r26
   14c5e:	8b 2b       	or	r24, r27
   14c60:	69 f4       	brne	.+26     	; 0x14c7c <process_commands() [clone .part.46]+0x2248>
            {
                // A new print has started from scratch, reset stats
                failstats_reset_print();
   14c62:	0e 94 bc 5b 	call	0xb778	; 0xb778 <failstats_reset_print()>
                sdpos_atomic = 0;
   14c66:	10 92 80 03 	sts	0x0380, r1	; 0x800380 <sdpos_atomic>
   14c6a:	10 92 81 03 	sts	0x0381, r1	; 0x800381 <sdpos_atomic+0x1>
   14c6e:	10 92 82 03 	sts	0x0382, r1	; 0x800382 <sdpos_atomic+0x2>
   14c72:	10 92 83 03 	sts	0x0383, r1	; 0x800383 <sdpos_atomic+0x3>
   14c76:	80 e0       	ldi	r24, 0x00	; 0
   14c78:	0e 94 af 81 	call	0x1035e	; 0x1035e <la10c_mode_change(LA10C_MODE)>
#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 <Stopwatch::start()>
   14c80:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x225a>
   14c8a:	0c 94 06 b3 	jmp	0x1660c	; 0x1660c <process_commands() [clone .part.46]+0x3bd8>
   14c8e:	f4 f4       	brge	.+60     	; 0x14ccc <process_commands() [clone .part.46]+0x2298>
   14c90:	8e 32       	cpi	r24, 0x2E	; 46
   14c92:	91 05       	cpc	r25, r1
   14c94:	11 f4       	brne	.+4      	; 0x14c9a <process_commands() [clone .part.46]+0x2266>
   14c96:	0c 94 c8 b2 	jmp	0x16590	; 0x16590 <process_commands() [clone .part.46]+0x3b5c>
   14c9a:	88 34       	cpi	r24, 0x48	; 72
   14c9c:	91 05       	cpc	r25, r1
   14c9e:	09 f0       	breq	.+2      	; 0x14ca2 <process_commands() [clone .part.46]+0x226e>
   14ca0:	0b ce       	rjmp	.-1002   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    #### 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 <code_seen(char) [clone .lto_priv.549]>
   14ca8:	88 23       	and	r24, r24
   14caa:	11 f4       	brne	.+4      	; 0x14cb0 <process_commands() [clone .part.46]+0x227c>
   14cac:	0c 94 f7 b2 	jmp	0x165ee	; 0x165ee <process_commands() [clone .part.46]+0x3bba>
            switch (code_value_uint8()){
   14cb0:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   14cb4:	88 23       	and	r24, r24
   14cb6:	11 f4       	brne	.+4      	; 0x14cbc <process_commands() [clone .part.46]+0x2288>
   14cb8:	0c 94 f4 b2 	jmp	0x165e8	; 0x165e8 <process_commands() [clone .part.46]+0x3bb4>
   14cbc:	81 30       	cpi	r24, 0x01	; 1
   14cbe:	11 f0       	breq	.+4      	; 0x14cc4 <process_commands() [clone .part.46]+0x2290>
   14cc0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   14cc4:	80 93 b7 0d 	sts	0x0DB7, r24	; 0x800db7 <_ZL13printer_state.lto_priv.403>
   14cc8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x22a2>
   14cd2:	0c 94 a6 b3 	jmp	0x1674c	; 0x1674c <process_commands() [clone .part.46]+0x3d18>
   14cd6:	14 f0       	brlt	.+4      	; 0x14cdc <process_commands() [clone .part.46]+0x22a8>
   14cd8:	0c 94 b9 b3 	jmp	0x16772	; 0x16772 <process_commands() [clone .part.46]+0x3d3e>
   14cdc:	8b 34       	cpi	r24, 0x4B	; 75
   14cde:	91 05       	cpc	r25, r1
   14ce0:	09 f0       	breq	.+2      	; 0x14ce4 <process_commands() [clone .part.46]+0x22b0>
   14ce2:	ea cd       	rjmp	.-1068   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    /*!
    ### M75 - Start the print job timer <a href="https://reprap.org/wiki/G-code#M75:_Start_the_print_job_timer">M75: Start the print job timer</a>
    */
    case 75:
    {
        if (!filament_presence_check()) {
   14ce4:	0e 94 bb f5 	call	0x1eb76	; 0x1eb76 <filament_presence_check()>
   14ce8:	88 23       	and	r24, r24
   14cea:	11 f4       	brne	.+4      	; 0x14cf0 <process_commands() [clone .part.46]+0x22bc>
   14cec:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   14cf0:	c5 cf       	rjmp	.-118    	; 0x14c7c <process_commands() [clone .part.46]+0x2248>
	  } 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 <process_commands() [clone .part.46]+0x22c8>
   14cf8:	0c 94 6c b6 	jmp	0x16cd8	; 0x16cd8 <process_commands() [clone .part.46]+0x42a4>
   14cfc:	0c f0       	brlt	.+2      	; 0x14d00 <process_commands() [clone .part.46]+0x22cc>
   14cfe:	86 c0       	rjmp	.+268    	; 0x14e0c <process_commands() [clone .part.46]+0x23d8>
   14d00:	86 35       	cpi	r24, 0x56	; 86
   14d02:	91 05       	cpc	r25, r1
   14d04:	11 f4       	brne	.+4      	; 0x14d0a <process_commands() [clone .part.46]+0x22d6>
   14d06:	0c 94 c5 b5 	jmp	0x16b8a	; 0x16b8a <process_commands() [clone .part.46]+0x4156>
   14d0a:	d4 f5       	brge	.+116    	; 0x14d80 <process_commands() [clone .part.46]+0x234c>
   14d0c:	83 35       	cpi	r24, 0x53	; 83
   14d0e:	91 05       	cpc	r25, r1
   14d10:	11 f4       	brne	.+4      	; 0x14d16 <process_commands() [clone .part.46]+0x22e2>
   14d12:	0c 94 6f b5 	jmp	0x16ade	; 0x16ade <process_commands() [clone .part.46]+0x40aa>
   14d16:	84 f4       	brge	.+32     	; 0x14d38 <process_commands() [clone .part.46]+0x2304>
   14d18:	8f 34       	cpi	r24, 0x4F	; 79
   14d1a:	91 05       	cpc	r25, r1
   14d1c:	11 f4       	brne	.+4      	; 0x14d22 <process_commands() [clone .part.46]+0x22ee>
   14d1e:	0c 94 29 b4 	jmp	0x16852	; 0x16852 <process_commands() [clone .part.46]+0x3e1e>
   14d22:	82 35       	cpi	r24, 0x52	; 82
   14d24:	91 05       	cpc	r25, r1
   14d26:	09 f0       	breq	.+2      	; 0x14d2a <process_commands() [clone .part.46]+0x22f6>
   14d28:	c7 cd       	rjmp	.-1138   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    /*!
    ### M82 - Set E axis to absolute mode <a href="https://reprap.org/wiki/G-code#M82:_Set_extruder_to_absolute_mode">M82: Set extruder to absolute mode</a>
    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 <axis_relative_modes>
   14d2e:	87 7f       	andi	r24, 0xF7	; 247
   14d30:	80 93 e3 03 	sts	0x03E3, r24	; 0x8003e3 <axis_relative_modes>
   14d34:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x230e>
   14d3e:	0c 94 75 b5 	jmp	0x16aea	; 0x16aea <process_commands() [clone .part.46]+0x40b6>
   14d42:	85 35       	cpi	r24, 0x55	; 85
   14d44:	91 05       	cpc	r25, r1
   14d46:	09 f0       	breq	.+2      	; 0x14d4a <process_commands() [clone .part.46]+0x2316>
   14d48:	b7 cd       	rjmp	.-1170   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   14d50:	88 23       	and	r24, r24
   14d52:	11 f4       	brne	.+4      	; 0x14d58 <process_commands() [clone .part.46]+0x2324>
   14d54:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        max_inactive_time = code_value() * 1000;
   14d58:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <max_inactive_time>
   14d70:	70 93 7d 03 	sts	0x037D, r23	; 0x80037d <max_inactive_time+0x1>
   14d74:	80 93 7e 03 	sts	0x037E, r24	; 0x80037e <max_inactive_time+0x2>
   14d78:	90 93 7f 03 	sts	0x037F, r25	; 0x80037f <max_inactive_time+0x3>
   14d7c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2356>
   14d86:	0c 94 85 b4 	jmp	0x1690a	; 0x1690a <process_commands() [clone .part.46]+0x3ed6>
   14d8a:	d4 f4       	brge	.+52     	; 0x14dc0 <process_commands() [clone .part.46]+0x238c>
   14d8c:	8c 35       	cpi	r24, 0x5C	; 92
   14d8e:	91 05       	cpc	r25, r1
   14d90:	11 f4       	brne	.+4      	; 0x14d96 <process_commands() [clone .part.46]+0x2362>
   14d92:	0c 94 e2 b5 	jmp	0x16bc4	; 0x16bc4 <process_commands() [clone .part.46]+0x4190>
   14d96:	88 36       	cpi	r24, 0x68	; 104
   14d98:	91 05       	cpc	r25, r1
   14d9a:	09 f0       	breq	.+2      	; 0x14d9e <process_commands() [clone .part.46]+0x236a>
   14d9c:	8d cd       	rjmp	.-1254   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
  #### 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 <code_seen(char) [clone .lto_priv.549]>
   14da4:	88 23       	and	r24, r24
   14da6:	11 f4       	brne	.+4      	; 0x14dac <process_commands() [clone .part.46]+0x2378>
   14da8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
          {
              setTargetHotend(code_value());
   14dac:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
  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 <target_temperature+0x1>
   14db8:	60 93 b5 0d 	sts	0x0DB5, r22	; 0x800db5 <target_temperature>
   14dbc:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2396>
   14dc6:	0c 94 6c b5 	jmp	0x16ad8	; 0x16ad8 <process_commands() [clone .part.46]+0x40a4>
   14dca:	14 f4       	brge	.+4      	; 0x14dd0 <process_commands() [clone .part.46]+0x239c>
   14dcc:	0c 94 5e b5 	jmp	0x16abc	; 0x16abc <process_commands() [clone .part.46]+0x4088>
   14dd0:	8d 36       	cpi	r24, 0x6D	; 109
   14dd2:	91 05       	cpc	r25, r1
   14dd4:	09 f0       	breq	.+2      	; 0x14dd8 <process_commands() [clone .part.46]+0x23a4>
   14dd6:	70 cd       	rjmp	.-1312   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    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 <lang_get_translation>
   14de0:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
	  heating_status = HeatingStatus::EXTRUDER_HEATING;
   14de4:	81 e0       	ldi	r24, 0x01	; 1
   14de6:	80 93 e1 03 	sts	0x03E1, r24	; 0x8003e1 <heating_status>
      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 <code_seen(char) [clone .lto_priv.549]>
   14df0:	88 23       	and	r24, r24
   14df2:	11 f4       	brne	.+4      	; 0x14df8 <process_commands() [clone .part.46]+0x23c4>
   14df4:	0c 94 99 b4 	jmp	0x16932	; 0x16932 <process_commands() [clone .part.46]+0x3efe>
          setTargetHotend(code_value());
            } else if (code_seen('R')) {
                setTargetHotend(code_value());
   14df8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   14dfc:	0f 94 a9 de 	call	0x3bd52	; 0x3bd52 <__fixsfsi>
   14e00:	70 93 b6 0d 	sts	0x0DB6, r23	; 0x800db6 <target_temperature+0x1>
   14e04:	60 93 b5 0d 	sts	0x0DB5, r22	; 0x800db5 <target_temperature>
   14e08:	0c 94 9f b4 	jmp	0x1693e	; 0x1693e <process_commands() [clone .part.46]+0x3f0a>
	  } 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 <process_commands() [clone .part.46]+0x23e2>
   14e12:	0c 94 b1 b7 	jmp	0x16f62	; 0x16f62 <process_commands() [clone .part.46]+0x452e>
   14e16:	ac f5       	brge	.+106    	; 0x14e82 <process_commands() [clone .part.46]+0x244e>
   14e18:	82 37       	cpi	r24, 0x72	; 114
   14e1a:	91 05       	cpc	r25, r1
   14e1c:	11 f4       	brne	.+4      	; 0x14e22 <process_commands() [clone .part.46]+0x23ee>
   14e1e:	0c 94 66 b7 	jmp	0x16ecc	; 0x16ecc <process_commands() [clone .part.46]+0x4498>
   14e22:	b4 f4       	brge	.+44     	; 0x14e50 <process_commands() [clone .part.46]+0x241c>
   14e24:	80 37       	cpi	r24, 0x70	; 112
   14e26:	91 05       	cpc	r25, r1
   14e28:	11 f4       	brne	.+4      	; 0x14e2e <process_commands() [clone .part.46]+0x23fa>
   14e2a:	0c 94 72 b4 	jmp	0x168e4	; 0x168e4 <process_commands() [clone .part.46]+0x3eb0>
   14e2e:	81 37       	cpi	r24, 0x71	; 113
   14e30:	91 05       	cpc	r25, r1
   14e32:	09 f0       	breq	.+2      	; 0x14e36 <process_commands() [clone .part.46]+0x2402>
   14e34:	41 cd       	rjmp	.-1406   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   14e3c:	88 23       	and	r24, r24
   14e3e:	11 f4       	brne	.+4      	; 0x14e44 <process_commands() [clone .part.46]+0x2410>
   14e40:	0c 94 7d b6 	jmp	0x16cfa	; 0x16cfa <process_commands() [clone .part.46]+0x42c6>
			host_keepalive_interval = code_value_uint8();
   14e44:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   14e48:	80 93 2f 02 	sts	0x022F, r24	; 0x80022f <host_keepalive_interval>
   14e4c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2426>
   14e56:	0c 94 69 b7 	jmp	0x16ed2	; 0x16ed2 <process_commands() [clone .part.46]+0x449e>
   14e5a:	14 f0       	brlt	.+4      	; 0x14e60 <process_commands() [clone .part.46]+0x242c>
   14e5c:	0c 94 79 b7 	jmp	0x16ef2	; 0x16ef2 <process_commands() [clone .part.46]+0x44be>
   14e60:	83 37       	cpi	r24, 0x73	; 115
   14e62:	91 05       	cpc	r25, r1
   14e64:	09 f0       	breq	.+2      	; 0x14e68 <process_commands() [clone .part.46]+0x2434>
   14e66:	28 cd       	rjmp	.-1456   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    #### 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 <code_seen(char) [clone .lto_priv.549]>
   14e6e:	88 23       	and	r24, r24
   14e70:	11 f4       	brne	.+4      	; 0x14e76 <process_commands() [clone .part.46]+0x2442>
   14e72:	0c 94 92 b6 	jmp	0x16d24	; 0x16d24 <process_commands() [clone .part.46]+0x42f0>
          // 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 <serialprintlnPGM(char const*)>
   14e7e:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2458>
   14e88:	0c 94 76 b4 	jmp	0x168ec	; 0x168ec <process_commands() [clone .part.46]+0x3eb8>
   14e8c:	54 f4       	brge	.+20     	; 0x14ea2 <process_commands() [clone .part.46]+0x246e>
   14e8e:	8b 37       	cpi	r24, 0x7B	; 123
   14e90:	91 05       	cpc	r25, r1
   14e92:	11 f4       	brne	.+4      	; 0x14e98 <process_commands() [clone .part.46]+0x2464>
   14e94:	0c 94 16 b8 	jmp	0x1702c	; 0x1702c <process_commands() [clone .part.46]+0x45f8>
   14e98:	8d 37       	cpi	r24, 0x7D	; 125
   14e9a:	91 05       	cpc	r25, r1
   14e9c:	09 f4       	brne	.+2      	; 0x14ea0 <process_commands() [clone .part.46]+0x246c>
   14e9e:	80 cd       	rjmp	.-1280   	; 0x149a0 <process_commands() [clone .part.46]+0x1f6c>
   14ea0:	0b cd       	rjmp	.-1514   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
   14ea2:	8e 3b       	cpi	r24, 0xBE	; 190
   14ea4:	91 05       	cpc	r25, r1
   14ea6:	11 f4       	brne	.+4      	; 0x14eac <process_commands() [clone .part.46]+0x2478>
   14ea8:	0c 94 cf b4 	jmp	0x1699e	; 0x1699e <process_commands() [clone .part.46]+0x3f6a>
   14eac:	88 3c       	cpi	r24, 0xC8	; 200
   14eae:	91 05       	cpc	r25, r1
   14eb0:	11 f4       	brne	.+4      	; 0x14eb6 <process_commands() [clone .part.46]+0x2482>
   14eb2:	0c 94 19 b8 	jmp	0x17032	; 0x17032 <process_commands() [clone .part.46]+0x45fe>
   14eb6:	8b 39       	cpi	r24, 0x9B	; 155
   14eb8:	91 05       	cpc	r25, r1
   14eba:	09 f0       	breq	.+2      	; 0x14ebe <process_commands() [clone .part.46]+0x248a>
   14ebc:	fd cc       	rjmp	.-1542   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
          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 <code_seen(char) [clone .lto_priv.549]>
   14ec4:	88 23       	and	r24, r24
   14ec6:	61 f0       	breq	.+24     	; 0x14ee0 <process_commands() [clone .part.46]+0x24ac>
            autoReportFeatures.SetPeriod( code_value_uint8() );
   14ec8:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
    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 <autoReportFeatures+0x1>
        if (auto_report_period != 0){
   14ed0:	88 23       	and	r24, r24
   14ed2:	11 f4       	brne	.+4      	; 0x14ed8 <process_commands() [clone .part.46]+0x24a4>
   14ed4:	0c 94 91 b4 	jmp	0x16922	; 0x16922 <process_commands() [clone .part.46]+0x3eee>
          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 <Timer<unsigned long>::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 <code_seen(char) [clone .lto_priv.549]>
   14ee6:	88 23       	and	r24, r24
   14ee8:	11 f4       	brne	.+4      	; 0x14eee <process_commands() [clone .part.46]+0x24ba>
   14eea:	0c 94 95 b4 	jmp	0x1692a	; 0x1692a <process_commands() [clone .part.46]+0x3ef6>
            autoReportFeatures.SetMask(code_value_uint8());
   14eee:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
    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 <autoReportFeatures>
   14ef6:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x24d2>
   14f02:	0c 94 03 c0 	jmp	0x18006	; 0x18006 <process_commands() [clone .part.46]+0x55d2>
   14f06:	0c f0       	brlt	.+2      	; 0x14f0a <process_commands() [clone .part.46]+0x24d6>
   14f08:	60 c4       	rjmp	.+2240   	; 0x157ca <process_commands() [clone .part.46]+0x2d96>
   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 <process_commands() [clone .part.46]+0x24e2>
   14f12:	0c 94 85 bb 	jmp	0x1770a	; 0x1770a <process_commands() [clone .part.46]+0x4cd6>
   14f16:	0c f0       	brlt	.+2      	; 0x14f1a <process_commands() [clone .part.46]+0x24e6>
   14f18:	24 c1       	rjmp	.+584    	; 0x15162 <process_commands() [clone .part.46]+0x272e>
   14f1a:	80 3d       	cpi	r24, 0xD0	; 208
   14f1c:	91 05       	cpc	r25, r1
   14f1e:	11 f4       	brne	.+4      	; 0x14f24 <process_commands() [clone .part.46]+0x24f0>
   14f20:	0c 94 c8 b9 	jmp	0x17390	; 0x17390 <process_commands() [clone .part.46]+0x495c>
   14f24:	0c f0       	brlt	.+2      	; 0x14f28 <process_commands() [clone .part.46]+0x24f4>
   14f26:	77 c0       	rjmp	.+238    	; 0x15016 <process_commands() [clone .part.46]+0x25e2>
   14f28:	8d 3c       	cpi	r24, 0xCD	; 205
   14f2a:	91 05       	cpc	r25, r1
   14f2c:	11 f4       	brne	.+4      	; 0x14f32 <process_commands() [clone .part.46]+0x24fe>
   14f2e:	0c 94 32 b9 	jmp	0x17264	; 0x17264 <process_commands() [clone .part.46]+0x4830>
   14f32:	ac f5       	brge	.+106    	; 0x14f9e <process_commands() [clone .part.46]+0x256a>
   14f34:	8b 3c       	cpi	r24, 0xCB	; 203
   14f36:	91 05       	cpc	r25, r1
   14f38:	11 f4       	brne	.+4      	; 0x14f3e <process_commands() [clone .part.46]+0x250a>
   14f3a:	0c 94 a9 b8 	jmp	0x17152	; 0x17152 <process_commands() [clone .part.46]+0x471e>
   14f3e:	8c 3c       	cpi	r24, 0xCC	; 204
   14f40:	91 05       	cpc	r25, r1
   14f42:	09 f0       	breq	.+2      	; 0x14f46 <process_commands() [clone .part.46]+0x2512>
   14f44:	b9 cc       	rjmp	.-1678   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   14f4c:	88 23       	and	r24, r24
   14f4e:	11 f4       	brne	.+4      	; 0x14f54 <process_commands() [clone .part.46]+0x2520>
   14f50:	0c 94 01 b9 	jmp	0x17202	; 0x17202 <process_commands() [clone .part.46]+0x47ce>
          // 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 <code_value() [clone .lto_priv.547]>
   14f58:	60 93 7d 0e 	sts	0x0E7D, r22	; 0x800e7d <cs+0xc0>
   14f5c:	70 93 7e 0e 	sts	0x0E7E, r23	; 0x800e7e <cs+0xc1>
   14f60:	80 93 7f 0e 	sts	0x0E7F, r24	; 0x800e7f <cs+0xc2>
   14f64:	90 93 80 0e 	sts	0x0E80, r25	; 0x800e80 <cs+0xc3>
   14f68:	60 93 f1 0d 	sts	0x0DF1, r22	; 0x800df1 <cs+0x34>
   14f6c:	70 93 f2 0d 	sts	0x0DF2, r23	; 0x800df2 <cs+0x35>
   14f70:	80 93 f3 0d 	sts	0x0DF3, r24	; 0x800df3 <cs+0x36>
   14f74:	90 93 f4 0d 	sts	0x0DF4, r25	; 0x800df4 <cs+0x37>
          // 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 <code_seen(char) [clone .lto_priv.549]>
   14f7e:	88 23       	and	r24, r24
   14f80:	11 f4       	brne	.+4      	; 0x14f86 <process_commands() [clone .part.46]+0x2552>
   14f82:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            cs.retract_acceleration = code_value();
   14f86:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   14f8a:	60 93 f5 0d 	sts	0x0DF5, r22	; 0x800df5 <cs+0x38>
   14f8e:	70 93 f6 0d 	sts	0x0DF6, r23	; 0x800df6 <cs+0x39>
   14f92:	80 93 f7 0d 	sts	0x0DF7, r24	; 0x800df7 <cs+0x3a>
   14f96:	90 93 f8 0d 	sts	0x0DF8, r25	; 0x800df8 <cs+0x3b>
   14f9a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2574>
   14fa4:	0c 94 ab b9 	jmp	0x17356	; 0x17356 <process_commands() [clone .part.46]+0x4922>
   14fa8:	8f 3c       	cpi	r24, 0xCF	; 207
   14faa:	91 05       	cpc	r25, r1
   14fac:	09 f0       	breq	.+2      	; 0x14fb0 <process_commands() [clone .part.46]+0x257c>
   14fae:	84 cc       	rjmp	.-1784   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   14fb6:	88 23       	and	r24, r24
   14fb8:	51 f0       	breq	.+20     	; 0x14fce <process_commands() [clone .part.46]+0x259a>
      {
        cs.retract_length = code_value() ;
   14fba:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   14fbe:	60 93 40 0e 	sts	0x0E40, r22	; 0x800e40 <cs+0x83>
   14fc2:	70 93 41 0e 	sts	0x0E41, r23	; 0x800e41 <cs+0x84>
   14fc6:	80 93 42 0e 	sts	0x0E42, r24	; 0x800e42 <cs+0x85>
   14fca:	90 93 43 0e 	sts	0x0E43, r25	; 0x800e43 <cs+0x86>
      }
      if(code_seen('F'))
   14fce:	86 e4       	ldi	r24, 0x46	; 70
   14fd0:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   14fd4:	88 23       	and	r24, r24
   14fd6:	61 f0       	breq	.+24     	; 0x14ff0 <process_commands() [clone .part.46]+0x25bc>
      {
        cs.retract_feedrate = get_feedrate_mm_s(code_value());
   14fd8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   14fdc:	0e 94 5f 66 	call	0xccbe	; 0xccbe <get_feedrate_mm_s(float)>
   14fe0:	60 93 44 0e 	sts	0x0E44, r22	; 0x800e44 <cs+0x87>
   14fe4:	70 93 45 0e 	sts	0x0E45, r23	; 0x800e45 <cs+0x88>
   14fe8:	80 93 46 0e 	sts	0x0E46, r24	; 0x800e46 <cs+0x89>
   14fec:	90 93 47 0e 	sts	0x0E47, r25	; 0x800e47 <cs+0x8a>
      }
      if(code_seen('Z'))
   14ff0:	8a e5       	ldi	r24, 0x5A	; 90
   14ff2:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   14ff6:	88 23       	and	r24, r24
   14ff8:	11 f4       	brne	.+4      	; 0x14ffe <process_commands() [clone .part.46]+0x25ca>
   14ffa:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        cs.retract_zlift = code_value() ;
   14ffe:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   15002:	60 93 48 0e 	sts	0x0E48, r22	; 0x800e48 <cs+0x8b>
   15006:	70 93 49 0e 	sts	0x0E49, r23	; 0x800e49 <cs+0x8c>
   1500a:	80 93 4a 0e 	sts	0x0E4A, r24	; 0x800e4a <cs+0x8d>
   1500e:	90 93 4b 0e 	sts	0x0E4B, r25	; 0x800e4b <cs+0x8e>
   15012:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x25ec>
   1501c:	0c 94 2f ba 	jmp	0x1745e	; 0x1745e <process_commands() [clone .part.46]+0x4a2a>
   15020:	0c f0       	brlt	.+2      	; 0x15024 <process_commands() [clone .part.46]+0x25f0>
   15022:	82 c0       	rjmp	.+260    	; 0x15128 <process_commands() [clone .part.46]+0x26f4>
   15024:	81 3d       	cpi	r24, 0xD1	; 209
   15026:	91 05       	cpc	r25, r1
   15028:	11 f4       	brne	.+4      	; 0x1502e <process_commands() [clone .part.46]+0x25fa>
   1502a:	0c 94 ec b9 	jmp	0x173d8	; 0x173d8 <process_commands() [clone .part.46]+0x49a4>
   1502e:	86 3d       	cpi	r24, 0xD6	; 214
   15030:	91 05       	cpc	r25, r1
   15032:	09 f0       	breq	.+2      	; 0x15036 <process_commands() [clone .part.46]+0x2602>
   15034:	41 cc       	rjmp	.-1918   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
            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 <code_seen(char) [clone .lto_priv.549]>
   1503c:	88 23       	and	r24, r24
   1503e:	11 f4       	brne	.+4      	; 0x15044 <process_commands() [clone .part.46]+0x2610>
   15040:	0c 94 1b ba 	jmp	0x17436	; 0x17436 <process_commands() [clone .part.46]+0x4a02>
   15044:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15052:	88 23       	and	r24, r24
   15054:	11 f4       	brne	.+4      	; 0x1505a <process_commands() [clone .part.46]+0x2626>
   15056:	0c 94 25 ba 	jmp	0x1744a	; 0x1744a <process_commands() [clone .part.46]+0x4a16>
   1505a:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15068:	d0 90 89 0e 	lds	r13, 0x0E89	; 0x800e89 <cs+0xcc>
   1506c:	88 23       	and	r24, r24
   1506e:	29 f0       	breq	.+10     	; 0x1507a <process_commands() [clone .part.46]+0x2646>
   15070:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15080:	e0 90 8a 0e 	lds	r14, 0x0E8A	; 0x800e8a <cs+0xcd>
   15084:	f0 90 8b 0e 	lds	r15, 0x0E8B	; 0x800e8b <cs+0xce>
   15088:	88 23       	and	r24, r24
   1508a:	29 f0       	breq	.+10     	; 0x15096 <process_commands() [clone .part.46]+0x2662>
   1508c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   1509c:	00 91 8c 0e 	lds	r16, 0x0E8C	; 0x800e8c <cs+0xcf>
   150a0:	10 91 8d 0e 	lds	r17, 0x0E8D	; 0x800e8d <cs+0xd0>
   150a4:	88 23       	and	r24, r24
   150a6:	29 f0       	breq	.+10     	; 0x150b2 <process_commands() [clone .part.46]+0x267e>
   150a8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x2694>
   150c4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x26aa>
   150da:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x26be>
   150ee:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        {
            // Should we display some error here?
            break;
        }

        cs.mm_per_arc_segment = p;
   150f2:	40 92 81 0e 	sts	0x0E81, r4	; 0x800e81 <cs+0xc4>
   150f6:	50 92 82 0e 	sts	0x0E82, r5	; 0x800e82 <cs+0xc5>
   150fa:	60 92 83 0e 	sts	0x0E83, r6	; 0x800e83 <cs+0xc6>
   150fe:	70 92 84 0e 	sts	0x0E84, r7	; 0x800e84 <cs+0xc7>
        cs.min_mm_per_arc_segment = s;
   15102:	80 92 85 0e 	sts	0x0E85, r8	; 0x800e85 <cs+0xc8>
   15106:	90 92 86 0e 	sts	0x0E86, r9	; 0x800e86 <cs+0xc9>
   1510a:	a0 92 87 0e 	sts	0x0E87, r10	; 0x800e87 <cs+0xca>
   1510e:	b0 92 88 0e 	sts	0x0E88, r11	; 0x800e88 <cs+0xcb>
        cs.n_arc_correction = n;
   15112:	d0 92 89 0e 	sts	0x0E89, r13	; 0x800e89 <cs+0xcc>
        cs.min_arc_segments = r;
   15116:	f0 92 8b 0e 	sts	0x0E8B, r15	; 0x800e8b <cs+0xce>
   1511a:	e0 92 8a 0e 	sts	0x0E8A, r14	; 0x800e8a <cs+0xcd>
        cs.arc_segments_per_sec = f;
   1511e:	10 93 8d 0e 	sts	0x0E8D, r17	; 0x800e8d <cs+0xd0>
   15122:	00 93 8c 0e 	sts	0x0E8C, r16	; 0x800e8c <cs+0xcf>
   15126:	ef c7       	rjmp	.+4062   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x26fe>
   1512e:	0c 94 80 ba 	jmp	0x17500	; 0x17500 <process_commands() [clone .part.46]+0x4acc>
   15132:	80 3f       	cpi	r24, 0xF0	; 240
   15134:	91 05       	cpc	r25, r1
   15136:	09 f4       	brne	.+2      	; 0x1513a <process_commands() [clone .part.46]+0x2706>
   15138:	e6 c7       	rjmp	.+4044   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   1513a:	8d 3d       	cpi	r24, 0xDD	; 221
   1513c:	91 05       	cpc	r25, r1
   1513e:	09 f0       	breq	.+2      	; 0x15142 <process_commands() [clone .part.46]+0x270e>
   15140:	bb cb       	rjmp	.-2186   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    #### 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 <code_seen(char) [clone .lto_priv.549]>
   15148:	88 23       	and	r24, r24
   1514a:	11 f4       	brne	.+4      	; 0x15150 <process_commands() [clone .part.46]+0x271c>
   1514c:	0c 94 6e ba 	jmp	0x174dc	; 0x174dc <process_commands() [clone .part.46]+0x4aa8>
        {
            extrudemultiply = code_value_short();
   15150:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   15154:	90 93 bd 02 	sts	0x02BD, r25	; 0x8002bd <extrudemultiply+0x1>
   15158:	80 93 bc 02 	sts	0x02BC, r24	; 0x8002bc <extrudemultiply>
            calculate_extruder_multipliers();
   1515c:	0e 94 51 65 	call	0xcaa2	; 0xcaa2 <calculate_extruder_multipliers()>
   15160:	d2 c7       	rjmp	.+4004   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x273a>
   1516a:	0c 94 b5 c9 	jmp	0x1936a	; 0x1936a <process_commands() [clone .part.46]+0x6936>
   1516e:	0c f0       	brlt	.+2      	; 0x15172 <process_commands() [clone .part.46]+0x273e>
   15170:	ec c2       	rjmp	.+1496   	; 0x1574a <process_commands() [clone .part.46]+0x2d16>
   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 <process_commands() [clone .part.46]+0x274a>
   1517a:	0c 94 e3 bb 	jmp	0x177c6	; 0x177c6 <process_commands() [clone .part.46]+0x4d92>
   1517e:	0c f0       	brlt	.+2      	; 0x15182 <process_commands() [clone .part.46]+0x274e>
   15180:	82 c0       	rjmp	.+260    	; 0x15286 <process_commands() [clone .part.46]+0x2852>
   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 <process_commands() [clone .part.46]+0x275a>
   1518a:	0c 94 d9 ba 	jmp	0x175b2	; 0x175b2 <process_commands() [clone .part.46]+0x4b7e>
   1518e:	8d 32       	cpi	r24, 0x2D	; 45
   15190:	91 40       	sbci	r25, 0x01	; 1
   15192:	09 f0       	breq	.+2      	; 0x15196 <process_commands() [clone .part.46]+0x2762>
   15194:	91 cb       	rjmp	.-2270   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   1519c:	88 23       	and	r24, r24
   1519e:	51 f0       	breq	.+20     	; 0x151b4 <process_commands() [clone .part.46]+0x2780>
   151a0:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   151a4:	60 93 25 0e 	sts	0x0E25, r22	; 0x800e25 <cs+0x68>
   151a8:	70 93 26 0e 	sts	0x0E26, r23	; 0x800e26 <cs+0x69>
   151ac:	80 93 27 0e 	sts	0x0E27, r24	; 0x800e27 <cs+0x6a>
   151b0:	90 93 28 0e 	sts	0x0E28, r25	; 0x800e28 <cs+0x6b>
        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 <code_seen(char) [clone .lto_priv.549]>
   151ba:	88 23       	and	r24, r24
   151bc:	81 f0       	breq	.+32     	; 0x151de <process_commands() [clone .part.46]+0x27aa>
   151be:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
#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 <cs+0x6c>
   151d2:	70 93 2a 0e 	sts	0x0E2A, r23	; 0x800e2a <cs+0x6d>
   151d6:	80 93 2b 0e 	sts	0x0E2B, r24	; 0x800e2b <cs+0x6e>
   151da:	90 93 2c 0e 	sts	0x0E2C, r25	; 0x800e2c <cs+0x6f>
        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 <code_seen(char) [clone .lto_priv.549]>
   151e4:	88 23       	and	r24, r24
   151e6:	81 f0       	breq	.+32     	; 0x15208 <process_commands() [clone .part.46]+0x27d4>
   151e8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
}

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 <cs+0x70>
   151fc:	70 93 2e 0e 	sts	0x0E2E, r23	; 0x800e2e <cs+0x71>
   15200:	80 93 2f 0e 	sts	0x0E2F, r24	; 0x800e2f <cs+0x72>
   15204:	90 93 30 0e 	sts	0x0E30, r25	; 0x800e30 <cs+0x73>

        updatePID();
   15208:	0f 94 ab 3b 	call	0x27756	; 0x27756 <updatePID()>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   1521c:	60 91 25 0e 	lds	r22, 0x0E25	; 0x800e25 <cs+0x68>
   15220:	70 91 26 0e 	lds	r23, 0x0E26	; 0x800e26 <cs+0x69>
   15224:	80 91 27 0e 	lds	r24, 0x0E27	; 0x800e27 <cs+0x6a>
   15228:	90 91 28 0e 	lds	r25, 0x0E28	; 0x800e28 <cs+0x6b>
   1522c:	42 e0       	ldi	r20, 0x02	; 2
   1522e:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
        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 <serialprintPGM(char const*)>
   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 <cs+0x6c>
   15246:	70 91 2a 0e 	lds	r23, 0x0E2A	; 0x800e2a <cs+0x6d>
   1524a:	80 91 2b 0e 	lds	r24, 0x0E2B	; 0x800e2b <cs+0x6e>
   1524e:	90 91 2c 0e 	lds	r25, 0x0E2C	; 0x800e2c <cs+0x6f>
   15252:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
   15256:	42 e0       	ldi	r20, 0x02	; 2
   15258:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
        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 <serialprintPGM(char const*)>
#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 <cs+0x70>
   15270:	70 91 2e 0e 	lds	r23, 0x0E2E	; 0x800e2e <cs+0x71>
   15274:	80 91 2f 0e 	lds	r24, 0x0E2F	; 0x800e2f <cs+0x72>
   15278:	90 91 30 0e 	lds	r25, 0x0E30	; 0x800e30 <cs+0x73>
   1527c:	0f 94 dd d6 	call	0x3adba	; 0x3adba <__mulsf3>
        SERIAL_PROTOCOLLN(unscalePID_d(cs.Kd));
   15280:	0f 94 ab 75 	call	0x2eb56	; 0x2eb56 <MarlinSerial::println(double, int) [clone .constprop.367]>
   15284:	40 c7       	rjmp	.+3712   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x285e>
   1528e:	0c 94 0c bb 	jmp	0x17618	; 0x17618 <process_commands() [clone .part.46]+0x4be4>
   15292:	14 f4       	brge	.+4      	; 0x15298 <process_commands() [clone .part.46]+0x2864>
   15294:	0c 94 f3 bb 	jmp	0x177e6	; 0x177e6 <process_commands() [clone .part.46]+0x4db2>
   15298:	86 33       	cpi	r24, 0x36	; 54
   1529a:	91 40       	sbci	r25, 0x01	; 1
   1529c:	09 f0       	breq	.+2      	; 0x152a0 <process_commands() [clone .part.46]+0x286c>
   1529e:	0c cb       	rjmp	.-2536   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    {
        // 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 <code_seen(char) [clone .lto_priv.549]>
   152a6:	88 23       	and	r24, r24
   152a8:	11 f4       	brne	.+4      	; 0x152ae <process_commands() [clone .part.46]+0x287a>
   152aa:	0c 94 26 bc 	jmp	0x1784c	; 0x1784c <process_commands() [clone .part.46]+0x4e18>
   152ae:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
   152be:	88 23       	and	r24, r24
   152c0:	11 f4       	brne	.+4      	; 0x152c6 <process_commands() [clone .part.46]+0x2892>
   152c2:	0c 94 2c bc 	jmp	0x17858	; 0x17858 <process_commands() [clone .part.46]+0x4e24>
   152c6:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
    - `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 <process_commands() [clone .part.46]+0x28c0>
   152ec:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   152fa:	88 23       	and	r24, r24
   152fc:	11 f4       	brne	.+4      	; 0x15302 <process_commands() [clone .part.46]+0x28ce>
   152fe:	0c 94 38 bc 	jmp	0x17870	; 0x17870 <process_commands() [clone .part.46]+0x4e3c>
   15302:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15318:	88 23       	and	r24, r24
   1531a:	11 f4       	brne	.+4      	; 0x15320 <process_commands() [clone .part.46]+0x28ec>
   1531c:	0c 94 44 bc 	jmp	0x17888	; 0x17888 <process_commands() [clone .part.46]+0x4e54>
   15320:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15336:	88 23       	and	r24, r24
   15338:	11 f4       	brne	.+4      	; 0x1533e <process_commands() [clone .part.46]+0x290a>
   1533a:	0c 94 50 bc 	jmp	0x178a0	; 0x178a0 <process_commands() [clone .part.46]+0x4e6c>
   1533e:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15354:	88 23       	and	r24, r24
   15356:	11 f4       	brne	.+4      	; 0x1535c <process_commands() [clone .part.46]+0x2928>
   15358:	0c 94 5c bc 	jmp	0x178b8	; 0x178b8 <process_commands() [clone .part.46]+0x4e84>
   1535c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
    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 <process_commands() [clone .part.46]+0x294c>
   1537a:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15386:	88 23       	and	r24, r24
   15388:	11 f4       	brne	.+4      	; 0x1538e <process_commands() [clone .part.46]+0x295a>
   1538a:	0c 94 68 bc 	jmp	0x178d0	; 0x178d0 <process_commands() [clone .part.46]+0x4e9c>
   1538e:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
   1539e:	88 23       	and	r24, r24
   153a0:	11 f4       	brne	.+4      	; 0x153a6 <process_commands() [clone .part.46]+0x2972>
   153a2:	0c 94 6e bc 	jmp	0x178dc	; 0x178dc <process_commands() [clone .part.46]+0x4ea8>
   153a6:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
   153b6:	88 23       	and	r24, r24
   153b8:	11 f4       	brne	.+4      	; 0x153be <process_commands() [clone .part.46]+0x298a>
   153ba:	0c 94 74 bc 	jmp	0x178e8	; 0x178e8 <process_commands() [clone .part.46]+0x4eb4>
   153be:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
    - `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 <process_commands() [clone .part.46]+0x29b8>
   153e4:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
    - `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 <process_commands() [clone .part.46]+0x29d6>
   15402:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
    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 <process_commands() [clone .part.46]+0x29ec>
   1541a:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15426:	88 23       	and	r24, r24
   15428:	11 f4       	brne	.+4      	; 0x1542e <process_commands() [clone .part.46]+0x29fa>
   1542a:	0c 94 80 bc 	jmp	0x17900	; 0x17900 <process_commands() [clone .part.46]+0x4ecc>
   1542e:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <process_commands() [clone .part.46]+0x2a20>
   15450:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2a34>
   15464:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2a50>
   15480:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2a6c>
   1549c:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2a88>
   154b8:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2aa4>
   154d4:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2ac0>
   154f0:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2ad4>
   15504:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2ae8>
   15518:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
        && 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 <process_commands() [clone .part.46]+0x2af6>
   15526:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2b04>
   15534:	0c 94 8a bc 	jmp	0x17914	; 0x17914 <process_commands() [clone .part.46]+0x4ee0>
   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 <process_commands() [clone .part.46]+0x2b12>
   15542:	0c 94 8f bc 	jmp	0x1791e	; 0x1791e <process_commands() [clone .part.46]+0x4eea>
   15546:	37 fc       	sbrc	r3, 7
   15548:	02 c0       	rjmp	.+4      	; 0x1554e <process_commands() [clone .part.46]+0x2b1a>
   1554a:	0c 94 da bc 	jmp	0x179b4	; 0x179b4 <process_commands() [clone .part.46]+0x4f80>
   1554e:	17 ff       	sbrs	r17, 7
   15550:	02 c0       	rjmp	.+4      	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   15552:	0c 94 86 bc 	jmp	0x1790c	; 0x1790c <process_commands() [clone .part.46]+0x4ed8>
    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 <TempMgrGuard::TempMgrGuard()>

    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 <process_commands() [clone .part.46]+0x2b3e>
   1556e:	0c 94 7e bd 	jmp	0x17afc	; 0x17afc <process_commands() [clone .part.46]+0x50c8>
    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 <process_commands() [clone .part.46]+0x2b72>
   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 <process_commands() [clone .part.46]+0x2ba6>
   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 <process_commands() [clone .part.46]+0x2bf4>
   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 <process_commands() [clone .part.46]+0x2bf4>
   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 <process_commands() [clone .part.46]+0x2c28>
   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 <process_commands() [clone .part.46]+0x2c32>
   15660:	c8 01       	movw	r24, r16
   15662:	0f 94 5e 2f 	call	0x25ebc	; 0x25ebc <thermal_model_set_lag(unsigned int) [clone .lto_priv.556]>
    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 <process_commands() [clone .part.46]+0x2c66>
   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 <process_commands() [clone .part.46]+0x2c98>
   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 <process_commands() [clone .part.46]+0x2c98>
   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 <process_commands() [clone .part.46]+0x2cca>
   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 <process_commands() [clone .part.46]+0x2cca>
   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 <process_commands() [clone .part.46]+0x2d06>
        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::setup() [clone .lto_priv.555]>
    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 <TempMgrGuard::~TempMgrGuard()>
   15746:	0c 94 00 bd 	jmp	0x17a00	; 0x17a00 <process_commands() [clone .part.46]+0x4fcc>
	  } 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 <process_commands() [clone .part.46]+0x2d22>
   15752:	0c 94 f6 bf 	jmp	0x17fec	; 0x17fec <process_commands() [clone .part.46]+0x55b8>
   15756:	2c f5       	brge	.+74     	; 0x157a2 <process_commands() [clone .part.46]+0x2d6e>
   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 <process_commands() [clone .part.46]+0x2d30>
   15760:	0c 94 f2 bf 	jmp	0x17fe4	; 0x17fe4 <process_commands() [clone .part.46]+0x55b0>
   15764:	83 39       	cpi	r24, 0x93	; 147
   15766:	91 40       	sbci	r25, 0x01	; 1
   15768:	09 f0       	breq	.+2      	; 0x1576c <process_commands() [clone .part.46]+0x2d38>
   1576a:	a6 c8       	rjmp	.-3764   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    */
    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 <MMU2::mmu2+0x6f>
   15770:	81 30       	cpi	r24, 0x01	; 1
   15772:	09 f0       	breq	.+2      	; 0x15776 <process_commands() [clone .part.46]+0x2d42>
   15774:	c8 c4       	rjmp	.+2448   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		{
			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 <code_seen(char) [clone .lto_priv.549]>
   1577c:	81 11       	cpse	r24, r1
   1577e:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
			if(code_seen('F')) filament = code_value_uint8();
   15782:	86 e4       	ldi	r24, 0x46	; 70
   15784:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   15788:	81 11       	cpse	r24, r1
   1578a:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
    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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   15792:	88 23       	and	r24, r24
   15794:	09 f4       	brne	.+2      	; 0x15798 <process_commands() [clone .part.46]+0x2d64>
   15796:	b7 c4       	rjmp	.+2414   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    //    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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   157a0:	b2 c4       	rjmp	.+2404   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2d7a>
   157aa:	0c 94 fb bf 	jmp	0x17ff6	; 0x17ff6 <process_commands() [clone .part.46]+0x55c2>
   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 <process_commands() [clone .part.46]+0x2d86>
   157b6:	0c 94 ff bf 	jmp	0x17ffe	; 0x17ffe <process_commands() [clone .part.46]+0x55ca>
   157ba:	86 39       	cpi	r24, 0x96	; 150
   157bc:	91 40       	sbci	r25, 0x01	; 1
   157be:	09 f0       	breq	.+2      	; 0x157c2 <process_commands() [clone .part.46]+0x2d8e>
   157c0:	7b c8       	rjmp	.-3850   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

    */

    case 406: // M406 Disable Filament Sensor
    {
        fsensor.setEnabled(0);
   157c2:	80 e0       	ldi	r24, 0x00	; 0
   157c4:	0e 94 67 74 	call	0xe8ce	; 0xe8ce <Filament_sensor::setEnabled(bool)>
   157c8:	9e c4       	rjmp	.+2364   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x2da2>
   157d2:	0c 94 39 cb 	jmp	0x19672	; 0x19672 <process_commands() [clone .part.46]+0x6c3e>
   157d6:	0c f0       	brlt	.+2      	; 0x157da <process_commands() [clone .part.46]+0x2da6>
   157d8:	e3 c3       	rjmp	.+1990   	; 0x15fa0 <process_commands() [clone .part.46]+0x356c>
   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 <process_commands() [clone .part.46]+0x2db2>
   157e2:	0c 94 30 c4 	jmp	0x18860	; 0x18860 <process_commands() [clone .part.46]+0x5e2c>
   157e6:	0c f0       	brlt	.+2      	; 0x157ea <process_commands() [clone .part.46]+0x2db6>
   157e8:	76 c3       	rjmp	.+1772   	; 0x15ed6 <process_commands() [clone .part.46]+0x34a2>
   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 <process_commands() [clone .part.46]+0x2dc2>
   157f2:	0c 94 19 c0 	jmp	0x18032	; 0x18032 <process_commands() [clone .part.46]+0x55fe>
   157f6:	0c f0       	brlt	.+2      	; 0x157fa <process_commands() [clone .part.46]+0x2dc6>
   157f8:	2e c3       	rjmp	.+1628   	; 0x15e56 <process_commands() [clone .part.46]+0x3422>
   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 <process_commands() [clone .part.46]+0x2dd2>
   15802:	0c 94 07 c0 	jmp	0x1800e	; 0x1800e <process_commands() [clone .part.46]+0x55da>
   15806:	87 3f       	cpi	r24, 0xF7	; 247
   15808:	91 40       	sbci	r25, 0x01	; 1
   1580a:	09 f0       	breq	.+2      	; 0x1580e <process_commands() [clone .part.46]+0x2dda>
   1580c:	55 c8       	rjmp	.-3926   	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

#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 <cs+0x63>
   15812:	8f 93       	push	r24
   15814:	80 91 1f 0e 	lds	r24, 0x0E1F	; 0x800e1f <cs+0x62>
   15818:	8f 93       	push	r24
   1581a:	80 91 1e 0e 	lds	r24, 0x0E1E	; 0x800e1e <cs+0x61>
   1581e:	8f 93       	push	r24
   15820:	80 91 1d 0e 	lds	r24, 0x0E1D	; 0x800e1d <cs+0x60>
   15824:	8f 93       	push	r24
   15826:	80 91 1c 0e 	lds	r24, 0x0E1C	; 0x800e1c <cs+0x5f>
   1582a:	8f 93       	push	r24
   1582c:	80 91 1b 0e 	lds	r24, 0x0E1B	; 0x800e1b <cs+0x5e>
   15830:	8f 93       	push	r24
   15832:	80 91 1a 0e 	lds	r24, 0x0E1A	; 0x800e1a <cs+0x5d>
   15836:	8f 93       	push	r24
   15838:	80 91 19 0e 	lds	r24, 0x0E19	; 0x800e19 <cs+0x5c>
   1583c:	8f 93       	push	r24
   1583e:	80 91 18 0e 	lds	r24, 0x0E18	; 0x800e18 <cs+0x5b>
   15842:	8f 93       	push	r24
   15844:	80 91 17 0e 	lds	r24, 0x0E17	; 0x800e17 <cs+0x5a>
   15848:	8f 93       	push	r24
   1584a:	80 91 16 0e 	lds	r24, 0x0E16	; 0x800e16 <cs+0x59>
   1584e:	8f 93       	push	r24
   15850:	80 91 15 0e 	lds	r24, 0x0E15	; 0x800e15 <cs+0x58>
   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 <cs+0x57>
   15866:	8f 93       	push	r24
   15868:	80 91 13 0e 	lds	r24, 0x0E13	; 0x800e13 <cs+0x56>
   1586c:	8f 93       	push	r24
   1586e:	80 91 12 0e 	lds	r24, 0x0E12	; 0x800e12 <cs+0x55>
   15872:	8f 93       	push	r24
   15874:	80 91 11 0e 	lds	r24, 0x0E11	; 0x800e11 <cs+0x54>
   15878:	8f 93       	push	r24
   1587a:	80 91 10 0e 	lds	r24, 0x0E10	; 0x800e10 <cs+0x53>
   1587e:	8f 93       	push	r24
   15880:	80 91 0f 0e 	lds	r24, 0x0E0F	; 0x800e0f <cs+0x52>
   15884:	8f 93       	push	r24
   15886:	80 91 0e 0e 	lds	r24, 0x0E0E	; 0x800e0e <cs+0x51>
   1588a:	8f 93       	push	r24
   1588c:	80 91 0d 0e 	lds	r24, 0x0E0D	; 0x800e0d <cs+0x50>
   15890:	8f 93       	push	r24
   15892:	80 91 0c 0e 	lds	r24, 0x0E0C	; 0x800e0c <cs+0x4f>
   15896:	8f 93       	push	r24
   15898:	80 91 0b 0e 	lds	r24, 0x0E0B	; 0x800e0b <cs+0x4e>
   1589c:	8f 93       	push	r24
   1589e:	80 91 0a 0e 	lds	r24, 0x0E0A	; 0x800e0a <cs+0x4d>
   158a2:	8f 93       	push	r24
   158a4:	80 91 09 0e 	lds	r24, 0x0E09	; 0x800e09 <cs+0x4c>
   158a8:	8f 93       	push	r24
   158aa:	80 91 08 0e 	lds	r24, 0x0E08	; 0x800e08 <cs+0x4b>
   158ae:	8f 93       	push	r24
   158b0:	80 91 07 0e 	lds	r24, 0x0E07	; 0x800e07 <cs+0x4a>
   158b4:	8f 93       	push	r24
   158b6:	80 91 06 0e 	lds	r24, 0x0E06	; 0x800e06 <cs+0x49>
   158ba:	8f 93       	push	r24
   158bc:	80 91 05 0e 	lds	r24, 0x0E05	; 0x800e05 <cs+0x48>
   158c0:	8f 93       	push	r24
   158c2:	80 91 04 0e 	lds	r24, 0x0E04	; 0x800e04 <cs+0x47>
   158c6:	8f 93       	push	r24
   158c8:	80 91 03 0e 	lds	r24, 0x0E03	; 0x800e03 <cs+0x46>
   158cc:	8f 93       	push	r24
   158ce:	80 91 02 0e 	lds	r24, 0x0E02	; 0x800e02 <cs+0x45>
   158d2:	8f 93       	push	r24
   158d4:	80 91 01 0e 	lds	r24, 0x0E01	; 0x800e01 <cs+0x44>
   158d8:	8f 93       	push	r24
   158da:	80 91 00 0e 	lds	r24, 0x0E00	; 0x800e00 <cs+0x43>
   158de:	8f 93       	push	r24
   158e0:	80 91 ff 0d 	lds	r24, 0x0DFF	; 0x800dff <cs+0x42>
   158e4:	8f 93       	push	r24
   158e6:	80 91 fe 0d 	lds	r24, 0x0DFE	; 0x800dfe <cs+0x41>
   158ea:	8f 93       	push	r24
   158ec:	80 91 fd 0d 	lds	r24, 0x0DFD	; 0x800dfd <cs+0x40>
   158f0:	8f 93       	push	r24
   158f2:	80 91 fc 0d 	lds	r24, 0x0DFC	; 0x800dfc <cs+0x3f>
   158f6:	8f 93       	push	r24
   158f8:	80 91 fb 0d 	lds	r24, 0x0DFB	; 0x800dfb <cs+0x3e>
   158fc:	8f 93       	push	r24
   158fe:	80 91 fa 0d 	lds	r24, 0x0DFA	; 0x800dfa <cs+0x3d>
   15902:	8f 93       	push	r24
   15904:	80 91 f9 0d 	lds	r24, 0x0DF9	; 0x800df9 <cs+0x3c>
   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 <cs+0xc3>
   15916:	8f 93       	push	r24
   15918:	80 91 7f 0e 	lds	r24, 0x0E7F	; 0x800e7f <cs+0xc2>
   1591c:	8f 93       	push	r24
   1591e:	80 91 7e 0e 	lds	r24, 0x0E7E	; 0x800e7e <cs+0xc1>
   15922:	8f 93       	push	r24
   15924:	80 91 7d 0e 	lds	r24, 0x0E7D	; 0x800e7d <cs+0xc0>
   15928:	8f 93       	push	r24
   1592a:	80 91 f8 0d 	lds	r24, 0x0DF8	; 0x800df8 <cs+0x3b>
   1592e:	8f 93       	push	r24
   15930:	80 91 f7 0d 	lds	r24, 0x0DF7	; 0x800df7 <cs+0x3a>
   15934:	8f 93       	push	r24
   15936:	80 91 f6 0d 	lds	r24, 0x0DF6	; 0x800df6 <cs+0x39>
   1593a:	8f 93       	push	r24
   1593c:	80 91 f5 0d 	lds	r24, 0x0DF5	; 0x800df5 <cs+0x38>
   15940:	8f 93       	push	r24
   15942:	80 91 f4 0d 	lds	r24, 0x0DF4	; 0x800df4 <cs+0x37>
   15946:	8f 93       	push	r24
   15948:	80 91 f3 0d 	lds	r24, 0x0DF3	; 0x800df3 <cs+0x36>
   1594c:	8f 93       	push	r24
   1594e:	80 91 f2 0d 	lds	r24, 0x0DF2	; 0x800df2 <cs+0x35>
   15952:	8f 93       	push	r24
   15954:	80 91 f1 0d 	lds	r24, 0x0DF1	; 0x800df1 <cs+0x34>
   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 <cs+0xbb>
   15966:	8f 93       	push	r24
   15968:	80 91 77 0e 	lds	r24, 0x0E77	; 0x800e77 <cs+0xba>
   1596c:	8f 93       	push	r24
   1596e:	80 91 76 0e 	lds	r24, 0x0E76	; 0x800e76 <cs+0xb9>
   15972:	8f 93       	push	r24
   15974:	80 91 75 0e 	lds	r24, 0x0E75	; 0x800e75 <cs+0xb8>
   15978:	8f 93       	push	r24
   1597a:	80 91 74 0e 	lds	r24, 0x0E74	; 0x800e74 <cs+0xb7>
   1597e:	8f 93       	push	r24
   15980:	80 91 73 0e 	lds	r24, 0x0E73	; 0x800e73 <cs+0xb6>
   15984:	8f 93       	push	r24
   15986:	80 91 72 0e 	lds	r24, 0x0E72	; 0x800e72 <cs+0xb5>
   1598a:	8f 93       	push	r24
   1598c:	80 91 71 0e 	lds	r24, 0x0E71	; 0x800e71 <cs+0xb4>
   15990:	8f 93       	push	r24
   15992:	80 91 70 0e 	lds	r24, 0x0E70	; 0x800e70 <cs+0xb3>
   15996:	8f 93       	push	r24
   15998:	80 91 6f 0e 	lds	r24, 0x0E6F	; 0x800e6f <cs+0xb2>
   1599c:	8f 93       	push	r24
   1599e:	80 91 6e 0e 	lds	r24, 0x0E6E	; 0x800e6e <cs+0xb1>
   159a2:	8f 93       	push	r24
   159a4:	80 91 6d 0e 	lds	r24, 0x0E6D	; 0x800e6d <cs+0xb0>
   159a8:	8f 93       	push	r24
   159aa:	80 91 6c 0e 	lds	r24, 0x0E6C	; 0x800e6c <cs+0xaf>
   159ae:	8f 93       	push	r24
   159b0:	80 91 6b 0e 	lds	r24, 0x0E6B	; 0x800e6b <cs+0xae>
   159b4:	8f 93       	push	r24
   159b6:	80 91 6a 0e 	lds	r24, 0x0E6A	; 0x800e6a <cs+0xad>
   159ba:	8f 93       	push	r24
   159bc:	80 91 69 0e 	lds	r24, 0x0E69	; 0x800e69 <cs+0xac>
   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 <cs+0x33>
   159ce:	8f 93       	push	r24
   159d0:	80 91 ef 0d 	lds	r24, 0x0DEF	; 0x800def <cs+0x32>
   159d4:	8f 93       	push	r24
   159d6:	80 91 ee 0d 	lds	r24, 0x0DEE	; 0x800dee <cs+0x31>
   159da:	8f 93       	push	r24
   159dc:	80 91 ed 0d 	lds	r24, 0x0DED	; 0x800ded <cs+0x30>
   159e0:	8f 93       	push	r24
   159e2:	80 91 ec 0d 	lds	r24, 0x0DEC	; 0x800dec <cs+0x2f>
   159e6:	8f 93       	push	r24
   159e8:	80 91 eb 0d 	lds	r24, 0x0DEB	; 0x800deb <cs+0x2e>
   159ec:	8f 93       	push	r24
   159ee:	80 91 ea 0d 	lds	r24, 0x0DEA	; 0x800dea <cs+0x2d>
   159f2:	8f 93       	push	r24
   159f4:	80 91 e9 0d 	lds	r24, 0x0DE9	; 0x800de9 <cs+0x2c>
   159f8:	8f 93       	push	r24
   159fa:	80 91 e8 0d 	lds	r24, 0x0DE8	; 0x800de8 <cs+0x2b>
   159fe:	8f 93       	push	r24
   15a00:	80 91 e7 0d 	lds	r24, 0x0DE7	; 0x800de7 <cs+0x2a>
   15a04:	8f 93       	push	r24
   15a06:	80 91 e6 0d 	lds	r24, 0x0DE6	; 0x800de6 <cs+0x29>
   15a0a:	8f 93       	push	r24
   15a0c:	80 91 e5 0d 	lds	r24, 0x0DE5	; 0x800de5 <cs+0x28>
   15a10:	8f 93       	push	r24
   15a12:	80 91 e4 0d 	lds	r24, 0x0DE4	; 0x800de4 <cs+0x27>
   15a16:	8f 93       	push	r24
   15a18:	80 91 e3 0d 	lds	r24, 0x0DE3	; 0x800de3 <cs+0x26>
   15a1c:	8f 93       	push	r24
   15a1e:	80 91 e2 0d 	lds	r24, 0x0DE2	; 0x800de2 <cs+0x25>
   15a22:	8f 93       	push	r24
   15a24:	80 91 e1 0d 	lds	r24, 0x0DE1	; 0x800de1 <cs+0x24>
   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 <cs+0xab>
   15a36:	8f 93       	push	r24
   15a38:	80 91 67 0e 	lds	r24, 0x0E67	; 0x800e67 <cs+0xaa>
   15a3c:	8f 93       	push	r24
   15a3e:	80 91 66 0e 	lds	r24, 0x0E66	; 0x800e66 <cs+0xa9>
   15a42:	8f 93       	push	r24
   15a44:	80 91 65 0e 	lds	r24, 0x0E65	; 0x800e65 <cs+0xa8>
   15a48:	8f 93       	push	r24
   15a4a:	80 91 64 0e 	lds	r24, 0x0E64	; 0x800e64 <cs+0xa7>
   15a4e:	8f 93       	push	r24
   15a50:	80 91 63 0e 	lds	r24, 0x0E63	; 0x800e63 <cs+0xa6>
   15a54:	8f 93       	push	r24
   15a56:	80 91 62 0e 	lds	r24, 0x0E62	; 0x800e62 <cs+0xa5>
   15a5a:	8f 93       	push	r24
   15a5c:	80 91 61 0e 	lds	r24, 0x0E61	; 0x800e61 <cs+0xa4>
   15a60:	8f 93       	push	r24
   15a62:	80 91 60 0e 	lds	r24, 0x0E60	; 0x800e60 <cs+0xa3>
   15a66:	8f 93       	push	r24
   15a68:	80 91 5f 0e 	lds	r24, 0x0E5F	; 0x800e5f <cs+0xa2>
   15a6c:	8f 93       	push	r24
   15a6e:	80 91 5e 0e 	lds	r24, 0x0E5E	; 0x800e5e <cs+0xa1>
   15a72:	8f 93       	push	r24
   15a74:	80 91 5d 0e 	lds	r24, 0x0E5D	; 0x800e5d <cs+0xa0>
   15a78:	8f 93       	push	r24
   15a7a:	80 91 5c 0e 	lds	r24, 0x0E5C	; 0x800e5c <cs+0x9f>
   15a7e:	8f 93       	push	r24
   15a80:	80 91 5b 0e 	lds	r24, 0x0E5B	; 0x800e5b <cs+0x9e>
   15a84:	8f 93       	push	r24
   15a86:	80 91 5a 0e 	lds	r24, 0x0E5A	; 0x800e5a <cs+0x9d>
   15a8a:	8f 93       	push	r24
   15a8c:	80 91 59 0e 	lds	r24, 0x0E59	; 0x800e59 <cs+0x9c>
   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 <cs+0x23>
   15a9e:	8f 93       	push	r24
   15aa0:	80 91 df 0d 	lds	r24, 0x0DDF	; 0x800ddf <cs+0x22>
   15aa4:	8f 93       	push	r24
   15aa6:	80 91 de 0d 	lds	r24, 0x0DDE	; 0x800dde <cs+0x21>
   15aaa:	8f 93       	push	r24
   15aac:	80 91 dd 0d 	lds	r24, 0x0DDD	; 0x800ddd <cs+0x20>
   15ab0:	8f 93       	push	r24
   15ab2:	80 91 dc 0d 	lds	r24, 0x0DDC	; 0x800ddc <cs+0x1f>
   15ab6:	8f 93       	push	r24
   15ab8:	80 91 db 0d 	lds	r24, 0x0DDB	; 0x800ddb <cs+0x1e>
   15abc:	8f 93       	push	r24
   15abe:	80 91 da 0d 	lds	r24, 0x0DDA	; 0x800dda <cs+0x1d>
   15ac2:	8f 93       	push	r24
   15ac4:	80 91 d9 0d 	lds	r24, 0x0DD9	; 0x800dd9 <cs+0x1c>
   15ac8:	8f 93       	push	r24
   15aca:	80 91 d8 0d 	lds	r24, 0x0DD8	; 0x800dd8 <cs+0x1b>
   15ace:	8f 93       	push	r24
   15ad0:	80 91 d7 0d 	lds	r24, 0x0DD7	; 0x800dd7 <cs+0x1a>
   15ad4:	8f 93       	push	r24
   15ad6:	80 91 d6 0d 	lds	r24, 0x0DD6	; 0x800dd6 <cs+0x19>
   15ada:	8f 93       	push	r24
   15adc:	80 91 d5 0d 	lds	r24, 0x0DD5	; 0x800dd5 <cs+0x18>
   15ae0:	8f 93       	push	r24
   15ae2:	80 91 d4 0d 	lds	r24, 0x0DD4	; 0x800dd4 <cs+0x17>
   15ae6:	8f 93       	push	r24
   15ae8:	80 91 d3 0d 	lds	r24, 0x0DD3	; 0x800dd3 <cs+0x16>
   15aec:	8f 93       	push	r24
   15aee:	80 91 d2 0d 	lds	r24, 0x0DD2	; 0x800dd2 <cs+0x15>
   15af2:	8f 93       	push	r24
   15af4:	80 91 d1 0d 	lds	r24, 0x0DD1	; 0x800dd1 <cs+0x14>
   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 <cs+0xbf>
   15b06:	1f 92       	push	r1
   15b08:	8f 93       	push	r24
   15b0a:	80 91 7b 0e 	lds	r24, 0x0E7B	; 0x800e7b <cs+0xbe>
   15b0e:	1f 92       	push	r1
   15b10:	8f 93       	push	r24
   15b12:	80 91 7a 0e 	lds	r24, 0x0E7A	; 0x800e7a <cs+0xbd>
   15b16:	1f 92       	push	r1
   15b18:	8f 93       	push	r24
   15b1a:	80 91 79 0e 	lds	r24, 0x0E79	; 0x800e79 <cs+0xbc>
   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 <cs+0x13>
   15b2e:	8f 93       	push	r24
   15b30:	80 91 cf 0d 	lds	r24, 0x0DCF	; 0x800dcf <cs+0x12>
   15b34:	8f 93       	push	r24
   15b36:	80 91 ce 0d 	lds	r24, 0x0DCE	; 0x800dce <cs+0x11>
   15b3a:	8f 93       	push	r24
   15b3c:	80 91 cd 0d 	lds	r24, 0x0DCD	; 0x800dcd <cs+0x10>
   15b40:	8f 93       	push	r24
   15b42:	80 91 cc 0d 	lds	r24, 0x0DCC	; 0x800dcc <cs+0xf>
   15b46:	8f 93       	push	r24
   15b48:	80 91 cb 0d 	lds	r24, 0x0DCB	; 0x800dcb <cs+0xe>
   15b4c:	8f 93       	push	r24
   15b4e:	80 91 ca 0d 	lds	r24, 0x0DCA	; 0x800dca <cs+0xd>
   15b52:	8f 93       	push	r24
   15b54:	80 91 c9 0d 	lds	r24, 0x0DC9	; 0x800dc9 <cs+0xc>
   15b58:	8f 93       	push	r24
   15b5a:	80 91 c8 0d 	lds	r24, 0x0DC8	; 0x800dc8 <cs+0xb>
   15b5e:	8f 93       	push	r24
   15b60:	80 91 c7 0d 	lds	r24, 0x0DC7	; 0x800dc7 <cs+0xa>
   15b64:	8f 93       	push	r24
   15b66:	80 91 c6 0d 	lds	r24, 0x0DC6	; 0x800dc6 <cs+0x9>
   15b6a:	8f 93       	push	r24
   15b6c:	80 91 c5 0d 	lds	r24, 0x0DC5	; 0x800dc5 <cs+0x8>
   15b70:	8f 93       	push	r24
   15b72:	80 91 c4 0d 	lds	r24, 0x0DC4	; 0x800dc4 <cs+0x7>
   15b76:	8f 93       	push	r24
   15b78:	80 91 c3 0d 	lds	r24, 0x0DC3	; 0x800dc3 <cs+0x6>
   15b7c:	8f 93       	push	r24
   15b7e:	80 91 c2 0d 	lds	r24, 0x0DC2	; 0x800dc2 <cs+0x5>
   15b82:	8f 93       	push	r24
   15b84:	80 91 c1 0d 	lds	r24, 0x0DC1	; 0x800dc1 <cs+0x4>
   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 <printf_P>
		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 <cs+0x70>
   15bb4:	70 91 2e 0e 	lds	r23, 0x0E2E	; 0x800e2e <cs+0x71>
   15bb8:	80 91 2f 0e 	lds	r24, 0x0E2F	; 0x800e2f <cs+0x72>
   15bbc:	90 91 30 0e 	lds	r25, 0x0E30	; 0x800e30 <cs+0x73>
   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 <cs+0x6c>
   15bd8:	70 91 2a 0e 	lds	r23, 0x0E2A	; 0x800e2a <cs+0x6d>
   15bdc:	80 91 2b 0e 	lds	r24, 0x0E2B	; 0x800e2b <cs+0x6e>
   15be0:	90 91 2c 0e 	lds	r25, 0x0E2C	; 0x800e2c <cs+0x6f>
   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 <cs+0x6b>
   15bf4:	8f 93       	push	r24
   15bf6:	80 91 27 0e 	lds	r24, 0x0E27	; 0x800e27 <cs+0x6a>
   15bfa:	8f 93       	push	r24
   15bfc:	80 91 26 0e 	lds	r24, 0x0E26	; 0x800e26 <cs+0x69>
   15c00:	8f 93       	push	r24
   15c02:	80 91 25 0e 	lds	r24, 0x0E25	; 0x800e25 <cs+0x68>
   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 <printf_P>
#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 <cs+0x7c>
   15c28:	70 91 3a 0e 	lds	r23, 0x0E3A	; 0x800e3a <cs+0x7d>
   15c2c:	80 91 3b 0e 	lds	r24, 0x0E3B	; 0x800e3b <cs+0x7e>
   15c30:	90 91 3c 0e 	lds	r25, 0x0E3C	; 0x800e3c <cs+0x7f>
   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 <cs+0x78>
   15c4c:	70 91 36 0e 	lds	r23, 0x0E36	; 0x800e36 <cs+0x79>
   15c50:	80 91 37 0e 	lds	r24, 0x0E37	; 0x800e37 <cs+0x7a>
   15c54:	90 91 38 0e 	lds	r25, 0x0E38	; 0x800e38 <cs+0x7b>
   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 <cs+0x77>
   15c68:	8f 93       	push	r24
   15c6a:	80 91 33 0e 	lds	r24, 0x0E33	; 0x800e33 <cs+0x76>
   15c6e:	8f 93       	push	r24
   15c70:	80 91 32 0e 	lds	r24, 0x0E32	; 0x800e32 <cs+0x75>
   15c74:	8f 93       	push	r24
   15c76:	80 91 31 0e 	lds	r24, 0x0E31	; 0x800e31 <cs+0x74>
   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 <printf_P>
    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 <cs+0x82>
   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 <cs+0x93>
   15cb6:	70 91 51 0e 	lds	r23, 0x0E51	; 0x800e51 <cs+0x94>
   15cba:	80 91 52 0e 	lds	r24, 0x0E52	; 0x800e52 <cs+0x95>
   15cbe:	90 91 53 0e 	lds	r25, 0x0E53	; 0x800e53 <cs+0x96>
   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 <cs+0x92>
   15cd2:	8f 93       	push	r24
   15cd4:	80 91 4e 0e 	lds	r24, 0x0E4E	; 0x800e4e <cs+0x91>
   15cd8:	8f 93       	push	r24
   15cda:	80 91 4d 0e 	lds	r24, 0x0E4D	; 0x800e4d <cs+0x90>
   15cde:	8f 93       	push	r24
   15ce0:	80 91 4c 0e 	lds	r24, 0x0E4C	; 0x800e4c <cs+0x8f>
   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 <cs+0x8e>
   15cf2:	8f 93       	push	r24
   15cf4:	80 91 4a 0e 	lds	r24, 0x0E4A	; 0x800e4a <cs+0x8d>
   15cf8:	8f 93       	push	r24
   15cfa:	80 91 49 0e 	lds	r24, 0x0E49	; 0x800e49 <cs+0x8c>
   15cfe:	8f 93       	push	r24
   15d00:	80 91 48 0e 	lds	r24, 0x0E48	; 0x800e48 <cs+0x8b>
   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 <cs+0x87>
   15d12:	70 91 45 0e 	lds	r23, 0x0E45	; 0x800e45 <cs+0x88>
   15d16:	80 91 46 0e 	lds	r24, 0x0E46	; 0x800e46 <cs+0x89>
   15d1a:	90 91 47 0e 	lds	r25, 0x0E47	; 0x800e47 <cs+0x8a>
   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 <cs+0x86>
   15d2e:	8f 93       	push	r24
   15d30:	80 91 42 0e 	lds	r24, 0x0E42	; 0x800e42 <cs+0x85>
   15d34:	8f 93       	push	r24
   15d36:	80 91 41 0e 	lds	r24, 0x0E41	; 0x800e41 <cs+0x84>
   15d3a:	8f 93       	push	r24
   15d3c:	80 91 40 0e 	lds	r24, 0x0E40	; 0x800e40 <cs+0x83>
   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 <printf_P>
  );
#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 <cs+0x97>
   15d64:	88 23       	and	r24, r24
   15d66:	11 f4       	brne	.+4      	; 0x15d6c <process_commands() [clone .part.46]+0x3338>
   15d68:	0c 94 0b c0 	jmp	0x18016	; 0x18016 <process_commands() [clone .part.46]+0x55e2>
    printf_P(PSTR("%SFilament settings:\n%S   M200 D%.2f\n"),
   15d6c:	80 91 58 0e 	lds	r24, 0x0E58	; 0x800e58 <cs+0x9b>
   15d70:	8f 93       	push	r24
   15d72:	80 91 57 0e 	lds	r24, 0x0E57	; 0x800e57 <cs+0x9a>
   15d76:	8f 93       	push	r24
   15d78:	80 91 56 0e 	lds	r24, 0x0E56	; 0x800e56 <cs+0x99>
   15d7c:	8f 93       	push	r24
   15d7e:	80 91 55 0e 	lds	r24, 0x0E55	; 0x800e55 <cs+0x98>
   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 <printf_P>
   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 <cs+0xd0>
   15da6:	8f 93       	push	r24
   15da8:	80 91 8c 0e 	lds	r24, 0x0E8C	; 0x800e8c <cs+0xcf>
   15dac:	8f 93       	push	r24
   15dae:	80 91 8b 0e 	lds	r24, 0x0E8B	; 0x800e8b <cs+0xce>
   15db2:	8f 93       	push	r24
   15db4:	80 91 8a 0e 	lds	r24, 0x0E8A	; 0x800e8a <cs+0xcd>
   15db8:	8f 93       	push	r24
   15dba:	80 91 89 0e 	lds	r24, 0x0E89	; 0x800e89 <cs+0xcc>
   15dbe:	1f 92       	push	r1
   15dc0:	8f 93       	push	r24
   15dc2:	80 91 88 0e 	lds	r24, 0x0E88	; 0x800e88 <cs+0xcb>
   15dc6:	8f 93       	push	r24
   15dc8:	80 91 87 0e 	lds	r24, 0x0E87	; 0x800e87 <cs+0xca>
   15dcc:	8f 93       	push	r24
   15dce:	80 91 86 0e 	lds	r24, 0x0E86	; 0x800e86 <cs+0xc9>
   15dd2:	8f 93       	push	r24
   15dd4:	80 91 85 0e 	lds	r24, 0x0E85	; 0x800e85 <cs+0xc8>
   15dd8:	8f 93       	push	r24
   15dda:	80 91 84 0e 	lds	r24, 0x0E84	; 0x800e84 <cs+0xc7>
   15dde:	8f 93       	push	r24
   15de0:	80 91 83 0e 	lds	r24, 0x0E83	; 0x800e83 <cs+0xc6>
   15de4:	8f 93       	push	r24
   15de6:	80 91 82 0e 	lds	r24, 0x0E82	; 0x800e82 <cs+0xc5>
   15dea:	8f 93       	push	r24
   15dec:	80 91 81 0e 	lds	r24, 0x0E81	; 0x800e81 <cs+0xc4>
   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 <printf_P>
        "%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 <thermal_model_report_settings()>
#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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x342e>
   15e5e:	0c 94 25 c0 	jmp	0x1804a	; 0x1804a <process_commands() [clone .part.46]+0x5616>
   15e62:	14 f0       	brlt	.+4      	; 0x15e68 <process_commands() [clone .part.46]+0x3434>
   15e64:	0c 94 d0 a4 	jmp	0x149a0	; 0x149a0 <process_commands() [clone .part.46]+0x1f6c>
   15e68:	88 32       	cpi	r24, 0x28	; 40
   15e6a:	92 40       	sbci	r25, 0x02	; 2
   15e6c:	11 f0       	breq	.+4      	; 0x15e72 <process_commands() [clone .part.46]+0x343e>
   15e6e:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    #### 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 <code_seen(char) [clone .lto_priv.549]>
   15e78:	88 23       	and	r24, r24
   15e7a:	09 f4       	brne	.+2      	; 0x15e7e <process_commands() [clone .part.46]+0x344a>
   15e7c:	44 c1       	rjmp	.+648    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        {
            uint8_t valCnt = 0;
            IP_address = 0;
   15e7e:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <IP_address>
   15e82:	10 92 5e 06 	sts	0x065E, r1	; 0x80065e <IP_address+0x1>
   15e86:	10 92 5f 06 	sts	0x065F, r1	; 0x80065f <IP_address+0x2>
   15e8a:	10 92 60 06 	sts	0x0660, r1	; 0x800660 <IP_address+0x3>
   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 <strchr_pointer>
   15ea2:	f0 91 94 03 	lds	r31, 0x0394	; 0x800394 <strchr_pointer+0x1>
   15ea6:	d0 82       	st	Z, r13
                ((uint8_t*)&IP_address)[valCnt] = code_value_short();
   15ea8:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <process_commands() [clone .part.46]+0x3486>
   15eb8:	26 c1       	rjmp	.+588    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   15eba:	8e e2       	ldi	r24, 0x2E	; 46
   15ebc:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   15ec0:	81 11       	cpse	r24, r1
   15ec2:	ed cf       	rjmp	.-38     	; 0x15e9e <process_commands() [clone .part.46]+0x346a>

            if (valCnt != 4)
                IP_address = 0;
   15ec4:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <IP_address>
   15ec8:	10 92 5e 06 	sts	0x065E, r1	; 0x80065e <IP_address+0x1>
   15ecc:	10 92 5f 06 	sts	0x065F, r1	; 0x80065f <IP_address+0x2>
   15ed0:	10 92 60 06 	sts	0x0660, r1	; 0x800660 <IP_address+0x3>
   15ed4:	18 c1       	rjmp	.+560    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x34ae>
   15ede:	0c 94 f9 ca 	jmp	0x195f2	; 0x195f2 <process_commands() [clone .part.46]+0x6bbe>
   15ee2:	0c f0       	brlt	.+2      	; 0x15ee6 <process_commands() [clone .part.46]+0x34b2>
   15ee4:	4a c0       	rjmp	.+148    	; 0x15f7a <process_commands() [clone .part.46]+0x3546>
   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 <process_commands() [clone .part.46]+0x34be>
   15eee:	0c 94 38 c4 	jmp	0x18870	; 0x18870 <process_commands() [clone .part.46]+0x5e3c>
   15ef2:	8d 3b       	cpi	r24, 0xBD	; 189
   15ef4:	92 40       	sbci	r25, 0x02	; 2
   15ef6:	11 f0       	breq	.+4      	; 0x15efc <process_commands() [clone .part.46]+0x34c8>
   15ef8:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    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 <MMU2::mmu2+0x6f>
   15f00:	81 30       	cpi	r24, 0x01	; 1
   15f02:	11 f4       	brne	.+4      	; 0x15f08 <process_commands() [clone .part.46]+0x34d4>
   15f04:	0c 94 9a ca 	jmp	0x19534	; 0x19534 <process_commands() [clone .part.46]+0x6b00>
    - `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 <code_seen(char) [clone .lto_priv.549]>
    - `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 <process_commands() [clone .part.46]+0x34f4>
   15f20:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   15f2e:	88 23       	and	r24, r24
   15f30:	11 f4       	brne	.+4      	; 0x15f36 <process_commands() [clone .part.46]+0x3502>
   15f32:	0c 94 ab ca 	jmp	0x19556	; 0x19556 <process_commands() [clone .part.46]+0x6b22>
   15f36:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <raise_z(float)>
   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 <code_seen(char) [clone .lto_priv.549]>
   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 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>

    prusa_statistics(22);

    if (MMU2::mmu2.Enabled()) {
   15f50:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   15f54:	81 30       	cpi	r24, 0x01	; 1
   15f56:	11 f0       	breq	.+4      	; 0x15f5c <process_commands() [clone .part.46]+0x3528>
   15f58:	0c 94 b0 ca 	jmp	0x19560	; 0x19560 <process_commands() [clone .part.46]+0x6b2c>
        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
   15f5c:	15 30       	cpi	r17, 0x05	; 5
   15f5e:	18 f4       	brcc	.+6      	; 0x15f66 <process_commands() [clone .part.46]+0x3532>
          MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex);
   15f60:	81 2f       	mov	r24, r17
   15f62:	0f 94 8c 0f 	call	0x21f18	; 0x21f18 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]>
        lcd_update(2);
        lcd_setstatuspgm(MSG_WELCOME);
        custom_message_type = CustomMsg::Status;
    }

    eFilamentAction = FilamentAction::None;
   15f66:	10 92 a5 03 	sts	0x03A5, r1	; 0x8003a5 <eFilamentAction>
#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 <PAT9125_sensor::settings_init() [clone .constprop.231]>

        // 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 <raise_z(float)>
   15f78:	c6 c0       	rjmp	.+396    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x3552>
   15f82:	0c 94 2d cb 	jmp	0x1965a	; 0x1965a <process_commands() [clone .part.46]+0x6c26>
   15f86:	14 f0       	brlt	.+4      	; 0x15f8c <process_commands() [clone .part.46]+0x3558>
   15f88:	0c 94 33 cb 	jmp	0x19666	; 0x19666 <process_commands() [clone .part.46]+0x6c32>
   15f8c:	80 3c       	cpi	r24, 0xC0	; 192
   15f8e:	92 40       	sbci	r25, 0x02	; 2
   15f90:	11 f0       	breq	.+4      	; 0x15f96 <process_commands() [clone .part.46]+0x3562>
   15f92:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    #### 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 <gcodes_M704_M705_M706(unsigned int)>
   15f9e:	b3 c0       	rjmp	.+358    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x3578>
   15fa8:	0c 94 e2 c7 	jmp	0x18fc4	; 0x18fc4 <process_commands() [clone .part.46]+0x6590>
   15fac:	0c f0       	brlt	.+2      	; 0x15fb0 <process_commands() [clone .part.46]+0x357c>
   15fae:	99 c0       	rjmp	.+306    	; 0x160e2 <process_commands() [clone .part.46]+0x36ae>
   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 <process_commands() [clone .part.46]+0x3588>
   15fb8:	0c 94 3e c4 	jmp	0x1887c	; 0x1887c <process_commands() [clone .part.46]+0x5e48>
   15fbc:	9c f5       	brge	.+102    	; 0x16024 <process_commands() [clone .part.46]+0x35f0>
   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 <process_commands() [clone .part.46]+0x3596>
   15fc6:	0c 94 56 cb 	jmp	0x196ac	; 0x196ac <process_commands() [clone .part.46]+0x6c78>
   15fca:	85 3c       	cpi	r24, 0xC5	; 197
   15fcc:	92 40       	sbci	r25, 0x02	; 2
   15fce:	11 f0       	breq	.+4      	; 0x15fd4 <process_commands() [clone .part.46]+0x35a0>
   15fd0:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

    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 <code_seen(char) [clone .lto_priv.549]>
   15fda:	88 23       	and	r24, r24
   15fdc:	51 f0       	breq	.+20     	; 0x15ff2 <process_commands() [clone .part.46]+0x35be>
        {
            switch (code_value_uint8())
   15fde:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   15fe2:	88 23       	and	r24, r24
   15fe4:	11 f4       	brne	.+4      	; 0x15fea <process_commands() [clone .part.46]+0x35b6>
   15fe6:	0c 94 82 cb 	jmp	0x19704	; 0x19704 <process_commands() [clone .part.46]+0x6cd0>
   15fea:	81 30       	cpi	r24, 0x01	; 1
   15fec:	11 f4       	brne	.+4      	; 0x15ff2 <process_commands() [clone .part.46]+0x35be>
   15fee:	0c 94 8f cb 	jmp	0x1971e	; 0x1971e <process_commands() [clone .part.46]+0x6cea>
                break;
            default:
                break;
            }
        }
        if (MMU2::mmu2.Enabled() && code_seen('X'))
   15ff2:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   15ff6:	81 30       	cpi	r24, 0x01	; 1
   15ff8:	91 f4       	brne	.+36     	; 0x1601e <process_commands() [clone .part.46]+0x35ea>
   15ffa:	88 e5       	ldi	r24, 0x58	; 88
   15ffc:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16000:	88 23       	and	r24, r24
   16002:	69 f0       	breq	.+26     	; 0x1601e <process_commands() [clone .part.46]+0x35ea>
        {
            switch (code_value_uint8())
   16004:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   16008:	81 30       	cpi	r24, 0x01	; 1
   1600a:	11 f4       	brne	.+4      	; 0x16010 <process_commands() [clone .part.46]+0x35dc>
   1600c:	0c 94 9d cb 	jmp	0x1973a	; 0x1973a <process_commands() [clone .part.46]+0x6d06>
   16010:	10 f4       	brcc	.+4      	; 0x16016 <process_commands() [clone .part.46]+0x35e2>
   16012:	0c 94 98 cb 	jmp	0x19730	; 0x19730 <process_commands() [clone .part.46]+0x6cfc>
   16016:	8a 32       	cpi	r24, 0x2A	; 42
   16018:	11 f4       	brne	.+4      	; 0x1601e <process_commands() [clone .part.46]+0x35ea>
   1601a:	0c 94 a1 cb 	jmp	0x19742	; 0x19742 <process_commands() [clone .part.46]+0x6d0e>
                break;
            default:
                break;
            }
        }
    MMU2::mmu2.Status();
   1601e:	0f 94 da 75 	call	0x2ebb4	; 0x2ebb4 <MMU2::MMU2::Status() [clone .constprop.342]>
   16022:	71 c0       	rjmp	.+226    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x35fc>
   1602c:	0c 94 b4 c5 	jmp	0x18b68	; 0x18b68 <process_commands() [clone .part.46]+0x6134>
   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 <process_commands() [clone .part.46]+0x3608>
   16038:	0c 94 4c c6 	jmp	0x18c98	; 0x18c98 <process_commands() [clone .part.46]+0x6264>
   1603c:	8c 35       	cpi	r24, 0x5C	; 92
   1603e:	93 40       	sbci	r25, 0x03	; 3
   16040:	11 f0       	breq	.+4      	; 0x16046 <process_commands() [clone .part.46]+0x3612>
   16042:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    */
	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 <code_seen(char) [clone .lto_priv.549]>
   1604c:	88 23       	and	r24, r24
   1604e:	09 f4       	brne	.+2      	; 0x16052 <process_commands() [clone .part.46]+0x361e>
   16050:	5a c0       	rjmp	.+180    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
			set_target_pinda = code_value_short();
   16052:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <lang_get_translation>
   16060:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>

		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 <serialprintPGM(char const*)>
		SERIAL_PROTOCOLLN(set_target_pinda);
   1606c:	c8 01       	movw	r24, r16
   1606e:	0f 94 ec 75 	call	0x2ebd8	; 0x2ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>

		codenum = _millis();
   16072:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <target_temperature>
   16082:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   16086:	89 2b       	or	r24, r25
   16088:	41 f4       	brne	.+16     	; 0x1609a <process_commands() [clone .part.46]+0x3666>
   1608a:	ff 24       	eor	r15, r15
   1608c:	f3 94       	inc	r15
   1608e:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
   16092:	90 91 72 06 	lds	r25, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   16096:	89 2b       	or	r24, r25
   16098:	09 f0       	breq	.+2      	; 0x1609c <process_commands() [clone .part.46]+0x3668>
		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 <process_commands() [clone .part.46]+0x60b4>
   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 <process_commands() [clone .part.46]+0x36a4>
   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 <current_temperature_pinda>
   160c0:	30 91 98 03 	lds	r19, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   160c4:	40 91 99 03 	lds	r20, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   160c8:	50 91 9a 03 	lds	r21, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   160cc:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   160d0:	18 16       	cp	r1, r24
   160d2:	14 f4       	brge	.+4      	; 0x160d8 <process_commands() [clone .part.46]+0x36a4>
   160d4:	0c 94 86 c5 	jmp	0x18b0c	; 0x18b0c <process_commands() [clone .part.46]+0x60d8>
			}
			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 <lcd_setstatuspgm(char const*)>
   160e0:	12 c0       	rjmp	.+36     	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	  } 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 <process_commands() [clone .part.46]+0x36ba>
   160ea:	0c 94 15 c9 	jmp	0x1922a	; 0x1922a <process_commands() [clone .part.46]+0x67f6>
   160ee:	8c f4       	brge	.+34     	; 0x16112 <process_commands() [clone .part.46]+0x36de>
   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 <process_commands() [clone .part.46]+0x36c8>
   160f8:	0c 94 91 c8 	jmp	0x19122	; 0x19122 <process_commands() [clone .part.46]+0x66ee>
   160fc:	8c 38       	cpi	r24, 0x8C	; 140
   160fe:	93 40       	sbci	r25, 0x03	; 3
   16100:	11 f0       	breq	.+4      	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   16102:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>
    */
	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 <process_commands() [clone .part.46]+0x17c>
	  } 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 <process_commands() [clone .part.46]+0x36ea>
   1611a:	0c 94 64 c9 	jmp	0x192c8	; 0x192c8 <process_commands() [clone .part.46]+0x6894>
   1611e:	80 3a       	cpi	r24, 0xA0	; 160
   16120:	93 40       	sbci	r25, 0x03	; 3
   16122:	11 f0       	breq	.+4      	; 0x16128 <process_commands() [clone .part.46]+0x36f4>
   16124:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x1e84>

        M928 [filename]

    */
    case 928:
      card.openLogFile(strchr_pointer+5);
   16128:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   1612c:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
  }
}

void CardReader::openLogFile(const char* name)
{
  logging = true;
   16130:	21 e0       	ldi	r18, 0x01	; 1
   16132:	20 93 8e 14 	sts	0x148E, r18	; 0x80148e <card+0x1>
  openFileWrite(name);
   16136:	05 96       	adiw	r24, 0x05	; 5
   16138:	0f 94 5d 86 	call	0x30cba	; 0x30cba <CardReader::openFileWrite(char const*) [clone .constprop.182]>
   1613c:	e4 cf       	rjmp	.-56     	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <strchr_pointer>
   16142:	10 91 94 03 	lds	r17, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <code_seen(char) [clone .lto_priv.549]>
    */

    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 <process_commands() [clone .part.46]+0x372e>
   1615a:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   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 <code_seen(char) [clone .lto_priv.549]>
   16168:	88 23       	and	r24, r24
   1616a:	51 f0       	breq	.+20     	; 0x16180 <process_commands() [clone .part.46]+0x374c>
   1616c:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   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 <process_commands() [clone .part.46]+0x374c>
        custom_message_type = CustomMsg::M0Wait;
   1618e:	26 e0       	ldi	r18, 0x06	; 6
   16190:	20 93 c3 06 	sts	0x06C3, r18	; 0x8006c3 <custom_message_type>
        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 <process_commands() [clone .part.46]+0x37d2>
   1619e:	2c 91       	ld	r18, X
   161a0:	22 23       	and	r18, r18
   161a2:	89 f1       	breq	.+98     	; 0x16206 <process_commands() [clone .part.46]+0x37d2>
            lcd_setstatus(src);
   161a4:	0e 94 42 f5 	call	0x1ea84	; 0x1ea84 <lcd_setstatus(char const*)>
                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 <st_synchronize()>
        menu_set_block(MENU_BLOCK_STATUS_SCREEN_M0);
   161ac:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
   161b0:	84 60       	ori	r24, 0x04	; 4
   161b2:	80 93 d4 03 	sts	0x03D4, r24	; 0x8003d4 <menu_block_mask>
        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 <Timer<unsigned long>::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 <process_commands() [clone .part.46]+0x37f2>
            codenum += _millis();  // keep track of when we started waiting
   161c8:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <busy_state>
            while(_millis() < codenum && !lcd_clicked()) {
   161da:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <process_commands() [clone .part.46]+0x37e0>
                delay_keep_alive(0);
            }
            KEEPALIVE_STATE(IN_HANDLER);
   161e8:	82 e0       	ldi	r24, 0x02	; 2
   161ea:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
        } else {
            marlin_wait_for_click();
        }
        menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0);
   161ee:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
   161f2:	8b 7f       	andi	r24, 0xFB	; 251
   161f4:	80 93 d4 03 	sts	0x03D4, r24	; 0x8003d4 <menu_block_mask>
        if (IS_SD_PRINTING)
   161f8:	80 91 8f 14 	lds	r24, 0x148F	; 0x80148f <card+0x2>
   161fc:	88 23       	and	r24, r24
   161fe:	31 f1       	breq	.+76     	; 0x1624c <process_commands() [clone .part.46]+0x3818>
            custom_message_type = CustomMsg::Status;
   16200:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
   16204:	80 cf       	rjmp	.-256    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        } 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 <lang_get_translation>
   1620e:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
   16212:	ca cf       	rjmp	.-108    	; 0x161a8 <process_commands() [clone .part.46]+0x3774>
        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 <lcd_clicked()>
   16218:	81 11       	cpse	r24, r1
   1621a:	e6 cf       	rjmp	.-52     	; 0x161e8 <process_commands() [clone .part.46]+0x37b4>
                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 <delay_keep_alive(unsigned int)>
   16224:	da cf       	rjmp	.-76     	; 0x161da <process_commands() [clone .part.46]+0x37a6>
//! @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 <busy_state>
    KEEPALIVE_STATE(PAUSED_FOR_USER);
   1622a:	84 e0       	ldi	r24, 0x04	; 4
   1622c:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
    lcd_consume_click();
   16230:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
    while(!lcd_clicked())
   16234:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   16238:	81 11       	cpse	r24, r1
   1623a:	05 c0       	rjmp	.+10     	; 0x16246 <process_commands() [clone .part.46]+0x3812>
    {
        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 <delay_keep_alive(unsigned int)>
   16244:	f7 cf       	rjmp	.-18     	; 0x16234 <process_commands() [clone .part.46]+0x3800>
    }
    KEEPALIVE_STATE(busy_state_backup);
   16246:	10 93 be 02 	sts	0x02BE, r17	; 0x8002be <busy_state>
   1624a:	d1 cf       	rjmp	.-94     	; 0x161ee <process_commands() [clone .part.46]+0x37ba>
        }
        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 <lcd_setstatuspgm(char const*)>
   16254:	58 cf       	rjmp	.-336    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    /*!
    ### M17 - Enable all axes <a href="https://reprap.org/wiki/G-code#M17:_Enable.2FPower_all_stepper_motors">M17: Enable/Power all stepper motors</a>
    */

    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 <lang_get_translation>
   1625e:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
        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 <process_commands() [clone .part.46]+0x36d2>

    /*!
    ### M21 - Init SD card <a href="https://reprap.org/wiki/G-code#M21:_Initialize_SD_card">M21: Initialize SD card</a>
    */
    case 21:
      card.mount();
   1626c:	81 e0       	ldi	r24, 0x01	; 1
   1626e:	0f 94 b9 81 	call	0x30372	; 0x30372 <CardReader::mount(bool) [clone .constprop.216]>
   16272:	49 cf       	rjmp	.-366    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		presort_flag = true;
#endif
}
void CardReader::release()
{
  sdprinting = false;
   16274:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>
  mounted = false;
   16278:	10 92 90 14 	sts	0x1490, r1	; 0x801490 <card+0x3>
  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 <serialprintPGM(char const*)>
  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 <serialprintlnPGM(char const*)>
   1628c:	3c cf       	rjmp	.-392    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    /*!
    ### M24 - Start SD print <a href="https://reprap.org/wiki/G-code#M24:_Start.2Fresume_SD_print">M24: Start/resume SD print</a>
    */
    case 24:
    if (printingIsPaused())
   1628e:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   16292:	88 23       	and	r24, r24
   16294:	19 f0       	breq	.+6      	; 0x1629c <process_commands() [clone .part.46]+0x3868>
      lcd_resume_print();
   16296:	0e 94 d0 f8 	call	0x1f1a0	; 0x1f1a0 <lcd_resume_print()>
   1629a:	35 cf       	rjmp	.-406    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    else
    {
      if (!filament_presence_check()) {
   1629c:	0e 94 bb f5 	call	0x1eb76	; 0x1eb76 <filament_presence_check()>
   162a0:	88 23       	and	r24, r24
   162a2:	09 f4       	brne	.+2      	; 0x162a6 <process_commands() [clone .part.46]+0x3872>
   162a4:	30 cf       	rjmp	.-416    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   162a6:	80 91 22 17 	lds	r24, 0x1722	; 0x801722 <card+0x295>
   162aa:	88 23       	and	r24, r24
   162ac:	61 f0       	breq	.+24     	; 0x162c6 <process_commands() [clone .part.46]+0x3892>
        // Print was aborted
        break;
      }

      if (!card.get_sdpos())
   162ae:	80 91 a3 17 	lds	r24, 0x17A3	; 0x8017a3 <card+0x316>
   162b2:	90 91 a4 17 	lds	r25, 0x17A4	; 0x8017a4 <card+0x317>
   162b6:	a0 91 a5 17 	lds	r26, 0x17A5	; 0x8017a5 <card+0x318>
   162ba:	b0 91 a6 17 	lds	r27, 0x17A6	; 0x8017a6 <card+0x319>
   162be:	89 2b       	or	r24, r25
   162c0:	8a 2b       	or	r24, r26
   162c2:	8b 2b       	or	r24, r27
   162c4:	69 f4       	brne	.+26     	; 0x162e0 <process_commands() [clone .part.46]+0x38ac>
      {
              // A new print has started from scratch, reset stats
              failstats_reset_print();
   162c6:	0e 94 bc 5b 	call	0xb778	; 0xb778 <failstats_reset_print()>
              sdpos_atomic = 0;
   162ca:	10 92 80 03 	sts	0x0380, r1	; 0x800380 <sdpos_atomic>
   162ce:	10 92 81 03 	sts	0x0381, r1	; 0x800381 <sdpos_atomic+0x1>
   162d2:	10 92 82 03 	sts	0x0382, r1	; 0x800382 <sdpos_atomic+0x2>
   162d6:	10 92 83 03 	sts	0x0383, r1	; 0x800383 <sdpos_atomic+0x3>
   162da:	80 e0       	ldi	r24, 0x00	; 0
   162dc:	0e 94 af 81 	call	0x1035e	; 0x1035e <la10c_mode_change(LA10C_MODE)>
}

void CardReader::startFileprint()
{
  if(mounted)
   162e0:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   162e4:	88 23       	and	r24, r24
   162e6:	31 f0       	breq	.+12     	; 0x162f4 <process_commands() [clone .part.46]+0x38c0>
  {
    sdprinting = true;
   162e8:	81 e0       	ldi	r24, 0x01	; 1
   162ea:	80 93 8f 14 	sts	0x148F, r24	; 0x80148f <card+0x2>
   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 <Stopwatch::start()>
      if (MMU2::mmu2.Enabled())
   162f8:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   162fc:	81 30       	cpi	r24, 0x01	; 1
   162fe:	09 f0       	breq	.+2      	; 0x16302 <process_commands() [clone .part.46]+0x38ce>
   16300:	02 cf       	rjmp	.-508    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        if (MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent())
   16302:	80 91 8f 13 	lds	r24, 0x138F	; 0x80138f <MMU2::mmu2+0x45>
   16306:	88 23       	and	r24, r24
   16308:	09 f4       	brne	.+2      	; 0x1630c <process_commands() [clone .part.46]+0x38d8>
   1630a:	fd ce       	rjmp	.-518    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   1630c:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   16310:	81 11       	cpse	r24, r1
   16312:	f9 ce       	rjmp	.-526    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        { // Filament only half way into the PTFE. Unload the filament.
          MMU2::mmu2.unload();
   16314:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>
   16318:	f6 ce       	rjmp	.-532    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    #### Parameters
      - `S` - Index in bytes
    */
    case 26:
      if(card.mounted && code_seen('S')) {
   1631a:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   1631e:	88 23       	and	r24, r24
   16320:	09 f4       	brne	.+2      	; 0x16324 <process_commands() [clone .part.46]+0x38f0>
   16322:	f1 ce       	rjmp	.-542    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   16324:	83 e5       	ldi	r24, 0x53	; 83
   16326:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   1632a:	88 23       	and	r24, r24
   1632c:	09 f4       	brne	.+2      	; 0x16330 <process_commands() [clone .part.46]+0x38fc>
   1632e:	eb ce       	rjmp	.-554    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        long index = code_value_long();
   16330:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   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 <card+0x316>
   1633c:	d0 92 a4 17 	sts	0x17A4, r13	; 0x8017a4 <card+0x317>
   16340:	e0 92 a5 17 	sts	0x17A5, r14	; 0x8017a5 <card+0x318>
   16344:	f0 92 a6 17 	sts	0x17A6, r15	; 0x8017a6 <card+0x319>
   16348:	0f 94 93 76 	call	0x2ed26	; 0x2ed26 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]>
        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 <sdpos_atomic>
   16350:	d0 92 81 03 	sts	0x0381, r13	; 0x800381 <sdpos_atomic+0x1>
   16354:	e0 92 82 03 	sts	0x0382, r14	; 0x800382 <sdpos_atomic+0x2>
   16358:	f0 92 83 03 	sts	0x0383, r15	; 0x800383 <sdpos_atomic+0x3>
   1635c:	d4 ce       	rjmp	.-600    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   16364:	18 2f       	mov	r17, r24
	return filesize;
}

void CardReader::getStatus(bool arg_P)
{
    if (printingIsPaused())
   16366:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   1636a:	88 23       	and	r24, r24
   1636c:	91 f0       	breq	.+36     	; 0x16392 <process_commands() [clone .part.46]+0x395e>
    {
        if (saved_printing && (saved_printing_type == PowerPanic::PRINT_TYPE_SD))
   1636e:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
   16372:	88 23       	and	r24, r24
   16374:	49 f0       	breq	.+18     	; 0x16388 <process_commands() [clone .part.46]+0x3954>
   16376:	80 91 6a 02 	lds	r24, 0x026A	; 0x80026a <saved_printing_type>
   1637a:	81 11       	cpse	r24, r1
   1637c:	05 c0       	rjmp	.+10     	; 0x16388 <process_commands() [clone .part.46]+0x3954>
            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 <serialprintlnPGM(char const*)>
   16386:	bf ce       	rjmp	.-642    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <serialprintlnPGM(char const*)>
   16390:	ba ce       	rjmp	.-652    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    }
    else if (sdprinting)
   16392:	80 91 8f 14 	lds	r24, 0x148F	; 0x80148f <card+0x2>
   16396:	88 23       	and	r24, r24
   16398:	09 f4       	brne	.+2      	; 0x1639c <process_commands() [clone .part.46]+0x3968>
   1639a:	4a c0       	rjmp	.+148    	; 0x16430 <process_commands() [clone .part.46]+0x39fc>
    {
        if (arg_P)
   1639c:	11 23       	and	r17, r17
   1639e:	e1 f1       	breq	.+120    	; 0x16418 <process_commands() [clone .part.46]+0x39e4>
        {
            printAbsFilenameFast();
   163a0:	0f 94 18 7b 	call	0x2f630	; 0x2f630 <CardReader::printAbsFilenameFast() [clone .constprop.250]>
            SERIAL_PROTOCOLLN();
   163a4:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
        }
        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 <serialprintPGM(char const*)>
}

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 <card+0x316>
   163b4:	70 91 a4 17 	lds	r23, 0x17A4	; 0x8017a4 <card+0x317>
   163b8:	80 91 a5 17 	lds	r24, 0x17A5	; 0x8017a5 <card+0x318>
   163bc:	90 91 a6 17 	lds	r25, 0x17A6	; 0x8017a6 <card+0x319>
   163c0:	4a e0       	ldi	r20, 0x0A	; 10
   163c2:	0f 94 fa d4 	call	0x3a9f4	; 0x3a9f4 <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

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 <MarlinSerial::write(unsigned char)>
}

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 <card+0x30f>
   163d0:	70 91 9d 17 	lds	r23, 0x179D	; 0x80179d <card+0x310>
   163d4:	80 91 9e 17 	lds	r24, 0x179E	; 0x80179e <card+0x311>
   163d8:	90 91 9f 17 	lds	r25, 0x179F	; 0x80179f <card+0x312>
   163dc:	4a e0       	ldi	r20, 0x0A	; 10
   163de:	0f 94 fa d4 	call	0x3a9f4	; 0x3a9f4 <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned long n, int base)
{
  print(n, base);
  println();
   163e2:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
        SERIAL_PROTOCOL(sdpos);
        SERIAL_PROTOCOL('/');
        SERIAL_PROTOCOLLN(filesize);
        uint16_t time = print_job_timer.duration() / 60;
   163e6:	0f 94 7b 3f 	call	0x27ef6	; 0x27ef6 <Stopwatch::duration()>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
}

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 <MarlinSerial::write(unsigned char)>
        SERIAL_PROTOCOL(':');
        SERIAL_PROTOCOLLN((int)(time % 60));
   16410:	c8 01       	movw	r24, r16
   16412:	0f 94 ec 75 	call	0x2ebd8	; 0x2ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>
   16416:	77 ce       	rjmp	.-786    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        {
            printAbsFilenameFast();
            SERIAL_PROTOCOLLN();
        }
        else
            SERIAL_PROTOCOLLN(LONGEST_FILENAME);
   16418:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   1641c:	88 23       	and	r24, r24
   1641e:	29 f0       	breq	.+10     	; 0x1642a <process_commands() [clone .part.46]+0x39f6>
   16420:	86 ea       	ldi	r24, 0xA6	; 166
   16422:	94 e1       	ldi	r25, 0x14	; 20
   16424:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
   16428:	bf cf       	rjmp	.-130    	; 0x163a8 <process_commands() [clone .part.46]+0x3974>
   1642a:	81 e9       	ldi	r24, 0x91	; 145
   1642c:	94 e1       	ldi	r25, 0x14	; 20
   1642e:	fa cf       	rjmp	.-12     	; 0x16424 <process_commands() [clone .part.46]+0x39f0>
        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 <serialprintlnPGM(char const*)>
   16438:	66 ce       	rjmp	.-820    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    /*!
    ### M28 - Start SD write <a href="https://reprap.org/wiki/G-code#M28:_Begin_write_to_SD_card">M28: Begin write to SD card</a>
    */
    case 28:
      card.openFileWrite(strchr_pointer+4);
   1643a:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   1643e:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   16442:	04 96       	adiw	r24, 0x04	; 4
   16444:	0f 94 5d 86 	call	0x30cba	; 0x30cba <CardReader::openFileWrite(char const*) [clone .constprop.182]>
   16448:	5e ce       	rjmp	.-836    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
 * 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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]>
   16452:	88 23       	and	r24, r24
   16454:	11 f4       	brne	.+4      	; 0x1645a <process_commands() [clone .part.46]+0x3a26>
   16456:	0c 94 a4 a5 	jmp	0x14b48	; 0x14b48 <process_commands() [clone .part.46]+0x2114>

  // 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 <SdBaseFile::cacheDirEntry(unsigned char)>
  if (!d) goto fail;
   16464:	00 97       	sbiw	r24, 0x00	; 0
   16466:	11 f4       	brne	.+4      	; 0x1646c <process_commands() [clone .part.46]+0x3a38>
   16468:	0c 94 a4 a5 	jmp	0x14b48	; 0x14b48 <process_commands() [clone .part.46]+0x2114>

  // 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 <SdVolume::cacheFlush()>
   16478:	18 2f       	mov	r17, r24
   1647a:	0c 94 a5 a5 	jmp	0x14b4a	; 0x14b4a <process_commands() [clone .part.46]+0x2116>
		  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 <serialprintPGM(char const*)>
   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 <MarlinSerial::write(char const*)>
   16492:	8e e2       	ldi	r24, 0x2E	; 46
   16494:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   16498:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
   1649c:	34 ce       	rjmp	.-920    	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    ### M31 - Report current print time <a href="https://reprap.org/wiki/G-code#M31:_Output_time_since_last_M109_or_SD_card_start_to_serial">M31: Output time since last M109 or SD card start to serial</a>
    */
    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 <Stopwatch::duration()>
      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 <sprintf_P>
      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 <serialprintPGM(char const*)>
      SERIAL_ECHOLN(time);
   164d4:	c8 01       	movw	r24, r16
   164d6:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
      lcd_setstatus(time);
   164da:	c8 01       	movw	r24, r16
   164dc:	0e 94 42 f5 	call	0x1ea84	; 0x1ea84 <lcd_setstatus(char const*)>
      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 <process_commands() [clone .part.46]+0x36d2>
    #### 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 <code_seen(char) [clone .lto_priv.549]>
   164f2:	88 23       	and	r24, r24
   164f4:	09 f4       	brne	.+2      	; 0x164f8 <process_commands() [clone .part.46]+0x3ac4>
   164f6:	07 ce       	rjmp	.-1010   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        uint8_t pin_status = code_value_uint8();
   164f8:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   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 <code_seen(char) [clone .lto_priv.549]>
    */
    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 <process_commands() [clone .part.46]+0x3adc>
          pin_number = code_value_uint8();
   1650a:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   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 <process_commands() [clone .part.46]+0x3aec>
   1651e:	f3 cd       	rjmp	.-1050   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x3ae4>
            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 <process_commands() [clone .part.46]+0x3b18>
          fanSpeed = pin_status;
   1652c:	00 93 e5 03 	sts	0x03E5, r16	; 0x8003e5 <fanSpeed>
      #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 <pinMode>
          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 <digitalWrite>
          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 <analogWrite>
   1654a:	dd cd       	rjmp	.-1094   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        }
      #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 <process_commands() [clone .part.46]+0x36d2>
   16550:	ef cf       	rjmp	.-34     	; 0x16530 <process_commands() [clone .part.46]+0x3afc>
    ### M44 - Reset the bed skew and offset calibration <a href="https://reprap.org/wiki/G-code#M44:_Reset_the_bed_skew_and_offset_calibration">M44: Reset the bed skew and offset calibration</a>
    */
    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 <calibration_status_clear(unsigned char)>
        eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_byte>
   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 <eeprom_update_word>

        // 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 <calibration_status_clear(unsigned char)>
        reset_bed_offset_and_skew();
   1657a:	0f 94 49 ce 	call	0x39c92	; 0x39c92 <reset_bed_offset_and_skew()>

        // 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 <world2machine_revert_to_uncorrected()>
   16582:	c1 cd       	rjmp	.-1150   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    */
    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 <code_seen(char) [clone .lto_priv.549]>
			// 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 <gcode_M45(bool, signed char) [clone .constprop.76]>
   1658e:	bb cd       	rjmp	.-1162   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    ### M46 - Show the assigned IP address <a href="https://reprap.org/wiki/G-code#M46:_Show_the_assigned_IP_address">M46: Show the assigned IP address.</a>
    */
    case 46:
    {
        // M46: Prusa3D: Show the assigned IP address.
        if (card.ToshibaFlashAir_isEnabled()) {
   16590:	80 91 00 17 	lds	r24, 0x1700	; 0x801700 <card+0x273>
   16594:	88 23       	and	r24, r24
   16596:	19 f1       	breq	.+70     	; 0x165de <process_commands() [clone .part.46]+0x3baa>
            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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]>
   165a0:	88 23       	and	r24, r24
   165a2:	c1 f0       	breq	.+48     	; 0x165d4 <process_commands() [clone .part.46]+0x3ba0>
  }
}

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 <MarlinSerial::write(unsigned char)>
}

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 <MarlinSerial::write(unsigned char)>
  }
}

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 <MarlinSerial::write(unsigned char)>
}

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 <MarlinSerial::write(unsigned char)>
  }
}

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 <MarlinSerial::write(unsigned char)>
}

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 <MarlinSerial::write(unsigned char)>
  }
}

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 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(unsigned char b, int base)
{
  print(b, base);
  println();
   165ce:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
   165d2:	99 cd       	rjmp	.-1230   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                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 <serialprintPGM(char const*)>
   165dc:	94 cd       	rjmp	.-1240   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            }
        } 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 <serialprintlnPGM(char const*)>
   165e6:	8f cd       	rjmp	.-1250   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   165e8:	10 92 b7 0d 	sts	0x0DB7, r1	; 0x800db7 <_ZL13printer_state.lto_priv.403>
   165ec:	8c cd       	rjmp	.-1256   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
        - `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 <code_seen(char) [clone .lto_priv.549]>
   16612:	88 23       	and	r24, r24
   16614:	21 f0       	breq	.+8      	; 0x1661e <process_commands() [clone .part.46]+0x3bea>
   16616:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   1661a:	80 93 ae 02 	sts	0x02AE, r24	; 0x8002ae <print_percent_done_normal>
        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 <code_seen(char) [clone .lto_priv.549]>
   16624:	88 23       	and	r24, r24
   16626:	41 f0       	breq	.+16     	; 0x16638 <process_commands() [clone .part.46]+0x3c04>
   16628:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   1662c:	0f 94 b0 de 	call	0x3bd60	; 0x3bd60 <__fixunssfsi>
   16630:	70 93 b2 02 	sts	0x02B2, r23	; 0x8002b2 <print_time_remaining_normal+0x1>
   16634:	60 93 b1 02 	sts	0x02B1, r22	; 0x8002b1 <print_time_remaining_normal>
        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 <code_seen(char) [clone .lto_priv.549]>
   1663e:	88 23       	and	r24, r24
   16640:	21 f0       	breq	.+8      	; 0x1664a <process_commands() [clone .part.46]+0x3c16>
   16642:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   16646:	80 93 ad 02 	sts	0x02AD, r24	; 0x8002ad <print_percent_done_silent>
        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 <code_seen(char) [clone .lto_priv.549]>
   16650:	88 23       	and	r24, r24
   16652:	41 f0       	breq	.+16     	; 0x16664 <process_commands() [clone .part.46]+0x3c30>
   16654:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   16658:	0f 94 b0 de 	call	0x3bd60	; 0x3bd60 <__fixunssfsi>
   1665c:	70 93 b6 02 	sts	0x02B6, r23	; 0x8002b6 <print_time_remaining_silent+0x1>
   16660:	60 93 b5 02 	sts	0x02B5, r22	; 0x8002b5 <print_time_remaining_silent>
        if(code_seen('C')){
   16664:	83 e4       	ldi	r24, 0x43	; 67
   16666:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   1666a:	88 23       	and	r24, r24
   1666c:	a9 f0       	breq	.+42     	; 0x16698 <process_commands() [clone .part.46]+0x3c64>
            float print_time_to_change_normal_f = code_value();
   1666e:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x3c5c>
   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 <print_time_to_change_normal+0x1>
   16694:	60 93 af 02 	sts	0x02AF, r22	; 0x8002af <print_time_to_change_normal>
        }
        if(code_seen('D')){
   16698:	84 e4       	ldi	r24, 0x44	; 68
   1669a:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   1669e:	88 23       	and	r24, r24
   166a0:	a9 f0       	breq	.+42     	; 0x166cc <process_commands() [clone .part.46]+0x3c98>
            float print_time_to_change_silent_f = code_value();
   166a2:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x3c90>
   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 <print_time_to_change_silent+0x1>
   166c8:	60 93 b3 02 	sts	0x02B3, r22	; 0x8002b3 <print_time_to_change_silent>
        }
        {
            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 <print_time_to_change_normal+0x1>
   166d0:	8f 93       	push	r24
   166d2:	80 91 af 02 	lds	r24, 0x02AF	; 0x8002af <print_time_to_change_normal>
   166d6:	8f 93       	push	r24
   166d8:	80 91 b2 02 	lds	r24, 0x02B2	; 0x8002b2 <print_time_remaining_normal+0x1>
   166dc:	8f 93       	push	r24
   166de:	80 91 b1 02 	lds	r24, 0x02B1	; 0x8002b1 <print_time_remaining_normal>
   166e2:	8f 93       	push	r24
   166e4:	80 91 ae 02 	lds	r24, 0x02AE	; 0x8002ae <print_percent_done_normal>
   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>
            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 <print_time_to_change_silent+0x1>
   1670c:	8f 93       	push	r24
   1670e:	80 91 b3 02 	lds	r24, 0x02B3	; 0x8002b3 <print_time_to_change_silent>
   16712:	8f 93       	push	r24
   16714:	80 91 b6 02 	lds	r24, 0x02B6	; 0x8002b6 <print_time_remaining_silent+0x1>
   16718:	8f 93       	push	r24
   1671a:	80 91 b5 02 	lds	r24, 0x02B5	; 0x8002b5 <print_time_remaining_silent>
   1671e:	8f 93       	push	r24
   16720:	80 91 ad 02 	lds	r24, 0x02AD	; 0x8002ad <print_percent_done_silent>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
  }
  else return false;
}

bool Stopwatch::pause() {
  if (isRunning()) {
   1674c:	80 91 9b 03 	lds	r24, 0x039B	; 0x80039b <Stopwatch::state>
   16750:	81 30       	cpi	r24, 0x01	; 1
   16752:	09 f0       	breq	.+2      	; 0x16756 <process_commands() [clone .part.46]+0x3d22>
   16754:	d8 cc       	rjmp	.-1616   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    state = PAUSED;
   16756:	82 e0       	ldi	r24, 0x02	; 2
   16758:	80 93 9b 03 	sts	0x039B, r24	; 0x80039b <Stopwatch::state>
    stopTimestamp = _millis();
   1675c:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   16760:	60 93 51 06 	sts	0x0651, r22	; 0x800651 <Stopwatch::stopTimestamp>
   16764:	70 93 52 06 	sts	0x0652, r23	; 0x800652 <Stopwatch::stopTimestamp+0x1>
   16768:	80 93 53 06 	sts	0x0653, r24	; 0x800653 <Stopwatch::stopTimestamp+0x2>
   1676c:	90 93 54 06 	sts	0x0654, r25	; 0x800654 <Stopwatch::stopTimestamp+0x3>
   16770:	ca cc       	rjmp	.-1644   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    /*!
    ### M77 - Stop the print job timer <a href="https://reprap.org/wiki/G-code#M77:_Stop_the_print_job_timer">M77: Stop the print job timer</a>
    */
    case 77:
    {
        print_job_timer.stop();
   16772:	0f 94 72 43 	call	0x286e4	; 0x286e4 <Stopwatch::stop()>
        save_statistics();
   16776:	0e 94 b7 65 	call	0xcb6e	; 0xcb6e <save_statistics()>
   1677a:	c5 cc       	rjmp	.-1654   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <printJobOngoing()>
   16780:	88 23       	and	r24, r24
   16782:	c1 f1       	breq	.+112    	; 0x167f4 <process_commands() [clone .part.46]+0x3dc0>
          _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 <total_filament_used>
   16788:	70 91 65 06 	lds	r23, 0x0665	; 0x800665 <total_filament_used+0x1>
   1678c:	80 91 66 06 	lds	r24, 0x0666	; 0x800666 <total_filament_used+0x2>
   16790:	90 91 67 06 	lds	r25, 0x0667	; 0x800667 <total_filament_used+0x3>
   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 <Stopwatch::duration()>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
          _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 <code_seen(char) [clone .lto_priv.549]>
   167fa:	88 23       	and	r24, r24
   167fc:	51 f0       	breq	.+20     	; 0x16812 <process_commands() [clone .part.46]+0x3dde>
          eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, code_value());
   167fe:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <eeprom_update_dword>
          }
          if (code_seen('T')) {
   16812:	84 e5       	ldi	r24, 0x54	; 84
   16814:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16818:	88 23       	and	r24, r24
   1681a:	51 f0       	breq	.+20     	; 0x16830 <process_commands() [clone .part.46]+0x3dfc>
          eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value());
   1681c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <eeprom_update_dword>
          }
          _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 <eeprom_read_dword>
   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 <eeprom_read_dword>
          }
          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 <process_commands() [clone .part.46]+0x3d90>
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 <Timer<unsigned long>::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 <code_seen(char) [clone .lto_priv.549]>
   16860:	88 23       	and	r24, r24
   16862:	09 f1       	breq	.+66     	; 0x168a6 <process_commands() [clone .part.46]+0x3e72>
    , 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 <strchr_pointer>
   1686c:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   16870:	0f 94 67 e2 	call	0x3c4ce	; 0x3c4ce <strchr>
   16874:	8c 01       	movw	r16, r24
        if (!this->ptr) {
   16876:	89 2b       	or	r24, r25
   16878:	b1 f0       	breq	.+44     	; 0x168a6 <process_commands() [clone .part.46]+0x3e72>
            // 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 <strchr>
        if(!pStrEnd) {
   16888:	89 2b       	or	r24, r25
   1688a:	69 f0       	breq	.+26     	; 0x168a6 <process_commands() [clone .part.46]+0x3e72>
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 <process_commands() [clone .part.46]+0x3e60>

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 <strncpy>
        }
#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 <eeprom_read_byte>
           && printer_recovering()
           && printingIsPaused()) {
   168ae:	81 30       	cpi	r24, 0x01	; 1
   168b0:	09 f0       	breq	.+2      	; 0x168b4 <process_commands() [clone .part.46]+0x3e80>
   168b2:	29 cc       	rjmp	.-1966   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
#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 <printer_recovering()>
   168b8:	88 23       	and	r24, r24
   168ba:	09 f4       	brne	.+2      	; 0x168be <process_commands() [clone .part.46]+0x3e8a>
   168bc:	24 cc       	rjmp	.-1976   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
           && printingIsPaused()) {
   168be:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   168c2:	88 23       	and	r24, r24
   168c4:	09 f4       	brne	.+2      	; 0x168c8 <process_commands() [clone .part.46]+0x3e94>
   168c6:	1f cc       	rjmp	.-1986   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            // 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 <process_commands() [clone .part.46]+0x3ea6>
                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 <serialprintlnPGM(char const*)>
   168d8:	16 cc       	rjmp	.-2004   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            } 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 <serialprintlnPGM(char const*)>
   168e2:	11 cc       	rjmp	.-2014   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    /*!
    ### M112 - Emergency stop <a href="https://reprap.org/wiki/G-code#M112:_Full_.28Emergency.29_Stop">M112: Full (Emergency) Stop</a>
    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 <kill(char const*)>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   168f2:	88 23       	and	r24, r24
   168f4:	09 f4       	brne	.+2      	; 0x168f8 <process_commands() [clone .part.46]+0x3ec4>
   168f6:	07 cc       	rjmp	.-2034   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   168f8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
  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 <target_temperature_bed+0x1>
   16904:	60 93 71 06 	sts	0x0671, r22	; 0x800671 <target_temperature_bed>
   16908:	fe cb       	rjmp	.-2052   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      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 <serialprintPGM(char const*)>
      gcode_M105();
   16912:	0e 94 5a 78 	call	0xf0b4	; 0xf0b4 <gcode_M105()>
      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 <cmdqueue_pop_front()>
      cmdbuffer_front_already_processed = true;
   1691a:	81 e0       	ldi	r24, 0x01	; 1
   1691c:	80 93 a1 10 	sts	0x10A1, r24	; 0x8010a1 <cmdbuffer_front_already_processed>
   16920:	f2 cb       	rjmp	.-2076   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   16922:	10 92 88 14 	sts	0x1488, r1	; 0x801488 <autoReportFeatures+0x2>
   16926:	0c 94 70 a7 	jmp	0x14ee0	; 0x14ee0 <process_commands() [clone .part.46]+0x24ac>
    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 <autoReportFeatures>
   16930:	ea cb       	rjmp	.-2092   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
#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 <code_seen(char) [clone .lto_priv.549]>
   16938:	81 11       	cpse	r24, r1
   1693a:	0c 94 fc a6 	jmp	0x14df8	; 0x14df8 <process_commands() [clone .part.46]+0x23c4>
          autotemp_factor=code_value();
          autotemp_enabled=true;
        }
      #endif

      codenum = _millis();
   1693e:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <target_temperature>
   1694a:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   16960:	30 91 b0 0d 	lds	r19, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   16964:	40 91 b1 0d 	lds	r20, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   16968:	50 91 b2 0d 	lds	r21, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   1696c:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   16970:	18 16       	cp	r1, r24
   16972:	0c f0       	brlt	.+2      	; 0x16976 <process_commands() [clone .part.46]+0x3f42>
   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 <wait_for_heater(long, unsigned char) [clone .constprop.214]>

        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 <lang_get_translation>
   1698a:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
		heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE;
   1698e:	82 e0       	ldi	r24, 0x02	; 2
   16990:	80 93 e1 03 	sts	0x03E1, r24	; 0x8003e1 <heating_status>
        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 <Timer<unsigned long>::start()>
   1699c:	b4 cb       	rjmp	.-2200   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    */
    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 <lang_get_translation>
   169a6:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
		heating_status = HeatingStatus::BED_HEATING;
   169aa:	83 e0       	ldi	r24, 0x03	; 3
   169ac:	80 93 e1 03 	sts	0x03E1, r24	; 0x8003e1 <heating_status>
        prusa_statistics(1);
        if (code_seen('S'))
   169b0:	83 e5       	ldi	r24, 0x53	; 83
   169b2:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   169b6:	18 2f       	mov	r17, r24
   169b8:	88 23       	and	r24, r24
   169ba:	49 f0       	breq	.+18     	; 0x169ce <process_commands() [clone .part.46]+0x3f9a>
          setTargetBed(code_value());
          CooldownNoWait = true;
        }
		else if (code_seen('R'))
		{
          setTargetBed(code_value());
   169bc:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
  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 <target_temperature_bed+0x1>
   169c8:	60 93 71 06 	sts	0x0671, r22	; 0x800671 <target_temperature_bed>
   169cc:	05 c0       	rjmp	.+10     	; 0x169d8 <process_commands() [clone .part.46]+0x3fa4>
        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 <code_seen(char) [clone .lto_priv.549]>
   169d4:	81 11       	cpse	r24, r1
   169d6:	f2 cf       	rjmp	.-28     	; 0x169bc <process_commands() [clone .part.46]+0x3f88>
		{
          setTargetBed(code_value());
        }
        codenum = _millis();
   169d8:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <target_temperature_bed>
   169e8:	70 91 72 06 	lds	r23, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   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 <current_temperature_bed>
   169fe:	30 91 ee 04 	lds	r19, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   16a02:	40 91 ef 04 	lds	r20, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   16a06:	50 91 f0 04 	lds	r21, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   16a0a:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   16a0e:	18 16       	cp	r1, r24
   16a10:	0c f0       	brlt	.+2      	; 0x16a14 <process_commands() [clone .part.46]+0x3fe0>
   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 <process_commands() [clone .part.46]+0x4024>
   16a20:	60 91 71 06 	lds	r22, 0x0671	; 0x800671 <target_temperature_bed>
   16a24:	70 91 72 06 	lds	r23, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   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 <current_temperature_bed>
   16a3c:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   16a40:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   16a44:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <process_commands() [clone .part.46]+0x4040>
   16a50:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   16a54:	87 fd       	sbrc	r24, 7
   16a56:	14 c0       	rjmp	.+40     	; 0x16a80 <process_commands() [clone .part.46]+0x404c>
          }
          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 <lang_get_translation>
   16a60:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
		heating_status = HeatingStatus::BED_HEATING_COMPLETE;
   16a64:	84 e0       	ldi	r24, 0x04	; 4
   16a66:	80 93 e1 03 	sts	0x03E1, r24	; 0x8003e1 <heating_status>

        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 <Timer<unsigned long>::start()>
   16a72:	49 cb       	rjmp	.-2414   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <process_commands() [clone .part.46]+0x4024>
   16a7c:	11 11       	cpse	r17, r1
   16a7e:	ec cf       	rjmp	.-40     	; 0x16a58 <process_commands() [clone .part.46]+0x4024>
        {
          if (lcd_commands_type == LcdCommands::LongPause) {
   16a80:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   16a84:	82 30       	cpi	r24, 0x02	; 2
   16a86:	41 f3       	breq	.-48     	; 0x16a58 <process_commands() [clone .part.46]+0x4024>
            // 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 <millis2>
   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 <process_commands() [clone .part.46]+0x4076>
          {
			  if (!farm_mode) {
				  serialecho_temperatures();
   16a9e:	0e 94 f6 76 	call	0xedec	; 0xedec <serialecho_temperatures()>
			  }
				  codenum = _millis();
   16aa2:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   16aa6:	6b 01       	movw	r12, r22
   16aa8:	7c 01       	movw	r14, r24

          }
          manage_heater();
   16aaa:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
          manage_inactivity();
   16aae:	80 e0       	ldi	r24, 0x00	; 0
   16ab0:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
          lcd_update(0);
   16ab4:	80 e0       	ldi	r24, 0x00	; 0
   16ab6:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   16aba:	ae cf       	rjmp	.-164    	; 0x16a18 <process_commands() [clone .part.46]+0x3fe4>

    #### 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<speed> 0 .. 255
        if (code_seen('S')){
   16abc:	83 e5       	ldi	r24, 0x53	; 83
   16abe:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16ac2:	88 23       	and	r24, r24
   16ac4:	29 f0       	breq	.+10     	; 0x16ad0 <process_commands() [clone .part.46]+0x409c>
           fanSpeed = code_value_uint8();
   16ac6:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   16aca:	80 93 e5 03 	sts	0x03E5, r24	; 0x8003e5 <fanSpeed>
   16ace:	1b cb       	rjmp	.-2506   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        }
        else {
          fanSpeed = 255;
   16ad0:	8f ef       	ldi	r24, 0xFF	; 255
   16ad2:	80 93 e5 03 	sts	0x03E5, r24	; 0x8003e5 <fanSpeed>
   16ad6:	17 cb       	rjmp	.-2514   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    /*!
    ### M107 - Fan off <a href="https://reprap.org/wiki/G-code#M107:_Fan_Off">M107: Fan Off</a>
    */
    case 107:
        fanSpeed = 0;
   16ad8:	10 92 e5 03 	sts	0x03E5, r1	; 0x8003e5 <fanSpeed>
   16adc:	14 cb       	rjmp	.-2520   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    /*!
    ### M83 - Set E axis to relative mode <a href="https://reprap.org/wiki/G-code#M83:_Set_extruder_to_relative_mode">M83: Set extruder to relative mode</a>
    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 <axis_relative_modes>
   16ae2:	88 60       	ori	r24, 0x08	; 8
   16ae4:	80 93 e3 03 	sts	0x03E3, r24	; 0x8003e3 <axis_relative_modes>
   16ae8:	0e cb       	rjmp	.-2532   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    ### M18 - Disable steppers <a href="https://reprap.org/wiki/G-code#M18:_Disable_all_stepper_motors">M18: Disable all stepper motors</a>
    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 <code_seen(char) [clone .lto_priv.549]>
   16af0:	88 23       	and	r24, r24
   16af2:	99 f0       	breq	.+38     	; 0x16b1a <process_commands() [clone .part.46]+0x40e6>
        stepper_inactive_time = code_value() * 1000;
   16af4:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <stepper_inactive_time>
   16b0c:	70 93 35 02 	sts	0x0235, r23	; 0x800235 <stepper_inactive_time+0x1>
   16b10:	80 93 36 02 	sts	0x0236, r24	; 0x800236 <stepper_inactive_time+0x2>
   16b14:	90 93 37 02 	sts	0x0237, r25	; 0x800237 <stepper_inactive_time+0x3>
   16b18:	f6 ca       	rjmp	.-2580   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      }
      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 <code_seen(char) [clone .lto_priv.549]>
   16b20:	88 23       	and	r24, r24
   16b22:	d1 f0       	breq	.+52     	; 0x16b58 <process_commands() [clone .part.46]+0x4124>
          disable_e0();
          finishAndDisableSteppers();
        }
        else
        {
          st_synchronize();
   16b24:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
      if (code_seen('X')) disable_x();
   16b28:	88 e5       	ldi	r24, 0x58	; 88
   16b2a:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16b2e:	81 11       	cpse	r24, r1
   16b30:	28 c0       	rjmp	.+80     	; 0x16b82 <process_commands() [clone .part.46]+0x414e>
      if (code_seen('Y')) disable_y();
   16b32:	89 e5       	ldi	r24, 0x59	; 89
   16b34:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16b38:	88 23       	and	r24, r24
   16b3a:	19 f0       	breq	.+6      	; 0x16b42 <process_commands() [clone .part.46]+0x410e>
   16b3c:	16 9a       	sbi	0x02, 6	; 2
   16b3e:	10 92 8f 06 	sts	0x068F, r1	; 0x80068f <axis_known_position+0x1>
      if (code_seen('Z')) disable_z();
   16b42:	8a e5       	ldi	r24, 0x5A	; 90
   16b44:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
#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 <code_seen(char) [clone .lto_priv.549]>
   16b4e:	88 23       	and	r24, r24
   16b50:	09 f4       	brne	.+2      	; 0x16b54 <process_commands() [clone .part.46]+0x4120>
   16b52:	d9 ca       	rjmp	.-2638   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   16b54:	14 9a       	sbi	0x02, 4	; 2
   16b56:	d7 ca       	rjmp	.-2642   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      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 <code_seen(char) [clone .lto_priv.549]>
   16b5e:	81 11       	cpse	r24, r1
   16b60:	e1 cf       	rjmp	.-62     	; 0x16b24 <process_commands() [clone .part.46]+0x40f0>
   16b62:	8a e5       	ldi	r24, 0x5A	; 90
   16b64:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16b68:	81 11       	cpse	r24, r1
   16b6a:	dc cf       	rjmp	.-72     	; 0x16b24 <process_commands() [clone .part.46]+0x40f0>
   16b6c:	85 e4       	ldi	r24, 0x45	; 69
   16b6e:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   16b72:	81 11       	cpse	r24, r1
   16b74:	d7 cf       	rjmp	.-82     	; 0x16b24 <process_commands() [clone .part.46]+0x40f0>
        if(all_axis)
        {
          st_synchronize();
   16b76:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
          disable_e0();
   16b7a:	14 9a       	sbi	0x02, 4	; 2
          finishAndDisableSteppers();
   16b7c:	0e 94 00 82 	call	0x10400	; 0x10400 <finishAndDisableSteppers()>
   16b80:	c2 ca       	rjmp	.-2684   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        }
        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 <axis_known_position>
   16b88:	d4 cf       	rjmp	.-88     	; 0x16b32 <process_commands() [clone .part.46]+0x40fe>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   16b90:	88 23       	and	r24, r24
   16b92:	09 f4       	brne	.+2      	; 0x16b96 <process_commands() [clone .part.46]+0x4162>
   16b94:	b8 ca       	rjmp	.-2704   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	    safetytimer_inactive_time = code_value() * 1000;
   16b96:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <safetytimer_inactive_time>
   16bae:	70 93 31 02 	sts	0x0231, r23	; 0x800231 <safetytimer_inactive_time+0x1>
   16bb2:	80 93 32 02 	sts	0x0232, r24	; 0x800232 <safetytimer_inactive_time+0x2>
   16bb6:	90 93 33 02 	sts	0x0233, r25	; 0x800233 <safetytimer_inactive_time+0x3>
		safetyTimer.start();
   16bba:	89 ed       	ldi	r24, 0xD9	; 217
   16bbc:	95 e0       	ldi	r25, 0x05	; 5
   16bbe:	0f 94 cb 2c 	call	0x25996	; 0x25996 <Timer<unsigned long>::start()>
   16bc2:	a1 ca       	rjmp	.-2750   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <code_seen(char) [clone .lto_priv.549]>
   16be0:	88 23       	and	r24, r24
   16be2:	09 f4       	brne	.+2      	; 0x16be6 <process_commands() [clone .part.46]+0x41b2>
   16be4:	67 c0       	rjmp	.+206    	; 0x16cb4 <process_commands() [clone .part.46]+0x4280>
        {
          float value = code_value();
   16be6:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x41c0>
   16bf2:	6a c0       	rjmp	.+212    	; 0x16cc8 <process_commands() [clone .part.46]+0x4294>
            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 <process_commands() [clone .part.46]+0x426c>
              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 <cs+0x10>
   16c0c:	70 91 ce 0d 	lds	r23, 0x0DCE	; 0x800dce <cs+0x11>
   16c10:	80 91 cf 0d 	lds	r24, 0x0DCF	; 0x800dcf <cs+0x12>
   16c14:	90 91 d0 0d 	lds	r25, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <cs+0x54>
   16c28:	70 91 12 0e 	lds	r23, 0x0E12	; 0x800e12 <cs+0x55>
   16c2c:	80 91 13 0e 	lds	r24, 0x0E13	; 0x800e13 <cs+0x56>
   16c30:	90 91 14 0e 	lds	r25, 0x0E14	; 0x800e14 <cs+0x57>
   16c34:	0f 94 dd d6 	call	0x3adba	; 0x3adba <__mulsf3>
   16c38:	60 93 11 0e 	sts	0x0E11, r22	; 0x800e11 <cs+0x54>
   16c3c:	70 93 12 0e 	sts	0x0E12, r23	; 0x800e12 <cs+0x55>
   16c40:	80 93 13 0e 	sts	0x0E13, r24	; 0x800e13 <cs+0x56>
   16c44:	90 93 14 0e 	sts	0x0E14, r25	; 0x800e14 <cs+0x57>
              max_feedrate[E_AXIS] *= factor;
   16c48:	20 90 71 02 	lds	r2, 0x0271	; 0x800271 <max_feedrate>
   16c4c:	30 90 72 02 	lds	r3, 0x0272	; 0x800272 <max_feedrate+0x1>
   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 <max_acceleration_steps_per_s2+0xc>
   16c74:	70 91 5a 05 	lds	r23, 0x055A	; 0x80055a <max_acceleration_steps_per_s2+0xd>
   16c78:	80 91 5b 05 	lds	r24, 0x055B	; 0x80055b <max_acceleration_steps_per_s2+0xe>
   16c7c:	90 91 5c 05 	lds	r25, 0x055C	; 0x80055c <max_acceleration_steps_per_s2+0xf>
   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 <max_acceleration_steps_per_s2+0xc>
   16c94:	70 93 5a 05 	sts	0x055A, r23	; 0x80055a <max_acceleration_steps_per_s2+0xd>
   16c98:	80 93 5b 05 	sts	0x055B, r24	; 0x80055b <max_acceleration_steps_per_s2+0xe>
   16c9c:	90 93 5c 05 	sts	0x055C, r25	; 0x80055c <max_acceleration_steps_per_s2+0xf>
            }
            cs.axis_steps_per_mm[E_AXIS] = value;
   16ca0:	40 92 cd 0d 	sts	0x0DCD, r4	; 0x800dcd <cs+0x10>
   16ca4:	50 92 ce 0d 	sts	0x0DCE, r5	; 0x800dce <cs+0x11>
   16ca8:	60 92 cf 0d 	sts	0x0DCF, r6	; 0x800dcf <cs+0x12>
   16cac:	70 92 d0 0d 	sts	0x0DD0, r7	; 0x800dd0 <cs+0x13>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            fsensor.init();
   16cb0:	0f 94 30 7c 	call	0x2f860	; 0x2f860 <PAT9125_sensor::init() [clone .constprop.230]>
   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 <process_commands() [clone .part.46]+0x428e>
   16cc0:	8a cf       	rjmp	.-236    	; 0x16bd6 <process_commands() [clone .part.46]+0x41a2>
          } else {
            cs.axis_steps_per_mm[i] = value;
          }
        }
      }
      reset_acceleration_rates();
   16cc2:	0f 94 56 64 	call	0x2c8ac	; 0x2c8ac <reset_acceleration_rates()>
   16cc6:	1f ca       	rjmp	.-3010   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            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 <process_commands() [clone .part.46]+0x4280>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   16cde:	88 23       	and	r24, r24
   16ce0:	09 f4       	brne	.+2      	; 0x16ce4 <process_commands() [clone .part.46]+0x42b0>
   16ce2:	11 ca       	rjmp	.-3038   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	    gcode_LastN = code_value_long();
   16ce4:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
   16ce8:	60 93 78 03 	sts	0x0378, r22	; 0x800378 <gcode_LastN>
   16cec:	70 93 79 03 	sts	0x0379, r23	; 0x800379 <gcode_LastN+0x1>
   16cf0:	80 93 7a 03 	sts	0x037A, r24	; 0x80037a <gcode_LastN+0x2>
   16cf4:	90 93 7b 03 	sts	0x037B, r25	; 0x80037b <gcode_LastN+0x3>
   16cf8:	06 ca       	rjmp	.-3060   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	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 <serialprintPGM(char const*)>
			SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval);
   16d02:	c0 90 2f 02 	lds	r12, 0x022F	; 0x80022f <host_keepalive_interval>
   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 <serialprintPGM(char const*)>
}

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 <MarlinSerial::printNumber(unsigned long, unsigned char)>
			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 <MarlinSerial::println()>
   16d22:	f1 c9       	rjmp	.-3102   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    */
	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 <code_seen(char) [clone .lto_priv.549]>
   16d2a:	88 23       	and	r24, r24
   16d2c:	09 f4       	brne	.+2      	; 0x16d30 <process_commands() [clone .part.46]+0x42fc>
   16d2e:	5a c0       	rjmp	.+180    	; 0x16de4 <process_commands() [clone .part.46]+0x43b0>
          // 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 <strchr_pointer>
   16d34:	10 91 94 03 	lds	r17, 0x0394	; 0x800394 <strchr_pointer+0x1>
   16d38:	0f 5f       	subi	r16, 0xFF	; 255
   16d3a:	1f 4f       	sbci	r17, 0xFF	; 255
   16d3c:	10 93 94 03 	sts	0x0394, r17	; 0x800394 <strchr_pointer+0x1>
   16d40:	00 93 93 03 	sts	0x0393, r16	; 0x800393 <strchr_pointer>
    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 <oCheckVersion>
   16d48:	88 23       	and	r24, r24
   16d4a:	09 f4       	brne	.+2      	; 0x16d4e <process_commands() [clone .part.46]+0x431a>
   16d4c:	dc c9       	rjmp	.-3144   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

// 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 <parse_version(char const*, unsigned int*)>
   16d5a:	88 23       	and	r24, r24
   16d5c:	09 f4       	brne	.+2      	; 0x16d60 <process_commands() [clone .part.46]+0x432c>
   16d5e:	d3 c9       	rjmp	.-3162   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x434e>
   16d7e:	0c 94 54 cd 	jmp	0x19aa8	; 0x19aa8 <process_commands() [clone .part.46]+0x7074>
            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 <process_commands() [clone .part.46]+0x4356>
   16d88:	be c9       	rjmp	.-3204   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x433a>
   16d92:	b9 c9       	rjmp	.-3214   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        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 <delay_keep_alive(unsigned int)>
        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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        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_wait_for_click_delay(unsigned int)>
        lcd_update_enable(true);
   16dd2:	81 e0       	ldi	r24, 0x01	; 1
   16dd4:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
        lcd_clear();
   16dd8:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
        lcd_update(0);
   16ddc:	80 e0       	ldi	r24, 0x00	; 0
   16dde:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   16de2:	91 c9       	rjmp	.-3294   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      } 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 <eeprom_read_block>
          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 <serialprintPGM(char const*)>
          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 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM("+");
   16e04:	83 ec       	ldi	r24, 0xC3	; 195
   16e06:	96 e8       	ldi	r25, 0x86	; 134
   16e08:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
          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 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM("_");
   16e14:	8c eb       	ldi	r24, 0xBC	; 188
   16e16:	96 e8       	ldi	r25, 0x86	; 134
   16e18:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
          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 <serialprintPGM(char const*)>
          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 <serialprintPGM(char const*)>
          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 <serialprintPGM(char const*)>
          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 <serialprintPGM(char const*)>
   16e3c:	ce 01       	movw	r24, r28
   16e3e:	01 96       	adiw	r24, 0x01	; 1
   16e40:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
          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 <serialprintPGM(char const*)>
#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 <serialprintlnPGM(char const*)>
}

#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 <printf_P>
   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 <printf_P>
   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 <printf_P>
   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 <printf_P>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>

    /*!
    ### M114 - Get current position <a href="https://reprap.org/wiki/G-code#M114:_Get_Current_Position">M114: Get Current Position</a>
    */
    case 114:
		gcode_M114();
   16ecc:	0e 94 df 77 	call	0xefbe	; 0xefbe <gcode_M114()>
   16ed0:	1a c9       	rjmp	.-3532   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    /*!
    ### M117 - Display Message <a href="https://reprap.org/wiki/G-code#M117:_Display_Message">M117: Display Message</a>
    */
    case 117: {
        const char *src = strchr_pointer + 4; // "M117"
   16ed2:	e0 91 93 03 	lds	r30, 0x0393	; 0x800393 <strchr_pointer>
   16ed6:	f0 91 94 03 	lds	r31, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <process_commands() [clone .part.46]+0x44b2>
   16ee4:	01 96       	adiw	r24, 0x01	; 1
   16ee6:	0e 94 42 f5 	call	0x1ea84	; 0x1ea84 <lcd_setstatus(char const*)>
        custom_message_type = CustomMsg::M117;
   16eea:	87 e0       	ldi	r24, 0x07	; 7
   16eec:	80 93 c3 06 	sts	0x06C3, r24	; 0x8006c3 <custom_message_type>
   16ef0:	0a c9       	rjmp	.-3564   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <strchr_pointer>
   16ef6:	10 91 94 03 	lds	r17, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <process_commands() [clone .part.46]+0x450e>
          // 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 <process_commands() [clone .part.46]+0x450e>
   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 <process_commands() [clone .part.46]+0x450e>
          switch (p[0]) {
   16f1c:	91 34       	cpi	r25, 0x41	; 65
   16f1e:	71 f0       	breq	.+28     	; 0x16f3c <process_commands() [clone .part.46]+0x4508>
   16f20:	95 34       	cpi	r25, 0x45	; 69
   16f22:	09 f4       	brne	.+2      	; 0x16f26 <process_commands() [clone .part.46]+0x44f2>
            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 <process_commands() [clone .part.46]+0x44f8>
   16f3a:	e4 cf       	rjmp	.-56     	; 0x16f04 <process_commands() [clone .part.46]+0x44d0>

        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 <process_commands() [clone .part.46]+0x44f2>
          }
          p += 2;
          while (*p == ' ') ++p;
        }

        if (hasE) SERIAL_ECHO_START;
   16f42:	44 23       	and	r20, r20
   16f44:	21 f0       	breq	.+8      	; 0x16f4e <process_commands() [clone .part.46]+0x451a>
   16f46:	82 ef       	ldi	r24, 0xF2	; 242
   16f48:	9a ea       	ldi	r25, 0xAA	; 170
   16f4a:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
        if (hasA) SERIAL_ECHOPGM("//");
   16f4e:	ff 20       	and	r15, r15
   16f50:	21 f0       	breq	.+8      	; 0x16f5a <process_commands() [clone .part.46]+0x4526>
   16f52:	8f e2       	ldi	r24, 0x2F	; 47
   16f54:	96 e8       	ldi	r25, 0x86	; 134
   16f56:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>

        SERIAL_ECHOLN(p);
   16f5a:	c8 01       	movw	r24, r16
   16f5c:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
   16f60:	d2 c8       	rjmp	.-3676   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    /*!
    ### M119 - Get endstop states <a href="https://reprap.org/wiki/G-code#M119:_Get_Endstop_Status">M119: Get Endstop Status</a>
    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 <serialprintPGM(char const*)>
    SERIAL_PROTOCOLLN();
   16f6a:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
      #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 <serialprintPGM(char const*)>
        if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
   16f76:	1e 99       	sbic	0x03, 6	; 3
   16f78:	47 c0       	rjmp	.+142    	; 0x17008 <process_commands() [clone .part.46]+0x45d4>
          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 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   16f82:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
      #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 <serialprintPGM(char const*)>
        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 <process_commands() [clone .part.46]+0x45da>
          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 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   16f9e:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
      #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 <serialprintPGM(char const*)>
        if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
   16faa:	1d 99       	sbic	0x03, 5	; 3
   16fac:	33 c0       	rjmp	.+102    	; 0x17014 <process_commands() [clone .part.46]+0x45e0>
          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 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   16fb6:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
      #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 <serialprintPGM(char const*)>
        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 <process_commands() [clone .part.46]+0x45e6>
          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 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   16fd2:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
      #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 <serialprintPGM(char const*)>
        if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){
   16fde:	1c 99       	sbic	0x03, 4	; 3
   16fe0:	1f c0       	rjmp	.+62     	; 0x17020 <process_commands() [clone .part.46]+0x45ec>
          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 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   16fea:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
      #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 <serialprintPGM(char const*)>
        if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){
   16ff6:	01 9b       	sbis	0x00, 1	; 0
   16ff8:	16 c0       	rjmp	.+44     	; 0x17026 <process_commands() [clone .part.46]+0x45f2>
          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 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   17002:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
   17006:	7f c8       	rjmp	.-3842   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <process_commands() [clone .part.46]+0x454a>
        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 <process_commands() [clone .part.46]+0x4566>
        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 <process_commands() [clone .part.46]+0x457e>
        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 <process_commands() [clone .part.46]+0x459a>
        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 <process_commands() [clone .part.46]+0x45b2>
        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 <process_commands() [clone .part.46]+0x45ca>

    E0:3240 RPM PRN1:4560 RPM E0@:255 PRN1@:255

    */
    case 123:
    gcode_M123();
   1702c:	0e 94 1c 66 	call	0xcc38	; 0xcc38 <gcode_M123()>
   17030:	6a c8       	rjmp	.-3884   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    */
    case 200: // M200 D<millimeters> 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 <code_seen(char) [clone .lto_priv.549]>
   17038:	88 23       	and	r24, r24
   1703a:	69 f0       	breq	.+26     	; 0x17056 <process_commands() [clone .part.46]+0x4622>
          extruder = code_value_uint8();
   1703c:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
		  if(extruder >= EXTRUDERS) {
   17040:	88 23       	and	r24, r24
   17042:	49 f0       	breq	.+18     	; 0x17056 <process_commands() [clone .part.46]+0x4622>
            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 <serialprintPGM(char const*)>
   1704c:	8e e6       	ldi	r24, 0x6E	; 110
   1704e:	97 e6       	ldi	r25, 0x67	; 103
   17050:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
   17054:	58 c8       	rjmp	.-3920   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            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 <code_seen(char) [clone .lto_priv.549]>
   1705c:	88 23       	and	r24, r24
   1705e:	09 f4       	brne	.+2      	; 0x17062 <process_commands() [clone .part.46]+0x462e>
   17060:	52 c8       	rjmp	.-3932   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		  float diameter = code_value();
   17062:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
		  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 <process_commands() [clone .part.46]+0x464a>
			// 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 <cs+0x97>
		  }
        } else {
          //reserved for setting filament diameter via UFID or filament measuring device
          break;
        }
		calculate_extruder_multipliers();
   17078:	0e 94 51 65 	call	0xcaa2	; 0xcaa2 <calculate_extruder_multipliers()>
   1707c:	44 c8       	rjmp	.-3960   	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
			// 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 <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x466c>
   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 <cs+0x98>
   170a4:	d0 92 56 0e 	sts	0x0E56, r13	; 0x800e56 <cs+0x99>
   170a8:	e0 92 57 0e 	sts	0x0E57, r14	; 0x800e57 <cs+0x9a>
   170ac:	f0 92 58 0e 	sts	0x0E58, r15	; 0x800e58 <cs+0x9b>
				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 <cs+0x97>
   170b6:	e0 cf       	rjmp	.-64     	; 0x17078 <process_commands() [clone .part.46]+0x4644>
   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 <code_seen(char) [clone .lto_priv.549]>
   170d4:	88 23       	and	r24, r24
   170d6:	41 f1       	breq	.+80     	; 0x17128 <process_commands() [clone .part.46]+0x46f4>
			{
				unsigned long val = code_value();
   170d8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x4702>
				{
					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 <process_commands() [clone .part.46]+0x470c>
   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 <process_commands() [clone .part.46]+0x46d8>
   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 <process_commands() [clone .part.46]+0x4696>
   17134:	c6 cd       	rjmp	.-1140   	; 0x16cc2 <process_commands() [clone .part.46]+0x428e>
		{
			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 <process_commands() [clone .part.46]+0x46d8>
				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 <process_commands() [clone .part.46]+0x46d8>
   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 <code_seen(char) [clone .lto_priv.549]>
   1716e:	88 23       	and	r24, r24
   17170:	71 f1       	breq	.+92     	; 0x171ce <process_commands() [clone .part.46]+0x479a>
			{
				float val = code_value();
   17172:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x47ba>
				{
					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 <process_commands() [clone .part.46]+0x47ac>
    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 <process_commands() [clone .part.46]+0x47c4>
						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 <process_commands() [clone .part.46]+0x4730>
   171dc:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
#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 <process_commands() [clone .part.46]+0x4764>
    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 <process_commands() [clone .part.46]+0x4778>
				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 <process_commands() [clone .part.46]+0x4778>
          // 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 <code_seen(char) [clone .lto_priv.549]>
   17208:	88 23       	and	r24, r24
   1720a:	51 f0       	breq	.+20     	; 0x17220 <process_commands() [clone .part.46]+0x47ec>
            cs.acceleration = code_value();
   1720c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   17210:	60 93 f1 0d 	sts	0x0DF1, r22	; 0x800df1 <cs+0x34>
   17214:	70 93 f2 0d 	sts	0x0DF2, r23	; 0x800df2 <cs+0x35>
   17218:	80 93 f3 0d 	sts	0x0DF3, r24	; 0x800df3 <cs+0x36>
   1721c:	90 93 f4 0d 	sts	0x0DF4, r25	; 0x800df4 <cs+0x37>
          if(code_seen('R'))
   17220:	82 e5       	ldi	r24, 0x52	; 82
   17222:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   17226:	88 23       	and	r24, r24
   17228:	51 f0       	breq	.+20     	; 0x1723e <process_commands() [clone .part.46]+0x480a>
            cs.retract_acceleration = code_value();
   1722a:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   1722e:	60 93 f5 0d 	sts	0x0DF5, r22	; 0x800df5 <cs+0x38>
   17232:	70 93 f6 0d 	sts	0x0DF6, r23	; 0x800df6 <cs+0x39>
   17236:	80 93 f7 0d 	sts	0x0DF7, r24	; 0x800df7 <cs+0x3a>
   1723a:	90 93 f8 0d 	sts	0x0DF8, r25	; 0x800df8 <cs+0x3b>
          if(code_seen('T'))
   1723e:	84 e5       	ldi	r24, 0x54	; 84
   17240:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   17244:	88 23       	and	r24, r24
   17246:	11 f4       	brne	.+4      	; 0x1724c <process_commands() [clone .part.46]+0x4818>
   17248:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            cs.travel_acceleration = code_value();
   1724c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   17250:	60 93 7d 0e 	sts	0x0E7D, r22	; 0x800e7d <cs+0xc0>
   17254:	70 93 7e 0e 	sts	0x0E7E, r23	; 0x800e7e <cs+0xc1>
   17258:	80 93 7f 0e 	sts	0x0E7F, r24	; 0x800e7f <cs+0xc2>
   1725c:	90 93 80 0e 	sts	0x0E80, r25	; 0x800e80 <cs+0xc3>
   17260:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   1726a:	88 23       	and	r24, r24
   1726c:	51 f0       	breq	.+20     	; 0x17282 <process_commands() [clone .part.46]+0x484e>
   1726e:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   17272:	60 93 f9 0d 	sts	0x0DF9, r22	; 0x800df9 <cs+0x3c>
   17276:	70 93 fa 0d 	sts	0x0DFA, r23	; 0x800dfa <cs+0x3d>
   1727a:	80 93 fb 0d 	sts	0x0DFB, r24	; 0x800dfb <cs+0x3e>
   1727e:	90 93 fc 0d 	sts	0x0DFC, r25	; 0x800dfc <cs+0x3f>
      if(code_seen('T')) cs.mintravelfeedrate = code_value();
   17282:	84 e5       	ldi	r24, 0x54	; 84
   17284:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   17288:	88 23       	and	r24, r24
   1728a:	51 f0       	breq	.+20     	; 0x172a0 <process_commands() [clone .part.46]+0x486c>
   1728c:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   17290:	60 93 fd 0d 	sts	0x0DFD, r22	; 0x800dfd <cs+0x40>
   17294:	70 93 fe 0d 	sts	0x0DFE, r23	; 0x800dfe <cs+0x41>
   17298:	80 93 ff 0d 	sts	0x0DFF, r24	; 0x800dff <cs+0x42>
   1729c:	90 93 00 0e 	sts	0x0E00, r25	; 0x800e00 <cs+0x43>
      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 <code_seen(char) [clone .lto_priv.549]>
   172a6:	88 23       	and	r24, r24
   172a8:	61 f0       	breq	.+24     	; 0x172c2 <process_commands() [clone .part.46]+0x488e>
   172aa:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   172ae:	0f 94 b0 de 	call	0x3bd60	; 0x3bd60 <__fixunssfsi>
   172b2:	60 93 01 0e 	sts	0x0E01, r22	; 0x800e01 <cs+0x44>
   172b6:	70 93 02 0e 	sts	0x0E02, r23	; 0x800e02 <cs+0x45>
   172ba:	80 93 03 0e 	sts	0x0E03, r24	; 0x800e03 <cs+0x46>
   172be:	90 93 04 0e 	sts	0x0E04, r25	; 0x800e04 <cs+0x47>
      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 <code_seen(char) [clone .lto_priv.549]>
   172c8:	88 23       	and	r24, r24
   172ca:	91 f0       	breq	.+36     	; 0x172f0 <process_commands() [clone .part.46]+0x48bc>
   172cc:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   172d0:	60 93 09 0e 	sts	0x0E09, r22	; 0x800e09 <cs+0x4c>
   172d4:	70 93 0a 0e 	sts	0x0E0A, r23	; 0x800e0a <cs+0x4d>
   172d8:	80 93 0b 0e 	sts	0x0E0B, r24	; 0x800e0b <cs+0x4e>
   172dc:	90 93 0c 0e 	sts	0x0E0C, r25	; 0x800e0c <cs+0x4f>
   172e0:	60 93 05 0e 	sts	0x0E05, r22	; 0x800e05 <cs+0x48>
   172e4:	70 93 06 0e 	sts	0x0E06, r23	; 0x800e06 <cs+0x49>
   172e8:	80 93 07 0e 	sts	0x0E07, r24	; 0x800e07 <cs+0x4a>
   172ec:	90 93 08 0e 	sts	0x0E08, r25	; 0x800e08 <cs+0x4b>
      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 <code_seen(char) [clone .lto_priv.549]>
   172f6:	88 23       	and	r24, r24
   172f8:	51 f0       	breq	.+20     	; 0x1730e <process_commands() [clone .part.46]+0x48da>
   172fa:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   172fe:	60 93 09 0e 	sts	0x0E09, r22	; 0x800e09 <cs+0x4c>
   17302:	70 93 0a 0e 	sts	0x0E0A, r23	; 0x800e0a <cs+0x4d>
   17306:	80 93 0b 0e 	sts	0x0E0B, r24	; 0x800e0b <cs+0x4e>
   1730a:	90 93 0c 0e 	sts	0x0E0C, r25	; 0x800e0c <cs+0x4f>
      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 <code_seen(char) [clone .lto_priv.549]>
   17314:	88 23       	and	r24, r24
   17316:	51 f0       	breq	.+20     	; 0x1732c <process_commands() [clone .part.46]+0x48f8>
   17318:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   1731c:	60 93 0d 0e 	sts	0x0E0D, r22	; 0x800e0d <cs+0x50>
   17320:	70 93 0e 0e 	sts	0x0E0E, r23	; 0x800e0e <cs+0x51>
   17324:	80 93 0f 0e 	sts	0x0E0F, r24	; 0x800e0f <cs+0x52>
   17328:	90 93 10 0e 	sts	0x0E10, r25	; 0x800e10 <cs+0x53>
      if(code_seen('E'))
   1732c:	85 e4       	ldi	r24, 0x45	; 69
   1732e:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   17332:	88 23       	and	r24, r24
   17334:	11 f4       	brne	.+4      	; 0x1733a <process_commands() [clone .part.46]+0x4906>
   17336:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
          float e = code_value();
   1733a:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
#ifndef LA_NOCOMPAT
          e = la10c_jerk(e);
   1733e:	0e 94 4a 81 	call	0x10294	; 0x10294 <la10c_jerk(float)>
#endif
          cs.max_jerk[E_AXIS] = e;
   17342:	60 93 11 0e 	sts	0x0E11, r22	; 0x800e11 <cs+0x54>
   17346:	70 93 12 0e 	sts	0x0E12, r23	; 0x800e12 <cs+0x55>
   1734a:	80 93 13 0e 	sts	0x0E13, r24	; 0x800e13 <cs+0x56>
   1734e:	90 93 14 0e 	sts	0x0E14, r25	; 0x800e14 <cs+0x57>
   17352:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <code_seen(char) [clone .lto_priv.549]>
   1736c:	88 23       	and	r24, r24
   1736e:	39 f0       	breq	.+14     	; 0x1737e <process_commands() [clone .part.46]+0x494a>
   17370:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x492e>
   1738c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   17396:	88 23       	and	r24, r24
   17398:	51 f0       	breq	.+20     	; 0x173ae <process_commands() [clone .part.46]+0x497a>
      {
        cs.retract_recover_length = code_value() ;
   1739a:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   1739e:	60 93 4c 0e 	sts	0x0E4C, r22	; 0x800e4c <cs+0x8f>
   173a2:	70 93 4d 0e 	sts	0x0E4D, r23	; 0x800e4d <cs+0x90>
   173a6:	80 93 4e 0e 	sts	0x0E4E, r24	; 0x800e4e <cs+0x91>
   173aa:	90 93 4f 0e 	sts	0x0E4F, r25	; 0x800e4f <cs+0x92>
      }
      if(code_seen('F'))
   173ae:	86 e4       	ldi	r24, 0x46	; 70
   173b0:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   173b4:	88 23       	and	r24, r24
   173b6:	11 f4       	brne	.+4      	; 0x173bc <process_commands() [clone .part.46]+0x4988>
   173b8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        cs.retract_recover_feedrate = get_feedrate_mm_s(code_value());
   173bc:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   173c0:	0e 94 5f 66 	call	0xccbe	; 0xccbe <get_feedrate_mm_s(float)>
   173c4:	60 93 50 0e 	sts	0x0E50, r22	; 0x800e50 <cs+0x93>
   173c8:	70 93 51 0e 	sts	0x0E51, r23	; 0x800e51 <cs+0x94>
   173cc:	80 93 52 0e 	sts	0x0E52, r24	; 0x800e52 <cs+0x95>
   173d0:	90 93 53 0e 	sts	0x0E53, r25	; 0x800e53 <cs+0x96>
   173d4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    #### 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 <code_seen(char) [clone .lto_priv.549]>
   173de:	88 23       	and	r24, r24
   173e0:	11 f4       	brne	.+4      	; 0x173e6 <process_commands() [clone .part.46]+0x49b2>
   173e2:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        switch(code_value_uint8())
   173e6:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   173ea:	88 23       	and	r24, r24
   173ec:	c1 f0       	breq	.+48     	; 0x1741e <process_commands() [clone .part.46]+0x49ea>
   173ee:	81 30       	cpi	r24, 0x01	; 1
   173f0:	e1 f0       	breq	.+56     	; 0x1742a <process_commands() [clone .part.46]+0x49f6>
            #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 <serialprintPGM(char const*)>
            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 <serialprintPGM(char const*)>
            SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
   17402:	80 91 91 12 	lds	r24, 0x1291	; 0x801291 <bufindr>
   17406:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   1740a:	89 55       	subi	r24, 0x59	; 89
   1740c:	9f 4e       	sbci	r25, 0xEF	; 239
   1740e:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
            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 <serialprintlnPGM(char const*)>
   1741a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
      {
        switch(code_value_uint8())
        {
          case 0:
          {
            cs.autoretract_enabled=false;
   1741e:	10 92 3f 0e 	sts	0x0E3F, r1	; 0x800e3f <cs+0x82>
            retracted[0]=false;
   17422:	10 92 8d 06 	sts	0x068D, r1	; 0x80068d <retracted>
   17426:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
              retracted[2]=false;
            #endif
          }break;
          case 1:
          {
            cs.autoretract_enabled=true;
   1742a:	80 93 3f 0e 	sts	0x0E3F, r24	; 0x800e3f <cs+0x82>
            retracted[0]=false;
   1742e:	10 92 8d 06 	sts	0x068D, r1	; 0x80068d <retracted>
   17432:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            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 <cs+0xc4>
   1743a:	50 90 82 0e 	lds	r5, 0x0E82	; 0x800e82 <cs+0xc5>
   1743e:	60 90 83 0e 	lds	r6, 0x0E83	; 0x800e83 <cs+0xc6>
   17442:	70 90 84 0e 	lds	r7, 0x0E84	; 0x800e84 <cs+0xc7>
   17446:	0c 94 26 a8 	jmp	0x1504c	; 0x1504c <process_commands() [clone .part.46]+0x2618>
        float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment;
   1744a:	80 90 85 0e 	lds	r8, 0x0E85	; 0x800e85 <cs+0xc8>
   1744e:	90 90 86 0e 	lds	r9, 0x0E86	; 0x800e86 <cs+0xc9>
   17452:	a0 90 87 0e 	lds	r10, 0x0E87	; 0x800e87 <cs+0xca>
   17456:	b0 90 88 0e 	lds	r11, 0x0E88	; 0x800e88 <cs+0xcb>
   1745a:	0c 94 31 a8 	jmp	0x15062	; 0x15062 <process_commands() [clone .part.46]+0x262e>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   17464:	18 2f       	mov	r17, r24
   17466:	88 23       	and	r24, r24
   17468:	41 f0       	breq	.+16     	; 0x1747a <process_commands() [clone .part.46]+0x4a46>
        {
            saved_feedmultiply_mm = feedmultiply;
   1746a:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
   1746e:	90 91 3a 02 	lds	r25, 0x023A	; 0x80023a <feedmultiply+0x1>
   17472:	90 93 2e 02 	sts	0x022E, r25	; 0x80022e <saved_feedmultiply_mm+0x1>
   17476:	80 93 2d 02 	sts	0x022D, r24	; 0x80022d <saved_feedmultiply_mm>
            codesWereSeen = true;
        }
        if (code_seen('S'))
   1747a:	83 e5       	ldi	r24, 0x53	; 83
   1747c:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   17480:	08 2f       	mov	r16, r24
   17482:	88 23       	and	r24, r24
   17484:	39 f0       	breq	.+14     	; 0x17494 <process_commands() [clone .part.46]+0x4a60>
        {
            feedmultiply = code_value_short();
   17486:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   1748a:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <feedmultiply+0x1>
   1748e:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>
            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 <code_seen(char) [clone .lto_priv.549]>
   1749a:	88 23       	and	r24, r24
   1749c:	51 f0       	breq	.+20     	; 0x174b2 <process_commands() [clone .part.46]+0x4a7e>
        {
            feedmultiply = saved_feedmultiply_mm;
   1749e:	80 91 2d 02 	lds	r24, 0x022D	; 0x80022d <saved_feedmultiply_mm>
   174a2:	90 91 2e 02 	lds	r25, 0x022E	; 0x80022e <saved_feedmultiply_mm+0x1>
   174a6:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <feedmultiply+0x1>
   174aa:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>
   174ae:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            codesWereSeen = true;
        }
        if (!codesWereSeen)
   174b2:	11 11       	cpse	r17, r1
   174b4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        {
            printf_P(PSTR("%i%%\n"), feedmultiply);
   174b8:	80 91 3a 02 	lds	r24, 0x023A	; 0x80023a <feedmultiply+0x1>
   174bc:	8f 93       	push	r24
   174be:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
            extrudemultiply = code_value_short();
            calculate_extruder_multipliers();
        }
        else
        {
            printf_P(PSTR("%i%%\n"), extrudemultiply);
   174dc:	80 91 bd 02 	lds	r24, 0x02BD	; 0x8002bd <extrudemultiply+0x1>
   174e0:	8f 93       	push	r24
   174e2:	80 91 bc 02 	lds	r24, 0x02BC	; 0x8002bc <extrudemultiply>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   17506:	88 23       	and	r24, r24
   17508:	11 f4       	brne	.+4      	; 0x1750e <process_commands() [clone .part.46]+0x4ada>
   1750a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        int pin_number = code_value_short(); // pin number
   1750e:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
    */
	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 <process_commands() [clone .part.46]+0x4af4>
   17522:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <process_commands() [clone .part.46]+0x4b00>
   17530:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x4b16>
   17546:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x4b04>
              pin_number = -1;
              break;
            }
          }

          if (pin_number > -1)
   17554:	f7 fe       	sbrs	r15, 7
   17556:	02 c0       	rjmp	.+4      	; 0x1755c <process_commands() [clone .part.46]+0x4b28>
   17558:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
          {
            int target = LOW;

            st_synchronize();
   1755c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

            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 <pinMode>

            switch(pin_state){
   1756a:	0f 3f       	cpi	r16, 0xFF	; 255
   1756c:	10 07       	cpc	r17, r16
   1756e:	b1 f0       	breq	.+44     	; 0x1759c <process_commands() [clone .part.46]+0x4b68>
   17570:	01 30       	cpi	r16, 0x01	; 1
   17572:	11 05       	cpc	r17, r1
   17574:	11 f0       	breq	.+4      	; 0x1757a <process_commands() [clone .part.46]+0x4b46>
            }
          }

          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 <digitalRead>
   17580:	80 17       	cp	r24, r16
   17582:	91 07       	cpc	r25, r17
   17584:	11 f4       	brne	.+4      	; 0x1758a <process_commands() [clone .part.46]+0x4b56>
   17586:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
              manage_heater();
   1758a:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
              manage_inactivity();
   1758e:	80 e0       	ldi	r24, 0x00	; 0
   17590:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
              lcd_update(0);
   17594:	80 e0       	ldi	r24, 0x00	; 0
   17596:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   1759a:	ef cf       	rjmp	.-34     	; 0x1757a <process_commands() [clone .part.46]+0x4b46>
            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 <digitalRead>
   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 <process_commands() [clone .part.46]+0x4b78>
   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 <process_commands() [clone .part.46]+0x4b46>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x4bae>
   175c0:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x4bae>
   175d8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   175e8:	88 23       	and	r24, r24
   175ea:	71 f0       	breq	.+28     	; 0x17608 <process_commands() [clone .part.46]+0x4bd4>
          beepS = 0;
      else {
          beepS = code_value();
   175ec:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x4bd8>
              // 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 <delay2>
   17604:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
   17614:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   1761e:	88 23       	and	r24, r24
   17620:	51 f0       	breq	.+20     	; 0x17636 <process_commands() [clone .part.46]+0x4c02>
   17622:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   17626:	60 93 31 0e 	sts	0x0E31, r22	; 0x800e31 <cs+0x74>
   1762a:	70 93 32 0e 	sts	0x0E32, r23	; 0x800e32 <cs+0x75>
   1762e:	80 93 33 0e 	sts	0x0E33, r24	; 0x800e33 <cs+0x76>
   17632:	90 93 34 0e 	sts	0x0E34, r25	; 0x800e34 <cs+0x77>
        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 <code_seen(char) [clone .lto_priv.549]>
   1763c:	88 23       	and	r24, r24
   1763e:	81 f0       	breq	.+32     	; 0x17660 <process_commands() [clone .part.46]+0x4c2c>
   17640:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
#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 <cs+0x78>
   17654:	70 93 36 0e 	sts	0x0E36, r23	; 0x800e36 <cs+0x79>
   17658:	80 93 37 0e 	sts	0x0E37, r24	; 0x800e37 <cs+0x7a>
   1765c:	90 93 38 0e 	sts	0x0E38, r25	; 0x800e38 <cs+0x7b>
        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 <code_seen(char) [clone .lto_priv.549]>
   17666:	88 23       	and	r24, r24
   17668:	81 f0       	breq	.+32     	; 0x1768a <process_commands() [clone .part.46]+0x4c56>
   1766a:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
}

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 <cs+0x7c>
   1767e:	70 93 3a 0e 	sts	0x0E3A, r23	; 0x800e3a <cs+0x7d>
   17682:	80 93 3b 0e 	sts	0x0E3B, r24	; 0x800e3b <cs+0x7e>
   17686:	90 93 3c 0e 	sts	0x0E3C, r25	; 0x800e3c <cs+0x7f>

        updatePID();
   1768a:	0f 94 ab 3b 	call	0x27756	; 0x27756 <updatePID()>
       	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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   1769e:	60 91 31 0e 	lds	r22, 0x0E31	; 0x800e31 <cs+0x74>
   176a2:	70 91 32 0e 	lds	r23, 0x0E32	; 0x800e32 <cs+0x75>
   176a6:	80 91 33 0e 	lds	r24, 0x0E33	; 0x800e33 <cs+0x76>
   176aa:	90 91 34 0e 	lds	r25, 0x0E34	; 0x800e34 <cs+0x77>
   176ae:	42 e0       	ldi	r20, 0x02	; 2
   176b0:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
        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 <serialprintPGM(char const*)>
   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 <cs+0x78>
   176c8:	70 91 36 0e 	lds	r23, 0x0E36	; 0x800e36 <cs+0x79>
   176cc:	80 91 37 0e 	lds	r24, 0x0E37	; 0x800e37 <cs+0x7a>
   176d0:	90 91 38 0e 	lds	r25, 0x0E38	; 0x800e38 <cs+0x7b>
   176d4:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
   176d8:	42 e0       	ldi	r20, 0x02	; 2
   176da:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
        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 <serialprintPGM(char const*)>
#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 <cs+0x7c>
   176f2:	70 91 3a 0e 	lds	r23, 0x0E3A	; 0x800e3a <cs+0x7d>
   176f6:	80 91 3b 0e 	lds	r24, 0x0E3B	; 0x800e3b <cs+0x7e>
   176fa:	90 91 3c 0e 	lds	r25, 0x0E3C	; 0x800e3c <cs+0x7f>
   176fe:	0f 94 dd d6 	call	0x3adba	; 0x3adba <__mulsf3>
        SERIAL_PROTOCOLLN(unscalePID_d(cs.bedKd));
   17702:	0f 94 ab 75 	call	0x2eb56	; 0x2eb56 <MarlinSerial::println(double, int) [clone .constprop.367]>
   17706:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <backlightSupport>
   1770e:	88 23       	and	r24, r24
   17710:	11 f4       	brne	.+4      	; 0x17716 <process_commands() [clone .part.46]+0x4ce2>
   17712:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        if (code_seen('B') ) backlightLevel_HIGH = code_value_uint8();
   17716:	82 e4       	ldi	r24, 0x42	; 66
   17718:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   1771c:	88 23       	and	r24, r24
   1771e:	21 f0       	breq	.+8      	; 0x17728 <process_commands() [clone .part.46]+0x4cf4>
   17720:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   17724:	80 93 00 04 	sts	0x0400, r24	; 0x800400 <backlightLevel_HIGH>
        if (code_seen('D')) backlightLevel_LOW = code_value_uint8();
   17728:	84 e4       	ldi	r24, 0x44	; 68
   1772a:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   1772e:	88 23       	and	r24, r24
   17730:	21 f0       	breq	.+8      	; 0x1773a <process_commands() [clone .part.46]+0x4d06>
   17732:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   17736:	80 93 ff 03 	sts	0x03FF, r24	; 0x8003ff <backlightLevel_LOW>
        if (code_seen('S')) {
   1773a:	83 e5       	ldi	r24, 0x53	; 83
   1773c:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   17740:	88 23       	and	r24, r24
   17742:	31 f0       	breq	.+12     	; 0x17750 <process_commands() [clone .part.46]+0x4d1c>
          uint8_t mode = code_value_uint8();
   17744:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
          if (mode <= BACKLIGHT_MODE_AUTO) {
   17748:	83 30       	cpi	r24, 0x03	; 3
   1774a:	10 f4       	brcc	.+4      	; 0x17750 <process_commands() [clone .part.46]+0x4d1c>
            backlightMode = static_cast<Backlight_Mode>(mode);
   1774c:	80 93 4f 02 	sts	0x024F, r24	; 0x80024f <backlightMode>
         }
        }
        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 <code_seen(char) [clone .lto_priv.549]>
   17756:	88 23       	and	r24, r24
   17758:	79 f0       	breq	.+30     	; 0x17778 <process_commands() [clone .part.46]+0x4d44>
   1775a:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   1775e:	0f 97       	sbiw	r24, 0x0f	; 15
   17760:	64 f1       	brlt	.+88     	; 0x177ba <process_commands() [clone .part.46]+0x4d86>
   17762:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   17766:	85 38       	cpi	r24, 0x85	; 133
   17768:	93 40       	sbci	r25, 0x03	; 3
   1776a:	54 f5       	brge	.+84     	; 0x177c0 <process_commands() [clone .part.46]+0x4d8c>
   1776c:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   17770:	90 93 4e 02 	sts	0x024E, r25	; 0x80024e <backlightTimer_period+0x1>
   17774:	80 93 4d 02 	sts	0x024D, r24	; 0x80024d <backlightTimer_period>
        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 <backlightTimer_period+0x1>
   1777c:	8f 93       	push	r24
   1777e:	80 91 4d 02 	lds	r24, 0x024D	; 0x80024d <backlightTimer_period>
   17782:	8f 93       	push	r24
   17784:	80 91 4f 02 	lds	r24, 0x024F	; 0x80024f <backlightMode>
   17788:	1f 92       	push	r1
   1778a:	8f 93       	push	r24
   1778c:	80 91 ff 03 	lds	r24, 0x03FF	; 0x8003ff <backlightLevel_LOW>
   17790:	1f 92       	push	r1
   17792:	8f 93       	push	r24
   17794:	80 91 00 04 	lds	r24, 0x0400	; 0x800400 <backlightLevel_HIGH>
   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 <printf_P>
        backlight_save();
   177a8:	0e 94 cf 89 	call	0x1139e	; 0x1139e <backlight_save()>
   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 <process_commands() [clone .part.46]+0x36d2>
          uint8_t mode = code_value_uint8();
          if (mode <= BACKLIGHT_MODE_AUTO) {
            backlightMode = static_cast<Backlight_Mode>(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 <process_commands() [clone .part.46]+0x4d3c>
   177c0:	84 e8       	ldi	r24, 0x84	; 132
   177c2:	93 e0       	ldi	r25, 0x03	; 3
   177c4:	d5 cf       	rjmp	.-86     	; 0x17770 <process_commands() [clone .part.46]+0x4d3c>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   177cc:	88 23       	and	r24, r24
   177ce:	41 f0       	breq	.+16     	; 0x177e0 <process_commands() [clone .part.46]+0x4dac>
   177d0:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
}

#ifdef PREVENT_DANGEROUS_EXTRUDE
void set_extrude_min_temp(int temp)
{
  extrude_min_temp = temp;
   177d4:	90 93 6c 02 	sts	0x026C, r25	; 0x80026c <extrude_min_temp+0x1>
   177d8:	80 93 6b 02 	sts	0x026B, r24	; 0x80026b <extrude_min_temp>
   177dc:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    #### 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 <process_commands() [clone .part.46]+0x4da0>
    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 <code_seen(char) [clone .lto_priv.549]>
      - `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 <process_commands() [clone .part.46]+0x4dd6>
   177f4:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <process_commands() [clone .part.46]+0x4de2>
      - `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 <code_seen(char) [clone .lto_priv.549]>
   1781c:	88 23       	and	r24, r24
   1781e:	21 f0       	breq	.+8      	; 0x17828 <process_commands() [clone .part.46]+0x4df4>
   17820:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   1782e:	88 23       	and	r24, r24
   17830:	51 f0       	breq	.+20     	; 0x17846 <process_commands() [clone .part.46]+0x4e12>
   17832:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
      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 <PID_autotune(float, int, int)>
   17842:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    */
    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 <process_commands() [clone .part.46]+0x4e02>
    */
    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 <process_commands() [clone .part.46]+0x2884>
    - `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 <process_commands() [clone .part.46]+0x28a2>
   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 <process_commands() [clone .part.46]+0x28de>
   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 <process_commands() [clone .part.46]+0x28fc>
   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 <process_commands() [clone .part.46]+0x291a>
   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 <process_commands() [clone .part.46]+0x2938>
        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 <process_commands() [clone .part.46]+0x2964>
   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 <process_commands() [clone .part.46]+0x297c>
    - `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 <process_commands() [clone .part.46]+0x299a>
        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 <process_commands() [clone .part.46]+0x2a04>
        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 <thermal_model_report_settings()>
   17910:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            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 <process_commands() [clone .part.46]+0x4efc>
            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 <process_commands() [clone .part.46]+0x4ef8>
   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 <process_commands() [clone .part.46]+0x4f10>
   17940:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   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 <process_commands() [clone .part.46]+0x4f2c>
   1795c:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   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 <process_commands() [clone .part.46]+0x4f48>
   17978:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   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 <process_commands() [clone .part.46]+0x4f64>
   17994:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   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 <process_commands() [clone .part.46]+0x4f80>
   179b0:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   179b4:	17 fd       	sbrc	r17, 7
   179b6:	02 c0       	rjmp	.+4      	; 0x179bc <process_commands() [clone .part.46]+0x4f88>
   179b8:	0c 94 75 cd 	jmp	0x19aea	; 0x19aea <process_commands() [clone .part.46]+0x70b6>
   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 <process_commands() [clone .part.46]+0x4fa4>
   179d4:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   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 <process_commands() [clone .part.46]+0x4fb8>
   179e8:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
   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 <process_commands() [clone .part.46]+0x4fcc>
   179fc:	0c 94 ab aa 	jmp	0x15556	; 0x15556 <process_commands() [clone .part.46]+0x2b22>
            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 <process_commands() [clone .part.46]+0x504c>
   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 <process_commands() [clone .part.46]+0x504c>
    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 <process_commands() [clone .part.46]+0x504c>
   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 <process_commands() [clone .part.46]+0x504c>
        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 <TempMgrGuard::TempMgrGuard()>
    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 <thermal_model::setup() [clone .lto_priv.555]>
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 <TempMgrGuard::~TempMgrGuard()>
            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 <process_commands() [clone .part.46]+0x5062>
   17a8a:	81 e0       	ldi	r24, 0x01	; 1
   17a8c:	91 11       	cpse	r25, r1
   17a8e:	01 c0       	rjmp	.+2      	; 0x17a92 <process_commands() [clone .part.46]+0x505e>
   17a90:	80 e0       	ldi	r24, 0x00	; 0
   17a92:	0f 94 15 33 	call	0x2662a	; 0x2662a <thermal_model_set_enabled(bool)>

        // run autotune
        if(A >= 0) thermal_model_autotune(A, F > 0);
   17a96:	37 fe       	sbrs	r3, 7
   17a98:	02 c0       	rjmp	.+4      	; 0x17a9e <process_commands() [clone .part.46]+0x506a>
   17a9a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   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 <process_commands() [clone .part.46]+0x5078>
   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 <block_buffer_head>
   17ab6:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <process_commands() [clone .part.46]+0x509c>
   17ac0:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   17ac4:	85 30       	cpi	r24, 0x05	; 5
   17ac6:	79 f1       	breq	.+94     	; 0x17b26 <process_commands() [clone .part.46]+0x50f2>
   17ac8:	0e 94 79 67 	call	0xcef2	; 0xcef2 <printer_active()>
   17acc:	88 23       	and	r24, r24
   17ace:	59 f1       	breq	.+86     	; 0x17b26 <process_commands() [clone .part.46]+0x50f2>
        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 <sprintf_P>
        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 <lcd_setstatus_serial(char const*)>
        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 <process_commands() [clone .part.46]+0x36d2>

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 <process_commands() [clone .part.46]+0x50de>
   17b0e:	0c 94 b9 aa 	jmp	0x15572	; 0x15572 <process_commands() [clone .part.46]+0x2b3e>
   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 <process_commands() [clone .part.46]+0x2b3e>
        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 <busy_state>
    menu_set_block(MENU_BLOCK_THERMAL_MODEL_AUTOTUNE);
   17b2c:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
   17b30:	82 60       	ori	r24, 0x02	; 2
   17b32:	80 93 d4 03 	sts	0x03D4, r24	; 0x8003d4 <menu_block_mask>
    lcd_return_to_status();
   17b36:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>

    // 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 <process_commands() [clone .part.46]+0x512c>
    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 <thermal_model_reset_enabled(bool) [clone .lto_priv.420]>

    // 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 <serialprintlnPGM(char const*)>
    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 <process_commands() [clone .part.46]+0x5158>
   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 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>
   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 <target_temperature+0x1>
   17bae:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
        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 <current_temperature>
   17bbe:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   17bc2:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   17bc6:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   17bca:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   17bce:	87 fd       	sbrc	r24, 7
   17bd0:	58 c0       	rjmp	.+176    	; 0x17c82 <process_commands() [clone .part.46]+0x524e>
            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 <sprintf_P>
            lcd_setstatus_serial(tm_message);
   17be6:	c4 01       	movw	r24, r8
   17be8:	0e 94 05 f2 	call	0x1e40a	; 0x1e40a <lcd_setstatus_serial(char const*)>
    }
}

static void cooldown(float temp)
{
    uint8_t old_speed = fanSpeed;
   17bec:	00 91 e5 03 	lds	r16, 0x03E5	; 0x8003e5 <fanSpeed>
    set_fan_speed(255);
   17bf0:	8f ef       	ldi	r24, 0xFF	; 255
   17bf2:	0f 94 93 2e 	call	0x25d26	; 0x25d26 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>
   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 <current_temperature>
   17c06:	d0 90 b0 0d 	lds	r13, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   17c0a:	e0 90 b1 0d 	lds	r14, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   17c0e:	f0 90 b2 0d 	lds	r15, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <process_commands() [clone .part.46]+0x5240>
        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 <process_commands() [clone .part.46]+0x5240>
        float ambient = current_temperature_ambient + thermal_model::data.Ta_corr;
   17c2e:	20 91 55 06 	lds	r18, 0x0655	; 0x800655 <current_temperature_ambient>
   17c32:	30 91 56 06 	lds	r19, 0x0656	; 0x800656 <current_temperature_ambient+0x1>
   17c36:	40 91 57 06 	lds	r20, 0x0657	; 0x800657 <current_temperature_ambient+0x2>
   17c3a:	50 91 58 06 	lds	r21, 0x0658	; 0x800658 <current_temperature_ambient+0x3>
   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 <process_commands() [clone .part.46]+0x5240>
            // do not get stuck waiting very close to ambient temperature
            break;
        }
        waiting_handler();
   17c6e:	0f 94 5c 3b 	call	0x276b8	; 0x276b8 <thermal_model_cal::waiting_handler() [clone .lto_priv.423]>
   17c72:	c7 cf       	rjmp	.-114    	; 0x17c02 <process_commands() [clone .part.46]+0x51ce>
    }
    set_fan_speed(old_speed);
   17c74:	80 2f       	mov	r24, r16
   17c76:	0f 94 93 2e 	call	0x25d26	; 0x25d26 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>
        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 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]>
        }

        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 <sprintf_P>
        lcd_setstatus_serial(tm_message);
   17c96:	c4 01       	movw	r24, r8
   17c98:	0e 94 05 f2 	call	0x1e40a	; 0x1e40a <lcd_setstatus_serial(char const*)>
        target_temperature[0] = cal_temp;
   17c9c:	30 92 b6 0d 	sts	0x0DB6, r3	; 0x800db6 <target_temperature+0x1>
   17ca0:	20 92 b5 0d 	sts	0x0DB5, r2	; 0x800db5 <target_temperature>
        samples = record();
   17ca4:	0f 94 a8 10 	call	0x22150	; 0x22150 <thermal_model_cal::record(unsigned int) [clone .constprop.39]>
   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 <process_commands() [clone .part.46]+0x537e>
   17cbe:	a1 14       	cp	r10, r1
   17cc0:	b1 04       	cpc	r11, r1
   17cc2:	09 f4       	brne	.+2      	; 0x17cc6 <process_commands() [clone .part.46]+0x5292>
   17cc4:	76 c0       	rjmp	.+236    	; 0x17db2 <process_commands() [clone .part.46]+0x537e>
            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 <process_commands() [clone .part.46]+0x52c6>
            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 <current_temperature_ambient>
   17cfe:	d0 90 56 06 	lds	r13, 0x0656	; 0x800656 <current_temperature_ambient+0x1>
   17d02:	e0 90 57 06 	lds	r14, 0x0657	; 0x800657 <current_temperature_ambient+0x2>
   17d06:	f0 90 58 06 	lds	r15, 0x0658	; 0x800658 <current_temperature_ambient+0x3>
   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::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]>
            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 <process_commands() [clone .part.46]+0x537e>
            return true;

        wait_temp();
   17d2a:	0f 94 67 3b 	call	0x276ce	; 0x276ce <thermal_model_cal::wait_temp() [clone .lto_priv.559]>
        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 <process_commands() [clone .part.46]+0x5302>
   17d34:	85 c0       	rjmp	.+266    	; 0x17e40 <process_commands() [clone .part.46]+0x540c>
        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 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]>

        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 <sprintf_P>
        lcd_setstatus_serial(tm_message);
   17d56:	c4 01       	movw	r24, r8
   17d58:	0e 94 05 f2 	call	0x1e40a	; 0x1e40a <lcd_setstatus_serial(char const*)>
        samples = record();
   17d5c:	0f 94 a8 10 	call	0x22150	; 0x22150 <thermal_model_cal::record(unsigned int) [clone .constprop.39]>
        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 <process_commands() [clone .part.46]+0x537e>
   17d72:	00 97       	sbiw	r24, 0x00	; 0
   17d74:	f1 f0       	breq	.+60     	; 0x17db2 <process_commands() [clone .part.46]+0x537e>
            return true;

        e = estimate(samples, &thermal_model::data.R[0],
   17d76:	c0 90 55 06 	lds	r12, 0x0655	; 0x800655 <current_temperature_ambient>
   17d7a:	d0 90 56 06 	lds	r13, 0x0656	; 0x800656 <current_temperature_ambient+0x1>
   17d7e:	e0 90 57 06 	lds	r14, 0x0657	; 0x800657 <current_temperature_ambient+0x2>
   17d82:	f0 90 58 06 	lds	r15, 0x0658	; 0x800658 <current_temperature_ambient+0x3>
   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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]>

    // 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 <process_commands() [clone .part.46]+0x537e>
   17db0:	fc ce       	rjmp	.-520    	; 0x17baa <process_commands() [clone .part.46]+0x5176>
        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 <disable_heater()>

    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 <process_commands() [clone .part.46]+0x5392>
   17dc4:	fd c0       	rjmp	.+506    	; 0x17fc0 <process_commands() [clone .part.46]+0x558c>
        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 <sprintf_P>
        lcd_setstatus_serial(tm_message);
   17dd6:	c4 01       	movw	r24, r8
   17dd8:	0e 94 05 f2 	call	0x1e40a	; 0x1e40a <lcd_setstatus_serial(char const*)>
        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 <process_commands() [clone .part.46]+0x53be>
            thermal_model_cal::set_fan_speed(255);
   17dec:	8f ef       	ldi	r24, 0xFF	; 255
   17dee:	0f 94 93 2e 	call	0x25d26	; 0x25d26 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>

        // show calibrated values before overwriting them
        thermal_model_report_settings();
   17df2:	0f 94 9d 2e 	call	0x25d3a	; 0x25d3a <thermal_model_report_settings()>

        // 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 <process_commands() [clone .part.46]+0x53e8>
        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_set_enabled(bool)>
        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 <lcd_consume_click()>
    menu_unset_block(MENU_BLOCK_THERMAL_MODEL_AUTOTUNE);
   17e32:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
   17e36:	8d 7f       	andi	r24, 0xFD	; 253
   17e38:	80 93 d4 03 	sts	0x03D4, r24	; 0x8003d4 <menu_block_mask>
   17e3c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    // 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 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>
    wait(30000);
   17e46:	80 e3       	ldi	r24, 0x30	; 48
   17e48:	95 e7       	ldi	r25, 0x75	; 117
   17e4a:	0f 94 89 3b 	call	0x27712	; 0x27712 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]>
   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 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>
        wait(10000);
   17e7a:	80 e1       	ldi	r24, 0x10	; 16
   17e7c:	97 e2       	ldi	r25, 0x27	; 39
   17e7e:	0f 94 89 3b 	call	0x27712	; 0x27712 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]>

        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 <sprintf_P>
        lcd_setstatus_serial(tm_message);
   17e96:	c4 01       	movw	r24, r8
   17e98:	0e 94 05 f2 	call	0x1e40a	; 0x1e40a <lcd_setstatus_serial(char const*)>
        samples = record();
   17e9c:	0f 94 a8 10 	call	0x22150	; 0x22150 <thermal_model_cal::record(unsigned int) [clone .constprop.39]>
        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 <process_commands() [clone .part.46]+0x537e>
   17eb4:	00 97       	sbiw	r24, 0x00	; 0
   17eb6:	09 f4       	brne	.+2      	; 0x17eba <process_commands() [clone .part.46]+0x5486>
   17eb8:	7c cf       	rjmp	.-264    	; 0x17db2 <process_commands() [clone .part.46]+0x537e>
            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 <current_temperature_ambient>
   17ebe:	d0 90 56 06 	lds	r13, 0x0656	; 0x800656 <current_temperature_ambient+0x1>
   17ec2:	e0 90 57 06 	lds	r14, 0x0657	; 0x800657 <current_temperature_ambient+0x2>
   17ec6:	f0 90 58 06 	lds	r15, 0x0658	; 0x800658 <current_temperature_ambient+0x3>
   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::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]>
            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 <process_commands() [clone .part.46]+0x537e>
   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 <process_commands() [clone .part.46]+0x54d2>
   17f04:	b2 cf       	rjmp	.-156    	; 0x17e6a <process_commands() [clone .part.46]+0x5436>
   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 <process_commands() [clone .part.46]+0x5508>
            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 <process_commands() [clone .part.46]+0x54e2>
        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 <process_commands() [clone .part.46]+0x5380>
    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 <process_commands() [clone .part.46]+0x54f4>
        // 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 <calibration_status_set(unsigned char)>
        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 <lcd_setstatuspgm(char const*)>
        thermal_model_cal::set_fan_speed(0);
   17fce:	80 e0       	ldi	r24, 0x00	; 0
   17fd0:	0f 94 93 2e 	call	0x25d26	; 0x25d26 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>
        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_set_enabled(bool)>
        thermal_model_report_settings();
   17fde:	0f 94 9d 2e 	call	0x25d3a	; 0x25d3a <thermal_model_report_settings()>
   17fe2:	25 cf       	rjmp	.-438    	; 0x17e2e <process_commands() [clone .part.46]+0x53fa>
        M400

    */
    case 400:
    {
      st_synchronize();
   17fe4:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   17fe8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>

    */

    case 405: // M405 Enable Filament Sensor
    {
        fsensor.setEnabled(1);
   17fec:	81 e0       	ldi	r24, 0x01	; 1
   17fee:	0e 94 67 74 	call	0xe8ce	; 0xe8ce <Filament_sensor::setEnabled(bool)>
   17ff2:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        M420

    */
    case 420: // M420 Mesh bed leveling status
    {
        gcode_G81_M420();
   17ff6:	0e 94 f3 7e 	call	0xfde6	; 0xfde6 <gcode_G81_M420()>
   17ffa:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        M500

    */
    case 500:
    {
        Config_StoreSettings();
   17ffe:	0e 94 3c 82 	call	0x10478	; 0x10478 <Config_StoreSettings()>
   18002:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        M501

    */
    case 501:
    {
        Config_RetrieveSettings();
   18006:	0e 94 4c 93 	call	0x12698	; 0x12698 <Config_RetrieveSettings()>
   1800a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        M502

    */
    case 502:
    {
        Config_ResetDefault();
   1800e:	0e 94 24 82 	call	0x10448	; 0x10448 <Config_ResetDefault()>
   18012:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <printf_P>
   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 <process_commands() [clone .part.46]+0x336e>
        M509

    */
    case 509:
    {
		lang_reset();
   18032:	0e 94 c4 70 	call	0xe188	; 0xe188 <lang_reset>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
   18046:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    - `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 <st_synchronize()>
/// 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 <saved_printing>
   18052:	81 11       	cpse	r24, r1
   18054:	02 c0       	rjmp	.+4      	; 0x1805a <process_commands() [clone .part.46]+0x5626>
   18056:	0e 94 e1 63 	call	0xc7c2	; 0xc7c2 <refresh_print_state_in_ram() [clone .part.39]>
    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 <code_seen(char) [clone .lto_priv.549]>
    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 <process_commands() [clone .part.46]+0x5642>
   1806e:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>

    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 <process_commands() [clone .part.46]+0x565a>
   18086:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
    // 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 <process_commands() [clone .part.46]+0x567c>
   180a4:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   180b6:	88 23       	and	r24, r24
   180b8:	09 f4       	brne	.+2      	; 0x180bc <process_commands() [clone .part.46]+0x5688>
   180ba:	49 c1       	rjmp	.+658    	; 0x1834e <process_commands() [clone .part.46]+0x591a>
   180bc:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   180d2:	88 23       	and	r24, r24
   180d4:	09 f4       	brne	.+2      	; 0x180d8 <process_commands() [clone .part.46]+0x56a4>
   180d6:	46 c1       	rjmp	.+652    	; 0x18364 <process_commands() [clone .part.46]+0x5930>
   180d8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x56c0>
    if (code_seen('C')) {
   180fa:	83 e4       	ldi	r24, 0x43	; 67
   180fc:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   18100:	88 23       	and	r24, r24
   18102:	f9 f0       	breq	.+62     	; 0x18142 <process_commands() [clone .part.46]+0x570e>
    , 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 <strchr_pointer>
   1810c:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   18110:	0f 94 67 e2 	call	0x3c4ce	; 0x3c4ce <strchr>
   18114:	8c 01       	movw	r16, r24
        if (!this->ptr) {
   18116:	89 2b       	or	r24, r25
   18118:	a1 f0       	breq	.+40     	; 0x18142 <process_commands() [clone .part.46]+0x570e>
            // 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 <strchr>
        if(!pStrEnd) {
   18128:	00 97       	sbiw	r24, 0x00	; 0
   1812a:	59 f0       	breq	.+22     	; 0x18142 <process_commands() [clone .part.46]+0x570e>
            // 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 <process_commands() [clone .part.46]+0x5700>
   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 <memcpy>
        }
    }

    if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO")))
   18142:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
    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 <process_commands() [clone .part.46]+0x5722>
   1814c:	8b ed       	ldi	r24, 0xDB	; 219
   1814e:	95 e8       	ldi	r25, 0x85	; 133
   18150:	0e 94 be 67 	call	0xcf7c	; 0xcf7c <code_seen_P(char const*) [clone .lto_priv.437]>
   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 <st_synchronize()>
    uint8_t eject_slot = 0;

    prusa_statistics(22);

    // Turn off the fan
    fanSpeed = 0;
   1815a:	10 92 e5 03 	sts	0x03E5, r1	; 0x8003e5 <fanSpeed>

    // Retract E
    if (!printingIsPaused())
   1815e:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   18162:	81 11       	cpse	r24, r1
   18164:	06 c1       	rjmp	.+524    	; 0x18372 <process_commands() [clone .part.46]+0x593e>
    {
      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 <current_position+0xc>
   1816e:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   18172:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   18176:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   1817a:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   1817e:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   18182:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   18186:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   1818a:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
      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 <plan_buffer_line_curposXYZE(float)>
      st_synchronize();
   1819a:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
      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 <serialprintlnPGM(char const*)>
        // 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 <raise_z(float)>

    // 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 <current_position>
   181be:	30 93 92 06 	sts	0x0692, r19	; 0x800692 <current_position+0x1>
   181c2:	40 93 93 06 	sts	0x0693, r20	; 0x800693 <current_position+0x2>
   181c6:	50 93 94 06 	sts	0x0694, r21	; 0x800694 <current_position+0x3>
    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 <current_position+0x4>
   181da:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   181de:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   181e2:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
    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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   181f2:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    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 <MMU2::mmu2+0x6f>
   18216:	81 30       	cpi	r24, 0x01	; 1
   18218:	09 f0       	breq	.+2      	; 0x1821c <process_commands() [clone .part.46]+0x57e8>
   1821a:	ae c0       	rjmp	.+348    	; 0x18378 <process_commands() [clone .part.46]+0x5944>
            eject_slot = MMU2::mmu2.get_current_tool();
   1821c:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
   18220:	b8 2e       	mov	r11, r24
            mmu_M600_unload_filament();
   18222:	0e 94 af 72 	call	0xe55e	; 0xe55e <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);
        }
        st_synchronize();          // finish moves
   18226:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

        FSensorBlockRunout fsBlockRunout;
   1822a:	0f 94 a5 87 	call	0x30f4a	; 0x30f4a <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>

        if (!MMU2::mmu2.Enabled())
   1822e:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   18232:	81 30       	cpi	r24, 0x01	; 1
   18234:	09 f4       	brne	.+2      	; 0x18238 <process_commands() [clone .part.46]+0x5804>
   18236:	6e c1       	rjmp	.+732    	; 0x18514 <process_commands() [clone .part.46]+0x5ae0>
        {
            KEEPALIVE_STATE(PAUSED_FOR_USER);
   18238:	84 e0       	ldi	r24, 0x04	; 4
   1823a:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
            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 <lang_get_translation>
   18246:	40 e0       	ldi	r20, 0x00	; 0
   18248:	60 e0       	ldi	r22, 0x00	; 0
   1824a:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   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 <lcd_update_enable(unsigned char)>
            if (choice == LCD_MIDDLE_BUTTON_CHOICE) {
   18256:	01 30       	cpi	r16, 0x01	; 1
   18258:	29 f5       	brne	.+74     	; 0x182a4 <process_commands() [clone .part.46]+0x5870>
                lcd_clear();
   1825a:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
                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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
                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 <current_position>
   1827c:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   18280:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   18284:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
                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 <plan_buffer_line_curposXYZE(float)>
                st_synchronize();
   18294:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
                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 <lang_get_translation>
   182a0:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
     preheat_or_continue(FilamentAction::UnLoad);
}

void lcd_wait_interact(const char* filament_name) {

  lcd_clear();
   182a4:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>

  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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
  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 <lcd_set_cursor(unsigned char, unsigned char)>
  if (filament_name[0]) {
   182c2:	89 81       	ldd	r24, Y+1	; 0x01
   182c4:	88 23       	and	r24, r24
   182c6:	41 f0       	breq	.+16     	; 0x182d8 <process_commands() [clone .part.46]+0x58a4>
      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_print(char const*)>
      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 <lcd_set_cursor(unsigned char, unsigned char)>
  }
#ifdef FILAMENT_SENSOR
  if (!fsensor.getAutoLoadEnabled())
   182d8:	80 91 aa 17 	lds	r24, 0x17AA	; 0x8017aa <fsensor+0x1>
   182dc:	81 11       	cpse	r24, r1
   182de:	06 c0       	rjmp	.+12     	; 0x182ec <process_commands() [clone .part.46]+0x58b8>
#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 <lang_get_translation>
   182e8:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>

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 <busy_state>

	while(!lcd_clicked())
   182f2:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   182f6:	81 11       	cpse	r24, r1
   182f8:	10 c0       	rjmp	.+32     	; 0x1831a <process_commands() [clone .part.46]+0x58e6>
	{
		manage_heater();
   182fa:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
		manage_inactivity(true);
   182fe:	81 e0       	ldi	r24, 0x01	; 1
   18300:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
#ifdef FILAMENT_SENSOR
		if (fsensor.getFilamentLoadEvent()) {
   18304:	80 91 ad 17 	lds	r24, 0x17AD	; 0x8017ad <fsensor+0x4>
   18308:	88 23       	and	r24, r24
   1830a:	99 f3       	breq	.-26     	; 0x182f2 <process_commands() [clone .part.46]+0x58be>
			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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
			break;
		}
#endif //FILAMENT_SENSOR
	}
	KEEPALIVE_STATE(IN_HANDLER);
   1831a:	a0 92 be 02 	sts	0x02BE, r10	; 0x8002be <busy_state>

	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 <M600_load_filament_movements(char const*)>

	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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
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 <process_commands() [clone .part.46]+0x590a>
   1833c:	00 c1       	rjmp	.+512    	; 0x1853e <process_commands() [clone .part.46]+0x5b0a>
   1833e:	0f 94 e9 7b 	call	0x2f7d2	; 0x2f7d2 <PAT9125_sensor::settings_init() [clone .constprop.231]>
    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 <process_commands() [clone .part.46]+0x57de>
   1834c:	a1 c1       	rjmp	.+834    	; 0x18690 <process_commands() [clone .part.46]+0x5c5c>

    // 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 <process_commands() [clone .part.46]+0x5698>
    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 <process_commands() [clone .part.46]+0x56b4>
      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 <restore_extruder_temperature_from_ram()>
   18376:	17 cf       	rjmp	.-466    	; 0x181a6 <process_commands() [clone .part.46]+0x5772>
//!
//! 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 <busy_state>

		unsigned long waiting_start_time = _millis();
   1837e:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <lang_get_translation>
   1838e:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>

		while (!(wait_for_user_state == 0 && lcd_clicked())){
   18392:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   18396:	08 2f       	mov	r16, r24
   18398:	81 11       	cpse	r24, r1
   1839a:	38 c0       	rjmp	.+112    	; 0x1840c <process_commands() [clone .part.46]+0x59d8>

			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_heater()>
			manage_inactivity(true);
   183b8:	81 e0       	ldi	r24, 0x01	; 1
   183ba:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
      if (wait_for_user_state != 2) sound_wait_for_user();
   183be:	02 30       	cpi	r16, 0x02	; 2
   183c0:	09 f4       	brne	.+2      	; 0x183c4 <process_commands() [clone .part.46]+0x5990>
   183c2:	67 c0       	rjmp	.+206    	; 0x18492 <process_commands() [clone .part.46]+0x5a5e>
   183c4:	0f 94 e1 52 	call	0x2a5c2	; 0x2a5c2 <sound_wait_for_user()>
					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 <process_commands() [clone .part.46]+0x59ea>
			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 <delay_keep_alive(unsigned int)>

				if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
   183d4:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <process_commands() [clone .part.46]+0x595e>
					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 <lang_get_translation>
   183f6:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
  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 <target_temperature+0x1>
   183fe:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
					wait_for_user_state = 1;
					setTargetHotend(0);
					st_synchronize();
   18402:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
					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 <process_commands() [clone .part.46]+0x5980>
   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 <unload_filament(float)>
   1841c:	04 cf       	rjmp	.-504    	; 0x18226 <process_commands() [clone .part.46]+0x57f2>
					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 <delay_keep_alive(unsigned int)>

				if (lcd_clicked()) {
   18422:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   18426:	88 23       	and	r24, r24
   18428:	29 f2       	breq	.-118    	; 0x183b4 <process_commands() [clone .part.46]+0x5980>
   1842a:	80 91 ab 05 	lds	r24, 0x05AB	; 0x8005ab <saved_extruder_temperature>
   1842e:	90 91 ac 05 	lds	r25, 0x05AC	; 0x8005ac <saved_extruder_temperature+0x1>
   18432:	90 93 b6 0d 	sts	0x0DB6, r25	; 0x800db6 <target_temperature+0x1>
   18436:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <target_temperature>
	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 <lang_get_translation>
   18442:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
		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_putc_at(unsigned char, unsigned char, char)>
		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 <target_temperature+0x1>
   18454:	8f 93       	push	r24
   18456:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   1845a:	8f 93       	push	r24
   1845c:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   18460:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   18464:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   18468:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   1847c:	81 e8       	ldi	r24, 0x81	; 129
   1847e:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
   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 <process_commands() [clone .part.46]+0x5980>
  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 <target_temperature>
   18496:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   184aa:	30 91 b0 0d 	lds	r19, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   184ae:	40 91 b1 0d 	lds	r20, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   184b2:	50 91 b2 0d 	lds	r21, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <process_commands() [clone .part.46]+0x5aae>
					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 <lang_get_translation>
   184d4:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
					waiting_start_time = _millis();
   184d8:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   184dc:	2b 01       	movw	r4, r22
   184de:	3c 01       	movw	r6, r24
   184e0:	58 cf       	rjmp	.-336    	; 0x18392 <process_commands() [clone .part.46]+0x595e>
					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_set_cursor(unsigned char, unsigned char)>
					lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder));
   184ea:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   184ee:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   184f2:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   184f6:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <lcd_printf_P(char const*, ...)>
   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 <process_commands() [clone .part.46]+0x5980>
            }
            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 <process_commands() [clone .part.46]+0x5aea>
   18518:	8b 2d       	mov	r24, r11
   1851a:	0e 94 a7 8c 	call	0x1194e	; 0x1194e <mmu_M600_filament_change_screen(unsigned char)>
            mmu_M600_load_filament(automatic);
   1851e:	81 2f       	mov	r24, r17
   18520:	0e 94 a6 77 	call	0xef4c	; 0xef4c <mmu_M600_load_filament(bool)>
   18524:	07 cf       	rjmp	.-498    	; 0x18334 <process_commands() [clone .part.46]+0x5900>
                    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 <process_commands() [clone .part.46]+0x5afa>
                    cursor_pos++;
   1852a:	0f 5f       	subi	r16, 0xFF	; 255
   1852c:	49 c0       	rjmp	.+146    	; 0x185c0 <process_commands() [clone .part.46]+0x5b8c>
                else
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   1852e:	87 e0       	ldi	r24, 0x07	; 7
   18530:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
   18534:	45 c0       	rjmp	.+138    	; 0x185c0 <process_commands() [clone .part.46]+0x5b8c>
                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 <M600_load_filament_movements(char const*)>
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 <busy_state>


uint8_t lcd_alright() {
    uint8_t cursor_pos = 0;

    lcd_clear();
   18542:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
    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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
    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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
    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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
    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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
    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_putc_at(unsigned char, unsigned char, char)>

    lcd_consume_click();
   18598:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>




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_heater()>
        manage_inactivity(true);
   185a2:	81 e0       	ldi	r24, 0x01	; 1
   185a4:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>

        if (lcd_encoder)
   185a8:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   185ac:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   185b0:	00 97       	sbiw	r24, 0x00	; 0
   185b2:	d9 f0       	breq	.+54     	; 0x185ea <process_commands() [clone .part.46]+0x5bb6>
        {

            if (lcd_encoder < 0 ) {
   185b4:	97 ff       	sbrs	r25, 7
   185b6:	b7 cf       	rjmp	.-146    	; 0x18526 <process_commands() [clone .part.46]+0x5af2>
                // Rotating knob counter clockwise
                if (cursor_pos > 0)
   185b8:	00 23       	and	r16, r16
   185ba:	09 f4       	brne	.+2      	; 0x185be <process_commands() [clone .part.46]+0x5b8a>
   185bc:	b8 cf       	rjmp	.-144    	; 0x1852e <process_commands() [clone .part.46]+0x5afa>
                    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_puts_at_P(unsigned char, unsigned char, char const*)>
            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 <lcd_putc_at(unsigned char, unsigned char, char)>

            // Consume rotation event and make feedback sound
            lcd_encoder = 0;
   185d6:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   185da:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
            _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 <delay2>
        }

        if (lcd_clicked())
   185ea:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   185ee:	88 23       	and	r24, r24
   185f0:	b1 f2       	breq	.-84     	; 0x1859e <process_commands() [clone .part.46]+0x5b6a>
        {
            lcd_clear();
   185f2:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
            lcd_return_to_status();
   185f6:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
        lcd_change_filament_state = lcd_alright();
        KEEPALIVE_STATE(IN_HANDLER);
   185fa:	a0 92 be 02 	sts	0x02BE, r10	; 0x8002be <busy_state>
        switch(lcd_change_filament_state)
   185fe:	02 30       	cpi	r16, 0x02	; 2
   18600:	b1 f0       	breq	.+44     	; 0x1862e <process_commands() [clone .part.46]+0x5bfa>
   18602:	03 30       	cpi	r16, 0x03	; 3
   18604:	09 f4       	brne	.+2      	; 0x18608 <process_commands() [clone .part.46]+0x5bd4>
   18606:	f8 c0       	rjmp	.+496    	; 0x187f8 <process_commands() [clone .part.46]+0x5dc4>
   18608:	01 30       	cpi	r16, 0x01	; 1
   1860a:	81 f5       	brne	.+96     	; 0x1866c <process_commands() [clone .part.46]+0x5c38>
        {
        // Filament failed to load so load it again
        case 1:
            if (MMU2::mmu2.Enabled()) {
   1860c:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   18610:	81 30       	cpi	r24, 0x01	; 1
   18612:	09 f0       	breq	.+2      	; 0x18616 <process_commands() [clone .part.46]+0x5be2>
   18614:	90 cf       	rjmp	.-224    	; 0x18536 <process_commands() [clone .part.46]+0x5b02>
                uint8_t eject_slot = MMU2::mmu2.get_current_tool();
   18616:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
   1861a:	08 2f       	mov	r16, r24

                // Unload filament
                mmu_M600_unload_filament();
   1861c:	0e 94 af 72 	call	0xe55e	; 0xe55e <mmu_M600_unload_filament()>

                // 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 <mmu_M600_filament_change_screen(unsigned char)>

                // 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 <mmu_M600_load_filament(bool)>
   1862c:	88 cf       	rjmp	.-240    	; 0x1853e <process_commands() [clone .part.46]+0x5b0a>
            }
            break;

        // Filament loaded properly but color is not clear
        case 2:
            st_synchronize();
   1862e:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            load_filament_final_feed();
   18632:	0e 94 2b 64 	call	0xc856	; 0xc856 <load_filament_final_feed()>


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_clear()>

  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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
  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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
  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_progress_bar(unsigned int) [clone .lto_priv.560]>
            lcd_loading_color();
            st_synchronize();
   18666:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   1866a:	69 cf       	rjmp	.-302    	; 0x1853e <process_commands() [clone .part.46]+0x5b0a>
}


void lcd_change_success() {

  lcd_clear();
   1866c:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>

  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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

//! @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 <process_commands() [clone .part.46]+0x5c58>
   18686:	03 30       	cpi	r16, 0x03	; 3
   18688:	09 f0       	breq	.+2      	; 0x1868c <process_commands() [clone .part.46]+0x5c58>
   1868a:	59 cf       	rjmp	.-334    	; 0x1853e <process_commands() [clone .part.46]+0x5b0a>
   1868c:	0f 94 e9 7b 	call	0x2f7d2	; 0x2f7d2 <PAT9125_sensor::settings_init() [clone .constprop.231]>
        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 <lcd_update_enable(unsigned char)>

    // Not let's go back to print
    fanSpeed = saved_fan_speed;
   18696:	80 91 aa 05 	lds	r24, 0x05AA	; 0x8005aa <saved_fan_speed>
   1869a:	80 93 e5 03 	sts	0x03E5, r24	; 0x8003e5 <fanSpeed>

    // Feed a little of filament to stabilize pressure
    if (!automatic) {
   1869e:	11 11       	cpse	r17, r1
   186a0:	27 c0       	rjmp	.+78     	; 0x186f0 <process_commands() [clone .part.46]+0x5cbc>
        if (printingIsPaused())
   186a2:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   186a6:	c0 90 9d 06 	lds	r12, 0x069D	; 0x80069d <current_position+0xc>
   186aa:	d0 90 9e 06 	lds	r13, 0x069E	; 0x80069e <current_position+0xd>
   186ae:	e0 90 9f 06 	lds	r14, 0x069F	; 0x80069f <current_position+0xe>
   186b2:	f0 90 a0 06 	lds	r15, 0x06A0	; 0x8006a0 <current_position+0xf>
   186b6:	88 23       	and	r24, r24
   186b8:	09 f4       	brne	.+2      	; 0x186bc <process_commands() [clone .part.46]+0x5c88>
   186ba:	a3 c0       	rjmp	.+326    	; 0x18802 <process_commands() [clone .part.46]+0x5dce>
        {
            // 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 <current_position+0xc>
   186d0:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   186d4:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   186d8:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
            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 <plan_buffer_line_curposXYZE(float)>
  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 <target_temperature+0x1>
   186ec:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
            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 <current_position+0x8>
   186f4:	f0 90 9a 06 	lds	r15, 0x069A	; 0x80069a <current_position+0x9>
   186f8:	00 91 9b 06 	lds	r16, 0x069B	; 0x80069b <current_position+0xa>
   186fc:	10 91 9c 06 	lds	r17, 0x069C	; 0x80069c <current_position+0xb>
   18700:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <saved_pos+0x4>
   18704:	30 91 78 02 	lds	r19, 0x0278	; 0x800278 <saved_pos+0x5>
   18708:	40 91 79 02 	lds	r20, 0x0279	; 0x800279 <saved_pos+0x6>
   1870c:	50 91 7a 02 	lds	r21, 0x027A	; 0x80027a <saved_pos+0x7>
   18710:	60 91 73 02 	lds	r22, 0x0273	; 0x800273 <saved_pos>
   18714:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
   18718:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
   1871c:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
    st_synchronize();
   18740:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    // 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 <saved_pos+0x8>
   18748:	f0 90 7c 02 	lds	r15, 0x027C	; 0x80027c <saved_pos+0x9>
   1874c:	00 91 7d 02 	lds	r16, 0x027D	; 0x80027d <saved_pos+0xa>
   18750:	10 91 7e 02 	lds	r17, 0x027E	; 0x80027e <saved_pos+0xb>
   18754:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <saved_pos+0x4>
   18758:	30 91 78 02 	lds	r19, 0x0278	; 0x800278 <saved_pos+0x5>
   1875c:	40 91 79 02 	lds	r20, 0x0279	; 0x800279 <saved_pos+0x6>
   18760:	50 91 7a 02 	lds	r21, 0x027A	; 0x80027a <saved_pos+0x7>
   18764:	60 91 73 02 	lds	r22, 0x0273	; 0x800273 <saved_pos>
   18768:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
   1876c:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
   18770:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
    st_synchronize();
   1878c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    // 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 <plan_set_e_position(float const&)>

    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 <process_commands() [clone .part.46]+0x5d6e>
    set_destination_to_current();
   187aa:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>

    // Recover feed rate
    feedmultiply = saved_feedmultiply2;
   187ae:	80 91 6f 03 	lds	r24, 0x036F	; 0x80036f <saved_feedmultiply2>
   187b2:	90 91 70 03 	lds	r25, 0x0370	; 0x800370 <saved_feedmultiply2+0x1>
   187b6:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>
   187ba:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <feedmultiply+0x1>
    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 <enquecommandf_P(char const*, ...)>

    if (printingIsPaused()) {
   187ce:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   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 <process_commands() [clone .part.46]+0x5dfc>
      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 <lang_get_translation>
   187e8:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
    }
    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 <custom_message_type>

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 <isPartialBackupAvailable>
   187f4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            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 <process_commands() [clone .part.46]+0x590a>
            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 <current_position+0xc>
   18816:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   1881a:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   1881e:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
            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 <plan_buffer_line_curposXYZE(float)>
   1882e:	60 cf       	rjmp	.-320    	; 0x186f0 <process_commands() [clone .part.46]+0x5cbc>

    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 <lcd_setstatuspgm(char const*)>
      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 <serialprintlnPGM(char const*)>
   18840:	d5 cf       	rjmp	.-86     	; 0x187ec <process_commands() [clone .part.46]+0x5db8>
        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 <printingIsPaused()>
   18846:	81 11       	cpse	r24, r1
   18848:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            st_synchronize();
   1884c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            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 <ClearToSend()>
            cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
   18854:	0e 94 54 76 	call	0xeca8	; 0xeca8 <cmdqueue_pop_front()>
            lcd_pause_print();
   18858:	0f 94 34 2a 	call	0x25468	; 0x25468 <lcd_pause_print()>
   1885c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    /*!
    ### M602 - Resume print <a href="https://reprap.org/wiki/G-code#M602:_Resume_print">M602: Resume print</a>
    */
    case 602:
    {
        if (printingIsPaused()) lcd_resume_print();
   18860:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   18864:	88 23       	and	r24, r24
   18866:	11 f4       	brne	.+4      	; 0x1886c <process_commands() [clone .part.46]+0x5e38>
   18868:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   1886c:	0c 94 4b b1 	jmp	0x16296	; 0x16296 <process_commands() [clone .part.46]+0x3862>
    /*!
    ### M603 - Stop print <a href="https://reprap.org/wiki/G-code#M603:_Stop_print">M603: Stop print</a>
    */

    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 <print_stop(bool, bool)>
   18878:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
	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 <code_seen(char) [clone .lto_priv.549]>
   18884:	88 23       	and	r24, r24
   18886:	b1 f0       	breq	.+44     	; 0x188b4 <process_commands() [clone .part.46]+0x5e80>
		iSel = code_value_uint8();
   18888:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   1888c:	18 2f       	mov	r17, r24
		if (iSel>=max_sheets)
   1888e:	88 30       	cpi	r24, 0x08	; 8
   18890:	b0 f0       	brcs	.+44     	; 0x188be <process_commands() [clone .part.46]+0x5e8a>
		{
			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 <serialprintPGM(char const*)>
}

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 <MarlinSerial::printNumber(unsigned long, unsigned char)>
			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 <MarlinSerial::println(char const*)>
   188b0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
			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 <eeprom_read_byte>
   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 <code_seen(char) [clone .lto_priv.549]>
   188c4:	88 23       	and	r24, r24
   188c6:	09 f4       	brne	.+2      	; 0x188ca <process_commands() [clone .part.46]+0x5e96>
   188c8:	d7 c0       	rjmp	.+430    	; 0x18a78 <process_commands() [clone .part.46]+0x6044>
		z_val = code_value();
   188ca:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <cs+0xc>
   188d6:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   188da:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   188de:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <process_commands() [clone .part.46]+0x5ed0>
		{
			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 <serialprintlnPGM(char const*)>
   18900:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
			break;
		}
		eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <eeprom_update_word>
	{
		zraw = eeprom_read_word(reinterpret_cast<uint16_t *>(&(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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x5f00>
   18932:	be c0       	rjmp	.+380    	; 0x18ab0 <process_commands() [clone .part.46]+0x607c>
	{
		char *src = strchr_pointer + 1;
   18934:	e0 91 93 03 	lds	r30, 0x0393	; 0x800393 <strchr_pointer>
   18938:	f0 91 94 03 	lds	r31, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <process_commands() [clone .part.46]+0x5f0a>
		if (*src != '\0')
   18946:	88 23       	and	r24, r24
   18948:	31 f0       	breq	.+12     	; 0x18956 <process_commands() [clone .part.46]+0x5f22>
		{
			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 <strncpy>
#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 <eeprom_update_block>
	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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x5f46>
   18978:	a3 c0       	rjmp	.+326    	; 0x18ac0 <process_commands() [clone .part.46]+0x608c>
	{
		iBedC = code_value_uint8();
   1897a:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   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 <eeprom_update_byte>
	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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x5f68>
   1899a:	97 c0       	rjmp	.+302    	; 0x18aca <process_commands() [clone .part.46]+0x6096>
	{
		iPindaC = code_value_uint8();
   1899c:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   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 <eeprom_update_byte>
	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 <code_seen(char) [clone .lto_priv.549]>
   189b0:	88 23       	and	r24, r24
   189b2:	09 f4       	brne	.+2      	; 0x189b6 <process_commands() [clone .part.46]+0x5f82>
   189b4:	8f c0       	rjmp	.+286    	; 0x18ad4 <process_commands() [clone .part.46]+0x60a0>
	{
		bIsActive |= code_value_uint8() || (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel);
   189b6:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   189ba:	81 11       	cpse	r24, r1
   189bc:	06 c0       	rjmp	.+12     	; 0x189ca <process_commands() [clone .part.46]+0x5f96>
   189be:	81 ea       	ldi	r24, 0xA1	; 161
   189c0:	9d e0       	ldi	r25, 0x0D	; 13
   189c2:	0f 94 10 dc 	call	0x3b820	; 0x3b820 <eeprom_read_byte>
   189c6:	18 13       	cpse	r17, r24
   189c8:	8d c0       	rjmp	.+282    	; 0x18ae4 <process_commands() [clone .part.46]+0x60b0>
		if(bIsActive && eeprom_is_sheet_initialized(iSel)) {
   189ca:	81 2f       	mov	r24, r17
   189cc:	0e 94 d9 75 	call	0xebb2	; 0xebb2 <eeprom_is_sheet_initialized(unsigned char)>
   189d0:	08 2f       	mov	r16, r24
   189d2:	88 23       	and	r24, r24
   189d4:	29 f0       	breq	.+10     	; 0x189e0 <process_commands() [clone .part.46]+0x5fac>
   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 <eeprom_update_byte>
	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 <serialprintPGM(char const*)>
  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 <MarlinSerial::print(long, int) [clone .part.1]>
	SERIAL_PROTOCOL((int)iSel);
	if (!eeprom_is_sheet_initialized(iSel))
   189f4:	81 2f       	mov	r24, r17
   189f6:	0e 94 d9 75 	call	0xebb2	; 0xebb2 <eeprom_is_sheet_initialized(unsigned char)>
   189fa:	81 11       	cpse	r24, r1
   189fc:	04 c0       	rjmp	.+8      	; 0x18a06 <process_commands() [clone .part.46]+0x5fd2>
		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 <serialprintlnPGM(char const*)>


	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 <serialprintPGM(char const*)>
  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 <MarlinSerial::printFloat(double, unsigned char)>
	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 <serialprintPGM(char const*)>
  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 <MarlinSerial::print(long, int) [clone .part.1]>
	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 <serialprintPGM(char const*)>
   18a34:	ce 01       	movw	r24, r28
   18a36:	01 96       	adiw	r24, 0x01	; 1
   18a38:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
	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 <serialprintPGM(char const*)>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
	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 <serialprintPGM(char const*)>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
	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 <serialprintPGM(char const*)>
	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 <MarlinSerial::println(int, int) [clone .constprop.325]>
   18a74:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		}
		eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[iSel].z_offset)),zraw);
	}
	else
	{
		zraw = eeprom_read_word(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_word>
   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 <cs+0xc>
   18a9a:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   18a9e:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   18aa2:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <process_commands() [clone .part.46]+0x5ee2>
		}
		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 <eeprom_read_block>
   18abe:	52 cf       	rjmp	.-348    	; 0x18964 <process_commands() [clone .part.46]+0x5f30>
		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 <eeprom_read_byte>
   18ac6:	98 2e       	mov	r9, r24
   18ac8:	5f cf       	rjmp	.-322    	; 0x18988 <process_commands() [clone .part.46]+0x5f54>
		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 <eeprom_read_byte>
   18ad0:	b8 2e       	mov	r11, r24
   18ad2:	6b cf       	rjmp	.-298    	; 0x189aa <process_commands() [clone .part.46]+0x5f76>
            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 <eeprom_read_byte>
   18adc:	01 e0       	ldi	r16, 0x01	; 1
   18ade:	18 17       	cp	r17, r24
   18ae0:	09 f4       	brne	.+2      	; 0x18ae4 <process_commands() [clone .part.46]+0x60b0>
   18ae2:	7e cf       	rjmp	.-260    	; 0x189e0 <process_commands() [clone .part.46]+0x5fac>
	{
		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 <process_commands() [clone .part.46]+0x5fac>
		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 <current_temperature_pinda>
   18af4:	30 91 98 03 	lds	r19, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   18af8:	40 91 99 03 	lds	r20, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   18afc:	50 91 9a 03 	lds	r21, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   18b00:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   18b04:	87 fd       	sbrc	r24, 7
   18b06:	02 c0       	rjmp	.+4      	; 0x18b0c <process_commands() [clone .part.46]+0x60d8>
   18b08:	0c 94 6c b0 	jmp	0x160d8	; 0x160d8 <process_commands() [clone .part.46]+0x36a4>
			if ((_millis() - codenum) > 1000) //Print Temp Reading every 1 second while waiting.
   18b0c:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <process_commands() [clone .part.46]+0x6120>
			{
				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 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   18b2a:	60 91 97 03 	lds	r22, 0x0397	; 0x800397 <current_temperature_pinda>
   18b2e:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   18b32:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   18b36:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   18b3a:	41 e0       	ldi	r20, 0x01	; 1
   18b3c:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
}

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 <MarlinSerial::write(unsigned char)>
				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 <MarlinSerial::println(int, int) [clone .constprop.325]>
				codenum = _millis();
   18b4c:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   18b50:	4b 01       	movw	r8, r22
   18b52:	5c 01       	movw	r10, r24
			}
			manage_heater();
   18b54:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
			manage_inactivity();
   18b58:	80 e0       	ldi	r24, 0x00	; 0
   18b5a:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
			lcd_update(0);
   18b5e:	80 e0       	ldi	r24, 0x00	; 0
   18b60:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   18b64:	0c 94 53 b0 	jmp	0x160a6	; 0x160a6 <process_commands() [clone .part.46]+0x3672>
    - `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 <code_seen(char) [clone .lto_priv.549]>
   18b6e:	88 23       	and	r24, r24
   18b70:	c9 f0       	breq	.+50     	; 0x18ba4 <process_commands() [clone .part.46]+0x6170>
			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 <serialprintPGM(char const*)>
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 <eeprom_read_byte>
   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 <process_commands() [clone .part.46]+0x615a>
   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 <MarlinSerial::println(int, int) [clone .constprop.325]>
			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 <serialprintlnPGM(char const*)>
			gcode_M861_print_pinda_cal_eeprom();
   18b9c:	0e 94 20 77 	call	0xee40	; 0xee40 <gcode_M861_print_pinda_cal_eeprom()>
   18ba0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		}
		else if (code_seen('!')) { // ! - Set factory default values
   18ba4:	81 e2       	ldi	r24, 0x21	; 33
   18ba6:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   18baa:	88 23       	and	r24, r24
   18bac:	49 f1       	breq	.+82     	; 0x18c00 <process_commands() [clone .part.46]+0x61cc>
   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 <eeprom_update_byte>
        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 <eeprom_update_word>
   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 <eeprom_update_word>
   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 <eeprom_update_word>
   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 <eeprom_update_word>
   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>
			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 <serialprintlnPGM(char const*)>
   18bfc:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		}
		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 <code_seen(char) [clone .lto_priv.549]>
   18c06:	88 23       	and	r24, r24
   18c08:	c1 f0       	breq	.+48     	; 0x18c3a <process_commands() [clone .part.46]+0x6206>
        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 <eeprom_update_byte>
   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 <eeprom_update_word>
   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 <process_commands() [clone .part.46]+0x61e4>
				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 <serialprintlnPGM(char const*)>
   18c36:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
		}
		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 <code_seen(char) [clone .lto_priv.549]>
   18c40:	88 23       	and	r24, r24
   18c42:	21 f1       	breq	.+72     	; 0x18c8c <process_commands() [clone .part.46]+0x6258>
			int16_t usteps = code_value_short();
   18c44:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   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 <code_seen(char) [clone .lto_priv.549]>
   18c50:	88 23       	and	r24, r24
   18c52:	11 f4       	brne	.+4      	; 0x18c58 <process_commands() [clone .part.46]+0x6224>
   18c54:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
			    uint8_t index = code_value_uint8();
   18c58:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
				if (index < 5) {
   18c5c:	85 30       	cpi	r24, 0x05	; 5
   18c5e:	10 f0       	brcs	.+4      	; 0x18c64 <process_commands() [clone .part.46]+0x6230>
   18c60:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
					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 <eeprom_update_word>
					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 <serialprintlnPGM(char const*)>
					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 <serialprintlnPGM(char const*)>
					gcode_M861_print_pinda_cal_eeprom();
   18c84:	0e 94 20 77 	call	0xee40	; 0xee40 <gcode_M861_print_pinda_cal_eeprom()>
   18c88:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
				}
			}
		}
		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 <serialprintlnPGM(char const*)>
   18c94:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    */
    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<ClPrintChecking>((uint16_t)(code_value()*10) - 8620u);
   18c98:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x6280>
   18cb2:	a2 c0       	rjmp	.+324    	; 0x18df8 <process_commands() [clone .part.46]+0x63c4>
   18cb4:	98 f5       	brcc	.+102    	; 0x18d1c <process_commands() [clone .part.46]+0x62e8>
   18cb6:	61 30       	cpi	r22, 0x01	; 1
   18cb8:	09 f4       	brne	.+2      	; 0x18cbc <process_commands() [clone .part.46]+0x6288>
   18cba:	59 c0       	rjmp	.+178    	; 0x18d6e <process_commands() [clone .part.46]+0x633a>
   18cbc:	62 30       	cpi	r22, 0x02	; 2
   18cbe:	11 f0       	breq	.+4      	; 0x18cc4 <process_commands() [clone .part.46]+0x6290>
   18cc0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        ,(uint8_t)oCheckModel
    );
}

uint16_t nPrinterType(bool bMMu) {
    if (bMMu) {
   18cc4:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
        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 <process_commands() [clone .part.46]+0x62a0>
        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 <code_seen(char) [clone .lto_priv.549]>
   18cde:	88 23       	and	r24, r24
   18ce0:	09 f4       	brne	.+2      	; 0x18ce4 <process_commands() [clone .part.46]+0x62b0>
   18ce2:	79 c0       	rjmp	.+242    	; 0x18dd6 <process_commands() [clone .part.46]+0x63a2>
                         {
                         uint16_t nPrinterModel;
                         nPrinterModel=(uint16_t)code_value_long();
   18ce4:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
        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 <oCheckModel>
   18cec:	ff 20       	and	r15, r15
   18cee:	11 f4       	brne	.+4      	; 0x18cf4 <process_commands() [clone .part.46]+0x62c0>
   18cf0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        return;
    if (nPrinterModel == actualPrinterModel)
   18cf4:	60 17       	cp	r22, r16
   18cf6:	71 07       	cpc	r23, r17
   18cf8:	11 f4       	brne	.+4      	; 0x18cfe <process_commands() [clone .part.46]+0x62ca>
   18cfa:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    // 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 <lang_get_translation>
   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 <lang_get_translation>
   18d10:	4f 2d       	mov	r20, r15
   18d12:	b8 01       	movw	r22, r16
   18d14:	0e 94 aa f5 	call	0x1eb54	; 0x1eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>
   18d18:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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<ClPrintChecking>((uint16_t)(code_value()*10) - 8620u);
        switch(nCommand)
   18d1c:	64 30       	cpi	r22, 0x04	; 4
   18d1e:	09 f4       	brne	.+2      	; 0x18d22 <process_commands() [clone .part.46]+0x62ee>
   18d20:	be c0       	rjmp	.+380    	; 0x18e9e <process_commands() [clone .part.46]+0x646a>
   18d22:	65 30       	cpi	r22, 0x05	; 5
   18d24:	11 f0       	breq	.+4      	; 0x18d2a <process_commands() [clone .part.46]+0x62f6>
   18d26:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                         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 <code_seen(char) [clone .lto_priv.549]>
   18d30:	88 23       	and	r24, r24
   18d32:	09 f4       	brne	.+2      	; 0x18d36 <process_commands() [clone .part.46]+0x6302>
   18d34:	3a c1       	rjmp	.+628    	; 0x18faa <process_commands() [clone .part.46]+0x6576>
                         {
                         uint16_t nGcodeLevel;
                         nGcodeLevel=(uint16_t)code_value_long();
   18d36:	0e 94 1a 5b 	call	0xb634	; 0xb634 <code_value_long() [clone .lto_priv.545]>
done:
    return true;
}

void gcode_level_check(uint16_t nGcodeLevel) {
    if (oCheckGcode == ClCheckMode::_None)
   18d3a:	10 91 e7 04 	lds	r17, 0x04E7	; 0x8004e7 <oCheckGcode>
   18d3e:	11 23       	and	r17, r17
   18d40:	11 f4       	brne	.+4      	; 0x18d46 <process_commands() [clone .part.46]+0x6312>
   18d42:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <process_commands() [clone .part.46]+0x631c>
   18d4c:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    // 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 <lang_get_translation>
   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 <lang_get_translation>
   18d62:	41 2f       	mov	r20, r17
   18d64:	b7 01       	movw	r22, r14
   18d66:	0e 94 aa f5 	call	0x1eb54	; 0x1eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>
   18d6a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        ClPrintChecking nCommand = static_cast<ClPrintChecking>((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 <code_seen(char) [clone .lto_priv.549]>
   18d74:	88 23       	and	r24, r24
   18d76:	a9 f0       	breq	.+42     	; 0x18da2 <process_commands() [clone .part.46]+0x636e>
                         {
                         nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
   18d78:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <nozzle_diameter_check(unsigned int)>
   18d9e:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                         }
                    else if(code_seen('Q'))
   18da2:	81 e5       	ldi	r24, 0x51	; 81
   18da4:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   18da8:	88 23       	and	r24, r24
   18daa:	11 f4       	brne	.+4      	; 0x18db0 <process_commands() [clone .part.46]+0x637c>
   18dac:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                         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 <eeprom_read_word>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>
   18dd2:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                         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 <code_seen(char) [clone .lto_priv.549]>
   18ddc:	88 23       	and	r24, r24
   18dde:	11 f4       	brne	.+4      	; 0x18de4 <process_commands() [clone .part.46]+0x63b0>
   18de0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
  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 <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned int n, int base)
{
  print(n, base);
  println();
   18df0:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
   18df4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        return pgm_read_word(&_nPrinterType);
    }
}

const char *sPrinterType(bool bMMu) {
    if (bMMu) {
   18df8:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
        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 <process_commands() [clone .part.46]+0x63dc>
        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 <code_seen(char) [clone .lto_priv.549]>
   18e16:	88 23       	and	r24, r24
   18e18:	b1 f1       	breq	.+108    	; 0x18e86 <process_commands() [clone .part.46]+0x6452>
    , 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 <strchr_pointer>
   18e22:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   18e26:	0f 94 67 e2 	call	0x3c4ce	; 0x3c4ce <strchr>
   18e2a:	8c 01       	movw	r16, r24
        if (!this->ptr) {
   18e2c:	89 2b       	or	r24, r25
   18e2e:	d1 f0       	breq	.+52     	; 0x18e64 <process_commands() [clone .part.46]+0x6430>
            // 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 <strchr>
        if(!pStrEnd) {
   18e3e:	00 97       	sbiw	r24, 0x00	; 0
   18e40:	89 f0       	breq	.+34     	; 0x18e64 <process_commands() [clone .part.46]+0x6430>
            // 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 <process_commands() [clone .part.46]+0x6430>
            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 <strncmp_P>
   18e5c:	89 2b       	or	r24, r25
   18e5e:	11 f4       	brne	.+4      	; 0x18e64 <process_commands() [clone .part.46]+0x6430>
   18e60:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        }
    }

    render_M862_warnings(
   18e64:	f0 90 e9 04 	lds	r15, 0x04E9	; 0x8004e9 <oCheckModel>
   18e68:	8d eb       	ldi	r24, 0xBD	; 189
   18e6a:	97 e3       	ldi	r25, 0x37	; 55
   18e6c:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   18e7a:	4f 2d       	mov	r20, r15
   18e7c:	b8 01       	movw	r22, r16
   18e7e:	0e 94 aa f5 	call	0x1eb54	; 0x1eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>
   18e82:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                    {
                        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 <code_seen(char) [clone .lto_priv.549]>
   18e8c:	88 23       	and	r24, r24
   18e8e:	11 f4       	brne	.+4      	; 0x18e94 <process_commands() [clone .part.46]+0x6460>
   18e90:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                         SERIAL_PROTOCOLLNRPGM(type);
   18e94:	c7 01       	movw	r24, r14
   18e96:	0e 94 13 79 	call	0xf226	; 0xf226 <serialprintlnPGM(char const*)>
   18e9a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
               } break;
               case ClPrintChecking::_Version:    // ~ .4
                    if(code_seen('P'))
   18e9e:	80 e5       	ldi	r24, 0x50	; 80
   18ea0:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   18ea4:	88 23       	and	r24, r24
   18ea6:	09 f4       	brne	.+2      	; 0x18eaa <process_commands() [clone .part.46]+0x6476>
   18ea8:	77 c0       	rjmp	.+238    	; 0x18f98 <process_commands() [clone .part.46]+0x6564>
                         fw_version_check(++strchr_pointer);
   18eaa:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   18eae:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   18eb2:	01 96       	adiw	r24, 0x01	; 1
   18eb4:	90 93 94 03 	sts	0x0394, r25	; 0x800394 <strchr_pointer+0x1>
   18eb8:	80 93 93 03 	sts	0x0393, r24	; 0x800393 <strchr_pointer>
        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 <oCheckVersion>
   18ec0:	22 23       	and	r18, r18
   18ec2:	11 f4       	brne	.+4      	; 0x18ec8 <process_commands() [clone .part.46]+0x6494>
   18ec4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <parse_version(char const*, unsigned int*)>
    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 <eeprom_read_word>
   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 <process_commands() [clone .part.46]+0x64bc>
        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 <process_commands() [clone .part.46]+0x64bc>
   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 <eeprom_read_word>
   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 <process_commands() [clone .part.46]+0x64e4>
        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 <process_commands() [clone .part.46]+0x64e4>
   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 <eeprom_read_word>
   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 <process_commands() [clone .part.46]+0x650e>
        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 <process_commands() [clone .part.46]+0x650e>
   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 <eeprom_read_word>
   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 <process_commands() [clone .part.46]+0x6538>
        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 <process_commands() [clone .part.46]+0x6538>
   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 <process_commands() [clone .part.46]+0x6542>
   18f72:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    SERIAL_ECHO(aVersion[2]);
    SERIAL_ECHO('.');
    SERIAL_ECHOLN(aVersion[3]);
*/

    render_M862_warnings(
   18f76:	f0 90 e8 04 	lds	r15, 0x04E8	; 0x8004e8 <oCheckVersion>
   18f7a:	8d e4       	ldi	r24, 0x4D	; 77
   18f7c:	97 e3       	ldi	r25, 0x37	; 55
   18f7e:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   18f8c:	4f 2d       	mov	r20, r15
   18f8e:	b8 01       	movw	r22, r16
   18f90:	0e 94 aa f5 	call	0x1eb54	; 0x1eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>
   18f94:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                    else if(code_seen('Q'))
   18f98:	81 e5       	ldi	r24, 0x51	; 81
   18f9a:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   18f9e:	88 23       	and	r24, r24
   18fa0:	11 f4       	brne	.+4      	; 0x18fa6 <process_commands() [clone .part.46]+0x6572>
   18fa2:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
   18fa6:	0c 94 3b a7 	jmp	0x14e76	; 0x14e76 <process_commands() [clone .part.46]+0x2442>
                         {
                         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 <code_seen(char) [clone .lto_priv.549]>
   18fb0:	88 23       	and	r24, r24
   18fb2:	11 f4       	brne	.+4      	; 0x18fb8 <process_commands() [clone .part.46]+0x6584>
   18fb4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                         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 <MarlinSerial::println(int, int) [clone .constprop.325]>
   18fc0:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    * M900: Set and/or Get advance K factor
    *
    *  K<factor>                  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 <code_seen(char) [clone .lto_priv.549]>
   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 <process_commands() [clone .part.46]+0x65f6>
   18fd8:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x65f6>
    {
        extruder_advance_K = 0;
   18fee:	10 92 64 05 	sts	0x0564, r1	; 0x800564 <extruder_advance_K>
   18ff2:	10 92 65 05 	sts	0x0565, r1	; 0x800565 <extruder_advance_K+0x1>
   18ff6:	10 92 66 05 	sts	0x0566, r1	; 0x800566 <extruder_advance_K+0x2>
   18ffa:	10 92 67 05 	sts	0x0567, r1	; 0x800567 <extruder_advance_K+0x3>
   18ffe:	0e 94 af 81 	call	0x1035e	; 0x1035e <la10c_mode_change(LA10C_MODE)>
        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 <serialprintPGM(char const*)>
    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 <serialprintPGM(char const*)>
    SERIAL_ECHOLN(extruder_advance_K);
   19012:	60 91 64 05 	lds	r22, 0x0564	; 0x800564 <extruder_advance_K>
   19016:	70 91 65 05 	lds	r23, 0x0565	; 0x800565 <extruder_advance_K+0x1>
   1901a:	80 91 66 05 	lds	r24, 0x0566	; 0x800566 <extruder_advance_K+0x2>
   1901e:	90 91 67 05 	lds	r25, 0x0567	; 0x800567 <extruder_advance_K+0x3>
   19022:	0f 94 ab 75 	call	0x2eb56	; 0x2eb56 <MarlinSerial::println(double, int) [clone .constprop.367]>
   19026:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
}


float la10c_value(float k)
{
    if(la10c_mode == LA10C_UNKNOWN)
   1902a:	80 91 6e 03 	lds	r24, 0x036E	; 0x80036e <la10c_mode>
   1902e:	81 11       	cpse	r24, r1
   19030:	1b c0       	rjmp	.+54     	; 0x19068 <process_commands() [clone .part.46]+0x6634>
    {
        // 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 <process_commands() [clone .part.46]+0x661a>
    }
    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 <serialprintlnPGM(char const*)>
   1904c:	da cf       	rjmp	.-76     	; 0x19002 <process_commands() [clone .part.46]+0x65ce>
            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 <process_commands() [clone .part.46]+0x6686>
   19062:	81 e0       	ldi	r24, 0x01	; 1
   19064:	0e 94 af 81 	call	0x1035e	; 0x1035e <la10c_mode_change(LA10C_MODE)>
    }

    if(la10c_mode == LA10C_LA15)
   19068:	80 91 6e 03 	lds	r24, 0x036E	; 0x80036e <la10c_mode>
        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 <process_commands() [clone .part.46]+0x668a>
        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 <process_commands() [clone .part.46]+0x6610>
   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 <process_commands() [clone .part.46]+0x6610>
        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 <process_commands() [clone .part.46]+0x6610>
            SERIAL_ECHOLNPGM("K out of allowed range!");
        else
            extruder_advance_K = newK;
   190a8:	c0 92 64 05 	sts	0x0564, r12	; 0x800564 <extruder_advance_K>
   190ac:	d0 92 65 05 	sts	0x0565, r13	; 0x800565 <extruder_advance_K+0x1>
   190b0:	e0 92 66 05 	sts	0x0566, r14	; 0x800566 <extruder_advance_K+0x2>
   190b4:	f0 92 67 05 	sts	0x0567, r15	; 0x800567 <extruder_advance_K+0x3>
   190b8:	a4 cf       	rjmp	.-184    	; 0x19002 <process_commands() [clone .part.46]+0x65ce>
        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 <process_commands() [clone .part.46]+0x6630>
    }

    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 <process_commands() [clone .part.46]+0x6610>


// 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 <process_commands() [clone .part.46]+0x66e6>
           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 <process_commands() [clone .part.46]+0x6662>
   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 <process_commands() [clone .part.46]+0x6674>

// 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 <process_commands() [clone .part.46]+0x6674>
   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 <code_seen(char) [clone .lto_priv.549]>
   19142:	88 23       	and	r24, r24
   19144:	09 f4       	brne	.+2      	; 0x19148 <process_commands() [clone .part.46]+0x6714>
   19146:	45 c0       	rjmp	.+138    	; 0x191d2 <process_commands() [clone .part.46]+0x679e>
                if( i == E_AXIS && FarmOrUserECool() ){
   19148:	f3 e0       	ldi	r31, 0x03	; 3
   1914a:	7f 12       	cpse	r7, r31
   1914c:	04 c0       	rjmp	.+8      	; 0x19156 <process_commands() [clone .part.46]+0x6722>
    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 <UserECoolEnabled()>
   19152:	81 11       	cpse	r24, r1
   19154:	61 c0       	rjmp	.+194    	; 0x19218 <process_commands() [clone .part.46]+0x67e4>
                    SERIAL_ECHORPGM(eMotorCurrentScalingEnabled);
                    SERIAL_ECHOLNPGM(", M907 E ignored");
                    continue;
                }
                float cur_mA = code_value();
   19156:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x67c4>
	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 <process_commands() [clone .part.46]+0x67b4>
	//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 <process_commands() [clone .part.46]+0x67ca>
   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 <MotorCurrents::setiHold(unsigned char)>
                currents[i].setiRun(val);
   191bc:	6f 2d       	mov	r22, r15
   191be:	c8 01       	movw	r24, r16
   191c0:	0e 94 9e 67 	call	0xcf3c	; 0xcf3c <MotorCurrents::setiRun(unsigned char)>
                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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
    */
    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 <process_commands() [clone .part.46]+0x6704>
   191e4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
//! | 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 <process_commands() [clone .part.46]+0x6760>
//! | 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 <process_commands() [clone .part.46]+0x6778>
            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 <serialprintPGM(char const*)>
                    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 <serialprintlnPGM(char const*)>
   19228:	d4 cf       	rjmp	.-88     	; 0x191d2 <process_commands() [clone .part.46]+0x679e>
   1922a:	a0 90 67 02 	lds	r10, 0x0267	; 0x800267 <currents+0xa>
        , 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 <currents+0x9>
   19232:	81 11       	cpse	r24, r1
   19234:	01 c0       	rjmp	.+2      	; 0x19238 <process_commands() [clone .part.46]+0x6804>
   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 <MotorCurrents::getOriginaliHold() const>
   19242:	88 2e       	mov	r8, r24
   19244:	c0 90 64 02 	lds	r12, 0x0264	; 0x800264 <currents+0x7>
   19248:	80 91 63 02 	lds	r24, 0x0263	; 0x800263 <currents+0x6>
   1924c:	81 11       	cpse	r24, r1
   1924e:	01 c0       	rjmp	.+2      	; 0x19252 <process_commands() [clone .part.46]+0x681e>
   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 <MotorCurrents::getOriginaliHold() const>
   1925c:	98 2e       	mov	r9, r24
   1925e:	00 91 61 02 	lds	r16, 0x0261	; 0x800261 <currents+0x4>
   19262:	80 91 60 02 	lds	r24, 0x0260	; 0x800260 <currents+0x3>
   19266:	81 11       	cpse	r24, r1
   19268:	01 c0       	rjmp	.+2      	; 0x1926c <process_commands() [clone .part.46]+0x6838>
   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 <MotorCurrents::getOriginaliHold() const>
   19276:	e8 2e       	mov	r14, r24
   19278:	f0 90 5e 02 	lds	r15, 0x025E	; 0x80025e <currents+0x1>
   1927c:	80 91 5d 02 	lds	r24, 0x025D	; 0x80025d <currents>
   19280:	81 11       	cpse	r24, r1
   19282:	01 c0       	rjmp	.+2      	; 0x19286 <process_commands() [clone .part.46]+0x6852>
   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 <MotorCurrents::getOriginaliHold() const>
	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 <printf_P>
   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 <process_commands() [clone .part.46]+0x36d2>
    - `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 <process_commands() [clone .part.46]+0x689e>
   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 <code_seen(char) [clone .lto_priv.549]>
   192d8:	88 23       	and	r24, r24
   192da:	81 f0       	breq	.+32     	; 0x192fc <process_commands() [clone .part.46]+0x68c8>
    {
        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 <eeprom_read_byte>
   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 <tmc2130_mode>
   192ea:	81 17       	cp	r24, r17
   192ec:	11 f4       	brne	.+4      	; 0x192f2 <process_commands() [clone .part.46]+0x68be>
   192ee:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        )
      {
#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 <change_power_mode_live(unsigned char)>
   192f8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    //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 <code_seen(char) [clone .lto_priv.549]>
   19302:	88 23       	and	r24, r24
   19304:	89 f0       	breq	.+34     	; 0x19328 <process_commands() [clone .part.46]+0x68f4>
    {
        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 <process_commands() [clone .part.46]+0x68e4>
   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>
        eeprom_update_byte_notify((unsigned char *)EEPROM_SILENT, newMenuMode);
        SilentModeMenu = newMenuMode;
   19322:	00 93 a2 03 	sts	0x03A2, r16	; 0x8003a2 <SilentModeMenu>
   19326:	df cf       	rjmp	.-66     	; 0x192e6 <process_commands() [clone .part.46]+0x68b2>
        //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 <code_seen(char) [clone .lto_priv.549]>
   1932e:	88 23       	and	r24, r24
   19330:	d1 f2       	breq	.-76     	; 0x192e6 <process_commands() [clone .part.46]+0x68b2>
    {
        printf_P(PSTR("%S: %S\n"), _O(MSG_MODE),
   19332:	80 91 8b 06 	lds	r24, 0x068B	; 0x80068b <tmc2130_mode>
   19336:	81 11       	cpse	r24, r1
   19338:	15 c0       	rjmp	.+42     	; 0x19364 <process_commands() [clone .part.46]+0x6930>
   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 <printf_P>
   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 <process_commands() [clone .part.46]+0x68b2>
   19364:	8e e2       	ldi	r24, 0x2E	; 46
   19366:	97 e4       	ldi	r25, 0x47	; 71
   19368:	ea cf       	rjmp	.-44     	; 0x1933e <process_commands() [clone .part.46]+0x690a>
   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<NUM_AXIS; i++)
   19396:	67 96       	adiw	r28, 0x17	; 23
   19398:	1f ae       	std	Y+63, r1	; 0x3f
   1939a:	67 97       	sbiw	r28, 0x17	; 23
		{
			if(code_seen(axis_codes[i]))
   1939c:	6c 96       	adiw	r28, 0x1c	; 28
   1939e:	ae ad       	ldd	r26, Y+62	; 0x3e
   193a0:	bf ad       	ldd	r27, Y+63	; 0x3f
   193a2:	6c 97       	sbiw	r28, 0x1c	; 28
   193a4:	8d 91       	ld	r24, X+
   193a6:	6c 96       	adiw	r28, 0x1c	; 28
   193a8:	bf af       	std	Y+63, r27	; 0x3f
   193aa:	ae af       	std	Y+62, r26	; 0x3e
   193ac:	6c 97       	sbiw	r28, 0x1c	; 28
   193ae:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   193b2:	b8 2e       	mov	r11, r24
   193b4:	88 23       	and	r24, r24
   193b6:	09 f4       	brne	.+2      	; 0x193ba <process_commands() [clone .part.46]+0x6986>
   193b8:	7c c0       	rjmp	.+248    	; 0x194b2 <process_commands() [clone .part.46]+0x6a7e>
			{
				uint16_t res_new = code_value();
   193ba:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <process_commands() [clone .part.46]+0x699a>
   193cc:	60 c3       	rjmp	.+1728   	; 0x19a8e <process_commands() [clone .part.46]+0x705a>
   193ce:	60 31       	cpi	r22, 0x10	; 16
   193d0:	71 05       	cpc	r23, r1
   193d2:	09 f4       	brne	.+2      	; 0x193d6 <process_commands() [clone .part.46]+0x69a2>
   193d4:	5c c3       	rjmp	.+1720   	; 0x19a8e <process_commands() [clone .part.46]+0x705a>
   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 <process_commands() [clone .part.46]+0x69ac>
   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 <process_commands() [clone .part.46]+0x69b8>
   193ea:	5c c3       	rjmp	.+1720   	; 0x19aa4 <process_commands() [clone .part.46]+0x7070>
   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 <process_commands() [clone .part.46]+0x69c6>
   193f8:	50 c3       	rjmp	.+1696   	; 0x19a9a <process_commands() [clone .part.46]+0x7066>
   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 <process_commands() [clone .part.46]+0x69e4>
   19408:	00 34       	cpi	r16, 0x40	; 64
   1940a:	11 05       	cpc	r17, r1
   1940c:	31 f0       	breq	.+12     	; 0x1941a <process_commands() [clone .part.46]+0x69e6>
   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 <process_commands() [clone .part.46]+0x69e6>
   19418:	b1 2c       	mov	r11, r1
#endif
				if (res_valid)
   1941a:	81 11       	cpse	r24, r1
   1941c:	03 c0       	rjmp	.+6      	; 0x19424 <process_commands() [clone .part.46]+0x69f0>
   1941e:	bb 20       	and	r11, r11
   19420:	09 f4       	brne	.+2      	; 0x19424 <process_commands() [clone .part.46]+0x69f0>
   19422:	47 c0       	rjmp	.+142    	; 0x194b2 <process_commands() [clone .part.46]+0x6a7e>
				{
					st_synchronize();
   19424:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
	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 <process_commands() [clone .part.46]+0x6a04>
   19434:	b6 94       	lsr	r11
   19436:	a7 94       	ror	r10
   19438:	8a 95       	dec	r24
   1943a:	e2 f7       	brpl	.-8      	; 0x19434 <process_commands() [clone .part.46]+0x6a00>
					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 <tmc2130_set_res(unsigned char, unsigned int)>
					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 <process_commands() [clone .part.46]+0x6a20>
   19452:	47 c0       	rjmp	.+142    	; 0x194e2 <process_commands() [clone .part.46]+0x6aae>
					{
						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 <process_commands() [clone .part.46]+0x6a7e>
						fsensor.init();
   194ae:	0f 94 30 7c 	call	0x2f860	; 0x2f860 <PAT9125_sensor::init() [clone .constprop.230]>
    - `S` - All axes new resolution
    */
    case 350:
    {
	#ifdef TMC2130
		for (uint_least8_t i=0; i<NUM_AXIS; i++)
   194b2:	67 96       	adiw	r28, 0x17	; 23
   194b4:	2f ad       	ldd	r18, Y+63	; 0x3f
   194b6:	67 97       	sbiw	r28, 0x17	; 23
   194b8:	2f 5f       	subi	r18, 0xFF	; 255
   194ba:	67 96       	adiw	r28, 0x17	; 23
   194bc:	2f af       	std	Y+63, r18	; 0x3f
   194be:	67 97       	sbiw	r28, 0x17	; 23
   194c0:	34 e0       	ldi	r19, 0x04	; 4
   194c2:	e3 0e       	add	r14, r19
   194c4:	f1 1c       	adc	r15, r1
   194c6:	44 e0       	ldi	r20, 0x04	; 4
   194c8:	c4 0e       	add	r12, r20
   194ca:	d1 1c       	adc	r13, r1
   194cc:	5f ef       	ldi	r21, 0xFF	; 255
   194ce:	85 1a       	sub	r8, r21
   194d0:	95 0a       	sbc	r9, r21
   194d2:	8f ef       	ldi	r24, 0xFF	; 255
   194d4:	28 1a       	sub	r2, r24
   194d6:	38 0a       	sbc	r3, r24
   194d8:	24 30       	cpi	r18, 0x04	; 4
   194da:	09 f0       	breq	.+2      	; 0x194de <process_commands() [clone .part.46]+0x6aaa>
   194dc:	5f cf       	rjmp	.-322    	; 0x1939c <process_commands() [clone .part.46]+0x6968>
   194de:	0c 94 61 b6 	jmp	0x16cc2	; 0x16cc2 <process_commands() [clone .part.46]+0x428e>
						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 <process_commands() [clone .part.46]+0x6a70>
        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 <code_seen(char) [clone .lto_priv.549]>
   1953a:	88 23       	and	r24, r24
   1953c:	29 f0       	breq	.+10     	; 0x19548 <process_commands() [clone .part.46]+0x6b14>
                mmuSlotIndex = code_value_uint8();
   1953e:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   19542:	18 2f       	mov	r17, r24
   19544:	0c 94 85 af 	jmp	0x15f0a	; 0x15f0a <process_commands() [clone .part.46]+0x34d6>
        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 <code_seen(char) [clone .lto_priv.549]>
   1954e:	81 11       	cpse	r24, r1
   19550:	f6 cf       	rjmp	.-20     	; 0x1953e <process_commands() [clone .part.46]+0x6b0a>
   19552:	0c 94 84 af 	jmp	0x15f08	; 0x15f08 <process_commands() [clone .part.46]+0x34d4>
    */
    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 <process_commands() [clone .part.46]+0x3508>
    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 <custom_message_type>
        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 <lang_get_translation>
   1956e:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>

        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 <current_position+0xc>
   1957a:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   1957e:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   19582:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   19586:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   1958a:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   1958e:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   19592:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   19596:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
        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 <plan_buffer_line_curposXYZE(float)>

        if (raise_z_axis) { // backwards compatibility for 3.12 and older FW
   195a6:	01 11       	cpse	r16, r1
   195a8:	06 c0       	rjmp	.+12     	; 0x195b6 <process_commands() [clone .part.46]+0x6b82>
          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 <raise_z_above(float)>
        }

        load_filament_final_feed(); // slow sequence
   195b6:	0e 94 2b 64 	call	0xc856	; 0xc856 <load_filament_final_feed()>
        st_synchronize();
   195ba:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

        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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>

        if (!farm_mode && (eFilamentAction != FilamentAction::None)) {
   195cc:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   195d0:	81 11       	cpse	r24, r1
            lcd_load_filament_color_check();
   195d2:	0f 94 53 50 	call	0x2a0a6	; 0x2a0a6 <lcd_load_filament_color_check()>
        #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_enable(unsigned char)>
        lcd_update(2);
   195dc:	82 e0       	ldi	r24, 0x02	; 2
   195de:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
        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 <lcd_setstatuspgm(char const*)>
        custom_message_type = CustomMsg::Status;
   195ea:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
   195ee:	0c 94 b3 af 	jmp	0x15f66	; 0x15f66 <process_commands() [clone .part.46]+0x3532>
    */
    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 <code_seen(char) [clone .lto_priv.549]>
    - `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 <process_commands() [clone .part.46]+0x6bd6>
   19602:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <code_seen(char) [clone .lto_priv.549]>
   19610:	88 23       	and	r24, r24
   19612:	a1 f0       	breq	.+40     	; 0x1963c <process_commands() [clone .part.46]+0x6c08>
   19614:	0e 94 35 60 	call	0xc06a	; 0xc06a <code_value() [clone .lto_priv.547]>
   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 <raise_z(float)>
   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 <MMU2::mmu2+0x6f>
   19626:	81 30       	cpi	r24, 0x01	; 1
   19628:	99 f4       	brne	.+38     	; 0x19650 <process_commands() [clone .part.46]+0x6c1c>
   1962a:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>
        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 <raise_z(float)>
   19638:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <raise_z_above(float)>
    - `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 <process_commands() [clone .part.46]+0x6be6>
        // 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 <unload_filament(float)>
   19658:	ea cf       	rjmp	.-44     	; 0x1962e <process_commands() [clone .part.46]+0x6bfa>
    #### 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 <gcodes_M704_M705_M706(unsigned int)>
   19662:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    #### 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 <gcodes_M704_M705_M706(unsigned int)>
   1966e:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <MMU2::mmu2+0x6f>
   19676:	81 30       	cpi	r24, 0x01	; 1
   19678:	11 f0       	breq	.+4      	; 0x1967e <process_commands() [clone .part.46]+0x6c4a>
   1967a:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            if( code_seen('A') ) {
   1967e:	81 e4       	ldi	r24, 0x41	; 65
   19680:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>
   19684:	88 23       	and	r24, r24
   19686:	11 f4       	brne	.+4      	; 0x1968c <process_commands() [clone .part.46]+0x6c58>
   19688:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                MMU2::mmu2.ReadRegister(uint8_t(strtol(strchr_pointer+1, NULL, 16)));
   1968c:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   19690:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <strtol>
   196a2:	86 2f       	mov	r24, r22
   196a4:	0f 94 77 10 	call	0x220ee	; 0x220ee <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.31]>
   196a8:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
    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 <MMU2::mmu2+0x6f>
   196b0:	81 30       	cpi	r24, 0x01	; 1
   196b2:	11 f0       	breq	.+4      	; 0x196b8 <process_commands() [clone .part.46]+0x6c84>
   196b4:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
            uint8_t addr = 0;
            if( code_seen('A') ) {
   196b8:	81 e4       	ldi	r24, 0x41	; 65
   196ba:	0e 94 6e 5b 	call	0xb6dc	; 0xb6dc <code_seen(char) [clone .lto_priv.549]>

    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 <process_commands() [clone .part.46]+0x6ca8>
                addr = uint8_t(strtol(strchr_pointer+1, NULL, 16));
   196c4:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <strchr_pointer>
   196c8:	90 91 94 03 	lds	r25, 0x0394	; 0x800394 <strchr_pointer+0x1>
   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 <strtol>
   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 <code_seen(char) [clone .lto_priv.549]>
   196e2:	88 23       	and	r24, r24
   196e4:	61 f0       	breq	.+24     	; 0x196fe <process_commands() [clone .part.46]+0x6cca>
                data = code_value_short();
   196e6:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
            }
            if(addr){
   196ea:	11 23       	and	r17, r17
   196ec:	11 f4       	brne	.+4      	; 0x196f2 <process_commands() [clone .part.46]+0x6cbe>
   196ee:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
                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 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]>
   196fa:	0c 94 83 b0 	jmp	0x16106	; 0x16106 <process_commands() [clone .part.46]+0x36d2>
        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 <process_commands() [clone .part.46]+0x6cb6>
   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 <eeprom_update_byte>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   1970e:	10 92 b9 13 	sts	0x13B9, r1	; 0x8013b9 <MMU2::mmu2+0x6f>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   19716:	10 92 4c 13 	sts	0x134C, r1	; 0x80134c <MMU2::mmu2+0x2>
   1971a:	0c 94 f9 af 	jmp	0x15ff2	; 0x15ff2 <process_commands() [clone .part.46]+0x35be>
   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>
                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 <MMU2::MMU2::Start() [clone .constprop.65]>
   1972c:	0c 94 f9 af 	jmp	0x15ff2	; 0x15ff2 <process_commands() [clone .part.46]+0x35be>
        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 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.48]>
   19736:	0c 94 0f b0 	jmp	0x1601e	; 0x1601e <process_commands() [clone .part.46]+0x35ea>
}

void MMU2::TriggerResetPin() {
    reset();
   1973a:	0f 94 8e c5 	call	0x38b1c	; 0x38b1c <MMU2::reset()>
   1973e:	0c 94 0f b0 	jmp	0x1601e	; 0x1601e <process_commands() [clone .part.46]+0x35ea>
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 <process_commands() [clone .part.46]+0x6cfe>
    T<extruder nr.> - 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 <process_commands() [clone .part.46]+0x6d18>
   1974a:	79 c0       	rjmp	.+242    	; 0x1983e <process_commands() [clone .part.46]+0x6e0a>
        strchr_pointer = CMDBUFFER_CURRENT_STRING;
   1974c:	10 93 94 03 	sts	0x0394, r17	; 0x800394 <strchr_pointer+0x1>
   19750:	00 93 93 03 	sts	0x0393, r16	; 0x800393 <strchr_pointer>
        processing_tcode = true;
   19754:	81 e0       	ldi	r24, 0x01	; 1
   19756:	80 93 a1 03 	sts	0x03A1, r24	; 0x8003a1 <processing_tcode>
        TCodes(strchr_pointer, code_value_uint8());
   1975a:	0e 94 00 5b 	call	0xb600	; 0xb600 <code_value_uint8()>
   1975e:	18 2f       	mov	r17, r24
   19760:	20 91 93 03 	lds	r18, 0x0393	; 0x800393 <strchr_pointer>
   19764:	30 91 94 03 	lds	r19, 0x0394	; 0x800394 <strchr_pointer+0x1>
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 <process_commands() [clone .part.46]+0x6d48>
   19778:	89 30       	cpi	r24, 0x09	; 9
   1977a:	11 f4       	brne	.+4      	; 0x19780 <process_commands() [clone .part.46]+0x6d4c>
   1977c:	9f 5f       	subi	r25, 0xFF	; 255
   1977e:	f5 cf       	rjmp	.-22     	; 0x1976a <process_commands() [clone .part.46]+0x6d36>
        ;

    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 <tolower>
   1978a:	f7 01       	movw	r30, r14
   1978c:	80 83       	st	Z, r24
#include <stdio.h>

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 <process_commands() [clone .part.46]+0x6d78>
   19796:	8f 33       	cpi	r24, 0x3F	; 63
   19798:	59 f0       	breq	.+22     	; 0x197b0 <process_commands() [clone .part.46]+0x6d7c>
   1979a:	88 37       	cpi	r24, 0x78	; 120
   1979c:	49 f0       	breq	.+18     	; 0x197b0 <process_commands() [clone .part.46]+0x6d7c>
   1979e:	83 36       	cpi	r24, 0x63	; 99
   197a0:	f1 f0       	breq	.+60     	; 0x197de <process_commands() [clone .part.46]+0x6daa>
}

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 <serialprintlnPGM(char const*)>
   197aa:	13 c0       	rjmp	.+38     	; 0x197d2 <process_commands() [clone .part.46]+0x6d9e>

    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 <process_commands() [clone .part.46]+0x6da6>
        // load to extruder gears; if mmu is not present do nothing
        if (MMU2::mmu2.Enabled()) {
   197b0:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   197b4:	81 30       	cpi	r24, 0x01	; 1
   197b6:	69 f4       	brne	.+26     	; 0x197d2 <process_commands() [clone .part.46]+0x6d9e>
            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 <lang_get_translation>
   197c0:	70 e0       	ldi	r23, 0x00	; 0
   197c2:	60 e0       	ldi	r22, 0x00	; 0
   197c4:	0e 94 bc e4 	call	0x1c978	; 0x1c978 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]>
   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 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]>
        processing_tcode = false;
   197d2:	10 92 a1 03 	sts	0x03A1, r1	; 0x8003a1 <processing_tcode>
   197d6:	0c 94 d8 95 	jmp	0x12bb0	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    } 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 <process_commands() [clone .part.46]+0x6dbc>
        // load from extruder gears to nozzle (nozzle should be preheated)
        if (MMU2::mmu2.Enabled()) {
   197de:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   197e2:	81 30       	cpi	r24, 0x01	; 1
   197e4:	b1 f7       	brne	.-20     	; 0x197d2 <process_commands() [clone .part.46]+0x6d9e>
            MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool());
   197e6:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
   197ea:	68 2f       	mov	r22, r24
   197ec:	83 e6       	ldi	r24, 0x63	; 99
   197ee:	ef cf       	rjmp	.-34     	; 0x197ce <process_commands() [clone .part.46]+0x6d9a>
        }
    } else { // Process T0 ... T4
        if (MMU2::mmu2.Enabled()) {
   197f0:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   197f4:	81 30       	cpi	r24, 0x01	; 1
   197f6:	69 f4       	brne	.+26     	; 0x19812 <process_commands() [clone .part.46]+0x6dde>
            if (codeValue == MMU2::mmu2.get_current_tool()){
   197f8:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
   197fc:	18 13       	cpse	r17, r24
   197fe:	05 c0       	rjmp	.+10     	; 0x1980a <process_commands() [clone .part.46]+0x6dd6>
                // 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 <puts_P>
   19808:	e4 cf       	rjmp	.-56     	; 0x197d2 <process_commands() [clone .part.46]+0x6d9e>
#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 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]>
   19810:	e0 cf       	rjmp	.-64     	; 0x197d2 <process_commands() [clone .part.46]+0x6d9e>
            }
        } 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 <serialprintPGM(char const*)>
            if (codeValue >= EXTRUDERS) {
   1981a:	11 23       	and	r17, r17
   1981c:	59 f0       	breq	.+22     	; 0x19834 <process_commands() [clone .part.46]+0x6e00>
}

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 <MarlinSerial::write(unsigned char)>
                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 <MarlinSerial::println(int, int) [clone .constprop.325]>
                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 <process_commands() [clone .part.46]+0x6d72>
//                    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 <serialprintPGM(char const*)>
   1983c:	ca cf       	rjmp	.-108    	; 0x197d2 <process_commands() [clone .part.46]+0x6d9e>

  /**
  *---------------------------------------------------------------------------------
  *# D codes
  */
  else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug)
   1983e:	84 34       	cpi	r24, 0x44	; 68
   19840:	09 f0       	breq	.+2      	; 0x19844 <process_commands() [clone .part.46]+0x6e10>
   19842:	ee c0       	rjmp	.+476    	; 0x19a20 <process_commands() [clone .part.46]+0x6fec>
  {
    strchr_pointer = CMDBUFFER_CURRENT_STRING;
   19844:	10 93 94 03 	sts	0x0394, r17	; 0x800394 <strchr_pointer+0x1>
   19848:	00 93 93 03 	sts	0x0393, r16	; 0x800393 <strchr_pointer>
    switch(code_value_short())
   1984c:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   19850:	86 30       	cpi	r24, 0x06	; 6
   19852:	91 05       	cpc	r25, r1
   19854:	09 f4       	brne	.+2      	; 0x19858 <process_commands() [clone .part.46]+0x6e24>
   19856:	79 c0       	rjmp	.+242    	; 0x1994a <process_commands() [clone .part.46]+0x6f16>
   19858:	9c f4       	brge	.+38     	; 0x19880 <process_commands() [clone .part.46]+0x6e4c>
   1985a:	82 30       	cpi	r24, 0x02	; 2
   1985c:	91 05       	cpc	r25, r1
   1985e:	09 f4       	brne	.+2      	; 0x19862 <process_commands() [clone .part.46]+0x6e2e>
   19860:	52 c0       	rjmp	.+164    	; 0x19906 <process_commands() [clone .part.46]+0x6ed2>
   19862:	83 30       	cpi	r24, 0x03	; 3
   19864:	91 05       	cpc	r25, r1
   19866:	09 f4       	brne	.+2      	; 0x1986a <process_commands() [clone .part.46]+0x6e36>
   19868:	61 c0       	rjmp	.+194    	; 0x1992c <process_commands() [clone .part.46]+0x6ef8>
   1986a:	01 96       	adiw	r24, 0x01	; 1
   1986c:	89 f4       	brne	.+34     	; 0x19890 <process_commands() [clone .part.46]+0x6e5c>

    *
    */
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 <printf_P>
   1987a:	0f 90       	pop	r0
   1987c:	0f 90       	pop	r0
   1987e:	ff cf       	rjmp	.-2      	; 0x1987e <process_commands() [clone .part.46]+0x6e4a>
   19880:	85 31       	cpi	r24, 0x15	; 21
   19882:	91 05       	cpc	r25, r1
   19884:	09 f4       	brne	.+2      	; 0x19888 <process_commands() [clone .part.46]+0x6e54>
   19886:	8d c0       	rjmp	.+282    	; 0x199a2 <process_commands() [clone .part.46]+0x6f6e>
   19888:	94 f4       	brge	.+36     	; 0x198ae <process_commands() [clone .part.46]+0x6e7a>
   1988a:	44 97       	sbiw	r24, 0x14	; 20
   1988c:	09 f4       	brne	.+2      	; 0x19890 <process_commands() [clone .part.46]+0x6e5c>
   1988e:	69 c0       	rjmp	.+210    	; 0x19962 <process_commands() [clone .part.46]+0x6f2e>
#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 <bufindr>
   19894:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   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 <process_commands() [clone .part.46]+0x4b2>
  *# 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 <process_commands() [clone .part.46]+0x6e82>
   198b4:	9b c0       	rjmp	.+310    	; 0x199ec <process_commands() [clone .part.46]+0x6fb8>
   198b6:	86 34       	cpi	r24, 0x46	; 70
   198b8:	91 05       	cpc	r25, r1
   198ba:	51 f7       	brne	.-44     	; 0x19890 <process_commands() [clone .part.46]+0x6e5c>

    #### 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 <code_seen(char) [clone .lto_priv.549]>
   198c2:	88 23       	and	r24, r24
   198c4:	11 f4       	brne	.+4      	; 0x198ca <process_commands() [clone .part.46]+0x6e96>
   198c6:	0c 94 d8 95 	jmp	0x12bb0	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
            thermal_model_log_enable(code_value_short());
   198ca:	0e 94 0d 5b 	call	0xb61a	; 0xb61a <code_value_short() [clone .lto_priv.543]>
   198ce:	11 e0       	ldi	r17, 0x01	; 1
   198d0:	00 97       	sbiw	r24, 0x00	; 0
   198d2:	09 f4       	brne	.+2      	; 0x198d6 <process_commands() [clone .part.46]+0x6ea2>
   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 <process_commands() [clone .part.46]+0x6eca>
        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 <TempMgrGuard::TempMgrGuard()>
        thermal_model::log_buf.entry.stamp = _millis();
   198e2:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <TempMgrGuard::~TempMgrGuard()>
        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 <process_commands() [clone .part.46]+0x17c>
	- 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 <dcode_core(unsigned long, unsigned long, dcode_mem_t, unsigned char, char const*)>
   19928:	0c 94 d8 95 	jmp	0x12bb0	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
	- 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 <process_commands() [clone .part.46]+0x6ef0>
   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 <process_commands() [clone .part.46]+0x6f0e>
#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 <code_seen(char) [clone .lto_priv.549]>
   19968:	88 23       	and	r24, r24
   1996a:	29 f0       	breq	.+10     	; 0x19976 <process_commands() [clone .part.46]+0x6f42>
        xfdump_full_dump_and_reset();
   1996c:	80 e0       	ldi	r24, 0x00	; 0
   1996e:	0e 94 75 ee 	call	0x1dcea	; 0x1dcea <xfdump_full_dump_and_reset(dump_crash_reason)>
   19972:	0c 94 d8 95 	jmp	0x12bb0	; 0x12bb0 <process_commands() [clone .part.46]+0x17c>
    else
    {
        unsigned long ts = _millis();
   19976:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   1997a:	6b 01       	movw	r12, r22
   1997c:	7c 01       	movw	r14, r24
        xfdump_dump();
   1997e:	0e 94 a3 ee 	call	0x1dd46	; 0x1dd46 <xfdump_dump()>
        ts = _millis() - ts;
   19982:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <process_commands() [clone .part.46]+0x4b2>
    }
}

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 <xfdump_check_state(dump_crash_reason*)>
   199aa:	81 11       	cpse	r24, r1
   199ac:	07 c0       	rjmp	.+14     	; 0x199bc <process_commands() [clone .part.46]+0x6f88>
        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 <printf_P>
   199ba:	14 c0       	rjmp	.+40     	; 0x199e4 <process_commands() [clone .part.46]+0x6fb0>
{
    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 <busy_state>
        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 <printf_P>
        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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]>
    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 <process_commands() [clone .part.46]+0x17c>
    }
}

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 <xfdump_check_state(dump_crash_reason*)>
   199f4:	81 11       	cpse	r24, r1
   199f6:	03 c0       	rjmp	.+6      	; 0x199fe <process_commands() [clone .part.46]+0x6fca>
        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 <process_commands() [clone .part.46]+0x6f7e>
	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 <xflash_enable_wr>
	_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_erase>
    xflash_sector_erase(DUMP_OFFSET + offsetof(dump_t, header.magic));
    xflash_wait_busy();
   19a16:	0e 94 5d ed 	call	0x1daba	; 0x1daba <xflash_wait_busy>
    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 <process_commands() [clone .part.46]+0x6f7e>
	}
  }

  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 <serialprintPGM(char const*)>
    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 <serialprintPGM(char const*)>
    SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
   19a30:	80 91 91 12 	lds	r24, 0x1291	; 0x801291 <bufindr>
   19a34:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   19a38:	89 55       	subi	r24, 0x59	; 89
   19a3a:	9f 4e       	sbci	r25, 0xEF	; 239
   19a3c:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
    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 <process_commands() [clone .part.46]+0x592>

#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 <process_commands() [clone .part.46]+0x702c>
   19a5c:	0c 94 20 99 	jmp	0x13240	; 0x13240 <process_commands() [clone .part.46]+0x80c>
   19a60:	0c 94 8e 9a 	jmp	0x1351c	; 0x1351c <process_commands() [clone .part.46]+0xae8>
            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 <process_commands() [clone .part.46]+0x7048>
   19a78:	0c 94 6f a2 	jmp	0x144de	; 0x144de <process_commands() [clone .part.46]+0x1aaa>
   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 <process_commands() [clone .part.46]+0x1a38>
				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 <process_commands() [clone .part.46]+0x7070>
   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 <process_commands() [clone .part.46]+0x7070>
   19aa2:	ac cc       	rjmp	.-1704   	; 0x193fc <process_commands() [clone .part.46]+0x69c8>
   19aa4:	90 e0       	ldi	r25, 0x00	; 0
   19aa6:	aa cc       	rjmp	.-1708   	; 0x193fc <process_commands() [clone .part.46]+0x69c8>
    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 <lang_get_translation>
   19ab0:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
        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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        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 <process_commands() [clone .part.46]+0x709c>
   19acc:	0c 94 ca b6 	jmp	0x16d94	; 0x16d94 <process_commands() [clone .part.46]+0x4360>
   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 <process_commands() [clone .part.46]+0x70a8>
   19ad8:	0c 94 ca b6 	jmp	0x16d94	; 0x16d94 <process_commands() [clone .part.46]+0x4360>
   19adc:	8d 30       	cpi	r24, 0x0D	; 13
   19ade:	11 f4       	brne	.+4      	; 0x19ae4 <process_commands() [clone .part.46]+0x70b0>
   19ae0:	0c 94 ca b6 	jmp	0x16d94	; 0x16d94 <process_commands() [clone .part.46]+0x4360>

    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 <lcd_putc(char)>
   19ae8:	eb cf       	rjmp	.-42     	; 0x19ac0 <process_commands() [clone .part.46]+0x708c>
    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 <TempMgrGuard::TempMgrGuard()>
   19af2:	0c 94 b9 aa 	jmp	0x15572	; 0x15572 <process_commands() [clone .part.46]+0x2b3e>

00019af6 <MarlinSerial::begin(long) [clone .constprop.64]>:


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 <selectedSerialPort>
   19b28:	81 30       	cpi	r24, 0x01	; 1
   19b2a:	a9 f4       	brne	.+42     	; 0x19b56 <MarlinSerial::begin(long) [clone .constprop.64]+0x60>
   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 <turnOffPWM>:
   19b58:	81 50       	subi	r24, 0x01	; 1
   19b5a:	82 31       	cpi	r24, 0x12	; 18
   19b5c:	08 f0       	brcs	.+2      	; 0x19b60 <turnOffPWM+0x8>
   19b5e:	5a c0       	rjmp	.+180    	; 0x19c14 <turnOffPWM+0xbc>
   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 <process_commands() [clone .part.46]+0x6cee>
   19b72:	dc cd       	rjmp	.-1096   	; 0x1972c <process_commands() [clone .part.46]+0x6cf8>
   19b74:	ca cd       	rjmp	.-1132   	; 0x1970a <process_commands() [clone .part.46]+0x6cd6>
   19b76:	d0 cd       	rjmp	.-1120   	; 0x19718 <process_commands() [clone .part.46]+0x6ce4>
   19b78:	d4 cd       	rjmp	.-1112   	; 0x19722 <process_commands() [clone .part.46]+0x6cee>
   19b7a:	0a ce       	rjmp	.-1004   	; 0x19790 <process_commands() [clone .part.46]+0x6d5c>
   19b7c:	df cd       	rjmp	.-1090   	; 0x1973c <process_commands() [clone .part.46]+0x6d08>
   19b7e:	e5 cd       	rjmp	.-1078   	; 0x1974a <process_commands() [clone .part.46]+0x6d16>
   19b80:	e9 cd       	rjmp	.-1070   	; 0x19754 <process_commands() [clone .part.46]+0x6d20>
   19b82:	ef cd       	rjmp	.-1058   	; 0x19762 <process_commands() [clone .part.46]+0x6d2e>
   19b84:	f3 cd       	rjmp	.-1050   	; 0x1976c <process_commands() [clone .part.46]+0x6d38>
   19b86:	f7 cd       	rjmp	.-1042   	; 0x19776 <process_commands() [clone .part.46]+0x6d42>
   19b88:	fd cd       	rjmp	.-1030   	; 0x19784 <process_commands() [clone .part.46]+0x6d50>
   19b8a:	01 ce       	rjmp	.-1022   	; 0x1978e <process_commands() [clone .part.46]+0x6d5a>
   19b8c:	0a ce       	rjmp	.-1004   	; 0x197a2 <process_commands() [clone .part.46]+0x6d6e>
   19b8e:	05 ce       	rjmp	.-1014   	; 0x1979a <process_commands() [clone .part.46]+0x6d66>
   19b90:	0b ce       	rjmp	.-1002   	; 0x197a8 <process_commands() [clone .part.46]+0x6d74>
   19b92:	0f ce       	rjmp	.-994    	; 0x197b2 <process_commands() [clone .part.46]+0x6d7e>
   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 <turnOffPWM+0x42>
   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 <turnOffPWM+0x42>
   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 <turnOffPWM+0x5c>
   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 <turnOffPWM+0x6c>
   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 <turnOffPWM+0x80>
   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 <turnOffPWM+0x80>
   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 <turnOffPWM+0x9c>
   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 <turnOffPWM+0x9c>
   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 <turnOffPWM+0xb8>
   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 <turnOffPWM+0xb8>

00019c26 <check_pinda_1()>:
   19c26:	83 b1       	in	r24, 0x03	; 3
   19c28:	82 95       	swap	r24
   19c2a:	81 70       	andi	r24, 0x01	; 1
   19c2c:	08 95       	ret

00019c2e <xyzcal_calc_delay(unsigned int, unsigned int)>:
}
#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 <xyzcal_sm4_delay>
   19c32:	90 91 fd 03 	lds	r25, 0x03FD	; 0x8003fd <xyzcal_sm4_delay+0x1>
   19c36:	08 95       	ret

00019c38 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)>:
}

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 <xyzcal_dm>
   19c44:	b0 e0       	ldi	r27, 0x00	; 0
   19c46:	a0 e0       	ldi	r26, 0x00	; 0
   19c48:	c0 90 b2 06 	lds	r12, 0x06B2	; 0x8006b2 <count_position>
   19c4c:	d0 90 b3 06 	lds	r13, 0x06B3	; 0x8006b3 <count_position+0x1>
   19c50:	e0 90 b4 06 	lds	r14, 0x06B4	; 0x8006b4 <count_position+0x2>
   19c54:	f0 90 b5 06 	lds	r15, 0x06B5	; 0x8006b5 <count_position+0x3>
   19c58:	20 ff       	sbrs	r18, 0
   19c5a:	42 c0       	rjmp	.+132    	; 0x19ce0 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0xa8>
   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 <count_position>
   19c68:	d0 92 b3 06 	sts	0x06B3, r13	; 0x8006b3 <count_position+0x1>
   19c6c:	e0 92 b4 06 	sts	0x06B4, r14	; 0x8006b4 <count_position+0x2>
   19c70:	f0 92 b5 06 	sts	0x06B5, r15	; 0x8006b5 <count_position+0x3>
   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 <count_position+0x4>
   19c7e:	d0 90 b7 06 	lds	r13, 0x06B7	; 0x8006b7 <count_position+0x5>
   19c82:	e0 90 b8 06 	lds	r14, 0x06B8	; 0x8006b8 <count_position+0x6>
   19c86:	f0 90 b9 06 	lds	r15, 0x06B9	; 0x8006b9 <count_position+0x7>
   19c8a:	21 ff       	sbrs	r18, 1
   19c8c:	36 c0       	rjmp	.+108    	; 0x19cfa <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0xc2>
   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 <count_position+0x4>
   19c9a:	d0 92 b7 06 	sts	0x06B7, r13	; 0x8006b7 <count_position+0x5>
   19c9e:	e0 92 b8 06 	sts	0x06B8, r14	; 0x8006b8 <count_position+0x6>
   19ca2:	f0 92 b9 06 	sts	0x06B9, r15	; 0x8006b9 <count_position+0x7>
   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 <count_position+0x8>
   19cae:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   19cb2:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   19cb6:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   19cba:	22 ff       	sbrs	r18, 2
   19cbc:	2b c0       	rjmp	.+86     	; 0x19d14 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0xdc>
   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 <count_position+0x8>
   19cca:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   19cce:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   19cd2:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
//	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 <count_position>
   19cec:	90 93 b3 06 	sts	0x06B3, r25	; 0x8006b3 <count_position+0x1>
   19cf0:	a0 93 b4 06 	sts	0x06B4, r26	; 0x8006b4 <count_position+0x2>
   19cf4:	b0 93 b5 06 	sts	0x06B5, r27	; 0x8006b5 <count_position+0x3>
   19cf8:	bd cf       	rjmp	.-134    	; 0x19c74 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0x3c>
	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 <count_position+0x4>
   19d06:	90 93 b7 06 	sts	0x06B7, r25	; 0x8006b7 <count_position+0x5>
   19d0a:	a0 93 b8 06 	sts	0x06B8, r26	; 0x8006b8 <count_position+0x6>
   19d0e:	b0 93 b9 06 	sts	0x06B9, r27	; 0x8006b9 <count_position+0x7>
   19d12:	c9 cf       	rjmp	.-110    	; 0x19ca6 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0x6e>
	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 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0x8e>

00019d1e <Number(char const*, unsigned int*)>:
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 <Number(char const*, unsigned int*)+0x3a>
        *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 <Number(char const*, unsigned int*)+0x8>
        ++str;
    }
    return str;
}
   19d58:	08 95       	ret

00019d5a <lcd_thermal_model_cal()>:
}

#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_commands_type>
    lcd_return_to_status();
   19d60:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00019d64 <lcd_check_update_RAM(ClCheckMode*)>:
        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 <lcd_check_update_RAM(ClCheckMode*)+0x10>
   19d6c:	81 30       	cpi	r24, 0x01	; 1
   19d6e:	29 f4       	brne	.+10     	; 0x19d7a <lcd_check_update_RAM(ClCheckMode*)+0x16>
        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 <lcd_check_update_RAM(ClCheckMode*)+0x12>
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 <lcd_send_action_start()>:
}

//! @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 <serialprintlnPGM(char const*)>
    lcd_return_to_status();
   19d86:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00019d8a <lcd_printer_ready_state_toggle()>:
//! 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 <lcd_printer_ready_state_toggle()+0x10>
        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 <serialprintlnPGM(char const*)>
   19d9a:	8a ea       	ldi	r24, 0xAA	; 170
   19d9c:	9a e6       	ldi	r25, 0x6A	; 106
   19d9e:	fb cf       	rjmp	.-10     	; 0x19d96 <lcd_printer_ready_state_toggle()+0xc>

00019da0 <MMU2::MMU2::execute_load_to_nozzle_sequence() [clone .constprop.53]>:
    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 <st_synchronize()>
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 <MMU2::mmu2+0x4c>
   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 <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.132]>

00019dec <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]>:
        }
    }
    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 <menu_item>
   19e0e:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   19e12:	32 13       	cpse	r19, r18
   19e14:	73 c0       	rjmp	.+230    	; 0x19efc <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0x110>
   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 <lcd_draw_update>
   19e1c:	88 23       	and	r24, r24
   19e1e:	09 f4       	brne	.+2      	; 0x19e22 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0x36>
   19e20:	45 c0       	rjmp	.+138    	; 0x19eac <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0xc0>
//!
//! @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 <lang_get_translation>
   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 <sprintf_P>
   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 <eeprom_read_block>
   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<uint_least8_t>(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 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0x90>
   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 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0x78>
    }
	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 <menu_selection_mark() [clone .lto_priv.426]>
   19e92:	48 2f       	mov	r20, r24
   19e94:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   19e98:	80 e0       	ldi	r24, 0x00	; 0
   19e9a:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    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_print_pad(char const*, unsigned char)>
    lcd_putc(type_char);
   19ea6:	80 e2       	ldi	r24, 0x20	; 32
   19ea8:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
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 <menu_clicked>
   19eb0:	88 23       	and	r24, r24
   19eb2:	21 f1       	breq	.+72     	; 0x19efc <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0x110>
   19eb4:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   19eb8:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   19ebc:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   19ec0:	28 17       	cp	r18, r24
   19ec2:	19 06       	cpc	r1, r25
   19ec4:	d9 f4       	brne	.+54     	; 0x19efc <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0x110>
        {
            lcd_update_enabled = 0;
   19ec6:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
            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 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0xea>
   19ed2:	0e 94 fb 75 	call	0xebf6	; 0xebf6 <eeprom_switch_to_next_sheet()>
            lcd_update_enabled = 1;
   19ed6:	81 e0       	ldi	r24, 0x01	; 1
   19ed8:	80 93 6e 02 	sts	0x026E, r24	; 0x80026e <lcd_update_enabled>
            menu_item_ret();
   19edc:	0f 94 70 d0 	call	0x3a0e0	; 0x3a0e0 <menu_item_ret()>
            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 <menu_item>
   19f00:	8f 5f       	subi	r24, 0xFF	; 255
   19f02:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
   19f06:	ec cf       	rjmp	.-40     	; 0x19ee0 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]+0xf4>

00019f08 <lcd_mesh_calibration()>:
	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 <enquecommand(char const*, bool)>
  lcd_return_to_status();
   19f12:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00019f16 <lcd_mesh_calibration_z()>:
}

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 <enquecommand(char const*, bool)>
  lcd_return_to_status();
   19f20:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00019f24 <lcd_mesh_bedleveling()>:
}
#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 <enquecommand(char const*, bool)>
	lcd_return_to_status();
   19f2e:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00019f32 <lcd_calibrate_pinda()>:
	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 <enquecommand(char const*, bool)>
	lcd_return_to_status();
   19f3c:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00019f40 <nozzle_change()>:
}

static void nozzle_change()
{
#ifdef FILAMENT_SENSOR
    if (fsensor.isEnabled() && fsensor.getFilamentPresent()) {
   19f40:	80 91 a9 17 	lds	r24, 0x17A9	; 0x8017a9 <fsensor>
   19f44:	88 23       	and	r24, r24
   19f46:	61 f0       	breq	.+24     	; 0x19f60 <nozzle_change()+0x20>
   19f48:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   19f4c:	88 23       	and	r24, r24
   19f4e:	41 f0       	breq	.+16     	; 0x19f60 <nozzle_change()+0x20>
        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 <lang_get_translation>
   19f58:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
        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_return_to_status()>
        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 <lcd_commands_type>
   19f66:	fa cf       	rjmp	.-12     	; 0x19f5c <nozzle_change()+0x1c>

00019f68 <wizard_lay1cal_message(bool)>:
    // 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 <lang_get_translation>
   19f74:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
            _T(MSG_WIZARD_V2_CAL));
    if (MMU2::mmu2.Enabled())
   19f78:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   19f7c:	81 30       	cpi	r24, 0x01	; 1
   19f7e:	69 f4       	brne	.+26     	; 0x19f9a <wizard_lay1cal_message(bool)+0x32>
    {
        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 <lang_get_translation>
   19f88:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
                _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 <lang_get_translation>
            _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 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    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 <wizard_lay1cal_message(bool)+0x24>
    {
        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 <wizard_lay1cal_message(bool)+0x1c>

00019fa4 <lcd_wizard_load()>:
    }

}

static void lcd_wizard_load() {
    if (MMU2::mmu2.Enabled()) {
   19fa4:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   19fa8:	81 30       	cpi	r24, 0x01	; 1
   19faa:	71 f4       	brne	.+28     	; 0x19fc8 <lcd_wizard_load()+0x24>
        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 <lang_get_translation>
   19fb4:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
            _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 <eFilamentAction>
    }

    // 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 <enquecommand(char const*, bool)>
        // 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 <lang_get_translation>
   19fd0:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
            _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_update_enable(unsigned char)>
        lcd_clear();
   19fda:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
        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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        eFilamentAction = FilamentAction::Load;
   19ff0:	81 e0       	ldi	r24, 0x01	; 1
   19ff2:	e3 cf       	rjmp	.-58     	; 0x19fba <lcd_wizard_load()+0x16>

00019ff4 <fsensor_reinit()>:
#endif // TMC2130

#ifdef FILAMENT_SENSOR

static void fsensor_reinit() {
    fsensor.init();
   19ff4:	0d 94 30 7c 	jmp	0x2f860	; 0x2f860 <PAT9125_sensor::init() [clone .constprop.230]>

00019ff8 <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)>:

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 <strncmp_P>
   1a016:	89 2b       	or	r24, r25
   1a018:	b9 f4       	brne	.+46     	; 0x1a048 <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)+0x50>
        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 <Number(char const*, unsigned int*)>
        *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 <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)+0x3e>

0001a04c <lcd_fsensor_runout_set()>:
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 <eeprom_update_byte>

0001a060 <lcd_fsensor_autoload_set()>:
}

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 <eeprom_update_byte>

0001a074 <lcd_heat_bed_on_load_toggle()>:
}
#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 <eeprom_read_byte>
    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 <lcd_heat_bed_on_load_toggle()+0x10>
   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 <eeprom_update_byte>

0001a08c <WorkaroundPrusaSN()>:
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 <eeprom_update_byte>
   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 <WorkaroundPrusaSN()+0x8>
        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 <mbl_probe_nr_toggle()>:
	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 <eeprom_read_byte>
	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 <mbl_probe_nr_toggle()+0x16>
		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 <mbl_probe_nr_toggle()+0x16>
		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 <eeprom_update_byte>

0001a0d0 <mbl_mesh_toggle()>:
	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 <eeprom_read_byte>
	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 <mbl_mesh_toggle()+0x10>
   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 <eeprom_update_byte>

0001a0e8 <mbl_magnets_elimination_toggle()>:
#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 <eeprom_read_byte>
	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 <eeprom_update_byte>

0001a0fe <lcd_check_filament_set()>:
    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 <lcd_check_update_RAM(ClCheckMode*)>
   1a106:	60 91 e6 04 	lds	r22, 0x04E6	; 0x8004e6 <oCheckFilament>
   1a10a:	80 e2       	ldi	r24, 0x20	; 32
   1a10c:	9c e0       	ldi	r25, 0x0C	; 12
   1a10e:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>

0001a112 <lcd_check_version_set()>:
    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 <lcd_check_update_RAM(ClCheckMode*)>
   1a11a:	60 91 e8 04 	lds	r22, 0x04E8	; 0x8004e8 <oCheckVersion>
   1a11e:	83 ea       	ldi	r24, 0xA3	; 163
   1a120:	9d e0       	ldi	r25, 0x0D	; 13
   1a122:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>

0001a126 <lcd_check_model_set()>:
    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 <lcd_check_update_RAM(ClCheckMode*)>
   1a12e:	60 91 e9 04 	lds	r22, 0x04E9	; 0x8004e9 <oCheckModel>
   1a132:	84 ea       	ldi	r24, 0xA4	; 164
   1a134:	9d e0       	ldi	r25, 0x0D	; 13
   1a136:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>

0001a13a <lcd_check_mode_set()>:
            *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 <lcd_check_update_RAM(ClCheckMode*)>
   1a142:	60 91 eb 04 	lds	r22, 0x04EB	; 0x8004eb <oCheckMode>
   1a146:	88 ea       	ldi	r24, 0xA8	; 168
   1a148:	9d e0       	ldi	r25, 0x0D	; 13
   1a14a:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>

0001a14e <lcd_fsensor_actionNA_set()>:
#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 <fsensor+0x8>
        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 <lcd_fsensor_actionNA_set()+0xc>
        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 <fsensor+0x8>
   1a15e:	87 e4       	ldi	r24, 0x47	; 71
   1a160:	9d e0       	ldi	r25, 0x0D	; 13
   1a162:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>

0001a166 <lcd_toshiba_flash_air_compatibility_toggle()>:
	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 <eeprom_update_byte>

0001a17a <lcd_second_serial_set()>:
	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 <selectedSerialPort>
   1a17e:	81 30       	cpi	r24, 0x01	; 1
   1a180:	51 f4       	brne	.+20     	; 0x1a196 <lcd_second_serial_set()+0x1c>
   1a182:	10 92 38 05 	sts	0x0538, r1	; 0x800538 <selectedSerialPort>
   1a186:	60 91 38 05 	lds	r22, 0x0538	; 0x800538 <selectedSerialPort>
   1a18a:	88 e0       	ldi	r24, 0x08	; 8
   1a18c:	9f e0       	ldi	r25, 0x0F	; 15
   1a18e:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
	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 <MarlinSerial::begin(long) [clone .constprop.64]>
}

#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 <selectedSerialPort>
   1a19c:	f4 cf       	rjmp	.-24     	; 0x1a186 <lcd_second_serial_set()+0xc>

0001a19e <lcd_temp_calibration_set()>:
  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 <eeprom_read_byte>
	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 <eeprom_update_byte>

0001a1b4 <lcd_sound_state_set()>:
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 <eSoundMode>
   1a1b8:	81 30       	cpi	r24, 0x01	; 1
   1a1ba:	71 f0       	breq	.+28     	; 0x1a1d8 <lcd_sound_state_set()+0x24>
   1a1bc:	20 f0       	brcs	.+8      	; 0x1a1c6 <lcd_sound_state_set()+0x12>
   1a1be:	82 30       	cpi	r24, 0x02	; 2
   1a1c0:	69 f4       	brne	.+26     	; 0x1a1dc <lcd_sound_state_set()+0x28>
          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 <lcd_sound_state_set()+0x14>
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 <eSoundMode>
   1a1cc:	60 91 dd 04 	lds	r22, 0x04DD	; 0x8004dd <eSoundMode>
   1a1d0:	87 ed       	ldi	r24, 0xD7	; 215
   1a1d2:	9e e0       	ldi	r25, 0x0E	; 14
   1a1d4:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>
   1a1d8:	82 e0       	ldi	r24, 0x02	; 2
   1a1da:	f6 cf       	rjmp	.-20     	; 0x1a1c8 <lcd_sound_state_set()+0x14>
          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 <eSoundMode>
   1a1e0:	f5 cf       	rjmp	.-22     	; 0x1a1cc <lcd_sound_state_set()+0x18>

0001a1e2 <lcd_sort_type_set()>:
}

#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 <eeprom_read_byte>
	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 <lcd_sort_type_set()+0x16>
		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 <lcd_sort_type_set()+0x16>
		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>
	}
	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 <card+0x51>
}
   1a206:	08 95       	ret

0001a208 <lcd_nozzle_diameter_cycle()>:
            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 <oNozzleDiameter>
   1a210:	8c 33       	cpi	r24, 0x3C	; 60
   1a212:	e1 f0       	breq	.+56     	; 0x1a24c <lcd_nozzle_diameter_cycle()+0x44>
   1a214:	80 35       	cpi	r24, 0x50	; 80
   1a216:	01 f1       	breq	.+64     	; 0x1a258 <lcd_nozzle_diameter_cycle()+0x50>
   1a218:	88 32       	cpi	r24, 0x28	; 40
   1a21a:	91 f0       	breq	.+36     	; 0x1a240 <lcd_nozzle_diameter_cycle()+0x38>
    case ClNozzleDiameter::_Diameter_250:
        oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
   1a21c:	88 e2       	ldi	r24, 0x28	; 40
   1a21e:	80 93 ea 04 	sts	0x04EA, r24	; 0x8004ea <oNozzleDiameter>
        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 <oNozzleDiameter>
   1a22a:	87 ea       	ldi	r24, 0xA7	; 167
   1a22c:	9d e0       	ldi	r25, 0x0D	; 13
   1a22e:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
        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 <eeprom_update_word>
    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 <oNozzleDiameter>
        nDiameter=600;
   1a246:	c8 e5       	ldi	r28, 0x58	; 88
   1a248:	d2 e0       	ldi	r29, 0x02	; 2
   1a24a:	ed cf       	rjmp	.-38     	; 0x1a226 <lcd_nozzle_diameter_cycle()+0x1e>
        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 <oNozzleDiameter>
        nDiameter=800;
   1a252:	c0 e2       	ldi	r28, 0x20	; 32
   1a254:	d3 e0       	ldi	r29, 0x03	; 3
   1a256:	e7 cf       	rjmp	.-50     	; 0x1a226 <lcd_nozzle_diameter_cycle()+0x1e>
        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 <oNozzleDiameter>
        nDiameter=250;
   1a25e:	ca ef       	ldi	r28, 0xFA	; 250
   1a260:	d0 e0       	ldi	r29, 0x00	; 0
   1a262:	e1 cf       	rjmp	.-62     	; 0x1a226 <lcd_nozzle_diameter_cycle()+0x1e>

0001a264 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])>:
    }
    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 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0xa>
   1a26e:	00 d0       	rcall	.+0      	; 0x1a270 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0xc>
   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 <eeprom_read_word>
   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 <eeprom_read_word>
   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 <eeprom_read_word>
   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 <eeprom_read_word>
   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 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x74>
            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 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x70>
   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 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x52>
            return true;
        else if (v < ver_eeprom[i])
            break;
    }

    return false;
   1a2d4:	80 e0       	ldi	r24, 0x00	; 0
   1a2d6:	01 c0       	rjmp	.+2      	; 0x1a2da <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x76>
    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 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>:

	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 <lcd_set_cursor(unsigned char, unsigned char)>
	switch (_state)
   1a306:	11 30       	cpi	r17, 0x01	; 1
   1a308:	21 f0       	breq	.+8      	; 0x1a312 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)+0x22>
   1a30a:	12 30       	cpi	r17, 0x02	; 2
   1a30c:	79 f0       	breq	.+30     	; 0x1a32c <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)+0x3c>
		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_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)+0x4c>
{
	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_puts_P(char const*)>
		lcd_putc(':');
   1a318:	8a e3       	ldi	r24, 0x3A	; 58
   1a31a:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
		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 <lcd_putc(char)>
		break;
	case 2:
		lcd_puts_P(_name_PROGMEM);
   1a32c:	ce 01       	movw	r24, r28
   1a32e:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
		lcd_putc(':');
   1a332:	8a e3       	ldi	r24, 0x3A	; 58
   1a334:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
		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 <lcd_puts_P(char const*)>

0001a348 <lcd_fsensor_enabled_set()>:
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 <fsensor>
   1a34e:	91 11       	cpse	r25, r1
   1a350:	80 e0       	ldi	r24, 0x00	; 0
   1a352:	0c 94 67 74 	jmp	0xe8ce	; 0xe8ce <Filament_sensor::setEnabled(bool)>

0001a356 <lcd_fsensor_jam_detection_set()>:
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 <pat9125_y>
   1a36e:	90 91 8f 0e 	lds	r25, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   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 <PAT9125_sensor::resetStepCount() [clone .constprop.234]>
    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 <eeprom_update_byte>

0001a38e <lcd_mmu_mode_toggle()>:
    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 <eeprom_toggle(unsigned char*)>

0001a396 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]>:
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 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]+0x30>
   1a3a6:	82 30       	cpi	r24, 0x02	; 2
   1a3a8:	89 f0       	breq	.+34     	; 0x1a3cc <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]+0x36>
        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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    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 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]+0x18>
            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 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]+0x18>

0001a3d2 <SETTINGS_FANS_CHECK()>:
    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 <fans_check_enabled>
   1a3da:	88 23       	and	r24, r24
   1a3dc:	89 f0       	breq	.+34     	; 0x1a400 <SETTINGS_FANS_CHECK()+0x2e>
   1a3de:	81 e5       	ldi	r24, 0x51	; 81
   1a3e0:	9c e5       	ldi	r25, 0x5C	; 92
   1a3e2:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
   1a400:	8b e4       	ldi	r24, 0x4B	; 75
   1a402:	9c e5       	ldi	r25, 0x5C	; 92
   1a404:	ee cf       	rjmp	.-36     	; 0x1a3e2 <SETTINGS_FANS_CHECK()+0x10>

0001a406 <SETTINGS_SILENT_MODE()>:
    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 <eeprom_read_byte>
		bool bDesync = tmc2130_mode ^ eeprom_mode;
   1a412:	90 91 8b 06 	lds	r25, 0x068B	; 0x80068b <tmc2130_mode>
        if (eeprom_mode == SILENT_MODE_NORMAL)
   1a416:	81 11       	cpse	r24, r1
   1a418:	35 c0       	rjmp	.+106    	; 0x1a484 <SETTINGS_SILENT_MODE()+0x7e>
        {
            if (bDesync)
   1a41a:	99 23       	and	r25, r25
   1a41c:	11 f1       	breq	.+68     	; 0x1a462 <SETTINGS_SILENT_MODE()+0x5c>
            {
                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 <lang_get_translation>
   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(char const*, char const*, void (*)(), unsigned char)>
            }
            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 <eeprom_read_byte>
   1a43c:	88 23       	and	r24, r24
   1a43e:	f9 f0       	breq	.+62     	; 0x1a47e <SETTINGS_SILENT_MODE()+0x78>
   1a440:	81 e5       	ldi	r24, 0x51	; 81
   1a442:	9c e5       	ldi	r25, 0x5C	; 92
   1a444:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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(char const*, char const*, void (*)(), unsigned char)>
            {
                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 <lang_get_translation>
   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 <lang_get_translation>
   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 <SETTINGS_SILENT_MODE()+0x2a>
            }
            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 <SETTINGS_SILENT_MODE()+0x3e>
        }
        else
        {
            if (bDesync)
   1a484:	98 17       	cp	r25, r24
   1a486:	a9 f0       	breq	.+42     	; 0x1a4b2 <SETTINGS_SILENT_MODE()+0xac>
            {
                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 <lang_get_translation>
   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(char const*, char const*, void (*)(), unsigned char)>
            }
            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 <lang_get_translation>
   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 <SETTINGS_SILENT_MODE()+0x54>
            {
                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 <lang_get_translation>
   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 <lang_get_translation>
   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 <SETTINGS_SILENT_MODE()+0x94>

0001a4ce <menuitems_MMU_settings_common()>:
}

#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 <eeprom_read_byte>
   1a4da:	81 30       	cpi	r24, 0x01	; 1
   1a4dc:	c1 f5       	brne	.+112    	; 0x1a54e <menuitems_MMU_settings_common()+0x80>
    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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>

#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 <eeprom_read_byte>
   1a4fe:	81 30       	cpi	r24, 0x01	; 1
   1a500:	49 f5       	brne	.+82     	; 0x1a554 <menuitems_MMU_settings_common()+0x86>
    {
        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 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    }
#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 <eeprom_read_byte>
   1a528:	88 23       	and	r24, r24
   1a52a:	b9 f0       	breq	.+46     	; 0x1a55a <menuitems_MMU_settings_common()+0x8c>
   1a52c:	86 e7       	ldi	r24, 0x76	; 118
   1a52e:	93 e4       	ldi	r25, 0x43	; 67
   1a530:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>

#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 <menuitems_MMU_settings_common()+0x14>
        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 <menuitems_MMU_settings_common()+0x38>
    }
#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 <menuitems_MMU_settings_common()+0x62>

0001a560 <lcd_hw_setup_menu()>:
        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 <menu_data>
   1a564:	88 23       	and	r24, r24
   1a566:	21 f0       	breq	.+8      	; 0x1a570 <lcd_hw_setup_menu()+0x10>
   1a568:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   1a56c:	88 23       	and	r24, r24
   1a56e:	51 f0       	breq	.+20     	; 0x1a584 <lcd_hw_setup_menu()+0x24>
    {
        _md->status = 1;
   1a570:	81 e0       	ldi	r24, 0x01	; 1
   1a572:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
        _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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1a580:	80 93 a8 03 	sts	0x03A8, r24	; 0x8003a8 <menu_data+0x1>
    }


    MENU_BEGIN();
   1a584:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1a588:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1a58c:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a590:	84 30       	cpi	r24, 0x04	; 4
   1a592:	08 f0       	brcs	.+2      	; 0x1a596 <lcd_hw_setup_menu()+0x36>
   1a594:	76 c0       	rjmp	.+236    	; 0x1a682 <lcd_hw_setup_menu()+0x122>
   1a596:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <bSettings>
   1a59e:	81 11       	cpse	r24, r1
   1a5a0:	3f c0       	rjmp	.+126    	; 0x1a620 <lcd_hw_setup_menu()+0xc0>
   1a5a2:	8f e4       	ldi	r24, 0x4F	; 79
   1a5a4:	99 e4       	ldi	r25, 0x49	; 73
   1a5a6:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   1a5aa:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>

    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 <lang_get_translation>
   1a5b6:	61 ec       	ldi	r22, 0xC1	; 193
   1a5b8:	72 ee       	ldi	r23, 0xE2	; 226
   1a5ba:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    SETTINGS_NOZZLE;
   1a5be:	80 91 ea 04 	lds	r24, 0x04EA	; 0x8004ea <oNozzleDiameter>
   1a5c2:	8c 33       	cpi	r24, 0x3C	; 60
   1a5c4:	09 f4       	brne	.+2      	; 0x1a5c8 <lcd_hw_setup_menu()+0x68>
   1a5c6:	49 c0       	rjmp	.+146    	; 0x1a65a <lcd_hw_setup_menu()+0xfa>
   1a5c8:	70 f5       	brcc	.+92     	; 0x1a626 <lcd_hw_setup_menu()+0xc6>
   1a5ca:	89 31       	cpi	r24, 0x19	; 25
   1a5cc:	d1 f1       	breq	.+116    	; 0x1a642 <lcd_hw_setup_menu()+0xe2>
   1a5ce:	88 32       	cpi	r24, 0x28	; 40
   1a5d0:	71 f1       	breq	.+92     	; 0x1a62e <lcd_hw_setup_menu()+0xce>
    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 <lang_get_translation>
   1a5da:	60 ea       	ldi	r22, 0xA0	; 160
   1a5dc:	7f ec       	ldi	r23, 0xCF	; 207
   1a5de:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    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 <lang_get_translation>
   1a5ea:	68 ef       	ldi	r22, 0xF8	; 248
   1a5ec:	74 ed       	ldi	r23, 0xD4	; 212
   1a5ee:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    //! 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 <menu_data+0x1>
   1a5f6:	88 23       	and	r24, r24
   1a5f8:	31 f0       	breq	.+12     	; 0x1a606 <lcd_hw_setup_menu()+0xa6>
    {
        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 <menu_item_submenu_P(char const*, void (*)())>
	//!
	//! 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 <menu_end()>
        _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 <menu_row>
   1a60e:	8f 5f       	subi	r24, 0xFF	; 255
   1a610:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1a614:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1a618:	8f 5f       	subi	r24, 0xFF	; 255
   1a61a:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1a61e:	b6 cf       	rjmp	.-148    	; 0x1a58c <lcd_hw_setup_menu()+0x2c>
    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 <lcd_hw_setup_menu()+0x46>

    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 <lcd_hw_setup_menu()+0x10e>
   1a62a:	8f 3f       	cpi	r24, 0xFF	; 255
   1a62c:	91 f6       	brne	.-92     	; 0x1a5d2 <lcd_hw_setup_menu()+0x72>
   1a62e:	83 e1       	ldi	r24, 0x13	; 19
   1a630:	94 e4       	ldi	r25, 0x44	; 68
   1a632:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lcd_hw_setup_menu()+0xf4>
   1a642:	83 e1       	ldi	r24, 0x13	; 19
   1a644:	94 e4       	ldi	r25, 0x44	; 68
   1a646:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
   1a658:	bc cf       	rjmp	.-136    	; 0x1a5d2 <lcd_hw_setup_menu()+0x72>
   1a65a:	83 e1       	ldi	r24, 0x13	; 19
   1a65c:	94 e4       	ldi	r25, 0x44	; 68
   1a65e:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lcd_hw_setup_menu()+0xf4>
   1a66e:	83 e1       	ldi	r24, 0x13	; 19
   1a670:	94 e4       	ldi	r25, 0x44	; 68
   1a672:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lcd_hw_setup_menu()+0xf4>
	//! 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_sdcard_stop()>:
    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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
    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 <lcd_putc_at(unsigned char, unsigned char, char)>

    MENU_BEGIN();
   1a6a2:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1a6a6:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
    // 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 <menu_row>
   1a6b0:	84 30       	cpi	r24, 0x04	; 4
   1a6b2:	18 f5       	brcc	.+70     	; 0x1a6fa <lcd_sdcard_stop()+0x76>
   1a6b4:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    // 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 <lcd_sdcard_stop()+0x3c>
   1a6bc:	c0 93 11 05 	sts	0x0511, r28	; 0x800511 <menu_row>

    // 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 <lang_get_translation>
   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(char const*, void (*)())>
    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 <lang_get_translation>
   1a6d8:	66 ea       	ldi	r22, 0xA6	; 166
   1a6da:	75 ef       	ldi	r23, 0xF5	; 245
   1a6dc:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    MENU_END();
   1a6e0:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
{
    // 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 <menu_row>
   1a6e8:	8f 5f       	subi	r24, 0xFF	; 255
   1a6ea:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1a6ee:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1a6f2:	8f 5f       	subi	r24, 0xFF	; 255
   1a6f4:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1a6f8:	d9 cf       	rjmp	.-78     	; 0x1a6ac <lcd_sdcard_stop()+0x28>

    // 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 <lcd_fsensor_settings_menu()>:
            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 <menu_start()>
   1a706:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1a70a:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a70e:	84 30       	cpi	r24, 0x04	; 4
   1a710:	08 f0       	brcs	.+2      	; 0x1a714 <lcd_fsensor_settings_menu()+0x16>
   1a712:	bd c0       	rjmp	.+378    	; 0x1a88e <lcd_fsensor_settings_menu()+0x190>
   1a714:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1a720:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>

    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 <fsensor>
   1a728:	88 23       	and	r24, r24
   1a72a:	09 f4       	brne	.+2      	; 0x1a72e <lcd_fsensor_settings_menu()+0x30>
   1a72c:	4e c0       	rjmp	.+156    	; 0x1a7ca <lcd_fsensor_settings_menu()+0xcc>
   1a72e:	81 e5       	ldi	r24, 0x51	; 81
   1a730:	9c e5       	ldi	r25, 0x5C	; 92
   1a732:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
   1a74c:	80 91 a9 17 	lds	r24, 0x17A9	; 0x8017a9 <fsensor>

    if (fsensor.isEnabled()) {
   1a750:	88 23       	and	r24, r24
   1a752:	09 f4       	brne	.+2      	; 0x1a756 <lcd_fsensor_settings_menu()+0x58>
   1a754:	8c c0       	rjmp	.+280    	; 0x1a86e <lcd_fsensor_settings_menu()+0x170>
        if (fsensor.isError()) {
   1a756:	83 30       	cpi	r24, 0x03	; 3
   1a758:	d9 f5       	brne	.+118    	; 0x1a7d0 <lcd_fsensor_settings_menu()+0xd2>
            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 <lang_get_translation>
   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 <lang_get_translation>
   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(char const*, char const*, void (*)(), unsigned char)>
            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 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#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 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
        }

        switch(fsensor.getActionOnError()) {
   1a7b4:	80 91 b1 17 	lds	r24, 0x17B1	; 0x8017b1 <fsensor+0x8>
   1a7b8:	88 23       	and	r24, r24
   1a7ba:	09 f4       	brne	.+2      	; 0x1a7be <lcd_fsensor_settings_menu()+0xc0>
   1a7bc:	49 c0       	rjmp	.+146    	; 0x1a850 <lcd_fsensor_settings_menu()+0x152>
   1a7be:	81 30       	cpi	r24, 0x01	; 1
   1a7c0:	09 f4       	brne	.+2      	; 0x1a7c4 <lcd_fsensor_settings_menu()+0xc6>
   1a7c2:	62 c0       	rjmp	.+196    	; 0x1a888 <lcd_fsensor_settings_menu()+0x18a>
                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 <lcd_fsensor_actionNA_set()>
   1a7c8:	52 c0       	rjmp	.+164    	; 0x1a86e <lcd_fsensor_settings_menu()+0x170>

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 <lcd_fsensor_settings_menu()+0x34>
#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 <fsensor+0x2>
   1a7d4:	88 23       	and	r24, r24
   1a7d6:	99 f1       	breq	.+102    	; 0x1a83e <lcd_fsensor_settings_menu()+0x140>
   1a7d8:	81 e5       	ldi	r24, 0x51	; 81
   1a7da:	9c e5       	ldi	r25, 0x5C	; 92
   1a7dc:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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(char const*, char const*, void (*)(), unsigned char)>
            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 <fsensor+0x1>
   1a7fa:	88 23       	and	r24, r24
   1a7fc:	19 f1       	breq	.+70     	; 0x1a844 <lcd_fsensor_settings_menu()+0x146>
   1a7fe:	81 e5       	ldi	r24, 0x51	; 81
   1a800:	9c e5       	ldi	r25, 0x5C	; 92
   1a802:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#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 <fsensor+0xe>
   1a820:	88 23       	and	r24, r24
   1a822:	99 f0       	breq	.+38     	; 0x1a84a <lcd_fsensor_settings_menu()+0x14c>
   1a824:	81 e5       	ldi	r24, 0x51	; 81
   1a826:	9c e5       	ldi	r25, 0x5C	; 92
   1a828:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_fsensor_settings_menu()+0xb0>
#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 <lcd_fsensor_settings_menu()+0xde>
            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 <lcd_fsensor_settings_menu()+0x104>
#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 <lcd_fsensor_settings_menu()+0x12a>
#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 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
            default:
                lcd_fsensor_actionNA_set();
        }
    }

    MENU_END();
   1a86e:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
    }
    fsensor.setActionOnError(act, true);
}

static void lcd_fsensor_settings_menu() {
    MENU_BEGIN();
   1a872:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a876:	8f 5f       	subi	r24, 0xFF	; 255
   1a878:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1a87c:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1a880:	8f 5f       	subi	r24, 0xFF	; 255
   1a882:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1a886:	41 cf       	rjmp	.-382    	; 0x1a70a <lcd_fsensor_settings_menu()+0xc>
        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_settings_menu()+0x156>
                lcd_fsensor_actionNA_set();
        }
    }

    MENU_END();
}
   1a88e:	df 91       	pop	r29
   1a890:	cf 91       	pop	r28
   1a892:	08 95       	ret

0001a894 <lcd_sheet_menu()>:
    lcd_first_layer_calibration_reset();
}

static void lcd_sheet_menu()
{
    MENU_BEGIN();
   1a894:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1a898:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1a89c:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a8a0:	84 30       	cpi	r24, 0x04	; 4
   1a8a2:	08 f0       	brcs	.+2      	; 0x1a8a6 <lcd_sheet_menu()+0x12>
   1a8a4:	3f c0       	rjmp	.+126    	; 0x1a924 <lcd_sheet_menu()+0x90>
   1a8a6:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1a8b2:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>

	if(eeprom_is_sheet_initialized(selected_sheet)){
   1a8b6:	80 91 e0 03 	lds	r24, 0x03E0	; 0x8003e0 <selected_sheet>
   1a8ba:	0e 94 d9 75 	call	0xebb2	; 0xebb2 <eeprom_is_sheet_initialized(unsigned char)>
   1a8be:	88 23       	and	r24, r24
   1a8c0:	41 f0       	breq	.+16     	; 0x1a8d2 <lcd_sheet_menu()+0x3e>
	    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 <lang_get_translation>
   1a8ca:	6b e8       	ldi	r22, 0x8B	; 139
   1a8cc:	71 ee       	ldi	r23, 0xE1	; 225
   1a8ce:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
	}

    if (lcd_commands_type == LcdCommands::Idle)
   1a8d2:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   1a8d6:	81 11       	cpse	r24, r1
   1a8d8:	08 c0       	rjmp	.+16     	; 0x1a8ea <lcd_sheet_menu()+0x56>
    {
        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 <lang_get_translation>
   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(char const*, void (*)())>
    }
    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 <lang_get_translation>
   1a8f2:	68 e4       	ldi	r22, 0x48	; 72
   1a8f4:	7c ed       	ldi	r23, 0xDC	; 220
   1a8f6:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
	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 <lang_get_translation>
   1a902:	64 e0       	ldi	r22, 0x04	; 4
   1a904:	7f ee       	ldi	r23, 0xEF	; 239
   1a906:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>

    MENU_END();
   1a90a:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
    lcd_first_layer_calibration_reset();
}

static void lcd_sheet_menu()
{
    MENU_BEGIN();
   1a90e:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a912:	8f 5f       	subi	r24, 0xFF	; 255
   1a914:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1a918:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1a91c:	8f 5f       	subi	r24, 0xFF	; 255
   1a91e:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1a922:	bc cf       	rjmp	.-136    	; 0x1a89c <lcd_sheet_menu()+0x8>
    }
    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 <void select_sheet_menu<(unsigned char)7>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a926:	87 e0       	ldi	r24, 0x07	; 7
   1a928:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a92c:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a930 <void select_sheet_menu<(unsigned char)6>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a930:	86 e0       	ldi	r24, 0x06	; 6
   1a932:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a936:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a93a <void select_sheet_menu<(unsigned char)5>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a93a:	85 e0       	ldi	r24, 0x05	; 5
   1a93c:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a940:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a944 <void select_sheet_menu<(unsigned char)4>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a944:	84 e0       	ldi	r24, 0x04	; 4
   1a946:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a94a:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a94e <void select_sheet_menu<(unsigned char)3>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a94e:	83 e0       	ldi	r24, 0x03	; 3
   1a950:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a954:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a958 <void select_sheet_menu<(unsigned char)2>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a958:	82 e0       	ldi	r24, 0x02	; 2
   1a95a:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a95e:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a962 <void select_sheet_menu<(unsigned char)1>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a962:	81 e0       	ldi	r24, 0x01	; 1
   1a964:	80 93 e0 03 	sts	0x03E0, r24	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a968:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a96c <void select_sheet_menu<(unsigned char)0>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1a96c:	10 92 e0 03 	sts	0x03E0, r1	; 0x8003e0 <selected_sheet>
    lcd_sheet_menu();
   1a970:	0c 94 4a d4 	jmp	0x1a894	; 0x1a894 <lcd_sheet_menu()>

0001a974 <lcd_move_menu_axis()>:
	menu_back_if_clicked();
}

void lcd_move_menu_axis()
{
	MENU_BEGIN();
   1a974:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1a978:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1a97c:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a980:	84 30       	cpi	r24, 0x04	; 4
   1a982:	a8 f5       	brcc	.+106    	; 0x1a9ee <lcd_move_menu_axis()+0x7a>
   1a984:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	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 <lang_get_translation>
   1a990:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lang_get_translation>
   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(char const*, void (*)())>
	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 <lang_get_translation>
   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(char const*, void (*)())>
	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 <lang_get_translation>
   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(char const*, void (*)())>
	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 <lang_get_translation>
   1a9cc:	68 e6       	ldi	r22, 0x68	; 104
   1a9ce:	79 e3       	ldi	r23, 0x39	; 57
   1a9d0:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
	MENU_END();
   1a9d4:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
	menu_back_if_clicked();
}

void lcd_move_menu_axis()
{
	MENU_BEGIN();
   1a9d8:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a9dc:	8f 5f       	subi	r24, 0xFF	; 255
   1a9de:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1a9e2:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1a9e6:	8f 5f       	subi	r24, 0xFF	; 255
   1a9e8:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1a9ec:	c7 cf       	rjmp	.-114    	; 0x1a97c <lcd_move_menu_axis()+0x8>
	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 <lcd_checking_menu()>:
    }
}

static void lcd_checking_menu(void)
{
    MENU_BEGIN();
   1a9f0:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1a9f4:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1a9f8:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1a9fc:	84 30       	cpi	r24, 0x04	; 4
   1a9fe:	d8 f5       	brcc	.+118    	; 0x1aa76 <lcd_checking_menu()+0x86>
   1aa00:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1aa0c:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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 <lang_get_translation>
   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 <oCheckMode>
   1aa22:	0e 94 cb d1 	call	0x1a396	; 0x1a396 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]>
    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 <lang_get_translation>
   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 <oCheckModel>
   1aa38:	0e 94 cb d1 	call	0x1a396	; 0x1a396 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]>
    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 <oCheckVersion>
   1aa48:	0e 94 cb d1 	call	0x1a396	; 0x1a396 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]>
    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 <oCheckFilament>
   1aa58:	0e 94 cb d1 	call	0x1a396	; 0x1a396 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.3]>
    MENU_END();
   1aa5c:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
    }
}

static void lcd_checking_menu(void)
{
    MENU_BEGIN();
   1aa60:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1aa64:	8f 5f       	subi	r24, 0xFF	; 255
   1aa66:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1aa6a:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1aa6e:	8f 5f       	subi	r24, 0xFF	; 255
   1aa70:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1aa74:	c1 cf       	rjmp	.-126    	; 0x1a9f8 <lcd_checking_menu()+0x8>
    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 <lcd_reprint_from_eeprom()>:
        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 <restore_file_from_sd()>

    // 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 <enquecommand(char const*, bool)>
    lcd_return_to_status();
   1aa86:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

0001aa8a <menu_lcd_longpress_func()>:
{
	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 <Timer<unsigned long>::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 <homing_flag>
   1aa9a:	81 11       	cpse	r24, r1
   1aa9c:	18 c0       	rjmp	.+48     	; 0x1aace <menu_lcd_longpress_func()+0x44>
   1aa9e:	80 91 a7 0d 	lds	r24, 0x0DA7	; 0x800da7 <mesh_bed_leveling_flag>
   1aaa2:	81 11       	cpse	r24, r1
   1aaa4:	14 c0       	rjmp	.+40     	; 0x1aace <menu_lcd_longpress_func()+0x44>
   1aaa6:	c0 91 12 04 	lds	r28, 0x0412	; 0x800412 <menu_menu>
   1aaaa:	d0 91 13 04 	lds	r29, 0x0413	; 0x800413 <menu_menu+0x1>
   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 <menu_lcd_longpress_func()+0x44>
   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 <menu_lcd_longpress_func()+0x44>
   1aabe:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
   1aac2:	81 11       	cpse	r24, r1
   1aac4:	04 c0       	rjmp	.+8      	; 0x1aace <menu_lcd_longpress_func()+0x44>
   1aac6:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   1aaca:	88 23       	and	r24, r24
   1aacc:	31 f0       	breq	.+12     	; 0x1aada <menu_lcd_longpress_func()+0x50>
    {
        // 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 <lcd_draw_update>
            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 <menu_lcd_longpress_func()+0x6a>
    {
        // 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 <lcd_draw_update>
        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 <eeprom_toggle(unsigned char*)>
  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 <block_buffer_head>
   1aaf8:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
        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 <menu_lcd_longpress_func()+0x7e>
   1ab00:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
   1ab04:	88 23       	and	r24, r24
   1ab06:	61 f0       	breq	.+24     	; 0x1ab20 <menu_lcd_longpress_func()+0x96>
        if ( babystep_allowed_strict()
   1ab08:	0e 94 63 67 	call	0xcec6	; 0xcec6 <babystep_allowed_strict()>
        && (menu_menu == lcd_status_screen // and in listed menus...
   1ab0c:	81 11       	cpse	r24, r1
   1ab0e:	10 c0       	rjmp	.+32     	; 0x1ab30 <menu_lcd_longpress_func()+0xa6>
	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 <lcd_draw_update>
	}
    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 <Sound_MakeSound(eSOUND_TYPE)>
            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 <menu_lcd_longpress_func()+0xd6>
#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 <menu_lcd_longpress_func()+0xce>

    // 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_lcd_longpress_func()+0xc4>
          || 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_lcd_longpress_func()+0xc4>
          || 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_lcd_longpress_func()+0xc4>
          || 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 <menu_lcd_longpress_func()+0x86>
           )
        ){
            lcd_clear();
   1ab4e:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
            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 <menu_submenu(void (*)(), bool)>
        } 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_lcd_longpress_func()+0x9e>
        || 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_lcd_longpress_func()+0x9e>
        || 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_lcd_longpress_func()+0x9e>
        || 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_lcd_longpress_func()+0x9e>
        || 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 <menu_lcd_longpress_func()+0x9e>
#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 <menu_lcd_longpress_func()+0x9e>
#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 <menu_lcd_longpress_func()+0x10e>
   1ab96:	bc cf       	rjmp	.-136    	; 0x1ab10 <menu_lcd_longpress_func()+0x86>
   1ab98:	c7 cf       	rjmp	.-114    	; 0x1ab28 <menu_lcd_longpress_func()+0x9e>

0001ab9a <lcd_main_menu() [clone .lto_priv.451]>:
//! | 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 <menu_start()>
   1aba4:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
#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 <menu_row>
   1abb0:	84 30       	cpi	r24, 0x04	; 4
   1abb2:	08 f0       	brcs	.+2      	; 0x1abb6 <lcd_main_menu() [clone .lto_priv.451]+0x1c>
   1abb4:	02 c2       	rjmp	.+1028   	; 0x1afba <lcd_main_menu() [clone .lto_priv.451]+0x420>
   1abb6:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>

    // 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 <lang_get_translation>
   1abc2:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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 <printer_active()>
   1abca:	81 11       	cpse	r24, r1
   1abcc:	19 c0       	rjmp	.+50     	; 0x1ac00 <lcd_main_menu() [clone .lto_priv.451]+0x66>
   1abce:	0e 94 13 67 	call	0xce26	; 0xce26 <printer_recovering()>
   1abd2:	81 11       	cpse	r24, r1
   1abd4:	15 c0       	rjmp	.+42     	; 0x1ac00 <lcd_main_menu() [clone .lto_priv.451]+0x66>
   1abd6:	80 91 e1 03 	lds	r24, 0x03E1	; 0x8003e1 <heating_status>
   1abda:	81 11       	cpse	r24, r1
   1abdc:	11 c0       	rjmp	.+34     	; 0x1ac00 <lcd_main_menu() [clone .lto_priv.451]+0x66>
#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 <lcd_main_menu() [clone .lto_priv.451]+0x4e>
   1abe6:	51 c0       	rjmp	.+162    	; 0x1ac8a <lcd_main_menu() [clone .lto_priv.451]+0xf0>
   1abe8:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   1abec:	88 23       	and	r24, r24
   1abee:	41 f0       	breq	.+16     	; 0x1ac00 <lcd_main_menu() [clone .lto_priv.451]+0x66>
            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 <lang_get_translation>
   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_item_function_P(char const*, void (*)())>
        }
    }

    // Menu is never shown when idle
    if (babystep_allowed_strict() && (printJobOngoing() || lcd_commands_type == LcdCommands::Layer1Cal))
   1ac00:	0e 94 63 67 	call	0xcec6	; 0xcec6 <babystep_allowed_strict()>
   1ac04:	88 23       	and	r24, r24
   1ac06:	81 f0       	breq	.+32     	; 0x1ac28 <lcd_main_menu() [clone .lto_priv.451]+0x8e>
   1ac08:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
   1ac0c:	81 11       	cpse	r24, r1
   1ac0e:	04 c0       	rjmp	.+8      	; 0x1ac18 <lcd_main_menu() [clone .lto_priv.451]+0x7e>
   1ac10:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   1ac14:	84 30       	cpi	r24, 0x04	; 4
   1ac16:	41 f4       	brne	.+16     	; 0x1ac28 <lcd_main_menu() [clone .lto_priv.451]+0x8e>
        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 <lang_get_translation>
   1ac20:	6a e2       	ldi	r22, 0x2A	; 42
   1ac22:	79 e3       	ldi	r23, 0x39	; 57
   1ac24:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

    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 <printer_recovering()>
   1ac2c:	81 11       	cpse	r24, r1
   1ac2e:	61 c0       	rjmp	.+194    	; 0x1acf2 <lcd_main_menu() [clone .lto_priv.451]+0x158>
}

//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 <block_buffer_head>
   1ac34:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <lcd_main_menu() [clone .lto_priv.451]+0x10e>

    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 <printer_active()>
   1ac42:	81 11       	cpse	r24, r1
   1ac44:	31 c0       	rjmp	.+98     	; 0x1aca8 <lcd_main_menu() [clone .lto_priv.451]+0x10e>
#ifdef FANCHECK
         || fan_check_error == EFCE_REPORTED
   1ac46:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   1ac4a:	82 30       	cpi	r24, 0x02	; 2
   1ac4c:	69 f1       	breq	.+90     	; 0x1aca8 <lcd_main_menu() [clone .lto_priv.451]+0x10e>
#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 <Stopped>
   1ac52:	81 11       	cpse	r24, r1
   1ac54:	31 c0       	rjmp	.+98     	; 0x1acb8 <lcd_main_menu() [clone .lto_priv.451]+0x11e>
            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 <lang_get_translation>
   1ac5e:	68 e2       	ldi	r22, 0x28	; 40
   1ac60:	7a e3       	ldi	r23, 0x3A	; 58
   1ac62:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
            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 <lcd_main_menu() [clone .lto_priv.451]+0x11e>
                #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 <lcd_main_menu() [clone .lto_priv.451]+0xde>
   1ac76:	7e c0       	rjmp	.+252    	; 0x1ad74 <lcd_main_menu() [clone .lto_priv.451]+0x1da>
                    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 <lang_get_translation>
   1ac80:	65 ec       	ldi	r22, 0xC5	; 197
   1ac82:	7e ec       	ldi	r23, 0xCE	; 206
   1ac84:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
   1ac88:	17 c0       	rjmp	.+46     	; 0x1acb8 <lcd_main_menu() [clone .lto_priv.451]+0x11e>

    // 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 <lcd_main_menu() [clone .lto_priv.451]+0xf6>
   1ac8e:	b8 cf       	rjmp	.-144    	; 0x1ac00 <lcd_main_menu() [clone .lto_priv.451]+0x66>
   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 <lcd_main_menu() [clone .lto_priv.451]+0x100>
   1ac98:	b3 cf       	rjmp	.-154    	; 0x1ac00 <lcd_main_menu() [clone .lto_priv.451]+0x66>
            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 <lang_get_translation>
   1aca2:	6f eb       	ldi	r22, 0xBF	; 191
   1aca4:	7e ec       	ldi	r23, 0xCE	; 206
   1aca6:	aa cf       	rjmp	.-172    	; 0x1abfc <lcd_main_menu() [clone .lto_priv.451]+0x62>
        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 <lang_get_translation>
   1acb0:	66 e4       	ldi	r22, 0x46	; 70
   1acb2:	7a ed       	ldi	r23, 0xDA	; 218
   1acb4:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
                #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 <mesh_bed_leveling_flag>
   1acbc:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   1acc0:	c1 11       	cpse	r28, r1
   1acc2:	17 c0       	rjmp	.+46     	; 0x1acf2 <lcd_main_menu() [clone .lto_priv.451]+0x158>
   1acc4:	90 91 a6 0d 	lds	r25, 0x0DA6	; 0x800da6 <homing_flag>
   1acc8:	91 11       	cpse	r25, r1
   1acca:	13 c0       	rjmp	.+38     	; 0x1acf2 <lcd_main_menu() [clone .lto_priv.451]+0x158>
   1accc:	81 11       	cpse	r24, r1
   1acce:	15 c0       	rjmp	.+42     	; 0x1acfa <lcd_main_menu() [clone .lto_priv.451]+0x160>
   1acd0:	80 91 a1 03 	lds	r24, 0x03A1	; 0x8003a1 <processing_tcode>
   1acd4:	81 11       	cpse	r24, r1
   1acd6:	0d c0       	rjmp	.+26     	; 0x1acf2 <lcd_main_menu() [clone .lto_priv.451]+0x158>
            if (usb_timer.running()) {
   1acd8:	80 91 0d 05 	lds	r24, 0x050D	; 0x80050d <usb_timer>
   1acdc:	88 23       	and	r24, r24
   1acde:	09 f4       	brne	.+2      	; 0x1ace2 <lcd_main_menu() [clone .lto_priv.451]+0x148>
   1ace0:	4c c0       	rjmp	.+152    	; 0x1ad7a <lcd_main_menu() [clone .lto_priv.451]+0x1e0>
                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 <lang_get_translation>
   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 <menu_item_function_P(char const*, void (*)())>
            }
        }
    }
    if (printingIsPaused()
   1acf2:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
        && !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 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
    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 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
   1ad02:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   1ad06:	82 30       	cpi	r24, 0x02	; 2
   1ad08:	b1 f0       	breq	.+44     	; 0x1ad36 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
#endif //FANCHECK
        && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing)
   1ad0a:	80 91 6a 02 	lds	r24, 0x026A	; 0x80026a <saved_printing_type>
   1ad0e:	82 30       	cpi	r24, 0x02	; 2
   1ad10:	21 f4       	brne	.+8      	; 0x1ad1a <lcd_main_menu() [clone .lto_priv.451]+0x180>
   1ad12:	90 91 a8 0d 	lds	r25, 0x0DA8	; 0x800da8 <saved_printing>
   1ad16:	99 23       	and	r25, r25
   1ad18:	71 f0       	breq	.+28     	; 0x1ad36 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
        && custom_message_type != CustomMsg::Resuming) {
   1ad1a:	90 91 c3 06 	lds	r25, 0x06C3	; 0x8006c3 <custom_message_type>
   1ad1e:	98 30       	cpi	r25, 0x08	; 8
   1ad20:	51 f0       	breq	.+20     	; 0x1ad36 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
        if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) {
   1ad22:	81 11       	cpse	r24, r1
   1ad24:	36 c0       	rjmp	.+108    	; 0x1ad92 <lcd_main_menu() [clone .lto_priv.451]+0x1f8>
                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 <lang_get_translation>
   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 <menu_item_submenu_P(char const*, void (*)())>
        }
    }
    if((printJobOngoing() || printingIsPaused() || (printer_recovering()))
   1ad36:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
        && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) {
   1ad3a:	81 11       	cpse	r24, r1
   1ad3c:	08 c0       	rjmp	.+16     	; 0x1ad4e <lcd_main_menu() [clone .lto_priv.451]+0x1b4>
                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 <printingIsPaused()>
   1ad42:	81 11       	cpse	r24, r1
   1ad44:	04 c0       	rjmp	.+8      	; 0x1ad4e <lcd_main_menu() [clone .lto_priv.451]+0x1b4>
   1ad46:	0e 94 13 67 	call	0xce26	; 0xce26 <printer_recovering()>
   1ad4a:	88 23       	and	r24, r24
   1ad4c:	41 f0       	breq	.+16     	; 0x1ad5e <lcd_main_menu() [clone .lto_priv.451]+0x1c4>
        && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) {
   1ad4e:	80 91 c3 06 	lds	r24, 0x06C3	; 0x8006c3 <custom_message_type>
   1ad52:	81 30       	cpi	r24, 0x01	; 1
   1ad54:	21 f0       	breq	.+8      	; 0x1ad5e <lcd_main_menu() [clone .lto_priv.451]+0x1c4>
   1ad56:	80 91 a1 03 	lds	r24, 0x03A1	; 0x8003a1 <processing_tcode>
   1ad5a:	88 23       	and	r24, r24
   1ad5c:	39 f1       	breq	.+78     	; 0x1adac <lcd_main_menu() [clone .lto_priv.451]+0x212>
        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 <Stopped>
   1ad62:	88 23       	and	r24, r24
   1ad64:	59 f1       	breq	.+86     	; 0x1adbc <lcd_main_menu() [clone .lto_priv.451]+0x222>
        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 <lang_get_translation>
   1ad6e:	66 ea       	ldi	r22, 0xA6	; 166
   1ad70:	75 ef       	ldi	r23, 0xF5	; 245
   1ad72:	22 c0       	rjmp	.+68     	; 0x1adb8 <lcd_main_menu() [clone .lto_priv.451]+0x21e>
            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 <lcd_main_menu() [clone .lto_priv.451]+0xe2>
            }
        }
        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 <card+0x2>
   1ad7e:	88 23       	and	r24, r24
   1ad80:	09 f4       	brne	.+2      	; 0x1ad84 <lcd_main_menu() [clone .lto_priv.451]+0x1ea>
   1ad82:	b7 cf       	rjmp	.-146    	; 0x1acf2 <lcd_main_menu() [clone .lto_priv.451]+0x158>
                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 <lang_get_translation>
   1ad8c:	6a ee       	ldi	r22, 0xEA	; 234
   1ad8e:	7a e3       	ldi	r23, 0x3A	; 58
   1ad90:	ae cf       	rjmp	.-164    	; 0x1acee <lcd_main_menu() [clone .lto_priv.451]+0x154>
#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 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
   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 <lcd_main_menu() [clone .lto_priv.451]+0x19c>
                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 <lang_get_translation>
   1ada6:	6f ef       	ldi	r22, 0xFF	; 255
   1ada8:	78 ef       	ldi	r23, 0xF8	; 248
   1adaa:	c3 cf       	rjmp	.-122    	; 0x1ad32 <lcd_main_menu() [clone .lto_priv.451]+0x198>
        }
    }
    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 <lang_get_translation>
   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 <menu_item_submenu_P(char const*, void (*)())>
    }
#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 <printer_recovering()>
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
   1adc0:	81 11       	cpse	r24, r1
   1adc2:	91 c0       	rjmp	.+290    	; 0x1aee6 <lcd_main_menu() [clone .lto_priv.451]+0x34c>
        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 <printer_active()>
   1adc8:	81 11       	cpse	r24, r1
   1adca:	8d c0       	rjmp	.+282    	; 0x1aee6 <lcd_main_menu() [clone .lto_priv.451]+0x34c>
   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 <lcd_main_menu() [clone .lto_priv.451]+0x34c>
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
   1add4:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   1add8:	82 30       	cpi	r24, 0x02	; 2
   1adda:	09 f4       	brne	.+2      	; 0x1adde <lcd_main_menu() [clone .lto_priv.451]+0x244>
   1addc:	84 c0       	rjmp	.+264    	; 0x1aee6 <lcd_main_menu() [clone .lto_priv.451]+0x34c>
#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 <card+0x3>
   1ade2:	81 11       	cpse	r24, r1
   1ade4:	05 c0       	rjmp	.+10     	; 0x1adf0 <lcd_main_menu() [clone .lto_priv.451]+0x256>
                || lcd_commands_type != LcdCommands::Idle) {
   1ade6:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   1adea:	88 23       	and	r24, r24
   1adec:	09 f4       	brne	.+2      	; 0x1adf0 <lcd_main_menu() [clone .lto_priv.451]+0x256>
   1adee:	ac c0       	rjmp	.+344    	; 0x1af48 <lcd_main_menu() [clone .lto_priv.451]+0x3ae>
                if (!card.isFileOpen()) {
   1adf0:	80 91 22 17 	lds	r24, 0x1722	; 0x801722 <card+0x295>
   1adf4:	81 11       	cpse	r24, r1
   1adf6:	12 c0       	rjmp	.+36     	; 0x1ae1c <lcd_main_menu() [clone .lto_priv.451]+0x282>
                    if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) {
   1adf8:	80 91 0d 05 	lds	r24, 0x050D	; 0x80050d <usb_timer>
   1adfc:	81 11       	cpse	r24, r1
   1adfe:	0e c0       	rjmp	.+28     	; 0x1ae1c <lcd_main_menu() [clone .lto_priv.451]+0x282>
   1ae00:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   1ae04:	81 11       	cpse	r24, r1
   1ae06:	0a c0       	rjmp	.+20     	; 0x1ae1c <lcd_main_menu() [clone .lto_priv.451]+0x282>
                        bMain=true;               // flag ('fake parameter') for 'lcd_sdcard_menu()' function
   1ae08:	d0 93 df 03 	sts	0x03DF, r29	; 0x8003df <bMain>
                        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 <lang_get_translation>
   1ae14:	67 e2       	ldi	r22, 0x27	; 39
   1ae16:	72 ef       	ldi	r23, 0xF2	; 242
   1ae18:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
            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 <eeprom_read_byte>
   1ae24:	c8 2f       	mov	r28, r24
            const int8_t nextSheet = eeprom_next_initialized_sheet(sheet);
   1ae26:	0e 94 e7 75 	call	0xebce	; 0xebce <eeprom_next_initialized_sheet(signed char)>
            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 <lcd_main_menu() [clone .lto_priv.451]+0x2a6>
   1ae2e:	c8 17       	cp	r28, r24
   1ae30:	39 f0       	breq	.+14     	; 0x1ae40 <lcd_main_menu() [clone .lto_priv.451]+0x2a6>
                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 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.17]>
            SETTINGS_NOZZLE;
#endif //QUICK_NOZZLE_CHANGE

        }

        if (!((eFilamentAction != FilamentAction::None) || Stopped )) {
   1ae40:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   1ae44:	81 11       	cpse	r24, r1
   1ae46:	4f c0       	rjmp	.+158    	; 0x1aee6 <lcd_main_menu() [clone .lto_priv.451]+0x34c>
   1ae48:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   1ae4c:	81 11       	cpse	r24, r1
   1ae4e:	4b c0       	rjmp	.+150    	; 0x1aee6 <lcd_main_menu() [clone .lto_priv.451]+0x34c>
            if (MMU2::mmu2.Enabled()) {
   1ae50:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1ae54:	81 30       	cpi	r24, 0x01	; 1
   1ae56:	09 f0       	breq	.+2      	; 0x1ae5a <lcd_main_menu() [clone .lto_priv.451]+0x2c0>
   1ae58:	80 c0       	rjmp	.+256    	; 0x1af5a <lcd_main_menu() [clone .lto_priv.451]+0x3c0>
                if(!MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) {
   1ae5a:	80 91 8f 13 	lds	r24, 0x138F	; 0x80138f <MMU2::mmu2+0x45>
   1ae5e:	81 11       	cpse	r24, r1
   1ae60:	0c c0       	rjmp	.+24     	; 0x1ae7a <lcd_main_menu() [clone .lto_priv.451]+0x2e0>
   1ae62:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   1ae66:	81 11       	cpse	r24, r1
   1ae68:	08 c0       	rjmp	.+16     	; 0x1ae7a <lcd_main_menu() [clone .lto_priv.451]+0x2e0>
                    // 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 <lang_get_translation>
   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(char const*, void (*)())>
            }
                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 <lang_get_translation>
   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(char const*, void (*)())>
                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 <lang_get_translation>
   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(char const*, void (*)())>
                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 <lang_get_translation>
   1aea2:	62 e8       	ldi	r22, 0x82	; 130
   1aea4:	71 ee       	ldi	r23, 0xE1	; 225
   1aea6:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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 <eeprom_read_byte>
   1aeb2:	88 23       	and	r24, r24
   1aeb4:	41 f0       	breq	.+16     	; 0x1aec6 <lcd_main_menu() [clone .lto_priv.451]+0x32c>
                    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 <lang_get_translation>
   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 <menu_item_submenu_P(char const*, void (*)())>
#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 <lang_get_translation>
   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(char const*, void (*)())>
            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 <lang_get_translation>
   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(char const*, void (*)())>
        }
    }

        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 <lang_get_translation>
   1aeee:	64 e4       	ldi	r22, 0x44	; 68
   1aef0:	7a e3       	ldi	r23, 0x3A	; 58
   1aef2:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

#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 <lang_get_translation>
   1aefe:	62 ea       	ldi	r22, 0xA2	; 162
   1af00:	7a e3       	ldi	r23, 0x3A	; 58
   1af02:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#endif
    if (MMU2::mmu2.Enabled()) {
   1af06:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1af0a:	81 30       	cpi	r24, 0x01	; 1
   1af0c:	41 f4       	brne	.+16     	; 0x1af1e <lcd_main_menu() [clone .lto_priv.451]+0x384>
        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 <lang_get_translation>
   1af16:	6a e5       	ldi	r22, 0x5A	; 90
   1af18:	79 e3       	ldi	r23, 0x39	; 57
   1af1a:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    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 <lang_get_translation>
   1af26:	6e ec       	ldi	r22, 0xCE	; 206
   1af28:	7a e3       	ldi	r23, 0x3A	; 58
   1af2a:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

    MENU_END();
   1af2e:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
//! | Support            | allways
//! @endcode
static void lcd_main_menu()
{

    MENU_BEGIN();
   1af32:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1af36:	8f 5f       	subi	r24, 0xFF	; 255
   1af38:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1af3c:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1af40:	8f 5f       	subi	r24, 0xFF	; 255
   1af42:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1af46:	32 ce       	rjmp	.-924    	; 0x1abac <lcd_main_menu() [clone .lto_priv.451]+0x12>
#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 <bMain>
                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 <lang_get_translation>
   1af54:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
   1af58:	61 cf       	rjmp	.-318    	; 0x1ae1c <lcd_main_menu() [clone .lto_priv.451]+0x282>
                    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 <fsensor>
   1af5e:	88 23       	and	r24, r24
   1af60:	19 f1       	breq	.+70     	; 0x1afa8 <lcd_main_menu() [clone .lto_priv.451]+0x40e>
                    if (!fsensor.getAutoLoadEnabled()) {
   1af62:	80 91 aa 17 	lds	r24, 0x17AA	; 0x8017aa <fsensor+0x1>
   1af66:	81 11       	cpse	r24, r1
   1af68:	08 c0       	rjmp	.+16     	; 0x1af7a <lcd_main_menu() [clone .lto_priv.451]+0x3e0>
                        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 <lang_get_translation>
   1af72:	64 ec       	ldi	r22, 0xC4	; 196
   1af74:	7a e3       	ldi	r23, 0x3A	; 58
   1af76:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
                    }
                    if (fsensor.getFilamentPresent()) {
   1af7a:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   1af7e:	88 23       	and	r24, r24
   1af80:	39 f0       	breq	.+14     	; 0x1af90 <lcd_main_menu() [clone .lto_priv.451]+0x3f6>
                    }
#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 <lang_get_translation>
   1af8a:	6e e2       	ldi	r22, 0x2E	; 46
   1af8c:	7a e3       	ldi	r23, 0x3A	; 58
   1af8e:	99 cf       	rjmp	.-206    	; 0x1aec2 <lcd_main_menu() [clone .lto_priv.451]+0x328>
                    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 <fsensor+0x1>
   1af94:	88 23       	and	r24, r24
   1af96:	09 f4       	brne	.+2      	; 0x1af9a <lcd_main_menu() [clone .lto_priv.451]+0x400>
   1af98:	96 cf       	rjmp	.-212    	; 0x1aec6 <lcd_main_menu() [clone .lto_priv.451]+0x32c>
                            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 <lang_get_translation>
   1afa2:	6c ed       	ldi	r22, 0xDC	; 220
   1afa4:	79 e3       	ldi	r23, 0x39	; 57
   1afa6:	8d cf       	rjmp	.-230    	; 0x1aec2 <lcd_main_menu() [clone .lto_priv.451]+0x328>
                        }                        
                    }
#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 <lang_get_translation>
   1afb0:	64 ec       	ldi	r22, 0xC4	; 196
   1afb2:	7a e3       	ldi	r23, 0x3A	; 58
   1afb4:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
   1afb8:	e4 cf       	rjmp	.-56     	; 0x1af82 <lcd_main_menu() [clone .lto_priv.451]+0x3e8>
#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 <lcd_settings_menu()>:

    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 <eeprom_read_byte>
   1afd0:	80 93 a2 03 	sts	0x03A2, r24	; 0x8003a2 <SilentModeMenu>
	MENU_BEGIN();
   1afd4:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1afd8:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
    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 <menu_row>
   1afe2:	84 30       	cpi	r24, 0x04	; 4
   1afe4:	08 f0       	brcs	.+2      	; 0x1afe8 <lcd_settings_menu()+0x26>
   1afe6:	5c c1       	rjmp	.+696    	; 0x1b2a0 <lcd_settings_menu()+0x2de>
   1afe8:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	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 <lang_get_translation>
   1aff4:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>

	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 <lang_get_translation>
   1b000:	66 e2       	ldi	r22, 0x26	; 38
   1b002:	7a ed       	ldi	r23, 0xDA	; 218
   1b004:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

	if (!printer_active() || printingIsPaused())
   1b008:	0e 94 79 67 	call	0xcef2	; 0xcef2 <printer_active()>
   1b00c:	88 23       	and	r24, r24
   1b00e:	21 f0       	breq	.+8      	; 0x1b018 <lcd_settings_menu()+0x56>
   1b010:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   1b014:	88 23       	and	r24, r24
   1b016:	81 f0       	breq	.+32     	; 0x1b038 <lcd_settings_menu()+0x76>
    {
	    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 <lang_get_translation>
   1b020:	6a eb       	ldi	r22, 0xBA	; 186
   1b022:	74 ed       	ldi	r23, 0xD4	; 212
   1b024:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
	    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 <lang_get_translation>
   1b030:	6c ed       	ldi	r22, 0xDC	; 220
   1b032:	7a e6       	ldi	r23, 0x6A	; 106
   1b034:	0f 94 80 d0 	call	0x3a100	; 0x3a100 <menu_item_gcode_P(char const*, char const*)>
    }

#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 <lang_get_translation>
   1b040:	6f e7       	ldi	r22, 0x7F	; 127
   1b042:	73 ed       	ldi	r23, 0xD3	; 211
   1b044:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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 <eeprom_read_byte>
   1b050:	88 23       	and	r24, r24
   1b052:	09 f4       	brne	.+2      	; 0x1b056 <lcd_settings_menu()+0x94>
   1b054:	ac c0       	rjmp	.+344    	; 0x1b1ae <lcd_settings_menu()+0x1ec>
   1b056:	81 e5       	ldi	r24, 0x51	; 81
   1b058:	9c e5       	ldi	r25, 0x5C	; 92
   1b05a:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    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 <eeprom_read_byte>
   1b076:	88 23       	and	r24, r24
   1b078:	31 f0       	breq	.+12     	; 0x1b086 <lcd_settings_menu()+0xc4>
    { // 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 <menu_item_function_P(char const*, void (*)())>
    }

    if (MMU2::mmu2.Enabled())
   1b086:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1b08a:	81 30       	cpi	r24, 0x01	; 1
   1b08c:	51 f4       	brne	.+20     	; 0x1b0a2 <lcd_settings_menu()+0xe0>
    { // Only show menus when communicating with MMU
        menuitems_MMU_settings_common();
   1b08e:	0e 94 67 d2 	call	0x1a4ce	; 0x1a4ce <menuitems_MMU_settings_common()>
        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 <lang_get_translation>
   1b09a:	68 e8       	ldi	r22, 0x88	; 136
   1b09c:	71 ee       	ldi	r23, 0xE1	; 225
   1b09e:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    }

    SETTINGS_FANS_CHECK();
   1b0a2:	0e 94 e9 d1 	call	0x1a3d2	; 0x1a3d2 <SETTINGS_FANS_CHECK()>
    SETTINGS_SILENT_MODE();
   1b0a6:	0e 94 03 d2 	call	0x1a406	; 0x1a406 <SETTINGS_SILENT_MODE()>

    if(!farm_mode)
    {
        bSettings=true;                              // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
   1b0aa:	10 93 fb 03 	sts	0x03FB, r17	; 0x8003fb <bSettings>
        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 <lang_get_translation>
   1b0b6:	60 eb       	ldi	r22, 0xB0	; 176
   1b0b8:	72 ed       	ldi	r23, 0xD2	; 210
   1b0ba:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    } 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 <lang_get_translation>
   1b0c6:	60 e3       	ldi	r22, 0x30	; 48
   1b0c8:	7a e3       	ldi	r23, 0x3A	; 58
   1b0ca:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

#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 <lang_get_translation>
   1b0d6:	67 e2       	ldi	r22, 0x27	; 39
   1b0d8:	71 ef       	ldi	r23, 0xF1	; 241
   1b0da:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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 <current_temperature_pinda>
   1b0ea:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   1b0ee:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   1b0f2:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   1b0f6:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   1b0fa:	87 fd       	sbrc	r24, 7
   1b0fc:	16 c0       	rjmp	.+44     	; 0x1b12a <lcd_settings_menu()+0x168>
        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 <eeprom_read_byte>
   1b106:	88 23       	and	r24, r24
   1b108:	09 f4       	brne	.+2      	; 0x1b10c <lcd_settings_menu()+0x14a>
   1b10a:	54 c0       	rjmp	.+168    	; 0x1b1b4 <lcd_settings_menu()+0x1f2>
   1b10c:	81 e5       	ldi	r24, 0x51	; 81
   1b10e:	9c e5       	ldi	r25, 0x5C	; 92
   1b110:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#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 <selectedSerialPort>
   1b12e:	81 11       	cpse	r24, r1
   1b130:	44 c0       	rjmp	.+136    	; 0x1b1ba <lcd_settings_menu()+0x1f8>
   1b132:	8b e4       	ldi	r24, 0x4B	; 75
   1b134:	9c e5       	ldi	r25, 0x5C	; 92
   1b136:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#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 <printingIsPaused()>
   1b154:	81 11       	cpse	r24, r1
   1b156:	08 c0       	rjmp	.+16     	; 0x1b168 <lcd_settings_menu()+0x1a6>
   1b158:	8e ee       	ldi	r24, 0xEE	; 238
   1b15a:	96 e4       	ldi	r25, 0x46	; 70
   1b15c:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   1b160:	6a e2       	ldi	r22, 0x2A	; 42
   1b162:	79 e3       	ldi	r23, 0x39	; 57
   1b164:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

#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 <lang_get_translation>
   1b170:	6a e8       	ldi	r22, 0x8A	; 138
   1b172:	73 ee       	ldi	r23, 0xE3	; 227
   1b174:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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 <card+0x273>
   1b17c:	88 23       	and	r24, r24
   1b17e:	01 f1       	breq	.+64     	; 0x1b1c0 <lcd_settings_menu()+0x1fe>
            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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#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 <eeprom_read_byte>
   1b19e:	88 23       	and	r24, r24
   1b1a0:	e9 f0       	breq	.+58     	; 0x1b1dc <lcd_settings_menu()+0x21a>
   1b1a2:	81 30       	cpi	r24, 0x01	; 1
   1b1a4:	09 f4       	brne	.+2      	; 0x1b1a8 <lcd_settings_menu()+0x1e6>
   1b1a6:	6d c0       	rjmp	.+218    	; 0x1b282 <lcd_settings_menu()+0x2c0>
            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 <lcd_settings_menu()+0x21e>

#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 <lcd_settings_menu()+0x98>
#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 <lcd_settings_menu()+0x14e>
#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 <lcd_settings_menu()+0x174>

    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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_settings_menu()+0x1d0>
#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 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
        }
    }
#endif //SDCARD_SORT_ALPHA

	SETTINGS_SOUND;
   1b1fa:	80 91 dd 04 	lds	r24, 0x04DD	; 0x8004dd <eSoundMode>
   1b1fe:	82 30       	cpi	r24, 0x02	; 2
   1b200:	09 f4       	brne	.+2      	; 0x1b204 <lcd_settings_menu()+0x242>
   1b202:	45 c0       	rjmp	.+138    	; 0x1b28e <lcd_settings_menu()+0x2cc>
   1b204:	83 30       	cpi	r24, 0x03	; 3
   1b206:	09 f4       	brne	.+2      	; 0x1b20a <lcd_settings_menu()+0x248>
   1b208:	45 c0       	rjmp	.+138    	; 0x1b294 <lcd_settings_menu()+0x2d2>
   1b20a:	81 30       	cpi	r24, 0x01	; 1
   1b20c:	e9 f1       	breq	.+122    	; 0x1b288 <lcd_settings_menu()+0x2c6>
   1b20e:	84 e4       	ldi	r24, 0x44	; 68
   1b210:	97 e4       	ldi	r25, 0x47	; 71
   1b212:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>

#ifdef LCD_BL_PIN
    if (backlightSupport)
   1b22c:	80 91 01 04 	lds	r24, 0x0401	; 0x800401 <backlightSupport>
   1b230:	88 23       	and	r24, r24
   1b232:	41 f0       	breq	.+16     	; 0x1b244 <lcd_settings_menu()+0x282>
    {
        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 <lang_get_translation>
   1b23c:	6c eb       	ldi	r22, 0xBC	; 188
   1b23e:	70 ee       	ldi	r23, 0xE0	; 224
   1b240:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    }
#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 <eeprom_read_byte>
   1b24c:	88 23       	and	r24, r24
   1b24e:	29 f1       	breq	.+74     	; 0x1b29a <lcd_settings_menu()+0x2d8>
   1b250:	85 ef       	ldi	r24, 0xF5	; 245
   1b252:	97 e4       	ldi	r25, 0x47	; 71
   1b254:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
	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 <menu_end()>
}

static void lcd_settings_menu()
{
	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);
	MENU_BEGIN();
   1b26c:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b270:	8f 5f       	subi	r24, 0xFF	; 255
   1b272:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1b276:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1b27a:	8f 5f       	subi	r24, 0xFF	; 255
   1b27c:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1b280:	ae ce       	rjmp	.-676    	; 0x1afde <lcd_settings_menu()+0x1c>
        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 <lcd_settings_menu()+0x21e>
            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 <lcd_settings_menu()+0x250>
   1b28e:	8c e2       	ldi	r24, 0x2C	; 44
   1b290:	97 e4       	ldi	r25, 0x47	; 71
   1b292:	bf cf       	rjmp	.-130    	; 0x1b212 <lcd_settings_menu()+0x250>
   1b294:	83 e2       	ldi	r24, 0x23	; 35
   1b296:	97 e4       	ldi	r25, 0x47	; 71
   1b298:	bc cf       	rjmp	.-136    	; 0x1b212 <lcd_settings_menu()+0x250>
        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 <lcd_settings_menu()+0x292>
	{
		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 <lcd_calibration_menu()>:
}
#endif //TMC2130

static void lcd_calibration_menu()
{
    MENU_BEGIN();
   1b2a8:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1b2ac:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1b2b0:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b2b4:	84 30       	cpi	r24, 0x04	; 4
   1b2b6:	08 f0       	brcs	.+2      	; 0x1b2ba <lcd_calibration_menu()+0x12>
   1b2b8:	8f c0       	rjmp	.+286    	; 0x1b3d8 <lcd_calibration_menu()+0x130>
   1b2ba:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1b2c6:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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 <lang_get_translation>
   1b2d2:	6e eb       	ldi	r22, 0xBE	; 190
   1b2d4:	7a e3       	ldi	r23, 0x3A	; 58
   1b2d6:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    if (lcd_commands_type == LcdCommands::Idle)
   1b2da:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   1b2de:	81 11       	cpse	r24, r1
   1b2e0:	08 c0       	rjmp	.+16     	; 0x1b2f2 <lcd_calibration_menu()+0x4a>
    {
        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 <lang_get_translation>
   1b2ea:	65 e6       	ldi	r22, 0x65	; 101
   1b2ec:	7f ee       	ldi	r23, 0xEF	; 239
   1b2ee:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    }
    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 <lang_get_translation>
   1b2fa:	6a e7       	ldi	r22, 0x7A	; 122
   1b2fc:	7b e6       	ldi	r23, 0x6B	; 107
   1b2fe:	0f 94 80 d0 	call	0x3a100	; 0x3a100 <menu_item_gcode_P(char const*, char const*)>
#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 <lang_get_translation>
   1b30a:	63 e0       	ldi	r22, 0x03	; 3
   1b30c:	70 ee       	ldi	r23, 0xE0	; 224
   1b30e:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
#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 <lang_get_translation>
   1b31a:	68 e8       	ldi	r22, 0x88	; 136
   1b31c:	78 ef       	ldi	r23, 0xF8	; 248
   1b31e:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    // 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 <lang_get_translation>
   1b32a:	64 e8       	ldi	r22, 0x84	; 132
   1b32c:	7f ec       	ldi	r23, 0xCF	; 207
   1b32e:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    // "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 <lang_get_translation>
   1b33a:	6b e8       	ldi	r22, 0x8B	; 139
   1b33c:	7f ec       	ldi	r23, 0xCF	; 207
   1b33e:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>

    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 <lang_get_translation>
   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(char const*, void (*)())>

    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 <lang_get_translation>
   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(char const*, void (*)())>
    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 <lang_get_translation>
   1b36a:	66 e1       	ldi	r22, 0x16	; 22
   1b36c:	7a e3       	ldi	r23, 0x3A	; 58
   1b36e:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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 <lang_get_translation>
   1b37a:	6e e8       	ldi	r22, 0x8E	; 142
   1b37c:	79 e8       	ldi	r23, 0x89	; 137
   1b37e:	0f 94 80 d0 	call	0x3a100	; 0x3a100 <menu_item_gcode_P(char const*, char const*)>
#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 <current_temperature_pinda>
   1b38e:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   1b392:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   1b396:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   1b39a:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   1b39e:	87 fd       	sbrc	r24, 7
   1b3a0:	08 c0       	rjmp	.+16     	; 0x1b3b2 <lcd_calibration_menu()+0x10a>
        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 <lang_get_translation>
   1b3aa:	69 e9       	ldi	r22, 0x99	; 153
   1b3ac:	7f ec       	ldi	r23, 0xCF	; 207
   1b3ae:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
#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 <menu_item_function_P(char const*, void (*)())>
#endif //THERMAL_MODEL

    MENU_END();
   1b3be:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
}
#endif //TMC2130

static void lcd_calibration_menu()
{
    MENU_BEGIN();
   1b3c2:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b3c6:	8f 5f       	subi	r24, 0xFF	; 255
   1b3c8:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1b3cc:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1b3d0:	8f 5f       	subi	r24, 0xFF	; 255
   1b3d2:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1b3d6:	6c cf       	rjmp	.-296    	; 0x1b2b0 <lcd_calibration_menu()+0x8>
#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 <menuitems_temperature_common()>:
        }
#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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
}
   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 <lcd_control_temperature_menu()>:
}
#endif //LCD_BL_PIN

static void lcd_control_temperature_menu()
{
  MENU_BEGIN();
   1b44c:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1b450:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1b454:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b458:	84 30       	cpi	r24, 0x04	; 4
   1b45a:	b8 f4       	brcc	.+46     	; 0x1b48a <lcd_control_temperature_menu()+0x3e>
   1b45c:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
  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 <lang_get_translation>
   1b468:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>

  menuitems_temperature_common();
   1b46c:	0e 94 ed d9 	call	0x1b3da	; 0x1b3da <menuitems_temperature_common()>

  MENU_END();
   1b470:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
}
#endif //LCD_BL_PIN

static void lcd_control_temperature_menu()
{
  MENU_BEGIN();
   1b474:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b478:	8f 5f       	subi	r24, 0xFF	; 255
   1b47a:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1b47e:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1b482:	8f 5f       	subi	r24, 0xFF	; 255
   1b484:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1b488:	e5 cf       	rjmp	.-54     	; 0x1b454 <lcd_control_temperature_menu()+0x8>
  MENU_ITEM_BACK_P(_T(MSG_SETTINGS));

  menuitems_temperature_common();

  MENU_END();
}
   1b48a:	08 95       	ret

0001b48c <lcd_tune_menu()>:
#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 <extrudemultiply>
   1b49c:	90 91 bd 02 	lds	r25, 0x02BD	; 0x8002bd <extrudemultiply+0x1>
		//! 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 <menu_data+0xd>
   1b4a4:	21 11       	cpse	r18, r1
   1b4a6:	97 c0       	rjmp	.+302    	; 0x1b5d6 <lcd_tune_menu()+0x14a>
	{
		// 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 <menu_data+0xd>
		_md->extrudemultiply = extrudemultiply;
   1b4ae:	90 93 b6 03 	sts	0x03B6, r25	; 0x8003b6 <menu_data+0xf>
   1b4b2:	80 93 b5 03 	sts	0x03B5, r24	; 0x8003b5 <menu_data+0xe>
		// 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 <eeprom_read_byte>
   1b4be:	80 93 a2 03 	sts	0x03A2, r24	; 0x8003a2 <SilentModeMenu>

	MENU_BEGIN();
   1b4c2:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1b4c6:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1b4ca:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b4ce:	84 30       	cpi	r24, 0x04	; 4
   1b4d0:	08 f0       	brcs	.+2      	; 0x1b4d4 <lcd_tune_menu()+0x48>
   1b4d2:	99 c0       	rjmp	.+306    	; 0x1b606 <lcd_tune_menu()+0x17a>
   1b4d4:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	ON_MENU_LEAVE(
   1b4d8:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   1b4dc:	81 11       	cpse	r24, r1
   1b4de:	0e 94 7b 64 	call	0xc8f6	; 0xc8f6 <refresh_saved_feedrate_multiplier_in_ram()>
		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 <lang_get_translation>
   1b4ea:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>

	menuitems_temperature_common();
   1b50c:	0e 94 ed d9 	call	0x1b3da	; 0x1b3da <menuitems_temperature_common()>

	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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#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 <lang_get_translation>
   1b52e:	6e e2       	ldi	r22, 0x2E	; 46
   1b530:	75 ef       	ldi	r23, 0xF5	; 245
   1b532:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
#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 <printingIsPaused()>
   1b53a:	88 23       	and	r24, r24
   1b53c:	41 f0       	breq	.+16     	; 0x1b54e <lcd_tune_menu()+0xc2>
        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 <lang_get_translation>
   1b546:	62 e9       	ldi	r22, 0x92	; 146
   1b548:	79 e8       	ldi	r23, 0x89	; 137
   1b54a:	0f 94 80 d0 	call	0x3a100	; 0x3a100 <menu_item_gcode_P(char const*, char const*)>
    }
#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 <lang_get_translation>
   1b556:	6f e7       	ldi	r22, 0x7F	; 127
   1b558:	73 ed       	ldi	r23, 0xD3	; 211
   1b55a:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#endif //FILAMENT_SENSOR

    if (MMU2::mmu2.Enabled())
   1b55e:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1b562:	81 30       	cpi	r24, 0x01	; 1
   1b564:	11 f4       	brne	.+4      	; 0x1b56a <lcd_tune_menu()+0xde>
    {
        menuitems_MMU_settings_common();
   1b566:	0e 94 67 d2 	call	0x1a4ce	; 0x1a4ce <menuitems_MMU_settings_common()>
    }

    SETTINGS_FANS_CHECK();
   1b56a:	0e 94 e9 d1 	call	0x1a3d2	; 0x1a3d2 <SETTINGS_FANS_CHECK()>
    SETTINGS_SILENT_MODE();
   1b56e:	0e 94 03 d2 	call	0x1a406	; 0x1a406 <SETTINGS_SILENT_MODE()>
    SETTINGS_SOUND;
   1b572:	80 91 dd 04 	lds	r24, 0x04DD	; 0x8004dd <eSoundMode>
   1b576:	82 30       	cpi	r24, 0x02	; 2
   1b578:	09 f4       	brne	.+2      	; 0x1b57c <lcd_tune_menu()+0xf0>
   1b57a:	3f c0       	rjmp	.+126    	; 0x1b5fa <lcd_tune_menu()+0x16e>
   1b57c:	83 30       	cpi	r24, 0x03	; 3
   1b57e:	09 f4       	brne	.+2      	; 0x1b582 <lcd_tune_menu()+0xf6>
   1b580:	3f c0       	rjmp	.+126    	; 0x1b600 <lcd_tune_menu()+0x174>
   1b582:	81 30       	cpi	r24, 0x01	; 1
   1b584:	b9 f1       	breq	.+110    	; 0x1b5f4 <lcd_tune_menu()+0x168>
   1b586:	84 e4       	ldi	r24, 0x44	; 68
   1b588:	97 e4       	ldi	r25, 0x47	; 71
   1b58a:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#ifdef LCD_BL_PIN
    if (backlightSupport)
   1b5a4:	80 91 01 04 	lds	r24, 0x0401	; 0x800401 <backlightSupport>
   1b5a8:	88 23       	and	r24, r24
   1b5aa:	41 f0       	breq	.+16     	; 0x1b5bc <lcd_tune_menu()+0x130>
    {
        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 <lang_get_translation>
   1b5b4:	6c eb       	ldi	r22, 0xBC	; 188
   1b5b6:	70 ee       	ldi	r23, 0xE0	; 224
   1b5b8:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
    }
#endif //LCD_BL_PIN
	MENU_END();
   1b5bc:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
		calculate_extruder_multipliers();
	}

	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);

	MENU_BEGIN();
   1b5c0:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1b5c4:	8f 5f       	subi	r24, 0xFF	; 255
   1b5c6:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1b5ca:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1b5ce:	8f 5f       	subi	r24, 0xFF	; 255
   1b5d0:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1b5d4:	7a cf       	rjmp	.-268    	; 0x1b4ca <lcd_tune_menu()+0x3e>
	{
		// 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 <menu_data+0xe>
   1b5da:	30 91 b6 03 	lds	r19, 0x03B6	; 0x8003b6 <menu_data+0xf>
   1b5de:	28 17       	cp	r18, r24
   1b5e0:	39 07       	cpc	r19, r25
   1b5e2:	09 f4       	brne	.+2      	; 0x1b5e6 <lcd_tune_menu()+0x15a>
   1b5e4:	68 cf       	rjmp	.-304    	; 0x1b4b6 <lcd_tune_menu()+0x2a>
	{
		// extrudemultiply has been changed from the child menu. Apply the new value.
		_md->extrudemultiply = extrudemultiply;
   1b5e6:	90 93 b6 03 	sts	0x03B6, r25	; 0x8003b6 <menu_data+0xf>
   1b5ea:	80 93 b5 03 	sts	0x03B5, r24	; 0x8003b5 <menu_data+0xe>
		calculate_extruder_multipliers();
   1b5ee:	0e 94 51 65 	call	0xcaa2	; 0xcaa2 <calculate_extruder_multipliers()>
   1b5f2:	61 cf       	rjmp	.-318    	; 0x1b4b6 <lcd_tune_menu()+0x2a>
        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 <lcd_tune_menu()+0xfe>
   1b5fa:	8c e2       	ldi	r24, 0x2C	; 44
   1b5fc:	97 e4       	ldi	r25, 0x47	; 71
   1b5fe:	c5 cf       	rjmp	.-118    	; 0x1b58a <lcd_tune_menu()+0xfe>
   1b600:	83 e2       	ldi	r24, 0x23	; 35
   1b602:	97 e4       	ldi	r25, 0x47	; 71
   1b604:	c2 cf       	rjmp	.-124    	; 0x1b58a <lcd_tune_menu()+0xfe>
    {
        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 <lcd_language()>:
	}
}

#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 <lcd_update_enable(unsigned char)>
	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 <menu_goto(void (*)(), int, bool, bool)>
   1b62e:	10 92 da 03 	sts	0x03DA, r1	; 0x8003da <lcd_timeoutToStatus>
	lcd_timeoutToStatus.stop(); //infinite timeout
	while ((menu_menu != lcd_status_screen) && (!lang_is_selected()))
   1b632:	c0 91 12 04 	lds	r28, 0x0412	; 0x800412 <menu_menu>
   1b636:	d0 91 13 04 	lds	r29, 0x0413	; 0x800413 <menu_menu+0x1>
   1b63a:	0e 94 b5 70 	call	0xe16a	; 0xe16a <lang_is_selected>
   1b63e:	c8 50       	subi	r28, 0x08	; 8
   1b640:	d9 43       	sbci	r29, 0x39	; 57
   1b642:	39 f0       	breq	.+14     	; 0x1b652 <lcd_language()+0x3e>
   1b644:	81 11       	cpse	r24, r1
   1b646:	07 c0       	rjmp	.+14     	; 0x1b656 <lcd_language()+0x42>
	{
		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 <delay_keep_alive(unsigned int)>
   1b650:	f0 cf       	rjmp	.-32     	; 0x1b632 <lcd_language()+0x1e>
	}
	if (lang_is_selected())
   1b652:	88 23       	and	r24, r24
   1b654:	21 f0       	breq	.+8      	; 0x1b65e <lcd_language()+0x4a>
		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 <lcd_return_to_status()>
	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 <lang_select>

0001b668 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>:
}

#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 <lcd_update_enable(unsigned char)>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x2a>
   1b690:	dd e2       	ldi	r29, 0x2D	; 45
	if (_clear)
   1b692:	bb 20       	and	r11, r11
   1b694:	09 f1       	breq	.+66     	; 0x1b6d8 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x70>
		lcd_clear();
   1b696:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x76>
	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 <lang_get_translation>
   1b6a6:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xa8>
	    || 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 <lang_get_translation>
   1b6ba:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb0>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb0>
	if (screen == TestScreen::Home) lcd_puts_P(_T(MSG_CALIBRATING_HOME));
   1b6ce:	ce 30       	cpi	r28, 0x0E	; 14
   1b6d0:	39 f5       	brne	.+78     	; 0x1b720 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb8>
   1b6d2:	81 ea       	ldi	r24, 0xA1	; 161
   1b6d4:	98 e4       	ldi	r25, 0x48	; 72
   1b6d6:	20 c0       	rjmp	.+64     	; 0x1b718 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb0>
	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 <lcd_home()>
   1b6dc:	de cf       	rjmp	.-68     	; 0x1b69a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x32>

	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x36>
	if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN));
   1b6e2:	c2 30       	cpi	r28, 0x02	; 2
   1b6e4:	e1 f2       	breq	.-72     	; 0x1b69e <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x36>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x42>
   1b70a:	87 ee       	ldi	r24, 0xE7	; 231
   1b70c:	98 e4       	ldi	r25, 0x48	; 72
   1b70e:	c9 cf       	rjmp	.-110    	; 0x1b6a2 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x112>
	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 <lang_get_translation>
   1b71c:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>

	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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk))
   1b72c:	c3 30       	cpi	r28, 0x03	; 3
   1b72e:	70 f5       	brcc	.+92     	; 0x1b78c <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x124>
	{
		//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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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 <lcd_set_cursor(unsigned char, unsigned char)>
		(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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x11a>
   1b74e:	8d 2f       	mov	r24, r29
   1b750:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
		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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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 <lcd_set_cursor(unsigned char, unsigned char)>
		(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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x150>
	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 <lcd_putc(char)>
   1b778:	23 c0       	rjmp	.+70     	; 0x1b7c0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x158>
	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x118>
   1b77e:	9f cf       	rjmp	.-194    	; 0x1b6be <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x56>
   1b780:	c9 cf       	rjmp	.-110    	; 0x1b714 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xac>
	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 <lcd_puts_P(char const*)>
   1b78a:	e4 cf       	rjmp	.-56     	; 0x1b754 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xec>
		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_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x196>
	{
		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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_putc(':');
   1b7a6:	8a e3       	ldi	r24, 0x3A	; 58
   1b7a8:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
		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 <lcd_set_cursor(unsigned char, unsigned char)>
		(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_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x10a>
		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 <lcd_puts_P(char const*)>

		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x164>
   1b7c6:	c6 01       	movw	r24, r12
   1b7c8:	0e 94 84 8c 	call	0x11908	; 0x11908 <delay_keep_alive(unsigned int)>
	_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x17a>
   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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x182>
   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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x158>
	{
		//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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1a8>
   1b808:	42 e0       	ldi	r20, 0x02	; 2
   1b80a:	c3 30       	cpi	r28, 0x03	; 3
   1b80c:	09 f4       	brne	.+2      	; 0x1b810 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1a8>
   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 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1c4>
   1b824:	42 e0       	ldi	r20, 0x02	; 2
   1b826:	c5 30       	cpi	r28, 0x05	; 5
   1b828:	08 f4       	brcc	.+2      	; 0x1b82c <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1c4>
   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 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1e0>
   1b840:	42 e0       	ldi	r20, 0x02	; 2
   1b842:	c6 30       	cpi	r28, 0x06	; 6
   1b844:	08 f4       	brcc	.+2      	; 0x1b848 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1e0>
   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 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1fc>
   1b85c:	42 e0       	ldi	r20, 0x02	; 2
   1b85e:	c7 30       	cpi	r28, 0x07	; 7
   1b860:	08 f4       	brcc	.+2      	; 0x1b864 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1fc>
   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 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x218>
   1b878:	42 e0       	ldi	r20, 0x02	; 2
   1b87a:	c8 30       	cpi	r28, 0x08	; 8
   1b87c:	08 f4       	brcc	.+2      	; 0x1b880 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x218>
   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 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>
   1b88e:	98 cf       	rjmp	.-208    	; 0x1b7c0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x158>

0001b890 <lcd_rename_sheet_menu()>:
{
    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 <menu_data>
   1b898:	81 11       	cpse	r24, r1
   1b89a:	18 c0       	rjmp	.+48     	; 0x1b8cc <lcd_rename_sheet_menu()+0x3c>
    {
        eeprom_read_block(menuData->name, EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name));
   1b89c:	60 91 e0 03 	lds	r22, 0x03E0	; 0x8003e0 <selected_sheet>
   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 <eeprom_read_block>
        lcd_encoder = menuData->name[0];
   1b8b8:	80 91 a9 03 	lds	r24, 0x03A9	; 0x8003a9 <menu_data+0x2>
   1b8bc:	90 e0       	ldi	r25, 0x00	; 0
   1b8be:	90 93 70 06 	sts	0x0670, r25	; 0x800670 <lcd_encoder+0x1>
   1b8c2:	80 93 6f 06 	sts	0x066F, r24	; 0x80066f <lcd_encoder>
        menuData->initialized = true;
   1b8c6:	81 e0       	ldi	r24, 0x01	; 1
   1b8c8:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
    }
    if (lcd_encoder < 0x20) lcd_encoder = 0x20;
   1b8cc:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   1b8d0:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1b8d4:	80 97       	sbiw	r24, 0x20	; 32
   1b8d6:	34 f4       	brge	.+12     	; 0x1b8e4 <lcd_rename_sheet_menu()+0x54>
   1b8d8:	80 e2       	ldi	r24, 0x20	; 32
   1b8da:	90 e0       	ldi	r25, 0x00	; 0
   1b8dc:	90 93 70 06 	sts	0x0670, r25	; 0x800670 <lcd_encoder+0x1>
   1b8e0:	80 93 6f 06 	sts	0x066F, r24	; 0x80066f <lcd_encoder>
    if (lcd_encoder > 0xFF) lcd_encoder = 0xFF;
   1b8e4:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   1b8e8:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1b8ec:	8f 3f       	cpi	r24, 0xFF	; 255
   1b8ee:	91 05       	cpc	r25, r1
   1b8f0:	39 f0       	breq	.+14     	; 0x1b900 <lcd_rename_sheet_menu()+0x70>
   1b8f2:	34 f0       	brlt	.+12     	; 0x1b900 <lcd_rename_sheet_menu()+0x70>
   1b8f4:	8f ef       	ldi	r24, 0xFF	; 255
   1b8f6:	90 e0       	ldi	r25, 0x00	; 0
   1b8f8:	90 93 70 06 	sts	0x0670, r25	; 0x800670 <lcd_encoder+0x1>
   1b8fc:	80 93 6f 06 	sts	0x066F, r24	; 0x80066f <lcd_encoder>

    menuData->name[menuData->selected] = lcd_encoder;
   1b900:	e0 91 a8 03 	lds	r30, 0x03A8	; 0x8003a8 <menu_data+0x1>
   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 <lcd_encoder>
   1b90e:	82 83       	std	Z+2, r24	; 0x02
    lcd_home();
   1b910:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
   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 <lcd_putc(char)>
    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_rename_sheet_menu()+0x88>
    {
        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 <menu_data+0x1>
   1b92e:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    if (menuData->selected > 0)
   1b932:	80 91 a8 03 	lds	r24, 0x03A8	; 0x8003a8 <menu_data+0x1>
   1b936:	88 23       	and	r24, r24
   1b938:	29 f0       	breq	.+10     	; 0x1b944 <lcd_rename_sheet_menu()+0xb4>
    {
        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 <lcd_putc_at(unsigned char, unsigned char, char)>
    }
    if (lcd_clicked())
   1b944:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   1b948:	88 23       	and	r24, r24
   1b94a:	99 f0       	breq	.+38     	; 0x1b972 <lcd_rename_sheet_menu()+0xe2>
    {
        if ((menuData->selected + 1u) < sizeof(Sheet::name))
   1b94c:	e0 91 a8 03 	lds	r30, 0x03A8	; 0x8003a8 <menu_data+0x1>
   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_rename_sheet_menu()+0xe8>
        {
            lcd_encoder = menuData->name[++(menuData->selected)];
   1b95a:	ef 5f       	subi	r30, 0xFF	; 255
   1b95c:	e0 93 a8 03 	sts	0x03A8, r30	; 0x8003a8 <menu_data+0x1>
   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 <lcd_encoder+0x1>
   1b96e:	80 93 6f 06 	sts	0x066F, r24	; 0x80066f <lcd_encoder>
                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 <selected_sheet>
   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_update_block>
                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 <menu_back()>

0001b99c <lcd_selfcheck_check_heater(bool)>:
	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 <current_temperature>
   1b9ba:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1b9be:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1b9c2:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <current_temperature_bed>
   1b9d2:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   1b9d6:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   1b9da:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <lcd_selfcheck_check_heater(bool)+0x4e>
   1b9e8:	a6 c0       	rjmp	.+332    	; 0x1bb36 <lcd_selfcheck_check_heater(bool)+0x19a>
   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 <target_temperature+0x1>
   1b9fa:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <target_temperature>
	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 <lcd_selfcheck_check_heater(bool)+0x6e>
   1ba06:	90 e0       	ldi	r25, 0x00	; 0
   1ba08:	80 e0       	ldi	r24, 0x00	; 0
   1ba0a:	90 93 72 06 	sts	0x0672, r25	; 0x800672 <target_temperature_bed+0x1>
   1ba0e:	80 93 71 06 	sts	0x0671, r24	; 0x800671 <target_temperature_bed>
    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 <thermal_model_set_enabled(bool)>
#endif //THERMAL_MODEL
	manage_heater();
   1ba1c:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
	manage_inactivity(true);
   1ba20:	81 e0       	ldi	r24, 0x01	; 1
   1ba22:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>

    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 <Stopped>
   1ba32:	81 11       	cpse	r24, r1
   1ba34:	1c c0       	rjmp	.+56     	; 0x1ba6e <lcd_selfcheck_check_heater(bool)+0xd2>
    {
		manage_heater();
   1ba36:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
		manage_inactivity(true);
   1ba3a:	81 e0       	ldi	r24, 0x01	; 1
   1ba3c:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
		_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 <lcd_selfcheck_check_heater(bool)+0xb6>
   1ba50:	88 e0       	ldi	r24, 0x08	; 8
   1ba52:	0e 94 34 db 	call	0x1b668	; 0x1b668 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <lcd_selfcheck_check_heater(bool)+0xcc>
   1ba64:	0e 94 f6 76 	call	0xedec	; 0xedec <serialecho_temperatures()>
	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 <lcd_selfcheck_check_heater(bool)+0x92>
			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 <target_temperature+0x1>
   1ba72:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
	target_temperature_bed = 0;
   1ba76:	10 92 72 06 	sts	0x0672, r1	; 0x800672 <target_temperature_bed+0x1>
   1ba7a:	10 92 71 06 	sts	0x0671, r1	; 0x800671 <target_temperature_bed>
	manage_heater();
   1ba7e:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
   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 <lcd_selfcheck_check_heater(bool)+0xfc>
   1ba96:	54 c0       	rjmp	.+168    	; 0x1bb40 <lcd_selfcheck_check_heater(bool)+0x1a4>
   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 <current_temperature_bed>
   1baa4:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   1baa8:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   1baac:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <current_temperature>
   1baca:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1bace:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1bad2:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <Stopped>
   1bae2:	11 11       	cpse	r17, r1
   1bae4:	0c c0       	rjmp	.+24     	; 0x1bafe <lcd_selfcheck_check_heater(bool)+0x162>
   1bae6:	f1 10       	cpse	r15, r1
   1bae8:	4b c0       	rjmp	.+150    	; 0x1bb80 <lcd_selfcheck_check_heater(bool)+0x1e4>
   1baea:	69 30       	cpi	r22, 0x09	; 9
   1baec:	71 05       	cpc	r23, r1
   1baee:	0c f0       	brlt	.+2      	; 0x1baf2 <lcd_selfcheck_check_heater(bool)+0x156>
   1baf0:	4d c0       	rjmp	.+154    	; 0x1bb8c <lcd_selfcheck_check_heater(bool)+0x1f0>
    {
        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 <lcd_selfcheck_check_heater(bool)+0x16e>
            _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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
	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 <thermal_model_set_enabled(bool)>
#endif //THERMAL_MODEL
	manage_heater();
   1bb10:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
	manage_inactivity(true);
   1bb14:	81 e0       	ldi	r24, 0x01	; 1
   1bb16:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
	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 <lcd_selfcheck_check_heater(bool)+0x5a>

	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 <current_temperature>
   1bb4c:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1bb50:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1bb54:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <current_temperature_bed>
   1bb72:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   1bb76:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   1bb7a:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   1bb7e:	ab cf       	rjmp	.-170    	; 0x1bad6 <lcd_selfcheck_check_heater(bool)+0x13a>
	*/

    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 <lcd_selfcheck_check_heater(bool)+0x1f0>
   1bb8a:	b5 cf       	rjmp	.-150    	; 0x1baf6 <lcd_selfcheck_check_heater(bool)+0x15a>
        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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
   1bb96:	b9 cf       	rjmp	.-142    	; 0x1bb0a <lcd_selfcheck_check_heater(bool)+0x16e>

0001bb98 <reset_crash_det(unsigned char)>:
	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 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   1bbd0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
	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 <crashdet_use_eeprom_setting()>

0001bbdc <lcd_selfcheck_axis_sg(unsigned char)>:
}

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 <lcd_selfcheck_axis_sg(unsigned char)+0x24>
   1bc00:	00 d0       	rcall	.+0      	; 0x1bc02 <lcd_selfcheck_axis_sg(unsigned char)+0x26>
   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 <lcd_selfcheck_axis_sg(unsigned char)+0x50>
	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_sg_stop_on_crash>
	tmc2130_home_exit();
   1bc30:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
   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 <raise_z_above(float)>
	tmc2130_home_enter(1 << axis);
   1bc46:	81 e0       	ldi	r24, 0x01	; 1
   1bc48:	01 2e       	mov	r0, r17
   1bc4a:	01 c0       	rjmp	.+2      	; 0x1bc4e <lcd_selfcheck_axis_sg(unsigned char)+0x72>
   1bc4c:	88 0f       	add	r24, r24
   1bc4e:	0a 94       	dec	r0
   1bc50:	ea f7       	brpl	.-6      	; 0x1bc4c <lcd_selfcheck_axis_sg(unsigned char)+0x70>
   1bc52:	0f 94 b4 26 	call	0x24d68	; 0x24d68 <tmc2130_home_enter(unsigned char)>

// 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 <plan_buffer_line_curposXYZE(float)>


	st_synchronize();
   1bcb0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
#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 <st_get_position_mm(unsigned char)>
   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 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   1bd12:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

	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 <plan_buffer_line_curposXYZE(float)>

	st_synchronize();
   1bd42:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
}

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 <printf_P>
	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 <lcd_selfcheck_axis_sg(unsigned char)+0x1ca>
   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 <eeprom_write_word>

	current_position_final = st_get_position_mm(axis);
   1bdae:	81 2f       	mov	r24, r17
   1bdb0:	0f 94 95 43 	call	0x2872a	; 0x2872a <st_get_position_mm(unsigned char)>
   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 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   1be00:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

	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 <plan_buffer_line_curposXYZE(float)>

	st_synchronize();
   1be34:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

	current_position_init = st_get_position_mm(axis);
   1be38:	81 2f       	mov	r24, r17
   1be3a:	0f 94 95 43 	call	0x2872a	; 0x2872a <st_get_position_mm(unsigned char)>
   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 <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]);
   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 <printf_P>
		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 <lcd_selfcheck_axis_sg(unsigned char)+0x2ba>
   1be94:	53 c0       	rjmp	.+166    	; 0x1bf3c <lcd_selfcheck_axis_sg(unsigned char)+0x360>
	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 <printf_P>
		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 <lcd_selfcheck_axis_sg(unsigned char)+0x360>
			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 <printf_P>

		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 <lcd_selfcheck_axis_sg(unsigned char)+0x342>
   1bf1c:	44 c0       	rjmp	.+136    	; 0x1bfa6 <lcd_selfcheck_axis_sg(unsigned char)+0x3ca>
			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 <plan_set_position_curposXYZE()>
		reset_crash_det(axis);
   1bf2e:	81 2f       	mov	r24, r17
   1bf30:	0e 94 cc dd 	call	0x1bb98	; 0x1bb98 <reset_crash_det(unsigned char)>
		endstops_hit_on_purpose();
   1bf34:	0f 94 bf 4e 	call	0x29d7e	; 0x29d7e <endstops_hit_on_purpose()>
		return true;
   1bf38:	81 e0       	ldi	r24, 0x01	; 1
   1bf3a:	1d c0       	rjmp	.+58     	; 0x1bf76 <lcd_selfcheck_axis_sg(unsigned char)+0x39a>
   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 <lcd_selfcheck_axis_sg(unsigned char)+0x370>
   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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
			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 <plan_set_position_curposXYZE()>
			reset_crash_det(axis);
   1bf64:	81 2f       	mov	r24, r17
   1bf66:	0e 94 cc dd 	call	0x1bb98	; 0x1bb98 <reset_crash_det(unsigned char)>
   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 <endstops_hit_on_purpose()>
			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 <lcd_selfcheck_axis_sg(unsigned char)+0x3d6>
   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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
			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 <plan_set_position_curposXYZE()>
			reset_crash_det(axis);
   1bfca:	81 2f       	mov	r24, r17
   1bfcc:	0e 94 cc dd 	call	0x1bb98	; 0x1bb98 <reset_crash_det(unsigned char)>
   1bfd0:	cf cf       	rjmp	.-98     	; 0x1bf70 <lcd_selfcheck_axis_sg(unsigned char)+0x394>

0001bfd2 <crash_mode_switch()>:
}

#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 <eeprom_toggle(unsigned char*)>
    crashdet_use_eeprom_setting();
   1bfda:	0d 94 31 27 	jmp	0x24e62	; 0x24e62 <crashdet_use_eeprom_setting()>

0001bfde <lcd_crash_mode_info()>:
#endif //SDCARD_SORT_ALPHA

#ifdef TMC2130
static void lcd_crash_mode_info()
{
    lcd_home();
   1bfde:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    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 <lang_get_translation>
   1bfea:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
    menu_back_if_clicked();
   1bfee:	0d 94 f4 d4 	jmp	0x3a9e8	; 0x3a9e8 <menu_back_if_clicked()>

0001bff2 <lcd_crash_mode_info2()>:
}

static void lcd_crash_mode_info2()
{
    lcd_home();
   1bff2:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    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 <lang_get_translation>
   1bffe:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
    menu_back_if_clicked();
   1c002:	0d 94 f4 d4 	jmp	0x3a9e8	; 0x3a9e8 <menu_back_if_clicked()>

0001c006 <lcd_belttest_v()>:
		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 <lcd_clear()>
	// 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 <force_high_power_mode(bool)>

    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 <eeprom_read_word>
   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 <eeprom_read_word>
   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 <lang_get_translation>
   1c036:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
	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 <lcd_set_cursor(unsigned char, unsigned char)>
   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 <lcd_printf_P(char const*, ...)>
    KEEPALIVE_STATE(IN_HANDLER);
   1c052:	82 e0       	ldi	r24, 0x02	; 2
   1c054:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>

	// 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 <lcd_selfcheck_axis_sg(unsigned char)>
   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 <lcd_belttest_v()+0x66>
   1c06a:	45 c0       	rjmp	.+138    	; 0x1c0f6 <lcd_belttest_v()+0xf0>
		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 <eeprom_read_word>
   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_set_cursor(unsigned char, unsigned char)>
	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_printNumber(unsigned long, unsigned char)>
		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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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 <lcd_set_cursor(unsigned char, unsigned char)>
   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 <lcd_printf_P(char const*, ...)>
		if (lcd_selfcheck_axis_sg(Y_AXIS))
   1c0b4:	81 e0       	ldi	r24, 0x01	; 1
   1c0b6:	0e 94 ee dd 	call	0x1bbdc	; 0x1bbdc <lcd_selfcheck_axis_sg(unsigned char)>
   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 <lcd_belttest_v()+0xf0>
		{
			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 <eeprom_read_word>
   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_set_cursor(unsigned char, unsigned char)>
	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_printNumber(unsigned long, unsigned char)>
			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_putc_at(unsigned char, unsigned char, char)>
			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 <lcd_wait_for_click_delay(unsigned int)>
		}
    }

	FORCE_HIGH_POWER_END;
   1c0f6:	80 e0       	ldi	r24, 0x00	; 0
   1c0f8:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
    KEEPALIVE_STATE(NOT_BUSY);
   1c0fc:	81 e0       	ldi	r24, 0x01	; 1
   1c0fe:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
#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 <menu_back_if_clicked()>

0001c10e <lcd_sd_refresh()>:
static void lcd_sd_refresh()
{
#if SDCARDDETECT == -1
  card.mount();
#else
  card.presort();
   1c10e:	0f 94 89 7d 	call	0x2fb12	; 0x2fb12 <CardReader::presort() [clone .constprop.218]>
#endif
  menu_top = 0;
   1c112:	10 92 a3 03 	sts	0x03A3, r1	; 0x8003a3 <menu_top>
  lcd_encoder = 0;
   1c116:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   1c11a:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
  menu_data_reset(); //Forces reloading of cached variables.
   1c11e:	0d 94 ac d1 	jmp	0x3a358	; 0x3a358 <menu_data_reset()>

0001c122 <lcd_sd_updir()>:
  }
}

void CardReader::updir()
{
  if(workDirDepth > 0)
   1c122:	80 91 2f 16 	lds	r24, 0x162F	; 0x80162f <card+0x1a2>
   1c126:	88 23       	and	r24, r24
   1c128:	f9 f0       	breq	.+62     	; 0x1c168 <lcd_sd_updir()+0x46>
  {
    --workDirDepth;
   1c12a:	81 50       	subi	r24, 0x01	; 1
   1c12c:	80 93 2f 16 	sts	0x162F, r24	; 0x80162f <card+0x1a2>
    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 <lcd_sd_updir()+0x18>
   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 <lcd_sd_updir()+0x42>
    {
        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 <lcd_sd_updir()+0x32>
{
  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 <lcd_sd_updir()+0x26>
    {
        workDirParents[d] = workDirParents[d+1];
    }
	#ifdef SDCARD_SORT_ALPHA
    presort();
   1c164:	0f 94 89 7d 	call	0x2fb12	; 0x2fb12 <CardReader::presort() [clone .constprop.218]>
}

static void lcd_sd_updir()
{
  card.updir();
  menu_top = 0;
   1c168:	10 92 a3 03 	sts	0x03A3, r1	; 0x8003a3 <menu_top>
  lcd_encoder = 0;
   1c16c:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   1c170:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
  menu_data_reset(); //Forces reloading of cached variables.
   1c174:	0d 94 ac d1 	jmp	0x3a358	; 0x3a358 <menu_data_reset()>

0001c178 <lcd_backlight_menu()>:
    }
    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 <menu_start()>
   1c188:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c18c:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c190:	84 30       	cpi	r24, 0x04	; 4
   1c192:	08 f0       	brcs	.+2      	; 0x1c196 <lcd_backlight_menu()+0x1e>
   1c194:	63 c0       	rjmp	.+198    	; 0x1c25c <lcd_backlight_menu()+0xe4>
   1c196:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    ON_MENU_LEAVE(
   1c19a:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   1c19e:	81 11       	cpse	r24, r1
   1c1a0:	0e 94 cf 89 	call	0x1139e	; 0x1139e <backlight_save()>
        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 <lang_get_translation>
   1c1ac:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BL_HIGH), &backlightLevel_HIGH, backlightLevel_LOW, 255);
   1c1b0:	c0 91 ff 03 	lds	r28, 0x03FF	; 0x8003ff <backlightLevel_LOW>
   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 <lang_get_translation>
   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_P(char const*, void*, unsigned char, int, int, int)>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BL_LOW), &backlightLevel_LOW, 0, backlightLevel_HIGH);
   1c1d2:	00 91 00 04 	lds	r16, 0x0400	; 0x800400 <backlightLevel_HIGH>
   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 <lang_get_translation>
   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_edit_P(char const*, void*, unsigned char, int, int, int)>
	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 <backlightMode>
   1c1f2:	81 30       	cpi	r24, 0x01	; 1
   1c1f4:	59 f5       	brne	.+86     	; 0x1c24c <lcd_backlight_menu()+0xd4>
   1c1f6:	83 ec       	ldi	r24, 0xC3	; 195
   1c1f8:	97 e4       	ldi	r25, 0x47	; 71
   1c1fa:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    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 <lang_get_translation>
   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_item_edit_P(char const*, void*, unsigned char, int, int, int)>

    MENU_END();
   1c232:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
    backlight_save();
}

static void lcd_backlight_menu()
{
    MENU_BEGIN();
   1c236:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c23a:	8f 5f       	subi	r24, 0xFF	; 255
   1c23c:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c240:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c244:	8f 5f       	subi	r24, 0xFF	; 255
   1c246:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c24a:	a0 cf       	rjmp	.-192    	; 0x1c18c <lcd_backlight_menu()+0x14>
    );

    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 <lcd_backlight_menu()+0xde>
   1c250:	8d eb       	ldi	r24, 0xBD	; 189
   1c252:	97 e4       	ldi	r25, 0x47	; 71
   1c254:	d2 cf       	rjmp	.-92     	; 0x1c1fa <lcd_backlight_menu()+0x82>
   1c256:	86 eb       	ldi	r24, 0xB6	; 182
   1c258:	97 e4       	ldi	r25, 0x47	; 71
   1c25a:	cf cf       	rjmp	.-98     	; 0x1c1fa <lcd_backlight_menu()+0x82>
    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 <backlight_mode_toggle()>:
}

#ifdef LCD_BL_PIN
static void backlight_mode_toggle()
{
    switch (backlightMode)
   1c26a:	80 91 4f 02 	lds	r24, 0x024F	; 0x80024f <backlightMode>
   1c26e:	88 23       	and	r24, r24
   1c270:	31 f0       	breq	.+12     	; 0x1c27e <backlight_mode_toggle()+0x14>
   1c272:	81 30       	cpi	r24, 0x01	; 1
   1c274:	41 f4       	brne	.+16     	; 0x1c286 <backlight_mode_toggle()+0x1c>
    {
        case BACKLIGHT_MODE_BRIGHT: backlightMode = BACKLIGHT_MODE_DIM; break;
   1c276:	10 92 4f 02 	sts	0x024F, r1	; 0x80024f <backlightMode>
        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 <backlight_save()>
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 <backlightMode>
   1c284:	fa cf       	rjmp	.-12     	; 0x1c27a <backlight_mode_toggle()+0x10>
   1c286:	81 e0       	ldi	r24, 0x01	; 1
   1c288:	fb cf       	rjmp	.-10     	; 0x1c280 <backlight_mode_toggle()+0x16>

0001c28a <mmu_preload_filament_menu()>:

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 <menu_start()>
   1c290:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c294:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c298:	84 30       	cpi	r24, 0x04	; 4
   1c29a:	60 f5       	brcc	.+88     	; 0x1c2f4 <mmu_preload_filament_menu()+0x6a>
   1c29c:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1c2a8:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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 <lang_get_translation>
   1c2b4:	69 e3       	ldi	r22, 0x39	; 57
   1c2b6:	72 ee       	ldi	r23, 0xE2	; 226
   1c2b8:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    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 <lang_get_translation>
   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 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>

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 <mmu_preload_filament_menu()+0x34>
        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 <menu_end()>
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 <menu_row>
   1c2e2:	8f 5f       	subi	r24, 0xFF	; 255
   1c2e4:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c2e8:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c2ec:	8f 5f       	subi	r24, 0xFF	; 255
   1c2ee:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c2f2:	d0 cf       	rjmp	.-96     	; 0x1c294 <mmu_preload_filament_menu()+0xa>
    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 <lcd_mmuLoadFilament()>:
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 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0001c2fe <lcd_mmuUnloadFilament()>:
}

static void lcd_mmuUnloadFilament() {
    preheat_or_continue(FilamentAction::MmuUnLoad);
   1c2fe:	85 e0       	ldi	r24, 0x05	; 5
   1c300:	0d 94 b2 51 	jmp	0x2a364	; 0x2a364 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0001c304 <lcd_mmuEjectFilament()>:
}

static void lcd_mmuEjectFilament() {
    preheat_or_continue(FilamentAction::MmuEject);
   1c304:	86 e0       	ldi	r24, 0x06	; 6
   1c306:	0d 94 b2 51 	jmp	0x2a364	; 0x2a364 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0001c30a <lcd_mmuCutFilament()>:
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 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0001c310 <lcd_mmuLoadingTest()>:
        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 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0001c316 <change_sheet()>:
        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 <selected_sheet>
   1c31a:	81 ea       	ldi	r24, 0xA1	; 161
   1c31c:	9d e0       	ldi	r25, 0x0D	; 13
   1c31e:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
}

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 <menu_back(unsigned char)>

0001c328 <mmu_loading_test_menu() [clone .lto_priv.447]>:

    // 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 <menu_start()>
   1c32e:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c332:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c336:	84 30       	cpi	r24, 0x04	; 4
   1c338:	88 f5       	brcc	.+98     	; 0x1c39c <mmu_loading_test_menu() [clone .lto_priv.447]+0x74>
   1c33a:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    ON_MENU_LEAVE(
   1c33e:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   1c342:	81 11       	cpse	r24, r1
   1c344:	0f 94 6f 21 	call	0x242de	; 0x242de <clearFilamentAction() [clone .lto_priv.439]>
        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 <lang_get_translation>
   1c350:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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 <lang_get_translation>
   1c35c:	68 e6       	ldi	r22, 0x68	; 104
   1c35e:	7a e3       	ldi	r23, 0x3A	; 58
   1c360:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    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 <lang_get_translation>
   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 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>
    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 <mmu_loading_test_menu() [clone .lto_priv.447]+0x3e>
        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 <menu_end()>
    // Clear the filament action
    clearFilamentAction();
}

static void mmu_loading_test_menu() {
    MENU_BEGIN();
   1c386:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c38a:	8f 5f       	subi	r24, 0xFF	; 255
   1c38c:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c390:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c394:	8f 5f       	subi	r24, 0xFF	; 255
   1c396:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c39a:	cb cf       	rjmp	.-106    	; 0x1c332 <mmu_loading_test_menu() [clone .lto_priv.447]+0xa>
    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 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>:
}

// 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 <menu_start()>
   1c3b2:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c3b6:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c3ba:	84 30       	cpi	r24, 0x04	; 4
   1c3bc:	28 f5       	brcc	.+74     	; 0x1c408 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))+0x68>
   1c3be:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    ON_MENU_LEAVE(
   1c3c2:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   1c3c6:	81 11       	cpse	r24, r1
   1c3c8:	0f 94 6f 21 	call	0x242de	; 0x242de <clearFilamentAction() [clone .lto_priv.439]>
        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 <lang_get_translation>
   1c3d4:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>
    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 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))+0x3a>
        MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i);
    MENU_END();
   1c3ee:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>

// 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 <menu_row>
   1c3f6:	8f 5f       	subi	r24, 0xFF	; 255
   1c3f8:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c3fc:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c400:	8f 5f       	subi	r24, 0xFF	; 255
   1c402:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c406:	d7 cf       	rjmp	.-82     	; 0x1c3b6 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))+0x16>
    );
    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 <mmu_cut_filament_menu() [clone .lto_priv.449]>:
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 <lang_get_translation>
   1c41c:	62 e2       	ldi	r22, 0x22	; 34
   1c41e:	72 ee       	ldi	r23, 0xE2	; 226
   1c420:	0c 94 d0 e1 	jmp	0x1c3a0	; 0x1c3a0 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>

0001c424 <mmu_fil_eject_menu() [clone .lto_priv.448]>:
    // 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 <lang_get_translation>
   1c42c:	6e e2       	ldi	r22, 0x2E	; 46
   1c42e:	72 ee       	ldi	r23, 0xE2	; 226
   1c430:	0c 94 d0 e1 	jmp	0x1c3a0	; 0x1c3a0 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>

0001c434 <mmu_load_to_nozzle_menu() [clone .lto_priv.446]>:
        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 <lang_get_translation>
   1c43c:	6c ee       	ldi	r22, 0xEC	; 236
   1c43e:	79 e3       	ldi	r23, 0x39	; 57
   1c440:	0c 94 d0 e1 	jmp	0x1c3a0	; 0x1c3a0 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>

0001c444 <mmu_cut_filament_wrapper(unsigned char)>:
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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   1c44c:	88 23       	and	r24, r24
   1c44e:	21 f0       	breq	.+8      	; 0x1c458 <mmu_cut_filament_wrapper(unsigned char)+0x14>
   1c450:	8c 2f       	mov	r24, r28
    MMU2::mmu2.cut_filament(index);
}
   1c452:	cf 91       	pop	r28
   1c454:	0d 94 09 ae 	jmp	0x35c12	; 0x35c12 <MMU2::MMU2::cut_filament(unsigned char, bool) [clone .part.39] [clone .constprop.117]>
   1c458:	cf 91       	pop	r28
   1c45a:	08 95       	ret

0001c45c <mmu_eject_filament(unsigned char)>:

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 <menu_back()>
    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 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]>

    // 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 <clearFilamentAction() [clone .lto_priv.439]>

0001c472 <load_all_wrapper()>:

}

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 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>
   1c478:	81 e0       	ldi	r24, 0x01	; 1
   1c47a:	0f 94 49 ad 	call	0x35a92	; 0x35a92 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>
   1c47e:	82 e0       	ldi	r24, 0x02	; 2
   1c480:	0f 94 49 ad 	call	0x35a92	; 0x35a92 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>
   1c484:	83 e0       	ldi	r24, 0x03	; 3
   1c486:	0f 94 49 ad 	call	0x35a92	; 0x35a92 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>
   1c48a:	84 e0       	ldi	r24, 0x04	; 4
   1c48c:	0d 94 49 ad 	jmp	0x35a92	; 0x35a92 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>

0001c490 <load_filament_wrapper(unsigned char)>:
    }
}

static inline void load_filament_wrapper(uint8_t i){
    MMU2::mmu2.load_filament(i);
   1c490:	0d 94 49 ad 	jmp	0x35a92	; 0x35a92 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>

0001c494 <menu_setlang(unsigned char)>:
}
#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 <lang_select>
   1c49c:	81 11       	cpse	r24, r1
   1c49e:	37 c0       	rjmp	.+110    	; 0x1c50e <menu_setlang(unsigned char)+0x7a>
	{
		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 <lang_get_translation>
   1c4a8:	40 e0       	ldi	r20, 0x00	; 0
   1c4aa:	60 e0       	ldi	r22, 0x00	; 0
   1c4ac:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   1c4b0:	81 11       	cpse	r24, r1
   1c4b2:	20 c0       	rjmp	.+64     	; 0x1c4f4 <menu_setlang(unsigned char)+0x60>
#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 <lang_get_count>
	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 <menu_setlang(unsigned char)+0x60>
   1c4bc:	8c 17       	cp	r24, r28
   1c4be:	d0 f0       	brcs	.+52     	; 0x1c4f4 <menu_setlang(unsigned char)+0x60>
	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 <softReset>
			lang_boot_update_start(lang);
		lcd_update_enable(true);
   1c4f4:	81 e0       	ldi	r24, 0x01	; 1
   1c4f6:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
		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 <menu_goto(void (*)(), int, bool, bool)>
   1c50a:	10 92 da 03 	sts	0x03DA, r1	; 0x8003da <lcd_timeoutToStatus>
		lcd_timeoutToStatus.stop(); //infinite timeout
	}
}
   1c50e:	cf 91       	pop	r28
   1c510:	08 95       	ret

0001c512 <lcd_community_language_menu()>:

#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 <menu_start()>
   1c51a:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c51e:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c522:	84 30       	cpi	r24, 0x04	; 4
   1c524:	58 f5       	brcc	.+86     	; 0x1c57c <lcd_community_language_menu()+0x6a>
   1c526:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	uint8_t cnt = lang_get_count();
   1c52a:	0e 94 81 71 	call	0xe302	; 0xe302 <lang_get_count>
   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 <lang_get_translation>
   1c538:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lcd_community_language_menu()+0x50>
		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 <lang_get_code>
   1c548:	0e 94 cb 70 	call	0xe196	; 0xe196 <lang_get_name_by_code>
   1c54c:	0f 94 38 d1 	call	0x3a270	; 0x3a270 <menu_item_text_P(char const*)>
   1c550:	88 23       	and	r24, r24
   1c552:	29 f0       	breq	.+10     	; 0x1c55e <lcd_community_language_menu()+0x4c>
		{
			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 <menu_setlang(unsigned char)>
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 <lcd_community_language_menu()+0x2c>
		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 <menu_end()>

#ifdef COMMUNITY_LANGUAGE_SUPPORT
#ifdef XFLASH
static void lcd_community_language_menu()
{
	MENU_BEGIN();
   1c566:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c56a:	8f 5f       	subi	r24, 0xFF	; 255
   1c56c:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c570:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c574:	8f 5f       	subi	r24, 0xFF	; 255
   1c576:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c57a:	d1 cf       	rjmp	.-94     	; 0x1c51e <lcd_community_language_menu()+0xc>
		{
			menu_setlang(i);
			return;
		}
	MENU_END();
}
   1c57c:	df 91       	pop	r29
   1c57e:	cf 91       	pop	r28
   1c580:	08 95       	ret

0001c582 <sheets_menu()>:
    lcd_sheet_menu();
}

static void sheets_menu()
{
    MENU_BEGIN();
   1c582:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1c586:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c58a:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c58e:	84 30       	cpi	r24, 0x04	; 4
   1c590:	08 f0       	brcs	.+2      	; 0x1c594 <sheets_menu()+0x12>
   1c592:	45 c0       	rjmp	.+138    	; 0x1c61e <sheets_menu()+0x9c>
   1c594:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1c5a0:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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(Sheet const&, void (*)())>
    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(Sheet const&, void (*)())>
    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(Sheet const&, void (*)())>
    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(Sheet const&, void (*)())>
    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(Sheet const&, void (*)())>
    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(Sheet const&, void (*)())>
    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(Sheet const&, void (*)())>
    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_item_submenu_E(Sheet const&, void (*)())>
    MENU_END();
   1c604:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
    lcd_sheet_menu();
}

static void sheets_menu()
{
    MENU_BEGIN();
   1c608:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c60c:	8f 5f       	subi	r24, 0xFF	; 255
   1c60e:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c612:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c616:	8f 5f       	subi	r24, 0xFF	; 255
   1c618:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c61c:	b6 cf       	rjmp	.-148    	; 0x1c58a <sheets_menu()+0x8>
    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 <wait_preheat()>:
		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 <current_position+0x8>
   1c634:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   1c638:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   1c63c:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
    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 <plan_buffer_line_curposXYZE(float)>
    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 <delay_keep_alive(unsigned int)>
    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 <lang_get_translation>
   1c65c:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
  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 <target_temperature>
   1c664:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   1c67c:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1c680:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1c684:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <wait_preheat()+0xea>
        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 <lang_get_translation>
   1c6a6:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>

        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 <lcd_set_cursor(unsigned char, unsigned char)>
   1c6b2:	60 91 b5 0d 	lds	r22, 0x0DB5	; 0x800db5 <target_temperature>
   1c6b6:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   1c6e4:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1c6e8:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1c6ec:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <lcdui_print_temp(char, int, int)>
        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 <delay_keep_alive(unsigned int)>
   1c708:	ab cf       	rjmp	.-170    	; 0x1c660 <wait_preheat()+0x40>
    }

}
   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 <lcd_language_menu()>:
}
#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 <menu_start()>
   1c71a:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1c71e:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c722:	84 30       	cpi	r24, 0x04	; 4
   1c724:	08 f0       	brcs	.+2      	; 0x1c728 <lcd_language_menu()+0x14>
   1c726:	4a c0       	rjmp	.+148    	; 0x1c7bc <lcd_language_menu()+0xa8>
   1c728:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	if (lang_is_selected()) MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); //
   1c72c:	0e 94 b5 70 	call	0xe16a	; 0xe16a <lang_is_selected>
   1c730:	88 23       	and	r24, r24
   1c732:	31 f0       	breq	.+12     	; 0x1c740 <lcd_language_menu()+0x2c>
   1c734:	8a ee       	ldi	r24, 0xEA	; 234
   1c736:	97 e4       	ldi	r25, 0x47	; 71
   1c738:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   1c73c:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lang_get_name_by_code>
   1c748:	0f 94 38 d1 	call	0x3a270	; 0x3a270 <menu_item_text_P(char const*)>
   1c74c:	88 23       	and	r24, r24
   1c74e:	21 f0       	breq	.+8      	; 0x1c758 <lcd_language_menu()+0x44>
	{
		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 <menu_setlang(unsigned char)>
	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 <lang_get_count>
			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 <lcd_language_menu()+0x62>
   1c762:	0e 94 a2 70 	call	0xe144	; 0xe144 <lang_get_code.part.3>
	{
		if (menu_item_text_P(lang_get_name_by_code(lang_get_code(1))))
   1c766:	0e 94 cb 70 	call	0xe196	; 0xe196 <lang_get_name_by_code>
   1c76a:	0f 94 38 d1 	call	0x3a270	; 0x3a270 <menu_item_text_P(char const*)>
   1c76e:	88 23       	and	r24, r24
   1c770:	81 f0       	breq	.+32     	; 0x1c792 <lcd_language_menu()+0x7e>
		{
			menu_setlang(1);
   1c772:	81 e0       	ldi	r24, 0x01	; 1
   1c774:	ee cf       	rjmp	.-36     	; 0x1c752 <lcd_language_menu()+0x3e>
	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 <lang_get_code>
   1c77c:	0e 94 cb 70 	call	0xe196	; 0xe196 <lang_get_name_by_code>
   1c780:	0f 94 38 d1 	call	0x3a270	; 0x3a270 <menu_item_text_P(char const*)>
   1c784:	88 23       	and	r24, r24
   1c786:	11 f0       	breq	.+4      	; 0x1c78c <lcd_language_menu()+0x78>
			{
				menu_setlang(i);
   1c788:	8c 2f       	mov	r24, r28
   1c78a:	e3 cf       	rjmp	.-58     	; 0x1c752 <lcd_language_menu()+0x3e>
			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 <lcd_language_menu()+0x62>
				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 <lang_get_translation>
   1c79a:	69 e8       	ldi	r22, 0x89	; 137
   1c79c:	72 ee       	ldi	r23, 0xE2	; 226
   1c79e:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

	MENU_END();
   1c7a2:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

static void lcd_language_menu()
{
	MENU_BEGIN();
   1c7a6:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1c7aa:	8f 5f       	subi	r24, 0xFF	; 255
   1c7ac:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1c7b0:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1c7b4:	8f 5f       	subi	r24, 0xFF	; 255
   1c7b6:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1c7ba:	b1 cf       	rjmp	.-158    	; 0x1c71e <lcd_language_menu()+0xa>
		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 <lcd_menu_show_sensors_state()>:
                 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 <lcd_timeoutToStatus>
{
	//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_puts_at_P(unsigned char, unsigned char, char const*)>
	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_set_cursor(unsigned char, unsigned char)>
	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 <lcd_print_state(unsigned char) [clone .lto_priv.440]>

	if (MMU2::mmu2.Enabled()) {
   1c7e6:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1c7ea:	81 30       	cpi	r24, 0x01	; 1
   1c7ec:	99 f4       	brne	.+38     	; 0x1c814 <lcd_menu_show_sensors_state()+0x54>
    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 <MMU2::mmu2+0x45>
   1c7f4:	81 11       	cpse	r24, r1
   1c7f6:	01 c0       	rjmp	.+2      	; 0x1c7fa <lcd_menu_show_sensors_state()+0x3a>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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_set_cursor(unsigned char, unsigned char)>
		lcd_print_state(finda_state);
   1c80e:	8c 2f       	mov	r24, r28
   1c810:	0f 94 66 20 	call	0x240cc	; 0x240cc <lcd_print_state(unsigned char) [clone .lto_priv.440]>
   1c814:	c1 e0       	ldi	r28, 0x01	; 1
   1c816:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   1c81a:	81 11       	cpse	r24, r1
   1c81c:	01 c0       	rjmp	.+2      	; 0x1c820 <lcd_menu_show_sensors_state()+0x60>
   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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
	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_set_cursor(unsigned char, unsigned char)>
	lcd_print_state(idler_state);
   1c83a:	8c 2f       	mov	r24, r28
   1c83c:	0f 94 66 20 	call	0x240cc	; 0x240cc <lcd_print_state(unsigned char) [clone .lto_priv.440]>
    //  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_set_cursor(unsigned char, unsigned char)>
    lcd_printf_P(_N("B: %3d     Xd:%6d\n"
   1c848:	80 91 8f 0e 	lds	r24, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   1c84c:	8f 93       	push	r24
   1c84e:	80 91 8e 0e 	lds	r24, 0x0E8E	; 0x800e8e <pat9125_y>
   1c852:	8f 93       	push	r24
   1c854:	80 91 ba 0d 	lds	r24, 0x0DBA	; 0x800dba <pat9125_s>
   1c858:	1f 92       	push	r1
   1c85a:	8f 93       	push	r24
   1c85c:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <pat9125_x+0x1>
   1c860:	8f 93       	push	r24
   1c862:	80 91 95 03 	lds	r24, 0x0395	; 0x800395 <pat9125_x>
   1c866:	8f 93       	push	r24
   1c868:	80 91 b9 0d 	lds	r24, 0x0DB9	; 0x800db9 <pat9125_b>
   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 <lcd_printf_P(char const*, ...)>

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 <menu_back_if_clicked()>

0001c892 <MMU2::MMU2::Start() [clone .constprop.65]>:
    } 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 <avr/interrupt.h>


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 <MMU2::reset()>
    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 <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.148]>
        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 <serialprintlnPGM(char const*)>
    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 <MMU2::mmu2+0x54>
}

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 <serialprintlnPGM(char const*)>

    /// @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 <MMU2::mmu2+0x6f>
    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 <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.309]>

0001c94e <mmu_enable_switch()>:
#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 <eeprom_read_byte>

    if (current_state)
   1c956:	88 23       	and	r24, r24
   1c958:	61 f0       	breq	.+24     	; 0x1c972 <mmu_enable_switch()+0x24>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   1c95a:	10 92 b9 13 	sts	0x13B9, r1	; 0x8013b9 <MMU2::mmu2+0x6f>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   1c962:	10 92 4c 13 	sts	0x134C, r1	; 0x80134c <MMU2::mmu2+0x2>
    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 <eeprom_toggle(unsigned char*)>
    MMU2::mmu2.Status();
   1c96e:	0d 94 da 75 	jmp	0x2ebb4	; 0x2ebb4 <MMU2::MMU2::Status() [clone .constprop.342]>
    {
        MMU2::mmu2.Stop();
    }
    else
    {
        MMU2::mmu2.Start();
   1c972:	0e 94 49 e4 	call	0x1c892	; 0x1c892 <MMU2::MMU2::Start() [clone .constprop.65]>
   1c976:	f7 cf       	rjmp	.-18     	; 0x1c966 <mmu_enable_switch()+0x18>

0001c978 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]>:
//!
//! @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 <MMU2::mmu2+0x6f>
{
    //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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x36>
   1c9a4:	06 e0       	ldi	r16, 0x06	; 6
   1c9a6:	81 30       	cpi	r24, 0x01	; 1
   1c9a8:	29 f0       	breq	.+10     	; 0x1c9b4 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x3c>
   1c9aa:	05 e0       	ldi	r16, 0x05	; 5
   1c9ac:	03 c0       	rjmp	.+6      	; 0x1c9b4 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x3c>
   1c9ae:	04 e0       	ldi	r16, 0x04	; 4
   1c9b0:	81 30       	cpi	r24, 0x01	; 1
   1c9b2:	d9 f3       	breq	.-10     	; 0x1c9aa <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x32>
    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 <lcd_clear()>

	KEEPALIVE_STATE(PAUSED_FOR_USER);
   1c9b8:	84 e0       	ldi	r24, 0x04	; 4
   1c9ba:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
{
    //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_heater()>
        manage_inactivity(true);
   1c9ca:	81 e0       	ldi	r24, 0x01	; 1
   1c9cc:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>

		if (lcd_encoder)
   1c9d0:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   1c9d4:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1c9d8:	00 97       	sbiw	r24, 0x00	; 0
   1c9da:	09 f4       	brne	.+2      	; 0x1c9de <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x66>
   1c9dc:	9d c0       	rjmp	.+314    	; 0x1cb18 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x1a0>
		{
            if (lcd_encoder < 0)
   1c9de:	97 ff       	sbrs	r25, 7
   1c9e0:	88 c0       	rjmp	.+272    	; 0x1caf2 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x17a>
            {
                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 <lcd_encoder+0x1>
   1c9e8:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
		}

		if (cursor_pos > 3)
   1c9ec:	c4 30       	cpi	r28, 0x04	; 4
   1c9ee:	0c f4       	brge	.+2      	; 0x1c9f2 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x7a>
   1c9f0:	86 c0       	rjmp	.+268    	; 0x1cafe <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x186>
		{
            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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x8a>
   1ca00:	7a c0       	rjmp	.+244    	; 0x1caf6 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x17e>
            {
                first++;
   1ca02:	83 94       	inc	r8
                lcd_clear();
   1ca04:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
            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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0xa2>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

        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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0xba>
   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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0xbe>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0xc0>
   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 <lcd_set_cursor(unsigned char, unsigned char)>
   1ca6c:	c3 01       	movw	r24, r6
   1ca6e:	b2 01       	movw	r22, r4
   1ca70:	0e 94 31 70 	call	0xe062	; 0xe062 <lcd_print(long, int) [clone .part.3]>
   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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0xea>
        {
            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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x120>
   1ca88:	a0 16       	cp	r10, r16
   1ca8a:	b1 06       	cpc	r11, r17
   1ca8c:	29 f4       	brne	.+10     	; 0x1ca98 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x120>
   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(unsigned char, unsigned char, char const*)>

        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_puts_at_P(unsigned char, unsigned char, char const*)>
        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 <lcd_putc_at(unsigned char, unsigned char, char)>
        _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 <delay2>

		if (lcd_clicked())
   1caba:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   1cabe:	88 23       	and	r24, r24
   1cac0:	09 f4       	brne	.+2      	; 0x1cac4 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x14c>
   1cac2:	81 cf       	rjmp	.-254    	; 0x1c9c6 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x4e>
		{
		    KEEPALIVE_STATE(IN_HANDLER);
   1cac4:	82 e0       	ldi	r24, 0x02	; 2
   1cac6:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
			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 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x6c>
            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 <Sound_MakeSound(eSOUND_TYPE)>
   1cafc:	85 cf       	rjmp	.-246    	; 0x1ca08 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x90>
            }
        }

        if (cursor_pos < 1)
   1cafe:	c1 11       	cpse	r28, r1
   1cb00:	84 cf       	rjmp	.-248    	; 0x1ca0a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x92>
        {
            cursor_pos = 1;
            if (first > 0)
   1cb02:	18 14       	cp	r1, r8
   1cb04:	2c f4       	brge	.+10     	; 0x1cb10 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x198>
            {
                first--;
   1cb06:	8a 94       	dec	r8
                lcd_clear();
   1cb08:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
            }
        }

        if (cursor_pos < 1)
        {
            cursor_pos = 1;
   1cb0c:	c1 e0       	ldi	r28, 0x01	; 1
   1cb0e:	7d cf       	rjmp	.-262    	; 0x1ca0a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x92>
            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 <Sound_MakeSound(eSOUND_TYPE)>
   1cb16:	fa cf       	rjmp	.-12     	; 0x1cb0c <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x194>
                cursor_pos++;
            }
            lcd_encoder = 0;
		}

		if (cursor_pos > 3)
   1cb18:	c4 30       	cpi	r28, 0x04	; 4
   1cb1a:	0c f0       	brlt	.+2      	; 0x1cb1e <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x1a6>
   1cb1c:	6a cf       	rjmp	.-300    	; 0x1c9f2 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x7a>
   1cb1e:	75 cf       	rjmp	.-278    	; 0x1ca0a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]+0x92>

0001cb20 <lcd_v2_calibration()>:
    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 <MMU2::mmu2+0x6f>
   1cb28:	81 30       	cpi	r24, 0x01	; 1
   1cb2a:	e9 f4       	brne	.+58     	; 0x1cb66 <lcd_v2_calibration()+0x46>
		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 <lang_get_translation>
   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 <lang_get_translation>
			_T(MSG_SELECT_FILAMENT),
			MSG_FILAMENT,_T(MSG_CANCEL));
   1cb3e:	be 01       	movw	r22, r28
   1cb40:	0e 94 bc e4 	call	0x1c978	; 0x1c978 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.50]>
		if (filament < MMU_FILAMENT_COUNT) {
   1cb44:	85 30       	cpi	r24, 0x05	; 5
   1cb46:	98 f5       	brcc	.+102    	; 0x1cbae <lcd_v2_calibration()+0x8e>
			lay1cal_filament = filament;
   1cb48:	80 93 f9 03 	sts	0x03F9, r24	; 0x8003f9 <lay1cal_filament>
			return;
		}
	}
#endif //FILAMENT_SENSOR

	eFilamentAction = FilamentAction::Lay1Cal;
   1cb4c:	8a e0       	ldi	r24, 0x0A	; 10
   1cb4e:	80 93 a5 03 	sts	0x03A5, r24	; 0x8003a5 <eFilamentAction>
	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_goto(void (*)(), int, bool, bool)>
			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 <eeprom_read_byte>
   1cb6e:	81 11       	cpse	r24, r1
   1cb70:	ed cf       	rjmp	.-38     	; 0x1cb4c <lcd_v2_calibration()+0x2c>
	{
		bool loaded = false;
		if (fsensor.isReady()) {
   1cb72:	80 91 a9 17 	lds	r24, 0x17A9	; 0x8017a9 <fsensor>
   1cb76:	82 30       	cpi	r24, 0x02	; 2
   1cb78:	f1 f4       	brne	.+60     	; 0x1cbb6 <lcd_v2_calibration()+0x96>
   1cb7a:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   1cb7e:	81 11       	cpse	r24, r1
   1cb80:	e5 cf       	rjmp	.-54     	; 0x1cb4c <lcd_v2_calibration()+0x2c>
			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 <lang_get_translation>
   1cb8a:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
			lcd_consume_click();
   1cb8e:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
   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 <delay_keep_alive(unsigned int)>
				if (lcd_clicked()) {
   1cb9c:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   1cba0:	81 11       	cpse	r24, r1
   1cba2:	02 c0       	rjmp	.+4      	; 0x1cba8 <lcd_v2_calibration()+0x88>
   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 <lcd_v2_calibration()+0x74>
				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 <lcd_update_enabled>
	}
#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 <menu_back()>
	{
		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 <lang_get_translation>
   1cbbe:	41 e0       	ldi	r20, 0x01	; 1
   1cbc0:	60 e0       	ldi	r22, 0x00	; 0
   1cbc2:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   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 <lcd_update_enabled>
		}

		if (!loaded) {
   1cbd2:	91 11       	cpse	r25, r1
   1cbd4:	bb cf       	rjmp	.-138    	; 0x1cb4c <lcd_v2_calibration()+0x2c>
   1cbd6:	d5 cf       	rjmp	.-86     	; 0x1cb82 <lcd_v2_calibration()+0x62>

0001cbd8 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]>:
{
    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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x26>
   1cbfe:	00 d0       	rcall	.+0      	; 0x1cc00 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x28>
   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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x11c>
   1ccf2:	f4 c0       	rjmp	.+488    	; 0x1cedc <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x304>
   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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x17c>
   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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x21a>
   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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x294>
   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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x2c4>
   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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]+0x120>

0001cee0 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]>:
    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 <thermal_model_reset_enabled(bool) [clone .lto_priv.420]>

    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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]>
   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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]>
   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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0x134>
   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 <printf_P>
        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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0x2de>
            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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0x2ee>
   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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0x2ee>
                // 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 <thermal_model_reset_enabled(bool) [clone .lto_priv.420]>

    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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0x2ee>
   1d1cc:	f9 ce       	rjmp	.-526    	; 0x1cfc0 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0xe0>
            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 <serialprintlnPGM(char const*)>
    *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 <thermal_model_reset_enabled(bool) [clone .lto_priv.420]>
    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 <thermal_model_cal::estimate(unsigned int, float*, float, float, float, unsigned int, unsigned char, float) [clone .constprop.40]+0x2a4>

0001d1fa <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]>:
    // 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 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0xe>
   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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   1d21a:	88 23       	and	r24, r24
   1d21c:	d9 f0       	breq	.+54     	; 0x1d254 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0x5a>
        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 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0x72>
   1d222:	04 31       	cpi	r16, 0x14	; 20
   1d224:	31 f1       	breq	.+76     	; 0x1d272 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0x78>
    /// @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 <modules::protocol::RequestMsg::ComputeCRC8() const>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
        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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   1d250:	88 23       	and	r24, r24
   1d252:	59 f3       	breq	.-42     	; 0x1d22a <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0x30>

    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 <MMU2::mmu2+0x4c>
   1d270:	da cf       	rjmp	.-76     	; 0x1d226 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0x2c>
        break;
    case (uint8_t)Register::Pulley_Slow_Feedrate:
        logic.PlanPulleySlowFeedRate(data);
   1d272:	10 93 97 13 	sts	0x1397, r17	; 0x801397 <MMU2::mmu2+0x4d>
   1d276:	d7 cf       	rjmp	.-82     	; 0x1d226 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]+0x2c>

0001d278 <delayMicroseconds>:
#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 <delayMicroseconds+0x14>

	// 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 <delayMicroseconds+0x10>
		"1: sbiw %0,1" "\n\t" // 2 cycles
		"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
	);
	// return = 4 cycles
}
   1d28c:	08 95       	ret

0001d28e <digitalRead>:

	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 <digitalRead+0x4c>

	// 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 <turnOffPWM>

	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 <digitalRead+0x46>
   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 <digitalRead+0x46>

0001d2e0 <digitalWrite>:
		#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 <digitalWrite+0x50>
   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 <turnOffPWM>

	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 <digitalWrite+0x58>
		*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 <digitalWrite+0x4c>

0001d33c <pinMode>:
#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 <pinMode+0x4e>

	// 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 <pinMode+0x54>
		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 <pinMode+0x4e>

0001d39e <analogWrite>:
// 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 <pinMode>
	if (val == 0)
   1d3ae:	20 97       	sbiw	r28, 0x00	; 0
   1d3b0:	39 f4       	brne	.+14     	; 0x1d3c0 <analogWrite+0x22>
	{
		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 <digitalWrite>
	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 <analogWrite+0x2c>
	{
		digitalWrite(pin, HIGH);
   1d3c6:	61 e0       	ldi	r22, 0x01	; 1
   1d3c8:	f5 cf       	rjmp	.-22     	; 0x1d3b4 <analogWrite+0x16>
	}
	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 <analogWrite+0x3e>
   1d3da:	b3 c0       	rjmp	.+358    	; 0x1d542 <analogWrite+0x1a4>
   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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>

							
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
			#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 <analogWrite+0x78>
				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 <analogWrite+0x1ac>
   1d548:	3e cf       	rjmp	.-388    	; 0x1d3c6 <analogWrite+0x28>
   1d54a:	33 cf       	rjmp	.-410    	; 0x1d3b2 <analogWrite+0x14>

0001d54c <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>:
	}
}

/// 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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x5a>
   1d57a:	e2 16       	cp	r14, r18
   1d57c:	f3 06       	cpc	r15, r19
   1d57e:	99 f4       	brne	.+38     	; 0x1d5a6 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x5a>
		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 <delayMicroseconds>
   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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x13a>
		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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0xfa>
   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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x10c>
   1d64c:	20 97       	sbiw	r28, 0x00	; 0
   1d64e:	21 f0       	breq	.+8      	; 0x1d658 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x10c>
		if (acc > 0)
   1d650:	fc f0       	brlt	.+62     	; 0x1d690 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x144>
			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 <delayMicroseconds>
	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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0xfa>
	/// 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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x10c>

0001d698 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>:
/// 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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x26>
   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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x38>
   1d6ce:	6b c0       	rjmp	.+214    	; 0x1d7a6 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x10e>
   1d6d0:	16 16       	cp	r1, r22
   1d6d2:	17 06       	cpc	r1, r23
   1d6d4:	0c f0       	brlt	.+2      	; 0x1d6d8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x40>
   1d6d6:	67 c0       	rjmp	.+206    	; 0x1d7a6 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x10e>
   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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xf8>
   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 <delayMicroseconds>
	} 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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
   1d7a4:	d8 cf       	rjmp	.-80     	; 0x1d756 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xbe>
/// 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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xcc>

0001d7aa <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]>:
			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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]+0x20>
			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 <sm4_set_dir(unsigned char, unsigned char)>
		}
	}
}

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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]+0x10>
		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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]>:
        //@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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]+0x62>
			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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]+0x4c>
   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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]+0x16>
		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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>:
/// 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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x26>
   1d882:	00 d0       	rcall	.+0      	; 0x1d884 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x28>
   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 <count_position>
   1d88c:	d0 90 b3 06 	lds	r13, 0x06B3	; 0x8006b3 <count_position+0x1>
   1d890:	e0 90 b4 06 	lds	r14, 0x06B4	; 0x8006b4 <count_position+0x2>
   1d894:	f0 90 b5 06 	lds	r15, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <count_position+0x4>
   1d8a2:	90 91 b7 06 	lds	r25, 0x06B7	; 0x8006b7 <count_position+0x5>
   1d8a6:	a0 91 b8 06 	lds	r26, 0x06B8	; 0x8006b8 <count_position+0x6>
   1d8aa:	b0 91 b9 06 	lds	r27, 0x06B9	; 0x8006b9 <count_position+0x7>
   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 <count_position+0x8>
   1d8b6:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   1d8ba:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   1d8be:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_dm>
	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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xc8>
   1d920:	90 e0       	ldi	r25, 0x00	; 0
   1d922:	80 e0       	ldi	r24, 0x00	; 0
   1d924:	90 93 88 06 	sts	0x0688, r25	; 0x800688 <sm4_stop_cb+0x1>
   1d928:	80 93 87 06 	sts	0x0687, r24	; 0x800687 <sm4_stop_cb>
	xyzcal_sm4_delay = delay_us;
   1d92c:	30 93 fd 03 	sts	0x03FD, r19	; 0x8003fd <xyzcal_sm4_delay+0x1>
   1d930:	20 93 fc 03 	sts	0x03FC, r18	; 0x8003fc <xyzcal_sm4_delay>
	//	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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xee>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xfa>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x104>
   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 <sqrt>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x168>
   1d9c2:	47 c0       	rjmp	.+142    	; 0x1da52 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1f6>
		if (sm4_stop_cb && (*sm4_stop_cb)()) break;
   1d9c4:	e0 91 87 06 	lds	r30, 0x0687	; 0x800687 <sm4_stop_cb>
   1d9c8:	f0 91 88 06 	lds	r31, 0x0688	; 0x800688 <sm4_stop_cb+0x1>
   1d9cc:	30 97       	sbiw	r30, 0x00	; 0
   1d9ce:	e9 f5       	brne	.+122    	; 0x1da4a <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1ee>
		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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x18c>
			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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x19e>
			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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1ba>
			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 <sm4_calc_delay_cb>
   1da2c:	f0 91 84 06 	lds	r31, 0x0684	; 0x800684 <sm4_calc_delay_cb+0x1>
   1da30:	30 97       	sbiw	r30, 0x00	; 0
   1da32:	d1 f1       	breq	.+116    	; 0x1daa8 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x24c>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1e6>
   1da3e:	0e 94 3c e9 	call	0x1d278	; 0x1d278 <delayMicroseconds>
		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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x160>
	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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1f6>
   1da50:	bf cf       	rjmp	.-130    	; 0x1d9d0 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x174>
		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 <sm4_update_pos_cb>
   1da56:	f0 91 86 06 	lds	r31, 0x0686	; 0x800686 <sm4_update_pos_cb+0x1>
   1da5a:	30 97       	sbiw	r30, 0x00	; 0
   1da5c:	41 f0       	breq	.+16     	; 0x1da6e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x212>
		(*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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x21a>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1e2>

0001daae <spi_txrx.lto_priv.531>:
}

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 <spi_txrx.lto_priv.531+0x2>
	return SPDR;
   1dab6:	8e b5       	in	r24, 0x2e	; 46
}
   1dab8:	08 95       	ret

0001daba <xflash_wait_busy>:
	_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 <spi_txrx.lto_priv.531>
	uint8_t val = _SPI_RX();             // receive value
   1dac2:	8f ef       	ldi	r24, 0xFF	; 255
   1dac4:	0e 94 57 ed 	call	0x1daae	; 0x1daae <spi_txrx.lto_priv.531>
	_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 <xflash_wait_busy>
}
   1dace:	08 95       	ret

0001dad0 <xflash_send_cmdaddr>:
	_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_txrx.lto_priv.531>
	_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_txrx.lto_priv.531>
	_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_txrx.lto_priv.531>
	_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 <spi_txrx.lto_priv.531>

0001daf6 <xflash_erase>:
	_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 <xflash_send_cmdaddr>
	_CS_HIGH();
   1dafc:	45 9a       	sbi	0x08, 5	; 8
}
   1dafe:	08 95       	ret

0001db00 <xflash_page_program>:
		*(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 <xflash_send_cmdaddr>
   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 <xflash_page_program+0x38>
		_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 <spi_txrx.lto_priv.531>
   1db3e:	f1 cf       	rjmp	.-30     	; 0x1db22 <xflash_page_program+0x22>

0001db40 <xflash_rd_data>:
	_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 <xflash_send_cmdaddr>
   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 <xflash_rd_data+0x38>
		*(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 <spi_txrx.lto_priv.531>
   1db7e:	89 93       	st	Y+, r24
   1db80:	f0 cf       	rjmp	.-32     	; 0x1db62 <xflash_rd_data+0x22>

0001db82 <xfdump_check_state(dump_crash_reason*)>:
#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 <xfdump_check_state(dump_crash_reason*)+0xa>
   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 <xflash_rd_data>
                   (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 <xfdump_check_state(dump_crash_reason*)+0x5c>
        return false;

    if (reason)
   1dbc2:	01 15       	cp	r16, r1
   1dbc4:	11 05       	cpc	r17, r1
   1dbc6:	49 f0       	breq	.+18     	; 0x1dbda <xfdump_check_state(dump_crash_reason*)+0x58>
    {
        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 <xflash_rd_data>
                       (uint8_t*)reason, sizeof(*reason));
    }
    return true;
   1dbda:	81 e0       	ldi	r24, 0x01	; 1
   1dbdc:	01 c0       	rjmp	.+2      	; 0x1dbe0 <xfdump_check_state(dump_crash_reason*)+0x5e>

    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 <xflash_enable_wr>:
	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 <spi_txrx.lto_priv.531>
	_CS_HIGH();
   1dbfa:	45 9a       	sbi	0x08, 5	; 8
}
   1dbfc:	08 95       	ret

0001dbfe <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)>:
    }
}


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 <xflash_enable_wr>
	_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_erase>
        xflash_sector_erase(addr);
        xflash_wait_busy();
   1dc42:	0e 94 5d ed 	call	0x1daba	; 0x1daba <xflash_wait_busy>

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 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)+0x36>

    // 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 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)+0x68>
   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_enable_wr>
    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_page_program>
    xflash_wait_busy();
   1dc8c:	0e 94 5d ed 	call	0x1daba	; 0x1daba <xflash_wait_busy>

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 <xflash_enable_wr>
        _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 <xflash_send_cmdaddr>
   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 <spi_txrx.lto_priv.531>
            if(!--cnt || !(++addr & 0xFF))
   1dcaa:	01 50       	subi	r16, 0x01	; 1
   1dcac:	11 09       	sbc	r17, r1
   1dcae:	41 f0       	breq	.+16     	; 0x1dcc0 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)+0xc2>
   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 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)+0xa4>
            {
                // 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 <xflash_wait_busy>
	_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 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)+0x92>

    // 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 <xfdump_full_dump_and_reset(dump_crash_reason)>:
                     (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 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)>

    // force a reset even sooner
    softReset();
   1dd42:	0e 94 e4 66 	call	0xcdc8	; 0xcdc8 <softReset>

0001dd46 <xfdump_dump()>:
    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 <xfdump_dump_core(dump_header_t&, unsigned long, unsigned char*, unsigned int)>
                     (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 <xflash_init>:

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 <spi_txrx.lto_priv.531>
	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 <spi_txrx.lto_priv.531>
   1ddba:	80 e0       	ldi	r24, 0x00	; 0
   1ddbc:	0e 94 57 ed 	call	0x1daae	; 0x1daae <spi_txrx.lto_priv.531>
   1ddc0:	80 e0       	ldi	r24, 0x00	; 0
   1ddc2:	0e 94 57 ed 	call	0x1daae	; 0x1daae <spi_txrx.lto_priv.531>
	uint8_t xflash_mfrid = _SPI_RX();  // receive mfrid
   1ddc6:	8f ef       	ldi	r24, 0xFF	; 255
   1ddc8:	0e 94 57 ed 	call	0x1daae	; 0x1daae <spi_txrx.lto_priv.531>
   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 <spi_txrx.lto_priv.531>
   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 <xflash_init+0x40>
   1dddc:	c8 3c       	cpi	r28, 0xC8	; 200
   1ddde:	19 f4       	brne	.+6      	; 0x1dde6 <xflash_init+0x46>
   1dde0:	81 e0       	ldi	r24, 0x01	; 1
   1dde2:	91 31       	cpi	r25, 0x11	; 17
   1dde4:	09 f0       	breq	.+2      	; 0x1dde8 <xflash_init+0x48>
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 <calibration_status_clear(unsigned char)>:
    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 <eeprom_read_byte>
    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 <eeprom_update_byte>

0001de08 <lcd_reset_sheet()>:
        }
    }
}

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 <lcd_reset_sheet()+0x8>
   1de10:	00 d0       	rcall	.+0      	; 0x1de12 <lcd_reset_sheet()+0xa>
   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 <selected_sheet>
   1de24:	0e 94 09 76 	call	0xec12	; 0xec12 <eeprom_default_sheet_name(unsigned char, SheetName&)>
	eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),EEPROM_EMPTY_VALUE16);
   1de28:	80 91 e0 03 	lds	r24, 0x03E0	; 0x8003e0 <selected_sheet>
   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_word>
	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 <selected_sheet>
   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 <eeprom_update_block>
	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 <eeprom_read_byte>
   1de62:	90 91 e0 03 	lds	r25, 0x03E0	; 0x8003e0 <selected_sheet>
   1de66:	89 13       	cpse	r24, r25
   1de68:	0a c0       	rjmp	.+20     	; 0x1de7e <lcd_reset_sheet()+0x76>
	{
        eeprom_switch_to_next_sheet();
   1de6a:	0e 94 fb 75 	call	0xebf6	; 0xebf6 <eeprom_switch_to_next_sheet()>
        if (-1 == eeprom_next_initialized_sheet(0))
   1de6e:	80 e0       	ldi	r24, 0x00	; 0
   1de70:	0e 94 e7 75 	call	0xebce	; 0xebce <eeprom_next_initialized_sheet(signed char)>
   1de74:	8f 3f       	cpi	r24, 0xFF	; 255
   1de76:	19 f4       	brne	.+6      	; 0x1de7e <lcd_reset_sheet()+0x76>
            calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
   1de78:	80 e1       	ldi	r24, 0x10	; 16
   1de7a:	0e 94 f6 ee 	call	0x1ddec	; 0x1ddec <calibration_status_clear(unsigned char)>
	}

	menu_back();
   1de7e:	0f 94 52 d4 	call	0x3a8a4	; 0x3a8a4 <menu_back()>
}
   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 <calibration_status_set(unsigned char)>:
    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 <eeprom_read_byte>
    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 <eeprom_update_byte>

0001deb0 <calibration_status_get(unsigned char)>:
    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 <eeprom_read_byte>
    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 <lcd_first_layer_calibration_reset()>:
//! |>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 <lcd_first_layer_calibration_reset()+0x16>
   1dee0:	00 d0       	rcall	.+0      	; 0x1dee2 <lcd_first_layer_calibration_reset()+0x18>
   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 <lcd_click_trigger>
   1deec:	81 11       	cpse	r24, r1
   1deee:	18 c0       	rjmp	.+48     	; 0x1df20 <lcd_first_layer_calibration_reset()+0x56>
        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 <eeprom_read_byte>
   1def8:	18 2f       	mov	r17, r24
   1defa:	0e 94 d9 75 	call	0xebb2	; 0xebb2 <eeprom_is_sheet_initialized(unsigned char)>
   1defe:	88 23       	and	r24, r24
   1df00:	79 f0       	breq	.+30     	; 0x1df20 <lcd_first_layer_calibration_reset()+0x56>
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
   1df02:	80 e1       	ldi	r24, 0x10	; 16
   1df04:	0e 94 58 ef 	call	0x1deb0	; 0x1deb0 <calibration_status_get(unsigned char)>
        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 <lcd_first_layer_calibration_reset()+0x56>
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
            (0 == static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>
            (&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<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>
   1df14:	80 5b       	subi	r24, 0xB0	; 176
   1df16:	92 4f       	sbci	r25, 0xF2	; 242
   1df18:	0f 94 1e dc 	call	0x3b83c	; 0x3b83c <eeprom_read_word>
    } 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 <lcd_first_layer_calibration_reset()+0x92>
            (0 == static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>
            (&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 <menu_data>
   1df24:	88 23       	and	r24, r24
   1df26:	71 f0       	breq	.+28     	; 0x1df44 <lcd_first_layer_calibration_reset()+0x7a>
        {
            eeprom_update_word_notify(reinterpret_cast<uint16_t*>(&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 <eeprom_read_byte>
   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 <eeprom_update_word>
        }

        // 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 <lcd_clicked()>
   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 <menu_goto(void (*)(), int, bool, bool)>
    }

    if (lcd_encoder) {
   1df5c:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   1df60:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1df64:	21 15       	cp	r18, r1
   1df66:	31 05       	cpc	r19, r1
   1df68:	59 f0       	breq	.+22     	; 0x1df80 <lcd_first_layer_calibration_reset()+0xb6>
        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 <lcd_first_layer_calibration_reset()+0xaa>
   1df72:	80 e0       	ldi	r24, 0x00	; 0
   1df74:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
        lcd_encoder = 0; // Reset
   1df78:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   1df7c:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
    }

    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 <eeprom_read_byte>
   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 <eeprom_read_block>
    lcd_home();
   1dfa2:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    float offset = static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>(&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 <eeprom_read_byte>
   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 <eeprom_read_word>
   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 <cs+0xc>
   1dfcc:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   1dfd0:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   1dfd4:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <menu_data>
   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 <lcd_first_layer_calibration_reset()+0x12a>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
   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 <activate_calibrate_sheet()>:
        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 <selected_sheet>
   1e048:	81 ea       	ldi	r24, 0xA1	; 161
   1e04a:	9d e0       	ldi	r25, 0x0D	; 13
   1e04c:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>

//! @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 <lcd_first_layer_calibration_reset()>

0001e054 <parse_version(char const*, unsigned int*)>:
    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 <Number(char const*, unsigned int*)>
        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 <parse_version(char const*, unsigned int*)+0x16>
            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_version(char const*, unsigned int*)+0x7e>

// 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 <Number(char const*, unsigned int*)>
        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 <parse_version(char const*, unsigned int*)+0x12>
            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 <Number(char const*, unsigned int*)>

    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 <parse_version(char const*, unsigned int*)+0xbc>
   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 <parse_version(char const*, unsigned int*)+0xbc>
   1e0a8:	9d 30       	cpi	r25, 0x0D	; 13
   1e0aa:	91 f1       	breq	.+100    	; 0x1e110 <parse_version(char const*, unsigned int*)+0xbc>
    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 <parse_version(char const*, unsigned int*)+0x42>
//    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 <parse_version(char const*, unsigned int*)+0x9c>
   1e0b8:	7c f4       	brge	.+30     	; 0x1e0d8 <parse_version(char const*, unsigned int*)+0x84>
   1e0ba:	91 34       	cpi	r25, 0x41	; 65
   1e0bc:	a1 f6       	brne	.-88     	; 0x1e066 <parse_version(char const*, unsigned int*)+0x12>
        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 <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)>
//    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 <parse_version(char const*, unsigned int*)+0xac>
   1e0dc:	92 35       	cpi	r25, 0x52	; 82
   1e0de:	19 f6       	brne	.-122    	; 0x1e066 <parse_version(char const*, unsigned int*)+0x12>
        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 <parse_version(char const*, unsigned int*)+0x78>
        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 <parse_version(char const*, unsigned int*)+0x78>
        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 <parse_version(char const*, unsigned int*)+0x78>

    // 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 <parse_version(char const*, unsigned int*)+0x7e>

0001e114 <UserECoolEnabled()>:
/// (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>
        && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 );
   1e11c:	8a 32       	cpi	r24, 0x2A	; 42
   1e11e:	39 f4       	brne	.+14     	; 0x1e12e <UserECoolEnabled()+0x1a>
   1e120:	8a e2       	ldi	r24, 0x2A	; 42
   1e122:	9d e0       	ldi	r25, 0x0D	; 13
   1e124:	0f 94 10 dc 	call	0x3b820	; 0x3b820 <eeprom_read_byte>
   1e128:	91 e0       	ldi	r25, 0x01	; 1
   1e12a:	81 30       	cpi	r24, 0x01	; 1
   1e12c:	09 f0       	breq	.+2      	; 0x1e130 <UserECoolEnabled()+0x1c>
   1e12e:	90 e0       	ldi	r25, 0x00	; 0
}
   1e130:	89 2f       	mov	r24, r25
   1e132:	08 95       	ret

0001e134 <lcd_experimental_menu()>:
}
#endif //PRUSA_SN_SUPPORT

void lcd_experimental_menu()
{
    MENU_BEGIN();
   1e134:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1e138:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1e13c:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1e140:	84 30       	cpi	r24, 0x04	; 4
   1e142:	70 f5       	brcc	.+92     	; 0x1e1a0 <lcd_experimental_menu()+0x6c>
   1e144:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <lang_get_translation>
   1e150:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
#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 <UserECoolEnabled()>
   1e158:	88 23       	and	r24, r24
   1e15a:	f9 f0       	breq	.+62     	; 0x1e19a <lcd_experimental_menu()+0x66>
   1e15c:	81 e5       	ldi	r24, 0x51	; 81
   1e15e:	9c e5       	ldi	r25, 0x5C	; 92
   1e160:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#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 <menu_item_function_P(char const*, void (*)())>
#endif //PRUSA_SN_SUPPORT
    MENU_END();
   1e180:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
}
#endif //PRUSA_SN_SUPPORT

void lcd_experimental_menu()
{
    MENU_BEGIN();
   1e184:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1e188:	8f 5f       	subi	r24, 0xFF	; 255
   1e18a:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1e18e:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1e192:	8f 5f       	subi	r24, 0xFF	; 255
   1e194:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1e198:	d1 cf       	rjmp	.-94     	; 0x1e13c <lcd_experimental_menu()+0x8>
#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 <lcd_experimental_menu()+0x2c>

#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 <UserECool_toggle()>:
	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 <UserECoolEnabled()>
   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 <UserECool_toggle()+0x10>
   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 <eeprom_update_byte>
        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 <tmc2130_init(TMCInitParams)>

0001e1c6 <lcd_silent_mode_set()>:
    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 <SilentModeMenu>
   1e1ca:	81 11       	cpse	r24, r1
   1e1cc:	3c c0       	rjmp	.+120    	; 0x1e246 <lcd_silent_mode_set()+0x80>
#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 <SilentModeMenu>
   1e1d4:	60 91 a2 03 	lds	r22, 0x03A2	; 0x8003a2 <SilentModeMenu>
   1e1d8:	8f ef       	ldi	r24, 0xFF	; 255
   1e1da:	9f e0       	ldi	r25, 0x0F	; 15
   1e1dc:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
  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 <block_buffer_head>
   1e1e4:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
	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_silent_mode_set()+0x36>
  {
      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 <lang_get_translation>
   1e1f4:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
      // 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 <st_synchronize()>
  }
  tmc2130_wait_standstill_xy(1000);
   1e1fc:	0f 94 0c 88 	call	0x31018	; 0x31018 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]>
  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 <SilentModeMenu>
   1e208:	91 11       	cpse	r25, r1
   1e20a:	01 c0       	rjmp	.+2      	; 0x1e20e <lcd_silent_mode_set()+0x48>
   1e20c:	80 e0       	ldi	r24, 0x00	; 0
   1e20e:	80 93 8b 06 	sts	0x068B, r24	; 0x80068b <tmc2130_mode>
  update_mode_profile();
   1e212:	0f 94 98 64 	call	0x2c930	; 0x2c930 <update_mode_profile()>
    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 <UserECoolEnabled()>

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 <tmc2130_init(TMCInitParams)>
  // 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 <st_reset_timer()>
  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 <eeprom_read_byte>
   1e230:	88 23       	and	r24, r24
   1e232:	61 f0       	breq	.+24     	; 0x1e24c <lcd_silent_mode_set()+0x86>
   1e234:	80 91 a2 03 	lds	r24, 0x03A2	; 0x8003a2 <SilentModeMenu>
   1e238:	88 23       	and	r24, r24
   1e23a:	41 f0       	breq	.+16     	; 0x1e24c <lcd_silent_mode_set()+0x86>
	  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 <menu_submenu(void (*)(), bool)>

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 <SilentModeMenu>
   1e24a:	c4 cf       	rjmp	.-120    	; 0x1e1d4 <lcd_silent_mode_set()+0xe>

#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_settings_linearity_correction_menu()>:
	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 <menu_start()>
   1e260:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   1e264:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1e268:	84 30       	cpi	r24, 0x04	; 4
   1e26a:	08 f0       	brcs	.+2      	; 0x1e26e <lcd_settings_linearity_correction_menu()+0x20>
   1e26c:	66 c0       	rjmp	.+204    	; 0x1e33a <lcd_settings_linearity_correction_menu()+0xec>
   1e26e:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    ON_MENU_LEAVE(
   1e272:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   1e276:	88 23       	and	r24, r24
   1e278:	e9 f0       	breq	.+58     	; 0x1e2b4 <lcd_settings_linearity_correction_menu()+0x66>
   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 <lcd_settings_linearity_correction_menu()+0x3e>
            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 <eeprom_update_byte>
   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 <lcd_settings_linearity_correction_menu()+0x34>
    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 <UserECoolEnabled()>
   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 <tmc2130_init(TMCInitParams)>
{
	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 <lang_get_translation>
   1e2bc:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
#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 <lang_get_translation>
   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_P(char const*, void*, unsigned char, int, int, int)>
	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 <lang_get_translation>
   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_P(char const*, void*, unsigned char, int, int, int)>
	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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#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 <lang_get_translation>
   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_item_edit_P(char const*, void*, unsigned char, int, int, int)>
	MENU_END();
   1e320:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
}

#ifdef TMC2130
void lcd_settings_linearity_correction_menu(void)
{
	MENU_BEGIN();
   1e324:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   1e328:	8f 5f       	subi	r24, 0xFF	; 255
   1e32a:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1e32e:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1e332:	8f 5f       	subi	r24, 0xFF	; 255
   1e334:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1e338:	95 cf       	rjmp	.-214    	; 0x1e264 <lcd_settings_linearity_correction_menu()+0x16>
	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 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>:
}

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 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]+0x2a>
        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 <strncpy_P>
    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 <serialprintlnPGM(char const*)>

    // 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 <lcd_draw_update>
}
   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 <strncpy>
   1e37e:	ee cf       	rjmp	.-36     	; 0x1e35c <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]+0x12>

0001e380 <lcd_message_check(unsigned char) [clone .lto_priv.486]>:
}

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 <lcd_message_check(unsigned char) [clone .lto_priv.486]+0x28>
        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 <lcd_message_check(unsigned char) [clone .lto_priv.486]+0x24>
}

template<typename T>
bool Timer<T>::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 <lcd_message_check(unsigned char) [clone .lto_priv.486]+0x28>
   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 <Timer<unsigned long>::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_setalertstatuspgm(char const*, unsigned char)>:
{
    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 <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1e3c0:	88 23       	and	r24, r24
   1e3c2:	e9 f0       	breq	.+58     	; 0x1e3fe <lcd_setalertstatuspgm(char const*, unsigned char)+0x52>
        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 <strcmp_P>
   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 <Timer<unsigned long>::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_type>
        custom_message_state = 0;
   1e3e0:	10 92 f6 03 	sts	0x03F6, r1	; 0x8003f6 <custom_message_state>
        if (!same) {
   1e3e4:	ef 28       	or	r14, r15
   1e3e6:	59 f0       	breq	.+22     	; 0x1e3fe <lcd_setalertstatuspgm(char const*, unsigned char)+0x52>
            // 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 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
}

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 <lcd_return_to_status()>
}

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 <lcd_setstatus_serial(char const*)>:
    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 <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1e416:	88 23       	and	r24, r24
   1e418:	21 f0       	breq	.+8      	; 0x1e422 <lcd_setstatus_serial(char const*)+0x18>
        lcd_updatestatus(message);
   1e41a:	60 e0       	ldi	r22, 0x00	; 0
   1e41c:	ce 01       	movw	r24, r28
   1e41e:	0e 94 a5 f1 	call	0x1e34a	; 0x1e34a <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
    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 <MarlinSerial::println(char const*)>

0001e42c <lcd_setstatuspgm(char const*)>:
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 <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1e438:	88 23       	and	r24, r24
   1e43a:	31 f0       	breq	.+12     	; 0x1e448 <lcd_setstatuspgm(char const*)+0x1c>
        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 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
}
   1e448:	df 91       	pop	r29
   1e44a:	cf 91       	pop	r28
   1e44c:	08 95       	ret

0001e44e <lcd_sdcard_menu()>:
    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 <menu_data>
   1e486:	81 30       	cpi	r24, 0x01	; 1
   1e488:	31 f1       	breq	.+76     	; 0x1e4d6 <lcd_sdcard_menu()+0x88>
   1e48a:	30 f0       	brcs	.+12     	; 0x1e498 <lcd_sdcard_menu()+0x4a>
   1e48c:	82 30       	cpi	r24, 0x02	; 2
   1e48e:	09 f4       	brne	.+2      	; 0x1e492 <lcd_sdcard_menu()+0x44>
   1e490:	7d c2       	rjmp	.+1274   	; 0x1e98c <lcd_sdcard_menu()+0x53e>
			{
				_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 <menu_data>
   1e496:	fe c0       	rjmp	.+508    	; 0x1e694 <lcd_sdcard_menu()+0x246>

	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 <card+0x51>
   1e49c:	88 23       	and	r24, r24
   1e49e:	49 f0       	breq	.+18     	; 0x1e4b2 <lcd_sdcard_menu()+0x64>
			{
				card.presort_flag = false;
   1e4a0:	10 92 de 14 	sts	0x14DE, r1	; 0x8014de <card+0x51>
				lcd_update_enabled = false;
   1e4a4:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
				card.presort();
   1e4a8:	0f 94 89 7d 	call	0x2fb12	; 0x2fb12 <CardReader::presort() [clone .constprop.218]>
				lcd_update_enabled = true;
   1e4ac:	81 e0       	ldi	r24, 0x01	; 1
   1e4ae:	80 93 6e 02 	sts	0x026E, r24	; 0x80026e <lcd_update_enabled>
			}
			_md->fileCnt = card.getnrfilenames();
   1e4b2:	0f 94 cb 7a 	call	0x2f596	; 0x2f596 <CardReader::getnrfilenames() [clone .constprop.260]>
   1e4b6:	90 93 af 03 	sts	0x03AF, r25	; 0x8003af <menu_data+0x8>
   1e4ba:	80 93 ae 03 	sts	0x03AE, r24	; 0x8003ae <menu_data+0x7>
			_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 <eeprom_read_byte>
   1e4c6:	80 93 b1 03 	sts	0x03B1, r24	; 0x8003b1 <menu_data+0xa>
			_md->menuState = _standard;
   1e4ca:	81 e0       	ldi	r24, 0x01	; 1
   1e4cc:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
			_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 <menu_data+0x9>
		}
		// 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 <menu_data+0xb>
   1e4da:	81 11       	cpse	r24, r1
   1e4dc:	07 c0       	rjmp	.+14     	; 0x1e4ec <lcd_sdcard_menu()+0x9e>
			{
				_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 <Timer<unsigned short>::start()>
				lcd_draw_update = 1;
   1e4e6:	81 e0       	ldi	r24, 0x01	; 1
   1e4e8:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
			}
			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 <lcd_draw_update>
   1e4f0:	81 11       	cpse	r24, r1
   1e4f2:	21 c0       	rjmp	.+66     	; 0x1e536 <lcd_sdcard_menu()+0xe8>
   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 <Timer<unsigned short>::expired(unsigned short)>
   1e500:	88 23       	and	r24, r24
   1e502:	a1 f0       	breq	.+40     	; 0x1e52c <lcd_sdcard_menu()+0xde>
   1e504:	80 91 b0 03 	lds	r24, 0x03B0	; 0x8003b0 <menu_data+0x9>
   1e508:	8f 3f       	cpi	r24, 0xFF	; 255
   1e50a:	81 f0       	breq	.+32     	; 0x1e52c <lcd_sdcard_menu()+0xde>
			{
				_md->menuState = _scrolling;
   1e50c:	82 e0       	ldi	r24, 0x02	; 2
   1e50e:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
				_md->offset = 0;
   1e512:	10 92 a8 03 	sts	0x03A8, r1	; 0x8003a8 <menu_data+0x1>
				_md->scrollPointer = NULL;
   1e516:	10 92 ab 03 	sts	0x03AB, r1	; 0x8003ab <menu_data+0x4>
   1e51a:	10 92 aa 03 	sts	0x03AA, r1	; 0x8003aa <menu_data+0x3>
				_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 <Timer<unsigned short>::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 <lcd_draw_update>
			}
			if (lcd_draw_update == 0 && !lcd_clicked())
   1e52c:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   1e530:	88 23       	and	r24, r24
   1e532:	09 f4       	brne	.+2      	; 0x1e536 <lcd_sdcard_menu()+0xe8>
   1e534:	ab c0       	rjmp	.+342    	; 0x1e68c <lcd_sdcard_menu()+0x23e>
				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 <menu_data+0x9>

			//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 <Timer<unsigned short>::start()>

			MENU_BEGIN();
   1e544:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   1e548:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
  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 <menu_row>
   1e55e:	84 30       	cpi	r24, 0x04	; 4
   1e560:	08 f0       	brcs	.+2      	; 0x1e564 <lcd_sdcard_menu()+0x116>
   1e562:	98 c0       	rjmp	.+304    	; 0x1e694 <lcd_sdcard_menu()+0x246>
   1e564:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
			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 <bMain>
   1e56c:	88 23       	and	r24, r24
   1e56e:	09 f4       	brne	.+2      	; 0x1e572 <lcd_sdcard_menu()+0x124>
   1e570:	aa c0       	rjmp	.+340    	; 0x1e6c6 <lcd_sdcard_menu()+0x278>
   1e572:	8b e3       	ldi	r24, 0x3B	; 59
   1e574:	98 e4       	ldi	r25, 0x48	; 72
   1e576:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   1e57a:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
  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 <SdBaseFile::getFilename(char*)>
			card.getWorkDirName();
			if (card.filename[0] == '/')
   1e58a:	80 91 91 14 	lds	r24, 0x1491	; 0x801491 <card+0x4>
   1e58e:	8f 32       	cpi	r24, 0x2F	; 47
   1e590:	09 f0       	breq	.+2      	; 0x1e594 <lcd_sdcard_menu()+0x146>
   1e592:	9c c0       	rjmp	.+312    	; 0x1e6cc <lcd_sdcard_menu()+0x27e>
			{
#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 <card+0x273>
   1e598:	88 23       	and	r24, r24
   1e59a:	41 f0       	breq	.+16     	; 0x1e5ac <lcd_sdcard_menu()+0x15e>
					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 <lang_get_translation>
   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 <menu_item_function_P(char const*, void (*)())>

			for (uint16_t i = _md->fileCnt; i-- > 0;) // Every file, from top to bottom.
   1e5ac:	c0 90 ae 03 	lds	r12, 0x03AE	; 0x8003ae <menu_data+0x7>
   1e5b0:	d0 90 af 03 	lds	r13, 0x03AF	; 0x8003af <menu_data+0x8>
	}
	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 <lcd_sdcard_menu()+0x172>
   1e5be:	d9 c1       	rjmp	.+946    	; 0x1e972 <lcd_sdcard_menu()+0x524>
			{
				if (menu_item == menu_line) //If the file is on the screen.
   1e5c0:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   1e5c4:	90 91 13 05 	lds	r25, 0x0513	; 0x800513 <menu_line>
   1e5c8:	89 13       	cpse	r24, r25
   1e5ca:	cf c1       	rjmp	.+926    	; 0x1e96a <lcd_sdcard_menu()+0x51c>
				{
					//load filename to memory.
#ifdef SDCARD_SORT_ALPHA
					card.getfilename_sorted(i, _md->sdSort);
   1e5cc:	60 91 b1 03 	lds	r22, 0x03B1	; 0x8003b1 <menu_data+0xa>
   1e5d0:	c6 01       	movw	r24, r12
   1e5d2:	0f 94 f7 85 	call	0x30bee	; 0x30bee <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]>
#else
					card.getfilename(i);
#endif
					if (lcd_encoder == menu_item) //If the file is selected.
   1e5d6:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   1e5da:	90 e0       	ldi	r25, 0x00	; 0
   1e5dc:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   1e5e0:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1e5e4:	10 91 db 14 	lds	r17, 0x14DB	; 0x8014db <card+0x4e>
   1e5e8:	82 17       	cp	r24, r18
   1e5ea:	93 07       	cpc	r25, r19
   1e5ec:	51 f4       	brne	.+20     	; 0x1e602 <lcd_sdcard_menu()+0x1b4>
					{

						_md->selectedFileID = i;
   1e5ee:	d0 92 ad 03 	sts	0x03AD, r13	; 0x8003ad <menu_data+0x6>
   1e5f2:	c0 92 ac 03 	sts	0x03AC, r12	; 0x8003ac <menu_data+0x5>
						_md->isDir = card.filenameIsDir;
   1e5f6:	10 93 a9 03 	sts	0x03A9, r17	; 0x8003a9 <menu_data+0x2>
						_md->row = menu_row;
   1e5fa:	40 91 11 05 	lds	r20, 0x0511	; 0x800511 <menu_row>
   1e5fe:	40 93 b0 03 	sts	0x03B0, r20	; 0x8003b0 <menu_data+0x9>
   1e602:	40 91 6d 02 	lds	r20, 0x026D	; 0x80026d <lcd_draw_update>
					}
					if (card.filenameIsDir)
   1e606:	11 23       	and	r17, r17
   1e608:	09 f4       	brne	.+2      	; 0x1e60c <lcd_sdcard_menu()+0x1be>
   1e60a:	65 c0       	rjmp	.+202    	; 0x1e6d6 <lcd_sdcard_menu()+0x288>
#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_sdcard_menu()+0x1fc>
	{
		lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl);
   1e610:	40 91 a6 14 	lds	r20, 0x14A6	; 0x8014a6 <card+0x19>
   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 <lcd_sdcard_menu()+0x1da>
   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 <menu_row>
}

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 <lcd_sdcard_menu()+0x1e8>
   1e634:	40 e2       	ldi	r20, 0x20	; 32
   1e636:	80 e0       	ldi	r24, 0x00	; 0
   1e638:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_putc(LCD_STR_FOLDER[0]);
   1e63c:	85 e8       	ldi	r24, 0x85	; 133
   1e63e:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
    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 <lcd_print_pad(char const*, unsigned char)>
   1e64a:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
{
	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 <menu_clicked>
   1e652:	99 23       	and	r25, r25
   1e654:	09 f4       	brne	.+2      	; 0x1e658 <lcd_sdcard_menu()+0x20a>
   1e656:	89 c1       	rjmp	.+786    	; 0x1e96a <lcd_sdcard_menu()+0x51c>
   1e658:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   1e65c:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1e660:	82 17       	cp	r24, r18
   1e662:	13 06       	cpc	r1, r19
   1e664:	09 f0       	breq	.+2      	; 0x1e668 <lcd_sdcard_menu()+0x21a>
   1e666:	81 c1       	rjmp	.+770    	; 0x1e96a <lcd_sdcard_menu()+0x51c>
	{
		lcd_update_enabled = false;
   1e668:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
  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 <CardReader::chdir(char const*, bool) [clone .constprop.224]>
	lcd_encoder = 0;
   1e676:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   1e67a:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
	menu_data_reset(); //Forces reloading of cached variables.
   1e67e:	0f 94 ac d1 	call	0x3a358	; 0x3a358 <menu_data_reset()>
	}
	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 <lcd_update_enabled>
		menu_item_ret();
   1e686:	0f 94 70 d0 	call	0x3a0e0	; 0x3a0e0 <menu_item_ret()>
   1e68a:	95 cf       	rjmp	.-214    	; 0x1e5b6 <lcd_sdcard_menu()+0x168>
				_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 <lcd_clicked()>
   1e690:	81 11       	cpse	r24, r1
   1e692:	51 cf       	rjmp	.-350    	; 0x1e536 <lcd_sdcard_menu()+0xe8>
				_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 <lcd_sdcard_menu()+0x128>
				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 <lcd_sdcard_menu()+0x15a>
	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_sdcard_menu()+0x2c0>
	{
		lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl);
   1e6da:	40 91 a6 14 	lds	r20, 0x14A6	; 0x8014a6 <card+0x19>
   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 <lcd_sdcard_menu()+0x2a4>
   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 <menu_row>
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 <lcd_sdcard_menu()+0x2b2>
   1e6fe:	40 e2       	ldi	r20, 0x20	; 32
   1e700:	80 e0       	ldi	r24, 0x00	; 0
   1e702:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    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 <lcd_print_pad(char const*, unsigned char)>
   1e70e:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
{
	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 <menu_clicked>
   1e716:	99 23       	and	r25, r25
   1e718:	09 f4       	brne	.+2      	; 0x1e71c <lcd_sdcard_menu()+0x2ce>
   1e71a:	27 c1       	rjmp	.+590    	; 0x1e96a <lcd_sdcard_menu()+0x51c>
   1e71c:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   1e720:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   1e724:	82 17       	cp	r24, r18
   1e726:	13 06       	cpc	r1, r19
   1e728:	09 f0       	breq	.+2      	; 0x1e72c <lcd_sdcard_menu()+0x2de>
   1e72a:	1f c1       	rjmp	.+574    	; 0x1e96a <lcd_sdcard_menu()+0x51c>
	{
		lcd_update_enabled = false;
   1e72c:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
	return result;
}

static void menu_action_sdfile(const char* filename)
{
  if(eFilamentAction != FilamentAction::None) return;
   1e730:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   1e734:	81 11       	cpse	r24, r1
   1e736:	a5 cf       	rjmp	.-182    	; 0x1e682 <lcd_sdcard_menu()+0x234>

    // 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 <strcpy>
   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 <lcd_sdcard_menu()+0x30e>
   1e756:	6e 32       	cpi	r22, 0x2E	; 46
   1e758:	09 f0       	breq	.+2      	; 0x1e75c <lcd_sdcard_menu()+0x30e>
   1e75a:	4b c0       	rjmp	.+150    	; 0x1e7f2 <lcd_sdcard_menu()+0x3a4>
   1e75c:	60 e0       	ldi	r22, 0x00	; 0
   1e75e:	c5 01       	movw	r24, r10
   1e760:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
		  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 <strchr>
   1e76e:	3c 01       	movw	r6, r24

    if (extension_ptr) {
   1e770:	89 2b       	or	r24, r25
   1e772:	19 f0       	breq	.+6      	; 0x1e77a <lcd_sdcard_menu()+0x32c>
        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 <lcd_sdcard_menu()+0x344>
   1e78a:	f4 01       	movw	r30, r8
   1e78c:	60 81       	ld	r22, Z
   1e78e:	61 11       	cpse	r22, r1
   1e790:	01 c0       	rjmp	.+2      	; 0x1e794 <lcd_sdcard_menu()+0x346>
   1e792:	60 e0       	ldi	r22, 0x00	; 0
   1e794:	c5 01       	movw	r24, r10
   1e796:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   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 <lcd_sdcard_menu()+0x336>
{
		workDirParents[level].getFilename(name);
}

uint8_t CardReader::getWorkDirDepth() {
	return workDirDepth;
   1e7b0:	60 90 2f 16 	lds	r6, 0x162F	; 0x80162f <card+0x1a2>
   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 <eeprom_update_byte>
   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 <lcd_sdcard_menu()+0x3be>
#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 <eeprom_update_block>
   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 <lcd_sdcard_menu()+0x37e>
        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 <eeprom_update_byte>
   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 <lcd_sdcard_menu()+0x3bc>
   1e808:	a1 cf       	rjmp	.-190    	; 0x1e74c <lcd_sdcard_menu()+0x2fe>
   1e80a:	ac cf       	rjmp	.-168    	; 0x1e764 <lcd_sdcard_menu()+0x316>

/** 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 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]>

}

uint32_t CardReader::getFileSize()
{
	return filesize;
   1e814:	40 90 9c 17 	lds	r4, 0x179C	; 0x80179c <card+0x30f>
   1e818:	50 90 9d 17 	lds	r5, 0x179D	; 0x80179d <card+0x310>
   1e81c:	60 90 9e 17 	lds	r6, 0x179E	; 0x80179e <card+0x311>
   1e820:	70 90 9f 17 	lds	r7, 0x179F	; 0x80179f <card+0x312>
	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 <lcd_sdcard_menu()+0x3ec>
   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 <lcd_sdcard_menu()+0x400>
   1e84c:	5d c0       	rjmp	.+186    	; 0x1e908 <lcd_sdcard_menu()+0x4ba>
		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 <card+0x316>
   1e85a:	50 92 a4 17 	sts	0x17A4, r5	; 0x8017a4 <card+0x317>
   1e85e:	60 92 a5 17 	sts	0x17A5, r6	; 0x8017a5 <card+0x318>
   1e862:	70 92 a6 17 	sts	0x17A6, r7	; 0x8017a6 <card+0x319>
   1e866:	c3 01       	movw	r24, r6
   1e868:	b2 01       	movw	r22, r4
   1e86a:	0f 94 93 76 	call	0x2ed26	; 0x2ed26 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]>
		card.setIndex(startPos);
	}
	cmdqueue_reset();
   1e86e:	0e 94 dc 7e 	call	0xfdb8	; 0xfdb8 <cmdqueue_reset()>
	cmdqueue_serial_disabled = true;
   1e872:	00 93 a4 03 	sts	0x03A4, r16	; 0x8003a4 <cmdqueue_serial_disabled>

	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 <lang_get_translation>
   1e87e:	bc 01       	movw	r22, r24
   1e880:	c5 01       	movw	r24, r10
   1e882:	0f 94 ec cf 	call	0x39fd8	; 0x39fd8 <menu_progressbar_init(unsigned int, char const*)>
     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 <card+0x316>
   1e88a:	90 91 a4 17 	lds	r25, 0x17A4	; 0x8017a4 <card+0x317>
   1e88e:	a0 91 a5 17 	lds	r26, 0x17A5	; 0x8017a5 <card+0x318>
   1e892:	b0 91 a6 17 	lds	r27, 0x17A6	; 0x8017a6 <card+0x319>
	while (!card.eof() && !result) {
   1e896:	40 91 9c 17 	lds	r20, 0x179C	; 0x80179c <card+0x30f>
   1e89a:	50 91 9d 17 	lds	r21, 0x179D	; 0x80179d <card+0x310>
   1e89e:	60 91 9e 17 	lds	r22, 0x179E	; 0x80179e <card+0x311>
   1e8a2:	70 91 9f 17 	lds	r23, 0x179F	; 0x80179f <card+0x312>
   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 <lcd_sdcard_menu()+0x4c2>
   1e8b0:	11 11       	cpse	r17, r1
   1e8b2:	2e c0       	rjmp	.+92     	; 0x1e910 <lcd_sdcard_menu()+0x4c2>
      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 <card+0x295>
   1e8b8:	21 11       	cpse	r18, r1
   1e8ba:	03 c0       	rjmp	.+6      	; 0x1e8c2 <lcd_sdcard_menu()+0x474>
   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 <menu_progressbar_update(unsigned int)>
		card.sdprinting = true;
   1e8ca:	00 93 8f 14 	sts	0x148F, r16	; 0x80148f <card+0x2>
		get_command();
   1e8ce:	0e 94 b8 82 	call	0x10570	; 0x10570 <get_command()>
#endif // LIN_ADVANCE

bool check_commands() {
	bool end_command_found = false;

		while (buflen)
   1e8d2:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
   1e8d6:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   1e8da:	89 2b       	or	r24, r25
   1e8dc:	a1 f2       	breq	.-88     	; 0x1e886 <lcd_sdcard_menu()+0x438>
		{
		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 <code_seen_P(char const*) [clone .lto_priv.437]>
   1e8e6:	81 11       	cpse	r24, r1
   1e8e8:	05 c0       	rjmp	.+10     	; 0x1e8f4 <lcd_sdcard_menu()+0x4a6>
   1e8ea:	89 e9       	ldi	r24, 0x99	; 153
   1e8ec:	99 e8       	ldi	r25, 0x89	; 137
   1e8ee:	0e 94 be 67 	call	0xcf7c	; 0xcf7c <code_seen_P(char const*) [clone .lto_priv.437]>
   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 <cmdbuffer_front_already_processed>
   1e8fa:	81 11       	cpse	r24, r1
   1e8fc:	02 c0       	rjmp	.+4      	; 0x1e902 <lcd_sdcard_menu()+0x4b4>
			 cmdqueue_pop_front();
   1e8fe:	0e 94 54 76 	call	0xeca8	; 0xeca8 <cmdqueue_pop_front()>
		cmdbuffer_front_already_processed = false;
   1e902:	10 92 a1 10 	sts	0x10A1, r1	; 0x8010a1 <cmdbuffer_front_already_processed>
   1e906:	e5 cf       	rjmp	.-54     	; 0x1e8d2 <lcd_sdcard_menu()+0x484>
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 <lcd_sdcard_menu()+0x420>
		// with the CMDBUFFER_DEBUG enabled
		manage_heater();
#endif // CMDBUFFER_DEBUG
	}

	menu_progressbar_finish();
   1e910:	0f 94 de cf 	call	0x39fbc	; 0x39fbc <menu_progressbar_finish()>

	cmdqueue_serial_disabled = false;
   1e914:	10 92 a4 03 	sts	0x03A4, r1	; 0x8003a4 <cmdqueue_serial_disabled>
	card.printingHasFinished();
   1e918:	0f 94 7a 81 	call	0x302f4	; 0x302f4 <CardReader::printingHasFinished() [clone .constprop.220]>

	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 <lcd_setstatuspgm(char const*)>

    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 <lcd_sdcard_menu()+0x4fe>
      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 <enquecommandf_P(char const*, ...)>
	  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 <enquecommand(char const*, bool)>
   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 <lcd_return_to_status()>
   1e94a:	9b ce       	rjmp	.-714    	; 0x1e682 <lcd_sdcard_menu()+0x234>
    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 <lang_get_translation>
   1e954:	41 e0       	ldi	r20, 0x01	; 1
   1e956:	60 e0       	ldi	r22, 0x00	; 0
   1e958:	0f 94 01 50 	call	0x2a002	; 0x2a002 <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>
   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 <lcd_update_enable(unsigned char)>
  }
  if (result) {
   1e964:	11 23       	and	r17, r17
   1e966:	01 f3       	breq	.-64     	; 0x1e928 <lcd_sdcard_menu()+0x4da>
   1e968:	ee cf       	rjmp	.-36     	; 0x1e946 <lcd_sdcard_menu()+0x4f8>
    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 <menu_item>
   1e970:	22 ce       	rjmp	.-956    	; 0x1e5b6 <lcd_sdcard_menu()+0x168>
					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 <menu_end()>
			_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 <menu_row>
   1e97a:	8f 5f       	subi	r24, 0xFF	; 255
   1e97c:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   1e980:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   1e984:	8f 5f       	subi	r24, 0xFF	; 255
   1e986:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   1e98a:	e7 cd       	rjmp	.-1074   	; 0x1e55a <lcd_sdcard_menu()+0x10c>
			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 <lcd_click_trigger>
   1e990:	11 e0       	ldi	r17, 0x01	; 1
   1e992:	81 11       	cpse	r24, r1
   1e994:	05 c0       	rjmp	.+10     	; 0x1e9a0 <lcd_sdcard_menu()+0x552>
   1e996:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   1e99a:	81 11       	cpse	r24, r1
   1e99c:	01 c0       	rjmp	.+2      	; 0x1e9a0 <lcd_sdcard_menu()+0x552>
   1e99e:	10 e0       	ldi	r17, 0x00	; 0

			if (_md->scrollPointer == NULL)
   1e9a0:	80 91 aa 03 	lds	r24, 0x03AA	; 0x8003aa <menu_data+0x3>
   1e9a4:	90 91 ab 03 	lds	r25, 0x03AB	; 0x8003ab <menu_data+0x4>
   1e9a8:	89 2b       	or	r24, r25
   1e9aa:	91 f4       	brne	.+36     	; 0x1e9d0 <lcd_sdcard_menu()+0x582>
			{
				//load filename to memory.
#ifdef SDCARD_SORT_ALPHA
				card.getfilename_sorted(_md->selectedFileID, _md->sdSort);
   1e9ac:	60 91 b1 03 	lds	r22, 0x03B1	; 0x8003b1 <menu_data+0xa>
   1e9b0:	80 91 ac 03 	lds	r24, 0x03AC	; 0x8003ac <menu_data+0x5>
   1e9b4:	90 91 ad 03 	lds	r25, 0x03AD	; 0x8003ad <menu_data+0x6>
   1e9b8:	0f 94 f7 85 	call	0x30bee	; 0x30bee <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]>
#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 <card+0x19>
   1e9c0:	81 11       	cpse	r24, r1
   1e9c2:	46 c0       	rjmp	.+140    	; 0x1ea50 <lcd_sdcard_menu()+0x602>
   1e9c4:	81 e9       	ldi	r24, 0x91	; 145
   1e9c6:	94 e1       	ldi	r25, 0x14	; 20
   1e9c8:	90 93 ab 03 	sts	0x03AB, r25	; 0x8003ab <menu_data+0x4>
   1e9cc:	80 93 aa 03 	sts	0x03AA, r24	; 0x8003aa <menu_data+0x3>
			}

			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 <menu_data+0x1>
			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 <Timer<unsigned short>::expired(unsigned short)>
   1e9e2:	81 11       	cpse	r24, r1
   1e9e4:	03 c0       	rjmp	.+6      	; 0x1e9ec <lcd_sdcard_menu()+0x59e>
   1e9e6:	11 23       	and	r17, r17
   1e9e8:	09 f4       	brne	.+2      	; 0x1e9ec <lcd_sdcard_menu()+0x59e>
   1e9ea:	54 ce       	rjmp	.-856    	; 0x1e694 <lcd_sdcard_menu()+0x246>
			{
				uint8_t len = LCD_WIDTH - ((_md->isDir)? 2 : 1);
   1e9ec:	80 91 a9 03 	lds	r24, 0x03A9	; 0x8003a9 <menu_data+0x2>
   1e9f0:	02 e1       	ldi	r16, 0x12	; 18
   1e9f2:	81 11       	cpse	r24, r1
   1e9f4:	01 c0       	rjmp	.+2      	; 0x1e9f8 <lcd_sdcard_menu()+0x5aa>
   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 <menu_data+0x9>
   1e9fe:	80 e0       	ldi	r24, 0x00	; 0
   1ea00:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
				if (_md->isDir)
   1ea04:	80 91 a9 03 	lds	r24, 0x03A9	; 0x8003a9 <menu_data+0x2>
   1ea08:	88 23       	and	r24, r24
   1ea0a:	19 f0       	breq	.+6      	; 0x1ea12 <lcd_sdcard_menu()+0x5c4>
}

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_write(unsigned char) [clone .lto_priv.432]>
					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 <menu_data+0x1>
   1ea16:	80 91 aa 03 	lds	r24, 0x03AA	; 0x8003aa <menu_data+0x3>
   1ea1a:	90 91 ab 03 	lds	r25, 0x03AB	; 0x8003ab <menu_data+0x4>
   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 <lcd_print_pad(char const*, unsigned char)>
   1ea28:	81 11       	cpse	r24, r1
   1ea2a:	15 c0       	rjmp	.+42     	; 0x1ea56 <lcd_sdcard_menu()+0x608>
				{
					_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 <Timer<unsigned short>::start()>
					_md->offset++;
   1ea34:	80 91 a8 03 	lds	r24, 0x03A8	; 0x8003a8 <menu_data+0x1>
   1ea38:	8f 5f       	subi	r24, 0xFF	; 255
   1ea3a:	80 93 a8 03 	sts	0x03A8, r24	; 0x8003a8 <menu_data+0x1>
				} 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 <lcd_sdcard_menu()+0x5f6>
   1ea42:	28 ce       	rjmp	.-944    	; 0x1e694 <lcd_sdcard_menu()+0x246>
   1ea44:	10 92 b2 03 	sts	0x03B2, r1	; 0x8003b2 <menu_data+0xb>
			{
				_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 <menu_data>
   1ea4e:	22 ce       	rjmp	.-956    	; 0x1e694 <lcd_sdcard_menu()+0x246>
#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 <lcd_sdcard_menu()+0x57a>
   1ea56:	10 92 b2 03 	sts	0x03B2, r1	; 0x8003b2 <menu_data+0xb>
   1ea5a:	f1 cf       	rjmp	.-30     	; 0x1ea3e <lcd_sdcard_menu()+0x5f0>

0001ea5c <lcd_colorprint_change()>:
}
#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 <enquecommand(char const*, bool)>

	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 <custom_message_type>
	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 <lang_get_translation>
   1ea74:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
	lcd_return_to_status();
   1ea78:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
	lcd_draw_update = 3;
   1ea7c:	83 e0       	ldi	r24, 0x03	; 3
   1ea7e:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
}
   1ea82:	08 95       	ret

0001ea84 <lcd_setstatus(char const*)>:
    // 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 <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1ea90:	88 23       	and	r24, r24
   1ea92:	31 f0       	breq	.+12     	; 0x1eaa0 <lcd_setstatus(char const*)+0x1c>
        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 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
}
   1eaa0:	df 91       	pop	r29
   1eaa2:	cf 91       	pop	r28
   1eaa4:	08 95       	ret

0001eaa6 <print_stop(bool, bool)>:
    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 <print_stop(bool, bool)+0x82>
   1eab2:	f8 94       	cli

    // Disable all heaters and unroll the temperature wait loop stack
    disable_heater();
   1eab4:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
    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 <heating_status>

    // Clear any saved printing state
    cancel_saved_printing();
   1eac2:	0e 94 45 64 	call	0xc88a	; 0xc88a <cancel_saved_printing()>

    // Abort the planner
    planner_abort_hard();
   1eac6:	0f 94 b7 c1 	call	0x3836e	; 0x3836e <planner_abort_hard()>

    // Reset the queue
    cmdqueue_reset();
   1eaca:	0e 94 dc 7e 	call	0xfdb8	; 0xfdb8 <cmdqueue_reset()>
    cmdqueue_serial_disabled = false;
   1eace:	10 92 a4 03 	sts	0x03A4, r1	; 0x8003a4 <cmdqueue_serial_disabled>

    st_reset_timer();
   1ead2:	0f 94 03 44 	call	0x28806	; 0x28806 <st_reset_timer()>
    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 <did_pause_print>
    print_job_timer.stop();
   1eadc:	0f 94 72 43 	call	0x286e4	; 0x286e4 <Stopwatch::stop()>
    } 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 <card+0x295>
   1eae4:	88 23       	and	r24, r24
   1eae6:	71 f0       	breq	.+28     	; 0x1eb04 <print_stop(bool, bool)+0x5e>
        // Reset the sd status
        card.sdprinting = false;
   1eae8:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>
    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 <SdBaseFile::sync()>
  file.close();
   1eaf4:	8f e1       	ldi	r24, 0x1F	; 31
   1eaf6:	97 e1       	ldi	r25, 0x17	; 23
   1eaf8:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
  saving = false;
   1eafc:	10 92 8d 14 	sts	0x148D, r1	; 0x80148d <card>
  logging = false;
   1eb00:	10 92 8e 14 	sts	0x148E, r1	; 0x80148e <card+0x1>
        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 <serialprintlnPGM(char const*)>

#ifdef MESH_BED_LEVELING
    mbl.active = false;
   1eb0c:	10 92 c1 13 	sts	0x13C1, r1	; 0x8013c1 <mbl>
#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 <Stopped>
    }

    // 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 <lcd_commands_type>
}

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 <lcd_return_to_status()>
}

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 <heating_status>

    // Clear any saved printing state
    cancel_saved_printing();
   1eb34:	0e 94 45 64 	call	0xc88a	; 0xc88a <cancel_saved_printing()>

    // Abort the planner
    planner_abort_hard();
   1eb38:	0f 94 b7 c1 	call	0x3836e	; 0x3836e <planner_abort_hard()>

    // Reset the queue
    cmdqueue_reset();
   1eb3c:	0e 94 dc 7e 	call	0xfdb8	; 0xfdb8 <cmdqueue_reset()>
    cmdqueue_serial_disabled = false;
   1eb40:	10 92 a4 03 	sts	0x03A4, r1	; 0x8003a4 <cmdqueue_serial_disabled>

    st_reset_timer();
   1eb44:	0f 94 03 44 	call	0x28806	; 0x28806 <st_reset_timer()>
    CRITICAL_SECTION_END;
   1eb48:	df bf       	out	0x3f, r29	; 63
   1eb4a:	ca cf       	rjmp	.-108    	; 0x1eae0 <print_stop(bool, bool)+0x3a>

0001eb4c <lcd_print_stop()>:
}

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 <print_stop(bool, bool)>

0001eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>:
    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 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]+0x14>
        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 <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>
   1eb60:	81 30       	cpi	r24, 0x01	; 1
   1eb62:	41 f4       	brne	.+16     	; 0x1eb74 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]+0x20>
            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 <lcd_print_stop()>
{
    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 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]+0x20>
        lcd_show_fullscreen_message_and_wait_P(strict);
   1eb6c:	cb 01       	movw	r24, r22
   1eb6e:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1eb72:	f8 cf       	rjmp	.-16     	; 0x1eb64 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]+0x10>
        lcd_print_stop();
    }
}
   1eb74:	08 95       	ret

0001eb76 <filament_presence_check()>:
        ,_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 <eeprom_read_byte>
   1eb84:	81 11       	cpse	r24, r1
   1eb86:	23 c0       	rjmp	.+70     	; 0x1ebce <filament_presence_check()+0x58>
        goto done;
    }

    if (fsensor.isEnabled() && !fsensor.getFilamentPresent()) {
   1eb88:	80 91 a9 17 	lds	r24, 0x17A9	; 0x8017a9 <fsensor>
   1eb8c:	88 23       	and	r24, r24
   1eb8e:	f9 f0       	breq	.+62     	; 0x1ebce <filament_presence_check()+0x58>
   1eb90:	80 91 b6 17 	lds	r24, 0x17B6	; 0x8017b6 <fsensor+0xd>
   1eb94:	81 11       	cpse	r24, r1
   1eb96:	1b c0       	rjmp	.+54     	; 0x1ebce <filament_presence_check()+0x58>
        if (oCheckFilament == ClCheckMode::_None) {
   1eb98:	c0 91 e6 04 	lds	r28, 0x04E6	; 0x8004e6 <oCheckFilament>
   1eb9c:	cc 23       	and	r28, r28
   1eb9e:	b9 f0       	breq	.+46     	; 0x1ebce <filament_presence_check()+0x58>
            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 <lang_get_translation>
   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 <lang_get_translation>
   1ebb2:	4c 2f       	mov	r20, r28
   1ebb4:	b8 01       	movw	r22, r16
   1ebb6:	0e 94 aa f5 	call	0x1eb54	; 0x1eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>
            _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 <lcd_commands_type>
   1ebc0:	91 30       	cpi	r25, 0x01	; 1
   1ebc2:	09 f4       	brne	.+2      	; 0x1ebc6 <filament_presence_check()+0x50>
   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 <filament_presence_check()+0x50>

0001ebd2 <nozzle_diameter_check(unsigned int)>:
        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 <oCheckMode>
   1ebdc:	11 23       	and	r17, r17
   1ebde:	f9 f0       	breq	.+62     	; 0x1ec1e <nozzle_diameter_check(unsigned int)+0x4c>
   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 <eeprom_read_word>
    if (nDiameter == nDiameter_um)
   1ebea:	8c 17       	cp	r24, r28
   1ebec:	9d 07       	cpc	r25, r29
   1ebee:	b9 f0       	breq	.+46     	; 0x1ec1e <nozzle_diameter_check(unsigned int)+0x4c>
    // 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 <lang_get_translation>
   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 <lang_get_translation>
   1ec02:	41 2f       	mov	r20, r17
   1ec04:	be 01       	movw	r22, r28
   1ec06:	0e 94 aa f5 	call	0x1eb54	; 0x1eb54 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.561]>
        ,_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 <bSettings>
        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 <menu_submenu(void (*)(), bool)>
    }
}
   1ec1e:	df 91       	pop	r29
   1ec20:	cf 91       	pop	r28
   1ec22:	1f 91       	pop	r17
   1ec24:	08 95       	ret

0001ec26 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>:
}

/// @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 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = speed;
   1ec2a:	80 93 a5 04 	sts	0x04A5, r24	; 0x8004a5 <fanSpeedSoftPwm>
#endif
    manage_heater();
   1ec2e:	0d 94 34 39 	jmp	0x27268	; 0x27268 <manage_heater()>

0001ec32 <lcd_selftest()>:
{
	(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 <lcd_selftest()+0x12>
   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 <disable_heater()>
	uint8_t fanSpeedBckp = fanSpeed;
   1ec4e:	d0 90 e5 03 	lds	r13, 0x03E5	; 0x8003e5 <fanSpeed>
	fanSpeed = 255;
   1ec52:	8f ef       	ldi	r24, 0xFF	; 255
   1ec54:	80 93 e5 03 	sts	0x03E5, r24	; 0x8003e5 <fanSpeed>
	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 <current_temperature>
   1ec70:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1ec74:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1ec78:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   1ec7c:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   1ec80:	18 16       	cp	r1, r24
   1ec82:	8c f0       	brlt	.+34     	; 0x1eca6 <lcd_selftest()+0x74>
   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 <current_temperature_bed>
   1ec90:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   1ec94:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   1ec98:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   1ec9c:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   1eca0:	18 16       	cp	r1, r24
   1eca2:	0c f0       	brlt	.+2      	; 0x1eca6 <lcd_selftest()+0x74>
   1eca4:	42 c0       	rjmp	.+132    	; 0x1ed2a <lcd_selftest()+0xf8>
		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 <lang_get_translation>
   1ecae:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>

		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_putc_at(unsigned char, unsigned char, char)>
		lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0));
   1ecbc:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   1ecc0:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   1ecc4:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   1ecc8:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   1ecdc:	81 e8       	ldi	r24, 0x81	; 129
   1ecde:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>

		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_putc_at(unsigned char, unsigned char, char)>
		lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed());
   1ecec:	60 91 ed 04 	lds	r22, 0x04ED	; 0x8004ed <current_temperature_bed>
   1ecf0:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   1ecf4:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   1ecf8:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   1ed0c:	81 e8       	ldi	r24, 0x81	; 129
   1ed0e:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
		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 <delay_keep_alive(unsigned int)>
		serialecho_temperatures();
   1ed1a:	0e 94 f6 76 	call	0xedec	; 0xedec <serialecho_temperatures()>
   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 <lcd_selftest()+0x32>
	}
	fanSpeed = fanSpeedBckp;
   1ed2a:	d0 92 e5 03 	sts	0x03E5, r13	; 0x8003e5 <fanSpeed>
	lcd_update_enable(true);
   1ed2e:	81 e0       	ldi	r24, 0x01	; 1
   1ed30:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
			lcd_detect_IRsensor();
		}
	}
#endif
	lcd_wait_for_cool_down();
	lcd_clear();
   1ed34:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
	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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	#ifdef TMC2130
	  FORCE_HIGH_POWER_START;
   1ed4a:	81 e0       	ldi	r24, 0x01	; 1
   1ed4c:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
	#endif // TMC2130
	FORCE_BL_ON_START;
   1ed50:	81 e0       	ldi	r24, 0x01	; 1
   1ed52:	0e 94 e9 89 	call	0x113d2	; 0x113d2 <force_bl_on(bool)>
	_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 <delay2>
	KEEPALIVE_STATE(IN_HANDLER);
   1ed62:	82 e0       	ldi	r24, 0x02	; 2
   1ed64:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>

	_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <setExtruderAutoFanState(unsigned char)>
        lcd_selftest_setfan(0); // print fan off
   1ed80:	80 e0       	ldi	r24, 0x00	; 0
   1ed82:	0e 94 13 f6 	call	0x1ec26	; 0x1ec26 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>
        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 <lcd_selftest_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]>
        setExtruderAutoFanState(0); // hotend fan off
   1ed8e:	80 e0       	ldi	r24, 0x00	; 0
   1ed90:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>
		if (fan_speed[0] < failThr) {
   1ed94:	c0 90 c7 03 	lds	r12, 0x03C7	; 0x8003c7 <fan_speed>
   1ed98:	d0 90 c8 03 	lds	r13, 0x03C8	; 0x8003c8 <fan_speed+0x1>
   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()+0x1c8>
		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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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_setfan(unsigned char) [clone .lto_priv.395]>
        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_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]>
        lcd_selftest_setfan(0);
   1edc0:	80 e0       	ldi	r24, 0x00	; 0
   1edc2:	0e 94 13 f6 	call	0x1ec26	; 0x1ec26 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>
        if (fan_speed[1] < failThr) {
   1edc6:	80 91 c9 03 	lds	r24, 0x03C9	; 0x8003c9 <fan_speed+0x2>
   1edca:	90 91 ca 03 	lds	r25, 0x03CA	; 0x8003ca <fan_speed+0x3>
   1edce:	84 31       	cpi	r24, 0x14	; 20
   1edd0:	91 05       	cpc	r25, r1
   1edd2:	cc f4       	brge	.+50     	; 0x1ee06 <lcd_selftest()+0x1d4>
#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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
		}
	}

	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 <lcd_selftest()+0x1da>
	{
		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1edf6:	e1 2c       	mov	r14, r1
   1edf8:	49 c1       	rjmp	.+658    	; 0x1f08c <lcd_selftest()+0x45a>
#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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
   1ee04:	f0 cf       	rjmp	.-32     	; 0x1ede6 <lcd_selftest()+0x1b4>
        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 <lcd_selftest()+0x1ee>
		}
	}

	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 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]>
		if (_result) {
   1ee14:	81 11       	cpse	r24, r1
   1ee16:	68 c1       	rjmp	.+720    	; 0x1f0e8 <lcd_selftest()+0x4b6>
				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()+0x1ce>
		{
			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 <lcd_selftest()+0x1da>
		}
	}

	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <lcd_selftest()+0x23c>
	{
	#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 <lcd_selftest()+0x23c>
   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 <current_position+0x8>
   1ee4e:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   1ee52:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   1ee56:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   1ee5a:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   1ee5e:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   1ee62:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   1ee66:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   1ee6a:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
	}
	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 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   1ee7a:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

	if (
   1ee7e:	1c 9b       	sbis	0x03, 4	; 3
   1ee80:	3d c1       	rjmp	.+634    	; 0x1f0fc <lcd_selftest()+0x4ca>
		((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 <lcd_selftest()+0x268>
   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 <strcat>
		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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
		((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_heater()>
	manage_inactivity(true);
   1eeac:	81 e0       	ldi	r24, 0x01	; 1
   1eeae:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
	{
		_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 <lcd_selftest()+0x286>
   1eeb6:	97 cf       	rjmp	.-210    	; 0x1ede6 <lcd_selftest()+0x1b4>
	{
		//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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <lcd_selfcheck_axis_sg(unsigned char)>
	}




	if (_result)
   1eed0:	88 23       	and	r24, r24
   1eed2:	09 f4       	brne	.+2      	; 0x1eed6 <lcd_selftest()+0x2a4>
   1eed4:	88 cf       	rjmp	.-240    	; 0x1ede6 <lcd_selftest()+0x1b4>
	{
		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
	}


	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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <lcd_selfcheck_axis_sg(unsigned char)>
#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 <lcd_selftest()+0x2d2>
   1ef02:	71 cf       	rjmp	.-286    	; 0x1ede6 <lcd_selftest()+0x1b4>
	{
		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1ef14:	f8 2e       	mov	r15, r24


	if (_result)
	{
#ifdef TMC2130
		tmc2130_home_exit();
   1ef16:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
   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 <current_position>
   1ef2e:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   1ef32:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   1ef36:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
		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 <current_position+0x4>
   1ef56:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
   1ef5a:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
   1ef5e:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>
#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 <raise_z(float)>
        set_destination_to_current();
   1ef6e:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
#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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
#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 <raise_z(float)>
	}

#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 <raise_z(float)>
		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
		bool bres = tmc2130_home_calibrate(X_AXIS);
   1efb6:	80 e0       	ldi	r24, 0x00	; 0
   1efb8:	0f 94 77 23 	call	0x246ee	; 0x246ee <tmc2130_home_calibrate(unsigned char)>
   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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
		bres &= tmc2130_home_calibrate(Y_AXIS);
   1efca:	81 e0       	ldi	r24, 0x01	; 1
   1efcc:	0f 94 77 23 	call	0x246ee	; 0x246ee <tmc2130_home_calibrate(unsigned char)>
   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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1efde:	f8 2e       	mov	r15, r24
		if (bres)
   1efe0:	ee 20       	and	r14, r14
   1efe2:	09 f4       	brne	.+2      	; 0x1efe6 <lcd_selftest()+0x3b4>
   1efe4:	00 cf       	rjmp	.-512    	; 0x1ede6 <lcd_selftest()+0x1b4>
   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 <eeprom_update_byte>
	}
#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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <lcd_selfcheck_check_heater(bool)>
	}

    if (_result)
   1f008:	88 23       	and	r24, r24
   1f00a:	09 f4       	brne	.+2      	; 0x1f00e <lcd_selftest()+0x3dc>
   1f00c:	ec ce       	rjmp	.-552    	; 0x1ede6 <lcd_selftest()+0x1b4>
    {
        _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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <lcd_selfcheck_check_heater(bool)>
   1f026:	e8 2e       	mov	r14, r24
    }
	if (_result)
   1f028:	88 23       	and	r24, r24
   1f02a:	09 f4       	brne	.+2      	; 0x1f02e <lcd_selftest()+0x3fc>
   1f02c:	dc ce       	rjmp	.-584    	; 0x1ede6 <lcd_selftest()+0x1b4>
	{
		_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
			}
        } 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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   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 <PAT9125_sensor::init() [clone .constprop.230]>
	if (fsensor.isError())
   1f050:	80 91 a9 17 	lds	r24, 0x17A9	; 0x8017a9 <fsensor>
   1f054:	83 30       	cpi	r24, 0x03	; 3
   1f056:	29 f4       	brne	.+10     	; 0x1f062 <lcd_selftest()+0x430>
	{
		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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>
#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 <fsensor>
   1f066:	83 30       	cpi	r24, 0x03	; 3
   1f068:	09 f4       	brne	.+2      	; 0x1f06c <lcd_selftest()+0x43a>
   1f06a:	bd ce       	rjmp	.-646    	; 0x1ede6 <lcd_selftest()+0x1b4>
			{
				_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 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
        }
    }
#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_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
    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 <enquecommand(char const*, bool)>
	lcd_update_enable(true);
   1f09a:	81 e0       	ldi	r24, 0x01	; 1
   1f09c:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>

	if (_result)
   1f0a0:	ee 20       	and	r14, r14
   1f0a2:	71 f1       	breq	.+92     	; 0x1f100 <lcd_selftest()+0x4ce>
	{
		calibration_status_set(CALIBRATION_STATUS_SELFTEST);
   1f0a4:	81 e0       	ldi	r24, 0x01	; 1
   1f0a6:	0e 94 4b ef 	call	0x1de96	; 0x1de96 <calibration_status_set(unsigned char)>
		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 <lang_get_translation>
   1f0b2:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
		lcd_return_to_status();
   1f0b6:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
	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 <force_high_power_mode(bool)>
	#endif // TMC2130

    FORCE_BL_ON_END;
   1f0c0:	80 e0       	ldi	r24, 0x00	; 0
   1f0c2:	0e 94 e9 89 	call	0x113d2	; 0x113d2 <force_bl_on(bool)>

    KEEPALIVE_STATE(NOT_BUSY);
   1f0c6:	81 e0       	ldi	r24, 0x01	; 1
   1f0c8:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
	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 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]>
			if (!_result){
   1f0f0:	81 11       	cpse	r24, r1
   1f0f2:	9a ce       	rjmp	.-716    	; 0x1ee28 <lcd_selftest()+0x1f6>
				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 <lcd_selftest()+0x1ce>
#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_selftest()+0x276>
		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 <lang_get_translation>
   1f108:	62 e0       	ldi	r22, 0x02	; 2
   1f10a:	0e 94 d6 f1 	call	0x1e3ac	; 0x1e3ac <lcd_setalertstatuspgm(char const*, unsigned char)>
   1f10e:	d5 cf       	rjmp	.-86     	; 0x1f0ba <lcd_selftest()+0x488>

0001f110 <lcd_selftest_v()>:
}
#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 <lcd_selftest()>

0001f114 <resume_print_checks()>:
    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_return_to_status()>
    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 <resume_print_checks()+0x74>
}

static bool fan_error_selftest()
{
#ifdef FANCHECK
    if (!fans_check_enabled) return 0;
   1f124:	80 91 38 02 	lds	r24, 0x0238	; 0x800238 <fans_check_enabled>
   1f128:	81 11       	cpse	r24, r1
   1f12a:	02 c0       	rjmp	.+4      	; 0x1f130 <resume_print_checks()+0x1c>
#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 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>
    setExtruderAutoFanState(3); //force enables the hotend fan
   1f136:	83 e0       	ldi	r24, 0x03	; 3
   1f138:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>
#ifdef FAN_SOFT_PWM
    extruder_autofan_last_check = _millis();
   1f13c:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   1f140:	60 93 bf 17 	sts	0x17BF, r22	; 0x8017bf <extruder_autofan_last_check>
   1f144:	70 93 c0 17 	sts	0x17C0, r23	; 0x8017c0 <extruder_autofan_last_check+0x1>
   1f148:	80 93 c1 17 	sts	0x17C1, r24	; 0x8017c1 <extruder_autofan_last_check+0x2>
   1f14c:	90 93 c2 17 	sts	0x17C2, r25	; 0x8017c2 <extruder_autofan_last_check+0x3>
    fan_measuring = true;
   1f150:	81 e0       	ldi	r24, 0x01	; 1
   1f152:	80 93 6e 06 	sts	0x066E, r24	; 0x80066e <fan_measuring>
#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 <delay2>
    manage_heater();
   1f162:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
    setExtruderAutoFanState(1); //releases lock on the hotend fan
   1f166:	81 e0       	ldi	r24, 0x01	; 1
   1f168:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>
    lcd_selftest_setfan(0);
   1f16c:	80 e0       	ldi	r24, 0x00	; 0
   1f16e:	0e 94 13 f6 	call	0x1ec26	; 0x1ec26 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>
#ifdef TACH_0
    if (fan_speed[0] <= 20) { //hotend fan error
   1f172:	80 91 c7 03 	lds	r24, 0x03C7	; 0x8003c7 <fan_speed>
   1f176:	90 91 c8 03 	lds	r25, 0x03C8	; 0x8003c8 <fan_speed+0x1>
   1f17a:	45 97       	sbiw	r24, 0x15	; 21
   1f17c:	3c f4       	brge	.+14     	; 0x1f18c <resume_print_checks()+0x78>
        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 <lcd_setalertstatuspgm(char const*, unsigned char)>
    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 <fan_speed+0x2>
   1f190:	90 91 ca 03 	lds	r25, 0x03CA	; 0x8003ca <fan_speed+0x3>
   1f194:	45 97       	sbiw	r24, 0x15	; 21
   1f196:	54 f6       	brge	.-108    	; 0x1f12c <resume_print_checks()+0x18>
        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 <resume_print_checks()+0x70>

0001f1a0 <lcd_resume_print()>:
//! @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 <resume_print_checks()>
   1f1a4:	88 23       	and	r24, r24
   1f1a6:	51 f1       	breq	.+84     	; 0x1f1fc <lcd_resume_print()+0x5c>

    cmdqueue_serial_disabled = false;
   1f1a8:	10 92 a4 03 	sts	0x03A4, r1	; 0x8003a4 <cmdqueue_serial_disabled>
    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 <lang_get_translation>
   1f1b4:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
    st_synchronize();
   1f1b8:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    custom_message_type = CustomMsg::Resuming;
   1f1bc:	88 e0       	ldi	r24, 0x08	; 8
   1f1be:	80 93 c3 06 	sts	0x06C3, r24	; 0x8006c3 <custom_message_type>
{
#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 <resetFanCheck()>
    setExtruderAutoFanState(1);
   1f1c6:	81 e0       	ldi	r24, 0x01	; 1
   1f1c8:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>

    // 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 <Stopped>

    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 <restore_print_from_ram_and_continue(float)>

    did_pause_print = false;
   1f1dc:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <did_pause_print>

    // 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 <Stopwatch::state>
   1f1e4:	82 30       	cpi	r24, 0x02	; 2
   1f1e6:	11 f4       	brne	.+4      	; 0x1f1ec <lcd_resume_print()+0x4c>
   1f1e8:	0f 94 4e 43 	call	0x2869c	; 0x2869c <Stopwatch::start()>

    refresh_cmd_timeout();
   1f1ec:	0e 94 5b 66 	call	0xccb6	; 0xccb6 <refresh_cmd_timeout()>
    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 <serialprintlnPGM(char const*)>
    custom_message_type = CustomMsg::Status;
   1f1f8:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
}
   1f1fc:	08 95       	ret

0001f1fe <lcd_resume_usb_print()>:

//! @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 <resume_print_checks()>
   1f202:	88 23       	and	r24, r24
   1f204:	21 f0       	breq	.+8      	; 0x1f20e <lcd_resume_usb_print()+0x10>

    // 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 <serialprintlnPGM(char const*)>
}
   1f20e:	08 95       	ret

0001f210 <unload_filament(float)>:
}

/// @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 <custom_message_type>
    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 <lang_get_translation>
   1f22c:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>

    FSensorBlockRunout fsBlockRunout;
   1f230:	0f 94 a5 87 	call	0x30f4a	; 0x30f4a <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>

    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 <current_position+0xc>
   1f240:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   1f244:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   1f248:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   1f24c:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   1f250:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   1f254:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   1f258:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   1f25c:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
    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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   1f26c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    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 <current_position+0xc>
   1f27c:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   1f280:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   1f284:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   1f288:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   1f28c:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   1f290:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   1f294:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   1f298:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
    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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   1f2a8:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    // 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 <unload_filament(float)+0xe6>
    {
        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 <current_position+0xc>
   1f2c6:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   1f2ca:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   1f2ce:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   1f2d2:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   1f2d6:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   1f2da:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   1f2de:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   1f2e2:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
        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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   1f2f2:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    }

	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 <lang_get_translation>
   1f2fe:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>

	//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 <delay2>

	Sound_MakeSound(e_SOUND_TYPE_StandardPrompt);
   1f310:	82 e0       	ldi	r24, 0x02	; 2
   1f312:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
   1f316:	c3 e3       	ldi	r28, 0x33	; 51
	uint8_t counterBeep = 0;
	while (!lcd_clicked() && (counterBeep < 50)) {
   1f318:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   1f31c:	81 11       	cpse	r24, r1
   1f31e:	07 c0       	rjmp	.+14     	; 0x1f32e <unload_filament(float)+0x11e>
   1f320:	c1 50       	subi	r28, 0x01	; 1
   1f322:	29 f0       	breq	.+10     	; 0x1f32e <unload_filament(float)+0x11e>
		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 <delay_keep_alive(unsigned int)>
   1f32c:	f5 cf       	rjmp	.-22     	; 0x1f318 <unload_filament(float)+0x108>
		counterBeep++;
	}
	st_synchronize();
   1f32e:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
	while (lcd_clicked()) delay_keep_alive(100);
   1f332:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   1f336:	88 23       	and	r24, r24
   1f338:	29 f0       	breq	.+10     	; 0x1f344 <unload_filament(float)+0x134>
   1f33a:	84 e6       	ldi	r24, 0x64	; 100
   1f33c:	90 e0       	ldi	r25, 0x00	; 0
   1f33e:	0e 94 84 8c 	call	0x11908	; 0x11908 <delay_keep_alive(unsigned int)>
   1f342:	f7 cf       	rjmp	.-18     	; 0x1f332 <unload_filament(float)+0x122>

	lcd_update_enable(true);
   1f344:	81 e0       	ldi	r24, 0x01	; 1
   1f346:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>

	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 <lcd_setstatuspgm(char const*)>
	custom_message_type = CustomMsg::Status;
   1f352:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
	clearFilamentAction();
   1f356:	0f 94 6f 21 	call	0x242de	; 0x242de <clearFilamentAction() [clone .lto_priv.439]>
}
   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 <PAT9125_sensor::settings_init() [clone .constprop.231]>

0001f368 <lcd_wizard(WizState)>:
//!  ---------------------- | ----------------
//! 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 <lcd_wizard(WizState)+0x22>
   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 <eeprom_update_byte>

    FORCE_BL_ON_START;
   1f38a:	81 e0       	ldi	r24, 0x01	; 1
   1f38c:	0e 94 e9 89 	call	0x113d2	; 0x113d2 <force_bl_on(bool)>

    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 <printf_P>
		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 <lcd_wizard(WizState)+0x40>
   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 <saved_printing>

			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 <eeprom_read_byte>
   1f3f8:	82 30       	cpi	r24, 0x02	; 2
   1f3fa:	39 f4       	brne	.+14     	; 0x1f40a <lcd_wizard(WizState)+0xa2>
				// 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 <lang_get_translation>
   1f404:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1f408:	0f c0       	rjmp	.+30     	; 0x1f428 <lcd_wizard(WizState)+0xc0>
				// 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 <lang_get_translation>
   1f412:	40 e0       	ldi	r20, 0x00	; 0
   1f414:	60 e0       	ldi	r22, 0x00	; 0
   1f416:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
				if (wizard_event == LCD_LEFT_BUTTON_CHOICE) {
   1f41a:	81 11       	cpse	r24, r1
   1f41c:	07 c0       	rjmp	.+14     	; 0x1f42c <lcd_wizard(WizState)+0xc4>
   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 <eeprom_update_byte>
				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 <lcd_wizard(WizState)+0x3c>
   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 <eeprom_update_byte>
	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 <force_bl_on(bool)>

    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 <printf_P>
	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 <lcd_wizard(WizState)+0xf6>
   1f45c:	ff c0       	rjmp	.+510    	; 0x1f65c <lcd_wizard(WizState)+0x2f4>
   1f45e:	ce 30       	cpi	r28, 0x0E	; 14
   1f460:	09 f4       	brne	.+2      	; 0x1f464 <lcd_wizard(WizState)+0xfc>
   1f462:	11 c1       	rjmp	.+546    	; 0x1f686 <lcd_wizard(WizState)+0x31e>
	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 <lcd_wizard(WizState)+0x106>
   1f46c:	0e c1       	rjmp	.+540    	; 0x1f68a <lcd_wizard(WizState)+0x322>
		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_enable(unsigned char)>
	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_update(unsigned char)>
    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 <calibration_status_get(unsigned char)>
				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 <lcd_wizard(WizState)+0x136>
   1f49c:	83 cf       	rjmp	.-250    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
				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 <calibration_status_get(unsigned char)>
				// 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 <lcd_wizard(WizState)+0x144>
   1f4aa:	7c cf       	rjmp	.-264    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
				// 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 <calibration_status_get(unsigned char)>
				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 <lcd_wizard(WizState)+0x152>
   1f4b8:	75 cf       	rjmp	.-278    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
				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 <calibration_status_get(unsigned char)>
				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 <lcd_wizard(WizState)+0x160>
   1f4c6:	6e cf       	rjmp	.-292    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
				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 <calibration_status_get(unsigned char)>
				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 <lcd_wizard(WizState)+0x3c>
				state = S::IsFil;
   1f4d4:	c6 e0       	ldi	r28, 0x06	; 6
   1f4d6:	66 cf       	rjmp	.-308    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
				// 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 <lang_get_translation>
   1f4e0:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			wizard_event = lcd_selftest();
   1f4e4:	0e 94 19 f6 	call	0x1ec32	; 0x1ec32 <lcd_selftest()>
			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 <lcd_wizard(WizState)+0xc0>
			}
			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 <lcd_wizard(WizState)+0x3c>
			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 <lang_get_translation>
   1f4f8:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			wizard_event = gcode_M45(false, 0);
   1f4fc:	80 e0       	ldi	r24, 0x00	; 0
   1f4fe:	0f 94 99 8d 	call	0x31b32	; 0x31b32 <gcode_M45(bool, signed char) [clone .constprop.76]>
   1f502:	f2 cf       	rjmp	.-28     	; 0x1f4e8 <lcd_wizard(WizState)+0x180>
			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 <lang_get_translation>
   1f50c:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			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 <lang_get_translation>
   1f518:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			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 <lang_get_translation>
   1f524:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			wizard_event = gcode_M45(true, 0);
   1f528:	81 e0       	ldi	r24, 0x01	; 1
   1f52a:	0f 94 99 8d 	call	0x31b32	; 0x31b32 <gcode_M45(bool, signed char) [clone .constprop.76]>
			if (!wizard_event) {
   1f52e:	88 23       	and	r24, r24
   1f530:	e9 f2       	breq	.-70     	; 0x1f4ec <lcd_wizard(WizState)+0x184>
				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 <raise_z_above(float)>
				if(!MMU2::mmu2.Enabled()) {
   1f53e:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   1f542:	81 30       	cpi	r24, 0x01	; 1
   1f544:	09 f4       	brne	.+2      	; 0x1f548 <lcd_wizard(WizState)+0x1e0>
   1f546:	70 cf       	rjmp	.-288    	; 0x1f428 <lcd_wizard(WizState)+0xc0>
  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 <target_temperature+0x1>
   1f54c:	c0 92 b5 0d 	sts	0x0DB5, r12	; 0x800db5 <target_temperature>
					//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 <lang_get_translation>
   1f558:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
					wait_preheat();
   1f55c:	0e 94 10 e3 	call	0x1c620	; 0x1c620 <wait_preheat()>
					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 <unload_filament(float)>
					lcd_wizard_load(); // load filament
   1f56a:	0e 94 d2 cf 	call	0x19fa4	; 0x19fa4 <lcd_wizard_load()>
   1f56e:	10 92 b6 0d 	sts	0x0DB6, r1	; 0x800db6 <target_temperature+0x1>
   1f572:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
   1f576:	58 cf       	rjmp	.-336    	; 0x1f428 <lcd_wizard(WizState)+0xc0>
			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 <lang_get_translation>
   1f580:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			lcd_commands_type = LcdCommands::ThermalModel;
   1f584:	85 e0       	ldi	r24, 0x05	; 5
   1f586:	80 93 b3 0d 	sts	0x0DB3, r24	; 0x800db3 <lcd_commands_type>
	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 <lcd_wizard(WizState)+0xd2>
   1f590:	d0 92 b6 0d 	sts	0x0DB6, r13	; 0x800db6 <target_temperature+0x1>
   1f594:	c0 92 b5 0d 	sts	0x0DB5, r12	; 0x800db5 <target_temperature>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   1f598:	b0 92 72 06 	sts	0x0672, r11	; 0x800672 <target_temperature_bed+0x1>
   1f59c:	a0 92 71 06 	sts	0x0671, r10	; 0x800671 <target_temperature_bed>
#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 <lang_get_translation>
   1f5a8:	41 e0       	ldi	r20, 0x01	; 1
   1f5aa:	60 e0       	ldi	r22, 0x00	; 0
   1f5ac:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
			if (wizard_event == LCD_LEFT_BUTTON_CHOICE) {
   1f5b0:	88 23       	and	r24, r24
   1f5b2:	09 f1       	breq	.+66     	; 0x1f5f6 <lcd_wizard(WizState)+0x28e>
				state = S::Lay1CalCold;
			} else { // MIDDLE_BUTTON_CHOICE
			    if(MMU2::mmu2.Enabled()) state = S::LoadFilCold;
   1f5b4:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
			    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 <lcd_wizard(WizState)+0x258>
   1f5be:	f2 ce       	rjmp	.-540    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
   1f5c0:	c8 e0       	ldi	r28, 0x08	; 8
   1f5c2:	f0 ce       	rjmp	.-544    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
			    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 <menu_goto(void (*)(), int, bool, bool)>
		    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 <lang_get_translation>
   1f5dc:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
	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 <lcd_wizard(WizState)+0xd2>
			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 <wait_preheat()>
			lcd_wizard_load();
   1f5ea:	0e 94 d2 cf 	call	0x19fa4	; 0x19fa4 <lcd_wizard_load()>
			state = S::Lay1CalHot;
   1f5ee:	cb e0       	ldi	r28, 0x0B	; 11
   1f5f0:	d9 ce       	rjmp	.-590    	; 0x1f3a4 <lcd_wizard(WizState)+0x3c>
			break;
        case S::LoadFilCold:
            lcd_wizard_load();
   1f5f2:	0e 94 d2 cf 	call	0x19fa4	; 0x19fa4 <lcd_wizard_load()>
		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 <lcd_wizard(WizState)+0x3c>
        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 <wizard_lay1cal_message(bool)>
			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 <menu_goto(void (*)(), int, bool, bool)>
	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 <lcd_wizard(WizState)+0xd2>
            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 <wizard_lay1cal_message(bool)>
            lcd_commands_type = LcdCommands::Layer1Cal;
   1f61c:	84 e0       	ldi	r24, 0x04	; 4
   1f61e:	80 93 b3 0d 	sts	0x0DB3, r24	; 0x800db3 <lcd_commands_type>
	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 <lcd_wizard(WizState)+0xd2>
            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 <lang_get_translation>
   1f630:	41 e0       	ldi	r20, 0x01	; 1
   1f632:	60 e0       	ldi	r22, 0x00	; 0
   1f634:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
			if (wizard_event == LCD_LEFT_BUTTON_CHOICE)
   1f638:	81 11       	cpse	r24, r1
   1f63a:	07 c0       	rjmp	.+14     	; 0x1f64a <lcd_wizard(WizState)+0x2e2>
			{
				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 <lang_get_translation>
   1f644:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1f648:	d6 cf       	rjmp	.-84     	; 0x1f5f6 <lcd_wizard(WizState)+0x28e>
				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 <lcd_wizard(WizState)+0x98>
   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 <eeprom_update_byte>
   1f65a:	ef ce       	rjmp	.-546    	; 0x1f43a <lcd_wizard(WizState)+0xd2>
		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 <lang_get_translation>
   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_setstatuspgm(char const*)>
		lcd_return_to_status();
   1f672:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>

	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 <lcd_wizard(WizState)+0x316>
   1f67c:	f8 ce       	rjmp	.-528    	; 0x1f46e <lcd_wizard(WizState)+0x106>
		lcd_show_fullscreen_message_and_wait_P(msg);
   1f67e:	c8 01       	movw	r24, r16
   1f680:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1f684:	f4 ce       	rjmp	.-536    	; 0x1f46e <lcd_wizard(WizState)+0x106>
		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 <lang_get_translation>
   1f68e:	8c 01       	movw	r16, r24
   1f690:	f2 cf       	rjmp	.-28     	; 0x1f676 <lcd_wizard(WizState)+0x30e>

0001f692 <main>:

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<<TOIE2);
   1f7b8:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   1f7bc:	81 60       	ori	r24, 0x01	; 1
   1f7be:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
	TIMSK2 &= ~(1<<OCIE2A);
   1f7c2:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   1f7c6:	8d 7f       	andi	r24, 0xFD	; 253
   1f7c8:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
	TIMSK2 &= ~(1<<OCIE2B);
   1f7cc:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   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 <delay2>
    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 <backlightSupport>
    if (!backlightSupport) return;
   1f7fc:	21 11       	cpse	r18, r1
   1f7fe:	22 c0       	rjmp	.+68     	; 0x1f844 <main+0x1b2>

    //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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1f80a:	80 93 4f 02 	sts	0x024F, r24	; 0x80024f <backlightMode>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1f818:	80 93 00 04 	sts	0x0400, r24	; 0x800400 <backlightLevel_HIGH>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1f826:	80 93 ff 03 	sts	0x03FF, r24	; 0x8003ff <backlightLevel_LOW>
    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 <eeprom_init_default_word(unsigned int*, unsigned int)>
   1f836:	90 93 4e 02 	sts	0x024E, r25	; 0x80024e <backlightTimer_period+0x1>
   1f83a:	80 93 4d 02 	sts	0x024D, r24	; 0x80024d <backlightTimer_period>

    SET_OUTPUT(LCD_BL_PIN);
   1f83e:	6b 9a       	sbi	0x0d, 3	; 13
    backlightTimer_reset();
   1f840:	0e 94 02 8a 	call	0x11404	; 0x11404 <backlightTimer_reset() [clone .lto_priv.434]>
	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 <main+0x1d8>
   1f872:	00 c0       	rjmp	.+0      	; 0x1f874 <main+0x1e2>
   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 <lcd_begin(unsigned char) [clone .lto_priv.433]>
	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_refresh()>
	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 <lcd_longpress_func+0x1>
   1f8aa:	80 93 16 04 	sts	0x0416, r24	; 0x800416 <lcd_longpress_func>
	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 <lcd_lcdupdate_func+0x1>
   1f8b6:	80 93 14 04 	sts	0x0414, r24	; 0x800414 <lcd_lcdupdate_func>
	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 <menu_menu+0x1>
   1f8c2:	80 93 12 04 	sts	0x0412, r24	; 0x800412 <menu_menu>

  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 <main+0x2a0>
   1f936:	00 c0       	rjmp	.+0      	; 0x1f938 <main+0x2a6>
   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 <lcd_oldcardstatus>
#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 <strncpy_P>
	timer2_init(); // enables functional millis


	ultralcd_init();

	spi_init();
   1f956:	0f 94 c2 c2 	call	0x38584	; 0x38584 <spi_init.lto_priv.427>
}


void lcd_splash()
{
	lcd_clear(); // clears display and homes screen
   1f95a:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
	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 <lcd_printf_P(char const*, ...)>
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<eSOUND_MODE>(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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1f986:	80 93 dd 04 	sts	0x04DD, r24	; 0x8004dd <eSoundMode>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1f994:	80 93 38 05 	sts	0x0538, r24	; 0x800538 <selectedSerialPort>
	MYSERIAL.begin(BAUDRATE);
   1f998:	0e 94 7b cd 	call	0x19af6	; 0x19af6 <MarlinSerial::begin(long) [clone .constprop.64]>
	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 <xflash_init>
   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 <main+0x354>
   1f9e4:	d8 c0       	rjmp	.+432    	; 0x1fb96 <main+0x504>
	{
		optiboot_status = optiboot_xflash_enter();
   1f9e6:	0f 94 d0 c2 	call	0x385a0	; 0x385a0 <optiboot_xflash_enter()>
   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 <main+0x376>
   1fa06:	bf c0       	rjmp	.+382    	; 0x1fb86 <main+0x4f4>
   1fa08:	80 91 fb 1f 	lds	r24, 0x1FFB	; 0x801ffb <__bss_end+0x7dc>
   1fa0c:	87 ff       	sbrs	r24, 7
   1fa0e:	bb c0       	rjmp	.+374    	; 0x1fb86 <main+0x4f4>
	{
		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 <main+0x396>
   1fa26:	af c0       	rjmp	.+350    	; 0x1fb86 <main+0x4f4>
#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 <main+0x3e4>
	{
		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 <memcpy_P>
		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 <main+0x3c8>
   1fa58:	96 c0       	rjmp	.+300    	; 0x1fb86 <main+0x4f4>
		{
			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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
			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 <main+0x428>
}

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 <lcd_write(unsigned char) [clone .lto_priv.432]>
   1fa72:	93 94       	inc	r9
   1fa74:	f9 cf       	rjmp	.-14     	; 0x1fa68 <main+0x3d6>
	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 <xflash_rd_data>
		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 <main+0x412>
   1faa2:	71 c0       	rjmp	.+226    	; 0x1fb86 <main+0x4f4>
		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 <main+0x3c8>
		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 <main+0x3f0>
				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 <delay2>
			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 <main+0x45e>
   1faee:	46 c0       	rjmp	.+140    	; 0x1fb7c <main+0x4ea>
			{
				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 <main+0x474>
   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 <xflash_rd_data>
}


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 <softReset>
   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 <eeprom_update_byte>
				//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 <UserECoolEnabled()>
	setup_powerhold();

    farm_mode_init();

#ifdef TMC2130
    if(FarmOrUserECool()) {
   1fb9a:	88 23       	and	r24, r24
   1fb9c:	51 f0       	breq	.+20     	; 0x1fbb2 <main+0x520>
        //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 <MotorCurrents::setiRun(unsigned char)>
        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 <MotorCurrents::setiHold(unsigned char)>
#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 <eeprom_read_block>
        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 <main+0x548>
   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 <strncmp_P>
   1fbd4:	89 2b       	or	r24, r25
   1fbd6:	09 f4       	brne	.+2      	; 0x1fbda <main+0x548>
   1fbd8:	51 c0       	rjmp	.+162    	; 0x1fc7c <main+0x5ea>
 * @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 <selectedSerialPort>
    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 <selectedSerialPort>
    timeout.start();
   1fbe8:	ce 01       	movw	r24, r28
   1fbea:	45 96       	adiw	r24, 0x15	; 21
   1fbec:	0f 94 89 2a 	call	0x25512	; 0x25512 <Timer<unsigned short>::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 <delay2>
  // 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 <rx_buffer+0x82>
   1fc00:	90 91 9b 04 	lds	r25, 0x049B	; 0x80049b <rx_buffer+0x83>
   1fc04:	90 93 99 04 	sts	0x0499, r25	; 0x800499 <rx_buffer+0x81>
   1fc08:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <rx_buffer+0x80>
        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 <serialprintlnPGM(char const*)>
   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 <main+0x5b4>
        {
            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 <Timer<unsigned short>::expired(unsigned short)>
   1fc2a:	81 11       	cpse	r24, r1
   1fc2c:	c1 c0       	rjmp	.+386    	; 0x1fdb0 <main+0x71e>
                goto exit;
            if (MYSERIAL.available() > 0)
   1fc2e:	0e 94 a1 76 	call	0xed42	; 0xed42 <MarlinSerial::available()>
   1fc32:	18 16       	cp	r1, r24
   1fc34:	19 06       	cpc	r1, r25
   1fc36:	84 f7       	brge	.-32     	; 0x1fc18 <main+0x586>
            {
                SN[rxIndex] = MYSERIAL.read();
   1fc38:	0f 94 f8 d5 	call	0x3abf0	; 0x3abf0 <MarlinSerial::read()>
   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 <main+0x586>
            }
        }
        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 <strncmp_P>
    ShortTimer timeout;

    selectedSerialPort = 0;
    timeout.start();

    while (!SN_valid)
   1fc56:	89 2b       	or	r24, r25
   1fc58:	59 f6       	brne	.-106    	; 0x1fbf0 <main+0x55e>
   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 <selectedSerialPort>
    {
        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 <main+0x5d4>
   1fc64:	a7 c0       	rjmp	.+334    	; 0x1fdb4 <main+0x722>
#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>
            {
                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 <puts_P>


#ifndef XFLASH
	SERIAL_PROTOCOLLNPGM("start");
#else
	if ((optiboot_status != 0) || (selectedSerialPort != 0))
   1fc7c:	a1 10       	cpse	r10, r1
   1fc7e:	04 c0       	rjmp	.+8      	; 0x1fc88 <main+0x5f6>
   1fc80:	80 91 38 05 	lds	r24, 0x0538	; 0x800538 <selectedSerialPort>
   1fc84:	88 23       	and	r24, r24
   1fc86:	21 f0       	breq	.+8      	; 0x1fc90 <main+0x5fe>
		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 <serialprintlnPGM(char const*)>
#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 <serialprintPGM(char const*)>
	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 <puts_P>

	// 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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1fcaa:	81 11       	cpse	r24, r1
		MMU2::mmu2.Start();
   1fcac:	0e 94 49 e4 	call	0x1c892	; 0x1c892 <MMU2::MMU2::Start() [clone .constprop.65]>
	}
	MMU2::mmu2.Status();
   1fcb0:	0f 94 da 75 	call	0x2ebb4	; 0x2ebb4 <MMU2::MMU2::Status() [clone .constprop.342]>
}

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 <serialprintPGM(char const*)>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
    if (status == (uint8_t)EEPROM::Enabled)
   1fcc6:	81 30       	cpi	r24, 0x01	; 1
   1fcc8:	09 f0       	breq	.+2      	; 0x1fccc <main+0x63a>
   1fcca:	77 c0       	rjmp	.+238    	; 0x1fdba <main+0x728>
    {
        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 <serialprintlnPGM(char const*)>
#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 <main+0x650>
   1fcda:	81 e2       	ldi	r24, 0x21	; 33
   1fcdc:	9d e6       	ldi	r25, 0x6D	; 109
   1fcde:	0f 94 f9 da 	call	0x3b5f2	; 0x3b5f2 <puts_P>
	if (mcu & 2) puts_P(MSG_EXTERNAL_RESET);
   1fce2:	f1 fe       	sbrs	r15, 1
   1fce4:	04 c0       	rjmp	.+8      	; 0x1fcee <main+0x65c>
   1fce6:	81 e1       	ldi	r24, 0x11	; 17
   1fce8:	9d e6       	ldi	r25, 0x6D	; 109
   1fcea:	0f 94 f9 da 	call	0x3b5f2	; 0x3b5f2 <puts_P>
	if (mcu & 4) puts_P(MSG_BROWNOUT_RESET);
   1fcee:	f2 fe       	sbrs	r15, 2
   1fcf0:	04 c0       	rjmp	.+8      	; 0x1fcfa <main+0x668>
   1fcf2:	80 e0       	ldi	r24, 0x00	; 0
   1fcf4:	9d e6       	ldi	r25, 0x6D	; 109
   1fcf6:	0f 94 f9 da 	call	0x3b5f2	; 0x3b5f2 <puts_P>
	if (mcu & 8) puts_P(MSG_WATCHDOG_RESET);
   1fcfa:	f3 fe       	sbrs	r15, 3
   1fcfc:	04 c0       	rjmp	.+8      	; 0x1fd06 <main+0x674>
   1fcfe:	80 ef       	ldi	r24, 0xF0	; 240
   1fd00:	9c e6       	ldi	r25, 0x6C	; 108
   1fd02:	0f 94 f9 da 	call	0x3b5f2	; 0x3b5f2 <puts_P>
	if (mcu & 32) puts_P(MSG_SOFTWARE_RESET);
   1fd06:	f5 fe       	sbrs	r15, 5
   1fd08:	04 c0       	rjmp	.+8      	; 0x1fd12 <main+0x680>
   1fd0a:	80 ee       	ldi	r24, 0xE0	; 224
   1fd0c:	9c e6       	ldi	r25, 0x6C	; 108
   1fd0e:	0f 94 f9 da 	call	0x3b5f2	; 0x3b5f2 <puts_P>
	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 <serialprintPGM(char const*)>
	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 <serialprintPGM(char const*)>
	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 <serialprintPGM(char const*)>
	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 <serialprintPGM(char const*)>
	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 <serialprintlnPGM(char const*)>
#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 <serialprintPGM(char const*)>
	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 <serialprintPGM(char const*)>
/** 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 <main+0x72e>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
	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 <serialprintPGM(char const*)>
	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 <MarlinSerial::println(int, int) [clone .constprop.325]>
#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 <eeprom_init_default_word(unsigned int*, unsigned int)>
   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 <eeprom_init_default_word(unsigned int*, unsigned int)>

	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 <main+0x70a>
   1fd98:	0d 94 c4 06 	jmp	0x20d88	; 0x20d88 <main+0x16f6>
	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 <main+0x714>
   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 <Config_RetrieveSettings()>
   1fdaa:	f8 2e       	mov	r15, r24
   1fdac:	0d 94 cc 06 	jmp	0x20d98	; 0x20d98 <main+0x1706>
        _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 <main+0x5ca>
            {
                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 <main+0x5e6>
   1fdba:	8d e4       	ldi	r24, 0x4D	; 77
   1fdbc:	9c e5       	ldi	r25, 0x5C	; 92
   1fdbe:	88 cf       	rjmp	.-240    	; 0x1fcd0 <main+0x63e>
   1fdc0:	0f 51       	subi	r16, 0x1F	; 31
   1fdc2:	18 41       	sbci	r17, 0x18	; 24
   1fdc4:	cb cf       	rjmp	.-106    	; 0x1fd5c <main+0x6ca>
    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 <analog2temp(int, unsigned char) [clone .constprop.70]>
   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 <main+0x770>
#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 <main+0x740>
#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 <analog2tempBed(int) [clone .lto_priv.431]>
   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 <main+0x7a0>
#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 <main+0x770>
#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 <analog2tempBed(int) [clone .lto_priv.431]>
   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 <main+0x7d0>
#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 <main+0x7a0>
#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 <analog2tempAmbient(int) [clone .lto_priv.430]>
   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 <main+0x800>
#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 <main+0x7d0>
#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 <analog2tempAmbient(int) [clone .lto_priv.430]>
   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 <main+0x830>
#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 <main+0x800>
#include <avr/interrupt.h>
#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 <puts_P>
    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 <adc_start_cycle()>

    // 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<<WGMx3);
   1ff70:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   1ff74:	8f 7e       	andi	r24, 0xEF	; 239
   1ff76:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
        TCCRxB |=  (1<<WGMx2);
   1ff7a:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   1ff7e:	88 60       	ori	r24, 0x08	; 8
   1ff80:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
        TCCRxA &= ~(1<<WGMx1);
   1ff84:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   1ff88:	8d 7f       	andi	r24, 0xFD	; 253
   1ff8a:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
        TCCRxA &= ~(1<<WGMx0);
   1ff8e:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   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<<COMxA0);
   1ff98:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   1ff9c:	8f 73       	andi	r24, 0x3F	; 63
   1ff9e:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
        TCCRxA &= ~(3<<COMxB0);
   1ffa2:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   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<<CSx2);
   1ffac:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   1ffb0:	84 60       	ori	r24, 0x04	; 4
   1ffb2:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
        TCCRxB &= ~(1<<CSx1);
   1ffb6:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   1ffba:	8d 7f       	andi	r24, 0xFD	; 253
   1ffbc:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
        TCCRxB &= ~(1<<CSx0);
   1ffc0:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   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_head>
  block_buffer_tail = 0;
   1fff0:	10 92 a5 0d 	sts	0x0DA5, r1	; 0x800da5 <block_buffer_tail>
  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 <main+0x96c>
  #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 <main+0x97a>
  #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 <main+0x986>
  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 <busy_state>
	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 <main+0xb46>
   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 <main+0x9b8>
   20052:	00 c0       	rjmp	.+0      	; 0x20054 <main+0x9c2>
   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 <main+0xb46>
		{
			lcd_clear();
   2005e:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>

			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 <lcd_puts_P(char const*)>

			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 <eSoundMode>
   20078:	82 30       	cpi	r24, 0x02	; 2
   2007a:	41 f0       	breq	.+16     	; 0x2008c <main+0x9fa>
				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 <main+0x9fa>

			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 <main+0xa18>
   200b2:	00 c0       	rjmp	.+0      	; 0x200b4 <main+0xa22>
   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_clear()>
	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_putc_at(unsigned char, unsigned char, char)>
	lcd_consume_click();
   200ec:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
	}
}

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 <reset_menu()::first>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   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 <main+0xa64>
			lcd_puts_at_P(1, i, item[first + i]);
		}

		manage_heater();
   2012e:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
        manage_inactivity(true);
   20132:	81 e0       	ldi	r24, 0x01	; 1
   20134:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>

		if (lcd_encoder) {
   20138:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   2013c:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   20140:	00 97       	sbiw	r24, 0x00	; 0
   20142:	71 f1       	breq	.+92     	; 0x201a0 <main+0xb0e>
			if (lcd_encoder < 0) {
   20144:	97 ff       	sbrs	r25, 7
   20146:	12 c0       	rjmp	.+36     	; 0x2016c <main+0xada>
				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 <main+0xabe>
   2014e:	a6 c0       	rjmp	.+332    	; 0x2029c <main+0xc0a>
				cursor_pos = 3;
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   20150:	87 e0       	ldi	r24, 0x07	; 7
   20152:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
				if (first < (uint8_t)(sizeof(item) / sizeof(item[0])) - 4) {
   20156:	80 91 dc 04 	lds	r24, 0x04DC	; 0x8004dc <reset_menu()::first>
   2015a:	18 16       	cp	r1, r24
   2015c:	2c f0       	brlt	.+10     	; 0x20168 <main+0xad6>
					first++;
   2015e:	8f 5f       	subi	r24, 0xFF	; 255
   20160:	80 93 dc 04 	sts	0x04DC, r24	; 0x8004dc <reset_menu()::first>
					lcd_clear();
   20164:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
			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 <main+0xae0>
			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 <main+0xabe>
				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_puts_at_P(unsigned char, unsigned char, char const*)>
			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_set_cursor(unsigned char, unsigned char)>
			lcd_putc('>');
   20186:	8e e3       	ldi	r24, 0x3E	; 62
   20188:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
			lcd_encoder = 0;
   2018c:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   20190:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
			_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 <delay2>
		}

		if (lcd_clicked()) {
   201a0:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   201a4:	88 23       	and	r24, r24
   201a6:	09 f4       	brne	.+2      	; 0x201aa <main+0xb18>
   201a8:	a4 cf       	rjmp	.-184    	; 0x200f2 <main+0xa60>
			return(cursor_pos + first);
   201aa:	80 91 dc 04 	lds	r24, 0x04DC	; 0x8004dc <reset_menu()::first>
   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 <lcd_clear()>
	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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
	switch (level) {
   201c2:	12 30       	cpi	r17, 0x02	; 2
   201c4:	09 f4       	brne	.+2      	; 0x201c8 <main+0xb36>
   201c6:	a0 c0       	rjmp	.+320    	; 0x20308 <main+0xc76>
   201c8:	08 f0       	brcs	.+2      	; 0x201cc <main+0xb3a>
   201ca:	79 c0       	rjmp	.+242    	; 0x202be <main+0xc2c>
   201cc:	11 23       	and	r17, r17
   201ce:	09 f4       	brne	.+2      	; 0x201d2 <main+0xb40>
   201d0:	93 c0       	rjmp	.+294    	; 0x202f8 <main+0xc66>
   201d2:	11 30       	cpi	r17, 0x01	; 1
   201d4:	09 f4       	brne	.+2      	; 0x201d8 <main+0xb46>
   201d6:	93 c0       	rjmp	.+294    	; 0x202fe <main+0xc6c>
			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 <busy_state>

	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(unsigned char*, unsigned char)>
  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 <eeprom_init_default_byte(unsigned char*, unsigned char)>

#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 <eeprom_read_byte>
   201fa:	18 2f       	mov	r17, r24
	if (silentMode == 0xff) silentMode = 0;
   201fc:	8f 3f       	cpi	r24, 0xFF	; 255
   201fe:	09 f4       	brne	.+2      	; 0x20202 <main+0xb70>
   20200:	10 e0       	ldi	r17, 0x00	; 0
	tmc2130_mode = TMC2130_MODE_NORMAL;
   20202:	10 92 8b 06 	sts	0x068B, r1	; 0x80068b <tmc2130_mode>

  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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20210:	91 e0       	ldi	r25, 0x01	; 1
   20212:	81 11       	cpse	r24, r1
   20214:	01 c0       	rjmp	.+2      	; 0x20218 <main+0xb86>
   20216:	90 e0       	ldi	r25, 0x00	; 0
   20218:	90 93 5c 02 	sts	0x025C, r25	; 0x80025c <tmc2130_sg_stop_on_crash>

	if (tmc2130_sg_stop_on_crash) {
   2021c:	88 23       	and	r24, r24
   2021e:	09 f4       	brne	.+2      	; 0x20222 <main+0xb90>
   20220:	a5 c0       	rjmp	.+330    	; 0x2036c <main+0xcda>
    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 <puts_P>
	}

#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 <eeprom_read_byte>
   20232:	c8 2e       	mov	r12, r24
   20234:	80 93 f8 04 	sts	0x04F8, r24	; 0x8004f8 <tmc2130_wave_fac>
	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 <eeprom_read_byte>
   20240:	d8 2e       	mov	r13, r24
   20242:	80 93 f9 04 	sts	0x04F9, r24	; 0x8004f9 <tmc2130_wave_fac+0x1>
	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 <eeprom_read_byte>
   2024e:	e8 2e       	mov	r14, r24
   20250:	80 93 fa 04 	sts	0x04FA, r24	; 0x8004fa <tmc2130_wave_fac+0x2>
#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 <eeprom_read_byte>
   2025c:	80 93 fb 04 	sts	0x04FB, r24	; 0x8004fb <tmc2130_wave_fac+0x3>
	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 <main+0xbd8>
   20266:	10 92 f8 04 	sts	0x04F8, r1	; 0x8004f8 <tmc2130_wave_fac>
	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 <main+0xbe2>
   20270:	10 92 f9 04 	sts	0x04F9, r1	; 0x8004f9 <tmc2130_wave_fac+0x1>
	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 <main+0xbec>
   2027a:	10 92 fa 04 	sts	0x04FA, r1	; 0x8004fa <tmc2130_wave_fac+0x2>
	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 <main+0xbf4>
   20282:	10 92 fb 04 	sts	0x04FB, r1	; 0x8004fb <tmc2130_wave_fac+0x3>
#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 <cs+0xbc>
   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 <main+0xc06>
   20296:	6d c0       	rjmp	.+218    	; 0x20372 <main+0xce0>
   20298:	21 50       	subi	r18, 0x01	; 1
   2029a:	f9 cf       	rjmp	.-14     	; 0x2028e <main+0xbfc>
					first++;
					lcd_clear();
				}
			}

			if (cursor_pos < 0) {
   2029c:	1f 3f       	cpi	r17, 0xFF	; 255
   2029e:	09 f0       	breq	.+2      	; 0x202a2 <main+0xc10>
   202a0:	68 cf       	rjmp	.-304    	; 0x20172 <main+0xae0>
				cursor_pos = 0;
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   202a2:	87 e0       	ldi	r24, 0x07	; 7
   202a4:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
				if (first > 0) {
   202a8:	80 91 dc 04 	lds	r24, 0x04DC	; 0x8004dc <reset_menu()::first>
   202ac:	18 16       	cp	r1, r24
   202ae:	2c f4       	brge	.+10     	; 0x202ba <main+0xc28>
					first--;
   202b0:	81 50       	subi	r24, 0x01	; 1
   202b2:	80 93 dc 04 	sts	0x04DC, r24	; 0x8004dc <reset_menu()::first>
					lcd_clear();
   202b6:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
					lcd_clear();
				}
			}

			if (cursor_pos < 0) {
				cursor_pos = 0;
   202ba:	10 e0       	ldi	r17, 0x00	; 0
   202bc:	5a cf       	rjmp	.-332    	; 0x20172 <main+0xae0>
// 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 <main+0xc7a>
   202c2:	14 30       	cpi	r17, 0x04	; 4
   202c4:	09 f0       	breq	.+2      	; 0x202c8 <main+0xc36>
   202c6:	88 cf       	rjmp	.-240    	; 0x201d8 <main+0xb46>
#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 <menu_progressbar_init(unsigned int, char const*)>
		// 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>
			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 <menu_progressbar_update(unsigned int)>
		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 <main+0xc46>
			eeprom_update_byte_notify((uint8_t*)i, 0xFF);
			menu_progressbar_update(i);
		}
		menu_progressbar_finish();
   202f2:	0f 94 de cf 	call	0x39fbc	; 0x39fbc <menu_progressbar_finish()>
   202f6:	40 cc       	rjmp	.-1920   	; 0x1fb78 <main+0x4e6>
	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 <lang_reset>
   202fc:	6d cf       	rjmp	.-294    	; 0x201d8 <main+0xb46>
		break;

	case 1: //Level 1: Reset statistics
		factory_reset_stats();
   202fe:	0e 94 a9 66 	call	0xcd52	; 0xcd52 <factory_reset_stats() [clone .lto_priv.429]>
		lcd_menu_statistics();
   20302:	0f 94 ad 3f 	call	0x27f5a	; 0x27f5a <lcd_menu_statistics()>
   20306:	68 cf       	rjmp	.-304    	; 0x201d8 <main+0xb46>
		break;

	case 2: // Level 2: Prepare for shipping
		factory_reset_stats();
   20308:	0e 94 a9 66 	call	0xcd52	; 0xcd52 <factory_reset_stats() [clone .lto_priv.429]>
		// 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 <lang_reset>

		// 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 <calibration_status_clear(unsigned char)>
    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>
		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 <Filament_sensor::setEnabled(bool)>
        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 <fsensor+0x1>
        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>
        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 <fsensor+0x2>
   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 <eeprom_update_byte>
    return fsensorDetected;
}
#endif

void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) {
    jamDetection = state;
   20344:	10 93 b7 17 	sts	0x17B7, r17	; 0x8017b7 <fsensor+0xe>
    oldPos = pat9125_y;
   20348:	80 91 8e 0e 	lds	r24, 0x0E8E	; 0x800e8e <pat9125_y>
   2034c:	90 91 8f 0e 	lds	r25, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   20350:	90 93 b9 17 	sts	0x17B9, r25	; 0x8017b9 <fsensor+0x10>
   20354:	80 93 b8 17 	sts	0x17B8, r24	; 0x8017b8 <fsensor+0xf>
    resetStepCount();
   20358:	0f 94 e1 7b 	call	0x2f7c2	; 0x2f7c2 <PAT9125_sensor::resetStepCount() [clone .constprop.234]>
    jamErrCnt = 0;
   2035c:	10 92 be 17 	sts	0x17BE, r1	; 0x8017be <fsensor+0x15>
   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 <eeprom_update_byte>
   2036a:	36 cf       	rjmp	.-404    	; 0x201d8 <main+0xb46>
  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 <main+0xb94>
	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>
	tmc2130_mres[Y_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[Y_AXIS]);
   20376:	80 91 7a 0e 	lds	r24, 0x0E7A	; 0x800e7a <cs+0xbd>
   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 <main+0xcf8>
   20386:	21 50       	subi	r18, 0x01	; 1
   20388:	fa cf       	rjmp	.-12     	; 0x2037e <main+0xcec>
   2038a:	20 93 f5 04 	sts	0x04F5, r18	; 0x8004f5 <tmc2130_mres+0x1>
	tmc2130_mres[Z_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[Z_AXIS]);
   2038e:	80 91 7b 0e 	lds	r24, 0x0E7B	; 0x800e7b <cs+0xbe>
   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 <main+0xd10>
   2039e:	21 50       	subi	r18, 0x01	; 1
   203a0:	fa cf       	rjmp	.-12     	; 0x20396 <main+0xd04>
   203a2:	20 93 f6 04 	sts	0x04F6, r18	; 0x8004f6 <tmc2130_mres+0x2>
	tmc2130_mres[E_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[E_AXIS]);
   203a6:	80 91 7c 0e 	lds	r24, 0x0E7C	; 0x800e7c <cs+0xbf>
   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 <main+0xd28>
   203b6:	21 50       	subi	r18, 0x01	; 1
   203b8:	fa cf       	rjmp	.-12     	; 0x203ae <main+0xd1c>
   203ba:	20 93 f7 04 	sts	0x04F7, r18	; 0x8004f7 <tmc2130_mres+0x3>
    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 <UserECoolEnabled()>
   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 <tmc2130_init(TMCInitParams)>
  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 <axis_known_position>
    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 <axis_known_position+0x1>
  #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<<WGM13);
   20466:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   2046a:	8f 7e       	andi	r24, 0xEF	; 239
   2046c:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
  TCCR1B |=  (1<<WGM12);
   20470:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   20474:	88 60       	ori	r24, 0x08	; 8
   20476:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
  TCCR1A &= ~(1<<WGM11);
   2047a:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   2047e:	8d 7f       	andi	r24, 0xFD	; 253
   20480:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
  TCCR1A &= ~(1<<WGM10);
   20484:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   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<<COM1A0);
   2048e:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   20492:	8f 73       	andi	r24, 0x3F	; 63
   20494:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
  TCCR1A &= ~(3<<COM1B0);
   20498:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   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<<CS10)) | (2<<CS10);
   204a2:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   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 <main+0xe6e>
   204fe:	80 e0       	ldi	r24, 0x00	; 0
   20500:	80 93 8b 06 	sts	0x068B, r24	; 0x80068b <tmc2130_mode>
	update_mode_profile();
   20504:	0f 94 98 64 	call	0x2c930	; 0x2c930 <update_mode_profile()>
   20508:	0e 94 8a f0 	call	0x1e114	; 0x1e114 <UserECoolEnabled()>
   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 <tmc2130_init(TMCInitParams)>

	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 <world2machine_reset()>

    // 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 <clamp_to_software_endstops(float*)>
    plan_set_position_curposXYZE();
   20520:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>

    // 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 <main+0xea6>
}


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 <puts_P>
    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 <lcd_show_fullscreen_message_and_wait_P(char const*)>
}

#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 <eeprom_read_byte>
   20540:	82 34       	cpi	r24, 0x42	; 66
   20542:	59 f4       	brne	.+22     	; 0x2055a <main+0xec8>
    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 <eeprom_write_byte>
        // 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 <eeprom_read_word>
        lcd_show_fullscreen_message_and_wait_P(kill_msg);
   20556:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>

    // report kill() events
    fw_kill_init();

#ifdef FILAMENT_SENSOR
    fsensor.init();
   2055a:	0f 94 30 7c 	call	0x2f860	; 0x2f860 <PAT9125_sensor::init() [clone .constprop.230]>
#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 <eeprom_read_byte>
   20568:	91 e0       	ldi	r25, 0x01	; 1
   2056a:	81 30       	cpi	r24, 0x01	; 1
   2056c:	09 f0       	breq	.+2      	; 0x20570 <main+0xede>
   2056e:	90 e0       	ldi	r25, 0x00	; 0
   20570:	90 93 00 17 	sts	0x1700, r25	; 0x801700 <card+0x273>

	// 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 <CardReader::mount(bool) [clone .constprop.216]>
#include <avr/eeprom.h>
#include <stdint.h>

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(unsigned char*, unsigned char)>
    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(unsigned char*, unsigned char)>
    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(unsigned char*, unsigned char)>
    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_byte(unsigned char*, unsigned char)>
    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(unsigned int*, unsigned int)>
    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(unsigned int*, unsigned int)>
    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(unsigned int*, unsigned int)>
    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(unsigned int*, unsigned int)>

    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(unsigned int*, unsigned int)>
    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_word(unsigned int*, unsigned int)>
    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(unsigned char*, unsigned char)>
    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_byte(unsigned char*, unsigned char)>
    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 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.246]>
    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 <eeprom_read_byte>
   2060e:	8f 3f       	cpi	r24, 0xFF	; 255
   20610:	71 f4       	brne	.+28     	; 0x2062e <main+0xf9c>
        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 <eeprom_update_byte>
    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_read_word>
        eeprom_update_word(reinterpret_cast<uint16_t *>(&(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 <eeprom_update_word>
   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_default_sheet_name(unsigned char, SheetName&)>
        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 <eeprom_init_default_block(void*, unsigned int, void const*)>
        int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z);
        eeprom_update_word(reinterpret_cast<uint16_t *>(&(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 <main+0xfa6>
        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 <eeprom_read_byte>
   20668:	0e 94 d9 75 	call	0xebb2	; 0xebb2 <eeprom_is_sheet_initialized(unsigned char)>
   2066c:	81 11       	cpse	r24, r1
   2066e:	02 c0       	rjmp	.+4      	; 0x20674 <main+0xfe2>
    {
        eeprom_switch_to_next_sheet();
   20670:	0e 94 fb 75 	call	0xebf6	; 0xebf6 <eeprom_switch_to_next_sheet()>
    }
    check_babystep();
   20674:	0e 94 17 79 	call	0xf22e	; 0xf22e <check_babystep()>

    // 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 <eeprom_read_byte>
   20680:	8f 3f       	cpi	r24, 0xFF	; 255
   20682:	41 f4       	brne	.+16     	; 0x20694 <main+0x1002>
#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 <eeprom_update_block>

#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(unsigned long*, unsigned long) [clone .constprop.246]>
    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(unsigned long*, unsigned long) [clone .constprop.246]>
    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_dword(unsigned long*, unsigned long) [clone .constprop.246]>
    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(unsigned char*, unsigned char)>

    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
	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 <eeprom_read_byte>
   206c8:	0e 94 cc 71 	call	0xe398	; 0xe398 <lang_select>
   206cc:	81 11       	cpse	r24, r1
   206ce:	02 c0       	rjmp	.+4      	; 0x206d4 <main+0x1042>
		lcd_language();
   206d0:	0e 94 0a db 	call	0x1b614	; 0x1b614 <lcd_language()>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>

	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 <eeprom_read_byte>
   206e6:	8f 3f       	cpi	r24, 0xFF	; 255
   206e8:	d9 f4       	brne	.+54     	; 0x20720 <main+0x108e>
        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 <eeprom_update_byte>
   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 <eeprom_update_word>
   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 <main+0x106a>
        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_byte>
			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(unsigned char*, unsigned char)>
	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(unsigned char*, unsigned char)>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
}

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(unsigned char*, unsigned char)>
	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(unsigned char*, unsigned char)>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>

	//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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
#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 <busy_state>
    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 <main+0x1112>
   207a8:	00 c0       	rjmp	.+0      	; 0x207aa <main+0x1118>
   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 <main+0x113e>
        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 <lang_get_translation>
   207cc:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
#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 <main+0x1162>
   207d4:	03 30       	cpi	r16, 0x03	; 3
   207d6:	09 f4       	brne	.+2      	; 0x207da <main+0x1148>
   207d8:	37 c1       	rjmp	.+622    	; 0x20a48 <main+0x13b6>
   207da:	01 30       	cpi	r16, 0x01	; 1
   207dc:	b9 f4       	brne	.+46     	; 0x2080c <main+0x117a>
	  //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 <lang_get_translation>
   207e6:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
    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 <main+0x1176>
		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 <lang_get_translation>
   207fc:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   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>
		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 <main+0x118e>
	  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 <lang_get_translation>
   20818:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
	  Config_StoreSettings();
   2081c:	0e 94 3c 82 	call	0x10478	; 0x10478 <Config_StoreSettings()>
  }

  // 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 <calibration_status_get(unsigned char)>
   20826:	88 23       	and	r24, r24
   20828:	c9 f0       	breq	.+50     	; 0x2085c <main+0x11ca>
      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 <eeprom_read_byte>
  }

  // 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 <main+0x11c2>
          // 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 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])>
  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 <main+0x11c2>
              // 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 <lang_get_translation>
   2084e:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
              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>
          }
      }
      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 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])>
   20864:	f8 2e       	mov	r15, r24
   20866:	88 23       	and	r24, r24
   20868:	31 f0       	breq	.+12     	; 0x20876 <main+0x11e4>
      if (!calibration_status_get(CALIBRATION_WIZARD_STEPS)) {
   2086a:	8f e1       	ldi	r24, 0x1F	; 31
   2086c:	0e 94 58 ef 	call	0x1deb0	; 0x1deb0 <calibration_status_get(unsigned char)>
   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 <eeprom_update_byte>
   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 <main+0x11e8>
        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>
    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>
    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 <eeprom_update_word>
    // 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 <eeprom_update_word>
          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 <eeprom_read_byte>
   208da:	88 23       	and	r24, r24
   208dc:	09 f4       	brne	.+2      	; 0x208e0 <main+0x124e>
   208de:	c1 c0       	rjmp	.+386    	; 0x20a62 <main+0x13d0>
      // 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_wizard(WizState)>
              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 <busy_state>
#endif //DEBUG_DISABLE_STARTMSGS
  lcd_update_enable(true);
   208ec:	81 e0       	ldi	r24, 0x01	; 1
   208ee:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
  lcd_clear();
   208f2:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
  lcd_update(2);
   208f6:	82 e0       	ldi	r24, 0x02	; 2
   208f8:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>

#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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20906:	80 93 f2 04 	sts	0x04F2, r24	; 0x8004f2 <tmc2130_home_origin>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20914:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <tmc2130_home_bsteps>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20922:	80 93 58 02 	sts	0x0258, r24	; 0x800258 <tmc2130_home_fsteps>

	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20930:	80 93 f3 04 	sts	0x04F3, r24	; 0x8004f3 <tmc2130_home_origin+0x1>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   2093e:	80 93 5b 02 	sts	0x025B, r24	; 0x80025b <tmc2130_home_bsteps+0x1>
	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   2094c:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <tmc2130_home_fsteps+0x1>

	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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   2095a:	80 93 f1 04 	sts	0x04F1, r24	; 0x8004f1 <tmc2130_home_enabled>

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 <xfdump_check_state(dump_crash_reason*)>
   20966:	88 23       	and	r24, r24
   20968:	89 f0       	breq	.+34     	; 0x2098c <main+0x12fa>
    {
        // 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 <puts_P>

#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 <main+0x12fa>
           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 <eeprom_read_byte>
    {
        // 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 <main+0x12fa>
           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 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        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 <eeprom_update_byte>

    // 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 <printer_recovering()>
   2099a:	88 23       	and	r24, r24
   2099c:	d9 f1       	breq	.+118    	; 0x20a14 <main+0x1382>
      manage_heater(); // Update temperatures
   2099e:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
      //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 <eeprom_read_byte>
   209aa:	08 2f       	mov	r16, r24
   209ac:	80 93 6a 02 	sts	0x026A, r24	; 0x80026a <saved_printing_type>
    return current_temperature_bed_raw;
  };
#endif

FORCE_INLINE float degBed() {
  return current_temperature_bed;
   209b0:	80 90 ed 04 	lds	r8, 0x04ED	; 0x8004ed <current_temperature_bed>
   209b4:	90 90 ee 04 	lds	r9, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   209b8:	a0 90 ef 04 	lds	r10, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   209bc:	b0 90 f0 04 	lds	r11, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
#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 <eeprom_read_byte>
   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 <main+0x1366>
   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 <main+0x137c>
   20a0c:	58 c0       	rjmp	.+176    	; 0x20abe <main+0x142c>
#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 <recover_print(unsigned char)>
    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 <main+0x144e>
   20a32:	0e 94 13 67 	call	0xce26	; 0xce26 <printer_recovering()>
   20a36:	88 23       	and	r24, r24
   20a38:	09 f4       	brne	.+2      	; 0x20a3c <main+0x13aa>
   20a3a:	52 c0       	rjmp	.+164    	; 0x20ae0 <main+0x144e>
    {
        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 <serialprintlnPGM(char const*)>
        uvlo_drain_reset();
   20a44:	0f 94 13 60 	call	0x2c026	; 0x2c026 <uvlo_drain_reset() [clone .lto_priv.428]>
	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 <lang_get_translation>
   20a50:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
    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 <eeprom_write_word>
   20a60:	c4 ce       	rjmp	.-632    	; 0x207ea <main+0x1158>
      // 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 <main+0x1250>
      // 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 <calibration_status_get(unsigned char)>
   20a6c:	81 11       	cpse	r24, r1
   20a6e:	07 c0       	rjmp	.+14     	; 0x20a7e <main+0x13ec>
          // 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 <lang_get_translation>
   20a78:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   20a7c:	34 cf       	rjmp	.-408    	; 0x208e6 <main+0x1254>
  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 <calibration_status_get(unsigned char)>
   20a84:	81 11       	cpse	r24, r1
   20a86:	03 c0       	rjmp	.+6      	; 0x20a8e <main+0x13fc>
          // 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 <main+0x13e2>
      } 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 <calibration_status_get(unsigned char)>
   20a94:	81 11       	cpse	r24, r1
   20a96:	06 c0       	rjmp	.+12     	; 0x20aa4 <main+0x1412>
              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 <lang_get_translation>
   20aa0:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
#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 <calibration_status_get(unsigned char)>
   20aaa:	81 11       	cpse	r24, r1
   20aac:	1c cf       	rjmp	.-456    	; 0x208e6 <main+0x1254>
   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 <main+0x1426>
   20ab6:	17 cf       	rjmp	.-466    	; 0x208e6 <main+0x1254>
              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 <main+0x13e2>
        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 <main+0x1434>
          recover_print(0);
   20ac2:	80 e0       	ldi	r24, 0x00	; 0
   20ac4:	a5 cf       	rjmp	.-182    	; 0x20a10 <main+0x137e>
        } 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 <lang_get_translation>
   20ace:	41 e0       	ldi	r20, 0x01	; 1
   20ad0:	60 e0       	ldi	r22, 0x00	; 0
   20ad2:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
          if ( btn == LCD_LEFT_BUTTON_CHOICE) {
   20ad6:	88 23       	and	r24, r24
   20ad8:	a1 f3       	breq	.-24     	; 0x20ac2 <main+0x1430>
            recover_print(0);
          } else { // LCD_MIDDLE_BUTTON_CHOICE
            cancel_saved_printing();
   20ada:	0e 94 45 64 	call	0xc88a	; 0xc88a <cancel_saved_printing()>
   20ade:	9a cf       	rjmp	.-204    	; 0x20a14 <main+0x1382>
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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20aea:	80 93 eb 04 	sts	0x04EB, r24	; 0x8004eb <oCheckMode>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20af8:	80 93 ea 04 	sts	0x04EA, r24	; 0x8004ea <oNozzleDiameter>
    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 <eeprom_init_default_word(unsigned int*, unsigned int)>

    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20b12:	80 93 e9 04 	sts	0x04E9, r24	; 0x8004e9 <oCheckModel>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20b20:	80 93 e8 04 	sts	0x04E8, r24	; 0x8004e8 <oCheckVersion>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20b2e:	80 93 e7 04 	sts	0x04E7, r24	; 0x8004e7 <oCheckGcode>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
   20b3c:	80 93 e6 04 	sts	0x04E6, r24	; 0x8004e6 <oCheckFilament>
  // 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 <busy_state>
				: "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 <planner_aborted>

    if(Stopped) {
   20b78:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   20b7c:	88 23       	and	r24, r24
   20b7e:	09 f4       	brne	.+2      	; 0x20b82 <main+0x14f0>
   20b80:	c4 c0       	rjmp	.+392    	; 0x20d0a <main+0x1678>
        // 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 <busy_state>
    } 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 <printingIsPaused()>
   20b8a:	88 23       	and	r24, r24
   20b8c:	09 f4       	brne	.+2      	; 0x20b90 <main+0x14fe>
   20b8e:	c0 c0       	rjmp	.+384    	; 0x20d10 <main+0x167e>
   20b90:	80 91 6a 02 	lds	r24, 0x026A	; 0x80026a <saved_printing_type>
   20b94:	81 30       	cpi	r24, 0x01	; 1
   20b96:	09 f0       	breq	.+2      	; 0x20b9a <main+0x1508>
   20b98:	bb c0       	rjmp	.+374    	; 0x20d10 <main+0x167e>
		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 <Timer<unsigned short>::start()>
    }
    else
#endif
    {

        get_command();
   20ba2:	0e 94 b8 82 	call	0x10570	; 0x10570 <get_command()>
  // 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 <main+0x153e>
      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 <Timer<unsigned short>::expired(unsigned short)>
   20bba:	81 11       	cpse	r24, r1
   20bbc:	09 c0       	rjmp	.+18     	; 0x20bd0 <main+0x153e>
      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 <card+0x3>
   20bc6:	88 23       	and	r24, r24
   20bc8:	09 f4       	brne	.+2      	; 0x20bcc <main+0x153a>
   20bca:	ae c0       	rjmp	.+348    	; 0x20d28 <main+0x1696>
   20bcc:	0f 94 ae 76 	call	0x2ed5c	; 0x2ed5c <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]>

  #ifdef SDSUPPORT
  card.checkautostart(false);
  #endif
  if(buflen)
   20bd0:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
   20bd4:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   20bd8:	89 2b       	or	r24, r25
   20bda:	09 f4       	brne	.+2      	; 0x20bde <main+0x154c>
   20bdc:	61 c0       	rjmp	.+194    	; 0x20ca0 <main+0x160e>
  {
    cmdbuffer_front_already_processed = false;
   20bde:	10 92 a1 10 	sts	0x10A1, r1	; 0x8010a1 <cmdbuffer_front_already_processed>
    #ifdef SDSUPPORT
      if(card.saving)
   20be2:	80 91 8d 14 	lds	r24, 0x148D	; 0x80148d <card>
   20be6:	88 23       	and	r24, r24
   20be8:	d1 f1       	breq	.+116    	; 0x20c5e <main+0x15cc>
      {
        // 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 <bufindr>
   20bee:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   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 <strstr_P>
   20c04:	89 2b       	or	r24, r25
   20c06:	09 f0       	breq	.+2      	; 0x20c0a <main+0x1578>
   20c08:	9c c0       	rjmp	.+312    	; 0x20d42 <main+0x16b0>
    else
        SERIAL_PROTOCOLLNPGM("Not SD printing");
}
void CardReader::write_command(char *buf)
{
  file.writeError = false;
   20c0a:	10 92 1f 17 	sts	0x171F, r1	; 0x80171f <card+0x292>
/** 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 <main+0x157e>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]>
  file.write(buf); //write command
  file.write("\r\n"); //write line termination
  if (file.writeError)
   20c30:	80 91 1f 17 	lds	r24, 0x171F	; 0x80171f <card+0x292>
   20c34:	88 23       	and	r24, r24
   20c36:	41 f0       	breq	.+16     	; 0x20c48 <main+0x15b6>
  {
    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 <serialprintPGM(char const*)>
    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 <serialprintlnPGM(char const*)>
          card.write_command(CMDBUFFER_CURRENT_STRING);
          if(card.logging)
   20c48:	80 91 8e 14 	lds	r24, 0x148E	; 0x80148e <card+0x1>
   20c4c:	88 23       	and	r24, r24
   20c4e:	09 f4       	brne	.+2      	; 0x20c52 <main+0x15c0>
   20c50:	73 c0       	rjmp	.+230    	; 0x20d38 <main+0x16a6>
*/


void process_commands()
{
	if (!buflen) return; //empty command
   20c52:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
   20c56:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   20c5a:	89 2b       	or	r24, r25
   20c5c:	11 f0       	breq	.+4      	; 0x20c62 <main+0x15d0>
   20c5e:	0e 94 1a 95 	call	0x12a34	; 0x12a34 <process_commands() [clone .part.46]>
      }
    #else
      process_commands();
    #endif //SDSUPPORT

    if (! cmdbuffer_front_already_processed && buflen)
   20c62:	80 91 a1 10 	lds	r24, 0x10A1	; 0x8010a1 <cmdbuffer_front_already_processed>
   20c66:	81 11       	cpse	r24, r1
   20c68:	19 c0       	rjmp	.+50     	; 0x20c9c <main+0x160a>
   20c6a:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
   20c6e:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   20c72:	89 2b       	or	r24, r25
   20c74:	99 f0       	breq	.+38     	; 0x20c9c <main+0x160a>
    {
      // 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 <bufindr>
   20c7a:	f0 91 92 12 	lds	r31, 0x1292	; 0x801292 <bufindr+0x1>
   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 <main+0x15f8>
   20c88:	6b c0       	rjmp	.+214    	; 0x20d60 <main+0x16ce>
        {
          // 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 <planner_add_sd_length(unsigned int)>
          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 <cmdqueue_pop_front()>
    }
	host_keepalive();
   20c9c:	0e 94 3f 7f 	call	0xfe7e	; 0xfe7e <host_keepalive()>
  }
}
  //check heater every n milliseconds
  manage_heater();
   20ca0:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
  manage_inactivity(printingIsPaused());
   20ca4:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   20ca8:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
//=============================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 <lcd_update(unsigned char)>
#ifdef TMC2130
	tmc2130_check_overtemp();
   20cbc:	0f 94 c3 2a 	call	0x25586	; 0x25586 <tmc2130_check_overtemp()>
	if (tmc2130_sg_crash)
   20cc0:	80 91 0c 05 	lds	r24, 0x050C	; 0x80050c <tmc2130_sg_crash>
   20cc4:	88 23       	and	r24, r24
   20cc6:	79 f0       	breq	.+30     	; 0x20ce6 <main+0x1654>
	{
		uint8_t crash = tmc2130_sg_crash;
		tmc2130_sg_crash = 0;
   20cc8:	10 92 0c 05 	sts	0x050C, r1	; 0x80050c <tmc2130_sg_crash>
//		crashdet_stop_and_save_print();
		switch (crash)
   20ccc:	82 30       	cpi	r24, 0x02	; 2
   20cce:	09 f4       	brne	.+2      	; 0x20cd2 <main+0x1640>
   20cd0:	53 c0       	rjmp	.+166    	; 0x20d78 <main+0x16e6>
   20cd2:	83 30       	cpi	r24, 0x03	; 3
   20cd4:	09 f4       	brne	.+2      	; 0x20cd8 <main+0x1646>
   20cd6:	54 c0       	rjmp	.+168    	; 0x20d80 <main+0x16ee>
   20cd8:	81 30       	cpi	r24, 0x01	; 1
   20cda:	29 f4       	brne	.+10     	; 0x20ce6 <main+0x1654>
		{
		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 <enquecommand(char const*, bool)>
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 <main+0x166a>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]>
    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 <main+0x1672>
   20d02:	38 cf       	rjmp	.-400    	; 0x20b74 <main+0x14e2>
   20d04:	0e 94 00 00 	call	0	; 0x0 <__vectors>
   20d08:	35 cf       	rjmp	.-406    	; 0x20b74 <main+0x14e2>
        // 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 <busy_state>
   20d0e:	3b cf       	rjmp	.-394    	; 0x20b86 <main+0x14f4>
    }

	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 <Timer<unsigned short>::expired(unsigned short)>
   20d1c:	88 23       	and	r24, r24
   20d1e:	09 f4       	brne	.+2      	; 0x20d22 <main+0x1690>
   20d20:	40 cf       	rjmp	.-384    	; 0x20ba2 <main+0x1510>
   20d22:	b0 92 b7 0d 	sts	0x0DB7, r11	; 0x800db7 <_ZL13printer_state.lto_priv.403>
   20d26:	3d cf       	rjmp	.-390    	; 0x20ba2 <main+0x1510>
      return;
  }
  autostart_stilltocheck = false;
  if(!mounted)
  {
    mount();
   20d28:	81 e0       	ldi	r24, 0x01	; 1
   20d2a:	0f 94 b9 81 	call	0x30372	; 0x30372 <CardReader::mount(bool) [clone .constprop.216]>
    if(!mounted) //fail
   20d2e:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   20d32:	81 11       	cpse	r24, r1
   20d34:	4b cf       	rjmp	.-362    	; 0x20bcc <main+0x153a>
   20d36:	4c cf       	rjmp	.-360    	; 0x20bd0 <main+0x153e>
        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 <serialprintlnPGM(char const*)>
   20d40:	90 cf       	rjmp	.-224    	; 0x20c62 <main+0x15d0>
    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 <SdBaseFile::sync()>
  file.close();
   20d4a:	8f e1       	ldi	r24, 0x1F	; 31
   20d4c:	97 e1       	ldi	r25, 0x17	; 23
   20d4e:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
  saving = false;
   20d52:	10 92 8d 14 	sts	0x148D, r1	; 0x80148d <card>
  logging = false;
   20d56:	10 92 8e 14 	sts	0x148E, r1	; 0x80148e <card+0x1>
   20d5a:	8f e3       	ldi	r24, 0x3F	; 63
   20d5c:	9d e6       	ldi	r25, 0x6D	; 109
   20d5e:	ee cf       	rjmp	.-36     	; 0x20d3c <main+0x16aa>
          // 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 <main+0x16d4>
   20d64:	99 cf       	rjmp	.-206    	; 0x20c98 <main+0x1606>
   20d66:	80 91 8f 14 	lds	r24, 0x148F	; 0x80148f <card+0x2>
   20d6a:	81 11       	cpse	r24, r1
   20d6c:	95 cf       	rjmp	.-214    	; 0x20c98 <main+0x1606>
		  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 <main+0x1600>
		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 <main+0x1650>
		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 <main+0x1650>
{
	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 <main+0x1700>
   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 <Config_ResetDefault()>
	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 <cs+0x6c>
   20dc4:	30 91 2a 0e 	lds	r19, 0x0E2A	; 0x800e2a <cs+0x6d>
   20dc8:	40 91 2b 0e 	lds	r20, 0x0E2B	; 0x800e2b <cs+0x6e>
   20dcc:	50 91 2c 0e 	lds	r21, 0x0E2C	; 0x800e2c <cs+0x6f>
   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 <cs+0x78>
   20e00:	30 91 36 0e 	lds	r19, 0x0E36	; 0x800e36 <cs+0x79>
   20e04:	40 91 37 0e 	lds	r20, 0x0E37	; 0x800e37 <cs+0x7a>
   20e08:	50 91 38 0e 	lds	r21, 0x0E38	; 0x800e38 <cs+0x7b>
   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 <fanSpeedSoftPwm>
   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 <main+0x17ac>
   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 <analog2temp(int, unsigned char) [clone .constprop.70]>
   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 <main+0x17e4>
   20e72:	0c 94 e3 fe 	jmp	0x1fdc6	; 0x1fdc6 <main+0x734>
#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 <main+0x17c4>

00020e8a <lcd_commands() [clone .part.41]>:
	}
}

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 <lcd_commands_type>
   20eb2:	81 30       	cpi	r24, 0x01	; 1
   20eb4:	09 f0       	breq	.+2      	; 0x20eb8 <lcd_commands() [clone .part.41]+0x2e>
   20eb6:	61 c0       	rjmp	.+194    	; 0x20f7a <lcd_commands() [clone .part.41]+0xf0>
   20eb8:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   20ebc:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
    {
        if (!blocks_queued() && !homing_flag)
   20ec0:	98 13       	cpse	r25, r24
   20ec2:	5b c0       	rjmp	.+182    	; 0x20f7a <lcd_commands() [clone .part.41]+0xf0>
   20ec4:	80 91 a6 0d 	lds	r24, 0x0DA6	; 0x800da6 <homing_flag>
   20ec8:	81 11       	cpse	r24, r1
   20eca:	57 c0       	rjmp	.+174    	; 0x20f7a <lcd_commands() [clone .part.41]+0xf0>
        {
            custom_message_type = CustomMsg::Status;
   20ecc:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
            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 <lang_get_translation>
   20ed8:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
            lcd_commands_type = LcdCommands::Idle;
   20edc:	10 92 b3 0d 	sts	0x0DB3, r1	; 0x800db3 <lcd_commands_type>
   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 <lcd_commands_step>
#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 <Stopwatch::stop()>
    save_statistics();
   20eee:	0e 94 b7 65 	call	0xcb6e	; 0xcb6e <save_statistics()>

    // 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 <raise_z(float)>

    // 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 <axis_known_position>
   20f02:	88 23       	and	r24, r24
   20f04:	21 f1       	breq	.+72     	; 0x20f4e <lcd_commands() [clone .part.41]+0xc4>
   20f06:	80 91 8f 06 	lds	r24, 0x068F	; 0x80068f <axis_known_position+0x1>
   20f0a:	88 23       	and	r24, r24
   20f0c:	01 f1       	breq	.+64     	; 0x20f4e <lcd_commands() [clone .part.41]+0xc4>
        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 <current_position>
   20f1a:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   20f1e:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   20f22:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
        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 <current_position+0x4>
   20f32:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   20f36:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   20f3a:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
        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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   20f4a:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <lcd_commands() [clone .part.41]+0xce>
   20f56:	c8 c0       	rjmp	.+400    	; 0x210e8 <lcd_commands() [clone .part.41]+0x25e>
        // 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 <lcd_cooldown() [clone .lto_priv.435]>

    finishAndDisableSteppers(); //M84
   20f6c:	0e 94 00 82 	call	0x10400	; 0x10400 <finishAndDisableSteppers()>
    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 <axis_relative_modes>
    did_pause_print = false; // Clear pause state in case the print was aborted while paused
   20f76:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <did_pause_print>
            lcd_commands_step = 0;
            lcd_print_stop_finish();
        }
    }

	if (lcd_commands_type == LcdCommands::LongPause)
   20f7a:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   20f7e:	82 30       	cpi	r24, 0x02	; 2
   20f80:	09 f0       	breq	.+2      	; 0x20f84 <lcd_commands() [clone .part.41]+0xfa>
   20f82:	6a c0       	rjmp	.+212    	; 0x21058 <lcd_commands() [clone .part.41]+0x1ce>
   20f84:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   20f88:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
	{
		if (!blocks_queued() && !homing_flag)
   20f8c:	98 13       	cpse	r25, r24
   20f8e:	64 c0       	rjmp	.+200    	; 0x21058 <lcd_commands() [clone .part.41]+0x1ce>
   20f90:	80 91 a6 0d 	lds	r24, 0x0DA6	; 0x800da6 <homing_flag>
   20f94:	81 11       	cpse	r24, r1
   20f96:	60 c0       	rjmp	.+192    	; 0x21058 <lcd_commands() [clone .part.41]+0x1ce>
		{
			if (custom_message_type != CustomMsg::M117)
   20f98:	80 91 c3 06 	lds	r24, 0x06C3	; 0x8006c3 <custom_message_type>
   20f9c:	87 30       	cpi	r24, 0x07	; 7
   20f9e:	41 f0       	breq	.+16     	; 0x20fb0 <lcd_commands() [clone .part.41]+0x126>
			{
				custom_message_type = CustomMsg::Status;
   20fa0:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
				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 <lang_get_translation>
   20fac:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
			}
			lcd_commands_type = LcdCommands::Idle;
   20fb0:	10 92 b3 0d 	sts	0x0DB3, r1	; 0x800db3 <lcd_commands_type>
   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 <lcd_commands_step>
}
#endif //PINDA_THERMISTOR

void long_pause() //long pause print
{
	st_synchronize();
   20fbe:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    // Stop heaters
    heating_status = HeatingStatus::NO_HEATING;
   20fc2:	10 92 e1 03 	sts	0x03E1, r1	; 0x8003e1 <heating_status>
  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 <target_temperature+0x1>
   20fca:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
    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 <raise_z(float)>

    // Move XY to side
    if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
   20fe2:	80 91 8e 06 	lds	r24, 0x068E	; 0x80068e <axis_known_position>
   20fe6:	88 23       	and	r24, r24
   20fe8:	51 f1       	breq	.+84     	; 0x2103e <lcd_commands() [clone .part.41]+0x1b4>
   20fea:	80 91 8f 06 	lds	r24, 0x068F	; 0x80068f <axis_known_position+0x1>
   20fee:	88 23       	and	r24, r24
   20ff0:	31 f1       	breq	.+76     	; 0x2103e <lcd_commands() [clone .part.41]+0x1b4>
        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 <current_position>
   21006:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   2100a:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   2100e:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
        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 <current_position+0x4>
   21026:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   2102a:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   2102e:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
        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 <plan_buffer_line_curposXYZE(float)>
   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 <lcd_commands() [clone .part.41]+0x1be>
   21046:	7a c0       	rjmp	.+244    	; 0x2113c <lcd_commands() [clone .part.41]+0x2b2>
        // 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 <lcd_commands_type>
   2105c:	84 30       	cpi	r24, 0x04	; 4
   2105e:	09 f0       	breq	.+2      	; 0x21062 <lcd_commands() [clone .part.41]+0x1d8>
   21060:	a7 c0       	rjmp	.+334    	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
	{
		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 <eeprom_read_word>
   2106a:	30 91 a4 0d 	lds	r19, 0x0DA4	; 0x800da4 <block_buffer_head>
   2106e:	20 91 a5 0d 	lds	r18, 0x0DA5	; 0x800da5 <block_buffer_tail>
		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 <lcd_commands() [clone .part.41]+0x4d4>
   21076:	20 91 a2 10 	lds	r18, 0x10A2	; 0x8010a2 <buflen>
   2107a:	30 91 a3 10 	lds	r19, 0x10A3	; 0x8010a3 <buflen+0x1>
   2107e:	23 2b       	or	r18, r19
   21080:	09 f0       	breq	.+2      	; 0x21084 <lcd_commands() [clone .part.41]+0x1fa>
   21082:	6d c1       	rjmp	.+730    	; 0x2135e <lcd_commands() [clone .part.41]+0x4d4>
   21084:	c0 91 a8 0d 	lds	r28, 0x0DA8	; 0x800da8 <saved_printing>
   21088:	c1 11       	cpse	r28, r1
   2108a:	69 c1       	rjmp	.+722    	; 0x2135e <lcd_commands() [clone .part.41]+0x4d4>
        {
            if (lcd_commands_step == 0)
   2108c:	20 91 fa 03 	lds	r18, 0x03FA	; 0x8003fa <lcd_commands_step>
   21090:	21 11       	cpse	r18, r1
   21092:	57 c0       	rjmp	.+174    	; 0x21142 <lcd_commands() [clone .part.41]+0x2b8>
                lcd_commands_step = 12;
   21094:	2c e0       	ldi	r18, 0x0C	; 12
            else
                lcd_commands_step--;
   21096:	20 93 fa 03 	sts	0x03FA, r18	; 0x8003fa <lcd_commands_step>
	}

	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 <lcd_commands_step>
   210ba:	e1 50       	subi	r30, 0x01	; 1
   210bc:	ec 30       	cpi	r30, 0x0C	; 12
   210be:	08 f0       	brcs	.+2      	; 0x210c2 <lcd_commands() [clone .part.41]+0x238>
   210c0:	77 c0       	rjmp	.+238    	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
   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 <fanSpeed>
{
#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 <resetFanCheck()>
    setExtruderAutoFanState(1);
   210f0:	81 e0       	ldi	r24, 0x01	; 1
   210f2:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>
        // 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 <MMU2::mmu2+0x6f>
   210fa:	81 30       	cpi	r24, 0x01	; 1
   210fc:	09 f0       	breq	.+2      	; 0x21100 <lcd_commands() [clone .part.41]+0x276>
   210fe:	34 cf       	rjmp	.-408    	; 0x20f68 <lcd_commands() [clone .part.41]+0xde>
        fanSpeed = 0;

        // restore the auto hotend state
        hotendDefaultAutoFanState();

        if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament()
   21100:	80 91 8f 13 	lds	r24, 0x138F	; 0x80138f <MMU2::mmu2+0x45>
   21104:	88 23       	and	r24, r24
   21106:	09 f4       	brne	.+2      	; 0x2110a <lcd_commands() [clone .part.41]+0x280>
   21108:	2f cf       	rjmp	.-418    	; 0x20f68 <lcd_commands() [clone .part.41]+0xde>
#ifdef FANCHECK
            && fan_check_error != EFCE_REPORTED
   2110a:	80 91 e4 03 	lds	r24, 0x03E4	; 0x8003e4 <fan_check_error>
   2110e:	82 30       	cpi	r24, 0x02	; 2
   21110:	09 f4       	brne	.+2      	; 0x21114 <lcd_commands() [clone .part.41]+0x28a>
   21112:	2a cf       	rjmp	.-428    	; 0x20f68 <lcd_commands() [clone .part.41]+0xde>
#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 <printingIsPaused()>
   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 <restore_extruder_temperature_from_ram()>
            }

            // 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 <target_temperature>
   21122:	30 91 b6 0d 	lds	r19, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   21126:	80 91 6b 02 	lds	r24, 0x026B	; 0x80026b <extrude_min_temp>
   2112a:	90 91 6c 02 	lds	r25, 0x026C	; 0x80026c <extrude_min_temp+0x1>
   2112e:	28 17       	cp	r18, r24
   21130:	39 07       	cpc	r19, r25
   21132:	0c f4       	brge	.+2      	; 0x21136 <lcd_commands() [clone .part.41]+0x2ac>
   21134:	19 cf       	rjmp	.-462    	; 0x20f68 <lcd_commands() [clone .part.41]+0xde>
                MMU2::mmu2.unload(); // M702
   21136:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>
   2113a:	16 cf       	rjmp	.-468    	; 0x20f68 <lcd_commands() [clone .part.41]+0xde>
    } else {
        // Turn off the print fan
        fanSpeed = 0;
   2113c:	10 92 e5 03 	sts	0x03E5, r1	; 0x8003e5 <fanSpeed>
   21140:	8b cf       	rjmp	.-234    	; 0x21058 <lcd_commands() [clone .part.41]+0x1ce>
        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 <lcd_commands() [clone .part.41]+0x20c>
        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 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.436]>
   21150:	2f c0       	rjmp	.+94     	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
//! @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 <MMU2::mmu2+0x6f>
   21156:	81 30       	cpi	r24, 0x01	; 1
   21158:	49 f5       	brne	.+82     	; 0x211ac <lcd_commands() [clone .part.41]+0x322>
            {
            case 12:
                lay1cal_wait_preheat();
                break;
            case 11:
                extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament);
   2115a:	d0 91 f9 03 	lds	r29, 0x03F9	; 0x8003f9 <lay1cal_filament>
    {
        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(char const*, bool)>
        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(char const*, bool)>
        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 <enquecommand(char const*, bool)>

        uint8_t currentTool = MMU2::mmu2.get_current_tool();
   2117c:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
        if(currentTool == filament ){
   21180:	d8 17       	cp	r29, r24
   21182:	a1 f0       	breq	.+40     	; 0x211ac <lcd_commands() [clone .part.41]+0x322>
            // 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 <lcd_commands() [clone .part.41]+0x308>
            // 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 <enquecommand(char const*, bool)>
        }
        // 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 <enquecommandf_P(char const*, ...)>
   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 <extraPurgeNeeded>
                break;
            }
        }
    }

	if (lcd_commands_type == LcdCommands::PidExtruder) {
   211b0:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   211b4:	83 30       	cpi	r24, 0x03	; 3
   211b6:	09 f0       	breq	.+2      	; 0x211ba <lcd_commands() [clone .part.41]+0x330>
   211b8:	d2 c0       	rjmp	.+420    	; 0x2135e <lcd_commands() [clone .part.41]+0x4d4>
		if (lcd_commands_step == 0) {
   211ba:	90 91 fa 03 	lds	r25, 0x03FA	; 0x8003fa <lcd_commands_step>
   211be:	91 11       	cpse	r25, r1
   211c0:	09 c0       	rjmp	.+18     	; 0x211d4 <lcd_commands() [clone .part.41]+0x34a>
			custom_message_type = CustomMsg::PidCal;
   211c2:	80 93 c3 06 	sts	0x06C3, r24	; 0x8006c3 <custom_message_type>
			custom_message_state = 1;
   211c6:	91 e0       	ldi	r25, 0x01	; 1
   211c8:	90 93 f6 03 	sts	0x03F6, r25	; 0x8003f6 <custom_message_state>
			lcd_draw_update = 3;
   211cc:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
			lcd_commands_step = 3;
   211d0:	80 93 fa 03 	sts	0x03FA, r24	; 0x8003fa <lcd_commands_step>
		}
		if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration
   211d4:	80 91 fa 03 	lds	r24, 0x03FA	; 0x8003fa <lcd_commands_step>
   211d8:	83 30       	cpi	r24, 0x03	; 3
   211da:	19 f5       	brne	.+70     	; 0x21222 <lcd_commands() [clone .part.41]+0x398>
   211dc:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   211e0:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   211e4:	98 13       	cpse	r25, r24
   211e6:	1d c0       	rjmp	.+58     	; 0x21222 <lcd_commands() [clone .part.41]+0x398>
      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 <disable_heater()>
      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 <enquecommandf_P(char const*, ...)>
			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 <lang_get_translation>
   21210:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
			lcd_commands_step = 2;
   21214:	82 e0       	ldi	r24, 0x02	; 2
   21216:	80 93 fa 03 	sts	0x03FA, r24	; 0x8003fa <lcd_commands_step>
   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 <lcd_commands_step>
   21226:	82 30       	cpi	r24, 0x02	; 2
   21228:	09 f0       	breq	.+2      	; 0x2122c <lcd_commands() [clone .part.41]+0x3a2>
   2122a:	7a c0       	rjmp	.+244    	; 0x21320 <lcd_commands() [clone .part.41]+0x496>
   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 <lcd_commands() [clone .part.41]+0x3ac>
   21234:	75 c0       	rjmp	.+234    	; 0x21320 <lcd_commands() [clone .part.41]+0x496>
			custom_message_state = 0;
   21236:	10 92 f6 03 	sts	0x03F6, r1	; 0x8003f6 <custom_message_state>
			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 <lang_get_translation>
   21242:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
   21246:	10 92 b6 0d 	sts	0x0DB6, r1	; 0x800db6 <target_temperature+0x1>
   2124a:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
			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 <lcd_commands() [clone .part.41]+0x42a>
   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 <lcd_commands() [clone .part.41]+0x42a>
   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 <lcd_commands() [clone .part.41]+0x42a>
   212b2:	7d c2       	rjmp	.+1274   	; 0x217ae <lcd_commands() [clone .part.41]+0x924>
				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 <enquecommandf_P(char const*, ...)>
				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 <enquecommand(char const*, bool)>
   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 <Timer<unsigned short>::start()>
			lcd_commands_step = 1;
   2131a:	81 e0       	ldi	r24, 0x01	; 1
   2131c:	80 93 fa 03 	sts	0x03FA, r24	; 0x8003fa <lcd_commands_step>
		}
		if ((lcd_commands_step == 1) && display_time.expired(2000)) { //calibration finished message
   21320:	80 91 fa 03 	lds	r24, 0x03FA	; 0x8003fa <lcd_commands_step>
   21324:	81 30       	cpi	r24, 0x01	; 1
   21326:	d9 f4       	brne	.+54     	; 0x2135e <lcd_commands() [clone .part.41]+0x4d4>
   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 <Timer<unsigned short>::expired(unsigned short)>
   21334:	88 23       	and	r24, r24
   21336:	99 f0       	breq	.+38     	; 0x2135e <lcd_commands() [clone .part.41]+0x4d4>
			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 <lcd_setstatuspgm(char const*)>
			custom_message_type = CustomMsg::Status;
   21340:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
			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_step>
			lcd_commands_type = LcdCommands::Idle;
   21354:	10 92 b3 0d 	sts	0x0DB3, r1	; 0x800db3 <lcd_commands_type>
   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 <lcd_commands_type>
   21362:	95 30       	cpi	r25, 0x05	; 5
   21364:	99 f4       	brne	.+38     	; 0x2138c <lcd_commands() [clone .part.41]+0x502>
   21366:	20 91 a2 10 	lds	r18, 0x10A2	; 0x8010a2 <buflen>
   2136a:	30 91 a3 10 	lds	r19, 0x10A3	; 0x8010a3 <buflen+0x1>
   2136e:	23 2b       	or	r18, r19
   21370:	71 f5       	brne	.+92     	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
    {
        switch (lcd_commands_step)
   21372:	80 91 fa 03 	lds	r24, 0x03FA	; 0x8003fa <lcd_commands_step>
   21376:	82 30       	cpi	r24, 0x02	; 2
   21378:	09 f4       	brne	.+2      	; 0x2137c <lcd_commands() [clone .part.41]+0x4f2>
   2137a:	42 c2       	rjmp	.+1156   	; 0x21800 <lcd_commands() [clone .part.41]+0x976>
   2137c:	08 f0       	brcs	.+2      	; 0x21380 <lcd_commands() [clone .part.41]+0x4f6>
   2137e:	1c c2       	rjmp	.+1080   	; 0x217b8 <lcd_commands() [clone .part.41]+0x92e>
   21380:	88 23       	and	r24, r24
   21382:	09 f4       	brne	.+2      	; 0x21386 <lcd_commands() [clone .part.41]+0x4fc>
   21384:	2d c2       	rjmp	.+1114   	; 0x217e0 <lcd_commands() [clone .part.41]+0x956>
   21386:	81 30       	cpi	r24, 0x01	; 1
   21388:	09 f4       	brne	.+2      	; 0x2138c <lcd_commands() [clone .part.41]+0x502>
   2138a:	45 c2       	rjmp	.+1162   	; 0x21816 <lcd_commands() [clone .part.41]+0x98c>
            break;
        }
    }
#endif //THERMAL_MODEL

	if (lcd_commands_type == LcdCommands::NozzleCNG)
   2138c:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   21390:	86 30       	cpi	r24, 0x06	; 6
   21392:	e9 f4       	brne	.+58     	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
   21394:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   21398:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
	{
        if (!blocks_queued() && cmd_buffer_empty() && !saved_printing)
   2139c:	98 13       	cpse	r25, r24
   2139e:	17 c0       	rjmp	.+46     	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
   213a0:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
   213a4:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   213a8:	89 2b       	or	r24, r25
   213aa:	89 f4       	brne	.+34     	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
   213ac:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
   213b0:	81 11       	cpse	r24, r1
   213b2:	0d c0       	rjmp	.+26     	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
#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 <lcd_commands_step>
   213b8:	81 30       	cpi	r24, 0x01	; 1
   213ba:	09 f4       	brne	.+2      	; 0x213be <lcd_commands() [clone .part.41]+0x534>
   213bc:	81 c2       	rjmp	.+1282   	; 0x218c0 <lcd_commands() [clone .part.41]+0xa36>
   213be:	08 f4       	brcc	.+2      	; 0x213c2 <lcd_commands() [clone .part.41]+0x538>
   213c0:	44 c2       	rjmp	.+1160   	; 0x2184a <lcd_commands() [clone .part.41]+0x9c0>
   213c2:	82 30       	cpi	r24, 0x02	; 2
   213c4:	09 f4       	brne	.+2      	; 0x213c8 <lcd_commands() [clone .part.41]+0x53e>
   213c6:	63 c2       	rjmp	.+1222   	; 0x2188e <lcd_commands() [clone .part.41]+0xa04>
   213c8:	83 30       	cpi	r24, 0x03	; 3
   213ca:	09 f4       	brne	.+2      	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
   213cc:	42 c2       	rjmp	.+1156   	; 0x21852 <lcd_commands() [clone .part.41]+0x9c8>
                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 <lcd_clear()>
                menu_depth = 0;
   213f8:	10 92 f7 03 	sts	0x03F7, r1	; 0x8003f7 <menu_depth>
                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 <menu_submenu(void (*)(), bool)>
        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 <MMU2::mmu2+0x6f>
   2140a:	81 30       	cpi	r24, 0x01	; 1
   2140c:	b9 f4       	brne	.+46     	; 0x2143c <lcd_commands() [clone .part.41]+0x5b2>
    {
        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 <extraPurgeNeeded>
   21412:	10 e0       	ldi	r17, 0x00	; 0
   21414:	81 11       	cpse	r24, r1
   21416:	01 c0       	rjmp	.+2      	; 0x2141a <lcd_commands() [clone .part.41]+0x590>
   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<char*>(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 <enquecommand(char const*, bool)>
        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 <lcd_commands() [clone .part.41]+0x59c>
   2143a:	ba ce       	rjmp	.-652    	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
            enquecommand_P(static_cast<char*>(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 <enquecommand(char const*, bool)>
        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 <count_e(float, float, float, float) [clone .constprop.161]>
   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(char const*, ...)>
        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 <count_e(float, float, float, float) [clone .constprop.161]>
   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 <enquecommandf_P(char const*, ...)>
   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 <lcd_commands() [clone .part.41]+0x326>
            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 <lcd_commands() [clone .part.41]+0x2c2>

//! @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 <enquecommand(char const*, bool)>
#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 <enquecommandf_P(char const*, ...)>
    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(char const*, bool)>
    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 <enquecommand(char const*, bool)>
#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 <count_e(float, float, float, float) [clone .constprop.161]>
   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(char const*, ...)>
    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 <count_e(float, float, float, float) [clone .constprop.161]>
   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(char const*, ...)>
    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 <count_e(float, float, float, float) [clone .constprop.161]>
   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(char const*, ...)>
    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 <count_e(float, float, float, float) [clone .constprop.161]>
   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 <enquecommandf_P(char const*, ...)>
   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 <lcd_commands() [clone .part.41]+0x326>

//! @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 <count_e(float, float, float, float) [clone .constprop.161]>
   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 <count_e(float, float, float, float) [clone .constprop.161]>
   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(char const*, ...)>
        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 <enquecommandf_P(char const*, ...)>
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 <lcd_commands() [clone .part.41]+0x7b6>
   216a4:	85 cd       	rjmp	.-1270   	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
//! @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 <count_e(float, float, float, float) [clone .constprop.161]>
   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 <count_e(float, float, float, float) [clone .constprop.161]>
   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(char const*, ...)>
        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(char const*, ...)>
        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(char const*, ...)>
        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 <enquecommandf_P(char const*, ...)>
   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 <lcd_commands() [clone .part.41]+0x874>
   21778:	1b cd       	rjmp	.-1482   	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
        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 <lcd_commands() [clone .part.41]+0x2c2>
                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_setstatuspgm(char const*)>
                lcd_commands_step = 0;
   2178a:	10 92 fa 03 	sts	0x03FA, r1	; 0x8003fa <lcd_commands_step>
                lcd_commands_type = LcdCommands::Idle;
   2178e:	10 92 b3 0d 	sts	0x0DB3, r1	; 0x800db3 <lcd_commands_type>
   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 <eeprom_read_byte>
   217a0:	88 23       	and	r24, r24
   217a2:	09 f4       	brne	.+2      	; 0x217a6 <lcd_commands() [clone .part.41]+0x91c>
   217a4:	dc cd       	rjmp	.-1096   	; 0x2135e <lcd_commands() [clone .part.41]+0x4d4>
                    lcd_wizard(WizState::RepeatLay1Cal);
   217a6:	8c e0       	ldi	r24, 0x0C	; 12
   217a8:	0e 94 b4 f9 	call	0x1f368	; 0x1f368 <lcd_wizard(WizState)>
   217ac:	01 cd       	rjmp	.-1534   	; 0x211b0 <lcd_commands() [clone .part.41]+0x326>
			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 <serialprintPGM(char const*)>
   217b6:	ad cd       	rjmp	.-1190   	; 0x21312 <lcd_commands() [clone .part.41]+0x488>
	}

#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 <lcd_commands() [clone .part.41]+0x95c>
   217bc:	c0 f0       	brcs	.+48     	; 0x217ee <lcd_commands() [clone .part.41]+0x964>
   217be:	85 30       	cpi	r24, 0x05	; 5
   217c0:	09 f0       	breq	.+2      	; 0x217c4 <lcd_commands() [clone .part.41]+0x93a>
   217c2:	e4 cd       	rjmp	.-1080   	; 0x2138c <lcd_commands() [clone .part.41]+0x502>
        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(char const*, bool)>
            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 <enquecommand(char const*, bool)>
            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 <lcd_commands_step>
   217de:	d6 cd       	rjmp	.-1108   	; 0x2138c <lcd_commands() [clone .part.41]+0x502>
    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 <lcd_commands_step>
   217e4:	ef cf       	rjmp	.-34     	; 0x217c4 <lcd_commands() [clone .part.41]+0x93a>
            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 <st_synchronize()>
            lcd_commands_step = 3;
   217ea:	83 e0       	ldi	r24, 0x03	; 3
   217ec:	f6 cf       	rjmp	.-20     	; 0x217da <lcd_commands() [clone .part.41]+0x950>
        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 <enquecommand(char const*, bool)>
            lcd_commands_step = 2;
   217fc:	82 e0       	ldi	r24, 0x02	; 2
   217fe:	ed cf       	rjmp	.-38     	; 0x217da <lcd_commands() [clone .part.41]+0x950>
            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 <lcd_commands() [clone .part.41]+0x988>
                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 <enquecommand(char const*, bool)>
            lcd_commands_step = 1;
   21812:	81 e0       	ldi	r24, 0x01	; 1
   21814:	e2 cf       	rjmp	.-60     	; 0x217da <lcd_commands() [clone .part.41]+0x950>
            break;

        case 1:
            lcd_commands_step = 0;
   21816:	10 92 fa 03 	sts	0x03FA, r1	; 0x8003fa <lcd_commands_step>
            lcd_commands_type = LcdCommands::Idle;
   2181a:	10 92 b3 0d 	sts	0x0DB3, r1	; 0x800db3 <lcd_commands_type>
   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 <eeprom_read_byte>
   21830:	88 23       	and	r24, r24
   21832:	09 f4       	brne	.+2      	; 0x21836 <lcd_commands() [clone .part.41]+0x9ac>
   21834:	cc cd       	rjmp	.-1128   	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
                // 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 <lcd_commands() [clone .part.41]+0x9bc>
   2183e:	81 e0       	ldi	r24, 0x01	; 1
   21840:	0e 94 b4 f9 	call	0x1f368	; 0x1f368 <lcd_wizard(WizState)>
   21844:	a3 cd       	rjmp	.-1210   	; 0x2138c <lcd_commands() [clone .part.41]+0x502>
   21846:	8e e0       	ldi	r24, 0x0E	; 14
   21848:	fb cf       	rjmp	.-10     	; 0x21840 <lcd_commands() [clone .part.41]+0x9b6>
#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 <lcd_commands_step>
   21850:	be cd       	rjmp	.-1156   	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
            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 <lang_get_translation>
   2185a:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
                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(char const*, bool)>
                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(char const*, bool)>
                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 <enquecommand(char const*, bool)>
#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 <lcd_commands()::was_enabled>
                thermal_model_set_enabled(false);
   21884:	80 e0       	ldi	r24, 0x00	; 0
   21886:	0f 94 15 33 	call	0x2662a	; 0x2662a <thermal_model_set_enabled(bool)>
                    }
                }
                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 <lcd_commands() [clone .part.41]+0x9c2>
                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 <enquecommand(char const*, bool)>
                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 <lang_get_translation>
   218a0:	41 e0       	ldi	r20, 0x01	; 1
   218a2:	60 e0       	ldi	r22, 0x00	; 0
   218a4:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   218a8:	81 11       	cpse	r24, r1
   218aa:	91 cd       	rjmp	.-1246   	; 0x213ce <lcd_commands() [clone .part.41]+0x544>
   218ac:	10 92 b6 0d 	sts	0x0DB6, r1	; 0x800db6 <target_temperature+0x1>
   218b0:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
#ifndef QUICK_NOZZLE_CHANGE
                    setTargetHotend(0);
#ifdef THERMAL_MODEL
                    thermal_model_set_enabled(was_enabled);
   218b4:	80 91 e6 03 	lds	r24, 0x03E6	; 0x8003e6 <lcd_commands()::was_enabled>
   218b8:	0f 94 15 33 	call	0x2662a	; 0x2662a <thermal_model_set_enabled(bool)>
#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 <lcd_commands() [clone .part.41]+0x9c2>
                }
                break;
            case 1:
                lcd_commands_step = 0;
   218c0:	10 92 fa 03 	sts	0x03FA, r1	; 0x8003fa <lcd_commands_step>
                lcd_commands_type = LcdCommands::Idle;
   218c4:	10 92 b3 0d 	sts	0x0DB3, r1	; 0x800db3 <lcd_commands_type>
   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_goto(void (*)(), int, bool, bool)>
                menu_depth = 3;
   218de:	83 e0       	ldi	r24, 0x03	; 3
   218e0:	80 93 f7 03 	sts	0x03F7, r24	; 0x8003f7 <menu_depth>
   218e4:	74 cd       	rjmp	.-1304   	; 0x213ce <lcd_commands() [clone .part.41]+0x544>

000218e6 <menu_lcd_lcdupdate_func()>:
            && 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 <lcd_oldcardstatus>
   218f6:	89 17       	cp	r24, r25
   218f8:	a1 f1       	breq	.+104    	; 0x21962 <menu_lcd_lcdupdate_func()+0x7c>
	{
		if(menu_menu == lcd_sdcard_menu) {
   218fa:	80 91 12 04 	lds	r24, 0x0412	; 0x800412 <menu_menu>
   218fe:	90 91 13 04 	lds	r25, 0x0413	; 0x800413 <menu_menu+0x1>
   21902:	87 52       	subi	r24, 0x27	; 39
   21904:	92 4f       	sbci	r25, 0xF2	; 242
   21906:	11 f4       	brne	.+4      	; 0x2190c <menu_lcd_lcdupdate_func()+0x26>
			//    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 <menu_back()>
		}
		lcd_draw_update = 2;
   2190c:	82 e0       	ldi	r24, 0x02	; 2
   2190e:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
		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_oldcardstatus>
		lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
   2191e:	0e 94 24 6f 	call	0xde48	; 0xde48 <lcd_refresh()>
		backlight_wake();
   21922:	80 e0       	ldi	r24, 0x00	; 0
   21924:	0e 94 0d 8a 	call	0x1141a	; 0x1141a <backlight_wake(unsigned char)>
		if (lcd_oldcardstatus)
   21928:	80 91 11 04 	lds	r24, 0x0411	; 0x800411 <lcd_oldcardstatus>
   2192c:	88 23       	and	r24, r24
   2192e:	09 f4       	brne	.+2      	; 0x21932 <menu_lcd_lcdupdate_func()+0x4c>
   21930:	71 c0       	rjmp	.+226    	; 0x21a14 <menu_lcd_lcdupdate_func()+0x12e>
		{
			if (!card.mounted)
   21932:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   21936:	81 11       	cpse	r24, r1
   21938:	05 c0       	rjmp	.+10     	; 0x21944 <menu_lcd_lcdupdate_func()+0x5e>
			{
				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 <CardReader::mount(bool) [clone .constprop.216]>
				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 <card+0x51>
			}
			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 <lcd_setstatuspgm(char const*)>
			bMain=false;                       // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
   2194c:	10 92 df 03 	sts	0x03DF, r1	; 0x8003df <bMain>
			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 <menu_submenu(void (*)(), bool)>
			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 <Timer<unsigned long>::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 <millis2>
   21966:	00 91 d6 03 	lds	r16, 0x03D6	; 0x8003d6 <lcd_next_update_millis>
   2196a:	10 91 d7 03 	lds	r17, 0x03D7	; 0x8003d7 <lcd_next_update_millis+0x1>
   2196e:	20 91 d8 03 	lds	r18, 0x03D8	; 0x8003d8 <lcd_next_update_millis+0x2>
   21972:	30 91 d9 03 	lds	r19, 0x03D9	; 0x8003d9 <lcd_next_update_millis+0x3>
   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 <menu_lcd_lcdupdate_func()+0x114>
	{
		if (lcd_draw_update) {
   21980:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   21984:	88 23       	and	r24, r24
   21986:	31 f0       	breq	.+12     	; 0x21994 <menu_lcd_lcdupdate_func()+0xae>
			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 <Timer<unsigned long>::start()>
            lcd_frame_start();
   21990:	0e 94 2c 6e 	call	0xdc58	; 0xdc58 <lcd_frame_start()>
		}

		(*menu_menu)();
   21994:	e0 91 12 04 	lds	r30, 0x0412	; 0x800412 <menu_menu>
   21998:	f0 91 13 04 	lds	r31, 0x0413	; 0x800413 <menu_menu+0x1>
   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 <menu_menu>
   219a2:	90 91 13 04 	lds	r25, 0x0413	; 0x800413 <menu_menu+0x1>
   219a6:	8a 52       	subi	r24, 0x2A	; 42
   219a8:	99 43       	sbci	r25, 0x39	; 57
   219aa:	09 f4       	brne	.+2      	; 0x219ae <menu_lcd_lcdupdate_func()+0xc8>
   219ac:	46 c0       	rjmp	.+140    	; 0x21a3a <menu_lcd_lcdupdate_func()+0x154>
}
static inline bool other_menu_expired()
{
    return (menu_menu != lcd_status_screen
   219ae:	80 91 12 04 	lds	r24, 0x0412	; 0x800412 <menu_menu>
   219b2:	90 91 13 04 	lds	r25, 0x0413	; 0x800413 <menu_menu+0x1>
            && 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 <menu_lcd_lcdupdate_func()+0xda>
   219be:	5e c0       	rjmp	.+188    	; 0x21a7c <menu_lcd_lcdupdate_func()+0x196>
			}
			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 <lcd_draw_update>
   219c4:	82 30       	cpi	r24, 0x02	; 2
   219c6:	21 f4       	brne	.+8      	; 0x219d0 <menu_lcd_lcdupdate_func()+0xea>
#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_refresh()>
    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 <lcd_draw_update>
   219d4:	88 23       	and	r24, r24
   219d6:	19 f0       	breq	.+6      	; 0x219de <menu_lcd_lcdupdate_func()+0xf8>
   219d8:	81 50       	subi	r24, 0x01	; 1
   219da:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
		lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL;
   219de:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <lcd_next_update_millis>
   219ee:	70 93 d7 03 	sts	0x03D7, r23	; 0x8003d7 <lcd_next_update_millis+0x1>
   219f2:	80 93 d8 03 	sts	0x03D8, r24	; 0x8003d8 <lcd_next_update_millis+0x2>
   219f6:	90 93 d9 03 	sts	0x03D9, r25	; 0x8003d9 <lcd_next_update_millis+0x3>
	}
	prusa_statistics_update_from_lcd_update();
	if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands();
   219fa:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <lcd_commands_type>
   219fe:	84 30       	cpi	r24, 0x04	; 4
   21a00:	09 f0       	breq	.+2      	; 0x21a04 <menu_lcd_lcdupdate_func()+0x11e>
   21a02:	53 c0       	rjmp	.+166    	; 0x21aaa <menu_lcd_lcdupdate_func()+0x1c4>
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 <planner_aborted>
   21a08:	81 11       	cpse	r24, r1
   21a0a:	4f c0       	rjmp	.+158    	; 0x21aaa <menu_lcd_lcdupdate_func()+0x1c4>
		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 <lcd_commands() [clone .part.41]>
		presort_flag = true;
#endif
}
void CardReader::release()
{
  sdprinting = false;
   21a14:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>
  mounted = false;
   21a18:	10 92 90 14 	sts	0x1490, r1	; 0x801490 <card+0x3>
  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 <serialprintPGM(char const*)>
  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 <serialprintlnPGM(char const*)>
			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 <lang_get_translation>
   21a34:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
   21a38:	94 cf       	rjmp	.-216    	; 0x21962 <menu_lcd_lcdupdate_func()+0x7c>
// 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 <babystep_allowed()>
   21a3e:	81 11       	cpse	r24, r1
   21a40:	0e c0       	rjmp	.+28     	; 0x21a5e <menu_lcd_lcdupdate_func()+0x178>
		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 <menu_menu>
   21a46:	f0 91 13 04 	lds	r31, 0x0413	; 0x800413 <menu_menu+0x1>
   21a4a:	30 97       	sbiw	r30, 0x00	; 0
   21a4c:	39 f5       	brne	.+78     	; 0x21a9c <menu_lcd_lcdupdate_func()+0x1b6>
			{
				menu_leaving = 1;
				(*menu_menu)();
				menu_leaving = 0;
			}
			lcd_clear();
   21a4e:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
			lcd_return_to_status();
   21a52:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
			lcd_draw_update = 2;
   21a56:	82 e0       	ldi	r24, 0x02	; 2
   21a58:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
   21a5c:	b1 cf       	rjmp	.-158    	; 0x219c0 <menu_lcd_lcdupdate_func()+0xda>
// 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 <lcd_commands_type>
   21a62:	81 11       	cpse	r24, r1
   21a64:	a4 cf       	rjmp	.-184    	; 0x219ae <menu_lcd_lcdupdate_func()+0xc8>
   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 <Timer<unsigned long>::expired(unsigned long)>
   21a76:	81 11       	cpse	r24, r1
   21a78:	e4 cf       	rjmp	.-56     	; 0x21a42 <menu_lcd_lcdupdate_func()+0x15c>
   21a7a:	99 cf       	rjmp	.-206    	; 0x219ae <menu_lcd_lcdupdate_func()+0xc8>
}
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 <menu_lcd_lcdupdate_func()+0x19e>
   21a82:	9e cf       	rjmp	.-196    	; 0x219c0 <menu_lcd_lcdupdate_func()+0xda>
            && 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 <Timer<unsigned long>::expired(unsigned long)>
   21a94:	88 23       	and	r24, r24
   21a96:	09 f4       	brne	.+2      	; 0x21a9a <menu_lcd_lcdupdate_func()+0x1b4>
   21a98:	93 cf       	rjmp	.-218    	; 0x219c0 <menu_lcd_lcdupdate_func()+0xda>
   21a9a:	d3 cf       	rjmp	.-90     	; 0x21a42 <menu_lcd_lcdupdate_func()+0x15c>
		// 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_leaving>
				(*menu_menu)();
   21aa2:	19 95       	eicall
				menu_leaving = 0;
   21aa4:	10 92 d5 03 	sts	0x03D5, r1	; 0x8003d5 <menu_leaving>
   21aa8:	d2 cf       	rjmp	.-92     	; 0x21a4e <menu_lcd_lcdupdate_func()+0x168>
		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 <lcd_wizard()>:
	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 <calibration_status_get(unsigned char)>
   21ab6:	81 11       	cpse	r24, r1
   21ab8:	06 c0       	rjmp	.+12     	; 0x21ac6 <lcd_wizard()+0x16>
		// 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 <calibration_status_clear(unsigned char)>
		lcd_wizard(WizState::Run);
   21ac0:	80 e0       	ldi	r24, 0x00	; 0
   21ac2:	0c 94 b4 f9 	jmp	0x1f368	; 0x1f368 <lcd_wizard(WizState)>

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 <lang_get_translation>
   21ace:	41 e0       	ldi	r20, 0x01	; 1
   21ad0:	60 e0       	ldi	r22, 0x00	; 0
   21ad2:	0f 94 01 50 	call	0x2a002	; 0x2a002 <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>
	}
	if (result) {
   21ad6:	88 23       	and	r24, r24
   21ad8:	81 f3       	breq	.-32     	; 0x21aba <lcd_wizard()+0xa>
		calibration_status_clear(CALIBRATION_WIZARD_STEPS);
		lcd_wizard(WizState::Run);
	} else {
		lcd_return_to_status();
   21ada:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
		lcd_update_enable(true);
   21ade:	81 e0       	ldi	r24, 0x01	; 1
   21ae0:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
		lcd_update(2);
   21ae4:	82 e0       	ldi	r24, 0x02	; 2
   21ae6:	0c 94 3f 6e 	jmp	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>

00021aea <prompt_steel_sheet_on_bed(bool)>:
    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 <lang_get_translation>
   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 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   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 <prompt_steel_sheet_on_bed(bool)+0x36>
        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 <prompt_steel_sheet_on_bed(bool)+0x2c>
   21b12:	85 e9       	ldi	r24, 0x95	; 149
   21b14:	99 e5       	ldi	r25, 0x59	; 89
   21b16:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
    }
#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 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    }
#endif //STEEL_SHEET
}
   21b20:	cf 91       	pop	r28
   21b22:	08 95       	ret

00021b24 <lcd_z_calibration_prompt(bool)>:
    }
    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 <lang_get_translation>
   21b30:	40 e0       	ldi	r20, 0x00	; 0
   21b32:	6c 2f       	mov	r22, r28
   21b34:	0f 94 2a 50 	call	0x2a054	; 0x2a054 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
    if (result == LCD_LEFT_BUTTON_CHOICE) {
   21b38:	81 11       	cpse	r24, r1
   21b3a:	03 c0       	rjmp	.+6      	; 0x21b42 <lcd_z_calibration_prompt(bool)+0x1e>
        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 <lcd_mesh_calibration_z()>
    }
}
   21b42:	cf 91       	pop	r28
   21b44:	08 95       	ret

00021b46 <lcd_mesh_bed_leveling_settings()>:
	}
	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 <lcd_mesh_bed_leveling_settings()+0x14>
   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 <eeprom_read_byte>
   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 <eeprom_read_byte>
   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 <eeprom_read_byte>
   21b7c:	18 2f       	mov	r17, r24
	char sToggle[4]; //enough for nxn format

	MENU_BEGIN();
   21b7e:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   21b82:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
		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 <menu_row>
   21b9a:	84 30       	cpi	r24, 0x04	; 4
   21b9c:	08 f0       	brcs	.+2      	; 0x21ba0 <lcd_mesh_bed_leveling_settings()+0x5a>
   21b9e:	56 c0       	rjmp	.+172    	; 0x21c4c <lcd_mesh_bed_leveling_settings()+0x106>
   21ba0:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	ON_MENU_LEAVE(
   21ba4:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   21ba8:	88 23       	and	r24, r24
   21baa:	31 f0       	breq	.+12     	; 0x21bb8 <lcd_mesh_bed_leveling_settings()+0x72>
   21bac:	87 e0       	ldi	r24, 0x07	; 7
   21bae:	f8 12       	cpse	r15, r24
   21bb0:	03 c0       	rjmp	.+6      	; 0x21bb8 <lcd_mesh_bed_leveling_settings()+0x72>
   21bb2:	81 e0       	ldi	r24, 0x01	; 1
   21bb4:	0f 94 92 0d 	call	0x21b24	; 0x21b24 <lcd_z_calibration_prompt(bool)>
		// 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 <lang_get_translation>
   21bc0:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
	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 <lang_get_translation>
   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(char const*, char const*, void (*)(), unsigned char)>
	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 <lcd_mesh_bed_leveling_settings()+0x100>
   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 <lcd_mesh_bed_leveling_settings()+0xcc>
   21c0e:	8b e4       	ldi	r24, 0x4B	; 75
   21c10:	9c e5       	ldi	r25, 0x5C	; 92
   21c12:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lang_get_translation>
   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_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
	MENU_END();
   21c2c:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
	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 <menu_row>
   21c34:	9f 5f       	subi	r25, 0xFF	; 255
   21c36:	90 93 11 05 	sts	0x0511, r25	; 0x800511 <menu_row>
   21c3a:	90 91 13 05 	lds	r25, 0x0513	; 0x800513 <menu_line>
   21c3e:	9f 5f       	subi	r25, 0xFF	; 255
   21c40:	90 93 13 05 	sts	0x0513, r25	; 0x800513 <menu_line>
   21c44:	a8 cf       	rjmp	.-176    	; 0x21b96 <lcd_mesh_bed_leveling_settings()+0x50>
	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 <lcd_mesh_bed_leveling_settings()+0xcc>
	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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]>:
        }
    }
    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 <MMU2::Disable_E0()>
            tool_change_extruder = slot;
   21cb2:	00 93 a1 13 	sts	0x13A1, r16	; 0x8013a1 <MMU2::mmu2+0x57>
    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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
            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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   21cd8:	18 2f       	mov	r17, r24
   21cda:	81 11       	cpse	r24, r1
   21cdc:	07 c0       	rjmp	.+14     	; 0x21cec <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x84>
                break;
            }
            // otherwise: failed to perform the command - unload first and then let it run again
            IncrementMMUFails();
   21cde:	0f 94 e2 c4 	call	0x389c4	; 0x389c4 <MMU2::IncrementMMUFails()>

            // 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 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]>
            // 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 <MMU2::MMU2::UnloadInner() [clone .constprop.130]>
   21cea:	e1 cf       	rjmp	.-62     	; 0x21cae <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x46>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   21cec:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
}

bool MMU2::VerifyFilamentEnteredPTFE() {
    planner_synchronize();

    if (WhereIsFilament() != FilamentState::AT_FSENSOR)
   21cf0:	0f 94 d9 c5 	call	0x38bb2	; 0x38bb2 <MMU2::WhereIsFilament()>
   21cf4:	81 30       	cpi	r24, 0x01	; 1
   21cf6:	79 f1       	breq	.+94     	; 0x21d56 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0xee>
            // 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 <MMU2::MMU2::UnloadInner() [clone .constprop.130]>
            if (retries == 2 && cutter_enabled()) {
   21cfc:	92 e0       	ldi	r25, 0x02	; 2
   21cfe:	f9 12       	cpse	r15, r25
   21d00:	09 c0       	rjmp	.+18     	; 0x21d14 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0xac>
    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 <eeprom_read_byte>
   21d0a:	81 30       	cpi	r24, 0x01	; 1
   21d0c:	19 f4       	brne	.+6      	; 0x21d14 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0xac>
                CutFilamentInner(slot); // try cutting filament tip at the last attempt
   21d0e:	80 2f       	mov	r24, r16
   21d10:	0f 94 df ad 	call	0x35bbe	; 0x35bbe <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.118]>
   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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x46>
    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 <planner_aborted>
   21d1e:	88 23       	and	r24, r24
   21d20:	09 f4       	brne	.+2      	; 0x21d24 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0xbc>
   21d22:	ef c0       	rjmp	.+478    	; 0x21f02 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x29a>

    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 <MMU2::mmu2+0x4c>
   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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x132>
    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 <MMU2::extruder_move(float, float)>
   21dce:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   21dd2:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
        while (planner_any_moves()) {
   21dd6:	98 17       	cp	r25, r24
   21dd8:	09 f4       	brne	.+2      	; 0x21ddc <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x174>
   21dda:	49 c0       	rjmp	.+146    	; 0x21e6e <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x206>
            filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR);
   21ddc:	11 23       	and	r17, r17
   21dde:	31 f0       	breq	.+12     	; 0x21dec <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x184>
   21de0:	0f 94 d9 c5 	call	0x38bb2	; 0x38bb2 <MMU2::WhereIsFilament()>
   21de4:	11 e0       	ldi	r17, 0x01	; 1
   21de6:	81 30       	cpi	r24, 0x01	; 1
   21de8:	09 f0       	breq	.+2      	; 0x21dec <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x184>
   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 <st_get_position_mm(unsigned char)>
    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 <current_position+0xc>
   21df6:	30 91 9e 06 	lds	r19, 0x069E	; 0x80069e <current_position+0xd>
   21dfa:	40 91 9f 06 	lds	r20, 0x069F	; 0x80069f <current_position+0xe>
   21dfe:	50 91 a0 06 	lds	r21, 0x06A0	; 0x8006a0 <current_position+0xf>
   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 <ceil>
   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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x1e4>
   21e1c:	e3 2d       	mov	r30, r3
   21e1e:	e4 31       	cpi	r30, 0x14	; 20
   21e20:	08 f0       	brcs	.+2      	; 0x21e24 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x1bc>
   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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x1ca>
   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 <lcd_draw_update>
    if (!lcd_update_enabled) lcdui_print_status_line();
   21e40:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <lcd_update_enabled>
   21e44:	81 11       	cpse	r24, r1
   21e46:	02 c0       	rjmp	.+4      	; 0x21e4c <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x1e4>
   21e48:	0f 94 4f 2b 	call	0x2569e	; 0x2569e <lcdui_print_status_line()>
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 <delay_keep_alive(unsigned int)>
}

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 <planner_aborted>
   21e5a:	88 23       	and	r24, r24
   21e5c:	09 f4       	brne	.+2      	; 0x21e60 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x1f8>
   21e5e:	b7 cf       	rjmp	.-146    	; 0x21dce <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x166>
                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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x26a>
    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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x15a>

    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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x1fc>
                return false; // power panic or a similar issue happened, bail out fast
            }
        }
    }

    Disable_E0();
   21e74:	0f 94 a3 c5 	call	0x38b46	; 0x38b46 <MMU2::Disable_E0()>
    if (!filament_inserted) {
   21e78:	11 11       	cpse	r17, r1
   21e7a:	08 c0       	rjmp	.+16     	; 0x21e8c <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x224>
    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_byte(unsigned char*)>
    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 <eeprom_increment_word(unsigned int*)>
    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 <strncpy>
   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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x296>
   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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x238>
        // 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 <serialprintPGM(char const*)>
   21ec2:	88 e5       	ldi	r24, 0x58	; 88
   21ec4:	9e e8       	ldi	r25, 0x8E	; 142
   21ec6:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
   21eca:	ce 01       	movw	r24, r28
   21ecc:	01 96       	adiw	r24, 0x01	; 1
   21ece:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
    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 <Timer<unsigned long>::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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x278>
   21ede:	0c cf       	rjmp	.-488    	; 0x21cf8 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x90>
        // 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<void>(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 <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.148]>
    }
}

void SpoolJoin::setSlot(uint8_t slot)
{
    currentMMUSlot = slot;
   21ee6:	00 93 48 13 	sts	0x1348, r16	; 0x801348 <SpoolJoin::spooljoin>
    SpoolJoin::spooljoin.setSlot(slot);

    ++toolchange_counter;
   21eea:	80 91 bd 13 	lds	r24, 0x13BD	; 0x8013bd <MMU2::mmu2+0x73>
   21eee:	90 91 be 13 	lds	r25, 0x13BE	; 0x8013be <MMU2::mmu2+0x74>
   21ef2:	01 96       	adiw	r24, 0x01	; 1
   21ef4:	90 93 be 13 	sts	0x13BE, r25	; 0x8013be <MMU2::mmu2+0x74>
   21ef8:	80 93 bd 13 	sts	0x13BD, r24	; 0x8013bd <MMU2::mmu2+0x73>
   21efc:	13 cf       	rjmp	.-474    	; 0x21d24 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0xbc>
    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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x240>
    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 <MMU2::mmu2+0x1>
   21f0a:	80 93 4a 13 	sts	0x134A, r24	; 0x80134a <MMU2::mmu2>
        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<void>(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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   21f16:	c7 ce       	rjmp	.-626    	; 0x21ca6 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]+0x3e>

00021f18 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]>:
    }
    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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   21f22:	c8 2f       	mov	r28, r24
   21f24:	88 23       	and	r24, r24
   21f26:	49 f1       	breq	.+82     	; 0x21f7a <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]+0x62>
        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 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(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 <Sound_MakeSound(eSOUND_TYPE)>
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 <lang_get_translation>
   21f3e:	6d 2f       	mov	r22, r29
   21f40:	0f 94 c3 c4 	call	0x38986	; 0x38986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>

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 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>

    FullScreenMsgLoad(slot);
    {
        // used for MMU-menu operation "Load to Nozzle"
        ReportingRAII rep(CommandInProgress::ToolChange);
        FSensorBlockRunout blockRunout;
   21f48:	0f 94 a5 87 	call	0x30f4a	; 0x30f4a <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>

        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 <MMU2::mmu2+0x56>
   21f50:	83 36       	cpi	r24, 0x63	; 99
   21f52:	29 f0       	breq	.+10     	; 0x21f5e <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]+0x46>

    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 <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.132]>

        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 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]>

        // Finish loading to the nozzle with finely tuned steps.
        execute_load_to_nozzle_sequence();
   21f64:	0e 94 d0 ce 	call	0x19da0	; 0x19da0 <MMU2::MMU2::execute_load_to_nozzle_sequence() [clone .constprop.53]>
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 <Sound_MakeSound(eSOUND_TYPE)>
#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 <PAT9125_sensor::settings_init() [clone .constprop.231]>
    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 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>

        // 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 <MMU2::ScreenUpdateEnable()>
    return true;
}
   21f7a:	8c 2f       	mov	r24, r28
   21f7c:	df 91       	pop	r29
   21f7e:	cf 91       	pop	r28
   21f80:	08 95       	ret

00021f82 <lcd_mmu_load_to_nozzle_wrapper(unsigned char)>:
        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 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]>

    // 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 <load_filament_final_feed()>
    st_synchronize();
   21f8a:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

    // Ask user if the extruded color is correct:
    lcd_return_to_status();
   21f8e:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
    lcd_load_filament_color_check();
   21f92:	0f 94 53 50 	call	0x2a0a6	; 0x2a0a6 <lcd_load_filament_color_check()>
    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 <lcd_setstatuspgm(char const*)>
    custom_message_type = CustomMsg::Status;
   21f9e:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>

    // Clear the filament action
    clearFilamentAction();
   21fa2:	0d 94 6f 21 	jmp	0x242de	; 0x242de <clearFilamentAction() [clone .lto_priv.439]>

00021fa6 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]>:
    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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   21fb0:	c8 2f       	mov	r28, r24
   21fb2:	88 23       	and	r24, r24
   21fb4:	b9 f0       	breq	.+46     	; 0x21fe4 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]+0x3e>
        return false;
    }

    if (slot != extruder) {
   21fb6:	80 91 a0 13 	lds	r24, 0x13A0	; 0x8013a0 <MMU2::mmu2+0x56>
   21fba:	8d 17       	cp	r24, r29
   21fbc:	99 f0       	breq	.+38     	; 0x21fe4 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]+0x3e>
    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 <printer_active()>
        if (/*FindaDetectsFilament()*/
   21fc2:	81 11       	cpse	r24, r1
   21fc4:	02 c0       	rjmp	.+4      	; 0x21fca <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]+0x24>
            /*!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 <MMU2::MMU2::unload() [clone .constprop.126]>

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 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>
            // 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 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   21fd2:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        planner_synchronize();
        ToolChangeCommon(slot);
   21fd6:	8d 2f       	mov	r24, r29
   21fd8:	0f 94 34 0e 	call	0x21c68	; 0x21c68 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.54]>
   21fdc:	0f 94 e9 7b 	call	0x2f7d2	; 0x2f7d2 <PAT9125_sensor::settings_init() [clone .constprop.231]>
    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 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>
        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 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]>:
/// 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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   21ffa:	d8 2f       	mov	r29, r24
   21ffc:	88 23       	and	r24, r24
   21ffe:	89 f0       	breq	.+34     	; 0x22022 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]+0x36>
        return false;
    }

    FSensorBlockRunout blockRunout;
   22000:	0f 94 a5 87 	call	0x30f4a	; 0x30f4a <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>

    switch (code) {
   22004:	c3 36       	cpi	r28, 0x63	; 99
   22006:	01 f1       	breq	.+64     	; 0x22048 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]+0x5c>
   22008:	c8 37       	cpi	r28, 0x78	; 120
   2200a:	81 f0       	breq	.+32     	; 0x2202c <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]+0x40>
   2200c:	cf 33       	cpi	r28, 0x3F	; 63
   2200e:	39 f4       	brne	.+14     	; 0x2201e <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]+0x32>
    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 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(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 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.51]>
   2201e:	0f 94 e9 7b 	call	0x2f7d2	; 0x2f7d2 <PAT9125_sensor::settings_init() [clone .constprop.231]>
        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 <extrude_min_temp+0x1>
   22030:	10 92 6b 02 	sts	0x026B, r1	; 0x80026b <extrude_min_temp>
        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 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]>
   2203a:	8f ea       	ldi	r24, 0xAF	; 175
   2203c:	90 e0       	ldi	r25, 0x00	; 0
   2203e:	90 93 6c 02 	sts	0x026C, r25	; 0x80026c <extrude_min_temp+0x1>
   22042:	80 93 6b 02 	sts	0x026B, r24	; 0x80026b <extrude_min_temp>
   22046:	eb cf       	rjmp	.-42     	; 0x2201e <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]+0x32>
        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 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(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 <MMU2::MMU2::execute_load_to_nozzle_sequence() [clone .constprop.53]>
   22054:	e4 cf       	rjmp	.-56     	; 0x2201e <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.25]+0x32>

00022056 <loading_test_wrapper(unsigned char)>:

    // 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 <lang_get_translation>
   22062:	6c 2f       	mov	r22, r28
   22064:	0f 94 c3 c4 	call	0x38986	; 0x38986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>
    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 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]>
   2206e:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    planner_synchronize();
    unload();
   22072:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>
    ScreenUpdateEnable();
   22076:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
    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 <clearFilamentAction() [clone .lto_priv.439]>

00022080 <loading_test_all_wrapper()>:
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 <lang_get_translation>
   2208c:	6c 2f       	mov	r22, r28
   2208e:	0f 94 c3 c4 	call	0x38986	; 0x38986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>
    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 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.27]>
   22098:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    planner_synchronize();
    unload();
   2209c:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>
    ScreenUpdateEnable();
   220a0:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
   220a4:	cf 5f       	subi	r28, 0xFF	; 255
   220a6:	c5 30       	cpi	r28, 0x05	; 5
   220a8:	69 f7       	brne	.-38     	; 0x22084 <loading_test_all_wrapper()+0x4>
        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 <clearFilamentAction() [clone .lto_priv.439]>

000220b0 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.48]>:

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 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.48]+0x6>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
}
   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 <lcd_settings_menu()::{lambda()#1}::_FUN()>:
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   220e8:	80 e0       	ldi	r24, 0x00	; 0
   220ea:	0d 94 58 10 	jmp	0x220b0	; 0x220b0 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.48]>

000220ee <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.31]>:

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 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.31]+0x8>
   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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   22104:	88 23       	and	r24, r24
   22106:	d9 f0       	breq	.+54     	; 0x2213e <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.31]+0x50>
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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
        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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   2212a:	88 23       	and	r24, r24
   2212c:	69 f3       	breq	.-38     	; 0x22108 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.31]+0x1a>

    // Update cached value
    lastReadRegisterValue = logic.rsp.paramValue;
   2212e:	20 91 65 13 	lds	r18, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   22132:	30 91 66 13 	lds	r19, 0x1366	; 0x801366 <MMU2::mmu2+0x1c>
   22136:	30 93 b6 13 	sts	0x13B6, r19	; 0x8013b6 <MMU2::mmu2+0x6c>
   2213a:	20 93 b5 13 	sts	0x13B5, r18	; 0x8013b5 <MMU2::mmu2+0x6b>
    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 <thermal_model_cal::record(unsigned int) [clone .constprop.39]>:
        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 <TempMgrGuard::TempMgrGuard()>

    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 <thermal_model_cal::record(unsigned int) [clone .constprop.39]+0x46>
            // temperatures not ready yet, just manage heaters while waiting to reduce jitter
            manage_heater();
   22174:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>

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 <thermal_model_cal::record(unsigned int) [clone .constprop.39]+0x20>
    }
    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 <TempMgrGuard::~TempMgrGuard()>
        // 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 <thermal_model_cal::record(unsigned int) [clone .constprop.39]+0x28>
        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 <adc_start_cycle()>
        temp_mgr_isr();
   221a8:	0f 94 91 36 	call	0x26d22	; 0x26d22 <temp_mgr_isr() [clone .lto_priv.422]>

        // 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 <thermal_model_cal::record(unsigned int) [clone .constprop.39]+0x9a>
            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 <current_temperature_isr>
   221c6:	90 91 17 05 	lds	r25, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   221ca:	a0 91 18 05 	lds	r26, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   221ce:	b0 91 19 05 	lds	r27, 0x0519	; 0x800519 <current_temperature_isr+0x3>
   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 <thermal_model_cal::waiting_handler() [clone .lto_priv.423]>
   221e8:	c7 cf       	rjmp	.-114    	; 0x22178 <thermal_model_cal::record(unsigned int) [clone .constprop.39]+0x28>
        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 <thermal_model_cal::record(unsigned int) [clone .constprop.39]+0x2e>

000221f0 <pgm_is_whitespace(char const*)>:

#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 <pgm_is_whitespace(char const*)+0x1a>
   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 <pgm_is_whitespace(char const*)+0x1a>
   22200:	81 e0       	ldi	r24, 0x01	; 1
   22202:	9d 30       	cpi	r25, 0x0D	; 13
   22204:	19 f0       	breq	.+6      	; 0x2220c <pgm_is_whitespace(char const*)+0x1c>
   22206:	80 e0       	ldi	r24, 0x00	; 0
   22208:	08 95       	ret
   2220a:	81 e0       	ldi	r24, 0x01	; 1
}
   2220c:	08 95       	ret

0002220e <clamp999(unsigned int)>:
	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 <clamp999(unsigned int)+0xc>
   22216:	87 ee       	ldi	r24, 0xE7	; 231
   22218:	93 e0       	ldi	r25, 0x03	; 3
}
   2221a:	08 95       	ret

0002221c <uart2_getchar(__file*) [clone .lto_priv.398]>:
	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 <uart2_ibuf+0x2>
   22220:	80 91 3a 05 	lds	r24, 0x053A	; 0x80053a <uart2_ibuf+0x1>
   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 <uart2_getchar(__file*) [clone .lto_priv.398]+0x2c>
	_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 <uart2_ibuf>
   2223e:	98 17       	cp	r25, r24
   22240:	08 f0       	brcs	.+2      	; 0x22244 <uart2_getchar(__file*) [clone .lto_priv.398]+0x28>
   22242:	90 e0       	ldi	r25, 0x00	; 0
	ptr[2] = buf_r;                  //store read index
   22244:	90 93 3b 05 	sts	0x053B, r25	; 0x80053b <uart2_ibuf+0x2>
	return rbuf_get(uart2_ibuf);
}
   22248:	c9 01       	movw	r24, r18
   2224a:	08 95       	ret

0002224c <uart2_putchar(char, __file*) [clone .lto_priv.397]>:
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 <uart2_putchar(char, __file*) [clone .lto_priv.397]>

	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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)>:
	} 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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)+0x30>
}

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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)+0x70>
	{
		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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)+0x1c>
		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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)+0x6c>
			{
				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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)+0x6a>
				{
					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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)+0x1c>
					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 <tmc2130_cs_high(unsigned char)>:
	}
}

inline void tmc2130_cs_high(uint8_t axis)
{
	switch (axis)
   222e0:	81 30       	cpi	r24, 0x01	; 1
   222e2:	41 f0       	breq	.+16     	; 0x222f4 <tmc2130_cs_high(unsigned char)+0x14>
   222e4:	28 f0       	brcs	.+10     	; 0x222f0 <tmc2130_cs_high(unsigned char)+0x10>
   222e6:	82 30       	cpi	r24, 0x02	; 2
   222e8:	39 f0       	breq	.+14     	; 0x222f8 <tmc2130_cs_high(unsigned char)+0x18>
   222ea:	83 30       	cpi	r24, 0x03	; 3
   222ec:	71 f0       	breq	.+28     	; 0x2230a <tmc2130_cs_high(unsigned char)+0x2a>
   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 <tmc2130_cs_high(unsigned char)+0x22>

00022316 <tmc2130_cs_low(unsigned char)>:
}


inline void tmc2130_cs_low(uint8_t axis)
{
	switch (axis)
   22316:	81 30       	cpi	r24, 0x01	; 1
   22318:	41 f0       	breq	.+16     	; 0x2232a <tmc2130_cs_low(unsigned char)+0x14>
   2231a:	28 f0       	brcs	.+10     	; 0x22326 <tmc2130_cs_low(unsigned char)+0x10>
   2231c:	82 30       	cpi	r24, 0x02	; 2
   2231e:	39 f0       	breq	.+14     	; 0x2232e <tmc2130_cs_low(unsigned char)+0x18>
   22320:	83 30       	cpi	r24, 0x03	; 3
   22322:	71 f0       	breq	.+28     	; 0x22340 <tmc2130_cs_low(unsigned char)+0x2a>
   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 <tmc2130_cs_low(unsigned char)+0x22>

0002234c <spi_txrx>:
}

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 <spi_txrx+0x2>
	return SPDR;
   22354:	8e b5       	in	r24, 0x2e	; 46
}
   22356:	08 95       	ret

00022358 <temp_mgr_pid()>:
#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 <target_temperature_isr>
   22390:	30 90 1e 06 	lds	r3, 0x061E	; 0x80061e <target_temperature_isr+0x1>
   22394:	40 90 16 05 	lds	r4, 0x0516	; 0x800516 <current_temperature_isr>
   22398:	50 90 17 05 	lds	r5, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   2239c:	60 90 18 05 	lds	r6, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   223a0:	70 90 19 05 	lds	r7, 0x0519	; 0x800519 <current_temperature_isr+0x3>

#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 <temp_mgr_pid()+0x60>
        pid_output = 0;
        pid_reset[e] = true;
   223aa:	81 e0       	ldi	r24, 0x01	; 1
   223ac:	80 93 f4 05 	sts	0x05F4, r24	; 0x8005f4 <pid_reset>
        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 <temp_mgr_pid()+0x252>
#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 <pid_reset>
   223d6:	88 23       	and	r24, r24
   223d8:	91 f0       	breq	.+36     	; 0x223fe <temp_mgr_pid()+0xa6>
            iState_sum[e] = 0.0;
   223da:	10 92 f0 05 	sts	0x05F0, r1	; 0x8005f0 <iState_sum>
   223de:	10 92 f1 05 	sts	0x05F1, r1	; 0x8005f1 <iState_sum+0x1>
   223e2:	10 92 f2 05 	sts	0x05F2, r1	; 0x8005f2 <iState_sum+0x2>
   223e6:	10 92 f3 05 	sts	0x05F3, r1	; 0x8005f3 <iState_sum+0x3>
            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 <dTerm>
   223ee:	10 92 ed 05 	sts	0x05ED, r1	; 0x8005ed <dTerm+0x1>
   223f2:	10 92 ee 05 	sts	0x05EE, r1	; 0x8005ee <dTerm+0x2>
   223f6:	10 92 ef 05 	sts	0x05EF, r1	; 0x8005ef <dTerm+0x3>
            pid_reset[e] = false;
   223fa:	10 92 f4 05 	sts	0x05F4, r1	; 0x8005f4 <pid_reset>
        }
#ifndef PonM
        pTerm[e] = cs.Kp * pid_error[e];
   223fe:	20 91 25 0e 	lds	r18, 0x0E25	; 0x800e25 <cs+0x68>
   22402:	30 91 26 0e 	lds	r19, 0x0E26	; 0x800e26 <cs+0x69>
   22406:	40 91 27 0e 	lds	r20, 0x0E27	; 0x800e27 <cs+0x6a>
   2240a:	50 91 28 0e 	lds	r21, 0x0E28	; 0x800e28 <cs+0x6b>
   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 <iState_sum>
   22422:	30 91 f1 05 	lds	r19, 0x05F1	; 0x8005f1 <iState_sum+0x1>
   22426:	40 91 f2 05 	lds	r20, 0x05F2	; 0x8005f2 <iState_sum+0x2>
   2242a:	50 91 f3 05 	lds	r21, 0x05F3	; 0x8005f3 <iState_sum+0x3>
   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 <temp_mgr_pid()+0x130>
   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 <temp_mgr_pid()+0x130>
   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 <iState_sum>
   22494:	90 93 f1 05 	sts	0x05F1, r25	; 0x8005f1 <iState_sum+0x1>
   22498:	a0 93 f2 05 	sts	0x05F2, r26	; 0x8005f2 <iState_sum+0x2>
   2249c:	b0 93 f3 05 	sts	0x05F3, r27	; 0x8005f3 <iState_sum+0x3>
        iTerm[e] = cs.Ki * iState_sum[e];
   224a0:	20 91 29 0e 	lds	r18, 0x0E29	; 0x800e29 <cs+0x6c>
   224a4:	30 91 2a 0e 	lds	r19, 0x0E2A	; 0x800e2a <cs+0x6d>
   224a8:	40 91 2b 0e 	lds	r20, 0x0E2B	; 0x800e2b <cs+0x6e>
   224ac:	50 91 2c 0e 	lds	r21, 0x0E2C	; 0x800e2c <cs+0x6f>
   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 <dState_last>
   224c6:	30 91 e9 05 	lds	r19, 0x05E9	; 0x8005e9 <dState_last+0x1>
   224ca:	40 91 ea 05 	lds	r20, 0x05EA	; 0x8005ea <dState_last+0x2>
   224ce:	50 91 eb 05 	lds	r21, 0x05EB	; 0x8005eb <dState_last+0x3>
   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 <cs+0x70>
   224de:	30 91 2e 0e 	lds	r19, 0x0E2E	; 0x800e2e <cs+0x71>
   224e2:	40 91 2f 0e 	lds	r20, 0x0E2F	; 0x800e2f <cs+0x72>
   224e6:	50 91 30 0e 	lds	r21, 0x0E30	; 0x800e30 <cs+0x73>
   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 <dTerm>
   2250a:	70 91 ed 05 	lds	r23, 0x05ED	; 0x8005ed <dTerm+0x1>
   2250e:	80 91 ee 05 	lds	r24, 0x05EE	; 0x8005ee <dTerm+0x2>
   22512:	90 91 ef 05 	lds	r25, 0x05EF	; 0x8005ef <dTerm+0x3>
   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 <dTerm>
   2252e:	90 92 ed 05 	sts	0x05ED, r9	; 0x8005ed <dTerm+0x1>
   22532:	a0 92 ee 05 	sts	0x05EE, r10	; 0x8005ee <dTerm+0x2>
   22536:	b0 92 ef 05 	sts	0x05EF, r11	; 0x8005ef <dTerm+0x3>
        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 <temp_mgr_pid()+0x21a>
   22570:	6d c1       	rjmp	.+730    	; 0x2284c <temp_mgr_pid()+0x4f4>
            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 <temp_mgr_pid()+0x246>
   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 <iState_sum>
   22592:	70 93 f1 05 	sts	0x05F1, r23	; 0x8005f1 <iState_sum+0x1>
   22596:	80 93 f2 05 	sts	0x05F2, r24	; 0x8005f2 <iState_sum+0x2>
   2259a:	90 93 f3 05 	sts	0x05F3, r25	; 0x8005f3 <iState_sum+0x3>
            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 <dState_last>
   225ae:	50 92 e9 05 	sts	0x05E9, r5	; 0x8005e9 <dState_last+0x1>
   225b2:	60 92 ea 05 	sts	0x05EA, r6	; 0x8005ea <dState_last+0x2>
   225b6:	70 92 eb 05 	sts	0x05EB, r7	; 0x8005eb <dState_last+0x3>
        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 <temp_mgr_pid()+0x534>
   225de:	23 28       	or	r2, r3
   225e0:	09 f4       	brne	.+2      	; 0x225e4 <temp_mgr_pid()+0x28c>
   225e2:	54 c1       	rjmp	.+680    	; 0x2288c <temp_mgr_pid()+0x534>
        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 <target_temperature_bed_isr>
   225f8:	30 91 17 06 	lds	r19, 0x0617	; 0x800617 <target_temperature_bed_isr+0x1>
   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 <current_temperature_bed_isr>
   22604:	50 90 19 06 	lds	r5, 0x0619	; 0x800619 <current_temperature_bed_isr+0x1>
   22608:	60 90 1a 06 	lds	r6, 0x061A	; 0x80061a <current_temperature_bed_isr+0x2>
   2260c:	70 90 1b 06 	lds	r7, 0x061B	; 0x80061b <current_temperature_bed_isr+0x3>

#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 <cs+0x74>
   2262c:	30 91 32 0e 	lds	r19, 0x0E32	; 0x800e32 <cs+0x75>
   22630:	40 91 33 0e 	lds	r20, 0x0E33	; 0x800e33 <cs+0x76>
   22634:	50 91 34 0e 	lds	r21, 0x0E34	; 0x800e34 <cs+0x77>
   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 <temp_iState_bed>
   22648:	30 91 fe 05 	lds	r19, 0x05FE	; 0x8005fe <temp_iState_bed+0x1>
   2264c:	40 91 ff 05 	lds	r20, 0x05FF	; 0x8005ff <temp_iState_bed+0x2>
   22650:	50 91 00 06 	lds	r21, 0x0600	; 0x800600 <temp_iState_bed+0x3>
   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 <temp_mgr_pid()+0x360>
   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 <temp_mgr_pid()+0x360>
   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 <temp_iState_bed>
   226c4:	90 93 fe 05 	sts	0x05FE, r25	; 0x8005fe <temp_iState_bed+0x1>
   226c8:	a0 93 ff 05 	sts	0x05FF, r26	; 0x8005ff <temp_iState_bed+0x2>
   226cc:	b0 93 00 06 	sts	0x0600, r27	; 0x800600 <temp_iState_bed+0x3>
    iTerm_bed = cs.bedKi * temp_iState_bed;
   226d0:	20 91 35 0e 	lds	r18, 0x0E35	; 0x800e35 <cs+0x78>
   226d4:	30 91 36 0e 	lds	r19, 0x0E36	; 0x800e36 <cs+0x79>
   226d8:	40 91 37 0e 	lds	r20, 0x0E37	; 0x800e37 <cs+0x7a>
   226dc:	50 91 38 0e 	lds	r21, 0x0E38	; 0x800e38 <cs+0x7b>
   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 <temp_dState_bed>
   226f6:	30 91 fa 05 	lds	r19, 0x05FA	; 0x8005fa <temp_dState_bed+0x1>
   226fa:	40 91 fb 05 	lds	r20, 0x05FB	; 0x8005fb <temp_dState_bed+0x2>
   226fe:	50 91 fc 05 	lds	r21, 0x05FC	; 0x8005fc <temp_dState_bed+0x3>
   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 <cs+0x7c>
   2270e:	30 91 3a 0e 	lds	r19, 0x0E3A	; 0x800e3a <cs+0x7d>
   22712:	40 91 3b 0e 	lds	r20, 0x0E3B	; 0x800e3b <cs+0x7e>
   22716:	50 91 3c 0e 	lds	r21, 0x0E3C	; 0x800e3c <cs+0x7f>
   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 <dTerm_bed>
   2273a:	70 91 f6 05 	lds	r23, 0x05F6	; 0x8005f6 <dTerm_bed+0x1>
   2273e:	80 91 f7 05 	lds	r24, 0x05F7	; 0x8005f7 <dTerm_bed+0x2>
   22742:	90 91 f8 05 	lds	r25, 0x05F8	; 0x8005f8 <dTerm_bed+0x3>
   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 <dTerm_bed>
   2275e:	90 92 f6 05 	sts	0x05F6, r9	; 0x8005f6 <dTerm_bed+0x1>
   22762:	a0 92 f7 05 	sts	0x05F7, r10	; 0x8005f7 <dTerm_bed+0x2>
   22766:	b0 92 f8 05 	sts	0x05F8, r11	; 0x8005f8 <dTerm_bed+0x3>
    temp_dState_bed = pid_input;
   2276a:	40 92 f9 05 	sts	0x05F9, r4	; 0x8005f9 <temp_dState_bed>
   2276e:	50 92 fa 05 	sts	0x05FA, r5	; 0x8005fa <temp_dState_bed+0x1>
   22772:	60 92 fb 05 	sts	0x05FB, r6	; 0x8005fb <temp_dState_bed+0x2>
   22776:	70 92 fc 05 	sts	0x05FC, r7	; 0x8005fc <temp_dState_bed+0x3>

    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 <temp_mgr_pid()+0x45a>
   227b0:	70 c0       	rjmp	.+224    	; 0x22892 <temp_mgr_pid()+0x53a>
        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 <temp_mgr_pid()+0x486>
   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 <temp_iState_bed>
   227d2:	70 93 fe 05 	sts	0x05FE, r23	; 0x8005fe <temp_iState_bed+0x1>
   227d6:	80 93 ff 05 	sts	0x05FF, r24	; 0x8005ff <temp_iState_bed+0x2>
   227da:	90 93 00 06 	sts	0x0600, r25	; 0x800600 <temp_iState_bed+0x3>
        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 <temp_mgr_pid()+0x580>
    {
        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>
        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 <temp_mgr_pid()+0x4c2>
    {
        soft_pwm_bed = 0;
   22816:	10 92 1c 06 	sts	0x061C, r1	; 0x80061c <soft_pwm_bed>
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 <temp_mgr_pid()+0x252>
            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 <temp_mgr_pid()+0x58>
   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 <iState_sum>
   2287e:	70 93 f1 05 	sts	0x05F1, r23	; 0x8005f1 <iState_sum+0x1>
   22882:	80 93 f2 05 	sts	0x05F2, r24	; 0x8005f2 <iState_sum+0x2>
   22886:	90 93 f3 05 	sts	0x05F3, r25	; 0x8005f3 <iState_sum+0x3>
   2288a:	92 cd       	rjmp	.-1244   	; 0x223b0 <temp_mgr_pid()+0x58>

    // 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 <temp_mgr_pid()+0x29c>

    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 <temp_mgr_pid()+0x492>
        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 <temp_mgr_pid()+0x578>
   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 <temp_iState_bed>
   228c4:	70 93 fe 05 	sts	0x05FE, r23	; 0x8005fe <temp_iState_bed+0x1>
   228c8:	80 93 ff 05 	sts	0x05FF, r24	; 0x8005ff <temp_iState_bed+0x2>
   228cc:	90 93 00 06 	sts	0x0600, r25	; 0x800600 <temp_iState_bed+0x3>
        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 <temp_mgr_pid()+0x492>
    {
        soft_pwm_bed = (int)pid_output >> 1;
    }
    else
    {
        soft_pwm_bed = 0;
   228d8:	10 92 1c 06 	sts	0x061C, r1	; 0x80061c <soft_pwm_bed>
   228dc:	98 cf       	rjmp	.-208    	; 0x2280e <temp_mgr_pid()+0x4b6>

000228de <setIsrTargetTemperatures()>:
}

static void setIsrTargetTemperatures()
{
    for(uint8_t e=0;e<EXTRUDERS;e++)
        target_temperature_isr[e] = target_temperature[e];
   228de:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   228e2:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   228e6:	90 93 1e 06 	sts	0x061E, r25	; 0x80061e <target_temperature_isr+0x1>
   228ea:	80 93 1d 06 	sts	0x061D, r24	; 0x80061d <target_temperature_isr>
    target_temperature_bed_isr = target_temperature_bed;
   228ee:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
   228f2:	90 91 72 06 	lds	r25, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   228f6:	90 93 17 06 	sts	0x0617, r25	; 0x800617 <target_temperature_bed_isr+0x1>
   228fa:	80 93 16 06 	sts	0x0616, r24	; 0x800616 <target_temperature_bed_isr>
}
   228fe:	08 95       	ret

00022900 <babystep(unsigned char, bool)>:
{
    // 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 <babystep(unsigned char, bool)+0x54>
   22904:	20 f0       	brcs	.+8      	; 0x2290e <babystep(unsigned char, bool)+0xe>
   22906:	82 30       	cpi	r24, 0x02	; 2
   22908:	09 f4       	brne	.+2      	; 0x2290c <babystep(unsigned char, bool)+0xc>
   2290a:	45 c0       	rjmp	.+138    	; 0x22996 <babystep(unsigned char, bool)+0x96>
   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 <babystep(unsigned char, bool)+0x34>
            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 <babystep(unsigned char, bool)+0x48>
   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 <babystep(unsigned char, bool)+0x30>
            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 <babystep(unsigned char, bool)+0x4c>
   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 <babystep(unsigned char, bool)+0x28>
#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 <babystep(unsigned char, bool)+0x42>
    }
    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 <babystep(unsigned char, bool)+0x7e>
            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 <babystep(unsigned char, bool)+0x8e>
   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 <babystep(unsigned char, bool)+0x7a>
            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 <babystep(unsigned char, bool)+0x92>
   2298a:	82 60       	ori	r24, 0x02	; 2
   2298c:	da cf       	rjmp	.-76     	; 0x22942 <babystep(unsigned char, bool)+0x42>
        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 <babystep(unsigned char, bool)+0x72>
#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 <babystep(unsigned char, bool)+0x42>
    }
    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 <babystep(unsigned char, bool)+0xc4>
            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 <babystep(unsigned char, bool)+0xda>
   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 <babystep(unsigned char, bool)+0xc0>
            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 <babystep(unsigned char, bool)+0xce>
   229cc:	bc cf       	rjmp	.-136    	; 0x22946 <babystep(unsigned char, bool)+0x46>
            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 <babystep(unsigned char, bool)+0xde>
   229d6:	84 60       	ori	r24, 0x04	; 4
   229d8:	b4 cf       	rjmp	.-152    	; 0x22942 <babystep(unsigned char, bool)+0x42>
        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 <babystep(unsigned char, bool)+0xb8>
        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 <babystep(unsigned char, bool)+0x42>

000229e2 <MarlinSerial::checkRx()>:
		}
	}

    static void checkRx(void)
    {
        if (selectedSerialPort == 0) {
   229e2:	80 91 38 05 	lds	r24, 0x0538	; 0x800538 <selectedSerialPort>
   229e6:	81 11       	cpse	r24, r1
   229e8:	25 c0       	rjmp	.+74     	; 0x22a34 <MarlinSerial::checkRx()+0x52>
            if((M_UCSRxA & (1<<M_RXCx)) != 0) {
   229ea:	80 91 c0 00 	lds	r24, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
   229ee:	87 ff       	sbrs	r24, 7
   229f0:	3d c0       	rjmp	.+122    	; 0x22a6c <MarlinSerial::checkRx()+0x8a>
                // Test for a framing error.
                if (M_UCSRxA & (1<<M_FEx)) {
   229f2:	80 91 c0 00 	lds	r24, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
   229f6:	84 ff       	sbrs	r24, 4
   229f8:	03 c0       	rjmp	.+6      	; 0x22a00 <MarlinSerial::checkRx()+0x1e>
                    // 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 <rx_buffer+0x80>
   22a08:	30 91 99 04 	lds	r19, 0x0499	; 0x800499 <rx_buffer+0x81>
   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 <rx_buffer+0x82>
   22a18:	70 91 9b 04 	lds	r23, 0x049B	; 0x80049b <rx_buffer+0x83>
   22a1c:	86 17       	cp	r24, r22
   22a1e:	97 07       	cpc	r25, r23
   22a20:	29 f1       	breq	.+74     	; 0x22a6c <MarlinSerial::checkRx()+0x8a>
                    // 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 <rx_buffer+0x81>
   22a2e:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <rx_buffer+0x80>
   22a32:	1c c0       	rjmp	.+56     	; 0x22a6c <MarlinSerial::checkRx()+0x8a>
					UDR1 = c;
#endif //DEBUG_DUMP_TO_2ND_SERIAL
                }
            }
        } else { // if(selectedSerialPort == 1) {
            if((UCSR1A & (1<<RXC1)) != 0) {
   22a34:	80 91 c8 00 	lds	r24, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
   22a38:	87 ff       	sbrs	r24, 7
   22a3a:	18 c0       	rjmp	.+48     	; 0x22a6c <MarlinSerial::checkRx()+0x8a>
                // Test for a framing error.
                if (UCSR1A & (1<<FE1)) {
   22a3c:	80 91 c8 00 	lds	r24, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
   22a40:	84 ff       	sbrs	r24, 4
   22a42:	03 c0       	rjmp	.+6      	; 0x22a4a <MarlinSerial::checkRx()+0x68>
                    // 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 <rx_buffer+0x80>
   22a52:	30 91 99 04 	lds	r19, 0x0499	; 0x800499 <rx_buffer+0x81>
   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 <rx_buffer+0x82>
   22a62:	70 91 9b 04 	lds	r23, 0x049B	; 0x80049b <rx_buffer+0x83>
   22a66:	68 17       	cp	r22, r24
   22a68:	79 07       	cpc	r23, r25
   22a6a:	d9 f6       	brne	.-74     	; 0x22a22 <MarlinSerial::checkRx()+0x40>
					M_UDRx = c;
#endif //DEBUG_DUMP_TO_2ND_SERIAL
                }
            }
        }
    }
   22a6c:	08 95       	ret

00022a6e <Sound_DoSound_Alert(bool)>:

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<nMax;nI++)
   22a74:	80 e0       	ldi	r24, 0x00	; 0
   22a76:	6b e1       	ldi	r22, 0x1B	; 27
   22a78:	73 e0       	ldi	r23, 0x03	; 3
   22a7a:	4b ec       	ldi	r20, 0xCB	; 203
   22a7c:	57 e0       	ldi	r21, 0x07	; 7
     {
     WRITE(BEEPER,HIGH);
   22a7e:	3f b7       	in	r19, 0x3f	; 63
   22a80:	f8 94       	cli
   22a82:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   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 <Sound_DoSound_Alert(bool)+0x22>
     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 <Sound_DoSound_Alert(bool)+0x38>
static void Sound_DoSound_Alert(bool bOnce)
{
uint8_t nI,nMax;

nMax=bOnce?1:3;
for(nI=0;nI<nMax;nI++)
   22aaa:	8f 5f       	subi	r24, 0xFF	; 255
   22aac:	82 13       	cpse	r24, r18
   22aae:	e7 cf       	rjmp	.-50     	; 0x22a7e <Sound_DoSound_Alert(bool)+0x10>
     WRITE(BEEPER,HIGH);
     delayMicroseconds(200);
     WRITE(BEEPER,LOW);
     delayMicroseconds(500);
     }
}
   22ab0:	08 95       	ret

00022ab2 <Sound_DoSound_Echo()>:
     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 <Sound_DoSound_Echo()+0x18>
     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 <Sound_DoSound_Echo()+0x2e>
   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 <Sound_DoSound_Echo()+0x6>
     WRITE(BEEPER,HIGH);
     delayMicroseconds(100);
     WRITE(BEEPER,LOW);
     delayMicroseconds(100);
     }
}
   22ae8:	08 95       	ret

00022aea <lcd_pause_usb_print()>:
}

//! @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 <serialprintlnPGM(char const*)>

00022af2 <lcd_set_fan_check() [clone .lto_priv.416]>:

  MENU_END();
}

void lcd_set_fan_check() {
	fans_check_enabled = !fans_check_enabled;
   22af2:	60 91 38 02 	lds	r22, 0x0238	; 0x800238 <fans_check_enabled>
   22af6:	81 e0       	ldi	r24, 0x01	; 1
   22af8:	68 27       	eor	r22, r24
   22afa:	60 93 38 02 	sts	0x0238, r22	; 0x800238 <fans_check_enabled>
        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>
	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 <fans_check_enabled>
   22b0a:	81 11       	cpse	r24, r1
   22b0c:	02 c0       	rjmp	.+4      	; 0x22b12 <lcd_set_fan_check() [clone .lto_priv.416]+0x20>
   22b0e:	10 92 e4 03 	sts	0x03E4, r1	; 0x8003e4 <fan_check_error>
#endif //FANCHECK
}
   22b12:	08 95       	ret

00022b14 <lcd_display_message_fullscreen_nonBlocking_P(char const*)>:
 * 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 <lcd_frame_start()>
 * @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 <lcd_set_cursor(unsigned char, unsigned char)>

        // 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 <pgm_is_whitespace(char const*)>
   22b42:	88 23       	and	r24, r24
   22b44:	29 f0       	breq	.+10     	; 0x22b50 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x3c>
   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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x3c>
   22b4e:	49 c0       	rjmp	.+146    	; 0x22be2 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xce>
   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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x4c>
   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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x6c>
   22b6c:	84 31       	cpi	r24, 0x14	; 20
   22b6e:	41 f4       	brne	.+16     	; 0x22b80 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x6c>
            // 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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x6c>
                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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x76>
   22b88:	40 c0       	rjmp	.+128    	; 0x22c0a <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   22b8a:	ce 01       	movw	r24, r28
   22b8c:	0f 94 f8 10 	call	0x221f0	; 0x221f0 <pgm_is_whitespace(char const*)>
   22b90:	81 11       	cpse	r24, r1
   22b92:	3b c0       	rjmp	.+118    	; 0x22c0a <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
    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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   22ba0:	8c 32       	cpi	r24, 0x2C	; 44
   22ba2:	99 f1       	breq	.+102    	; 0x22c0a <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   22bac:	8f 33       	cpi	r24, 0x3F	; 63
   22bae:	69 f1       	breq	.+90     	; 0x22c0a <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   22bb0:	81 32       	cpi	r24, 0x21	; 33
   22bb2:	59 f1       	breq	.+86     	; 0x22c0a <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xbe>
   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 <pgm_is_whitespace(char const*)>
   22bca:	81 11       	cpse	r24, r1
   22bcc:	1d c0       	rjmp	.+58     	; 0x22c08 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf4>
                 -- msgend;
   22bce:	85 01       	movw	r16, r10
   22bd0:	f2 cf       	rjmp	.-28     	; 0x22bb6 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xa2>
            if (msgend == msg)
   22bd2:	c0 16       	cp	r12, r16
   22bd4:	d1 06       	cpc	r13, r17
   22bd6:	c9 f0       	breq	.+50     	; 0x22c0a <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
   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_display_message_fullscreen_nonBlocking_P(char const*)+0x20>
            }
            lcd_print(c);
        }
    }

    if (multi_screen) {
   22be2:	ee 20       	and	r14, r14
   22be4:	f9 f0       	breq	.+62     	; 0x22c24 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0x110>
        // 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 <lcd_putc_at(unsigned char, unsigned char, char)>
    }

    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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xc6>
            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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xc6>
   22c18:	0e 94 27 6f 	call	0xde4e	; 0xde4e <lcd_write(unsigned char) [clone .lto_priv.432]>
                 -- 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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xf6>
    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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)+0xdc>

00022c2a <lcd_menu_temperatures_line(char const*, int)>:
#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 <lcd_menu_temperatures_line(char const*, int)+0x32>
            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 <lcd_menu_temperatures_line(char const*, int)+0x1e>
        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 <lcd_menu_temperatures_line(char const*, int)+0x50>
        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 <lcd_menu_temperatures_line(char const*, int)+0x46>
        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 <lcd_printf_P(char const*, ...)>
   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 <lcd_adjust_bed()>:
//! |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 <menu_data+0xd>
   22cba:	81 11       	cpse	r24, r1
   22cbc:	35 c0       	rjmp	.+106    	; 0x22d28 <lcd_adjust_bed()+0x7a>
	{
        // 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 <eeprom_read_byte>
   22cc6:	81 30       	cpi	r24, 0x01	; 1
   22cc8:	61 f5       	brne	.+88     	; 0x22d22 <lcd_adjust_bed()+0x74>
		{
			_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 <eeprom_read_byte>
   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 <menu_data+0xf>
   22cdc:	80 93 b5 03 	sts	0x03B5, r24	; 0x8003b5 <menu_data+0xe>
			_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 <eeprom_read_byte>
   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 <menu_data+0x11>
   22cf2:	80 93 b7 03 	sts	0x03B7, r24	; 0x8003b7 <menu_data+0x10>
			_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 <eeprom_read_byte>
   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 <menu_data+0x13>
   22d08:	80 93 b9 03 	sts	0x03B9, r24	; 0x8003b9 <menu_data+0x12>
			_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 <eeprom_read_byte>
   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 <menu_data+0x15>
   22d1e:	80 93 bb 03 	sts	0x03BB, r24	; 0x8003bb <menu_data+0x14>
		}
        _md->status = 1;
   22d22:	81 e0       	ldi	r24, 0x01	; 1
   22d24:	80 93 b4 03 	sts	0x03B4, r24	; 0x8003b4 <menu_data+0xd>
    }
    MENU_BEGIN();
   22d28:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   22d2c:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   22d30:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   22d34:	84 30       	cpi	r24, 0x04	; 4
   22d36:	08 f0       	brcs	.+2      	; 0x22d3a <lcd_adjust_bed()+0x8c>
   22d38:	6e c0       	rjmp	.+220    	; 0x22e16 <lcd_adjust_bed()+0x168>
   22d3a:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
    ON_MENU_LEAVE(
   22d3e:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   22d42:	88 23       	and	r24, r24
   22d44:	e9 f0       	breq	.+58     	; 0x22d80 <lcd_adjust_bed()+0xd2>
   22d46:	60 91 b5 03 	lds	r22, 0x03B5	; 0x8003b5 <menu_data+0xe>
   22d4a:	8f eb       	ldi	r24, 0xBF	; 191
   22d4c:	9f e0       	ldi	r25, 0x0F	; 15
   22d4e:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   22d52:	60 91 b9 03 	lds	r22, 0x03B9	; 0x8003b9 <menu_data+0x12>
   22d56:	8d eb       	ldi	r24, 0xBD	; 189
   22d58:	9f e0       	ldi	r25, 0x0F	; 15
   22d5a:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   22d5e:	60 91 bb 03 	lds	r22, 0x03BB	; 0x8003bb <menu_data+0x14>
   22d62:	8c eb       	ldi	r24, 0xBC	; 188
   22d64:	9f e0       	ldi	r25, 0x0F	; 15
   22d66:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   22d6a:	60 91 b7 03 	lds	r22, 0x03B7	; 0x8003b7 <menu_data+0x10>
   22d6e:	8e eb       	ldi	r24, 0xBE	; 190
   22d70:	9f e0       	ldi	r25, 0x0F	; 15
   22d72:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   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>
        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 <lang_get_translation>
   22d88:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    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 <lang_get_translation>
   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_P(char const*, void*, unsigned char, int, int, int)>
    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 <lang_get_translation>
   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_P(char const*, void*, unsigned char, int, int, int)>
    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 <lang_get_translation>
   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_P(char const*, void*, unsigned char, int, int, int)>
    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 <lang_get_translation>
   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_edit_P(char const*, void*, unsigned char, int, int, int)>
    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 <lang_get_translation>
   22df4:	62 e2       	ldi	r22, 0x22	; 34
   22df6:	79 e3       	ldi	r23, 0x39	; 57
   22df8:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    MENU_END();
   22dfc:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
			_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 <menu_row>
   22e04:	8f 5f       	subi	r24, 0xFF	; 255
   22e06:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   22e0a:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   22e0e:	8f 5f       	subi	r24, 0xFF	; 255
   22e10:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   22e14:	8d cf       	rjmp	.-230    	; 0x22d30 <lcd_adjust_bed()+0x82>
    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 <shouldPreheatOnlyNozzle()>:
    }
}
#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 <eeprom_read_byte>
    if (eeprom_setting != 0)
   22e28:	81 11       	cpse	r24, r1
   22e2a:	05 c0       	rjmp	.+10     	; 0x22e36 <shouldPreheatOnlyNozzle()+0x16>
        return false;

    switch(eFilamentAction) {
   22e2c:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   22e30:	81 50       	subi	r24, 0x01	; 1
   22e32:	88 30       	cpi	r24, 0x08	; 8
   22e34:	10 f0       	brcs	.+4      	; 0x22e3a <shouldPreheatOnlyNozzle()+0x1a>
#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 <lcd_cutter_enabled() [clone .lto_priv.417]>:
}

#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 <eeprom_read_byte>
   22e46:	60 e0       	ldi	r22, 0x00	; 0
   22e48:	81 30       	cpi	r24, 0x01	; 1
   22e4a:	09 f0       	breq	.+2      	; 0x22e4e <lcd_cutter_enabled() [clone .lto_priv.417]+0x10>
   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 <eeprom_update_byte>

00022e56 <SpoolJoin::SpoolJoin::toggleSpoolJoin()>:
    }
}

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 <eeprom_read_byte>
   22e5e:	61 e0       	ldi	r22, 0x01	; 1
   22e60:	82 30       	cpi	r24, 0x02	; 2
   22e62:	09 f0       	breq	.+2      	; 0x22e66 <SpoolJoin::SpoolJoin::toggleSpoolJoin()+0x10>
   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 <eeprom_update_byte>

00022e6e <lcd_adjust_bed_reset()>:
} _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 <eeprom_adjust_bed_reset()>
	_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 <menu_data+0xd>
}
   22e76:	08 95       	ret

00022e78 <lcd_menu_AutoLoadFilament() [clone .lto_priv.413]>:
}

#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 <lang_get_translation>
   22e80:	0f 94 8a 15 	call	0x22b14	; 0x22b14 <lcd_display_message_fullscreen_nonBlocking_P(char const*)>
    menu_back_if_clicked();
   22e84:	0d 94 f4 d4 	jmp	0x3a9e8	; 0x3a9e8 <menu_back_if_clicked()>

00022e88 <lcd_menu_extruder_info()>:
//! |                    |
//! |                    |
//! ----------------------
//! @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>

    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   22e9a:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <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] );
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
    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 <menu_back_if_clicked()>

00022f14 <lcd_menu_temperatures()>:
//! | 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>
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   22f20:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    lcd_menu_temperatures_line( _T(MSG_NOZZLE), (int)current_temperature[0] );
   22f24:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   22f28:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   22f2c:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   22f30:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <lang_get_translation>
   22f42:	b6 01       	movw	r22, r12
   22f44:	0f 94 15 16 	call	0x22c2a	; 0x22c2a <lcd_menu_temperatures_line(char const*, int)>
    lcd_menu_temperatures_line( _T(MSG_BED), (int)current_temperature_bed );
   22f48:	60 91 ed 04 	lds	r22, 0x04ED	; 0x8004ed <current_temperature_bed>
   22f4c:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   22f50:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   22f54:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <lang_get_translation>
   22f66:	b6 01       	movw	r22, r12
   22f68:	0f 94 15 16 	call	0x22c2a	; 0x22c2a <lcd_menu_temperatures_line(char const*, int)>
#ifdef AMBIENT_THERMISTOR
    lcd_menu_temperatures_line( _T(MSG_AMBIENT), (int)current_temperature_ambient );
   22f6c:	60 91 55 06 	lds	r22, 0x0655	; 0x800655 <current_temperature_ambient>
   22f70:	70 91 56 06 	lds	r23, 0x0656	; 0x800656 <current_temperature_ambient+0x1>
   22f74:	80 91 57 06 	lds	r24, 0x0657	; 0x800657 <current_temperature_ambient+0x2>
   22f78:	90 91 58 06 	lds	r25, 0x0658	; 0x800658 <current_temperature_ambient+0x3>
   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 <lang_get_translation>
   22f8a:	b6 01       	movw	r22, r12
   22f8c:	0f 94 15 16 	call	0x22c2a	; 0x22c2a <lcd_menu_temperatures_line(char const*, int)>
#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 <current_temperature_pinda>
   22f94:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   22f98:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   22f9c:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   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 <lcd_menu_temperatures_line(char const*, int)>
#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 <menu_back_if_clicked()>

00022fb8 <lcd_menu_voltages()>:
//! | 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>
    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 <current_voltage_raw_pwr>
   22fd0:	70 91 5c 06 	lds	r23, 0x065C	; 0x80065c <current_voltage_raw_pwr+0x1>
   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 <current_voltage_raw_bed>
   2300e:	70 91 5a 06 	lds	r23, 0x065A	; 0x80065a <current_voltage_raw_bed+0x1>
   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_home()>
    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 <lcd_printf_P(char const*, ...)>
#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 <menu_back_if_clicked()>

0002308e <lcd_menu_fails_stats_print()>:
//! | 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>
	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 <eeprom_read_byte>
   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 <eeprom_read_byte>
   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 <eeprom_read_byte>
   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 <eeprom_read_byte>
   230cc:	a8 2e       	mov	r10, r24
    lcd_home();
   230ce:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
        _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 <menu_back_if_clicked()>

00023150 <lcd_menu_fails_stats_mmu_print()>:
//! | 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>
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   23164:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
             " %-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 <eeprom_read_byte>
//! ----------------------
//! @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 <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <eeprom_read_byte>
//! ----------------------
//! @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 <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
             " %-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 <menu_back_if_clicked()>

000231ee <lcd_menu_belt_status()>:
//! |  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_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)));
   231fa:	8b e5       	ldi	r24, 0x5B	; 91
   231fc:	9f e0       	ldi	r25, 0x0F	; 15
   231fe:	0f 94 1e dc 	call	0x3b83c	; 0x3b83c <eeprom_read_word>
   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 <eeprom_read_word>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
    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 <menu_back_if_clicked()>

0002324c <lcd_menu_fails_stats_total()>:
//! | 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>
	lcd_timeoutToStatus.stop(); //infinite timeout
	lcd_home();
   2326c:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    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 <eeprom_read_word>
   23278:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <eeprom_read_word>
   23288:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <eeprom_read_word>
   232a4:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <eeprom_read_word>
   232c0:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
        _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 <menu_back_if_clicked()>

00023336 <lcd_menu_fails_stats_mmu_total()>:
//! | 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>
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   23352:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
    lcd_printf_P(
   23356:	80 91 bf 13 	lds	r24, 0x13BF	; 0x8013bf <MMU2::mmu2+0x75>
   2335a:	90 91 c0 13 	lds	r25, 0x13C0	; 0x8013c0 <MMU2::mmu2+0x76>
   2335e:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <eeprom_read_word>
   2337a:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <eeprom_read_word>
   23396:	0f 94 07 11 	call	0x2220e	; 0x2220e <clamp999(unsigned int)>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
        ),
        _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 <menu_back_if_clicked()>

00023404 <lcd_menu_xyz_offset()>:
//! |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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

    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_set_cursor(unsigned char, unsigned char)>
        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 <eeprom_read_dword>
   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_printf_P(char const*, ...)>
{
    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_set_cursor(unsigned char, unsigned char)>
        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 <eeprom_read_dword>
   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 <lcd_printf_P(char const*, ...)>
    }
    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 <menu_back_if_clicked()>

0002348e <lcd_menu_xyz_skew()>:
//! ----------------------
//! 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 <eeprom_read_dword>
   234a6:	6b 01       	movw	r12, r22
   234a8:	7c 01       	movw	r14, r24
	lcd_home();
   234aa:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
	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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
	 _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 <lcd_set_cursor(unsigned char, unsigned char)>
	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 <lcd_menu_xyz_skew()+0x10a>
}

//@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 <lcd_printf_P(char const*, ...)>
   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 <lcd_clicked()>
   23574:	88 23       	and	r24, r24
   23576:	b9 f0       	breq	.+46     	; 0x235a6 <lcd_menu_xyz_skew()+0x118>
        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 <menu_goto(void (*)(), int, bool, bool)>
	);
	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 <lang_get_translation>
   235a0:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
   235a4:	e5 cf       	rjmp	.-54     	; 0x23570 <lcd_menu_xyz_skew()+0xe2>
	}
    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 <lcd_menu_xyz_y_min()>:
//! |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>
	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>
	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 <eeprom_read_block>

	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_home()>
	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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
	 _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 <lcd_set_cursor(unsigned char, unsigned char)>
		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 <lcd_menu_xyz_y_min()+0x254>
		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 <lcd_printf_P(char const*, ...)>
   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 <lcd_set_cursor(unsigned char, unsigned char)>
		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 <lcd_menu_xyz_y_min()+0x262>
   237b6:	8a e8       	ldi	r24, 0x8A	; 138
   237b8:	97 e4       	ldi	r25, 0x47	; 71
   237ba:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   237be:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
		else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]);
	}
    if (lcd_clicked())
   237c2:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   237c6:	88 23       	and	r24, r24
   237c8:	41 f0       	breq	.+16     	; 0x237da <lcd_menu_xyz_y_min()+0x222>
        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 <menu_goto(void (*)(), int, bool, bool)>
}
   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 <lang_get_translation>
   23814:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
   23818:	b8 cf       	rjmp	.-144    	; 0x2378a <lcd_menu_xyz_y_min()+0x1d2>
		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 <lcd_printf_P(char const*, ...)>
   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 <lcd_menu_xyz_y_min()+0x20a>

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 <homing_flag>
   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 <mesh_bed_leveling_flag>
   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 <menu_back()>
		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 <menu_data>
   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 <menu_data+0x1>
		_md->initialized = true;
   238a8:	71 e0       	ldi	r23, 0x01	; 1
   238aa:	70 93 a7 03 	sts	0x03A7, r23	; 0x8003a7 <menu_data>
   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 <lcd_encoder>
   238bc:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <refresh_cmd_timeout()>
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 <block_buffer_head>
    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 <block_buffer_tail>
		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 <lcd_encoder>
   238f4:	70 91 70 06 	lds	r23, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <lcd_encoder+0x1>
   2397c:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
			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 <world2machine_clamp(float&, float&)>
			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 <get_feedrate_mm_s(float)>
   2399e:	0f 94 3d c0 	call	0x3807a	; 0x3807a <plan_buffer_line_curposXYZE(float)>
			lcd_draw_update = 1;
   239a2:	81 e0       	ldi	r24, 0x01	; 1
   239a4:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
		}
	}
	if (lcd_draw_update)
   239a8:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   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 <lcd_set_cursor(unsigned char, unsigned char)>
		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 <lcd_printf_P(char const*, ...)>
   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 <menu_leaving>
   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 <lcd_click_trigger>
   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 <menu_data+0x1>
   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 <menu_back_if_clicked()>
	{
		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 <lcd_move_z() [clone .lto_priv.407]>:
}
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 <lcd_move_y() [clone .lto_priv.419]>:
// 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 <lcd_move_x() [clone .lto_priv.418]>:
}

// 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 <lcd_menu_fails_stats() [clone .lto_priv.414]>:
//! ----------------------
//! @endcode

static void lcd_menu_fails_stats()
{
	MENU_BEGIN();
   23a72:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   23a76:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   23a7a:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   23a7e:	84 30       	cpi	r24, 0x04	; 4
   23a80:	28 f5       	brcc	.+74     	; 0x23acc <lcd_menu_fails_stats() [clone .lto_priv.414]+0x5a>
   23a82:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	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 <lang_get_translation>
   23a8e:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lang_get_translation>
   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(char const*, void (*)())>
	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 <lang_get_translation>
   23aaa:	6a eb       	ldi	r22, 0xBA	; 186
   23aac:	79 e3       	ldi	r23, 0x39	; 57
   23aae:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
	MENU_END();
   23ab2:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
//! ----------------------
//! @endcode

static void lcd_menu_fails_stats()
{
	MENU_BEGIN();
   23ab6:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   23aba:	8f 5f       	subi	r24, 0xFF	; 255
   23abc:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   23ac0:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   23ac4:	8f 5f       	subi	r24, 0xFF	; 255
   23ac6:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   23aca:	d7 cf       	rjmp	.-82     	; 0x23a7a <lcd_menu_fails_stats() [clone .lto_priv.414]+0x8>
	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 <lcd_menu_fails_stats_mmu() [clone .lto_priv.415]>:
//! | 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 <menu_start()>
   23ad2:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   23ad6:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   23ada:	84 30       	cpi	r24, 0x04	; 4
   23adc:	68 f5       	brcc	.+90     	; 0x23b38 <lcd_menu_fails_stats_mmu() [clone .lto_priv.415]+0x6a>
   23ade:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
	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 <lang_get_translation>
   23aea:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
	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 <lang_get_translation>
   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(char const*, void (*)())>
	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 <lang_get_translation>
   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(char const*, void (*)())>
	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 <lang_get_translation>
   23b16:	6a ea       	ldi	r22, 0xAA	; 170
   23b18:	7a e3       	ldi	r23, 0x3A	; 58
   23b1a:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
	MENU_END();
   23b1e:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
//! | 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 <menu_row>
   23b26:	8f 5f       	subi	r24, 0xFF	; 255
   23b28:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   23b2c:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   23b30:	8f 5f       	subi	r24, 0xFF	; 255
   23b32:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   23b36:	cf cf       	rjmp	.-98     	; 0x23ad6 <lcd_menu_fails_stats_mmu() [clone .lto_priv.415]+0x8>
	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 <mFilamentResetMenuStack()>:
    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 <bFilamentPreheatState>
   23b3e:	81 11       	cpse	r24, r1
   23b40:	03 c0       	rjmp	.+6      	; 0x23b48 <mFilamentResetMenuStack()+0xe>
   23b42:	82 e0       	ldi	r24, 0x02	; 2
   23b44:	0d 94 36 d4 	jmp	0x3a86c	; 0x3a86c <menu_back(unsigned char)>
   23b48:	81 e0       	ldi	r24, 0x01	; 1
   23b4a:	fc cf       	rjmp	.-8      	; 0x23b44 <mFilamentResetMenuStack()+0xa>

00023b4c <lcd_support_menu() [clone .lto_priv.408]>:
//! | 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 <menu_data>
   23b5c:	88 23       	and	r24, r24
   23b5e:	29 f0       	breq	.+10     	; 0x23b6a <lcd_support_menu() [clone .lto_priv.408]+0x1e>
   23b60:	90 91 6d 02 	lds	r25, 0x026D	; 0x80026d <lcd_draw_update>
   23b64:	92 30       	cpi	r25, 0x02	; 2
   23b66:	09 f0       	breq	.+2      	; 0x23b6a <lcd_support_menu() [clone .lto_priv.408]+0x1e>
   23b68:	80 c1       	rjmp	.+768    	; 0x23e6a <lcd_support_menu() [clone .lto_priv.408]+0x31e>
	{
        // 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 <menu_data>
   23b70:	80 91 00 17 	lds	r24, 0x1700	; 0x801700 <card+0x273>
        _md->is_flash_air = card.ToshibaFlashAir_isEnabled();
   23b74:	80 93 a8 03 	sts	0x03A8, r24	; 0x8003a8 <menu_data+0x1>
        if (_md->is_flash_air) {
   23b78:	88 23       	and	r24, r24
   23b7a:	21 f0       	breq	.+8      	; 0x23b84 <lcd_support_menu() [clone .lto_priv.408]+0x38>
            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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]>
    {
        // 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 <menu_start()>
   23b88:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
		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 <menu_row>
   23ba0:	84 30       	cpi	r24, 0x04	; 4
   23ba2:	08 f0       	brcs	.+2      	; 0x23ba6 <lcd_support_menu() [clone .lto_priv.408]+0x5a>
   23ba4:	89 c1       	rjmp	.+786    	; 0x23eb8 <lcd_support_menu() [clone .lto_priv.408]+0x36c>
   23ba6:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>

  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 <lang_get_translation>
   23bb2:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>

  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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(char const*)>
  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 <lang_get_translation>
   23c1e:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
  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(char const*)>
  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 <menu_item_back_P(char const*)>
	if (MMU2::mmu2.Enabled())
   23c32:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   23c36:	81 30       	cpi	r24, 0x01	; 1
   23c38:	09 f0       	breq	.+2      	; 0x23c3c <lcd_support_menu() [clone .lto_priv.408]+0xf0>
   23c3a:	39 c1       	rjmp	.+626    	; 0x23eae <lcd_support_menu() [clone .lto_priv.408]+0x362>
	{
		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 <lang_get_translation>
   23c44:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
		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 <menu_item_back_P(char const*)>
		if (((menu_item - 1) == menu_line) && lcd_draw_update)
   23c50:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   23c54:	81 50       	subi	r24, 0x01	; 1
   23c56:	99 0b       	sbc	r25, r25
   23c58:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   23c5c:	28 17       	cp	r18, r24
   23c5e:	19 06       	cpc	r1, r25
   23c60:	49 f5       	brne	.+82     	; 0x23cb4 <lcd_support_menu() [clone .lto_priv.408]+0x168>
   23c62:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   23c66:	88 23       	and	r24, r24
   23c68:	29 f1       	breq	.+74     	; 0x23cb4 <lcd_support_menu() [clone .lto_priv.408]+0x168>
		{
			lcd_set_cursor(6, menu_row);
   23c6a:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   23c6e:	86 e0       	ldi	r24, 0x06	; 6
   23c70:	0e 94 78 6e 	call	0xdcf0	; 0xdcf0 <lcd_set_cursor(unsigned char, unsigned char)>
    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 <MMU2::mmu2+0x6f>
   23c78:	81 30       	cpi	r24, 0x01	; 1
   23c7a:	09 f0       	breq	.+2      	; 0x23c7e <lcd_support_menu() [clone .lto_priv.408]+0x132>
   23c7c:	11 c1       	rjmp	.+546    	; 0x23ea0 <lcd_support_menu() [clone .lto_priv.408]+0x354>
   23c7e:	80 91 99 13 	lds	r24, 0x1399	; 0x801399 <MMU2::mmu2+0x4f>
   23c82:	90 91 9a 13 	lds	r25, 0x139A	; 0x80139a <MMU2::mmu2+0x50>
   23c86:	20 91 9b 13 	lds	r18, 0x139B	; 0x80139b <MMU2::mmu2+0x51>
			MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion();
			if (mmu_version.major > 0)
   23c8a:	88 23       	and	r24, r24
   23c8c:	09 f4       	brne	.+2      	; 0x23c90 <lcd_support_menu() [clone .lto_priv.408]+0x144>
   23c8e:	08 c1       	rjmp	.+528    	; 0x23ea0 <lcd_support_menu() [clone .lto_priv.408]+0x354>
				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 <lcd_printf_P(char const*, ...)>
   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 <menu_data+0x1>
   23cb8:	88 23       	and	r24, r24
   23cba:	09 f4       	brne	.+2      	; 0x23cbe <lcd_support_menu() [clone .lto_priv.408]+0x172>
   23cbc:	40 c0       	rjmp	.+128    	; 0x23d3e <lcd_support_menu() [clone .lto_priv.408]+0x1f2>
      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(char const*)>
      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(char const*)>
      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 <menu_item_back_P(char const*)>
      if (((menu_item - 1) == menu_line) && lcd_draw_update) {
   23cd6:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   23cda:	81 50       	subi	r24, 0x01	; 1
   23cdc:	99 0b       	sbc	r25, r25
   23cde:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   23ce2:	28 17       	cp	r18, r24
   23ce4:	19 06       	cpc	r1, r25
   23ce6:	59 f5       	brne	.+86     	; 0x23d3e <lcd_support_menu() [clone .lto_priv.408]+0x1f2>
   23ce8:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   23cec:	88 23       	and	r24, r24
   23cee:	39 f1       	breq	.+78     	; 0x23d3e <lcd_support_menu() [clone .lto_priv.408]+0x1f2>
          lcd_set_cursor(2, menu_row);
   23cf0:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   23cf4:	82 e0       	ldi	r24, 0x02	; 2
   23cf6:	0e 94 78 6e 	call	0xdcf0	; 0xdcf0 <lcd_set_cursor(unsigned char, unsigned char)>
   23cfa:	80 91 ac 03 	lds	r24, 0x03AC	; 0x8003ac <menu_data+0x5>
   23cfe:	1f 92       	push	r1
   23d00:	8f 93       	push	r24
   23d02:	80 91 ab 03 	lds	r24, 0x03AB	; 0x8003ab <menu_data+0x4>
   23d06:	1f 92       	push	r1
   23d08:	8f 93       	push	r24
   23d0a:	80 91 aa 03 	lds	r24, 0x03AA	; 0x8003aa <menu_data+0x3>
   23d0e:	1f 92       	push	r1
   23d10:	8f 93       	push	r24
   23d12:	80 91 a9 03 	lds	r24, 0x03A9	; 0x8003a9 <menu_data+0x2>
   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 <sprintf_P>
          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 <lcd_print(char const*)>
   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 <IP_address>
   23d42:	90 91 5e 06 	lds	r25, 0x065E	; 0x80065e <IP_address+0x1>
   23d46:	a0 91 5f 06 	lds	r26, 0x065F	; 0x80065f <IP_address+0x2>
   23d4a:	b0 91 60 06 	lds	r27, 0x0660	; 0x800660 <IP_address+0x3>
   23d4e:	89 2b       	or	r24, r25
   23d50:	8a 2b       	or	r24, r26
   23d52:	8b 2b       	or	r24, r27
   23d54:	09 f4       	brne	.+2      	; 0x23d58 <lcd_support_menu() [clone .lto_priv.408]+0x20c>
   23d56:	42 c0       	rjmp	.+132    	; 0x23ddc <lcd_support_menu() [clone .lto_priv.408]+0x290>

      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(char const*)>
      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 <lang_get_translation>
   23d68:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
      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 <menu_item_back_P(char const*)>
      if (((menu_item - 1) == menu_line) && lcd_draw_update) {
   23d74:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   23d78:	81 50       	subi	r24, 0x01	; 1
   23d7a:	99 0b       	sbc	r25, r25
   23d7c:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   23d80:	28 17       	cp	r18, r24
   23d82:	19 06       	cpc	r1, r25
   23d84:	59 f5       	brne	.+86     	; 0x23ddc <lcd_support_menu() [clone .lto_priv.408]+0x290>
   23d86:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   23d8a:	88 23       	and	r24, r24
   23d8c:	39 f1       	breq	.+78     	; 0x23ddc <lcd_support_menu() [clone .lto_priv.408]+0x290>
          lcd_set_cursor(2, menu_row);
   23d8e:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   23d92:	82 e0       	ldi	r24, 0x02	; 2
   23d94:	0e 94 78 6e 	call	0xdcf0	; 0xdcf0 <lcd_set_cursor(unsigned char, unsigned char)>
   23d98:	80 91 60 06 	lds	r24, 0x0660	; 0x800660 <IP_address+0x3>
   23d9c:	1f 92       	push	r1
   23d9e:	8f 93       	push	r24
   23da0:	80 91 5f 06 	lds	r24, 0x065F	; 0x80065f <IP_address+0x2>
   23da4:	1f 92       	push	r1
   23da6:	8f 93       	push	r24
   23da8:	80 91 5e 06 	lds	r24, 0x065E	; 0x80065e <IP_address+0x1>
   23dac:	1f 92       	push	r1
   23dae:	8f 93       	push	r24
   23db0:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <IP_address>
   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 <sprintf_P>
          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 <lcd_print(char const*)>
   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_back_P(char const*)>
  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 <lang_get_translation>
   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(char const*, void (*)())>
  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 <lang_get_translation>
   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(char const*, void (*)())>
  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 <lang_get_translation>
   23e0c:	60 ee       	ldi	r22, 0xE0	; 224
   23e0e:	73 ee       	ldi	r23, 0xE3	; 227
   23e10:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

#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 <lang_get_translation>
   23e1c:	68 eb       	ldi	r22, 0xB8	; 184
   23e1e:	7a e3       	ldi	r23, 0x3A	; 58
   23e20:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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 <lang_get_translation>
   23e2c:	64 ec       	ldi	r22, 0xC4	; 196
   23e2e:	79 e3       	ldi	r23, 0x39	; 57
   23e30:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>

#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 <lang_get_translation>
   23e3c:	66 e8       	ldi	r22, 0x86	; 134
   23e3e:	7a e3       	ldi	r23, 0x3A	; 58
   23e40:	0f 94 08 d4 	call	0x3a810	; 0x3a810 <menu_item_submenu_P(char const*, void (*)())>
#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(char const*, void (*)())>
    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 <menu_end()>
    {
        // 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 <menu_row>
   23e58:	8f 5f       	subi	r24, 0xFF	; 255
   23e5a:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   23e5e:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   23e62:	8f 5f       	subi	r24, 0xFF	; 255
   23e64:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   23e68:	99 ce       	rjmp	.-718    	; 0x23b9c <lcd_support_menu() [clone .lto_priv.408]+0x50>
        _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 <menu_data+0x1>
   23e6e:	99 23       	and	r25, r25
   23e70:	09 f4       	brne	.+2      	; 0x23e74 <lcd_support_menu() [clone .lto_priv.408]+0x328>
   23e72:	88 ce       	rjmp	.-752    	; 0x23b84 <lcd_support_menu() [clone .lto_priv.408]+0x38>
   23e74:	40 91 a9 03 	lds	r20, 0x03A9	; 0x8003a9 <menu_data+0x2>
   23e78:	50 91 aa 03 	lds	r21, 0x03AA	; 0x8003aa <menu_data+0x3>
   23e7c:	60 91 ab 03 	lds	r22, 0x03AB	; 0x8003ab <menu_data+0x4>
   23e80:	70 91 ac 03 	lds	r23, 0x03AC	; 0x8003ac <menu_data+0x5>
   23e84:	45 2b       	or	r20, r21
   23e86:	46 2b       	or	r20, r22
   23e88:	47 2b       	or	r20, r23
   23e8a:	09 f0       	breq	.+2      	; 0x23e8e <lcd_support_menu() [clone .lto_priv.408]+0x342>
   23e8c:	7b ce       	rjmp	.-778    	; 0x23b84 <lcd_support_menu() [clone .lto_priv.408]+0x38>
   23e8e:	8f 5f       	subi	r24, 0xFF	; 255
   23e90:	80 31       	cpi	r24, 0x10	; 16
   23e92:	19 f0       	breq	.+6      	; 0x23e9a <lcd_support_menu() [clone .lto_priv.408]+0x34e>
   23e94:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
   23e98:	75 ce       	rjmp	.-790    	; 0x23b84 <lcd_support_menu() [clone .lto_priv.408]+0x38>
    {
        // 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 <menu_data>
   23e9e:	72 ce       	rjmp	.-796    	; 0x23b84 <lcd_support_menu() [clone .lto_priv.408]+0x38>
			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 <lang_get_translation>
   23ea8:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
   23eac:	03 cf       	rjmp	.-506    	; 0x23cb4 <lcd_support_menu() [clone .lto_priv.408]+0x168>
		}
	}
	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 <menu_item_back_P(char const*)>
   23eb6:	fe ce       	rjmp	.-516    	; 0x23cb4 <lcd_support_menu() [clone .lto_priv.408]+0x168>
#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 <lcd_menu_toolchange_stats_mmu_total()>:
    {
        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 <menu_data>
   23eca:	81 11       	cpse	r24, r1
   23ecc:	19 c0       	rjmp	.+50     	; 0x23f00 <lcd_menu_toolchange_stats_mmu_total()+0x3a>
        lcd_clear();
   23ece:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
        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 <lang_get_translation>
   23eda:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
        lcd_putc(':');
   23ede:	8a e3       	ldi	r24, 0x3A	; 58
   23ee0:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
        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_set_cursor(unsigned char, unsigned char)>
        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 <eeprom_read_dword>
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 <lcd_printNumber(unsigned long, unsigned char)>
        _md->initialized = true;
   23efa:	81 e0       	ldi	r24, 0x01	; 1
   23efc:	80 93 a7 03 	sts	0x03A7, r24	; 0x8003a7 <menu_data>
    }
    menu_back_if_clicked();
   23f00:	0d 94 f4 d4 	jmp	0x3a9e8	; 0x3a9e8 <menu_back_if_clicked()>

00023f04 <lcd_return_to_status()>:
#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_refresh()>
    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_goto(void (*)(), int, bool, bool)>
	menu_depth = 0;
   23f1c:	10 92 f7 03 	sts	0x03F7, r1	; 0x8003f7 <menu_depth>
    eFilamentAction = FilamentAction::None; // i.e. non-autoLoad
   23f20:	10 92 a5 03 	sts	0x03A5, r1	; 0x8003a5 <eFilamentAction>
}
   23f24:	08 95       	ret

00023f26 <pid_extruder()>:
//! |                    |
//! ----------------------
//! @endcode
void pid_extruder()
{
	lcd_clear();
   23f26:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
	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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	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 <lcd_encoder>
   23f48:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <pid_extruder()+0x86>
   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 <lcd_encoder+0x1>
   23f68:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
	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_set_cursor(unsigned char, unsigned char)>
	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 <lcd_printf_P(char const*, ...)>
	if (lcd_clicked()) {
   23f8c:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   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 <pid_extruder()+0x92>
		lcd_commands_type = LcdCommands::PidExtruder;
   23f9c:	83 e0       	ldi	r24, 0x03	; 3
   23f9e:	80 93 b3 0d 	sts	0x0DB3, r24	; 0x800db3 <lcd_commands_type>
		lcd_return_to_status();
   23fa2:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
		lcd_update(2);
   23fa6:	82 e0       	ldi	r24, 0x02	; 2
   23fa8:	0c 94 3f 6e 	jmp	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
{
	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 <pid_extruder()+0x36>
   23fb2:	8a e0       	ldi	r24, 0x0A	; 10
   23fb4:	90 e0       	ldi	r25, 0x00	; 0
   23fb6:	d2 cf       	rjmp	.-92     	; 0x23f5c <pid_extruder()+0x36>
		lcd_commands_type = LcdCommands::PidExtruder;
		lcd_return_to_status();
		lcd_update(2);
	}

}
   23fb8:	08 95       	ret

00023fba <alert_automaton_mintemp::step(float, float)>:
	}
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 <alert_automaton_mintemp::step(float, float)+0x1e>
   23fce:	88 f0       	brcs	.+34     	; 0x23ff2 <alert_automaton_mintemp::step(float, float)+0x38>
   23fd0:	42 30       	cpi	r20, 0x02	; 2
   23fd2:	09 f1       	breq	.+66     	; 0x24016 <alert_automaton_mintemp::step(float, float)+0x5c>
   23fd4:	43 30       	cpi	r20, 0x03	; 3
   23fd6:	d1 f4       	brne	.+52     	; 0x2400c <alert_automaton_mintemp::step(float, float)+0x52>
	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 <alert_automaton_mintemp::step(float, float)+0x6e>
			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 <lcd_setalertstatuspgm(char const*, unsigned char)>
			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 <alert_automaton_mintemp::step(float, float)+0x52>
	//! @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 <alert_automaton_mintemp::step(float, float)+0x52>
				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 <lcd_setalertstatuspgm(char const*, unsigned char)>
				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 <alert_automaton_mintemp::step(float, float)+0x6e>
		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 <alert_automaton_mintemp::step(float, float)+0x2e>
			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 <alert_automaton_mintemp::step(float, float)+0x34>

0002402c <temp_runaway_stop(bool, bool)>:

	}
}

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 <Stopped>
   24032:	91 11       	cpse	r25, r1
   24034:	18 c0       	rjmp	.+48     	; 0x24066 <temp_runaway_stop(bool, bool)+0x3a>
   24036:	c6 2f       	mov	r28, r22
        if (isPreheat) {
   24038:	88 23       	and	r24, r24
   2403a:	c9 f0       	breq	.+50     	; 0x2406e <temp_runaway_stop(bool, bool)+0x42>
            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 <temp_runaway_stop(bool, bool)+0x1c>
   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 <lcd_setalertstatuspgm(char const*, unsigned char)>
            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 <serialprintPGM(char const*)>
            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 <temp_runaway_stop(bool, bool)+0x36>
                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 <serialprintlnPGM(char const*)>
            }
        }
        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 <ThermalStop(bool)>
                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 <temp_runaway_stop(bool, bool)+0x4e>
   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 <lcd_setalertstatuspgm(char const*, unsigned char)>
            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 <serialprintPGM(char const*)>
            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 <temp_runaway_stop(bool, bool)+0x36>
                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 <temp_runaway_stop(bool, bool)+0x36>

00024096 <Sound_DoSound_Prompt()>:

static void Sound_DoSound_Prompt(void)
{
    backlight_wake(2);
   24096:	82 e0       	ldi	r24, 0x02	; 2
   24098:	0e 94 0d 8a 	call	0x1141a	; 0x1141a <backlight_wake(unsigned char)>
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 <Sound_DoSound_Prompt()+0x1c>
   240ba:	00 c0       	rjmp	.+0      	; 0x240bc <Sound_DoSound_Prompt()+0x26>
   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 <lcd_print_state(unsigned char) [clone .lto_priv.440]>:
}
#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 <lcd_print_state(unsigned char) [clone .lto_priv.440]+0xc>
		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 <lcd_puts_P(char const*)>
   240d8:	89 e8       	ldi	r24, 0x89	; 137
   240da:	9f e6       	ldi	r25, 0x6F	; 111
   240dc:	fb cf       	rjmp	.-10     	; 0x240d4 <lcd_print_state(unsigned char) [clone .lto_priv.440]+0x8>

000240de <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>:
//! @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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x20>
   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_putc_at(unsigned char, unsigned char, char)>
    lcd_puts_P(first_choice);
   24106:	c6 01       	movw	r24, r12
   24108:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
    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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x36>
   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_putc_at(unsigned char, unsigned char, char)>
    lcd_puts_P(second_choice);
   2411c:	c7 01       	movw	r24, r14
   2411e:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
    if (third_choice) {
   24122:	01 15       	cp	r16, r1
   24124:	11 05       	cpc	r17, r1
   24126:	19 f1       	breq	.+70     	; 0x2416e <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x90>
   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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x66>
   24142:	89 2f       	mov	r24, r25
   24144:	83 31       	cpi	r24, 0x13	; 19
   24146:	08 f0       	brcs	.+2      	; 0x2414a <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x6c>
   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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x74>
   24150:	4e e3       	ldi	r20, 0x3E	; 62
   24152:	63 e0       	ldi	r22, 0x03	; 3
   24154:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
        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 <lcd_puts_P(char const*)>
    }
}
   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 <lcd_display_message_fullscreen_P(char const*)>:

    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_update_enable(unsigned char)>
    lcd_clear();
   2418c:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
    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 <lcd_display_message_fullscreen_nonBlocking_P(char const*)>

0002419a <lcd_show_fullscreen_message_and_wait_P(char const*)>:
 *
 * 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 <lcd_update_enabled>
   241b4:	81 11       	cpse	r24, r1
   241b6:	01 c0       	rjmp	.+2      	; 0x241ba <lcd_show_fullscreen_message_and_wait_P(char const*)+0x20>
   241b8:	00 e0       	ldi	r16, 0x00	; 0
    {
        lcd_update_enabled = false;
   241ba:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
    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 <lcd_display_message_fullscreen_P(char const*)>
   241c6:	7c 01       	movw	r14, r24
    bool multi_screen = msg_next != NULL;
	lcd_consume_click();
   241c8:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
	KEEPALIVE_STATE(PAUSED_FOR_USER);
   241cc:	84 e0       	ldi	r24, 0x04	; 4
   241ce:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
 * @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 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x48>
			// 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 <lcd_putc_at(unsigned char, unsigned char, char)>
 * @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 <delay_keep_alive(unsigned int)>
            if (lcd_clicked()) {
   241ec:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   241f0:	88 23       	and	r24, r24
   241f2:	81 f0       	breq	.+32     	; 0x24214 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x7a>
				if (msg_next == NULL) {
   241f4:	20 97       	sbiw	r28, 0x00	; 0
   241f6:	81 f4       	brne	.+32     	; 0x24218 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x7e>
					KEEPALIVE_STATE(IN_HANDLER);
   241f8:	82 e0       	ldi	r24, 0x02	; 2
   241fa:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
    }
    ~LcdUpdateDisabler()
    {
        lcd_update_enabled = m_updateEnabled;
   241fe:	00 93 6e 02 	sts	0x026E, r16	; 0x80026e <lcd_update_enabled>
            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 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x4a>
				else {
					break;
				}
            }
        }
        if (multi_screen) {
   24218:	e1 14       	cp	r14, r1
   2421a:	f1 04       	cpc	r15, r1
   2421c:	d9 f2       	breq	.-74     	; 0x241d4 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x3a>
            if (msg_next == NULL)
   2421e:	20 97       	sbiw	r28, 0x00	; 0
   24220:	11 f4       	brne	.+4      	; 0x24226 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x8c>
                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 <lcd_display_message_fullscreen_P(char const*)>
   2422c:	ec 01       	movw	r28, r24
   2422e:	d2 cf       	rjmp	.-92     	; 0x241d4 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x3a>

00024230 <lcd_temp_cal_show_result(bool)>:
            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 <custom_message_type>
	disable_x();
   24238:	17 9a       	sbi	0x02, 7	; 2
   2423a:	10 92 8e 06 	sts	0x068E, r1	; 0x80068e <axis_known_position>
	disable_y();
   2423e:	16 9a       	sbi	0x02, 6	; 2
   24240:	10 92 8f 06 	sts	0x068F, r1	; 0x80068f <axis_known_position+0x1>
	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 <target_temperature_bed+0x1>
   2424a:	10 92 71 06 	sts	0x0671, r1	; 0x800671 <target_temperature_bed>
   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 <eeprom_update_byte>
   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 <eeprom_update_byte>

	// 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 <lcd_temp_cal_show_result(bool)+0x58>
		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 <serialprintlnPGM(char const*)>
		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 <lang_get_translation>
   24276:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
	}
	lcd_update_enable(true);
   2427a:	81 e0       	ldi	r24, 0x01	; 1
   2427c:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
	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 <lcd_update(unsigned char)>

	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 <serialprintlnPGM(char const*)>
		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 <lcd_temp_cal_show_result(bool)+0x42>

00024296 <lcd_loading_progress_bar(unsigned int) [clone .lto_priv.560]>:
  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 <lcd_putc_at(unsigned char, unsigned char, char)>
		//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 <delay_keep_alive(unsigned int)>
   242b8:	ce 01       	movw	r24, r28
   242ba:	0e 94 84 8c 	call	0x11908	; 0x11908 <delay_keep_alive(unsigned int)>
   242be:	ce 01       	movw	r24, r28
   242c0:	0e 94 84 8c 	call	0x11908	; 0x11908 <delay_keep_alive(unsigned int)>
   242c4:	ce 01       	movw	r24, r28
   242c6:	0e 94 84 8c 	call	0x11908	; 0x11908 <delay_keep_alive(unsigned int)>
   242ca:	ce 01       	movw	r24, r28
   242cc:	0e 94 84 8c 	call	0x11908	; 0x11908 <delay_keep_alive(unsigned int)>

}

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 <lcd_loading_progress_bar(unsigned int) [clone .lto_priv.560]+0x12>
		//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 <clearFilamentAction() [clone .lto_priv.439]>:
        }
    }
}

static void setFilamentAction(FilamentAction action) {
    eFilamentAction = action;
   242de:	10 92 a5 03 	sts	0x03A5, r1	; 0x8003a5 <eFilamentAction>

static void __attribute__((noinline)) clearFilamentAction()
{
    // filament action has been cancelled or completed
    setFilamentAction(FilamentAction::None);
}
   242e2:	08 95       	ret

000242e4 <lcd_generic_preheat_menu()>:
    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 <menu_start()>
   242ea:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   242ee:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   242f2:	84 30       	cpi	r24, 0x04	; 4
   242f4:	08 f0       	brcs	.+2      	; 0x242f8 <lcd_generic_preheat_menu()+0x14>
   242f6:	a1 c0       	rjmp	.+322    	; 0x2443a <lcd_generic_preheat_menu()+0x156>
   242f8:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    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 <eeprom_read_byte>
   24304:	81 11       	cpse	r24, r1
   24306:	10 c0       	rjmp	.+32     	; 0x24328 <lcd_generic_preheat_menu()+0x44>
    {
        ON_MENU_LEAVE(
   24308:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   2430c:	81 11       	cpse	r24, r1
   2430e:	0f 94 6f 21 	call	0x242de	; 0x242de <clearFilamentAction() [clone .lto_priv.439]>
            clearFilamentAction();
        );
        MENU_ITEM_BACK_P(_T(eFilamentAction == FilamentAction::Lay1Cal ? MSG_BACK : MSG_MAIN));
   24312:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   24316:	8a 30       	cpi	r24, 0x0A	; 10
   24318:	09 f4       	brne	.+2      	; 0x2431c <lcd_generic_preheat_menu()+0x38>
   2431a:	8c c0       	rjmp	.+280    	; 0x24434 <lcd_generic_preheat_menu()+0x150>
   2431c:	8b e3       	ldi	r24, 0x3B	; 59
   2431e:	98 e4       	ldi	r25, 0x48	; 72
   24320:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   24324:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
        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 <shouldPreheatOnlyNozzle()>
   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 <lcd_generic_preheat_menu()+0x56>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0x6a>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0x7e>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0x92>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0xa6>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0xba>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0xce>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0xe2>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0xf6>
   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(char const*, void (*)())>
        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 <lcd_generic_preheat_menu()+0x10a>
   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 <menu_item_submenu_P(char const*, void (*)())>
    }
    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 <eeprom_read_byte>
   243fe:	81 11       	cpse	r24, r1
   24400:	0c c0       	rjmp	.+24     	; 0x2441a <lcd_generic_preheat_menu()+0x136>
   24402:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   24406:	89 30       	cpi	r24, 0x09	; 9
   24408:	41 f4       	brne	.+16     	; 0x2441a <lcd_generic_preheat_menu()+0x136>
   2440a:	8c e7       	ldi	r24, 0x7C	; 124
   2440c:	9f e4       	ldi	r25, 0x4F	; 79
   2440e:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   24412:	6a e4       	ldi	r22, 0x4A	; 74
   24414:	7a e3       	ldi	r23, 0x3A	; 58
   24416:	0f 94 07 d1 	call	0x3a20e	; 0x3a20e <menu_item_function_P(char const*, void (*)())>
    MENU_END();
   2441a:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
    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 <menu_row>
   24422:	8f 5f       	subi	r24, 0xFF	; 255
   24424:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   24428:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   2442c:	8f 5f       	subi	r24, 0xFF	; 255
   2442e:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   24432:	5d cf       	rjmp	.-326    	; 0x242ee <lcd_generic_preheat_menu()+0xa>
    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 <lcd_generic_preheat_menu()+0x3c>
        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 <lcd_preheat_menu() [clone .lto_priv.409]>:
#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 <eFilamentAction>
    lcd_generic_preheat_menu();
   24444:	0d 94 72 21 	jmp	0x242e4	; 0x242e4 <lcd_generic_preheat_menu()>

00024448 <lcdui_print_extruder()>:
//              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 <lcd_space(unsigned char)>
    if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) {
   2444e:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
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 <MMU2::mmu2+0x57>
   24456:	93 36       	cpi	r25, 0x63	; 99
   24458:	09 f4       	brne	.+2      	; 0x2445c <lcdui_print_extruder()+0x14>
   2445a:	9f ef       	ldi	r25, 0xFF	; 255
   2445c:	89 13       	cpse	r24, r25
   2445e:	0e c0       	rjmp	.+28     	; 0x2447c <lcdui_print_extruder()+0x34>
        lcd_putc('F');
   24460:	86 e4       	ldi	r24, 0x46	; 70
   24462:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
        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 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
   2446a:	8f 3f       	cpi	r24, 0xFF	; 255
   2446c:	29 f0       	breq	.+10     	; 0x24478 <lcdui_print_extruder()+0x30>
   2446e:	8f 5c       	subi	r24, 0xCF	; 207
   24470:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
   24474:	83 e0       	ldi	r24, 0x03	; 3
   24476:	08 95       	ret
   24478:	8f e3       	ldi	r24, 0x3F	; 63
   2447a:	fa cf       	rjmp	.-12     	; 0x24470 <lcdui_print_extruder()+0x28>
        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 <lcdui_print_extruder()+0x5a>
   24480:	8f 5c       	subi	r24, 0xCF	; 207
   24482:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
        lcd_putc('>');
   24486:	8e e3       	ldi	r24, 0x3E	; 62
   24488:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
   2448c:	80 91 a1 13 	lds	r24, 0x13A1	; 0x8013a1 <MMU2::mmu2+0x57>
   24490:	83 36       	cpi	r24, 0x63	; 99
   24492:	49 f0       	breq	.+18     	; 0x244a6 <lcdui_print_extruder()+0x5e>
        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 <lcdui_print_extruder()+0x5e>
   24498:	8f 5c       	subi	r24, 0xCF	; 207
   2449a:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
        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 <lcdui_print_extruder()+0x3a>
        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 <lcdui_print_extruder()+0x52>

000244aa <lcdui_print_temp(char, int, int)>:
}

// 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_printf_P(char const*, ...)>
	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 <lcd_space(unsigned char)>

000244e6 <lcd_print_target_temps_first_line()>:
        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 <lcd_home()>
    lcdui_print_temp(LCD_STR_THERMOMETER[0], (int) degHotend(0), (int) degTargetHotend(0));
   244ee:	c0 91 b5 0d 	lds	r28, 0x0DB5	; 0x800db5 <target_temperature>
   244f2:	d0 91 b6 0d 	lds	r29, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   244f6:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   244fa:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   244fe:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   24502:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <lcdui_print_temp(char, int, int)>
    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 <lcd_set_cursor(unsigned char, unsigned char)>
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 <target_temperature_bed>
   2451e:	d0 91 72 06 	lds	r29, 0x0672	; 0x800672 <target_temperature_bed+0x1>
    int targetBedTemp = (int) degTargetBed();
    if (targetBedTemp) {
   24522:	20 97       	sbiw	r28, 0x00	; 0
   24524:	81 f0       	breq	.+32     	; 0x24546 <lcd_print_target_temps_first_line()+0x60>
        lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp);
   24526:	60 91 ed 04 	lds	r22, 0x04ED	; 0x8004ed <current_temperature_bed>
   2452a:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   2452e:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   24532:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <lcdui_print_temp(char, int, int)>
    } 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 <lcd_space(unsigned char)>

00024550 <mFilamentPrompt()>:
   24550:	10 92 da 03 	sts	0x03DA, r1	; 0x8003da <lcd_timeoutToStatus>
    }
}

static void mFilamentPrompt() {
    lcd_timeoutToStatus.stop();
    lcd_print_target_temps_first_line();
   24554:	0f 94 73 22 	call	0x244e6	; 0x244e6 <lcd_print_target_temps_first_line()>
    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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
    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 <lcd_set_cursor(unsigned char, unsigned char)>
    switch(eFilamentAction) {
   24572:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   24576:	83 30       	cpi	r24, 0x03	; 3
   24578:	81 f1       	breq	.+96     	; 0x245da <mFilamentPrompt()+0x8a>
   2457a:	48 f4       	brcc	.+18     	; 0x2458e <mFilamentPrompt()+0x3e>
   2457c:	81 30       	cpi	r24, 0x01	; 1
   2457e:	60 f0       	brcs	.+24     	; 0x24598 <mFilamentPrompt()+0x48>
        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 <lang_get_translation>
   24588:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
   2458c:	05 c0       	rjmp	.+10     	; 0x24598 <mFilamentPrompt()+0x48>
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 <mFilamentPrompt()+0x8a>
   24592:	b0 f3       	brcs	.-20     	; 0x24580 <mFilamentPrompt()+0x30>
   24594:	88 30       	cpi	r24, 0x08	; 8
   24596:	a1 f3       	breq	.-24     	; 0x24580 <mFilamentPrompt()+0x30>
        case FilamentAction::Preheat:
        case FilamentAction::Lay1Cal:
            break;
    }

    if(lcd_clicked()
   24598:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
#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 <mFilamentPrompt()+0x62>
   245a0:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   245a4:	81 50       	subi	r24, 0x01	; 1
   245a6:	82 30       	cpi	r24, 0x02	; 2
   245a8:	28 f5       	brcc	.+74     	; 0x245f4 <mFilamentPrompt()+0xa4>
   245aa:	80 91 ad 17 	lds	r24, 0x17AD	; 0x8017ad <fsensor+0x4>
   245ae:	88 23       	and	r24, r24
   245b0:	09 f1       	breq	.+66     	; 0x245f4 <mFilamentPrompt()+0xa4>
#endif //FILAMENT_SENSOR
    ) {
        menu_back(bFilamentPreheatState ? 2 : 3);
   245b2:	80 91 62 06 	lds	r24, 0x0662	; 0x800662 <bFilamentPreheatState>
   245b6:	81 11       	cpse	r24, r1
   245b8:	13 c0       	rjmp	.+38     	; 0x245e0 <mFilamentPrompt()+0x90>
   245ba:	83 e0       	ldi	r24, 0x03	; 3
   245bc:	0f 94 36 d4 	call	0x3a86c	; 0x3a86c <menu_back(unsigned char)>
        switch(eFilamentAction) {
   245c0:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   245c4:	82 30       	cpi	r24, 0x02	; 2
   245c6:	71 f0       	breq	.+28     	; 0x245e4 <mFilamentPrompt()+0x94>
   245c8:	83 30       	cpi	r24, 0x03	; 3
   245ca:	81 f0       	breq	.+32     	; 0x245ec <mFilamentPrompt()+0x9c>
   245cc:	81 30       	cpi	r24, 0x01	; 1
   245ce:	91 f4       	brne	.+36     	; 0x245f4 <mFilamentPrompt()+0xa4>
            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 <enquecommand(char const*, bool)>
        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 <mFilamentPrompt()+0x34>
#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 <mFilamentPrompt()+0x6c>
        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 <eFilamentAction>
   245ea:	f2 cf       	rjmp	.-28     	; 0x245d0 <mFilamentPrompt()+0x80>
                [[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 <mFilamentPrompt()+0x86>
            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 <uart2_ibuf+0x1>
	uint8_t buf_r = ptr[2];          //get read index
   24624:	90 91 3b 05 	lds	r25, 0x053B	; 0x80053b <uart2_ibuf+0x2>
	_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 <uart2_ibuf>
   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 <puts_P>
	}
}
   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 <uart2_ibuf+0x1>
   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 <tmc2130_home_calibrate(unsigned char)>:
	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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
	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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)>
	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 <puts_P>
   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 <printf_P>
   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 <tmc2130_home_calibrate(unsigned char)+0x62>
}

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 <tmc2130_home_calibrate(unsigned char)+0xca>
		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 <tmc2130_home_calibrate(unsigned char)+0xd4>
   247c0:	47 c0       	rjmp	.+142    	; 0x24850 <tmc2130_home_calibrate(unsigned char)+0x162>
		{
			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 <tmc2130_home_calibrate(unsigned char)+0xae>
			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 <puts_P>
   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 <tmc2130_home_calibrate(unsigned char)+0x18c>
   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 <printf_P>
   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 <tmc2130_home_calibrate(unsigned char)+0x128>
   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 <tmc2130_home_calibrate(unsigned char)+0xda>
		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 <bubblesort_uint8(unsigned char*, unsigned char, unsigned char*)>
	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 <printf_P>
	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 <tmc2130_home_origin>
   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 <tmc2130_home_calibrate(unsigned char)+0x1d6>
   248bc:	60 91 f3 04 	lds	r22, 0x04F3	; 0x8004f3 <tmc2130_home_origin+0x1>
   248c0:	8b ef       	ldi	r24, 0xFB	; 251
   248c2:	9e e0       	ldi	r25, 0x0E	; 14
   248c4:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
	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 <tmc2130_do_step(unsigned char)>:
    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 <tmc2130_do_step(unsigned char)+0x16>
   248f6:	28 f0       	brcs	.+10     	; 0x24902 <tmc2130_do_step(unsigned char)+0x10>
   248f8:	82 30       	cpi	r24, 0x02	; 2
   248fa:	41 f0       	breq	.+16     	; 0x2490c <tmc2130_do_step(unsigned char)+0x1a>
   248fc:	83 30       	cpi	r24, 0x03	; 3
   248fe:	41 f0       	breq	.+16     	; 0x24910 <tmc2130_do_step(unsigned char)+0x1e>
   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 <tmc2130_do_step(unsigned char)+0x12>
	case Z_AXIS: _DO_STEP_Z; break;
   2490c:	84 e0       	ldi	r24, 0x04	; 4
   2490e:	fa cf       	rjmp	.-12     	; 0x24904 <tmc2130_do_step(unsigned char)+0x12>
	case E_AXIS: _DO_STEP_E; break;
   24910:	88 e0       	ldi	r24, 0x08	; 8
   24912:	f8 cf       	rjmp	.-16     	; 0x24904 <tmc2130_do_step(unsigned char)+0x12>

00024914 <tmc2130_set_dir(unsigned char, unsigned char)>:
}


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 <tmc2130_set_dir(unsigned char, unsigned char)+0x38>
   24918:	48 f0       	brcs	.+18     	; 0x2492c <tmc2130_set_dir(unsigned char, unsigned char)+0x18>
   2491a:	82 30       	cpi	r24, 0x02	; 2
   2491c:	21 f1       	breq	.+72     	; 0x24966 <tmc2130_set_dir(unsigned char, unsigned char)+0x52>
   2491e:	83 30       	cpi	r24, 0x03	; 3
   24920:	79 f1       	breq	.+94     	; 0x24980 <tmc2130_set_dir(unsigned char, unsigned char)+0x6c>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x12>
	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 <tmc2130_set_dir(unsigned char, unsigned char)+0x2e>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0xe>

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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>
	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 <tmc2130_set_dir(unsigned char, unsigned char)+0x48>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>
	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 <tmc2130_set_dir(unsigned char, unsigned char)+0x62>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>
	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 <tmc2130_set_dir(unsigned char, unsigned char)+0x7c>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>
   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 <tmc2130_set_dir(unsigned char, unsigned char)+0x26>

0002499a <tmc2130_rx(unsigned char, unsigned char, unsigned long*) [clone .lto_priv.384]>:
	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_cs_low(unsigned char)>
	TMC2130_SPI_TXRX(addr); // address
   249ba:	8f 2d       	mov	r24, r15
   249bc:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX(0); // MSB
   249c0:	80 e0       	ldi	r24, 0x00	; 0
   249c2:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX(0);
   249c6:	80 e0       	ldi	r24, 0x00	; 0
   249c8:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX(0);
   249cc:	80 e0       	ldi	r24, 0x00	; 0
   249ce:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX(0); // LSB
   249d2:	80 e0       	ldi	r24, 0x00	; 0
   249d4:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	tmc2130_cs_high(axis);
   249d8:	81 2f       	mov	r24, r17
   249da:	0f 94 70 11 	call	0x222e0	; 0x222e0 <tmc2130_cs_high(unsigned char)>
	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 <tmc2130_cs_low(unsigned char)>
	uint8_t stat = TMC2130_SPI_TXRX(0); // status
   249e8:	80 e0       	ldi	r24, 0x00	; 0
   249ea:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
   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 <spi_txrx>
   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 <spi_txrx>
   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 <spi_txrx>
   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 <spi_txrx>
   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_cs_high(unsigned char)>
	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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>:
#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_cs_low(unsigned char)>
	TMC2130_SPI_TXRX(addr); // address
   24a72:	8e 2d       	mov	r24, r14
   24a74:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX((wval >> 24) & 0xff); // MSB
   24a78:	8f 2d       	mov	r24, r15
   24a7a:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX((wval >> 16) & 0xff);
   24a7e:	80 2f       	mov	r24, r16
   24a80:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX((wval >> 8) & 0xff);
   24a84:	81 2f       	mov	r24, r17
   24a86:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	TMC2130_SPI_TXRX(wval & 0xff); // LSB
   24a8a:	8d 2f       	mov	r24, r29
   24a8c:	0f 94 a6 11 	call	0x2234c	; 0x2234c <spi_txrx>
	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 <tmc2130_cs_high(unsigned char)>

00024aa2 <tmc2130_rd_MSCNT(unsigned char)>:
	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 <tmc2130_rd_MSCNT(unsigned char)+0x6>
   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 <tmc2130_rx(unsigned char, unsigned char, unsigned long*) [clone .lto_priv.384]>
	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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>:
#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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)+0x46>
   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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
	if (curr == nullptr) {
   24b68:	20 97       	sbiw	r28, 0x00	; 0
   24b6a:	09 f4       	brne	.+2      	; 0x24b6e <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)+0x98>
		curr = &currents[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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)+0xa4>
   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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)+0xb8>
        // 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 <serialprintPGM(char const*)>
        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 <serialprintlnPGM(char const*)>
        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 = &currents[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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>

00024bac <tmc2130_set_res(unsigned char, unsigned int)>:
	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 <tmc2130_set_res(unsigned char, unsigned int)+0x14>
   24bbc:	91 50       	subi	r25, 0x01	; 1
   24bbe:	f9 cf       	rjmp	.-14     	; 0x24bb2 <tmc2130_set_res(unsigned char, unsigned int)+0x6>
	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 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>

00024bd0 <tmc2130_XYZ_reg_init(unsigned char)>:
	}
	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_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
	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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
	const bool isStealth = (tmc2130_mode == TMC2130_MODE_SILENT);
   24bfc:	d0 91 8b 06 	lds	r29, 0x068B	; 0x80068b <tmc2130_mode>
	if (axis == Z_AXIS) {
   24c00:	c2 30       	cpi	r28, 0x02	; 2
   24c02:	e1 f5       	brne	.+120    	; 0x24c7c <tmc2130_XYZ_reg_init(unsigned char)+0xac>
#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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_XYZ_reg_init(unsigned char)+0x56>
   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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_XYZ_reg_init(unsigned char)+0x72>
   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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_XYZ_reg_init(unsigned char)+0x9c>
   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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_XYZ_reg_init(unsigned char)+0xec>

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 <tmc2130_XYZ_reg_init(unsigned char)+0xe8>
	{
	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 <tmc2130_XYZ_reg_init(unsigned char)+0xe8>
	{
	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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_XYZ_reg_init(unsigned char)+0x108>
   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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_XYZ_reg_init(unsigned char)+0xa0>

00024d0a <tmc2130_home_exit()>:
	}
#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 <tmc2130_sg_homing_axes_mask>
   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 <printf_P>
#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 <tmc2130_sg_homing_axes_mask>
   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_home_exit()+0x2e>
		tmc2130_wait_standstill_xy(1000);
   24d34:	0f 94 0c 88 	call	0x31018	; 0x31018 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]>
	if (tmc2130_sg_homing_axes_mask)
   24d38:	10 91 42 06 	lds	r17, 0x0642	; 0x800642 <tmc2130_sg_homing_axes_mask>
   24d3c:	11 23       	and	r17, r17
   24d3e:	71 f0       	breq	.+28     	; 0x24d5c <tmc2130_home_exit()+0x52>
	{
		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_home_exit()+0x46>
				tmc2130_XYZ_reg_init(axis);
   24d4a:	8c 2f       	mov	r24, r28
   24d4c:	0f 94 e8 25 	call	0x24bd0	; 0x24bd0 <tmc2130_XYZ_reg_init(unsigned char)>
#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 <tmc2130_home_exit()+0x3a>
		{
			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_homing_axes_mask>
	}
	tmc2130_sg_crash = false;
   24d5c:	10 92 0c 05 	sts	0x050C, r1	; 0x80050c <tmc2130_sg_crash>
#endif
}
   24d60:	df 91       	pop	r29
   24d62:	cf 91       	pop	r28
   24d64:	1f 91       	pop	r17
   24d66:	08 95       	ret

00024d68 <tmc2130_home_enter(unsigned char)>:
	}
	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 <tmc2130_home_enter(unsigned char)+0x10>
   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 <printf_P>
#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_home_enter(unsigned char)+0x38>
		tmc2130_wait_standstill_xy(1000);
   24d9c:	0f 94 0c 88 	call	0x31018	; 0x31018 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]>
	}
	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 <tmc2130_home_enter(unsigned char)+0x4a>
   24db0:	46 c0       	rjmp	.+140    	; 0x24e3e <tmc2130_home_enter(unsigned char)+0xd6>
		{
			tmc2130_sg_homing_axes_mask |= mask;
   24db2:	80 91 42 06 	lds	r24, 0x0642	; 0x800642 <tmc2130_sg_homing_axes_mask>
   24db6:	8f 29       	or	r24, r15
   24db8:	80 93 42 06 	sts	0x0642, r24	; 0x800642 <tmc2130_sg_homing_axes_mask>
			//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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
			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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
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 <tmc2130_home_enter(unsigned char)+0x8c>
	{
	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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
            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 <memcpy_P>
			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_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
			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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
{
	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 <tmc2130_home_enter(unsigned char)+0xe4>
   24e4a:	ae cf       	rjmp	.-164    	; 0x24da8 <tmc2130_home_enter(unsigned char)+0x40>
			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_use_eeprom_setting()>:
		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 <eeprom_read_byte>
   24e6a:	91 e0       	ldi	r25, 0x01	; 1
   24e6c:	81 11       	cpse	r24, r1
   24e6e:	01 c0       	rjmp	.+2      	; 0x24e72 <crashdet_use_eeprom_setting()+0x10>
   24e70:	90 e0       	ldi	r25, 0x00	; 0
   24e72:	90 93 5c 02 	sts	0x025C, r25	; 0x80025c <tmc2130_sg_stop_on_crash>
}
   24e76:	08 95       	ret

00024e78 <tmc2130_init(TMCInitParams)>:
		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 <tmc2130_XYZ_reg_init(unsigned char)>
   24f26:	81 e0       	ldi	r24, 0x01	; 1
   24f28:	0f 94 e8 25 	call	0x24bd0	; 0x24bd0 <tmc2130_XYZ_reg_init(unsigned char)>
   24f2c:	82 e0       	ldi	r24, 0x02	; 2
   24f2e:	0f 94 e8 25 	call	0x24bd0	; 0x24bd0 <tmc2130_XYZ_reg_init(unsigned char)>
	}

    // 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 <tmc2130_mres+0x3>
   24f3a:	83 e0       	ldi	r24, 0x03	; 3
   24f3c:	0f 94 6b 25 	call	0x24ad6	; 0x24ad6 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
    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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
#ifndef TMC2130_STEALTH_E
    if( ! params.enableECool ){
   24f4e:	c1 fd       	sbrc	r28, 1
   24f50:	1d c0       	rjmp	.+58     	; 0x24f8c <tmc2130_init(TMCInitParams)+0x114>
        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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
    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 <tmc2130_wave_fac>
   24f66:	80 e0       	ldi	r24, 0x00	; 0
   24f68:	0f 94 80 88 	call	0x31100	; 0x31100 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]>
	tmc2130_set_wave(Y_AXIS, 247, tmc2130_wave_fac[Y_AXIS]);
   24f6c:	60 91 f9 04 	lds	r22, 0x04F9	; 0x8004f9 <tmc2130_wave_fac+0x1>
   24f70:	81 e0       	ldi	r24, 0x01	; 1
   24f72:	0f 94 80 88 	call	0x31100	; 0x31100 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]>
	tmc2130_set_wave(Z_AXIS, 247, tmc2130_wave_fac[Z_AXIS]);
   24f76:	60 91 fa 04 	lds	r22, 0x04FA	; 0x8004fa <tmc2130_wave_fac+0x2>
   24f7a:	82 e0       	ldi	r24, 0x02	; 2
   24f7c:	0f 94 80 88 	call	0x31100	; 0x31100 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]>
#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 <tmc2130_wave_fac+0x3>
   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_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]>
    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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
        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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
        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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
        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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
        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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
        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 <serialprintlnPGM(char const*)>
   24fe2:	bf cf       	rjmp	.-130    	; 0x24f62 <tmc2130_init(TMCInitParams)+0xea>

00024fe4 <MotorCurrents::getOriginaliHold() const>:
        , 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 <MotorCurrents::getOriginaliHold() const+0x12>
   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 <MotorCurrents::getOriginaliHold() const+0x1a>
   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 <MotorCurrents::getOriginaliHold() const+0x2c>
   25004:	2c f0       	brlt	.+10     	; 0x25010 <MotorCurrents::getOriginaliHold() const+0x2c>
   25006:	89 2f       	mov	r24, r25
   25008:	21 11       	cpse	r18, r1
   2500a:	02 c0       	rjmp	.+4      	; 0x25010 <MotorCurrents::getOriginaliHold() const+0x2c>
   2500c:	88 0f       	add	r24, r24
   2500e:	08 95       	ret
   25010:	08 95       	ret

00025012 <micros2>:
}

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 <timer2_overflow_count>
   2501a:	90 91 3f 06 	lds	r25, 0x063F	; 0x80063f <timer2_overflow_count+0x1>
   2501e:	a0 91 40 06 	lds	r26, 0x0640	; 0x800640 <timer2_overflow_count+0x2>
   25022:	b0 91 41 06 	lds	r27, 0x0641	; 0x800641 <timer2_overflow_count+0x3>
#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 <micros2+0x26>
   2502e:	2f 3f       	cpi	r18, 0xFF	; 255
   25030:	19 f0       	breq	.+6      	; 0x25038 <micros2+0x26>
		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 <micros2+0x3e>
}
   2505c:	08 95       	ret

0002505e <delay2>:

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 <micros2>
   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 <delay2+0x54>
   25084:	0f 94 09 28 	call	0x25012	; 0x25012 <micros2>
   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 <delay2+0x1c>
		{
			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 <delay2+0x1c>
		}
	}
}
   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 <lcd_babystep_z() [clone .lto_priv.406]>:
 * @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 <menu_data>
   250e4:	81 11       	cpse	r24, r1
   250e6:	3a c0       	rjmp	.+116    	; 0x2515c <lcd_babystep_z() [clone .lto_priv.406]+0x98>
	{
		// 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 <menu_data>
		check_babystep();
   250ee:	0e 94 17 79 	call	0xf22e	; 0xf22e <check_babystep()>

		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 <eeprom_read_byte>
   250fa:	18 2f       	mov	r17, r24
   250fc:	0e 94 d9 75 	call	0xebb2	; 0xebb2 <eeprom_is_sheet_initialized(unsigned char)>
   25100:	81 11       	cpse	r24, r1
   25102:	ee c0       	rjmp	.+476    	; 0x252e0 <lcd_babystep_z() [clone .lto_priv.406]+0x21c>
			_md->babystepMemZ = 0;
   25104:	10 92 a9 03 	sts	0x03A9, r1	; 0x8003a9 <menu_data+0x2>
   25108:	10 92 a8 03 	sts	0x03A8, r1	; 0x8003a8 <menu_data+0x1>
			_md->babystepMemZ = eeprom_read_word(reinterpret_cast<uint16_t *>(&(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 <calibration_status_get(unsigned char)>
   25112:	81 11       	cpse	r24, r1
   25114:	04 c0       	rjmp	.+8      	; 0x2511e <lcd_babystep_z() [clone .lto_priv.406]+0x5a>
			_md->babystepMemZ = 0;
   25116:	10 92 a9 03 	sts	0x03A9, r1	; 0x8003a9 <menu_data+0x2>
   2511a:	10 92 a8 03 	sts	0x03A8, r1	; 0x8003a8 <menu_data+0x1>

		_md->babystepMemMMZ = _md->babystepMemZ/cs.axis_steps_per_mm[Z_AXIS];
   2511e:	60 91 a8 03 	lds	r22, 0x03A8	; 0x8003a8 <menu_data+0x1>
   25122:	70 91 a9 03 	lds	r23, 0x03A9	; 0x8003a9 <menu_data+0x2>
   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 <cs+0xc>
   25136:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   2513a:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   2513e:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   25142:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
   25146:	60 93 aa 03 	sts	0x03AA, r22	; 0x8003aa <menu_data+0x3>
   2514a:	70 93 ab 03 	sts	0x03AB, r23	; 0x8003ab <menu_data+0x4>
   2514e:	80 93 ac 03 	sts	0x03AC, r24	; 0x8003ac <menu_data+0x5>
   25152:	90 93 ad 03 	sts	0x03AD, r25	; 0x8003ad <menu_data+0x6>
		lcd_draw_update = 1;
   25156:	81 e0       	ldi	r24, 0x01	; 1
   25158:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
		//SERIAL_ECHO("Z baby step: ");
		//SERIAL_ECHO(_md->babystepMem[2]);
	}

	if (lcd_encoder != 0)
   2515c:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   25160:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   25164:	00 97       	sbiw	r24, 0x00	; 0
   25166:	f1 f1       	breq	.+124    	; 0x251e4 <lcd_babystep_z() [clone .lto_priv.406]+0x120>
	{
		_md->babystepMemZ += lcd_encoder;
   25168:	20 91 a8 03 	lds	r18, 0x03A8	; 0x8003a8 <menu_data+0x1>
   2516c:	30 91 a9 03 	lds	r19, 0x03A9	; 0x8003a9 <menu_data+0x2>
   25170:	28 0f       	add	r18, r24
   25172:	39 1f       	adc	r19, r25
   25174:	30 93 a9 03 	sts	0x03A9, r19	; 0x8003a9 <menu_data+0x2>
   25178:	20 93 a8 03 	sts	0x03A8, r18	; 0x8003a8 <menu_data+0x1>

        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 <lcd_babystep_z() [clone .lto_priv.406]+0xc2>
   25184:	ba c0       	rjmp	.+372    	; 0x252fa <lcd_babystep_z() [clone .lto_priv.406]+0x236>
   25186:	81 e6       	ldi	r24, 0x61	; 97
   25188:	90 ef       	ldi	r25, 0xF0	; 240
   2518a:	90 93 a9 03 	sts	0x03A9, r25	; 0x8003a9 <menu_data+0x2>
   2518e:	80 93 a8 03 	sts	0x03A8, r24	; 0x8003a8 <menu_data+0x1>
        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 <menu_data+0x1>
   25196:	70 91 a9 03 	lds	r23, 0x03A9	; 0x8003a9 <menu_data+0x2>
   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 <cs+0xc>
   251aa:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   251ae:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   251b2:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   251b6:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
   251ba:	60 93 aa 03 	sts	0x03AA, r22	; 0x8003aa <menu_data+0x3>
   251be:	70 93 ab 03 	sts	0x03AB, r23	; 0x8003ab <menu_data+0x4>
   251c2:	80 93 ac 03 	sts	0x03AC, r24	; 0x8003ac <menu_data+0x5>
   251c6:	90 93 ad 03 	sts	0x03AD, r25	; 0x8003ad <menu_data+0x6>
		_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 <delay2>
		lcd_encoder = 0;
   251d6:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   251da:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
		lcd_draw_update = 1;
   251de:	81 e0       	ldi	r24, 0x01	; 1
   251e0:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
	}
	if (lcd_draw_update)
   251e4:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   251e8:	88 23       	and	r24, r24
   251ea:	c9 f1       	breq	.+114    	; 0x2525e <lcd_babystep_z() [clone .lto_priv.406]+0x19a>
	{
	    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 <eeprom_read_byte>
   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 <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)>
	    lcd_home();
   2520a:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
	    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_print(char const*)>
	    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 <lcd_set_cursor(unsigned char, unsigned char)>
		menu_draw_float13(_T(MSG_BABYSTEPPING_Z), _md->babystepMemMMZ);
   2521e:	10 91 aa 03 	lds	r17, 0x03AA	; 0x8003aa <menu_data+0x3>
   25222:	00 91 ab 03 	lds	r16, 0x03AB	; 0x8003ab <menu_data+0x4>
   25226:	f0 90 ac 03 	lds	r15, 0x03AC	; 0x8003ac <menu_data+0x5>
   2522a:	e0 90 ad 03 	lds	r14, 0x03AD	; 0x8003ad <menu_data+0x6>
   2522e:	8d ec       	ldi	r24, 0xCD	; 205
   25230:	90 e5       	ldi	r25, 0x50	; 80
   25232:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
//! (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 <lcd_printf_P(char const*, ...)>
   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 <lcd_click_trigger>
   25262:	81 11       	cpse	r24, r1
   25264:	04 c0       	rjmp	.+8      	; 0x2526e <lcd_babystep_z() [clone .lto_priv.406]+0x1aa>
   25266:	80 91 d5 03 	lds	r24, 0x03D5	; 0x8003d5 <menu_leaving>
   2526a:	88 23       	and	r24, r24
   2526c:	51 f1       	breq	.+84     	; 0x252c2 <lcd_babystep_z() [clone .lto_priv.406]+0x1fe>
	{
		// 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 <eeprom_read_byte>
   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 <menu_data+0x1>
   25282:	70 91 a9 03 	lds	r23, 0x03A9	; 0x8003a9 <menu_data+0x2>
   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 <eeprom_update_word>
        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 <target_temperature_bed>
   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_byte>
		eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <current_temperature_pinda>
   252a2:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <current_temperature_pinda+0x1>
   252a6:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <current_temperature_pinda+0x2>
   252aa:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <current_temperature_pinda+0x3>
   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 <eeprom_update_byte>
#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 <calibration_status_set(unsigned char)>
	}
	menu_back_if_clicked();
   252c2:	0f 94 f4 d4 	call	0x3a9e8	; 0x3a9e8 <menu_back_if_clicked()>
}
   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<uint16_t *>(&(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 <eeprom_read_word>
   252f0:	90 93 a9 03 	sts	0x03A9, r25	; 0x8003a9 <menu_data+0x2>
   252f4:	80 93 a8 03 	sts	0x03A8, r24	; 0x8003a8 <menu_data+0x1>
   252f8:	09 cf       	rjmp	.-494    	; 0x2510c <lcd_babystep_z() [clone .lto_priv.406]+0x48>
	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 <lcd_babystep_z() [clone .lto_priv.406]+0x246>
   25300:	10 92 a9 03 	sts	0x03A9, r1	; 0x8003a9 <menu_data+0x2>
   25304:	10 92 a8 03 	sts	0x03A8, r1	; 0x8003a8 <menu_data+0x1>
   25308:	44 cf       	rjmp	.-376    	; 0x25192 <lcd_babystep_z() [clone .lto_priv.406]+0xce>
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 <babystepsTodo+0x4>
   25312:	50 91 6d 06 	lds	r21, 0x066D	; 0x80066d <babystepsTodo+0x5>
   25316:	84 0f       	add	r24, r20
   25318:	95 1f       	adc	r25, r21
   2531a:	90 93 6d 06 	sts	0x066D, r25	; 0x80066d <babystepsTodo+0x5>
   2531e:	80 93 6c 06 	sts	0x066C, r24	; 0x80066c <babystepsTodo+0x4>
        CRITICAL_SECTION_END
   25322:	2f bf       	out	0x3f, r18	; 63
   25324:	36 cf       	rjmp	.-404    	; 0x25192 <lcd_babystep_z() [clone .lto_priv.406]+0xce>

00025326 <lcd_move_e()>:
}


void lcd_move_e()
{
	if ((int)degHotend0() > extrude_min_temp)
   25326:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   2532a:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   2532e:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   25332:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   25336:	0f 94 a9 de 	call	0x3bd52	; 0x3bd52 <__fixsfsi>
   2533a:	20 91 6b 02 	lds	r18, 0x026B	; 0x80026b <extrude_min_temp>
   2533e:	30 91 6c 02 	lds	r19, 0x026C	; 0x80026c <extrude_min_temp+0x1>
   25342:	26 17       	cp	r18, r22
   25344:	37 07       	cpc	r19, r23
   25346:	0c f0       	brlt	.+2      	; 0x2534a <lcd_move_e()+0x24>
   25348:	65 c0       	rjmp	.+202    	; 0x25414 <lcd_move_e()+0xee>
	{
		if (lcd_encoder != 0)
   2534a:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   2534e:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   25352:	89 2b       	or	r24, r25
   25354:	b9 f1       	breq	.+110    	; 0x253c4 <lcd_move_e()+0x9e>
		{
			refresh_cmd_timeout();
   25356:	0e 94 5b 66 	call	0xccb6	; 0xccb6 <refresh_cmd_timeout()>
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 <block_buffer_head>
    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 <lcd_move_e()+0x40>
        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 <block_buffer_tail>
			if (! planner_queue_full())
   2536a:	98 17       	cp	r25, r24
   2536c:	59 f1       	breq	.+86     	; 0x253c4 <lcd_move_e()+0x9e>
			{
				current_position[E_AXIS] += lcd_encoder;
   2536e:	60 91 6f 06 	lds	r22, 0x066F	; 0x80066f <lcd_encoder>
   25372:	70 91 70 06 	lds	r23, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <current_position+0xc>
   2538a:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   2538e:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   25392:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   25396:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   2539a:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   2539e:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   253a2:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   253a6:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
				lcd_encoder = 0;
   253aa:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   253ae:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
				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 <plan_buffer_line_curposXYZE(float)>
				lcd_draw_update = 1;
   253be:	81 e0       	ldi	r24, 0x01	; 1
   253c0:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
			}
		}
		if (lcd_draw_update)
   253c4:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   253c8:	88 23       	and	r24, r24
   253ca:	11 f1       	breq	.+68     	; 0x25410 <lcd_move_e()+0xea>
		{
		    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 <lcd_set_cursor(unsigned char, unsigned char)>
//! 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 <current_position+0xf>
   253d8:	8f 93       	push	r24
   253da:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   253de:	8f 93       	push	r24
   253e0:	80 91 9e 06 	lds	r24, 0x069E	; 0x80069e <current_position+0xd>
   253e4:	8f 93       	push	r24
   253e6:	80 91 9d 06 	lds	r24, 0x069D	; 0x80069d <current_position+0xc>
   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 <lcd_printf_P(char const*, ...)>
   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 <menu_back_if_clicked()>
    };
}

void show_preheat_nozzle_warning()
{
    lcd_clear();
   25414:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
    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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
    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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    _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 <delay2>
    lcd_clear();
   25448:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
		menu_back_if_clicked();
	}
	else
	{
		show_preheat_nozzle_warning();
		lcd_return_to_status();
   2544c:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

00025450 <millis2>:
}

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 <timer2_millis>
   25458:	70 91 3b 06 	lds	r23, 0x063B	; 0x80063b <timer2_millis+0x1>
   2545c:	80 91 3c 06 	lds	r24, 0x063C	; 0x80063c <timer2_millis+0x2>
   25460:	90 91 3d 06 	lds	r25, 0x063D	; 0x80063d <timer2_millis+0x3>
	SREG = oldSREG;
   25464:	2f bf       	out	0x3f, r18	; 63

	return m;
}
   25466:	08 95       	ret

00025468 <lcd_pause_print()>:
}

//! @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 <stop_and_save_print_to_ram(float, float)>

    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 <serialprintlnPGM(char const*)>

    // 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 <did_pause_print>
  }
  else return false;
}

bool Stopwatch::pause() {
  if (isRunning()) {
   25488:	80 91 9b 03 	lds	r24, 0x039B	; 0x80039b <Stopwatch::state>
   2548c:	81 30       	cpi	r24, 0x01	; 1
   2548e:	69 f4       	brne	.+26     	; 0x254aa <lcd_pause_print()+0x42>
    state = PAUSED;
   25490:	82 e0       	ldi	r24, 0x02	; 2
   25492:	80 93 9b 03 	sts	0x039B, r24	; 0x80039b <Stopwatch::state>
    stopTimestamp = _millis();
   25496:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   2549a:	60 93 51 06 	sts	0x0651, r22	; 0x800651 <Stopwatch::stopTimestamp>
   2549e:	70 93 52 06 	sts	0x0652, r23	; 0x800652 <Stopwatch::stopTimestamp+0x1>
   254a2:	80 93 53 06 	sts	0x0653, r24	; 0x800653 <Stopwatch::stopTimestamp+0x2>
   254a6:	90 93 54 06 	sts	0x0654, r25	; 0x800654 <Stopwatch::stopTimestamp+0x3>

    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_commands_type>
    lcd_return_to_status();
   254b0:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

000254b4 <Timer<unsigned short>::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<typename T>
bool Timer<T>::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 <Timer<unsigned short>::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<typename T>
bool Timer<T>::expired(T msPeriod)
{
    if (!m_isRunning) return false;
    bool expired = false;
    const T now = _millis();
   254da:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    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 <Timer<unsigned short>::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 <Timer<unsigned short>::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 <Timer<unsigned short>::expired(unsigned short)+0x12>
        {
            expired = true;
        }
    }
    if (expired) m_isRunning = false;
   254f8:	18 82       	st	Y, r1
   254fa:	e6 cf       	rjmp	.-52     	; 0x254c8 <Timer<unsigned short>::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 <Timer<unsigned short>::expired(unsigned short)+0x3e>
   25502:	e1 cf       	rjmp	.-62     	; 0x254c6 <Timer<unsigned short>::expired(unsigned short)+0x12>

00025504 <Timer<unsigned short>::expired_cont(unsigned short)>:
}

template<typename T>
bool Timer<T>::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 <Timer<unsigned short>::expired(unsigned short)>
}
   2550e:	81 e0       	ldi	r24, 0x01	; 1
   25510:	08 95       	ret

00025512 <Timer<unsigned short>::start()>:

/**
 * @brief Start timer
 */
template<typename T>
void Timer<T>::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 <millis2>
   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 <twi_wait(unsigned char) [clone .lto_priv.378]>:
  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 <twi_wait(unsigned char) [clone .lto_priv.378]+0x8>
   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 <Timer<unsigned short>::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 <twi_wait(unsigned char) [clone .lto_priv.378]+0x38>
    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 <Timer<unsigned short>::expired(unsigned short)>
   2555a:	88 23       	and	r24, r24
   2555c:	a1 f3       	breq	.-24     	; 0x25546 <twi_wait(unsigned char) [clone .lto_priv.378]+0x1c>
      return 2;
   2555e:	82 e0       	ldi	r24, 0x02	; 2
   25560:	09 c0       	rjmp	.+18     	; 0x25574 <twi_wait(unsigned char) [clone .lto_priv.378]+0x4a>
    }
  }
  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 <twi_wait(unsigned char) [clone .lto_priv.378]+0x58>
}


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 <twi_wait(unsigned char) [clone .lto_priv.378]+0x4a>

00025586 <tmc2130_check_overtemp()>:
	}
	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 <tmc2130_check_overtemp()+0x8>
   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 <Timer<unsigned short>::expired_cont(unsigned short)>
   255a0:	88 23       	and	r24, r24
   255a2:	91 f1       	breq	.+100    	; 0x25608 <tmc2130_check_overtemp()+0x82>
	{
		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 <tmc2130_rx(unsigned char, unsigned char, unsigned long*) [clone .lto_priv.384]>
			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 <tmc2130_check_overtemp()+0x74>
			{ // 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 <serialprintPGM(char const*)>
  }
}

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 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(unsigned char b, int base)
{
  print(b, base);
  println();
   255d6:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
				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_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
			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_check_overtemp()+0x56>
					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 <kill(char const*)>

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_check_overtemp()+0x20>
					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 <Timer<unsigned short>::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 <Timer<unsigned long>::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<typename T>
bool Timer<T>::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 <Timer<unsigned long>::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<typename T>
bool Timer<T>::expired(T msPeriod)
{
    if (!m_isRunning) return false;
    bool expired = false;
    const T now = _millis();
   25658:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <Timer<unsigned long>::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 <Timer<unsigned long>::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 <Timer<unsigned long>::expired(unsigned long)+0x1e>
        {
            expired = true;
        }
    }
    if (expired) m_isRunning = false;
   2568e:	18 82       	st	Y, r1
   25690:	d3 cf       	rjmp	.-90     	; 0x25638 <Timer<unsigned long>::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 <Timer<unsigned long>::expired(unsigned long)+0x6c>
   2569c:	cc cf       	rjmp	.-104    	; 0x25636 <Timer<unsigned long>::expired(unsigned long)+0x1e>

0002569e <lcdui_print_status_line()>:
    }
    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 <heating_status>
   256a8:	88 23       	and	r24, r24
   256aa:	09 f4       	brne	.+2      	; 0x256ae <lcdui_print_status_line()+0x10>
   256ac:	4d c0       	rjmp	.+154    	; 0x25748 <lcdui_print_status_line()+0xaa>
        heating_status_counter++;
   256ae:	80 91 4a 06 	lds	r24, 0x064A	; 0x80064a <lcdui_print_status_line()::heating_status_counter>
   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 <lcdui_print_status_line()+0x46>

//! @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 <lcdui_print_status_line()::heating_status_counter>
        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_set_cursor(unsigned char, unsigned char)>
        lcd_space(13);
   256c4:	8d e0       	ldi	r24, 0x0D	; 13
   256c6:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>

        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 <lcdui_print_status_line()::heating_status_counter>
   256d0:	c8 17       	cp	r28, r24
   256d2:	58 f4       	brcc	.+22     	; 0x256ea <lcdui_print_status_line()+0x4c>
            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 <lcd_putc_at(unsigned char, unsigned char, char)>
            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 <lcdui_print_status_line()+0x2e>
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 <lcdui_print_status_line()::heating_status_counter>
   256e8:	e9 cf       	rjmp	.-46     	; 0x256bc <lcdui_print_status_line()+0x1e>
        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 <heating_status>
   256ee:	82 30       	cpi	r24, 0x02	; 2
   256f0:	d1 f0       	breq	.+52     	; 0x25726 <lcdui_print_status_line()+0x88>
   256f2:	30 f4       	brcc	.+12     	; 0x25700 <lcdui_print_status_line()+0x62>
   256f4:	81 30       	cpi	r24, 0x01	; 1
   256f6:	59 f0       	breq	.+22     	; 0x2570e <lcdui_print_status_line()+0x70>
        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 <lcdui_print_status_line()+0xa4>
   25704:	84 30       	cpi	r24, 0x04	; 4
   25706:	c1 f7       	brne	.-16     	; 0x256f8 <lcdui_print_status_line()+0x5a>
            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 <lcdui_print_status_line()+0x8c>
        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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
            heating_status = HeatingStatus::NO_HEATING;
   25738:	10 92 e1 03 	sts	0x03E1, r1	; 0x8003e1 <heating_status>
            heating_status_counter = 0;
   2573c:	10 92 4a 06 	sts	0x064A, r1	; 0x80064a <lcdui_print_status_line()::heating_status_counter>
   25740:	db cf       	rjmp	.-74     	; 0x256f8 <lcdui_print_status_line()+0x5a>
            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 <lcdui_print_status_line()+0x74>
#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 <card+0x2>
   2574c:	88 23       	and	r24, r24
   2574e:	61 f1       	breq	.+88     	; 0x257a8 <lcdui_print_status_line()+0x10a>
    }
    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 <custom_message_type>
   25754:	81 11       	cpse	r24, r1
   25756:	28 c0       	rjmp	.+80     	; 0x257a8 <lcdui_print_status_line()+0x10a>
        (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 <lcdui_print_status_line()+0x10a>
}

template<typename T>
bool Timer<T>::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 <lcdui_print_status_line()+0xf6>
        (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 <card+0x19>
   2576c:	88 23       	and	r24, r24
   2576e:	09 f4       	brne	.+2      	; 0x25772 <lcdui_print_status_line()+0xd4>
   25770:	35 c0       	rjmp	.+106    	; 0x257dc <lcdui_print_status_line()+0x13e>
   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 <scrollstuff>
   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 <lcd_print_pad(char const*, unsigned char)>
   25784:	81 11       	cpse	r24, r1
   25786:	2d c0       	rjmp	.+90     	; 0x257e2 <lcdui_print_status_line()+0x144>
        {
            scrollstuff++;
   25788:	80 91 b8 0d 	lds	r24, 0x0DB8	; 0x800db8 <scrollstuff>
   2578c:	8f 5f       	subi	r24, 0xFF	; 255
   2578e:	80 93 b8 0d 	sts	0x0DB8, r24	; 0x800db8 <scrollstuff>
   25792:	b2 cf       	rjmp	.-156    	; 0x256f8 <lcdui_print_status_line()+0x5a>
   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 <Timer<unsigned long>::expired(unsigned long)>
   257a4:	81 11       	cpse	r24, r1
   257a6:	e0 cf       	rjmp	.-64     	; 0x25768 <lcdui_print_status_line()+0xca>
            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 <custom_message_type>
   257ac:	81 11       	cpse	r24, r1
   257ae:	1c c0       	rjmp	.+56     	; 0x257e8 <lcdui_print_status_line()+0x14a>
        {
            return; // Nothing to do, waiting for delay to expire
        }

        switch (custom_message_type) {
   257b0:	e0 91 c3 06 	lds	r30, 0x06C3	; 0x8006c3 <custom_message_type>
   257b4:	ea 30       	cpi	r30, 0x0A	; 10
   257b6:	08 f0       	brcs	.+2      	; 0x257ba <lcdui_print_status_line()+0x11c>
   257b8:	9f cf       	rjmp	.-194    	; 0x256f8 <lcdui_print_status_line()+0x5a>
   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 <lcdui_print_status_line()+0xd8>
        if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0)
        {
            scrollstuff++;
        } else {
            scrollstuff = 0;
   257e2:	10 92 b8 0d 	sts	0x0DB8, r1	; 0x800db8 <scrollstuff>
   257e6:	88 cf       	rjmp	.-240    	; 0x256f8 <lcdui_print_status_line()+0x5a>
        }
    } 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 <lcdui_print_status_line()+0x112>
 * This function is expected to handle wrap around of time register well.
 * The maximum elapsed time is dictated by the template type
 */
template<typename T>
T Timer<T>::elapsed() {
  return m_isRunning ? (_millis() - m_started) : 0;
   257f0:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <lcdui_print_status_line()+0x112>
   25816:	70 cf       	rjmp	.-288    	; 0x256f8 <lcdui_print_status_line()+0x5a>
        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 <lcd_set_cursor(unsigned char, unsigned char)>
            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_print_pad(char const*, unsigned char)>
            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 <lcdui_print_status_line()+0x5a>
        }
        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 <custom_message_state>
   25842:	8b 30       	cpi	r24, 0x0B	; 11
   25844:	08 f1       	brcs	.+66     	; 0x25888 <lcdui_print_status_line()+0x1ea>
                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_set_cursor(unsigned char, unsigned char)>
                lcd_space(LCD_WIDTH);
   2584e:	84 e1       	ldi	r24, 0x14	; 20
   25850:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>
                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 <lang_get_translation>
   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_at_P(unsigned char, unsigned char, char const*)>
                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_puts_P(char const*)>
                lcd_print(custom_message_state - 10);
   2586e:	60 91 f6 03 	lds	r22, 0x03F6	; 0x8003f6 <custom_message_state>
   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_print(long, int) [clone .part.3]>
                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 <lcdui_print_status_line()+0x1fa>
                    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 <lcd_setstatuspgm(char const*)>
                    custom_message_type = CustomMsg::Status;
   25894:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
                }
                if (custom_message_state > 3 && custom_message_state <= 10) {
   25898:	80 91 f6 03 	lds	r24, 0x03F6	; 0x8003f6 <custom_message_state>
   2589c:	84 50       	subi	r24, 0x04	; 4
   2589e:	87 30       	cpi	r24, 0x07	; 7
   258a0:	08 f0       	brcs	.+2      	; 0x258a4 <lcdui_print_status_line()+0x206>
   258a2:	2a cf       	rjmp	.-428    	; 0x256f8 <lcdui_print_status_line()+0x5a>
                    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_set_cursor(unsigned char, unsigned char)>
                    lcd_space(19);
   258ac:	83 e1       	ldi	r24, 0x13	; 19
   258ae:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>
                    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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
                    custom_message_state--;
   258c4:	80 91 f6 03 	lds	r24, 0x03F6	; 0x8003f6 <custom_message_state>
   258c8:	81 50       	subi	r24, 0x01	; 1
   258ca:	80 93 f6 03 	sts	0x03F6, r24	; 0x8003f6 <custom_message_state>
   258ce:	14 cf       	rjmp	.-472    	; 0x256f8 <lcdui_print_status_line()+0x5a>
                }
            }
            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 <lcd_print_pad(char const*, unsigned char)>
            if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) {
   258da:	20 91 48 06 	lds	r18, 0x0648	; 0x800648 <pid_cycle>
   258de:	30 91 49 06 	lds	r19, 0x0649	; 0x800649 <pid_cycle+0x1>
   258e2:	80 91 46 06 	lds	r24, 0x0646	; 0x800646 <pid_number_of_cycles>
   258e6:	90 91 47 06 	lds	r25, 0x0647	; 0x800647 <pid_number_of_cycles+0x1>
   258ea:	82 17       	cp	r24, r18
   258ec:	93 07       	cpc	r25, r19
   258ee:	0c f4       	brge	.+2      	; 0x258f2 <lcdui_print_status_line()+0x254>
   258f0:	03 cf       	rjmp	.-506    	; 0x256f8 <lcdui_print_status_line()+0x5a>
   258f2:	80 91 f6 03 	lds	r24, 0x03F6	; 0x8003f6 <custom_message_state>
   258f6:	88 23       	and	r24, r24
   258f8:	09 f4       	brne	.+2      	; 0x258fc <lcdui_print_status_line()+0x25e>
   258fa:	fe ce       	rjmp	.-516    	; 0x256f8 <lcdui_print_status_line()+0x5a>
                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_set_cursor(unsigned char, unsigned char)>
                lcd_printf_P(PSTR("%3d/%-3d"), pid_cycle, pid_number_of_cycles);
   25904:	80 91 47 06 	lds	r24, 0x0647	; 0x800647 <pid_number_of_cycles+0x1>
   25908:	8f 93       	push	r24
   2590a:	80 91 46 06 	lds	r24, 0x0646	; 0x800646 <pid_number_of_cycles>
   2590e:	8f 93       	push	r24
   25910:	80 91 49 06 	lds	r24, 0x0649	; 0x800649 <pid_cycle+0x1>
   25914:	8f 93       	push	r24
   25916:	80 91 48 06 	lds	r24, 0x0648	; 0x800648 <pid_cycle>
   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 <lcd_printf_P(char const*, ...)>
   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 <lcdui_print_status_line()+0x5a>
                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_set_cursor(unsigned char, unsigned char)>
            lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state);
   2593e:	c0 91 f6 03 	lds	r28, 0x03F6	; 0x8003f6 <custom_message_state>
   25942:	81 ec       	ldi	r24, 0xC1	; 193
   25944:	94 e4       	ldi	r25, 0x44	; 68
   25946:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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 <lcdui_print_status_line()+0x282>
            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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
            if (custom_message_state <= PINDA_HEAT_T) {
   2596a:	80 91 f6 03 	lds	r24, 0x03F6	; 0x8003f6 <custom_message_state>
   2596e:	89 37       	cpi	r24, 0x79	; 121
   25970:	08 f0       	brcs	.+2      	; 0x25974 <lcdui_print_status_line()+0x2d6>
   25972:	c2 ce       	rjmp	.-636    	; 0x256f8 <lcdui_print_status_line()+0x5a>
                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 <lcd_puts_P(char const*)>
}

void lcd_print(unsigned long n, int base)
{
	if (base == 0)
		lcd_write(n);
   2597c:	80 91 f6 03 	lds	r24, 0x03F6	; 0x8003f6 <custom_message_state>
   25980:	0e 94 27 6f 	call	0xde4e	; 0xde4e <lcd_write(unsigned char) [clone .lto_priv.432]>
}

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_write(unsigned char) [clone .lto_priv.432]>
                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 <lcdui_print_status_line()+0x74>

00025996 <Timer<unsigned long>::start()>:

/**
 * @brief Start timer
 */
template<typename T>
void Timer<T>::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 <millis2>
   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 <temp_error_messagepgm(char const*, unsigned char)>:

//! 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 <strcpy_P>
    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 <strcat_P>
    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 <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   259f0:	88 23       	and	r24, r24
   259f2:	e1 f0       	breq	.+56     	; 0x25a2c <temp_error_messagepgm(char const*, unsigned char)+0x7a>
        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 <strcmp>
   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 <Timer<unsigned long>::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_type>
        custom_message_state = 0;
   25a16:	10 92 f6 03 	sts	0x03F6, r1	; 0x8003f6 <custom_message_state>
        if (!same) {
   25a1a:	cd 28       	or	r12, r13
   25a1c:	39 f0       	breq	.+14     	; 0x25a2c <temp_error_messagepgm(char const*, unsigned char)+0x7a>
            // 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_updatestatus(char const*, bool) [clone .lto_priv.487]>
            lcd_return_to_status();
   25a28:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
    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 <serialprintPGM(char const*)>

    if(e != EXTRUDERS) {
   25a34:	81 e0       	ldi	r24, 0x01	; 1
   25a36:	f8 16       	cp	r15, r24
   25a38:	49 f0       	breq	.+18     	; 0x25a4c <temp_error_messagepgm(char const*, unsigned char)+0x9a>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
        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 <serialprintPGM(char const*)>
    }

    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 <serialprintPGM(char const*)>
    SERIAL_ERRORRPGM(type);
   25a54:	c8 01       	movw	r24, r16
   25a56:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
    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 <serialprintlnPGM(char const*)>
}
   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 <timer2_millis>
   25a98:	90 91 3b 06 	lds	r25, 0x063B	; 0x80063b <timer2_millis+0x1>
   25a9c:	a0 91 3c 06 	lds	r26, 0x063C	; 0x80063c <timer2_millis+0x2>
   25aa0:	b0 91 3d 06 	lds	r27, 0x063D	; 0x80063d <timer2_millis+0x3>
	unsigned char f = timer2_fract;
   25aa4:	30 91 39 06 	lds	r19, 0x0639	; 0x800639 <timer2_fract>
	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_fract>
	timer2_millis = m;
   25aba:	80 93 3a 06 	sts	0x063A, r24	; 0x80063a <timer2_millis>
   25abe:	90 93 3b 06 	sts	0x063B, r25	; 0x80063b <timer2_millis+0x1>
   25ac2:	a0 93 3c 06 	sts	0x063C, r26	; 0x80063c <timer2_millis+0x2>
   25ac6:	b0 93 3d 06 	sts	0x063D, r27	; 0x80063d <timer2_millis+0x3>
	timer2_overflow_count++;
   25aca:	80 91 3e 06 	lds	r24, 0x063E	; 0x80063e <timer2_overflow_count>
   25ace:	90 91 3f 06 	lds	r25, 0x063F	; 0x80063f <timer2_overflow_count+0x1>
   25ad2:	a0 91 40 06 	lds	r26, 0x0640	; 0x800640 <timer2_overflow_count+0x2>
   25ad6:	b0 91 41 06 	lds	r27, 0x0641	; 0x800641 <timer2_overflow_count+0x3>
   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 <timer2_overflow_count>
   25ae4:	90 93 3f 06 	sts	0x063F, r25	; 0x80063f <timer2_overflow_count+0x1>
   25ae8:	a0 93 40 06 	sts	0x0640, r26	; 0x800640 <timer2_overflow_count+0x2>
   25aec:	b0 93 41 06 	sts	0x0641, r27	; 0x800641 <timer2_overflow_count+0x3>
}
   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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]>:

    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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0x26>
   25b38:	00 d0       	rcall	.+0      	; 0x25b3a <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0x28>
   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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0xe6>
        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_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0x1be>
        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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]>
        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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0x1a6>
            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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0x13e>
        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 <thermal_model_cal::cost_fn(unsigned int, float*, float, unsigned char, float) [clone .lto_priv.421]+0x1e2>
   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 <thermal_model_cal::set_fan_speed(unsigned char) [clone .lto_priv.557]>:

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 <resetFanCheck()>

    fanSpeed = fan_speed;
   25d2e:	c0 93 e5 03 	sts	0x03E5, r28	; 0x8003e5 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = fan_speed;
   25d32:	c0 93 a5 04 	sts	0x04A5, r28	; 0x8004a5 <fanSpeedSoftPwm>
#endif
}
   25d36:	cf 91       	pop	r28
   25d38:	08 95       	ret

00025d3a <thermal_model_report_settings()>:
    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 <serialprintPGM(char const*)>
    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 <serialprintlnPGM(char const*)>
   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 <printf_P>
   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 <thermal_model_report_settings()+0x38>
        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 <printf_P>
   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 <thermal_model_set_lag(unsigned int) [clone .lto_priv.556]>:
// 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 <thermal_model_set_lag(unsigned int) [clone .lto_priv.556]+0x38>
   25ece:	69 30       	cpi	r22, 0x09	; 9
   25ed0:	71 05       	cpc	r23, r1
   25ed2:	10 f0       	brcs	.+4      	; 0x25ed8 <thermal_model_set_lag(unsigned int) [clone .lto_priv.556]+0x1c>
   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 <thermal_model_set_lag(unsigned int) [clone .lto_priv.556]+0x1c>

00025efa <thermal_model::calibrated() [clone .lto_priv.563]>:
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0x24>
   25f1c:	54 c0       	rjmp	.+168    	; 0x25fc6 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
   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 <thermal_model::calibrated() [clone .lto_priv.563]+0xcc>
    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 <thermal_model::calibrated() [clone .lto_priv.563]+0xa6>
        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 <thermal_model::calibrated() [clone .lto_priv.563]+0xc6>

00025fca <thermal_model::setup() [clone .lto_priv.555]>:
}

// 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 <thermal_model::calibrated() [clone .lto_priv.563]>
   25fce:	81 11       	cpse	r24, r1
   25fd0:	02 c0       	rjmp	.+4      	; 0x25fd6 <thermal_model::setup() [clone .lto_priv.555]+0xc>
   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 <thermal_model::warning_state+0x4>
   25fe0:	8d 7f       	andi	r24, 0xFD	; 253
   25fe2:	80 93 38 06 	sts	0x0638, r24	; 0x800638 <thermal_model::warning_state+0x4>
// verify calibration status and trigger a model reset if valid
static void setup()
{
    if(!calibrated()) enabled = false;
    reinitialize();
}
   25fe6:	08 95       	ret

00025fe8 <disable_heater()>:
    }
    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 <target_temperature+0x1>
   25fee:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   25ff2:	10 92 72 06 	sts	0x0672, r1	; 0x800672 <target_temperature_bed+0x1>
   25ff6:	10 92 71 06 	sts	0x0671, r1	; 0x800671 <target_temperature_bed>
  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 <setIsrTargetTemperatures()>
      temp_mgr_pid();
   26002:	0f 94 ac 11 	call	0x22358	; 0x22358 <temp_mgr_pid()>

      // 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 <bedPWMDisabled>
    (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 <lcd_cooldown() [clone .lto_priv.435]>:

/* Menu implementation */

static void lcd_cooldown()
{
  disable_heater();
   26012:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
  fanSpeed = 0;
   26016:	10 92 e5 03 	sts	0x03E5, r1	; 0x8003e5 <fanSpeed>
  lcd_return_to_status();
   2601a:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

0002601e <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>:

// 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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0x44>
   26032:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
   26036:	81 11       	cpse	r24, r1
   26038:	14 c0       	rjmp	.+40     	; 0x26062 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0x44>
        saved_bed_temperature = target_temperature_bed;
   2603a:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
   2603e:	80 93 ad 05 	sts	0x05AD, r24	; 0x8005ad <saved_bed_temperature>
        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 <saved_extruder_temperature+0x1>
   26056:	80 93 ab 05 	sts	0x05AB, r24	; 0x8005ab <saved_extruder_temperature>
        saved_fan_speed = fanSpeed;
   2605a:	80 91 e5 03 	lds	r24, 0x03E5	; 0x8003e5 <fanSpeed>
   2605e:	80 93 aa 05 	sts	0x05AA, r24	; 0x8005aa <saved_fan_speed>
    }

    // keep disabling heaters and keep fans on as long as the condition is asserted
    disable_heater();
   26062:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
void hotendFanSetFullSpeed()
{
#ifdef EXTRUDER_ALTFAN_DETECT
    altfanStatus.altfanOverride = 1; //full speed
#endif //EXTRUDER_ALTFAN_DETECT
    resetFanCheck();
   26066:	0e 94 79 74 	call	0xe8f2	; 0xe8f2 <resetFanCheck()>
    setExtruderAutoFanState(3);
   2606a:	83 e0       	ldi	r24, 0x03	; 3
   2606c:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>
    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 <fanSpeedSoftPwm>
#else //FAN_SOFT_PWM
    analogWrite(FAN_PIN, 255);
#endif //FAN_SOFT_PWM
    fanSpeed = 255;
   26080:	80 93 e5 03 	sts	0x03E5, r24	; 0x8003e5 <fanSpeed>
    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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0x7c>
   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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0xac>
        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 <check_min_temp_bed()>:
}

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 <current_temperature_bed_raw>
   260ea:	30 91 09 06 	lds	r19, 0x0609	; 0x800609 <current_temperature_bed_raw+0x1>
   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 <check_min_temp_bed()+0x20>
#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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
	}
}
   26106:	08 95       	ret

00026108 <check_min_temp_heater0()>:
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 <current_temperature_raw>
   2610c:	30 91 0b 06 	lds	r19, 0x060B	; 0x80060b <current_temperature_raw+0x1>
   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 <check_min_temp_heater0()+0x20>
#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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
	}
}
   26128:	08 95       	ret

0002612a <temp_runaway_check(unsigned char, float, float, float, bool)>:
  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 <millis2>
   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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x7c>
   261a4:	ea c0       	rjmp	.+468    	; 0x2637a <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>
	{

#ifdef 	TEMP_RUNAWAY_BED_TIMEOUT
          if (_isbed)
   261a6:	33 20       	and	r3, r3
   261a8:	09 f4       	brne	.+2      	; 0x261ac <temp_runaway_check(unsigned char, float, float, float, bool)+0x82>
   261aa:	75 c0       	rjmp	.+234    	; 0x26296 <temp_runaway_check(unsigned char, float, float, float, bool)+0x16c>
          {
               __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 <millis2>
   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(unsigned char, float, float, float, bool)+0xce>
		{
			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 <temp_runaway_check(unsigned char, float, float, float, bool)+0xf2>
   2621a:	91 c0       	rjmp	.+290    	; 0x2633e <temp_runaway_check(unsigned char, float, float, float, bool)+0x214>
		{
			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_check(unsigned char, float, float, float, bool)+0x17e>
			{
				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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
		{
			__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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x2ea>
   26286:	89 30       	cpi	r24, 0x09	; 9
   26288:	c8 f0       	brcs	.+50     	; 0x262bc <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
			{
                    __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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x33c>
#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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x92>
				__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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x23e>
   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_check(unsigned char, float, float, float, bool)+0x1d0>
		{
			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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>


		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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x204>
   2632c:	3f c0       	rjmp	.+126    	; 0x263ac <temp_runaway_check(unsigned char, float, float, float, bool)+0x282>
			{
				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_check(unsigned char, float, float, float, bool)+0x250>
				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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x22a>
   26352:	b4 cf       	rjmp	.-152    	; 0x262bc <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
   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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x238>
   26360:	ad cf       	rjmp	.-166    	; 0x262bc <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
   26362:	89 cf       	rjmp	.-238    	; 0x26276 <temp_runaway_check(unsigned char, float, float, float, bool)+0x14c>
                         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_check(unsigned char, float, float, float, bool)+0x36c>
			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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x282>
				}
			}
		}

	}
}
   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_check(unsigned char, float, float, float, bool)+0x250>
				{
					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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>
                        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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
		}

		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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x2f0>
   26418:	51 cf       	rjmp	.-350    	; 0x262bc <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
			{
                    __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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x318>
   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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x33c>
   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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x23a>
					__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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x37c>
   2649e:	06 97       	sbiw	r24, 0x06	; 6
   264a0:	4c f0       	brlt	.+18     	; 0x264b4 <temp_runaway_check(unsigned char, float, float, float, bool)+0x38a>
                    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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x382>
					__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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x38a>
                    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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>

				__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 <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>

000264d2 <TempMgrGuard::~TempMgrGuard()>:
            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 <TempMgrGuard::~TempMgrGuard()+0x16>
   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 <TempMgrGuard::TempMgrGuard()>:
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 <thermal_model_reset_settings()>:
        (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 <TempMgrGuard::TempMgrGuard()>

    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_reset_settings()+0x96>
        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 <thermal_model::warning_state+0x4>
   26614:	8d 7f       	andi	r24, 0xFD	; 253
   26616:	80 93 38 06 	sts	0x0638, r24	; 0x800638 <thermal_model::warning_state+0x4>
        (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 <TempMgrGuard::~TempMgrGuard()>
    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 <thermal_model_set_enabled(bool)>:
{
    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 <TempMgrGuard::TempMgrGuard()>
        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 <thermal_model::setup() [clone .lto_priv.555]>

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 <TempMgrGuard::~TempMgrGuard()>
        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 <thermal_model_set_enabled(bool)+0x3a>
   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 <thermal_model_set_enabled(bool)+0x3a>
        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 <serialprintlnPGM(char const*)>
}
   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 <thermal_model_reset_enabled(bool) [clone .lto_priv.420]>:
#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 <TempMgrGuard::TempMgrGuard()>
    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 <TempMgrGuard::~TempMgrGuard()>
    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 <updateTemperatures()>:
/* 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 <TempMgrGuard::TempMgrGuard()>
}

static void setCurrentTemperaturesFromIsr()
{
    for(uint8_t e=0;e<EXTRUDERS;e++)
        current_temperature[e] = current_temperature_isr[e];
   266bc:	80 91 16 05 	lds	r24, 0x0516	; 0x800516 <current_temperature_isr>
   266c0:	90 91 17 05 	lds	r25, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   266c4:	a0 91 18 05 	lds	r26, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   266c8:	b0 91 19 05 	lds	r27, 0x0519	; 0x800519 <current_temperature_isr+0x3>
   266cc:	80 93 af 0d 	sts	0x0DAF, r24	; 0x800daf <current_temperature>
   266d0:	90 93 b0 0d 	sts	0x0DB0, r25	; 0x800db0 <current_temperature+0x1>
   266d4:	a0 93 b1 0d 	sts	0x0DB1, r26	; 0x800db1 <current_temperature+0x2>
   266d8:	b0 93 b2 0d 	sts	0x0DB2, r27	; 0x800db2 <current_temperature+0x3>
    current_temperature_bed = current_temperature_bed_isr;
   266dc:	80 91 18 06 	lds	r24, 0x0618	; 0x800618 <current_temperature_bed_isr>
   266e0:	90 91 19 06 	lds	r25, 0x0619	; 0x800619 <current_temperature_bed_isr+0x1>
   266e4:	a0 91 1a 06 	lds	r26, 0x061A	; 0x80061a <current_temperature_bed_isr+0x2>
   266e8:	b0 91 1b 06 	lds	r27, 0x061B	; 0x80061b <current_temperature_bed_isr+0x3>
   266ec:	80 93 ed 04 	sts	0x04ED, r24	; 0x8004ed <current_temperature_bed>
   266f0:	90 93 ee 04 	sts	0x04EE, r25	; 0x8004ee <current_temperature_bed+0x1>
   266f4:	a0 93 ef 04 	sts	0x04EF, r26	; 0x8004ef <current_temperature_bed+0x2>
   266f8:	b0 93 f0 04 	sts	0x04F0, r27	; 0x8004f0 <current_temperature_bed+0x3>
#ifdef PINDA_THERMISTOR
    current_temperature_pinda = current_temperature_pinda_isr;
   266fc:	80 91 02 06 	lds	r24, 0x0602	; 0x800602 <current_temperature_pinda_isr>
   26700:	90 91 03 06 	lds	r25, 0x0603	; 0x800603 <current_temperature_pinda_isr+0x1>
   26704:	a0 91 04 06 	lds	r26, 0x0604	; 0x800604 <current_temperature_pinda_isr+0x2>
   26708:	b0 91 05 06 	lds	r27, 0x0605	; 0x800605 <current_temperature_pinda_isr+0x3>
   2670c:	80 93 97 03 	sts	0x0397, r24	; 0x800397 <current_temperature_pinda>
   26710:	90 93 98 03 	sts	0x0398, r25	; 0x800398 <current_temperature_pinda+0x1>
   26714:	a0 93 99 03 	sts	0x0399, r26	; 0x800399 <current_temperature_pinda+0x2>
   26718:	b0 93 9a 03 	sts	0x039A, r27	; 0x80039a <current_temperature_pinda+0x3>
#endif
#ifdef AMBIENT_THERMISTOR
    current_temperature_ambient = current_temperature_ambient_isr;
   2671c:	80 91 1f 06 	lds	r24, 0x061F	; 0x80061f <current_temperature_ambient_isr>
   26720:	90 91 20 06 	lds	r25, 0x0620	; 0x800620 <current_temperature_ambient_isr+0x1>
   26724:	a0 91 21 06 	lds	r26, 0x0621	; 0x800621 <current_temperature_ambient_isr+0x2>
   26728:	b0 91 22 06 	lds	r27, 0x0622	; 0x800622 <current_temperature_ambient_isr+0x3>
   2672c:	80 93 55 06 	sts	0x0655, r24	; 0x800655 <current_temperature_ambient>
   26730:	90 93 56 06 	sts	0x0656, r25	; 0x800656 <current_temperature_ambient+0x1>
   26734:	a0 93 57 06 	sts	0x0657, r26	; 0x800657 <current_temperature_ambient+0x2>
   26738:	b0 93 58 06 	sts	0x0658, r27	; 0x800658 <current_temperature_ambient+0x3>
   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 <updateTemperatures()+0x9e>
        // refuse to update target temperatures in any error condition!
        setIsrTargetTemperatures();
   26744:	0f 94 6f 14 	call	0x228de	; 0x228de <setIsrTargetTemperatures()>
    }
    temp_meas_ready = false;
   26748:	10 92 01 06 	sts	0x0601, r1	; 0x800601 <temp_meas_ready>
   - 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 <TempMgrGuard::~TempMgrGuard()>
    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 <Timer<unsigned short>::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 <Timer<unsigned short>::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 <Timer<unsigned long>::start()>
            if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0))
   267c0:	80 91 d8 05 	lds	r24, 0x05D8	; 0x8005d8 <lcd_buttons_update()::lcd_button_pressed>
   267c4:	81 11       	cpse	r24, r1
   267c6:	a5 c0       	rjmp	.+330    	; 0x26912 <__vector_14+0x1b6>
   267c8:	80 91 d7 05 	lds	r24, 0x05D7	; 0x8005d7 <lcd_buttons_update()::lcd_long_press_active>
   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 <Timer<unsigned short>::start()>
                lcd_button_pressed = 1;
   267d8:	81 e0       	ldi	r24, 0x01	; 1
   267da:	80 93 d8 05 	sts	0x05D8, r24	; 0x8005d8 <lcd_buttons_update()::lcd_button_pressed>
		-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 <lcd_buttons_update()::enc_bits_old>
   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 <lcd_buttons_update()::enc_bits_old>

#ifndef SLOW_PWM_HEATERS
  /*
   * standard PWM modulation
   */
  if (pwm_count == 0)
   26834:	80 91 a4 02 	lds	r24, 0x02A4	; 0x8002a4 <soft_pwm_core()::pwm_count>
   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 <soft_pwm_core()::soft_pwm_0>
    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 <soft_pwm_core()::pwm_count>
   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 <fanSpeedSoftPwm>
   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 <soft_pwm_core()::soft_pwm_0>
   26882:	80 91 a4 02 	lds	r24, 0x02A4	; 0x8002a4 <soft_pwm_core()::pwm_count>
   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 <soft_pwm_core()::pwm_count>
   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 <soft_pwm_core()::pwm_count>
   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 <soft_pwm_core()::pwm_count>
   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 <babystep(unsigned char, bool)>
        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 <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>
            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 <Timer<unsigned short>::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_buttons_update()::lcd_long_press_active>
                lcd_longpress_trigger = 1;
   2692a:	80 93 d3 05 	sts	0x05D3, r24	; 0x8005d3 <lcd_longpress_trigger>
   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 <lcd_buttons_update()::lcd_button_pressed>
   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 <lcd_buttons_update()::lcd_button_pressed>
            if (!lcd_long_press_active)
   2693e:	80 91 d7 05 	lds	r24, 0x05D7	; 0x8005d7 <lcd_buttons_update()::lcd_long_press_active>
   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_click_trigger>
            }
            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 <lcd_buttons_update()::lcd_long_press_active>
   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 <babystep(unsigned char, bool)>
        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 <readFanTach()::fan_state>
   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 <fan_measuring>
   26996:	99 23       	and	r25, r25
   26998:	51 f0       	breq	.+20     	; 0x269ae <__vector_14+0x252>
   2699a:	20 91 e1 05 	lds	r18, 0x05E1	; 0x8005e1 <fan_edge_counter>
   2699e:	30 91 e2 05 	lds	r19, 0x05E2	; 0x8005e2 <fan_edge_counter+0x1>
   269a2:	2f 5f       	subi	r18, 0xFF	; 255
   269a4:	3f 4f       	sbci	r19, 0xFF	; 255
   269a6:	30 93 e2 05 	sts	0x05E2, r19	; 0x8005e2 <fan_edge_counter+0x1>
   269aa:	20 93 e1 05 	sts	0x05E1, r18	; 0x8005e1 <fan_edge_counter>
        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 <readFanTach()::fan_state>
    (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 <analog2tempAmbient(int) [clone .lto_priv.430]>:
  #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<AMBIENTTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(AMBIENTTEMPTABLE[i][0]) > 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 <analog2tempAmbient(int) [clone .lto_priv.430]+0x38>
   26a28:	66 c0       	rjmp	.+204    	; 0x26af6 <analog2tempAmbient(int) [clone .lto_priv.430]+0x104>
      {
        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<AMBIENTTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(AMBIENTTEMPTABLE[i][0]) > 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<AMBIENTTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(AMBIENTTEMPTABLE[i][0]) > 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<AMBIENTTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(AMBIENTTEMPTABLE[i][0]) > 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<AMBIENTTEMPTABLE_LEN; i++)
   26afe:	28 38       	cpi	r18, 0x88	; 136
   26b00:	31 05       	cpc	r19, r1
   26b02:	09 f0       	breq	.+2      	; 0x26b06 <analog2tempAmbient(int) [clone .lto_priv.430]+0x114>
   26b04:	88 cf       	rjmp	.-240    	; 0x26a16 <analog2tempAmbient(int) [clone .lto_priv.430]+0x24>
          (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 <analog2tempAmbient(int) [clone .lto_priv.430]+0xe6>

00026b1c <analog2tempBed(int) [clone .lto_priv.431]>:
  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<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > 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 <analog2tempBed(int) [clone .lto_priv.431]+0x38>
   26b52:	80 c0       	rjmp	.+256    	; 0x26c54 <analog2tempBed(int) [clone .lto_priv.431]+0x138>
      {
        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<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > 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<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > 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<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > 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 <analog2tempBed(int) [clone .lto_priv.431]+0x15e>
   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 <analog2tempBed(int) [clone .lto_priv.431]+0x15e>
	{
		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 <analog2tempBed(int) [clone .lto_priv.431]+0x1be>
   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<BEDTEMPTABLE_LEN; i++)
   26c5c:	24 3f       	cpi	r18, 0xF4	; 244
   26c5e:	31 05       	cpc	r19, r1
   26c60:	09 f0       	breq	.+2      	; 0x26c64 <analog2tempBed(int) [clone .lto_priv.431]+0x148>
   26c62:	6e cf       	rjmp	.-292    	; 0x26b40 <analog2tempBed(int) [clone .lto_priv.431]+0x24>
        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 <analog2tempBed(int) [clone .lto_priv.431]+0xe6>

	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 <analog2tempBed(int) [clone .lto_priv.431]+0x1e8>
   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 <analog2tempBed(int) [clone .lto_priv.431]+0x1e8>
	{
		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 <analog2tempBed(int) [clone .lto_priv.431]+0x1c6>
	{
		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 <analog2tempBed(int) [clone .lto_priv.431]+0x132>

00026d22 <temp_mgr_isr() [clone .lto_priv.422]>:
}

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<EXTRUDERS;e++)
        current_temperature_isr[e] = analog2temp(current_temperature_raw[e], e);
   26d3c:	80 91 0a 06 	lds	r24, 0x060A	; 0x80060a <current_temperature_raw>
   26d40:	90 91 0b 06 	lds	r25, 0x060B	; 0x80060b <current_temperature_raw+0x1>
   26d44:	0f 94 10 a1 	call	0x34220	; 0x34220 <analog2temp(int, unsigned char) [clone .constprop.70]>
   26d48:	60 93 16 05 	sts	0x0516, r22	; 0x800516 <current_temperature_isr>
   26d4c:	70 93 17 05 	sts	0x0517, r23	; 0x800517 <current_temperature_isr+0x1>
   26d50:	80 93 18 05 	sts	0x0518, r24	; 0x800518 <current_temperature_isr+0x2>
   26d54:	90 93 19 05 	sts	0x0519, r25	; 0x800519 <current_temperature_isr+0x3>
    current_temperature_bed_isr = analog2tempBed(current_temperature_bed_raw);
   26d58:	60 90 08 06 	lds	r6, 0x0608	; 0x800608 <current_temperature_bed_raw>
   26d5c:	70 90 09 06 	lds	r7, 0x0609	; 0x800609 <current_temperature_bed_raw+0x1>
   26d60:	c3 01       	movw	r24, r6
   26d62:	0f 94 8e 35 	call	0x26b1c	; 0x26b1c <analog2tempBed(int) [clone .lto_priv.431]>
   26d66:	6b 01       	movw	r12, r22
   26d68:	7c 01       	movw	r14, r24
   26d6a:	c0 92 18 06 	sts	0x0618, r12	; 0x800618 <current_temperature_bed_isr>
   26d6e:	d0 92 19 06 	sts	0x0619, r13	; 0x800619 <current_temperature_bed_isr+0x1>
   26d72:	e0 92 1a 06 	sts	0x061A, r14	; 0x80061a <current_temperature_bed_isr+0x2>
   26d76:	f0 92 1b 06 	sts	0x061B, r15	; 0x80061b <current_temperature_bed_isr+0x3>
#ifdef PINDA_THERMISTOR
    current_temperature_pinda_isr = analog2tempBed(current_temperature_raw_pinda);
   26d7a:	80 91 06 06 	lds	r24, 0x0606	; 0x800606 <current_temperature_raw_pinda>
   26d7e:	90 91 07 06 	lds	r25, 0x0607	; 0x800607 <current_temperature_raw_pinda+0x1>
   26d82:	0f 94 8e 35 	call	0x26b1c	; 0x26b1c <analog2tempBed(int) [clone .lto_priv.431]>
   26d86:	60 93 02 06 	sts	0x0602, r22	; 0x800602 <current_temperature_pinda_isr>
   26d8a:	70 93 03 06 	sts	0x0603, r23	; 0x800603 <current_temperature_pinda_isr+0x1>
   26d8e:	80 93 04 06 	sts	0x0604, r24	; 0x800604 <current_temperature_pinda_isr+0x2>
   26d92:	90 93 05 06 	sts	0x0605, r25	; 0x800605 <current_temperature_pinda_isr+0x3>
#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 <current_temperature_raw_ambient>
   26d9a:	d0 91 15 06 	lds	r29, 0x0615	; 0x800615 <current_temperature_raw_ambient+0x1>
   26d9e:	ce 01       	movw	r24, r28
   26da0:	0f 94 f9 34 	call	0x269f2	; 0x269f2 <analog2tempAmbient(int) [clone .lto_priv.430]>
   26da4:	60 93 1f 06 	sts	0x061F, r22	; 0x80061f <current_temperature_ambient_isr>
   26da8:	70 93 20 06 	sts	0x0620, r23	; 0x800620 <current_temperature_ambient_isr+0x1>
   26dac:	80 93 21 06 	sts	0x0621, r24	; 0x800621 <current_temperature_ambient_isr+0x2>
   26db0:	90 93 22 06 	sts	0x0622, r25	; 0x800622 <current_temperature_ambient_isr+0x3>
#endif
    temp_meas_ready = true;
   26db4:	81 e0       	ldi	r24, 0x01	; 1
   26db6:	80 93 01 06 	sts	0x0601, r24	; 0x800601 <temp_meas_ready>
{
    // 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 <current_temperature_raw>
   26dc8:	30 91 0b 06 	lds	r19, 0x060B	; 0x80060b <current_temperature_raw+0x1>
   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 <temp_mgr_isr() [clone .lto_priv.422]+0xc2>
#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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
    }
    //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 <temp_mgr_isr() [clone .lto_priv.422]+0xda>
#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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
    }
#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 <temp_mgr_isr() [clone .lto_priv.422]+0xf2>
#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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>

#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 <temp_mgr_isr() [clone .lto_priv.422]+0x10a>
#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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
#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 <temp_mgr_isr() [clone .lto_priv.422]+0x112>
   26e32:	cd c1       	rjmp	.+922    	; 0x271ce <temp_mgr_isr() [clone .lto_priv.422]+0x4ac>
    {
        // 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 <target_temperature_isr>
   26e40:	90 91 1e 06 	lds	r25, 0x061E	; 0x80061e <target_temperature_isr+0x1>
   26e44:	68 17       	cp	r22, r24
   26e46:	79 07       	cpc	r23, r25
   26e48:	0c f0       	brlt	.+2      	; 0x26e4c <temp_mgr_isr() [clone .lto_priv.422]+0x12a>
   26e4a:	55 c0       	rjmp	.+170    	; 0x26ef6 <temp_mgr_isr() [clone .lto_priv.422]+0x1d4>
            // ~ 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 <check_min_temp_raw()::bCheckingOnHeater>
   26e50:	c1 11       	cpse	r28, r1
   26e52:	18 c0       	rjmp	.+48     	; 0x26e84 <temp_mgr_isr() [clone .lto_priv.422]+0x162>
   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 <current_temperature_isr>
   26e6e:	70 91 17 05 	lds	r23, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   26e72:	80 91 18 05 	lds	r24, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   26e76:	90 91 19 05 	lds	r25, 0x0519	; 0x800519 <current_temperature_isr+0x3>
   26e7a:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   26e7e:	18 16       	cp	r1, r24
   26e80:	0c f0       	brlt	.+2      	; 0x26e84 <temp_mgr_isr() [clone .lto_priv.422]+0x162>
   26e82:	c0 e0       	ldi	r28, 0x00	; 0
   26e84:	c0 93 13 06 	sts	0x0613, r28	; 0x800613 <check_min_temp_raw()::bCheckingOnHeater>
            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 <Timer<unsigned short>::expired_cont(unsigned short)>
   26e94:	81 11       	cpse	r24, r1
   26e96:	02 c0       	rjmp	.+4      	; 0x26e9c <temp_mgr_isr() [clone .lto_priv.422]+0x17a>
   26e98:	cc 23       	and	r28, r28
   26e9a:	29 f0       	breq	.+10     	; 0x26ea6 <temp_mgr_isr() [clone .lto_priv.422]+0x184>
                bCheckingOnHeater=true;   // not necessary
   26e9c:	81 e0       	ldi	r24, 0x01	; 1
   26e9e:	80 93 13 06 	sts	0x0613, r24	; 0x800613 <check_min_temp_raw()::bCheckingOnHeater>
                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 <check_min_temp_heater0()>
            // ~ 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 <target_temperature_bed_isr>
   26eaa:	90 91 17 06 	lds	r25, 0x0617	; 0x800617 <target_temperature_bed_isr+0x1>
   26eae:	0b 97       	sbiw	r24, 0x0b	; 11
   26eb0:	4c f1       	brlt	.+82     	; 0x26f04 <temp_mgr_isr() [clone .lto_priv.422]+0x1e2>
            // ~ 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 <check_min_temp_raw()::bCheckingOnBed>
   26eb6:	c1 11       	cpse	r28, r1
   26eb8:	0c c0       	rjmp	.+24     	; 0x26ed2 <temp_mgr_isr() [clone .lto_priv.422]+0x1b0>
   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 <temp_mgr_isr() [clone .lto_priv.422]+0x1b0>
   26ed0:	c0 e0       	ldi	r28, 0x00	; 0
   26ed2:	c0 93 0f 06 	sts	0x060F, r28	; 0x80060f <check_min_temp_raw()::bCheckingOnBed>
            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 <Timer<unsigned short>::expired_cont(unsigned short)>
   26ee2:	81 11       	cpse	r24, r1
   26ee4:	02 c0       	rjmp	.+4      	; 0x26eea <temp_mgr_isr() [clone .lto_priv.422]+0x1c8>
   26ee6:	cc 23       	and	r28, r28
   26ee8:	99 f0       	breq	.+38     	; 0x26f10 <temp_mgr_isr() [clone .lto_priv.422]+0x1ee>
                bCheckingOnBed=true;  // not necessary
   26eea:	81 e0       	ldi	r24, 0x01	; 1
   26eec:	80 93 0f 06 	sts	0x060F, r24	; 0x80060f <check_min_temp_raw()::bCheckingOnBed>
#ifdef AMBIENT_THERMISTOR
    }
    else {
        // ambient temperature is standard
        check_min_temp_heater0();
        check_min_temp_bed();
   26ef0:	0f 94 73 30 	call	0x260e6	; 0x260e6 <check_min_temp_bed()>
   26ef4:	0d c0       	rjmp	.+26     	; 0x26f10 <temp_mgr_isr() [clone .lto_priv.422]+0x1ee>
                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 <Timer<unsigned short>::start()>
            bCheckingOnHeater=false;
   26efe:	10 92 13 06 	sts	0x0613, r1	; 0x800613 <check_min_temp_raw()::bCheckingOnHeater>
   26f02:	d1 cf       	rjmp	.-94     	; 0x26ea6 <temp_mgr_isr() [clone .lto_priv.422]+0x184>
                check_min_temp_bed(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active
            }
        }
        else {
            // ~ bed heating is off
            oTimer4minTempBed.start();
   26f04:	8c e0       	ldi	r24, 0x0C	; 12
   26f06:	96 e0       	ldi	r25, 0x06	; 6
   26f08:	0f 94 89 2a 	call	0x25512	; 0x25512 <Timer<unsigned short>::start()>
            bCheckingOnBed=false;
   26f0c:	10 92 0f 06 	sts	0x060F, r1	; 0x80060f <check_min_temp_raw()::bCheckingOnBed>

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 <current_temperature_isr>
   26f26:	50 90 17 05 	lds	r5, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   26f2a:	60 90 18 05 	lds	r6, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   26f2e:	70 90 19 05 	lds	r7, 0x0519	; 0x800519 <current_temperature_isr+0x3>
   26f32:	60 91 1d 06 	lds	r22, 0x061D	; 0x80061d <target_temperature_isr>
   26f36:	70 91 1e 06 	lds	r23, 0x061E	; 0x80061e <target_temperature_isr+0x1>
   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 <temp_runaway_check(unsigned char, float, float, float, bool)>
#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 <soft_pwm_bed>
   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 <current_temperature_bed_isr>
   26f6c:	50 90 19 06 	lds	r5, 0x0619	; 0x800619 <current_temperature_bed_isr+0x1>
   26f70:	60 90 1a 06 	lds	r6, 0x061A	; 0x80061a <current_temperature_bed_isr+0x2>
   26f74:	70 90 1b 06 	lds	r7, 0x061B	; 0x80061b <current_temperature_bed_isr+0x3>
   26f78:	60 91 16 06 	lds	r22, 0x0616	; 0x800616 <target_temperature_bed_isr>
   26f7c:	70 91 17 06 	lds	r23, 0x0617	; 0x800617 <target_temperature_bed_isr+0x1>
   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 <temp_runaway_check(unsigned char, float, float, float, bool)>
    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 <temp_mgr_isr() [clone .lto_priv.422]+0x286>
   26fa6:	bc c0       	rjmp	.+376    	; 0x27120 <temp_mgr_isr() [clone .lto_priv.422]+0x3fe>

    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 <current_temperature_isr>
   26fb4:	50 90 17 05 	lds	r5, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   26fb8:	60 90 18 05 	lds	r6, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   26fbc:	70 90 19 05 	lds	r7, 0x0519	; 0x800519 <current_temperature_isr+0x3>
    float ambient_temp = current_temperature_ambient_isr;
   26fc0:	c0 90 1f 06 	lds	r12, 0x061F	; 0x80061f <current_temperature_ambient_isr>
   26fc4:	d0 90 20 06 	lds	r13, 0x0620	; 0x800620 <current_temperature_ambient_isr+0x1>
   26fc8:	e0 90 21 06 	lds	r14, 0x0621	; 0x800621 <current_temperature_ambient_isr+0x2>
   26fcc:	f0 90 22 06 	lds	r15, 0x0622	; 0x800622 <current_temperature_ambient_isr+0x3>

    // 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 <temp_mgr_isr() [clone .lto_priv.422]+0x39a>

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 <temp_mgr_isr() [clone .lto_priv.422]+0x35e>
        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 <thermal_model::model_data::step(unsigned char, unsigned char, float, float) [clone .constprop.42]>

    // 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 <temp_mgr_isr() [clone .lto_priv.422]+0x3bc>
        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 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>

    // 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 <thermal_model::warning_state+0x4>
   270e6:	92 fb       	bst	r25, 2
   270e8:	81 f9       	bld	r24, 1
   270ea:	80 93 38 06 	sts	0x0638, r24	; 0x800638 <thermal_model::warning_state+0x4>
    if(warning_state.assert) {
   270ee:	80 91 38 06 	lds	r24, 0x0638	; 0x800638 <thermal_model::warning_state+0x4>
   270f2:	81 ff       	sbrs	r24, 1
   270f4:	15 c0       	rjmp	.+42     	; 0x27120 <temp_mgr_isr() [clone .lto_priv.422]+0x3fe>
        warning_state.warning = true;
   270f6:	80 91 38 06 	lds	r24, 0x0638	; 0x800638 <thermal_model::warning_state+0x4>
   270fa:	81 60       	ori	r24, 0x01	; 1
   270fc:	80 93 38 06 	sts	0x0638, r24	; 0x800638 <thermal_model::warning_state+0x4>
        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 <thermal_model::warning_state>
   27114:	90 93 35 06 	sts	0x0635, r25	; 0x800635 <thermal_model::warning_state+0x1>
   27118:	a0 93 36 06 	sts	0x0636, r26	; 0x800636 <thermal_model::warning_state+0x2>
   2711c:	b0 93 37 06 	sts	0x0637, r27	; 0x800637 <thermal_model::warning_state+0x3>
        (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 <temp_mgr_isr() [clone .lto_priv.422]+0x408>
   27128:	3f c0       	rjmp	.+126    	; 0x271a8 <temp_mgr_isr() [clone .lto_priv.422]+0x486>

    uint32_t stamp = _millis();
   2712a:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
    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 <current_temperature_isr>
   2716c:	90 91 17 05 	lds	r25, 0x0517	; 0x800517 <current_temperature_isr+0x1>
   27170:	a0 91 18 05 	lds	r26, 0x0518	; 0x800518 <current_temperature_isr+0x2>
   27174:	b0 91 19 05 	lds	r27, 0x0519	; 0x800519 <current_temperature_isr+0x3>
   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 <current_temperature_ambient_isr>
   2718c:	90 91 20 06 	lds	r25, 0x0620	; 0x800620 <current_temperature_ambient_isr+0x1>
   27190:	a0 91 21 06 	lds	r26, 0x0621	; 0x800621 <current_temperature_ambient_isr+0x2>
   27194:	b0 91 22 06 	lds	r27, 0x0622	; 0x800622 <current_temperature_ambient_isr+0x3>
   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_isr() [clone .lto_priv.422]+0x4b2>
        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 <temp_mgr_pid()>
        // *** end of 'common' part
#ifdef AMBIENT_THERMISTOR
    }
    else {
        // ambient temperature is standard
        check_min_temp_heater0();
   271ce:	0f 94 84 30 	call	0x26108	; 0x26108 <check_min_temp_heater0()>
   271d2:	8e ce       	rjmp	.-740    	; 0x26ef0 <temp_mgr_isr() [clone .lto_priv.422]+0x1ce>
#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 <adc_start_cycle()>

    // 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 <temp_mgr_isr() [clone .lto_priv.422]>
    (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 <manage_heater()>:
}

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 <temp_meas_ready>
   27290:	88 23       	and	r24, r24
   27292:	09 f4       	brne	.+2      	; 0x27296 <manage_heater()+0x2e>
   27294:	bb c0       	rjmp	.+374    	; 0x2740c <manage_heater()+0x1a4>
        return;

    // syncronize temperatures with isr
    updateTemperatures();
   27296:	0f 94 55 33 	call	0x266aa	; 0x266aa <updateTemperatures()>

#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 <thermal_model::warning_state+0x4>
   2729e:	80 ff       	sbrs	r24, 0
   272a0:	51 c0       	rjmp	.+162    	; 0x27344 <manage_heater()+0xdc>
}

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 <TempMgrGuard::TempMgrGuard()>
        dT_err = warning_state.dT_err;
   272ba:	c0 90 34 06 	lds	r12, 0x0634	; 0x800634 <thermal_model::warning_state>
   272be:	d0 90 35 06 	lds	r13, 0x0635	; 0x800635 <thermal_model::warning_state+0x1>
   272c2:	e0 90 36 06 	lds	r14, 0x0636	; 0x800636 <thermal_model::warning_state+0x2>
   272c6:	f0 90 37 06 	lds	r15, 0x0637	; 0x800637 <thermal_model::warning_state+0x3>
{
    // 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 <TempMgrGuard::~TempMgrGuard()>
        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 <printf_P>

    static bool first = true;
    if(warning_state.assert) {
   272fe:	90 91 38 06 	lds	r25, 0x0638	; 0x800638 <thermal_model::warning_state+0x4>
   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 <manage_heater()+0x1d2>
        if (first) {
   27314:	90 91 a3 02 	lds	r25, 0x02A3	; 0x8002a3 <thermal_model::handle_warning()::first>
   27318:	99 23       	and	r25, r25
   2731a:	09 f4       	brne	.+2      	; 0x2731e <manage_heater()+0xb6>
   2731c:	87 c0       	rjmp	.+270    	; 0x2742c <manage_heater()+0x1c4>
            if(warn_beep) {
   2731e:	88 23       	and	r24, r24
   27320:	79 f0       	breq	.+30     	; 0x27340 <manage_heater()+0xd8>
                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 <lang_get_translation>
   2732a:	61 e0       	ldi	r22, 0x01	; 1
   2732c:	0e 94 d6 f1 	call	0x1e3ac	; 0x1e3ac <lcd_setalertstatuspgm(char const*, unsigned char)>
                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 <thermal_model::handle_warning()::first>
    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 <manage_heater()+0x106>
#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 <manage_heater()+0xf4>
   2735a:	82 c0       	rjmp	.+260    	; 0x27460 <manage_heater()+0x1f8>
   2735c:	82 30       	cpi	r24, 0x02	; 2
   2735e:	08 f0       	brcs	.+2      	; 0x27362 <manage_heater()+0xfa>
   27360:	1d c1       	rjmp	.+570    	; 0x2759c <manage_heater()+0x334>
   27362:	88 23       	and	r24, r24
   27364:	09 f4       	brne	.+2      	; 0x27368 <manage_heater()+0x100>
   27366:	f4 c0       	rjmp	.+488    	; 0x27550 <manage_heater()+0x2e8>
   27368:	81 30       	cpi	r24, 0x01	; 1
   2736a:	09 f4       	brne	.+2      	; 0x2736e <manage_heater()+0x106>
   2736c:	94 c0       	rjmp	.+296    	; 0x27496 <manage_heater()+0x22e>
    // handle temperature errors
    if(temp_error_state.v)
        handle_temp_error();

    // periodically check fans
    checkFans();
   2736e:	0e 94 9a 7f 	call	0xff34	; 0xff34 <checkFans()>
}

#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 <manage_heater()+0x114>
   2737a:	48 c0       	rjmp	.+144    	; 0x2740c <manage_heater()+0x1a4>

    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 <manage_heater()+0x122>
   27388:	41 c0       	rjmp	.+130    	; 0x2740c <manage_heater()+0x1a4>
    // 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 <TempMgrGuard::TempMgrGuard()>
        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 <TempMgrGuard::~TempMgrGuard()>
        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 <printf_P>
   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 <manage_heater()+0x1ca>
   27430:	89 cf       	rjmp	.-238    	; 0x27344 <manage_heater()+0xdc>
   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 <manage_heater()+0xdc>
        }
    } else {
        // warning cleared, reset state
        warning_state.warning = false;
   2743a:	90 91 38 06 	lds	r25, 0x0638	; 0x800638 <thermal_model::warning_state+0x4>
   2743e:	9e 7f       	andi	r25, 0xFE	; 254
   27440:	90 93 38 06 	sts	0x0638, r25	; 0x800638 <thermal_model::warning_state+0x4>
        if(warn_beep) WRITE(BEEPER, LOW);
   27444:	88 23       	and	r24, r24
   27446:	41 f0       	breq	.+16     	; 0x27458 <manage_heater()+0x1f0>
   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 <thermal_model::handle_warning()::first>
   2745e:	72 cf       	rjmp	.-284    	; 0x27344 <manage_heater()+0xdc>
#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 <manage_heater()+0x1fe>
   27464:	84 cf       	rjmp	.-248    	; 0x2736e <manage_heater()+0x106>
#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 <manage_heater()+0x36e>
            if(IsStopped() == false) {
   2746e:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   27472:	81 11       	cpse	r24, r1
   27474:	04 c0       	rjmp	.+8      	; 0x2747e <manage_heater()+0x216>
                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 <serialprintlnPGM(char const*)>
            }
            ThermalStop(true);
   2747e:	81 e0       	ldi	r24, 0x01	; 1
   27480:	0e 94 44 79 	call	0xf288	; 0xf288 <ThermalStop(bool)>
            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 <manage_heater()+0x106>
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 <manage_heater()+0x2b2>
   274a4:	58 f0       	brcs	.+22     	; 0x274bc <manage_heater()+0x254>
   274a6:	82 30       	cpi	r24, 0x02	; 2
   274a8:	09 f0       	breq	.+2      	; 0x274ac <manage_heater()+0x244>
   274aa:	61 cf       	rjmp	.-318    	; 0x2736e <manage_heater()+0x106>
    }
    ThermalStop();
}

static void ambient_min_temp_error(void) {
    if(IsStopped() == false) {
   274ac:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   274b0:	81 11       	cpse	r24, r1
   274b2:	14 c0       	rjmp	.+40     	; 0x274dc <manage_heater()+0x274>
        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 <manage_heater()+0x270>
    // 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 <manage_heater()+0x27c>
                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 <Stopped>
   274d0:	81 11       	cpse	r24, r1
   274d2:	04 c0       	rjmp	.+8      	; 0x274dc <manage_heater()+0x274>
        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 <temp_error_messagepgm(char const*, unsigned char)>
        prusa_statistics(92);
    }
    ThermalStop();
   274dc:	80 e0       	ldi	r24, 0x00	; 0
   274de:	0e 94 44 79 	call	0xf288	; 0xf288 <ThermalStop(bool)>
   274e2:	45 cf       	rjmp	.-374    	; 0x2736e <manage_heater()+0x106>
                // 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 <current_temperature>
   27504:	50 91 b0 0d 	lds	r21, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   27508:	60 91 b1 0d 	lds	r22, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   2750c:	70 91 b2 0d 	lds	r23, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <alert_automaton_mintemp::step(float, float)>
   27518:	2a cf       	rjmp	.-428    	; 0x2736e <manage_heater()+0x106>
                // 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 <manage_heater()+0x2ca>
    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 <Stopped>
   27526:	81 11       	cpse	r24, r1
   27528:	d9 cf       	rjmp	.-78     	; 0x274dc <manage_heater()+0x274>
        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 <manage_heater()+0x270>
            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 <current_temperature_bed>
   27536:	50 91 ee 04 	lds	r21, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   2753a:	60 91 ef 04 	lds	r22, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   2753e:	70 91 f0 04 	lds	r23, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <manage_heater()+0x2ac>
            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 <manage_heater()+0x324>
   2755e:	58 f0       	brcs	.+22     	; 0x27576 <manage_heater()+0x30e>
   27560:	82 30       	cpi	r24, 0x02	; 2
   27562:	09 f0       	breq	.+2      	; 0x27566 <manage_heater()+0x2fe>
   27564:	04 cf       	rjmp	.-504    	; 0x2736e <manage_heater()+0x106>
}


#ifdef AMBIENT_THERMISTOR
static void ambient_max_temp_error(void) {
    if(IsStopped() == false) {
   27566:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   2756a:	81 11       	cpse	r24, r1
   2756c:	b7 cf       	rjmp	.-146    	; 0x274dc <manage_heater()+0x274>
        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 <manage_heater()+0x270>
        }
        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 <Stopped>
   27582:	81 11       	cpse	r24, r1
   27584:	ab cf       	rjmp	.-170    	; 0x274dc <manage_heater()+0x274>
        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 <manage_heater()+0x270>
    }
    ThermalStop();
}

static void bed_max_temp_error(void) {
    if(IsStopped() == false) {
   2758c:	80 91 10 05 	lds	r24, 0x0510	; 0x800510 <Stopped>
   27590:	81 11       	cpse	r24, r1
   27592:	a4 cf       	rjmp	.-184    	; 0x274dc <manage_heater()+0x274>
        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 <manage_heater()+0x270>
#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 <manage_heater()+0x344>
   275aa:	e1 ce       	rjmp	.-574    	; 0x2736e <manage_heater()+0x106>
        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 <manage_heater()+0x360>
   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 <manage_heater()+0x368>
   275ce:	80 e0       	ldi	r24, 0x00	; 0
   275d0:	0f 94 16 20 	call	0x2402c	; 0x2402c <temp_runaway_stop(bool, bool)>
   275d4:	cc ce       	rjmp	.-616    	; 0x2736e <manage_heater()+0x106>
                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 <target_temperature_bed>
   275ee:	90 91 72 06 	lds	r25, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   275f2:	89 2b       	or	r24, r25
   275f4:	39 f4       	brne	.+14     	; 0x27604 <manage_heater()+0x39c>
                target_temperature_bed = saved_bed_temperature;
   275f6:	80 91 ad 05 	lds	r24, 0x05AD	; 0x8005ad <saved_bed_temperature>
   275fa:	90 e0       	ldi	r25, 0x00	; 0
   275fc:	90 93 72 06 	sts	0x0672, r25	; 0x800672 <target_temperature_bed+0x1>
   27600:	80 93 71 06 	sts	0x0671, r24	; 0x800671 <target_temperature_bed>

            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 <serialprintlnPGM(char const*)>
   2760c:	b0 ce       	rjmp	.-672    	; 0x2736e <manage_heater()+0x106>

0002760e <lcd_wait_for_click_delay(unsigned int)>:
}

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 <millis2>
   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 <lcd_consume_click()>
	KEEPALIVE_STATE(PAUSED_FOR_USER);
   27640:	84 e0       	ldi	r24, 0x04	; 4
   27642:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
    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_heater()>
        manage_inactivity(true);
   2764e:	81 e0       	ldi	r24, 0x01	; 1
   27650:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
        bDelayed = ((_millis()/1000-nTime0) > nDelay);
   27654:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <lcd_clicked()>
   27674:	81 11       	cpse	r24, r1
   27676:	07 c0       	rjmp	.+14     	; 0x27686 <lcd_wait_for_click_delay(unsigned int)+0x78>
   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 <lcd_wait_for_click_delay(unsigned int)+0x3c>
   27682:	81 e0       	ldi	r24, 0x01	; 1
   27684:	07 c0       	rjmp	.+14     	; 0x27694 <lcd_wait_for_click_delay(unsigned int)+0x86>
	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 <lcd_wait_for_click_delay(unsigned int)+0x86>
   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 <busy_state>
            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 <thermal_model_cal::waiting_handler() [clone .lto_priv.423]>:
#endif
}

static void waiting_handler()
{
    manage_heater();
   276b8:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
    host_keepalive();
   276bc:	0e 94 3f 7f 	call	0xfe7e	; 0xfe7e <host_keepalive()>
    host_autoreport();
   276c0:	0e 94 f0 78 	call	0xf1e0	; 0xf1e0 <host_autoreport()>
    checkFans();
   276c4:	0e 94 9a 7f 	call	0xff34	; 0xff34 <checkFans()>
    lcd_update(0);
   276c8:	80 e0       	ldi	r24, 0x00	; 0
   276ca:	0c 94 3f 6e 	jmp	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>

000276ce <thermal_model_cal::wait_temp() [clone .lto_priv.559]>:
    }
}

static void __attribute__((noinline)) wait_temp()
{
    while(current_temperature[0] < (target_temperature[0] - TEMP_HYSTERESIS)) {
   276ce:	60 91 b5 0d 	lds	r22, 0x0DB5	; 0x800db5 <target_temperature>
   276d2:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   276ee:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   276f2:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   276f6:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   276fa:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   276fe:	87 ff       	sbrs	r24, 7
   27700:	07 c0       	rjmp	.+14     	; 0x27710 <thermal_model_cal::wait_temp() [clone .lto_priv.559]+0x42>
        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 <thermal_model_cal::wait_temp() [clone .lto_priv.559]+0x42>
        waiting_handler();
   2770a:	0f 94 5c 3b 	call	0x276b8	; 0x276b8 <thermal_model_cal::waiting_handler() [clone .lto_priv.423]>
   2770e:	df cf       	rjmp	.-66     	; 0x276ce <thermal_model_cal::wait_temp() [clone .lto_priv.559]>
    }
}
   27710:	08 95       	ret

00027712 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]>:
    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 <millis2>
   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 <millis2>
   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 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]+0x3a>
        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 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]+0x3a>
        waiting_handler();
   27746:	0f 94 5c 3b 	call	0x276b8	; 0x276b8 <thermal_model_cal::waiting_handler() [clone .lto_priv.423]>
   2774a:	f2 cf       	rjmp	.-28     	; 0x27730 <thermal_model_cal::wait(unsigned int) [clone .lto_priv.558]+0x1e>
    }
}
   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 <updatePID()>:
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 <cs+0x6c>
   2775a:	30 91 2a 0e 	lds	r19, 0x0E2A	; 0x800e2a <cs+0x6d>
   2775e:	40 91 2b 0e 	lds	r20, 0x0E2B	; 0x800e2b <cs+0x6e>
   27762:	50 91 2c 0e 	lds	r21, 0x0E2C	; 0x800e2c <cs+0x6f>
   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 <cs+0x78>
   27786:	30 91 36 0e 	lds	r19, 0x0E36	; 0x800e36 <cs+0x79>
   2778a:	40 91 37 0e 	lds	r20, 0x0E37	; 0x800e37 <cs+0x7a>
   2778e:	50 91 38 0e 	lds	r21, 0x0E38	; 0x800e38 <cs+0x7b>
   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 <PID_autotune(float, int, int)>:
#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 <disable_heater()>
      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 <pid_number_of_cycles+0x1>
   27802:	20 93 46 06 	sts	0x0646, r18	; 0x800646 <pid_number_of_cycles>
  float input = 0.0;
  pid_cycle=0;
   27806:	10 92 49 06 	sts	0x0649, r1	; 0x800649 <pid_cycle+0x1>
   2780a:	10 92 48 06 	sts	0x0648, r1	; 0x800648 <pid_cycle>
  bool heating = true;

  unsigned long temp_millis = _millis();
   2780e:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <PID_autotune(float, int, int)+0x26c>
   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 <millis2>
   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 <PID_autotune(float, int, int)+0x8a>
   27838:	8a c2       	rjmp	.+1300   	; 0x27d4e <PID_autotune(float, int, int)+0x59e>
		  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 <serialprintlnPGM(char const*)>
   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 <PID_autotune(float, int, int)+0xa8>
   27856:	e5 c0       	rjmp	.+458    	; 0x27a22 <PID_autotune(float, int, int)+0x272>
  {
     soft_pwm_bed = (MAX_BED_POWER)/2;
   27858:	20 93 1c 06 	sts	0x061C, r18	; 0x80061c <soft_pwm_bed>
     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 <target_temperature_bed+0x1>
   27860:	60 93 71 06 	sts	0x0671, r22	; 0x800671 <target_temperature_bed>

  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 <temp_meas_ready>
   278c8:	48 a7       	std	Y+40, r20	; 0x28
   278ca:	44 23       	and	r20, r20
   278cc:	09 f4       	brne	.+2      	; 0x278d0 <PID_autotune(float, int, int)+0x120>
   278ce:	2c c2       	rjmp	.+1112   	; 0x27d28 <PID_autotune(float, int, int)+0x578>
      updateTemperatures();
   278d0:	0f 94 55 33 	call	0x266aa	; 0x266aa <updateTemperatures()>

      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 <PID_autotune(float, int, int)+0x12c>
   278da:	aa c0       	rjmp	.+340    	; 0x27a30 <PID_autotune(float, int, int)+0x280>
   278dc:	00 91 af 0d 	lds	r16, 0x0DAF	; 0x800daf <current_temperature>
   278e0:	10 91 b0 0d 	lds	r17, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   278e4:	50 91 b1 0d 	lds	r21, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   278e8:	58 ab       	std	Y+48, r21	; 0x30
   278ea:	80 91 b2 0d 	lds	r24, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <PID_autotune(float, int, int)+0x162>
   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 <PID_autotune(float, int, int)+0x184>
   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 <millis2>
   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 <PID_autotune(float, int, int)+0x1b2>
        checkExtruderAutoFans();
   27952:	0e 94 3f 75 	call	0xea7e	; 0xea7e <checkExtruderAutoFans()>
        extruder_autofan_last_check = _millis();
   27956:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <PID_autotune(float, int, int)+0x1ba>
   27968:	4c c0       	rjmp	.+152    	; 0x27a02 <PID_autotune(float, int, int)+0x252>
   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 <PID_autotune(float, int, int)+0x1d2>
   27980:	d3 c1       	rjmp	.+934    	; 0x27d28 <PID_autotune(float, int, int)+0x578>
        if(_millis() - t2 > 5000) {
   27982:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <PID_autotune(float, int, int)+0x1f2>
   279a0:	c3 c1       	rjmp	.+902    	; 0x27d28 <PID_autotune(float, int, int)+0x578>
   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 <PID_autotune(float, int, int)+0x216>
   279c4:	40 c0       	rjmp	.+128    	; 0x27a46 <PID_autotune(float, int, int)+0x296>
            soft_pwm_bed = (bias - d) >> 1;
   279c6:	80 93 1c 06 	sts	0x061C, r24	; 0x80061c <soft_pwm_bed>
		  }
          else
            soft_pwm[extruder] = (bias - d) >> 1;
          t1=_millis();
   279ca:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <PID_autotune(float, int, int)+0x29c>
        if(_millis() - t1 > 5000) {
   27a18:	1a 8e       	std	Y+26, r1	; 0x1a
   27a1a:	86 c1       	rjmp	.+780    	; 0x27d28 <PID_autotune(float, int, int)+0x578>

  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 <PID_autotune(float, int, int)+0x72>
     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 <target_temperature+0x1>
   27a2a:	60 93 b5 0d 	sts	0x0DB5, r22	; 0x800db5 <target_temperature>
   27a2e:	1a cf       	rjmp	.-460    	; 0x27864 <PID_autotune(float, int, int)+0xb4>
    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 <current_temperature_bed>
   27a34:	10 91 ee 04 	lds	r17, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   27a38:	90 91 ef 04 	lds	r25, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   27a3c:	98 ab       	std	Y+48, r25	; 0x30
   27a3e:	a0 91 f0 04 	lds	r26, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   27a42:	af a7       	std	Y+47, r26	; 0x2f
   27a44:	55 cf       	rjmp	.-342    	; 0x278f0 <PID_autotune(float, int, int)+0x140>
          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 <PID_autotune(float, int, int)+0x21a>
          t_high=t1 - t2;
          max=temp;
        }
      }
      if(heating == false && input < temp) {
        if(_millis() - t1 > 5000) {
   27a4c:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <PID_autotune(float, int, int)+0x268>
          heating=true;
          t2=_millis();
   27a6a:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <pid_cycle>
   27a7a:	90 91 49 06 	lds	r25, 0x0649	; 0x800649 <pid_cycle+0x1>
   27a7e:	18 16       	cp	r1, r24
   27a80:	19 06       	cpc	r1, r25
   27a82:	0c f0       	brlt	.+2      	; 0x27a86 <PID_autotune(float, int, int)+0x2d6>
   27a84:	2c c1       	rjmp	.+600    	; 0x27cde <PID_autotune(float, int, int)+0x52e>
      }
      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 <PID_autotune(float, int, int)+0x33a>
   27ae8:	3c c1       	rjmp	.+632    	; 0x27d62 <PID_autotune(float, int, int)+0x5b2>
   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 <PID_autotune(float, int, int)+0x354>
   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 <PID_autotune(float, int, int)+0x360>
   27b0e:	37 c1       	rjmp	.+622    	; 0x27d7e <PID_autotune(float, int, int)+0x5ce>
   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 <serialprintPGM(char const*)>
   27b30:	c7 01       	movw	r24, r14
   27b32:	b6 01       	movw	r22, r12
   27b34:	0f 94 5f d5 	call	0x3aabe	; 0x3aabe <MarlinSerial::print(long, int) [clone .part.1]>
            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 <serialprintPGM(char const*)>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
            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 <serialprintPGM(char const*)>
  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 <MarlinSerial::printFloat(double, unsigned char)>
            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 <serialprintPGM(char const*)>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>
            if(pid_cycle > 2) {
   27b76:	80 91 48 06 	lds	r24, 0x0648	; 0x800648 <pid_cycle>
   27b7a:	90 91 49 06 	lds	r25, 0x0649	; 0x800649 <pid_cycle+0x1>
   27b7e:	03 97       	sbiw	r24, 0x03	; 3
   27b80:	0c f4       	brge	.+2      	; 0x27b84 <PID_autotune(float, int, int)+0x3d4>
   27b82:	ad c0       	rjmp	.+346    	; 0x27cde <PID_autotune(float, int, int)+0x52e>
              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 <serialprintPGM(char const*)>
   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 <MarlinSerial::printFloat(double, unsigned char)>
              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 <serialprintPGM(char const*)>
   27c0e:	c3 01       	movw	r24, r6
   27c10:	b2 01       	movw	r22, r4
   27c12:	0f 94 ab 75 	call	0x2eb56	; 0x2eb56 <MarlinSerial::println(double, int) [clone .constprop.367]>
              _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 <serialprintlnPGM(char const*)>
              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 <serialprintPGM(char const*)>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>
              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 <serialprintPGM(char const*)>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>
              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 <serialprintPGM(char const*)>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>
   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 <PID_autotune(float, int, int)+0x54e>
   27cfc:	45 c0       	rjmp	.+138    	; 0x27d88 <PID_autotune(float, int, int)+0x5d8>
		  {
            soft_pwm_bed = (bias + d) >> 1;
   27cfe:	80 93 1c 06 	sts	0x061C, r24	; 0x80061c <soft_pwm_bed>
		  }
          else
            soft_pwm[extruder] = (bias + d) >> 1;
          pid_cycle++;
   27d02:	80 91 48 06 	lds	r24, 0x0648	; 0x800648 <pid_cycle>
   27d06:	90 91 49 06 	lds	r25, 0x0649	; 0x800649 <pid_cycle+0x1>
   27d0a:	01 96       	adiw	r24, 0x01	; 1
   27d0c:	90 93 49 06 	sts	0x0649, r25	; 0x800649 <pid_cycle+0x1>
   27d10:	80 93 48 06 	sts	0x0648, r24	; 0x800648 <pid_cycle>
          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 <PID_autotune(float, int, int)+0x5de>
      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 <serialprintlnPGM(char const*)>
	  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 <pid_cycle+0x1>
   27d5c:	10 92 48 06 	sts	0x0648, r1	; 0x800648 <pid_cycle>
   27d60:	98 c0       	rjmp	.+304    	; 0x27e92 <PID_autotune(float, int, int)+0x6e2>
          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 <PID_autotune(float, int, int)+0x378>
   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 <PID_autotune(float, int, int)+0x378>
          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 <PID_autotune(float, int, int)+0x552>
      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 <millis2>
   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 <PID_autotune(float, int, int)+0x652>
      int p;
      if (extruder<0){
        p=soft_pwm_bed;
   27dac:	a0 90 1c 06 	lds	r10, 0x061C	; 0x80061c <soft_pwm_bed>
   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 <PID_autotune(float, int, int)+0x616>
        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 <serialprintPGM(char const*)>
   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 <MarlinSerial::printFloat(double, unsigned char)>
      }

      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 <serialprintPGM(char const*)>
      SERIAL_PROTOCOLLN(p);
   27dde:	c5 01       	movw	r24, r10
   27de0:	0f 94 ec 75 	call	0x2ebd8	; 0x2ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>
		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 <PID_autotune(float, int, int)+0x63c>
   27dea:	6c c0       	rjmp	.+216    	; 0x27ec4 <PID_autotune(float, int, int)+0x714>
			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 <PID_autotune(float, int, int)+0x69e>
			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 <millis2>
   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 <millis2>
   27e06:	4b 01       	movw	r8, r22
   27e08:	5c 01       	movw	r10, r24
   27e0a:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <PID_autotune(float, int, int)+0x698>
   27e46:	47 c0       	rjmp	.+142    	; 0x27ed6 <PID_autotune(float, int, int)+0x726>
      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 <PID_autotune(float, int, int)+0x59e>
			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 <PID_autotune(float, int, int)+0x646>
			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 <PID_autotune(float, int, int)+0x646>
				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 <temp_runaway_stop(bool, bool)>
				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 <PID_autotune(float, int, int)+0x646>
      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 <pid_cycle>
   27eda:	90 91 49 06 	lds	r25, 0x0649	; 0x800649 <pid_cycle+0x1>
   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 <PID_autotune(float, int, int)+0x73e>
      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_autotune(float, int, int)+0x59e>
	  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 <lcd_update(unsigned char)>
   27ef4:	e6 cc       	rjmp	.-1588   	; 0x278c2 <PID_autotune(float, int, int)+0x112>

00027ef6 <Stopwatch::duration()>:
  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 <Stopwatch::state>
   27efe:	81 30       	cpi	r24, 0x01	; 1
   27f00:	19 f5       	brne	.+70     	; 0x27f48 <Stopwatch::duration()+0x52>
   27f02:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   27f06:	00 91 a6 05 	lds	r16, 0x05A6	; 0x8005a6 <Stopwatch::startTimestamp>
   27f0a:	10 91 a7 05 	lds	r17, 0x05A7	; 0x8005a7 <Stopwatch::startTimestamp+0x1>
   27f0e:	20 91 a8 05 	lds	r18, 0x05A8	; 0x8005a8 <Stopwatch::startTimestamp+0x2>
   27f12:	30 91 a9 05 	lds	r19, 0x05A9	; 0x8005a9 <Stopwatch::startTimestamp+0x3>
   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 <Stopwatch::accumulator>
   27f2e:	70 91 a3 05 	lds	r23, 0x05A3	; 0x8005a3 <Stopwatch::accumulator+0x1>
   27f32:	80 91 a4 05 	lds	r24, 0x05A4	; 0x8005a4 <Stopwatch::accumulator+0x2>
   27f36:	90 91 a5 05 	lds	r25, 0x05A5	; 0x8005a5 <Stopwatch::accumulator+0x3>
   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 <Stopwatch::stopTimestamp>
   27f4c:	70 91 52 06 	lds	r23, 0x0652	; 0x800652 <Stopwatch::stopTimestamp+0x1>
   27f50:	80 91 53 06 	lds	r24, 0x0653	; 0x800653 <Stopwatch::stopTimestamp+0x2>
   27f54:	90 91 54 06 	lds	r25, 0x0654	; 0x800654 <Stopwatch::stopTimestamp+0x3>
   27f58:	d6 cf       	rjmp	.-84     	; 0x27f06 <Stopwatch::duration()+0x10>

00027f5a <lcd_menu_statistics()>:
//! |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>
    lcd_timeoutToStatus.stop(); //infinite timeout
	if (printJobOngoing())
   27f7e:	0e 94 28 67 	call	0xce50	; 0xce50 <printJobOngoing()>
   27f82:	88 23       	and	r24, r24
   27f84:	09 f4       	brne	.+2      	; 0x27f88 <lcd_menu_statistics()+0x2e>
   27f86:	6e c0       	rjmp	.+220    	; 0x28064 <lcd_menu_statistics()+0x10a>
	{
		const float _met = ((float)total_filament_used) / (100000.f);
   27f88:	60 91 64 06 	lds	r22, 0x0664	; 0x800664 <total_filament_used>
   27f8c:	70 91 65 06 	lds	r23, 0x0665	; 0x800665 <total_filament_used+0x1>
   27f90:	80 91 66 06 	lds	r24, 0x0666	; 0x800666 <total_filament_used+0x2>
   27f94:	90 91 67 06 	lds	r25, 0x0667	; 0x800667 <total_filament_used+0x3>
   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 <Stopwatch::duration()>
   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_home()>
		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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
			"%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 <menu_back_if_clicked()>
            _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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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_home()>
		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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_printf_P(char const*, ...)>
			"%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 <lcd_menu_statistics()+0xe6>

0002811a <lcd_status_screen()>:
    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 <lcd_status_screen()+0x12>
   2812c:	00 d0       	rcall	.+0      	; 0x2812e <lcd_status_screen()+0x14>
   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 <lcd_encoder>
   2813a:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   2813e:	00 97       	sbiw	r24, 0x00	; 0
   28140:	e1 f1       	breq	.+120    	; 0x281ba <lcd_status_screen()+0xa0>
    {
        const int16_t initial_feedmultiply = feedmultiply;
   28142:	20 91 39 02 	lds	r18, 0x0239	; 0x800239 <feedmultiply>
   28146:	30 91 3a 02 	lds	r19, 0x023A	; 0x80023a <feedmultiply+0x1>
        // 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 <lcd_status_screen()+0x48>
   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 <lcd_status_screen()+0x5c>
            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 <lcd_status_screen()+0x60>
#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 <lcd_status_screen()+0x50>
   28168:	55 c0       	rjmp	.+170    	; 0x28214 <lcd_status_screen()+0xfa>
            (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 <lcd_status_screen()+0x42>
        {
            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 <feedmultiply+0x1>
   2817e:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>

        if (initial_feedmultiply != feedmultiply) {
   28182:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
   28186:	90 91 3a 02 	lds	r25, 0x023A	; 0x80023a <feedmultiply+0x1>
   2818a:	82 17       	cp	r24, r18
   2818c:	93 07       	cpc	r25, r19
   2818e:	a9 f0       	breq	.+42     	; 0x281ba <lcd_status_screen()+0xa0>
            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 <lcd_status_screen()+0x82>
   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 <lcd_status_screen()+0x8c>
   281a2:	8a e0       	ldi	r24, 0x0A	; 10
   281a4:	90 e0       	ldi	r25, 0x00	; 0
   281a6:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <feedmultiply+0x1>
   281aa:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <feedmultiply>
            lcd_encoder = 0; // Consume rotation event
   281ae:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   281b2:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
            refresh_saved_feedrate_multiplier_in_ram();
   281b6:	0e 94 7b 64 	call	0xc8f6	; 0xc8f6 <refresh_saved_feedrate_multiplier_in_ram()>
        }
    }
#endif //ULTIPANEL_FEEDMULTIPLY

	if (lcd_draw_update) {
   281ba:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   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 <lcd_status_screen()::lcd_status_update_delay>
	}

	if (lcd_status_update_delay)
   281c4:	10 91 50 06 	lds	r17, 0x0650	; 0x800650 <lcd_status_screen()::lcd_status_update_delay>
   281c8:	11 23       	and	r17, r17
   281ca:	91 f1       	breq	.+100    	; 0x28230 <lcd_status_screen()+0x116>
		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 <lcd_status_screen()::lcd_status_update_delay>

		if (lcd_commands_type != LcdCommands::Idle)
			lcd_commands();
	}

    if (!menu_is_any_block() && lcd_clicked()) {
   281d4:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <menu_block_mask>
   281d8:	81 11       	cpse	r24, r1
   281da:	0d c0       	rjmp	.+26     	; 0x281f6 <lcd_status_screen()+0xdc>
   281dc:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   281e0:	88 23       	and	r24, r24
   281e2:	49 f0       	breq	.+18     	; 0x281f6 <lcd_status_screen()+0xdc>
		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_depth>
		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 <menu_submenu(void (*)(), bool)>
		lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
   281f2:	0e 94 24 6f 	call	0xde48	; 0xde48 <lcd_refresh()>
	}
}
   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 <lcd_status_screen()+0x106>
            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 <lcd_status_screen()+0x60>
        }
        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 <lcd_status_screen()+0x110>
   28228:	ac cf       	rjmp	.-168    	; 0x28182 <lcd_status_screen()+0x68>
            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 <lcd_status_screen()+0x60>
	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 <lcd_status_screen()::lcd_status_update_delay>
		ReInitLCD++;
   28236:	80 91 4f 06 	lds	r24, 0x064F	; 0x80064f <ReInitLCD>
   2823a:	8f 5f       	subi	r24, 0xFF	; 255
   2823c:	80 93 4f 06 	sts	0x064F, r24	; 0x80064f <ReInitLCD>
		if (ReInitLCD == 30)
   28240:	8e 31       	cpi	r24, 0x1E	; 30
   28242:	09 f0       	breq	.+2      	; 0x28246 <lcd_status_screen()+0x12c>
   28244:	9f c0       	rjmp	.+318    	; 0x28384 <lcd_status_screen()+0x26a>
		{
			ReInitLCD = 0 ;
   28246:	10 92 4f 06 	sts	0x064F, r1	; 0x80064f <ReInitLCD>
#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_refresh()>
    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_frame_start()>
	lcd_home(); //line 0
   28256:	0e 94 a4 6e 	call	0xdd48	; 0xdd48 <lcd_home()>
  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 <target_temperature>
   2825e:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   2828c:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   28290:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   28294:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <lcdui_print_temp(char, int, int)>

	lcd_space(3); //3 spaces
   282a8:	83 e0       	ldi	r24, 0x03	; 3
   282aa:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>
}

// 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 <custom_message_type>
   282b2:	81 30       	cpi	r24, 0x01	; 1
   282b4:	09 f0       	breq	.+2      	; 0x282b8 <lcd_status_screen()+0x19e>
   282b6:	6e c0       	rjmp	.+220    	; 0x28394 <lcd_status_screen()+0x27a>
        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_puts_P(char const*)>
	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 <lcd_set_cursor(unsigned char, unsigned char)>
};

FORCE_INLINE float degTargetBed() {
  return target_temperature_bed;
   282c8:	60 91 71 06 	lds	r22, 0x0671	; 0x800671 <target_temperature_bed>
   282cc:	70 91 72 06 	lds	r23, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   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 <current_temperature_bed>
   282fa:	70 91 ee 04 	lds	r23, 0x04EE	; 0x8004ee <current_temperature_bed+0x1>
   282fe:	80 91 ef 04 	lds	r24, 0x04EF	; 0x8004ef <current_temperature_bed+0x2>
   28302:	90 91 f0 04 	lds	r25, 0x04F0	; 0x8004f0 <current_temperature_bed+0x3>
   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 <lcdui_print_temp(char, int, int)>

	lcd_space(3); //3 spaces
   28316:	83 e0       	ldi	r24, 0x03	; 3
   28318:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>
#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 <feedmultiply+0x1>
   28320:	8f 93       	push	r24
   28322:	80 91 39 02 	lds	r24, 0x0239	; 0x800239 <feedmultiply>
   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_printf_P(char const*, ...)>
	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 <lcd_space(unsigned char)>
#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 <lcd_set_cursor(unsigned char, unsigned char)>
}

// 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 <usb_timer>
   28352:	e0 90 8f 14 	lds	r14, 0x148F	; 0x80148f <card+0x2>
   28356:	81 11       	cpse	r24, r1
   28358:	3e c0       	rjmp	.+124    	; 0x283d6 <lcd_status_screen()+0x2bc>
   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 <lcd_status_screen()+0x2c4>
   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 <printer_active()>
   28372:	f8 2e       	mov	r15, r24
   28374:	88 23       	and	r24, r24
   28376:	e1 f1       	breq	.+120    	; 0x283f0 <lcd_status_screen()+0x2d6>
   28378:	80 91 ae 02 	lds	r24, 0x02AE	; 0x8002ae <print_percent_done_normal>
   2837c:	8f 3f       	cpi	r24, 0xFF	; 255
   2837e:	89 f5       	brne	.+98     	; 0x283e2 <lcd_status_screen()+0x2c8>
   28380:	f1 2c       	mov	r15, r1
   28382:	36 c0       	rjmp	.+108    	; 0x283f0 <lcd_status_screen()+0x2d6>
			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_status_screen()+0x138>
    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 <lcd_begin(unsigned char) [clone .lto_priv.433]>
   28392:	5d cf       	rjmp	.-326    	; 0x2824e <lcd_status_screen()+0x134>
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 <axis_known_position+0x2>
   28398:	88 23       	and	r24, r24
   2839a:	d9 f0       	breq	.+54     	; 0x283d2 <lcd_status_screen()+0x2b8>
   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 <current_position+0xb>
   283a6:	8f 93       	push	r24
   283a8:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   283ac:	8f 93       	push	r24
   283ae:	80 91 9a 06 	lds	r24, 0x069A	; 0x80069a <current_position+0x9>
   283b2:	8f 93       	push	r24
   283b4:	80 91 99 06 	lds	r24, 0x0699	; 0x800699 <current_position+0x8>
   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 <lcd_printf_P(char const*, ...)>
   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 <lcd_status_screen()+0x1a6>
   283d2:	8f e3       	ldi	r24, 0x3F	; 63
   283d4:	e4 cf       	rjmp	.-56     	; 0x2839e <lcd_status_screen()+0x284>
}

// 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 <lcd_status_screen()+0x254>
	if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating
   283e2:	80 91 e1 03 	lds	r24, 0x03E1	; 0x8003e1 <heating_status>

// 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 <lcd_status_screen()+0x2d6>
   283ee:	bb c0       	rjmp	.+374    	; 0x28566 <lcd_status_screen()+0x44c>
	{
		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 <eeprom_read_byte>
   283f8:	08 2f       	mov	r16, r24
		const int8_t nextSheet = eeprom_next_initialized_sheet(sheetNR);
   283fa:	0e 94 e7 75 	call	0xebce	; 0xebce <eeprom_next_initialized_sheet(signed char)>
		if ((nextSheet >= 0) && (sheetNR != nextSheet))
   283fe:	87 fd       	sbrc	r24, 7
   28400:	b2 c0       	rjmp	.+356    	; 0x28566 <lcd_status_screen()+0x44c>
   28402:	08 17       	cp	r16, r24
   28404:	09 f4       	brne	.+2      	; 0x28408 <lcd_status_screen()+0x2ee>
   28406:	af c0       	rjmp	.+350    	; 0x28566 <lcd_status_screen()+0x44c>
		{
			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 <eeprom_read_block>
			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 <lcd_printf_P(char const*, ...)>
   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 <MMU2::mmu2+0x6f>
   28442:	81 30       	cpi	r24, 0x01	; 1
   28444:	09 f0       	breq	.+2      	; 0x28448 <lcd_status_screen()+0x32e>
   28446:	e9 c0       	rjmp	.+466    	; 0x2861a <lcd_status_screen()+0x500>
        // Print extruder status (5 chars)
        lcd_space(5 - lcdui_print_extruder());
   28448:	0f 94 24 22 	call	0x24448	; 0x24448 <lcdui_print_extruder()>
   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 <lcd_space(unsigned char)>
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 <printer_active()>
   2845a:	88 23       	and	r24, r24
   2845c:	09 f4       	brne	.+2      	; 0x28460 <lcd_status_screen()+0x346>
   2845e:	fa c0       	rjmp	.+500    	; 0x28654 <lcd_status_screen()+0x53a>
        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 <SilentModeMenu>
   28464:	88 23       	and	r24, r24
   28466:	09 f4       	brne	.+2      	; 0x2846a <lcd_status_screen()+0x350>
   28468:	da c0       	rjmp	.+436    	; 0x2861e <lcd_status_screen()+0x504>
            if (print_time_remaining_silent != PRINT_TIME_REMAINING_INIT)
   2846a:	c0 90 b5 02 	lds	r12, 0x02B5	; 0x8002b5 <print_time_remaining_silent>
   2846e:	d0 90 b6 02 	lds	r13, 0x02B6	; 0x8002b6 <print_time_remaining_silent+0x1>
                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 <print_time_to_change_silent>
   28476:	f0 90 b4 02 	lds	r15, 0x02B4	; 0x8002b4 <print_time_to_change_silent+0x1>
#ifdef TMC2130
        }
#endif //TMC2130

//#ifdef CLOCK_INTERVAL_TIME
        if (clock_interval == CLOCK_INTERVAL_TIME*2)
   2847a:	80 91 4e 06 	lds	r24, 0x064E	; 0x80064e <lcdui_print_time()::clock_interval>
   2847e:	8a 30       	cpi	r24, 0x0A	; 10
   28480:	11 f4       	brne	.+4      	; 0x28486 <lcd_status_screen()+0x36c>
            clock_interval = 0;
   28482:	10 92 4e 06 	sts	0x064E, r1	; 0x80064e <lcdui_print_time()::clock_interval>

        clock_interval++;
   28486:	80 91 4e 06 	lds	r24, 0x064E	; 0x80064e <lcdui_print_time()::clock_interval>
   2848a:	8f 5f       	subi	r24, 0xFF	; 255
   2848c:	80 93 4e 06 	sts	0x064E, r24	; 0x80064e <lcdui_print_time()::clock_interval>

        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 <lcd_status_screen()+0x386>
   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 <lcd_status_screen()+0x3a2>
            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 <lcd_status_screen()+0x390>
   284a8:	c3 c0       	rjmp	.+390    	; 0x28630 <lcd_status_screen()+0x516>
            print_t = print_tr;
            suff = 'R';
        } else
            print_t = print_job_timer.duration() / 60;
   284aa:	0f 94 7b 3f 	call	0x27ef6	; 0x27ef6 <Stopwatch::duration()>
   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 <feedmultiply>
   284c0:	50 91 3a 02 	lds	r21, 0x023A	; 0x80023a <feedmultiply+0x1>
   284c4:	44 36       	cpi	r20, 0x64	; 100
   284c6:	51 05       	cpc	r21, r1
   284c8:	09 f4       	brne	.+2      	; 0x284cc <lcd_status_screen()+0x3b2>
   284ca:	b5 c0       	rjmp	.+362    	; 0x28636 <lcd_status_screen()+0x51c>
   284cc:	c2 16       	cp	r12, r18
   284ce:	d3 06       	cpc	r13, r19
   284d0:	21 f0       	breq	.+8      	; 0x284da <lcd_status_screen()+0x3c0>
   284d2:	e2 16       	cp	r14, r18
   284d4:	f3 06       	cpc	r15, r19
   284d6:	09 f0       	breq	.+2      	; 0x284da <lcd_status_screen()+0x3c0>
   284d8:	ae c0       	rjmp	.+348    	; 0x28636 <lcd_status_screen()+0x51c>
            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 <lcd_status_screen()+0x3f8>
   28510:	94 c0       	rjmp	.+296    	; 0x2863a <lcd_status_screen()+0x520>
            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 <lcd_printf_P(char const*, ...)>
        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 <lcd_space(unsigned char)>
#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 <lcd_set_cursor(unsigned char, unsigned char)>

#ifndef DEBUG_DISABLE_LCD_STATUS_LINE
	lcdui_print_status_line();
   2854a:	0f 94 4f 2b 	call	0x2569e	; 0x2569e <lcdui_print_status_line()>

		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 <lcd_commands_type>
   28552:	88 23       	and	r24, r24
   28554:	09 f4       	brne	.+2      	; 0x28558 <lcd_status_screen()+0x43e>
   28556:	3e ce       	rjmp	.-900    	; 0x281d4 <lcd_status_screen()+0xba>
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 <planner_aborted>
   2855c:	81 11       	cpse	r24, r1
   2855e:	3a ce       	rjmp	.-908    	; 0x281d4 <lcd_status_screen()+0xba>
   28560:	0f 94 45 07 	call	0x20e8a	; 0x20e8a <lcd_commands() [clone .part.41]>
   28564:	37 ce       	rjmp	.-914    	; 0x281d4 <lcd_status_screen()+0xba>
			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 <lcd_status_screen()+0x458>
   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 <lcd_status_screen()+0x4ec>
        // 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 <lcd_printf_P(char const*, ...)>
   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 <SilentModeMenu>
   2858e:	81 11       	cpse	r24, r1
   28590:	04 c0       	rjmp	.+8      	; 0x2859a <lcd_status_screen()+0x480>
   28592:	80 91 ae 02 	lds	r24, 0x02AE	; 0x8002ae <print_percent_done_normal>
   28596:	85 36       	cpi	r24, 0x65	; 101
   28598:	f0 f1       	brcs	.+124    	; 0x28616 <lcd_status_screen()+0x4fc>
    {
        percent_done = print_percent_done_normal;
    }
    else if (print_percent_done_silent <= 100)
   2859a:	80 91 ad 02 	lds	r24, 0x02AD	; 0x8002ad <print_percent_done_silent>
   2859e:	85 36       	cpi	r24, 0x65	; 101
   285a0:	d0 f1       	brcs	.+116    	; 0x28616 <lcd_status_screen()+0x4fc>
      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 <card+0x295>
   285a6:	88 23       	and	r24, r24
   285a8:	19 f1       	breq	.+70     	; 0x285f0 <lcd_status_screen()+0x4d6>
   285aa:	80 91 9c 17 	lds	r24, 0x179C	; 0x80179c <card+0x30f>
   285ae:	90 91 9d 17 	lds	r25, 0x179D	; 0x80179d <card+0x310>
   285b2:	a0 91 9e 17 	lds	r26, 0x179E	; 0x80179e <card+0x311>
   285b6:	b0 91 9f 17 	lds	r27, 0x179F	; 0x80179f <card+0x312>
   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 <lcd_status_screen()+0x4d6>
   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 <card+0x316>
   285de:	70 91 a4 17 	lds	r23, 0x17A4	; 0x8017a4 <card+0x317>
   285e2:	80 91 a5 17 	lds	r24, 0x17A5	; 0x8017a5 <card+0x318>
   285e6:	90 91 a6 17 	lds	r25, 0x17A6	; 0x8017a6 <card+0x319>
   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 <lcd_status_screen()+0x4e6>
   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 <lcd_status_screen()+0x314>

    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_space(unsigned char)>
        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 <lcd_print(char const*)>
   28614:	ba cf       	rjmp	.-140    	; 0x2858a <lcd_status_screen()+0x470>
   28616:	18 2f       	mov	r17, r24
   28618:	eb cf       	rjmp	.-42     	; 0x285f0 <lcd_status_screen()+0x4d6>
        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 <lcd_status_screen()+0x338>
            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 <print_time_remaining_normal>
   28622:	d0 90 b2 02 	lds	r13, 0x02B2	; 0x8002b2 <print_time_remaining_normal+0x1>
                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 <print_time_to_change_normal>
   2862a:	f0 90 b0 02 	lds	r15, 0x02B0	; 0x8002b0 <print_time_to_change_normal+0x1>
   2862e:	25 cf       	rjmp	.-438    	; 0x2847a <lcd_status_screen()+0x360>
        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 <lcd_status_screen()+0x3a2>
    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 <lcd_status_screen()+0x3d6>
        }

        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 <lcd_printf_P(char const*, ...)>
   28652:	6d cf       	rjmp	.-294    	; 0x2852e <lcd_status_screen()+0x414>
    } 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 <lcd_printf_P(char const*, ...)>
   28660:	0f 90       	pop	r0
   28662:	0f 90       	pop	r0
   28664:	69 cf       	rjmp	.-302    	; 0x28538 <lcd_status_screen()+0x41e>

00028666 <Stopwatch::reset()>:
  reset();
  if ((accumulator = with_time)) state = RUNNING;
}

void Stopwatch::reset() {
  state = STOPPED;
   28666:	10 92 9b 03 	sts	0x039B, r1	; 0x80039b <Stopwatch::state>
  startTimestamp = 0;
   2866a:	10 92 a6 05 	sts	0x05A6, r1	; 0x8005a6 <Stopwatch::startTimestamp>
   2866e:	10 92 a7 05 	sts	0x05A7, r1	; 0x8005a7 <Stopwatch::startTimestamp+0x1>
   28672:	10 92 a8 05 	sts	0x05A8, r1	; 0x8005a8 <Stopwatch::startTimestamp+0x2>
   28676:	10 92 a9 05 	sts	0x05A9, r1	; 0x8005a9 <Stopwatch::startTimestamp+0x3>
  stopTimestamp = 0;
   2867a:	10 92 51 06 	sts	0x0651, r1	; 0x800651 <Stopwatch::stopTimestamp>
   2867e:	10 92 52 06 	sts	0x0652, r1	; 0x800652 <Stopwatch::stopTimestamp+0x1>
   28682:	10 92 53 06 	sts	0x0653, r1	; 0x800653 <Stopwatch::stopTimestamp+0x2>
   28686:	10 92 54 06 	sts	0x0654, r1	; 0x800654 <Stopwatch::stopTimestamp+0x3>
  accumulator = 0;
   2868a:	10 92 a2 05 	sts	0x05A2, r1	; 0x8005a2 <Stopwatch::accumulator>
   2868e:	10 92 a3 05 	sts	0x05A3, r1	; 0x8005a3 <Stopwatch::accumulator+0x1>
   28692:	10 92 a4 05 	sts	0x05A4, r1	; 0x8005a4 <Stopwatch::accumulator+0x2>
   28696:	10 92 a5 05 	sts	0x05A5, r1	; 0x8005a5 <Stopwatch::accumulator+0x3>
}
   2869a:	08 95       	ret

0002869c <Stopwatch::start()>:
    /**
     * @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 <Stopwatch::state>
  }
  else return false;
}

bool Stopwatch::start() {
  if (!isRunning()) {
   286a0:	81 30       	cpi	r24, 0x01	; 1
   286a2:	f1 f0       	breq	.+60     	; 0x286e0 <Stopwatch::start()+0x44>
    if (isPaused()) accumulator = duration();
   286a4:	82 30       	cpi	r24, 0x02	; 2
   286a6:	c9 f4       	brne	.+50     	; 0x286da <Stopwatch::start()+0x3e>
   286a8:	0f 94 7b 3f 	call	0x27ef6	; 0x27ef6 <Stopwatch::duration()>
   286ac:	60 93 a2 05 	sts	0x05A2, r22	; 0x8005a2 <Stopwatch::accumulator>
   286b0:	70 93 a3 05 	sts	0x05A3, r23	; 0x8005a3 <Stopwatch::accumulator+0x1>
   286b4:	80 93 a4 05 	sts	0x05A4, r24	; 0x8005a4 <Stopwatch::accumulator+0x2>
   286b8:	90 93 a5 05 	sts	0x05A5, r25	; 0x8005a5 <Stopwatch::accumulator+0x3>
    else reset();

    state = RUNNING;
   286bc:	81 e0       	ldi	r24, 0x01	; 1
   286be:	80 93 9b 03 	sts	0x039B, r24	; 0x80039b <Stopwatch::state>
    startTimestamp = _millis();
   286c2:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   286c6:	60 93 a6 05 	sts	0x05A6, r22	; 0x8005a6 <Stopwatch::startTimestamp>
   286ca:	70 93 a7 05 	sts	0x05A7, r23	; 0x8005a7 <Stopwatch::startTimestamp+0x1>
   286ce:	80 93 a8 05 	sts	0x05A8, r24	; 0x8005a8 <Stopwatch::startTimestamp+0x2>
   286d2:	90 93 a9 05 	sts	0x05A9, r25	; 0x8005a9 <Stopwatch::startTimestamp+0x3>
   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 <Stopwatch::reset()>
   286de:	ee cf       	rjmp	.-36     	; 0x286bc <Stopwatch::start()+0x20>

    state = RUNNING;
    startTimestamp = _millis();
    return true;
  }
  else return false;
   286e0:	80 e0       	ldi	r24, 0x00	; 0
}
   286e2:	08 95       	ret

000286e4 <Stopwatch::stop()>:
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 <Stopwatch::state>
   286e8:	81 50       	subi	r24, 0x01	; 1
   286ea:	82 30       	cpi	r24, 0x02	; 2
   286ec:	70 f4       	brcc	.+28     	; 0x2870a <Stopwatch::stop()+0x26>
    state = STOPPED;
   286ee:	10 92 9b 03 	sts	0x039B, r1	; 0x80039b <Stopwatch::state>
    stopTimestamp = _millis();
   286f2:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   286f6:	60 93 51 06 	sts	0x0651, r22	; 0x800651 <Stopwatch::stopTimestamp>
   286fa:	70 93 52 06 	sts	0x0652, r23	; 0x800652 <Stopwatch::stopTimestamp+0x1>
   286fe:	80 93 53 06 	sts	0x0653, r24	; 0x800653 <Stopwatch::stopTimestamp+0x2>
   28702:	90 93 54 06 	sts	0x0654, r25	; 0x800654 <Stopwatch::stopTimestamp+0x3>
   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 <st_get_position(unsigned char)>:
}

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 <st_get_position_mm(unsigned char)>:
  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 <st_get_position(unsigned char)>
   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 <st_synchronize()>:
}


// 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 <st_synchronize()+0x6>
   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 <block_buffer_head>
   28762:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
	while(blocks_queued())
   28766:	98 17       	cp	r25, r24
   28768:	09 f4       	brne	.+2      	; 0x2876c <st_synchronize()+0x1a>
   2876a:	46 c0       	rjmp	.+140    	; 0x287f8 <st_synchronize()+0xa6>
	{
#ifdef TMC2130
		manage_heater();
   2876c:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
	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 <st_synchronize()+0x34>
		// 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 <manage_inactivity(bool)>
			lcd_update(0);
   2877e:	80 e0       	ldi	r24, 0x00	; 0
   28780:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
   28784:	ec cf       	rjmp	.-40     	; 0x2875e <st_synchronize()+0xc>
	{
		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_rx(unsigned char, unsigned char, unsigned long*) [clone .lto_priv.384]>
		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 <st_synchronize()+0xc>
#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 <st_reset_timer()>:


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 <st_reset_timer()+0x36>
      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 <current_block>
   288f2:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <block_buffer_head>
   28900:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <block_buffer_tail>
   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 <current_block+0x1>
   2892c:	c0 93 a0 05 	sts	0x05A0, r28	; 0x8005a0 <current_block>
  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 <deceleration_time>
   2893a:	10 92 9d 05 	sts	0x059D, r1	; 0x80059d <deceleration_time+0x1>
   2893e:	10 92 9e 05 	sts	0x059E, r1	; 0x80059e <deceleration_time+0x2>
   28942:	10 92 9f 05 	sts	0x059F, r1	; 0x80059f <deceleration_time+0x3>
    // 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 <step_loops_nominal>
    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 <acc_step_rate+0x1>
   28952:	80 93 99 05 	sts	0x0599, r24	; 0x800599 <acc_step_rate>
#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 <step_loops>
  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 <acceleration_time>
   289ca:	90 93 95 05 	sts	0x0595, r25	; 0x800595 <acceleration_time+0x1>
   289ce:	a0 93 96 05 	sts	0x0596, r26	; 0x800596 <acceleration_time+0x2>
   289d2:	b0 93 97 05 	sts	0x0597, r27	; 0x800597 <acceleration_time+0x3>

#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 <target_adv_steps+0x1>
   28a00:	80 93 92 05 	sts	0x0592, r24	; 0x800592 <target_adv_steps>
    }
    e_steps = 0;
   28a04:	10 92 91 05 	sts	0x0591, r1	; 0x800591 <e_steps>
    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 <LA_phase>
#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 <count_position+0xc>
   28a32:	10 92 bf 06 	sts	0x06BF, r1	; 0x8006bf <count_position+0xd>
   28a36:	10 92 c0 06 	sts	0x06C0, r1	; 0x8006c0 <count_position+0xe>
   28a3a:	10 92 c1 06 	sts	0x06C1, r1	; 0x8006c1 <count_position+0xf>
    }

    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 <counter+0x1>
   28a64:	80 93 80 05 	sts	0x0580, r24	; 0x800580 <counter>
   28a68:	90 93 85 05 	sts	0x0585, r25	; 0x800585 <counter+0x5>
   28a6c:	80 93 84 05 	sts	0x0584, r24	; 0x800584 <counter+0x4>
   28a70:	90 93 89 05 	sts	0x0589, r25	; 0x800589 <counter+0x9>
   28a74:	80 93 88 05 	sts	0x0588, r24	; 0x800588 <counter+0x8>
   28a78:	90 93 8d 05 	sts	0x058D, r25	; 0x80058d <counter+0xd>
   28a7c:	80 93 8c 05 	sts	0x058C, r24	; 0x80058c <counter+0xc>
      }
#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 <step_loops>
   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 <counter>
   28b40:	90 93 81 05 	sts	0x0581, r25	; 0x800581 <counter+0x1>
   28b44:	a0 93 82 05 	sts	0x0582, r26	; 0x800582 <counter+0x2>
   28b48:	b0 93 83 05 	sts	0x0583, r27	; 0x800583 <counter+0x3>
   28b4c:	80 93 84 05 	sts	0x0584, r24	; 0x800584 <counter+0x4>
   28b50:	90 93 85 05 	sts	0x0585, r25	; 0x800585 <counter+0x5>
   28b54:	a0 93 86 05 	sts	0x0586, r26	; 0x800586 <counter+0x6>
   28b58:	b0 93 87 05 	sts	0x0587, r27	; 0x800587 <counter+0x7>
   28b5c:	80 93 88 05 	sts	0x0588, r24	; 0x800588 <counter+0x8>
   28b60:	90 93 89 05 	sts	0x0589, r25	; 0x800589 <counter+0x9>
   28b64:	a0 93 8a 05 	sts	0x058A, r26	; 0x80058a <counter+0xa>
   28b68:	b0 93 8b 05 	sts	0x058B, r27	; 0x80058b <counter+0xb>
   28b6c:	80 93 8c 05 	sts	0x058C, r24	; 0x80058c <counter+0xc>
   28b70:	90 93 8d 05 	sts	0x058D, r25	; 0x80058d <counter+0xd>
   28b74:	a0 93 8e 05 	sts	0x058E, r26	; 0x80058e <counter+0xe>
   28b78:	b0 93 8f 05 	sts	0x058F, r27	; 0x80058f <counter+0xf>
      }
#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 <e_extruding>
#endif
    }
    step_events_completed.wide = 0;
   28b94:	10 92 7b 05 	sts	0x057B, r1	; 0x80057b <step_events_completed>
   28b98:	10 92 7c 05 	sts	0x057C, r1	; 0x80057c <step_events_completed+0x1>
   28b9c:	10 92 7d 05 	sts	0x057D, r1	; 0x80057d <step_events_completed+0x2>
   28ba0:	10 92 7e 05 	sts	0x057E, r1	; 0x80057e <step_events_completed+0x3>
    // 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 <out_bits>
    // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
    if((out_bits & (1<<X_AXIS))!=0){
   28baa:	80 ff       	sbrs	r24, 0
   28bac:	90 c0       	rjmp	.+288    	; 0x28cce <__vector_17+0x490>
      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 <count_direction>
    }
    if((out_bits & (1<<Y_AXIS))!=0){
   28bbe:	80 91 7a 05 	lds	r24, 0x057A	; 0x80057a <out_bits>
   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 <count_direction+0x1>
    }
    if ((out_bits & (1<<Z_AXIS)) != 0) {   // -direction
   28bd6:	80 91 7a 05 	lds	r24, 0x057A	; 0x80057a <out_bits>
   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 <count_direction+0x2>
    }
    if ((out_bits & (1 << E_AXIS)) != 0) { // -direction
   28bee:	80 91 7a 05 	lds	r24, 0x057A	; 0x80057a <out_bits>
   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 <count_direction+0x3>
	//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 <current_block>
   28c00:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <check_z_endstop>
   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 <endstop>
    uint8_t _old_endstop = old_endstop;
   28c20:	90 91 78 05 	lds	r25, 0x0578	; 0x800578 <old_endstop>
    #ifndef COREXY
    if ((out_bits & (1<<X_AXIS)) != 0) // stepping along -X axis
   28c24:	30 91 7a 05 	lds	r19, 0x057A	; 0x80057a <out_bits>
    #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<<X_AXIS)) != 0) // stepping along -X axis
   28c2c:	30 ff       	sbrs	r19, 0
   28c2e:	87 c0       	rjmp	.+270    	; 0x28d3e <__vector_17+0x500>
    #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 <step_events_completed>
   28c5e:	d0 92 7c 05 	sts	0x057C, r13	; 0x80057c <step_events_completed+0x1>
   28c62:	e0 92 7d 05 	sts	0x057D, r14	; 0x80057d <step_events_completed+0x2>
   28c66:	f0 92 7e 05 	sts	0x057E, r15	; 0x80057e <step_events_completed+0x3>
    #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<<Y_AXIS)) != 0) // -direction
   28c6e:	31 ff       	sbrs	r19, 1
   28c70:	70 c0       	rjmp	.+224    	; 0x28d52 <__vector_17+0x514>
    #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 <step_events_completed>
   28ca0:	d0 92 7c 05 	sts	0x057C, r13	; 0x80057c <step_events_completed+0x1>
   28ca4:	e0 92 7d 05 	sts	0x057D, r14	; 0x80057d <step_events_completed+0x2>
   28ca8:	f0 92 7e 05 	sts	0x057E, r15	; 0x80057e <step_events_completed+0x3>
        }
      #endif
    }

    if ((out_bits & (1<<Z_AXIS)) != 0) // -direction
   28cac:	32 ff       	sbrs	r19, 2
   28cae:	94 c0       	rjmp	.+296    	; 0x28dd8 <__vector_17+0x59a>
    {
      #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 <tmc2130_mode>
   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 <tmc2130_sg_homing_axes_mask>
   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<<X_AXIS))!=0){
      WRITE_NC(X_DIR_PIN, INVERT_X_DIR);
      count_direction[X_AXIS]=-1;
    } else {
      WRITE_NC(X_DIR_PIN, !INVERT_X_DIR);
   28cce:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   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<<Y_AXIS))!=0){
      WRITE_NC(Y_DIR_PIN, INVERT_Y_DIR);
      count_direction[Y_AXIS]=-1;
    } else {
      WRITE_NC(Y_DIR_PIN, !INVERT_Y_DIR);
   28cdc:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   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<<Z_AXIS)) != 0) {   // -direction
      WRITE_NC(Z_DIR_PIN,INVERT_Z_DIR);
      count_direction[Z_AXIS]=-1;
    } else { // +direction
      WRITE_NC(Z_DIR_PIN,!INVERT_Z_DIR);
   28cea:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   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 <e_steps>

      // 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 <step_events_completed>
   28d96:	d0 92 7c 05 	sts	0x057C, r13	; 0x80057c <step_events_completed+0x1>
   28d9a:	e0 92 7d 05 	sts	0x057D, r14	; 0x80057d <step_events_completed+0x2>
   28d9e:	f0 92 7e 05 	sts	0x057E, r15	; 0x80057e <step_events_completed+0x3>
        }
      #endif
    }
    endstop = _endstop;
   28da2:	80 93 79 05 	sts	0x0579, r24	; 0x800579 <endstop>
    old_endstop = _endstop; //apply current endstop state to the old endstop
   28da6:	80 93 78 05 	sts	0x0578, r24	; 0x800578 <old_endstop>
    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 <endstop>
      uint8_t _old_endstop = old_endstop;
   28dbc:	90 91 78 05 	lds	r25, 0x0578	; 0x800578 <old_endstop>
      // 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 <tmc2130_mode>
   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 <tmc2130_sg_homing_axes_mask>
   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 <tmc2130_mode>
   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 <tmc2130_sg_homing_axes_mask>
   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 <step_events_completed>
   28e1c:	50 93 7c 05 	sts	0x057C, r21	; 0x80057c <step_events_completed+0x1>
   28e20:	60 93 7d 05 	sts	0x057D, r22	; 0x80057d <step_events_completed+0x2>
   28e24:	70 93 7e 05 	sts	0x057E, r23	; 0x80057e <step_events_completed+0x3>
      }
      endstop = _endstop;
   28e28:	80 93 79 05 	sts	0x0579, r24	; 0x800579 <endstop>
      old_endstop = _endstop; //apply current endstop state to the old endstop
   28e2c:	80 93 78 05 	sts	0x0578, r24	; 0x800578 <old_endstop>
      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 <step_loops>
   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 <MarlinSerial::checkRx()>
    // Step in X axis
    counter[X_AXIS].lo += current_block->steps[X_AXIS].lo;
   28e50:	e0 91 a0 05 	lds	r30, 0x05A0	; 0x8005a0 <current_block>
   28e54:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   28e58:	80 81       	ld	r24, Z
   28e5a:	91 81       	ldd	r25, Z+1	; 0x01
   28e5c:	20 91 80 05 	lds	r18, 0x0580	; 0x800580 <counter>
   28e60:	30 91 81 05 	lds	r19, 0x0581	; 0x800581 <counter+0x1>
   28e64:	82 0f       	add	r24, r18
   28e66:	93 1f       	adc	r25, r19
   28e68:	90 93 81 05 	sts	0x0581, r25	; 0x800581 <counter+0x1>
   28e6c:	80 93 80 05 	sts	0x0580, r24	; 0x800580 <counter>
    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 <current_block>
   28e7c:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   28e80:	80 91 80 05 	lds	r24, 0x0580	; 0x800580 <counter>
   28e84:	90 91 81 05 	lds	r25, 0x0581	; 0x800581 <counter+0x1>
   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 <counter+0x1>
   28e94:	80 93 80 05 	sts	0x0580, r24	; 0x800580 <counter>
      count_position[X_AXIS]+=count_direction[X_AXIS];
   28e98:	90 91 97 02 	lds	r25, 0x0297	; 0x800297 <count_direction>
   28e9c:	40 91 b2 06 	lds	r20, 0x06B2	; 0x8006b2 <count_position>
   28ea0:	50 91 b3 06 	lds	r21, 0x06B3	; 0x8006b3 <count_position+0x1>
   28ea4:	60 91 b4 06 	lds	r22, 0x06B4	; 0x8006b4 <count_position+0x2>
   28ea8:	70 91 b5 06 	lds	r23, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <count_position>
   28ec2:	90 93 b3 06 	sts	0x06B3, r25	; 0x8006b3 <count_position+0x1>
   28ec6:	a0 93 b4 06 	sts	0x06B4, r26	; 0x8006b4 <count_position+0x2>
   28eca:	b0 93 b5 06 	sts	0x06B5, r27	; 0x8006b5 <count_position+0x3>
#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 <current_block>
   28ed2:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x4>
   28ede:	30 91 85 05 	lds	r19, 0x0585	; 0x800585 <counter+0x5>
   28ee2:	82 0f       	add	r24, r18
   28ee4:	93 1f       	adc	r25, r19
   28ee6:	90 93 85 05 	sts	0x0585, r25	; 0x800585 <counter+0x5>
   28eea:	80 93 84 05 	sts	0x0584, r24	; 0x800584 <counter+0x4>
    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 <current_block>
   28efa:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x5>
   28f0a:	80 93 84 05 	sts	0x0584, r24	; 0x800584 <counter+0x4>
      count_position[Y_AXIS]+=count_direction[Y_AXIS];
   28f0e:	90 91 98 02 	lds	r25, 0x0298	; 0x800298 <count_direction+0x1>
   28f12:	40 91 b6 06 	lds	r20, 0x06B6	; 0x8006b6 <count_position+0x4>
   28f16:	50 91 b7 06 	lds	r21, 0x06B7	; 0x8006b7 <count_position+0x5>
   28f1a:	60 91 b8 06 	lds	r22, 0x06B8	; 0x8006b8 <count_position+0x6>
   28f1e:	70 91 b9 06 	lds	r23, 0x06B9	; 0x8006b9 <count_position+0x7>
   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 <count_position+0x4>
   28f38:	90 93 b7 06 	sts	0x06B7, r25	; 0x8006b7 <count_position+0x5>
   28f3c:	a0 93 b8 06 	sts	0x06B8, r26	; 0x8006b8 <count_position+0x6>
   28f40:	b0 93 b9 06 	sts	0x06B9, r27	; 0x8006b9 <count_position+0x7>
#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 <current_block>
   28f48:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x8>
   28f54:	30 91 89 05 	lds	r19, 0x0589	; 0x800589 <counter+0x9>
   28f58:	82 0f       	add	r24, r18
   28f5a:	93 1f       	adc	r25, r19
   28f5c:	90 93 89 05 	sts	0x0589, r25	; 0x800589 <counter+0x9>
   28f60:	80 93 88 05 	sts	0x0588, r24	; 0x800588 <counter+0x8>
    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 <current_block>
   28f70:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x9>
   28f80:	80 93 88 05 	sts	0x0588, r24	; 0x800588 <counter+0x8>
      count_position[Z_AXIS]+=count_direction[Z_AXIS];
   28f84:	90 91 99 02 	lds	r25, 0x0299	; 0x800299 <count_direction+0x2>
   28f88:	40 91 ba 06 	lds	r20, 0x06BA	; 0x8006ba <count_position+0x8>
   28f8c:	50 91 bb 06 	lds	r21, 0x06BB	; 0x8006bb <count_position+0x9>
   28f90:	60 91 bc 06 	lds	r22, 0x06BC	; 0x8006bc <count_position+0xa>
   28f94:	70 91 bd 06 	lds	r23, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   28fae:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   28fb2:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   28fb6:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
      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 <current_block>
   28fbe:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   28fc2:	80 91 8c 05 	lds	r24, 0x058C	; 0x80058c <counter+0xc>
   28fc6:	90 91 8d 05 	lds	r25, 0x058D	; 0x80058d <counter+0xd>
   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 <counter+0xd>
   28fd6:	80 93 8c 05 	sts	0x058C, r24	; 0x80058c <counter+0xc>
   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 <counter+0xd>
   28fec:	80 93 8c 05 	sts	0x058C, r24	; 0x80058c <counter+0xc>
      count_position[E_AXIS] += count_direction[E_AXIS];
   28ff0:	90 91 9a 02 	lds	r25, 0x029A	; 0x80029a <count_direction+0x3>
   28ff4:	40 91 be 06 	lds	r20, 0x06BE	; 0x8006be <count_position+0xc>
   28ff8:	50 91 bf 06 	lds	r21, 0x06BF	; 0x8006bf <count_position+0xd>
   28ffc:	60 91 c0 06 	lds	r22, 0x06C0	; 0x8006c0 <count_position+0xe>
   29000:	70 91 c1 06 	lds	r23, 0x06C1	; 0x8006c1 <count_position+0xf>
   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 <count_position+0xc>
   2901a:	90 93 bf 06 	sts	0x06BF, r25	; 0x8006bf <count_position+0xd>
   2901e:	a0 93 c0 06 	sts	0x06C0, r26	; 0x8006c0 <count_position+0xe>
   29022:	b0 93 c1 06 	sts	0x06C1, r27	; 0x8006c1 <count_position+0xf>
#ifdef LIN_ADVANCE
      e_steps += count_direction[E_AXIS];
   29026:	90 91 9a 02 	lds	r25, 0x029A	; 0x80029a <count_direction+0x3>
   2902a:	80 91 91 05 	lds	r24, 0x0591	; 0x800591 <e_steps>
   2902e:	89 0f       	add	r24, r25
   29030:	80 93 91 05 	sts	0x0591, r24	; 0x800591 <e_steps>
      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 <step_events_completed>
   29038:	90 91 7c 05 	lds	r25, 0x057C	; 0x80057c <step_events_completed+0x1>
   2903c:	01 96       	adiw	r24, 0x01	; 1
   2903e:	90 93 7c 05 	sts	0x057C, r25	; 0x80057c <step_events_completed+0x1>
   29042:	80 93 7b 05 	sts	0x057B, r24	; 0x80057b <step_events_completed>
   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 <step_loops>
   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 <MarlinSerial::checkRx()>
    // Step in X axis
    counter[X_AXIS].wide += current_block->steps[X_AXIS].wide;
   29060:	e0 91 a0 05 	lds	r30, 0x05A0	; 0x8005a0 <current_block>
   29064:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter>
   29074:	50 91 81 05 	lds	r21, 0x0581	; 0x800581 <counter+0x1>
   29078:	60 91 82 05 	lds	r22, 0x0582	; 0x800582 <counter+0x2>
   2907c:	70 91 83 05 	lds	r23, 0x0583	; 0x800583 <counter+0x3>
   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 <counter>
   2908c:	90 93 81 05 	sts	0x0581, r25	; 0x800581 <counter+0x1>
   29090:	a0 93 82 05 	sts	0x0582, r26	; 0x800582 <counter+0x2>
   29094:	b0 93 83 05 	sts	0x0583, r27	; 0x800583 <counter+0x3>
    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 <current_block>
   290a8:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   290ac:	80 91 80 05 	lds	r24, 0x0580	; 0x800580 <counter>
   290b0:	90 91 81 05 	lds	r25, 0x0581	; 0x800581 <counter+0x1>
   290b4:	a0 91 82 05 	lds	r26, 0x0582	; 0x800582 <counter+0x2>
   290b8:	b0 91 83 05 	lds	r27, 0x0583	; 0x800583 <counter+0x3>
   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 <counter>
   290d0:	90 93 81 05 	sts	0x0581, r25	; 0x800581 <counter+0x1>
   290d4:	a0 93 82 05 	sts	0x0582, r26	; 0x800582 <counter+0x2>
   290d8:	b0 93 83 05 	sts	0x0583, r27	; 0x800583 <counter+0x3>
      count_position[X_AXIS]+=count_direction[X_AXIS];
   290dc:	90 91 97 02 	lds	r25, 0x0297	; 0x800297 <count_direction>
   290e0:	40 91 b2 06 	lds	r20, 0x06B2	; 0x8006b2 <count_position>
   290e4:	50 91 b3 06 	lds	r21, 0x06B3	; 0x8006b3 <count_position+0x1>
   290e8:	60 91 b4 06 	lds	r22, 0x06B4	; 0x8006b4 <count_position+0x2>
   290ec:	70 91 b5 06 	lds	r23, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <count_position>
   29106:	90 93 b3 06 	sts	0x06B3, r25	; 0x8006b3 <count_position+0x1>
   2910a:	a0 93 b4 06 	sts	0x06B4, r26	; 0x8006b4 <count_position+0x2>
   2910e:	b0 93 b5 06 	sts	0x06B5, r27	; 0x8006b5 <count_position+0x3>
#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 <current_block>
   29116:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x4>
   29126:	50 91 85 05 	lds	r21, 0x0585	; 0x800585 <counter+0x5>
   2912a:	60 91 86 05 	lds	r22, 0x0586	; 0x800586 <counter+0x6>
   2912e:	70 91 87 05 	lds	r23, 0x0587	; 0x800587 <counter+0x7>
   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 <counter+0x4>
   2913e:	90 93 85 05 	sts	0x0585, r25	; 0x800585 <counter+0x5>
   29142:	a0 93 86 05 	sts	0x0586, r26	; 0x800586 <counter+0x6>
   29146:	b0 93 87 05 	sts	0x0587, r27	; 0x800587 <counter+0x7>
    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 <current_block>
   2915a:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x4>
   29172:	90 93 85 05 	sts	0x0585, r25	; 0x800585 <counter+0x5>
   29176:	a0 93 86 05 	sts	0x0586, r26	; 0x800586 <counter+0x6>
   2917a:	b0 93 87 05 	sts	0x0587, r27	; 0x800587 <counter+0x7>
      count_position[Y_AXIS]+=count_direction[Y_AXIS];
   2917e:	90 91 98 02 	lds	r25, 0x0298	; 0x800298 <count_direction+0x1>
   29182:	40 91 b6 06 	lds	r20, 0x06B6	; 0x8006b6 <count_position+0x4>
   29186:	50 91 b7 06 	lds	r21, 0x06B7	; 0x8006b7 <count_position+0x5>
   2918a:	60 91 b8 06 	lds	r22, 0x06B8	; 0x8006b8 <count_position+0x6>
   2918e:	70 91 b9 06 	lds	r23, 0x06B9	; 0x8006b9 <count_position+0x7>
   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 <count_position+0x4>
   291a8:	90 93 b7 06 	sts	0x06B7, r25	; 0x8006b7 <count_position+0x5>
   291ac:	a0 93 b8 06 	sts	0x06B8, r26	; 0x8006b8 <count_position+0x6>
   291b0:	b0 93 b9 06 	sts	0x06B9, r27	; 0x8006b9 <count_position+0x7>
#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 <current_block>
   291b8:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x8>
   291c8:	50 91 89 05 	lds	r21, 0x0589	; 0x800589 <counter+0x9>
   291cc:	60 91 8a 05 	lds	r22, 0x058A	; 0x80058a <counter+0xa>
   291d0:	70 91 8b 05 	lds	r23, 0x058B	; 0x80058b <counter+0xb>
   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 <counter+0x8>
   291e0:	90 93 89 05 	sts	0x0589, r25	; 0x800589 <counter+0x9>
   291e4:	a0 93 8a 05 	sts	0x058A, r26	; 0x80058a <counter+0xa>
   291e8:	b0 93 8b 05 	sts	0x058B, r27	; 0x80058b <counter+0xb>
    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 <current_block>
   291fc:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <counter+0x8>
   29214:	90 93 89 05 	sts	0x0589, r25	; 0x800589 <counter+0x9>
   29218:	a0 93 8a 05 	sts	0x058A, r26	; 0x80058a <counter+0xa>
   2921c:	b0 93 8b 05 	sts	0x058B, r27	; 0x80058b <counter+0xb>
      count_position[Z_AXIS]+=count_direction[Z_AXIS];
   29220:	90 91 99 02 	lds	r25, 0x0299	; 0x800299 <count_direction+0x2>
   29224:	40 91 ba 06 	lds	r20, 0x06BA	; 0x8006ba <count_position+0x8>
   29228:	50 91 bb 06 	lds	r21, 0x06BB	; 0x8006bb <count_position+0x9>
   2922c:	60 91 bc 06 	lds	r22, 0x06BC	; 0x8006bc <count_position+0xa>
   29230:	70 91 bd 06 	lds	r23, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   2924a:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   2924e:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   29252:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
      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 <current_block>
   2925a:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   2925e:	80 91 8c 05 	lds	r24, 0x058C	; 0x80058c <counter+0xc>
   29262:	90 91 8d 05 	lds	r25, 0x058D	; 0x80058d <counter+0xd>
   29266:	a0 91 8e 05 	lds	r26, 0x058E	; 0x80058e <counter+0xe>
   2926a:	b0 91 8f 05 	lds	r27, 0x058F	; 0x80058f <counter+0xf>
   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 <counter+0xc>
   29282:	90 93 8d 05 	sts	0x058D, r25	; 0x80058d <counter+0xd>
   29286:	a0 93 8e 05 	sts	0x058E, r26	; 0x80058e <counter+0xe>
   2928a:	b0 93 8f 05 	sts	0x058F, r27	; 0x80058f <counter+0xf>
   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 <counter+0xc>
   292ac:	90 93 8d 05 	sts	0x058D, r25	; 0x80058d <counter+0xd>
   292b0:	a0 93 8e 05 	sts	0x058E, r26	; 0x80058e <counter+0xe>
   292b4:	b0 93 8f 05 	sts	0x058F, r27	; 0x80058f <counter+0xf>
      count_position[E_AXIS] += count_direction[E_AXIS];
   292b8:	90 91 9a 02 	lds	r25, 0x029A	; 0x80029a <count_direction+0x3>
   292bc:	c0 90 be 06 	lds	r12, 0x06BE	; 0x8006be <count_position+0xc>
   292c0:	d0 90 bf 06 	lds	r13, 0x06BF	; 0x8006bf <count_position+0xd>
   292c4:	e0 90 c0 06 	lds	r14, 0x06C0	; 0x8006c0 <count_position+0xe>
   292c8:	f0 90 c1 06 	lds	r15, 0x06C1	; 0x8006c1 <count_position+0xf>
   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 <count_position+0xc>
   292e2:	90 93 bf 06 	sts	0x06BF, r25	; 0x8006bf <count_position+0xd>
   292e6:	a0 93 c0 06 	sts	0x06C0, r26	; 0x8006c0 <count_position+0xe>
   292ea:	b0 93 c1 06 	sts	0x06C1, r27	; 0x8006c1 <count_position+0xf>
#ifdef LIN_ADVANCE
      e_steps += count_direction[E_AXIS];
   292ee:	90 91 9a 02 	lds	r25, 0x029A	; 0x80029a <count_direction+0x3>
   292f2:	80 91 91 05 	lds	r24, 0x0591	; 0x800591 <e_steps>
   292f6:	89 0f       	add	r24, r25
   292f8:	80 93 91 05 	sts	0x0591, r24	; 0x800591 <e_steps>
      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 <step_events_completed>
   29300:	90 91 7c 05 	lds	r25, 0x057C	; 0x80057c <step_events_completed+0x1>
   29304:	a0 91 7d 05 	lds	r26, 0x057D	; 0x80057d <step_events_completed+0x2>
   29308:	b0 91 7e 05 	lds	r27, 0x057E	; 0x80057e <step_events_completed+0x3>
   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 <step_events_completed>
   29316:	90 93 7c 05 	sts	0x057C, r25	; 0x80057c <step_events_completed+0x1>
   2931a:	a0 93 7d 05 	sts	0x057D, r26	; 0x80057d <step_events_completed+0x2>
   2931e:	b0 93 7e 05 	sts	0x057E, r27	; 0x80057e <step_events_completed+0x3>
   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 <e_steps>
   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 <step_events_completed>
   2934a:	50 91 7c 05 	lds	r21, 0x057C	; 0x80057c <step_events_completed+0x1>
   2934e:	60 91 7d 05 	lds	r22, 0x057D	; 0x80057d <step_events_completed+0x2>
   29352:	70 91 7e 05 	lds	r23, 0x057E	; 0x80057e <step_events_completed+0x3>
   29356:	c0 91 a0 05 	lds	r28, 0x05A0	; 0x8005a0 <current_block>
   2935a:	d0 91 a1 05 	lds	r29, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <acceleration_time>
   29376:	50 91 95 05 	lds	r21, 0x0595	; 0x800595 <acceleration_time+0x1>
   2937a:	60 91 96 05 	lds	r22, 0x0596	; 0x800596 <acceleration_time+0x2>
   2937e:	70 91 97 05 	lds	r23, 0x0597	; 0x800597 <acceleration_time+0x3>
    "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 <acc_step_rate+0x1>
   293d0:	80 93 99 05 	sts	0x0599, r24	; 0x800599 <acc_step_rate>
        // 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 <acc_step_rate+0x1>
   293e2:	20 93 99 05 	sts	0x0599, r18	; 0x800599 <acc_step_rate>
        // step_rate to timer interval
        uint16_t timer = calc_timer(acc_step_rate, step_loops);
   293e6:	80 91 99 05 	lds	r24, 0x0599	; 0x800599 <acc_step_rate>
   293ea:	90 91 9a 05 	lds	r25, 0x059A	; 0x80059a <acc_step_rate+0x1>
#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 <step_loops>
  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 <acceleration_time>
   29476:	50 93 95 05 	sts	0x0595, r21	; 0x800595 <acceleration_time+0x1>
   2947a:	60 93 96 05 	sts	0x0596, r22	; 0x800596 <acceleration_time+0x2>
   2947e:	70 93 97 05 	sts	0x0597, r23	; 0x800597 <acceleration_time+0x3>
#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 <LA_phase>

        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 <target_adv_steps>
   294a6:	30 91 93 05 	lds	r19, 0x0593	; 0x800593 <target_adv_steps+0x1>
   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 <eISR_Err>
   294de:	90 91 72 05 	lds	r25, 0x0572	; 0x800572 <eISR_Err+0x1>
   294e2:	a0 91 73 05 	lds	r26, 0x0573	; 0x800573 <eISR_Err+0x2>
   294e6:	b0 91 74 05 	lds	r27, 0x0574	; 0x800574 <eISR_Err+0x3>
   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 <step_loops>
   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 <step_events_completed>
   2958c:	50 91 7c 05 	lds	r21, 0x057C	; 0x80057c <step_events_completed+0x1>
   29590:	60 91 7d 05 	lds	r22, 0x057D	; 0x80057d <step_events_completed+0x2>
   29594:	70 91 7e 05 	lds	r23, 0x057E	; 0x80057e <step_events_completed+0x3>
   29598:	80 91 98 05 	lds	r24, 0x0598	; 0x800598 <step_loops>
   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 <e_extruding>
   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 <target_adv_steps>
   295c6:	30 91 93 05 	lds	r19, 0x0593	; 0x800593 <target_adv_steps+0x1>
   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 <target_adv_steps+0x1>
   295d4:	80 93 92 05 	sts	0x0592, r24	; 0x800592 <target_adv_steps>
   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 <step_events_completed>
   295de:	90 91 7c 05 	lds	r25, 0x057C	; 0x80057c <step_events_completed+0x1>
   295e2:	a0 91 7d 05 	lds	r26, 0x057D	; 0x80057d <step_events_completed+0x2>
   295e6:	b0 91 7e 05 	lds	r27, 0x057E	; 0x80057e <step_events_completed+0x3>
   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 <deceleration_time>
   29602:	d0 90 9d 05 	lds	r13, 0x059D	; 0x80059d <deceleration_time+0x1>
   29606:	e0 90 9e 05 	lds	r14, 0x059E	; 0x80059e <deceleration_time+0x2>
   2960a:	f0 90 9f 05 	lds	r15, 0x059F	; 0x80059f <deceleration_time+0x3>
    "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 <acc_step_rate>
   29654:	30 91 9a 05 	lds	r19, 0x059A	; 0x80059a <acc_step_rate+0x1>
   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 <step_loops>
  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 <deceleration_time>
   296f6:	d0 92 9d 05 	sts	0x059D, r13	; 0x80059d <deceleration_time+0x1>
   296fa:	e0 92 9e 05 	sts	0x059E, r14	; 0x80059e <deceleration_time+0x2>
   296fe:	f0 92 9f 05 	sts	0x059F, r15	; 0x80059f <deceleration_time+0x3>

#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 <step_events_completed>
   29714:	90 91 7c 05 	lds	r25, 0x057C	; 0x80057c <step_events_completed+0x1>
   29718:	a0 91 7d 05 	lds	r26, 0x057D	; 0x80057d <step_events_completed+0x2>
   2971c:	b0 91 7e 05 	lds	r27, 0x057E	; 0x80057e <step_events_completed+0x3>
   29720:	20 91 98 05 	lds	r18, 0x0598	; 0x800598 <step_loops>
   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 <target_adv_steps+0x1>
   29742:	20 93 92 05 	sts	0x0592, r18	; 0x800592 <target_adv_steps>
                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 <e_extruding>
   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 <step_loops>
   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 <step_loops_nominal>
   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 <OCR1A_nominal>
   297d2:	30 91 76 05 	lds	r19, 0x0576	; 0x800576 <OCR1A_nominal+0x1>
   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 <step_loops>
  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 <OCR1A_nominal+0x1>
   2985c:	80 93 75 05 	sts	0x0575, r24	; 0x800575 <OCR1A_nominal>
          step_loops_nominal = step_loops;
   29860:	80 91 98 05 	lds	r24, 0x0598	; 0x800598 <step_loops>
   29864:	80 93 9b 05 	sts	0x059B, r24	; 0x80059b <step_loops_nominal>

#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 <e_extruding>
   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 <target_adv_steps+0x1>
   2988a:	80 93 92 05 	sts	0x0592, r24	; 0x800592 <target_adv_steps>
#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 <step_loops>
   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 <eISR_Err>
   2990e:	50 93 72 05 	sts	0x0572, r21	; 0x800572 <eISR_Err+0x1>
   29912:	60 93 73 05 	sts	0x0573, r22	; 0x800573 <eISR_Err+0x2>
   29916:	70 93 74 05 	sts	0x0574, r23	; 0x800574 <eISR_Err+0x3>
            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 <e_step_loops>

            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 <e_extruding>
   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 <eISR_Err>
   29948:	50 93 72 05 	sts	0x0572, r21	; 0x800572 <eISR_Err+0x1>
   2994c:	60 93 73 05 	sts	0x0573, r22	; 0x800573 <eISR_Err+0x2>
   29950:	70 93 74 05 	sts	0x0574, r23	; 0x800574 <eISR_Err+0x3>
                LA_phase = 0;
   29954:	10 92 90 05 	sts	0x0590, r1	; 0x800590 <LA_phase>
   29958:	b3 cd       	rjmp	.-1178   	; 0x294c0 <__vector_17+0xc82>
   2995a:	80 93 71 05 	sts	0x0571, r24	; 0x800571 <eISR_Err>
   2995e:	90 93 72 05 	sts	0x0572, r25	; 0x800572 <eISR_Err+0x1>
   29962:	a0 93 73 05 	sts	0x0573, r26	; 0x800573 <eISR_Err+0x2>
   29966:	b0 93 74 05 	sts	0x0574, r27	; 0x800574 <eISR_Err+0x3>
    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 <eISR_Rate+0x1>
   29972:	e0 93 6e 05 	sts	0x056E, r30	; 0x80056e <eISR_Rate>
        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 <LA_phase>
   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 <step_loops>
   2998a:	10 91 70 05 	lds	r17, 0x0570	; 0x800570 <e_step_loops>
   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 <eISR_Rate+0x1>
   299c2:	60 93 6e 05 	sts	0x056E, r22	; 0x80056e <eISR_Rate>
    }

    nextAdvanceISR = eISR_Rate;
   299c6:	80 91 6e 05 	lds	r24, 0x056E	; 0x80056e <eISR_Rate>
   299ca:	90 91 6f 05 	lds	r25, 0x056F	; 0x80056f <eISR_Rate+0x1>
   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 <LA_phase>
        }
    }

    // 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 <MarlinSerial::checkRx()>
#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 <step_events_completed>
   29a3e:	50 91 7c 05 	lds	r21, 0x057C	; 0x80057c <step_events_completed+0x1>
   29a42:	60 91 7d 05 	lds	r22, 0x057D	; 0x80057d <step_events_completed+0x2>
   29a46:	70 91 7e 05 	lds	r23, 0x057E	; 0x80057e <step_events_completed+0x3>
   29a4a:	e0 91 a0 05 	lds	r30, 0x05A0	; 0x8005a0 <current_block>
   29a4e:	f0 91 a1 05 	lds	r31, 0x05A1	; 0x8005a1 <current_block+0x1>
   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 <current_block+0x1>
   29a68:	10 92 a0 05 	sts	0x05A0, r1	; 0x8005a0 <current_block>
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 <block_buffer_head>
   29a70:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <block_buffer_tail>
   29a7c:	8f 5f       	subi	r24, 0xFF	; 255
   29a7e:	8f 70       	andi	r24, 0x0F	; 15
   29a80:	80 93 a5 0d 	sts	0x0DA5, r24	; 0x800da5 <block_buffer_tail>
	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 <tmc2130_mode>
   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 <tmc2130_sg_stop_on_crash>
   29a90:	88 23       	and	r24, r24
   29a92:	29 f1       	breq	.+74     	; 0x29ade <__vector_17+0x12a0>
   29a94:	80 91 42 06 	lds	r24, 0x0642	; 0x800642 <tmc2130_sg_homing_axes_mask>
   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_crash>
		tmc2130_sg_stop_on_crash = false;
   29abe:	10 92 5c 02 	sts	0x025C, r1	; 0x80025c <tmc2130_sg_stop_on_crash>

#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 <stop_and_save_print_to_ram(float, float)>
        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 <target_adv_steps>
   29afa:	30 91 93 05 	lds	r19, 0x0593	; 0x800593 <target_adv_steps+0x1>
   29afe:	80 91 91 05 	lds	r24, 0x0591	; 0x800591 <e_steps>
   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 <e_step_loops>
   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_step_loops>
        }
        e_steps -= e_step_loops;
   29b22:	90 91 70 05 	lds	r25, 0x0570	; 0x800570 <e_step_loops>
   29b26:	89 1b       	sub	r24, r25
   29b28:	80 93 91 05 	sts	0x0591, r24	; 0x800591 <e_steps>
        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 <e_step_loops>
   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 <target_adv_steps>
   29b62:	90 91 93 05 	lds	r25, 0x0593	; 0x800593 <target_adv_steps+0x1>
   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 <e_steps>
   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 <e_step_loops>
   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_step_loops>
        }
        e_steps += e_step_loops;
   29c02:	90 91 70 05 	lds	r25, 0x0570	; 0x800570 <e_step_loops>
   29c06:	89 0f       	add	r24, r25
   29c08:	80 93 91 05 	sts	0x0591, r24	; 0x800591 <e_steps>
        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 <e_step_loops>
   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 <eISR_Rate>
   29c3e:	90 91 6f 05 	lds	r25, 0x056F	; 0x80056f <eISR_Rate+0x1>
   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 <LA_phase>
   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 <e_step_loops>
   29c6c:	67 2b       	or	r22, r23
   29c6e:	11 f0       	breq	.+4      	; 0x29c74 <__vector_17+0x1436>
   29c70:	20 91 98 05 	lds	r18, 0x0598	; 0x800598 <step_loops>
        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 <e_steps>
   29ca2:	96 0f       	add	r25, r22
   29ca4:	90 93 91 05 	sts	0x0591, r25	; 0x800591 <e_steps>

    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 <fsensor+0x11>
   29cac:	30 91 bb 17 	lds	r19, 0x17BB	; 0x8017bb <fsensor+0x12>
   29cb0:	24 0f       	add	r18, r20
   29cb2:	35 1f       	adc	r19, r21
   29cb4:	30 93 bb 17 	sts	0x17BB, r19	; 0x8017bb <fsensor+0x12>
   29cb8:	20 93 ba 17 	sts	0x17BA, r18	; 0x8017ba <fsensor+0x11>
            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 <enable_z_endstop(bool)>:
  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_z_endstop = check;
   29d4a:	80 93 77 05 	sts	0x0577, r24	; 0x800577 <check_z_endstop>
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 <endstop_z_hit_on_purpose()>:
  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 <endstops_hit_on_purpose()>:
 }
}

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 <endstops_hit_on_purpose()+0x10>
   29d8c:	80 e0       	ldi	r24, 0x00	; 0
}
   29d8e:	08 95       	ret

00029d90 <Sound_MakeSound(eSOUND_TYPE)>:
     }
}

void Sound_MakeSound(eSOUND_TYPE eSoundType)
{
switch(eSoundMode)
   29d90:	90 91 dd 04 	lds	r25, 0x04DD	; 0x8004dd <eSoundMode>
   29d94:	91 30       	cpi	r25, 0x01	; 1
   29d96:	a1 f0       	breq	.+40     	; 0x29dc0 <Sound_MakeSound(eSOUND_TYPE)+0x30>
   29d98:	28 f0       	brcs	.+10     	; 0x29da4 <Sound_MakeSound(eSOUND_TYPE)+0x14>
   29d9a:	92 30       	cpi	r25, 0x02	; 2
   29d9c:	a9 f0       	breq	.+42     	; 0x29dc8 <Sound_MakeSound(eSOUND_TYPE)+0x38>
   29d9e:	93 30       	cpi	r25, 0x03	; 3
   29da0:	c1 f0       	breq	.+48     	; 0x29dd2 <Sound_MakeSound(eSOUND_TYPE)+0x42>
   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 <Sound_MakeSound(eSOUND_TYPE)+0x1c>
          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 <Sound_DoSound_Echo()>
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 <Sound_MakeSound(eSOUND_TYPE)+0x24>
          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 <Sound_DoSound_Prompt()>
     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 <Sound_MakeSound(eSOUND_TYPE)+0x2a>
   29db8:	50 c0       	rjmp	.+160    	; 0x29e5a <Sound_MakeSound(eSOUND_TYPE)+0xca>
               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_Alert(bool)>
               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_MakeSound(eSOUND_TYPE)+0x18>
              Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
   29dc4:	82 30       	cpi	r24, 0x02	; 2
   29dc6:	a1 f3       	breq	.-24     	; 0x29db0 <Sound_MakeSound(eSOUND_TYPE)+0x20>
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
   29dc8:	85 30       	cpi	r24, 0x05	; 5
   29dca:	09 f0       	breq	.+2      	; 0x29dce <Sound_MakeSound(eSOUND_TYPE)+0x3e>
   29dcc:	46 c0       	rjmp	.+140    	; 0x29e5a <Sound_MakeSound(eSOUND_TYPE)+0xca>
               Sound_DoSound_Alert(true);
   29dce:	81 e0       	ldi	r24, 0x01	; 1
   29dd0:	f5 cf       	rjmp	.-22     	; 0x29dbc <Sound_MakeSound(eSOUND_TYPE)+0x2c>
     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_MakeSound(eSOUND_TYPE)+0x18>
               Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
   29dd6:	82 30       	cpi	r24, 0x02	; 2
   29dd8:	59 f3       	breq	.-42     	; 0x29db0 <Sound_MakeSound(eSOUND_TYPE)+0x20>
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
   29dda:	85 30       	cpi	r24, 0x05	; 5
   29ddc:	71 f3       	breq	.-36     	; 0x29dba <Sound_MakeSound(eSOUND_TYPE)+0x2a>
               Sound_DoSound_Alert(false);
          if(eSoundType==e_SOUND_TYPE_EncoderMove)
   29dde:	86 30       	cpi	r24, 0x06	; 6
   29de0:	e1 f4       	brne	.+56     	; 0x29e1a <Sound_MakeSound(eSOUND_TYPE)+0x8a>
   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 <Sound_MakeSound(eSOUND_TYPE)+0x6a>
     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 <Sound_MakeSound(eSOUND_TYPE)+0x80>
   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 <Sound_MakeSound(eSOUND_TYPE)+0x58>
   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 <Sound_MakeSound(eSOUND_TYPE)+0xca>
     }
}

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 <backlight_wake(unsigned char)>
   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 <Sound_MakeSound(eSOUND_TYPE)+0xac>
         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 <Sound_MakeSound(eSOUND_TYPE)+0xc2>
   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_MakeSound(eSOUND_TYPE)+0x9a>
               Sound_DoSound_Blind_Alert();
          break;
     default:
          break;
     }
}
   29e5a:	08 95       	ret

00029e5c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>:
//! @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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x26>
   29e82:	00 d0       	rcall	.+0      	; 0x29e84 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x28>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x40>
   29e9a:	51 c0       	rjmp	.+162    	; 0x29f3e <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0xe2>
    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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>
   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 <millis2>
   29eb4:	2b 01       	movw	r4, r22
   29eb6:	3c 01       	movw	r6, r24
    lcd_consume_click();
   29eb8:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
    KEEPALIVE_STATE(PAUSED_FOR_USER);
   29ebc:	84 e0       	ldi	r24, 0x04	; 4
   29ebe:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
   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 <delay_keep_alive(unsigned int)>
            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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0xf0>
                current_selection = LCD_BUTTON_TIMEOUT;
                goto exit;
            }
            if (lcd_encoder) {
   29ed8:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   29edc:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   29ee0:	00 97       	sbiw	r24, 0x00	; 0
   29ee2:	09 f0       	breq	.+2      	; 0x29ee6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x8a>
   29ee4:	42 c0       	rjmp	.+132    	; 0x29f6a <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x10e>
                } else {
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
                    break; // turning knob skips waiting loop
                }
            }
            if (lcd_clicked()) {
   29ee6:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   29eea:	88 23       	and	r24, r24
   29eec:	09 f4       	brne	.+2      	; 0x29ef0 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x94>
   29eee:	67 c0       	rjmp	.+206    	; 0x29fbe <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x162>
                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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x9e>
   29ef8:	5e c0       	rjmp	.+188    	; 0x29fb6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x15a>
        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 <busy_state>
    // 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_update_enabled>
    lcd_draw_update = 2;
   29f06:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
    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 <lcd_display_message_fullscreen_P(char const*)>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0xee>
   29f48:	b3 cf       	rjmp	.-154    	; 0x29eb0 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x54>
   29f4a:	a8 cf       	rjmp	.-176    	; 0x29e9c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x40>
    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 <millis2>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x108>
   29f62:	ba cf       	rjmp	.-140    	; 0x29ed8 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x7c>
                current_selection = LCD_BUTTON_TIMEOUT;
   29f64:	33 24       	eor	r3, r3
   29f66:	3a 94       	dec	r3
   29f68:	c8 cf       	rjmp	.-112    	; 0x29efa <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x9e>
                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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x154>
                    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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x148>
                        if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   29f78:	97 ff       	sbrs	r25, 7
   29f7a:	0f c0       	rjmp	.+30     	; 0x29f9a <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x13e>
   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_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>
                    lcd_encoder = 0;
   29f90:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   29f94:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
   29f98:	a6 cf       	rjmp	.-180    	; 0x29ee6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x8a>
                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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x124>
                            // Rotating knob clockwise
                            current_selection++;
   29fa0:	33 94       	inc	r3
   29fa2:	ee cf       	rjmp	.-36     	; 0x29f80 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x124>
                        }
                    } 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_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x124>
                        }
                    }
                    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 <Sound_MakeSound(eSOUND_TYPE)>
                    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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x17e>
   29fbc:	84 cf       	rjmp	.-248    	; 0x29ec6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6a>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6e>
                    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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x18a>
            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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x17e>
   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 <lcd_display_message_fullscreen_P(char const*)>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x194>
   29fee:	6b cf       	rjmp	.-298    	; 0x29ec6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6a>
            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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>
   2a000:	62 cf       	rjmp	.-316    	; 0x29ec6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6a>

0002a002 <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>:
//! @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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>
}
   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 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>:
//! @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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>
}
   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 <lcd_load_filament_color_check()>:
    _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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lang_get_translation>
   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 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>
    while (clean == LCD_MIDDLE_BUTTON_CHOICE) {
   2a0f6:	81 30       	cpi	r24, 0x01	; 1
   2a0f8:	29 f4       	brne	.+10     	; 0x2a104 <lcd_load_filament_color_check()+0x5e>
        load_filament_final_feed();
   2a0fa:	0e 94 2b 64 	call	0xc856	; 0xc856 <load_filament_final_feed()>
        st_synchronize();
   2a0fe:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   2a102:	d8 cf       	rjmp	.-80     	; 0x2a0b4 <lcd_load_filament_color_check()+0xe>
        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 <lcd_load_filament_color_check()+0x7a>
        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 <unload_filament(float)>
    }
}
   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 <mFilamentItem(unsigned int, unsigned int)>:
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 <target_temperature+0x1>
   2a140:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <target_temperature>
    setTargetHotend((float)nTemp);
    if (!shouldPreheatOnlyNozzle()) setTargetBed((float)nTempBed);
   2a144:	0f 94 10 17 	call	0x22e20	; 0x22e20 <shouldPreheatOnlyNozzle()>
   2a148:	81 11       	cpse	r24, r1
   2a14a:	04 c0       	rjmp	.+8      	; 0x2a154 <mFilamentItem(unsigned int, unsigned int)+0x24>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   2a14c:	d0 93 72 06 	sts	0x0672, r29	; 0x800672 <target_temperature_bed+0x1>
   2a150:	c0 93 71 06 	sts	0x0671, r28	; 0x800671 <target_temperature_bed>

    {
        const FilamentAction action = eFilamentAction;
   2a154:	c0 91 a5 03 	lds	r28, 0x03A5	; 0x8003a5 <eFilamentAction>
        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 <mFilamentItem(unsigned int, unsigned int)+0x6e>
        {
            lcd_return_to_status();
   2a160:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
            if (action == FilamentAction::Lay1Cal)
   2a164:	ca 30       	cpi	r28, 0x0A	; 10
   2a166:	41 f4       	brne	.+16     	; 0x2a178 <mFilamentItem(unsigned int, unsigned int)+0x48>
            {
                lcd_commands_type = LcdCommands::Layer1Cal;
   2a168:	84 e0       	ldi	r24, 0x04	; 4
   2a16a:	80 93 b3 0d 	sts	0x0DB3, r24	; 0x800db3 <lcd_commands_type>
            }
            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 <raise_z_above(float)>
                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 <eeprom_read_byte>
   2a18c:	88 23       	and	r24, r24
   2a18e:	79 f3       	breq	.-34     	; 0x2a16e <mFilamentItem(unsigned int, unsigned int)+0x3e>
                    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 <lcd_wizard(WizState)>
   2a19e:	10 92 da 03 	sts	0x03DA, r1	; 0x8003da <lcd_timeoutToStatus>

    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 <bFilamentSkipPreheat>
   2a1a6:	81 11       	cpse	r24, r1
   2a1a8:	12 c0       	rjmp	.+36     	; 0x2a1ce <mFilamentItem(unsigned int, unsigned int)+0x9e>
   2a1aa:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   2a1ae:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   2a1b2:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   2a1b6:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <mFilamentItem(unsigned int, unsigned int)+0x9e>
   2a1cc:	60 c0       	rjmp	.+192    	; 0x2a28e <mFilamentItem(unsigned int, unsigned int)+0x15e>
    {
        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 <mFilamentItem(unsigned int, unsigned int)+0x106>
   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 <bFilamentWaitingFlag>
   2a1fc:	88 23       	and	r24, r24
   2a1fe:	29 f0       	breq	.+10     	; 0x2a20a <mFilamentItem(unsigned int, unsigned int)+0xda>
            Sound_MakeSound(e_SOUND_TYPE_StandardPrompt);
   2a200:	82 e0       	ldi	r24, 0x02	; 2
   2a202:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
            bFilamentWaitingFlag = false;
   2a206:	10 92 61 06 	sts	0x0661, r1	; 0x800661 <bFilamentWaitingFlag>
        }

        if (filamentActionMenu) {
   2a20a:	20 97       	sbiw	r28, 0x00	; 0
   2a20c:	09 f4       	brne	.+2      	; 0x2a210 <mFilamentItem(unsigned int, unsigned int)+0xe0>
   2a20e:	af cf       	rjmp	.-162    	; 0x2a16e <mFilamentItem(unsigned int, unsigned int)+0x3e>
            // Reset the menu stack and filament action before entering action menu
            mFilamentResetMenuStack();
   2a210:	0f 94 9d 1d 	call	0x23b3a	; 0x23b3a <mFilamentResetMenuStack()>

            // 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 <menu_submenu(void (*)(), bool)>
        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 <bFilamentWaitingFlag>
   2a228:	88 23       	and	r24, r24
   2a22a:	41 f0       	breq	.+16     	; 0x2a23c <mFilamentItem(unsigned int, unsigned int)+0x10c>
   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 <menu_submenu(void (*)(), bool)>

    // 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 <mFilamentItem(unsigned int, unsigned int)+0xc8>
        case FilamentAction::AutoLoad:
        case FilamentAction::UnLoad:
            if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true);
            else
            {
                mFilamentResetMenuStack();
   2a23c:	0f 94 9d 1d 	call	0x23b3a	; 0x23b3a <mFilamentResetMenuStack()>
                if (eFilamentAction == FilamentAction::AutoLoad) {
   2a240:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   2a244:	82 30       	cpi	r24, 0x02	; 2
   2a246:	19 f4       	brne	.+6      	; 0x2a24e <mFilamentItem(unsigned int, unsigned int)+0x11e>
                    // loading no longer cancellable
                    eFilamentAction = FilamentAction::Load;
   2a248:	81 e0       	ldi	r24, 0x01	; 1
   2a24a:	80 93 a5 03 	sts	0x03A5, r24	; 0x8003a5 <eFilamentAction>
                }

                if (eFilamentAction == FilamentAction::Load)
   2a24e:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <eFilamentAction>
   2a252:	81 30       	cpi	r24, 0x01	; 1
   2a254:	31 f4       	brne	.+12     	; 0x2a262 <mFilamentItem(unsigned int, unsigned int)+0x132>
                    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 <enquecommand(char const*, bool)>
   2a260:	ea cf       	rjmp	.-44     	; 0x2a236 <mFilamentItem(unsigned int, unsigned int)+0x106>
                    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 <mFilamentItem(unsigned int, unsigned int)+0x106>
                    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 <mFilamentItem(unsigned int, unsigned int)+0x12c>
            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 <mFilamentItem(unsigned int, unsigned int)+0xc8>
            break;
        case FilamentAction::MmuUnLoad:
            mFilamentResetMenuStack();
   2a274:	0f 94 9d 1d 	call	0x23b3a	; 0x23b3a <mFilamentResetMenuStack()>
            MMU2::mmu2.unload();
   2a278:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>

            // 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 <clearFilamentAction() [clone .lto_priv.439]>
   2a280:	da cf       	rjmp	.-76     	; 0x2a236 <mFilamentItem(unsigned int, unsigned int)+0x106>
            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 <mFilamentItem(unsigned int, unsigned int)+0xc8>
            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 <mFilamentItem(unsigned int, unsigned int)+0xc8>
            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 <bFilamentWaitingFlag>
   2a292:	88 23       	and	r24, r24
   2a294:	21 f0       	breq	.+8      	; 0x2a29e <mFilamentItem(unsigned int, unsigned int)+0x16e>
   2a296:	80 91 6d 02 	lds	r24, 0x026D	; 0x80026d <lcd_draw_update>
   2a29a:	88 23       	and	r24, r24
   2a29c:	a1 f1       	breq	.+104    	; 0x2a306 <mFilamentItem(unsigned int, unsigned int)+0x1d6>
            // 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 <bFilamentWaitingFlag>

            // 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_draw_update>

            lcd_clear();
   2a2a8:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
            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(unsigned char, unsigned char, char const*)>
            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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>

            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 <lcd_set_cursor(unsigned char, unsigned char)>
            switch (eFilamentAction)
   2a2d2:	e0 91 a5 03 	lds	r30, 0x03A5	; 0x8003a5 <eFilamentAction>
   2a2d6:	e1 50       	subi	r30, 0x01	; 1
   2a2d8:	e8 30       	cpi	r30, 0x08	; 8
   2a2da:	a8 f4       	brcc	.+42     	; 0x2a306 <mFilamentItem(unsigned int, unsigned int)+0x1d6>
   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 <lang_get_translation>
   2a302:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
                // handled earlier
                break;
            }
        }

        if (bFilamentWaitingFlag) {
   2a306:	80 91 61 06 	lds	r24, 0x0661	; 0x800661 <bFilamentWaitingFlag>
   2a30a:	81 11       	cpse	r24, r1
            lcd_print_target_temps_first_line();
   2a30c:	0f 94 73 22 	call	0x244e6	; 0x244e6 <lcd_print_target_temps_first_line()>
        }

        if (lcd_clicked())
   2a310:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   2a314:	88 23       	and	r24, r24
   2a316:	09 f4       	brne	.+2      	; 0x2a31a <mFilamentItem(unsigned int, unsigned int)+0x1ea>
   2a318:	2a cf       	rjmp	.-428    	; 0x2a16e <mFilamentItem(unsigned int, unsigned int)+0x3e>
        {
            // Filament action canceled while preheating
            bFilamentWaitingFlag = false;
   2a31a:	10 92 61 06 	sts	0x0661, r1	; 0x800661 <bFilamentWaitingFlag>
            if (!bFilamentPreheatState)
   2a31e:	80 91 62 06 	lds	r24, 0x0662	; 0x800662 <bFilamentPreheatState>
   2a322:	81 11       	cpse	r24, r1
   2a324:	0e c0       	rjmp	.+28     	; 0x2a342 <mFilamentItem(unsigned int, unsigned int)+0x212>
  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 <target_temperature+0x1>
   2a32a:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
            {
                setTargetHotend(0);
                if (!printingIsPaused()) setTargetBed(0);
   2a32e:	0e 94 1d 67 	call	0xce3a	; 0xce3a <printingIsPaused()>
   2a332:	81 11       	cpse	r24, r1
   2a334:	04 c0       	rjmp	.+8      	; 0x2a33e <mFilamentItem(unsigned int, unsigned int)+0x20e>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   2a336:	10 92 72 06 	sts	0x0672, r1	; 0x800672 <target_temperature_bed+0x1>
   2a33a:	10 92 71 06 	sts	0x0671, r1	; 0x800671 <target_temperature_bed>
                menu_back();
   2a33e:	0f 94 52 d4 	call	0x3a8a4	; 0x3a8a4 <menu_back()>
            }
            menu_back();
   2a342:	0f 94 52 d4 	call	0x3a8a4	; 0x3a8a4 <menu_back()>
            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 <clearFilamentAction() [clone .lto_priv.439]>
            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 <mFilamentItem(unsigned int, unsigned int)+0x1ce>
                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 <mFilamentItem(unsigned int, unsigned int)+0x1ce>
                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 <mFilamentItem(unsigned int, unsigned int)+0x1ce>

0002a364 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>:
        }
    }
}

static void setFilamentAction(FilamentAction action) {
    eFilamentAction = action;
   2a364:	80 93 a5 03 	sts	0x03A5, r24	; 0x8003a5 <eFilamentAction>
    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 <MMU2::mmu2+0x6f>
   2a36c:	20 91 b5 0d 	lds	r18, 0x0DB5	; 0x800db5 <target_temperature>
   2a370:	30 91 b6 0d 	lds	r19, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   2a374:	41 30       	cpi	r20, 0x01	; 1
   2a376:	59 f0       	breq	.+22     	; 0x2a38e <preheat_or_continue(FilamentAction) [clone .lto_priv.438]+0x2a>

    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 <bFilamentSkipPreheat>
        && (action == FilamentAction::MmuCut ||  action == FilamentAction::MmuEject) );

    if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) {
   2a37c:	80 91 6b 02 	lds	r24, 0x026B	; 0x80026b <extrude_min_temp>
   2a380:	90 91 6c 02 	lds	r25, 0x026C	; 0x80026c <extrude_min_temp+0x1>
   2a384:	28 17       	cp	r18, r24
   2a386:	39 07       	cpc	r19, r25
   2a388:	5c f4       	brge	.+22     	; 0x2a3a0 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]+0x3c>
        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 <lcd_generic_preheat_menu()>

    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 <MMU2::mmu2+0x45>
   2a392:	91 11       	cpse	r25, r1
   2a394:	f1 cf       	rjmp	.-30     	; 0x2a378 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]+0x14>
        && (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 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]+0x14>

    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 <bFilamentSkipPreheat>
        && (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 <bFilamentPreheatState>
        mFilamentItem(target_temperature[0], target_temperature_bed);
   2a3a6:	60 91 71 06 	lds	r22, 0x0671	; 0x800671 <target_temperature_bed>
   2a3aa:	70 91 72 06 	lds	r23, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   2a3ae:	c9 01       	movw	r24, r18
   2a3b0:	0f 94 98 50 	call	0x2a130	; 0x2a130 <mFilamentItem(unsigned int, unsigned int)>
        bFilamentSkipPreheat = false; // Reset flag
   2a3b4:	10 92 63 06 	sts	0x0663, r1	; 0x800663 <bFilamentSkipPreheat>
    } else {
        lcd_generic_preheat_menu();
    }
}
   2a3b8:	08 95       	ret

0002a3ba <lcd_AutoLoadFilament()>:
{
    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 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0002a3c0 <lcd_LoadFilament() [clone .lto_priv.411]>:
    }
}

static void lcd_LoadFilament()
{
    preheat_or_continue(FilamentAction::Load);
   2a3c0:	81 e0       	ldi	r24, 0x01	; 1
   2a3c2:	0d 94 b2 51 	jmp	0x2a364	; 0x2a364 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0002a3c6 <lcd_unLoadFilament() [clone .lto_priv.412]>:
    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 <preheat_or_continue(FilamentAction) [clone .lto_priv.438]>

0002a3cc <mFilamentItem_PLA()>:
    mFilamentItem(FARM_PREHEAT_HOTEND_TEMP, 0);
}

static void mFilamentItem_PLA()
{
    bFilamentPreheatState = false;
   2a3cc:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a3dc <mFilamentItem_PET()>:
}

static void mFilamentItem_PET()
{
    bFilamentPreheatState = false;
   2a3dc:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a3ec <mFilamentItem_ASA()>:
}

static void mFilamentItem_ASA()
{
    bFilamentPreheatState = false;
   2a3ec:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a3fc <mFilamentItem_PC()>:
}

static void mFilamentItem_PC()
{
    bFilamentPreheatState = false;
   2a3fc:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a40c <mFilamentItem_PVB()>:
    mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_PVB()
{
    bFilamentPreheatState = false;
   2a40c:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a41c <mFilamentItem_PA()>:
    mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_PA()
{
    bFilamentPreheatState = false;
   2a41c:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a42c <mFilamentItem_ABS()>:
    mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_ABS()
{
    bFilamentPreheatState = false;
   2a42c:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a43c <mFilamentItem_HIPS()>:
    mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_HIPS()
{
    bFilamentPreheatState = false;
   2a43c:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a44c <mFilamentItem_PP()>:
}

static void mFilamentItem_PP()
{
    bFilamentPreheatState = false;
   2a44c:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a45c <mFilamentItem_FLEX()>:
}

static void mFilamentItem_FLEX()
{
    bFilamentPreheatState = false;
   2a45c:	10 92 62 06 	sts	0x0662, r1	; 0x800662 <bFilamentPreheatState>
    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 <mFilamentItem(unsigned int, unsigned int)>

0002a46c <lcd_dump_memory()>:
	}
    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 <Sound_MakeSound(eSOUND_TYPE)>
#include "xflash_dump.h"

static void lcd_dump_memory()
{
    lcd_beeper_quick_feedback();
    xfdump_dump();
   2a472:	0e 94 a3 ee 	call	0x1dd46	; 0x1dd46 <xfdump_dump()>
    lcd_return_to_status();
   2a476:	0d 94 82 1f 	jmp	0x23f04	; 0x23f04 <lcd_return_to_status()>

0002a47a <Sound_MakeCustom(unsigned int, unsigned int, bool)>:
     }
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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x14>
   2a486:	20 91 dd 04 	lds	r18, 0x04DD	; 0x8004dd <eSoundMode>
   2a48a:	22 30       	cpi	r18, 0x02	; 2
   2a48c:	d1 f0       	breq	.+52     	; 0x2a4c2 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x48>
   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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x52>
               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 <delay2>
	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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x84>
		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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x76>
		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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0xc2>
   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 <delay2>
}

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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x122>
   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 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x38>

0002a5c2 <sound_wait_for_user()>:
/// 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 <eSoundMode>
   2a5c8:	c2 30       	cpi	r28, 0x02	; 2
   2a5ca:	59 f1       	breq	.+86     	; 0x2a622 <sound_wait_for_user()+0x60>

     // 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 <sound_wait_for_user()+0x28>
          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_wait_for_user()+0x60>
          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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
          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 <Timer<unsigned short>::expired_cont(unsigned short)>
   2a5f6:	88 23       	and	r24, r24
   2a5f8:	a1 f0       	breq	.+40     	; 0x2a622 <sound_wait_for_user()+0x60>
          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 <Timer<unsigned short>::start()>
          if (eSoundMode == e_SOUND_MODE_LOUD) {
   2a602:	80 91 dd 04 	lds	r24, 0x04DD	; 0x8004dd <eSoundMode>
   2a606:	81 11       	cpse	r24, r1
   2a608:	08 c0       	rjmp	.+16     	; 0x2a61a <sound_wait_for_user()+0x58>
               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 <Sound_MakeCustom(unsigned int, unsigned int, bool)>
          } 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 <Sound_MakeSound(eSOUND_TYPE)>
          }
     }
#endif // BEEPER > 0
}
   2a622:	cf 91       	pop	r28
   2a624:	08 95       	ret

0002a626 <sm4_set_dir(unsigned char, unsigned char)>:

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 <sm4_set_dir(unsigned char, unsigned char)+0x32>
   2a62a:	83 30       	cpi	r24, 0x03	; 3
   2a62c:	e9 f0       	breq	.+58     	; 0x2a668 <sm4_set_dir(unsigned char, unsigned char)+0x42>
   2a62e:	81 30       	cpi	r24, 0x01	; 1
   2a630:	59 f0       	breq	.+22     	; 0x2a648 <sm4_set_dir(unsigned char, unsigned char)+0x22>
	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 <sm4_set_dir(unsigned char, unsigned char)+0x1e>
   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 <sm4_set_dir(unsigned char, unsigned char)+0x16>
	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 <sm4_set_dir(unsigned char, unsigned char)+0x2e>
   2a650:	82 60       	ori	r24, 0x02	; 2
   2a652:	f4 cf       	rjmp	.-24     	; 0x2a63c <sm4_set_dir(unsigned char, unsigned char)+0x16>
   2a654:	8d 7f       	andi	r24, 0xFD	; 253
   2a656:	f2 cf       	rjmp	.-28     	; 0x2a63c <sm4_set_dir(unsigned char, unsigned char)+0x16>
	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 <sm4_set_dir(unsigned char, unsigned char)+0x3e>
   2a660:	84 60       	ori	r24, 0x04	; 4
   2a662:	ec cf       	rjmp	.-40     	; 0x2a63c <sm4_set_dir(unsigned char, unsigned char)+0x16>
   2a664:	8b 7f       	andi	r24, 0xFB	; 251
   2a666:	ea cf       	rjmp	.-44     	; 0x2a63c <sm4_set_dir(unsigned char, unsigned char)+0x16>
	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 <sm4_set_dir(unsigned char, unsigned char)+0x4e>
   2a670:	80 64       	ori	r24, 0x40	; 64
   2a672:	e4 cf       	rjmp	.-56     	; 0x2a63c <sm4_set_dir(unsigned char, unsigned char)+0x16>
   2a674:	8f 7b       	andi	r24, 0xBF	; 191
   2a676:	e2 cf       	rjmp	.-60     	; 0x2a63c <sm4_set_dir(unsigned char, unsigned char)+0x16>

0002a678 <spiSend(unsigned char) [clone .lto_priv.382]>:
  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 <spiSend(unsigned char) [clone .lto_priv.382]+0x2>
}
   2a680:	08 95       	ret

0002a682 <spiRec() [clone .lto_priv.376]>:
  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 <spiRec() [clone .lto_priv.376]+0x4>
  return SPDR;
   2a68c:	8e b5       	in	r24, 0x2e	; 46
}
   2a68e:	08 95       	ret

0002a690 <Sd2Card::cardCommand(unsigned char, unsigned long)>:
  }
}
#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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x30>
   2a6ba:	81 e0       	ldi	r24, 0x01	; 1
   2a6bc:	96 30       	cpi	r25, 0x06	; 6
   2a6be:	09 f4       	brne	.+2      	; 0x2a6c2 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x32>
   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 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.358]>

  // 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 <spiSend(unsigned char) [clone .lto_priv.382]>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x68>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x60>
   2a6fc:	0f 94 3c 53 	call	0x2a678	; 0x2a678 <spiSend(unsigned char) [clone .lto_priv.382]>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x58>

  // 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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x8a>
  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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x8a>

  // 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 <spiSend(unsigned char) [clone .lto_priv.382]>

  // skip stuff byte for stop read
  if (cmd == CMD12) spiRec();
   2a71e:	cc 30       	cpi	r28, 0x0C	; 12
   2a720:	11 f4       	brne	.+4      	; 0x2a726 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x96>
   2a722:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>

  // 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 <spiRec() [clone .lto_priv.376]>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)+0xac>
   2a734:	cf 3f       	cpi	r28, 0xFF	; 255
   2a736:	11 f0       	breq	.+4      	; 0x2a73c <Sd2Card::cardCommand(unsigned char, unsigned long)+0xac>
   2a738:	cf 5f       	subi	r28, 0xFF	; 255
   2a73a:	f6 cf       	rjmp	.-20     	; 0x2a728 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x98>
  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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>:
 * \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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x20>
   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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x14>
  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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2a77c:	88 23       	and	r24, r24
   2a77e:	19 f0       	breq	.+6      	; 0x2a786 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x36>
  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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xa8>
}
//------------------------------------------------------------------------------
/** 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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x40>
    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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x4a>
    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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x40>
    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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x5c>
//------------------------------------------------------------------------------
// 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(unsigned char) [clone .lto_priv.382]>
  spiSend(0xff);  // dummy crc
   2a7b8:	8f ef       	ldi	r24, 0xFF	; 255
   2a7ba:	0f 94 3c 53 	call	0x2a678	; 0x2a678 <spiSend(unsigned char) [clone .lto_priv.382]>

  status_ = spiRec();
   2a7be:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xa0>
    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 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.358]>
   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 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x32>
    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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2a7e8:	88 23       	and	r24, r24
   2a7ea:	51 f0       	breq	.+20     	; 0x2a800 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xb0>
   2a7ec:	86 e1       	ldi	r24, 0x16	; 22
   2a7ee:	c9 cf       	rjmp	.-110    	; 0x2a782 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x32>
   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 <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  }
  chipSelectHigh();
  return true;

 fail:
  chipSelectHigh();
   2a7f8:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  return false;
   2a7fc:	10 e0       	ldi	r17, 0x00	; 0
   2a7fe:	06 c0       	rjmp	.+12     	; 0x2a80c <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xbc>
  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 <spiRec() [clone .lto_priv.376]>
   2a804:	81 11       	cpse	r24, r1
   2a806:	f2 cf       	rjmp	.-28     	; 0x2a7ec <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x9c>
    error(SD_CARD_ERROR_WRITE_PROGRAMMING);
    goto fail;
  }
  chipSelectHigh();
   2a808:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  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 <SdVolume::cacheFlush()>:

 fail:
  return false;
}
//------------------------------------------------------------------------------
bool SdVolume::cacheFlush() {
   2a818:	cf 93       	push	r28
  if (cacheDirty_) {
   2a81a:	80 91 98 0e 	lds	r24, 0x0E98	; 0x800e98 <SdVolume::cacheDirty_>
      }
      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 <SdVolume::cacheFlush()+0x34>
    if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) {
   2a824:	40 91 90 0e 	lds	r20, 0x0E90	; 0x800e90 <SdVolume::cacheBlockNumber_>
   2a828:	50 91 91 0e 	lds	r21, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2a82c:	60 91 92 0e 	lds	r22, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2a830:	70 91 93 0e 	lds	r23, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   2a834:	2c e9       	ldi	r18, 0x9C	; 156
   2a836:	3e e0       	ldi	r19, 0x0E	; 14
   2a838:	80 91 99 0e 	lds	r24, 0x0E99	; 0x800e99 <SdVolume::sdCard_>
   2a83c:	90 91 9a 0e 	lds	r25, 0x0E9A	; 0x800e9a <SdVolume::sdCard_+0x1>
   2a840:	0f 94 a8 53 	call	0x2a750	; 0x2a750 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
   2a844:	c8 2f       	mov	r28, r24
   2a846:	81 11       	cpse	r24, r1
   2a848:	04 c0       	rjmp	.+8      	; 0x2a852 <SdVolume::cacheFlush()+0x3a>
    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 <SdVolume::cacheMirrorBlock_>
   2a856:	50 91 95 0e 	lds	r21, 0x0E95	; 0x800e95 <SdVolume::cacheMirrorBlock_+0x1>
   2a85a:	60 91 96 0e 	lds	r22, 0x0E96	; 0x800e96 <SdVolume::cacheMirrorBlock_+0x2>
   2a85e:	70 91 97 0e 	lds	r23, 0x0E97	; 0x800e97 <SdVolume::cacheMirrorBlock_+0x3>
   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 <SdVolume::cacheFlush()+0x78>
      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 <SdVolume::sdCard_>
   2a874:	90 91 9a 0e 	lds	r25, 0x0E9A	; 0x800e9a <SdVolume::sdCard_+0x1>
   2a878:	0f 94 a8 53 	call	0x2a750	; 0x2a750 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
   2a87c:	88 23       	and	r24, r24
   2a87e:	29 f3       	breq	.-54     	; 0x2a84a <SdVolume::cacheFlush()+0x32>
        goto fail;
      }
      cacheMirrorBlock_ = 0;
   2a880:	10 92 94 0e 	sts	0x0E94, r1	; 0x800e94 <SdVolume::cacheMirrorBlock_>
   2a884:	10 92 95 0e 	sts	0x0E95, r1	; 0x800e95 <SdVolume::cacheMirrorBlock_+0x1>
   2a888:	10 92 96 0e 	sts	0x0E96, r1	; 0x800e96 <SdVolume::cacheMirrorBlock_+0x2>
   2a88c:	10 92 97 0e 	sts	0x0E97, r1	; 0x800e97 <SdVolume::cacheMirrorBlock_+0x3>
    }
    cacheDirty_ = 0;
   2a890:	10 92 98 0e 	sts	0x0E98, r1	; 0x800e98 <SdVolume::cacheDirty_>
   2a894:	db cf       	rjmp	.-74     	; 0x2a84c <SdVolume::cacheFlush()+0x34>

0002a896 <Sd2Card::readBlock(unsigned long, unsigned char*)>:
 * \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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x40>
   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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x34>
 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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2a8fc:	88 23       	and	r24, r24
   2a8fe:	79 f0       	breq	.+30     	; 0x2a91e <Sd2Card::readBlock(unsigned long, unsigned char*)+0x88>
   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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x72>
   2a906:	7a c0       	rjmp	.+244    	; 0x2a9fc <Sd2Card::readBlock(unsigned long, unsigned char*)+0x166>
    if (retryCnt > 0) goto retry;
    goto fail;
  }
  return true;
 retry:
   chipSelectHigh();
   2a908:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   errorCode_ = 0;
   2a91a:	18 82       	st	Y, r1
   2a91c:	e8 cf       	rjmp	.-48     	; 0x2a8ee <Sd2Card::readBlock(unsigned long, unsigned char*)+0x58>
#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 <millis2>
   2a922:	8b 01       	movw	r16, r22
  while ((status_ = spiRec()) == 0XFF) {
   2a924:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   2a928:	8a 83       	std	Y+2, r24	; 0x02
   2a92a:	8f 3f       	cpi	r24, 0xFF	; 255
   2a92c:	91 f4       	brne	.+36     	; 0x2a952 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xbc>
    if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) {
   2a92e:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x8e>
   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 <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  // 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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x6c>
    spiSend(0XFF);
   2a94a:	8f ef       	ldi	r24, 0xFF	; 255
   2a94c:	0f 94 3c 53 	call	0x2a678	; 0x2a678 <spiSend(unsigned char) [clone .lto_priv.382]>
   2a950:	d8 cf       	rjmp	.-80     	; 0x2a902 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x6c>
    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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xc4>
   2a956:	8f e0       	ldi	r24, 0x0F	; 15
   2a958:	f2 cf       	rjmp	.-28     	; 0x2a93e <Sd2Card::readBlock(unsigned long, unsigned char*)+0xa8>
//------------------------------------------------------------------------------
/** 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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xcc>
    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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xcc>
    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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xde>
  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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xee>
  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 <spiRec() [clone .lto_priv.376]>
   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 <spiRec() [clone .lto_priv.376]>
   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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x12e>
   2a9be:	f0 e2       	ldi	r31, 0x20	; 32
   2a9c0:	f8 83       	st	Y, r31
   2a9c2:	be cf       	rjmp	.-132    	; 0x2a940 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xaa>
#else
  // discard CRC
  spiRec();
  spiRec();
#endif
  chipSelectHigh();
   2a9c4:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  // 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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x16e>
    spiSend(0XFF);
   2a9ce:	8f ef       	ldi	r24, 0xFF	; 255
   2a9d0:	0f 94 3c 53 	call	0x2a678	; 0x2a678 <spiSend(unsigned char) [clone .lto_priv.382]>
#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 <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  return false;
   2aa00:	c0 e0       	ldi	r28, 0x00	; 0
   2aa02:	e8 cf       	rjmp	.-48     	; 0x2a9d4 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x13e>
  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 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x13e>

0002aa08 <SdVolume::cacheRawBlock(unsigned long, bool)>:

 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 <SdVolume::cacheBlockNumber_>
   2aa1c:	90 91 91 0e 	lds	r25, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2aa20:	a0 91 92 0e 	lds	r26, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2aa24:	b0 91 93 0e 	lds	r27, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdVolume::cacheRawBlock(unsigned long, bool)+0x6a>
    if (!cacheFlush()) goto fail;
   2aa32:	0f 94 0c 54 	call	0x2a818	; 0x2a818 <SdVolume::cacheFlush()>
   2aa36:	81 11       	cpse	r24, r1
   2aa38:	08 c0       	rjmp	.+16     	; 0x2aa4a <SdVolume::cacheRawBlock(unsigned long, bool)+0x42>
  }
  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 <SdVolume::sdCard_>
   2aa56:	90 91 9a 0e 	lds	r25, 0x0E9A	; 0x800e9a <SdVolume::sdCard_+0x1>
   2aa5a:	0f 94 4b 54 	call	0x2a896	; 0x2a896 <Sd2Card::readBlock(unsigned long, unsigned char*)>
   2aa5e:	88 23       	and	r24, r24
   2aa60:	61 f3       	breq	.-40     	; 0x2aa3a <SdVolume::cacheRawBlock(unsigned long, bool)+0x32>
    cacheBlockNumber_ = blockNumber;
   2aa62:	c0 92 90 0e 	sts	0x0E90, r12	; 0x800e90 <SdVolume::cacheBlockNumber_>
   2aa66:	d0 92 91 0e 	sts	0x0E91, r13	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2aa6a:	e0 92 92 0e 	sts	0x0E92, r14	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2aa6e:	f0 92 93 0e 	sts	0x0E93, r15	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
  }
  if (dirty) cacheDirty_ = true;
   2aa72:	cc 23       	and	r28, r28
   2aa74:	21 f0       	breq	.+8      	; 0x2aa7e <SdVolume::cacheRawBlock(unsigned long, bool)+0x76>
   2aa76:	81 e0       	ldi	r24, 0x01	; 1
   2aa78:	80 93 98 0e 	sts	0x0E98, r24	; 0x800e98 <SdVolume::cacheDirty_>
   2aa7c:	df cf       	rjmp	.-66     	; 0x2aa3c <SdVolume::cacheRawBlock(unsigned long, bool)+0x34>
  return true;
   2aa7e:	c1 e0       	ldi	r28, 0x01	; 1
   2aa80:	dd cf       	rjmp	.-70     	; 0x2aa3c <SdVolume::cacheRawBlock(unsigned long, bool)+0x34>

0002aa82 <SdVolume::fatPut(unsigned long, unsigned long)>:
 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 <SdVolume::fatPut(unsigned long, unsigned long)+0x50>
  // 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 <SdVolume::fatPut(unsigned long, unsigned long)+0x2c>
      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 <SdVolume::fatPut(unsigned long, unsigned long)+0xe0>
    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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2ab1a:	88 23       	and	r24, r24
   2ab1c:	41 f2       	breq	.-112    	; 0x2aaae <SdVolume::fatPut(unsigned long, unsigned long)+0x2c>
  // 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 <SdVolume::fatPut(unsigned long, unsigned long)+0x102>
    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 <SdVolume::fatPut(unsigned long, unsigned long)+0xbe>
   2ab3e:	b8 cf       	rjmp	.-144    	; 0x2aab0 <SdVolume::fatPut(unsigned long, unsigned long)+0x2e>
   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 <SdVolume::cacheMirrorBlock_>
   2ab54:	90 92 95 0e 	sts	0x0E95, r9	; 0x800e95 <SdVolume::cacheMirrorBlock_+0x1>
   2ab58:	a0 92 96 0e 	sts	0x0E96, r10	; 0x800e96 <SdVolume::cacheMirrorBlock_+0x2>
   2ab5c:	b0 92 97 0e 	sts	0x0E97, r11	; 0x800e97 <SdVolume::cacheMirrorBlock_+0x3>
   2ab60:	a7 cf       	rjmp	.-178    	; 0x2aab0 <SdVolume::fatPut(unsigned long, unsigned long)+0x2e>
    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 <SdVolume::fatPut(unsigned long, unsigned long)+0xe6>
   2ab66:	a3 cf       	rjmp	.-186    	; 0x2aaae <SdVolume::fatPut(unsigned long, unsigned long)+0x2c>
    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 <SdVolume::fatPut(unsigned long, unsigned long)+0xf4>
   2ab82:	be cf       	rjmp	.-132    	; 0x2ab00 <SdVolume::fatPut(unsigned long, unsigned long)+0x7e>
  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 <SdVolume::fatPut(unsigned long, unsigned long)+0xb6>

0002aba6 <SdVolume::fatGet(unsigned long, unsigned long*)>:
 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 <SdVolume::fatGet(unsigned long, unsigned long*)+0x3e>
    *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 <SdVolume::fatGet(unsigned long, unsigned long*)+0xae>
    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 <SdVolume::cacheBlockNumber_>
   2ac0e:	50 91 91 0e 	lds	r21, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2ac12:	60 91 92 0e 	lds	r22, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2ac16:	70 91 93 0e 	lds	r23, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdVolume::fatGet(unsigned long, unsigned long*)+0xd0>
    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 <SdVolume::fatGet(unsigned long, unsigned long*)+0xe0>
    *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 <SdVolume::fatGet(unsigned long, unsigned long*)+0x2c>
    *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 <SdVolume::fatGet(unsigned long, unsigned long*)+0xb4>
   2ac58:	bb cf       	rjmp	.-138    	; 0x2abd0 <SdVolume::fatGet(unsigned long, unsigned long*)+0x2a>
    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 <SdVolume::fatGet(unsigned long, unsigned long*)+0xc2>
   2ac74:	c2 cf       	rjmp	.-124    	; 0x2abfa <SdVolume::fatGet(unsigned long, unsigned long*)+0x54>
  } 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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2ac80:	81 11       	cpse	r24, r1
   2ac82:	d0 cf       	rjmp	.-96     	; 0x2ac24 <SdVolume::fatGet(unsigned long, unsigned long*)+0x7e>
   2ac84:	a5 cf       	rjmp	.-182    	; 0x2abd0 <SdVolume::fatGet(unsigned long, unsigned long*)+0x2a>
  }
  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 <SdVolume::fatGet(unsigned long, unsigned long*)+0xa2>

0002acac <SdVolume::chainSize(unsigned long, unsigned long*)>:
 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 <SdVolume::chainSize(unsigned long, unsigned long*)+0x1e>
   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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   2ad00:	88 23       	and	r24, r24
   2ad02:	19 f1       	breq	.+70     	; 0x2ad4a <SdVolume::chainSize(unsigned long, unsigned long*)+0x9e>
    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 <SdVolume::chainSize(unsigned long, unsigned long*)+0x6a>
   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 <SdVolume::chainSize(unsigned long, unsigned long*)+0x62>
   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 <SdVolume::chainSize(unsigned long, unsigned long*)+0xc4>
   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 <SdVolume::chainSize(unsigned long, unsigned long*)+0x40>
  *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 <SdVolume::chainSize(unsigned long, unsigned long*)+0xd2>
   2ad7c:	b7 cf       	rjmp	.-146    	; 0x2acec <SdVolume::chainSize(unsigned long, unsigned long*)+0x40>
   2ad7e:	e0 cf       	rjmp	.-64     	; 0x2ad40 <SdVolume::chainSize(unsigned long, unsigned long*)+0x94>

0002ad80 <SdBaseFile::openRoot(SdVolume*)>:
 * \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 <SdBaseFile::openRoot(SdVolume*)+0x1c>
  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 <SdBaseFile::openRoot(SdVolume*)+0x76>
    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 <SdBaseFile::openRoot(SdVolume*)+0x3e>
   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 <SdBaseFile::openRoot(SdVolume*)+0x12>

  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 <SdBaseFile::openRoot(SdVolume*)+0x10>
    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 <SdVolume::chainSize(unsigned long, unsigned long*)>
   2ae1a:	81 11       	cpse	r24, r1
   2ae1c:	da cf       	rjmp	.-76     	; 0x2add2 <SdBaseFile::openRoot(SdVolume*)+0x52>
   2ae1e:	b8 cf       	rjmp	.-144    	; 0x2ad90 <SdBaseFile::openRoot(SdVolume*)+0x10>

0002ae20 <SdFile::gfComputeNextFileBlock()>:
        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 <SdFile::gfComputeNextFileBlock()+0x28>
   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 <SdFile::gfComputeNextFileBlock()+0x16>

    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 <SdFile::gfComputeNextFileBlock()+0x48>
    if (type_ == FAT_FILE_TYPE_ROOT_FIXED) {
   2ae74:	e2 30       	cpi	r30, 0x02	; 2
   2ae76:	79 f4       	brne	.+30     	; 0x2ae96 <SdFile::gfComputeNextFileBlock()+0x76>
        // 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 <SdFile::gfComputeNextFileBlock()+0x18>
  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 <SdFile::gfComputeNextFileBlock()+0x9e>
   2aea2:	11 11       	cpse	r17, r1
   2aea4:	0c c0       	rjmp	.+24     	; 0x2aebe <SdFile::gfComputeNextFileBlock()+0x9e>
            // 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 <SdFile::gfComputeNextFileBlock()+0xda>
                // 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 <SdFile::gfComputeNextFileBlock()+0xbc>
   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 <SdFile::gfComputeNextFileBlock()+0xb4>
   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 <SdFile::gfComputeNextFileBlock()+0x6a>
            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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   2af0c:	81 11       	cpse	r24, r1
   2af0e:	d7 cf       	rjmp	.-82     	; 0x2aebe <SdFile::gfComputeNextFileBlock()+0x9e>
   2af10:	92 cf       	rjmp	.-220    	; 0x2ae36 <SdFile::gfComputeNextFileBlock()+0x16>

0002af12 <SdBaseFile::seekSet(unsigned long)>:
 * \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 <SdBaseFile::seekSet(unsigned long)+0x3c>

 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 <SdBaseFile::seekSet(unsigned long)+0x20>
   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 <SdBaseFile::seekSet(unsigned long)+0x62>
    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 <SdBaseFile::seekSet(unsigned long)+0x22>

  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 <SdBaseFile::seekSet(unsigned long)+0x7e>
    // 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 <SdBaseFile::seekSet(unsigned long)+0x5e>
    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 <SdBaseFile::seekSet(unsigned long)+0xa8>
   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 <SdBaseFile::seekSet(unsigned long)+0xa0>
  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 <SdBaseFile::seekSet(unsigned long)+0xc4>
   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 <SdBaseFile::seekSet(unsigned long)+0xbc>

  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 <SdBaseFile::seekSet(unsigned long)+0xda>
   2afe4:	01 2b       	or	r16, r17
   2afe6:	02 2b       	or	r16, r18
   2afe8:	03 2b       	or	r16, r19
   2afea:	11 f5       	brne	.+68     	; 0x2b030 <SdBaseFile::seekSet(unsigned long)+0x11e>
    // 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 <SdBaseFile::seekSet(unsigned long)+0xfc>
   2b00c:	ad cf       	rjmp	.-166    	; 0x2af68 <SdBaseFile::seekSet(unsigned long)+0x56>
    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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   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 <SdBaseFile::seekSet(unsigned long)+0xf0>
   2b02e:	81 cf       	rjmp	.-254    	; 0x2af32 <SdBaseFile::seekSet(unsigned long)+0x20>
  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 <SdBaseFile::seekSet(unsigned long)+0xea>

0002b03a <SdBaseFile::addCluster()>:
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 <SdBaseFile::addCluster()+0x74>
   2b0ac:	59 c0       	rjmp	.+178    	; 0x2b160 <SdBaseFile::addCluster()+0x126>
    // 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 <SdBaseFile::addCluster()+0xaa>
   2b0e2:	56 c0       	rjmp	.+172    	; 0x2b190 <SdBaseFile::addCluster()+0x156>

    // 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 <SdBaseFile::addCluster()+0xd0>
      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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   2b11a:	88 23       	and	r24, r24
   2b11c:	c9 f1       	breq	.+114    	; 0x2b190 <SdBaseFile::addCluster()+0x156>

    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 <SdBaseFile::addCluster()+0x134>
      // 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 <SdBaseFile::addCluster()+0x8c>

    // 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 <SdBaseFile::addCluster()+0x80>
    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 <SdBaseFile::addCluster()+0x102>
  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 <SdVolume::fatPut(unsigned long, unsigned long)>
   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 <SdBaseFile::addCluster()+0x18a>
    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 <SdBaseFile::addCluster()+0x1ac>
    // 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 <SdVolume::fatPut(unsigned long, unsigned long)>
   2b1e2:	88 23       	and	r24, r24
   2b1e4:	a9 f2       	breq	.-86     	; 0x2b190 <SdBaseFile::addCluster()+0x156>
  }
  // 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 <SdBaseFile::addCluster()+0x1d2>
   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 <SdBaseFile::addCluster()+0x1e6>
   2b21e:	b9 cf       	rjmp	.-142    	; 0x2b192 <SdBaseFile::addCluster()+0x158>
    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 <SdBaseFile::addCluster()+0x158>

0002b230 <SdBaseFile::cacheDirEntry(unsigned char)>:
  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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2b246:	88 23       	and	r24, r24
   2b248:	51 f0       	breq	.+20     	; 0x2b25e <SdBaseFile::cacheDirEntry(unsigned char)+0x2e>
  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 <SdBaseFile::cacheDirEntry(unsigned char)+0x28>

0002b264 <SdBaseFile::sync()>:
 * \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 <SdBaseFile::sync()+0x5e>

  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 <SdBaseFile::sync()+0x56>
    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 <SdBaseFile::cacheDirEntry(unsigned char)>
   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 <SdBaseFile::sync()+0x5e>
   2b284:	80 81       	ld	r24, Z
   2b286:	85 3e       	cpi	r24, 0xE5	; 229
   2b288:	e1 f0       	breq	.+56     	; 0x2b2c2 <SdBaseFile::sync()+0x5e>

    // 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 <SdBaseFile::sync()+0x3c>
   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 <SdVolume::cacheFlush()>

 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 <SdBaseFile::close()>:
 *
 * \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 <SdBaseFile::sync()>
  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 <SdBaseFile::getFilename(char*)>:
 * \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 <SdBaseFile::getFilename(char*)+0x16>
   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 <SdBaseFile::getFilename(char*)+0x26>
    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 <SdBaseFile::getFilename(char*)+0x10>
    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 <SdBaseFile::cacheDirEntry(unsigned char)>
  if (!p) return false;
   2b30c:	00 97       	sbiw	r24, 0x00	; 0
   2b30e:	79 f3       	breq	.-34     	; 0x2b2ee <SdBaseFile::getFilename(char*)+0xe>
   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 <SdBaseFile::getFilename(char*)+0x64>
    if (i == 8) name[j++] = '.';
   2b31e:	88 30       	cpi	r24, 0x08	; 8
   2b320:	31 f4       	brne	.+12     	; 0x2b32e <SdBaseFile::getFilename(char*)+0x4e>
   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 <SdBaseFile::getFilename(char*)+0x38>
    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 <SdBaseFile::getFilename(char*)+0x22>

0002b354 <SdBaseFile::read(void*, unsigned int)>:
 * 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 <SdBaseFile::read(void*, unsigned int)+0x26>
   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 <SdBaseFile::read(void*, unsigned int)+0x70>
    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 <SdBaseFile::read(void*, unsigned int)+0x3e>

  // 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 <SdBaseFile::read(void*, unsigned int)+0xac>
    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 <SdBaseFile::read(void*, unsigned int)+0xc6>
   2b418:	b7 c0       	rjmp	.+366    	; 0x2b588 <SdBaseFile::read(void*, unsigned int)+0x234>
    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 <SdBaseFile::read(void*, unsigned int)+0xea>
    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 <SdBaseFile::read(void*, unsigned int)+0x160>
      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 <SdBaseFile::read(void*, unsigned int)+0x120>
   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 <SdBaseFile::read(void*, unsigned int)+0x144>
   2b47c:	20 91 90 0e 	lds	r18, 0x0E90	; 0x800e90 <SdVolume::cacheBlockNumber_>
   2b480:	30 91 91 0e 	lds	r19, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2b484:	40 91 92 0e 	lds	r20, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2b488:	50 91 93 0e 	lds	r21, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdBaseFile::read(void*, unsigned int)+0x144>
   2b496:	59 c0       	rjmp	.+178    	; 0x2b54a <SdBaseFile::read(void*, unsigned int)+0x1f6>
      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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2b49e:	88 23       	and	r24, r24
   2b4a0:	09 f4       	brne	.+2      	; 0x2b4a4 <SdBaseFile::read(void*, unsigned int)+0x150>
   2b4a2:	77 cf       	rjmp	.-274    	; 0x2b392 <SdBaseFile::read(void*, unsigned int)+0x3e>
      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 <memcpy>
   2b4b2:	57 c0       	rjmp	.+174    	; 0x2b562 <SdBaseFile::read(void*, unsigned int)+0x20e>
  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 <SdBaseFile::read(void*, unsigned int)+0x18e>
   2b4c2:	11 11       	cpse	r17, r1
   2b4c4:	0e c0       	rjmp	.+28     	; 0x2b4e2 <SdBaseFile::read(void*, unsigned int)+0x18e>
        // 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 <SdBaseFile::read(void*, unsigned int)+0x1d8>
          // 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 <SdBaseFile::read(void*, unsigned int)+0x1ba>
   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 <SdBaseFile::read(void*, unsigned int)+0x1b2>
   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 <SdBaseFile::read(void*, unsigned int)+0x112>
        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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   2b544:	81 11       	cpse	r24, r1
   2b546:	cd cf       	rjmp	.-102    	; 0x2b4e2 <SdBaseFile::read(void*, unsigned int)+0x18e>
   2b548:	24 cf       	rjmp	.-440    	; 0x2b392 <SdBaseFile::read(void*, unsigned int)+0x3e>
    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 <SdVolume::sdCard_>
   2b554:	90 91 9a 0e 	lds	r25, 0x0E9A	; 0x800e9a <SdVolume::sdCard_+0x1>
   2b558:	0f 94 4b 54 	call	0x2a896	; 0x2a896 <Sd2Card::readBlock(unsigned long, unsigned char*)>
    // 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 <SdBaseFile::read(void*, unsigned int)+0x20e>
   2b560:	18 cf       	rjmp	.-464    	; 0x2b392 <SdBaseFile::read(void*, unsigned int)+0x3e>
      // 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 <SdBaseFile::read(void*, unsigned int)+0xbe>
  }
  return nbyte;
   2b588:	c7 01       	movw	r24, r14
   2b58a:	05 cf       	rjmp	.-502    	; 0x2b396 <SdBaseFile::read(void*, unsigned int)+0x42>

0002b58c <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]>:
 * 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 <SdBaseFile::read(void*, unsigned int)>
    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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x46>
   2b5b6:	21 e0       	ldi	r18, 0x01	; 1
   2b5b8:	89 2b       	or	r24, r25
   2b5ba:	09 f4       	brne	.+2      	; 0x2b5be <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x32>
   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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x4e>
   2b5d8:	3f c0       	rjmp	.+126    	; 0x2b658 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xcc>
    // 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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x18>
   2b5de:	2e 32       	cpi	r18, 0x2E	; 46
   2b5e0:	09 f3       	breq	.-62     	; 0x2b5a4 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x18>
    //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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
   2b5ea:	e1 14       	cp	r14, r1
   2b5ec:	f1 04       	cpc	r15, r1
   2b5ee:	81 f1       	breq	.+96     	; 0x2b650 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
    {
    	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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
   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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
    	{
			//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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x18>
   2b656:	b5 cf       	rjmp	.-150    	; 0x2b5c2 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x36>

  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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x36>

0002b65c <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)>:
  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 <SdBaseFile::rewind()>
}
//------------------------------------------------------------------------------
// 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x5e>
   2b6b8:	52 c0       	rjmp	.+164    	; 0x2b75e <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x102>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x60>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x80>
  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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x236>
 * \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 <SdBaseFile::read(void*, unsigned int)>
   2b6ec:	01 97       	sbiw	r24, 0x01	; 1
   2b6ee:	a1 f7       	brne	.-24     	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xd6>
   2b722:	85 3e       	cpi	r24, 0xE5	; 229
   2b724:	09 f0       	breq	.+2      	; 0x2b728 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xcc>
   2b726:	4c c0       	rjmp	.+152    	; 0x2b7c0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x164>
      // remember first empty slot
      if (!emptyFound) {
   2b728:	77 20       	and	r7, r7
   2b72a:	29 f0       	breq	.+10     	; 0x2b736 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xda>
  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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x40>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xf6>
        dirBlock_ = dirFile->vol_->cacheBlockNumber();
   2b736:	80 91 90 0e 	lds	r24, 0x0E90	; 0x800e90 <SdVolume::cacheBlockNumber_>
   2b73a:	90 91 91 0e 	lds	r25, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2b73e:	a0 91 92 0e 	lds	r26, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2b742:	b0 91 93 0e 	lds	r27, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xd0>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x10c>
   2b766:	b8 cf       	rjmp	.-144    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
    if (emptyFound) {
   2b768:	77 20       	and	r7, r7
   2b76a:	09 f4       	brne	.+2      	; 0x2b76e <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x112>
   2b76c:	a2 c0       	rjmp	.+324    	; 0x2b8b2 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x256>
      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 <SdBaseFile::cacheDirEntry(unsigned char)>
      if (!p) goto fail;
   2b77a:	00 97       	sbiw	r24, 0x00	; 0
   2b77c:	09 f4       	brne	.+2      	; 0x2b780 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x124>
   2b77e:	ac cf       	rjmp	.-168    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
      // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x128>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x134>
    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 <SdVolume::cacheFlush()>
   2b7ba:	81 11       	cpse	r24, r1
   2b7bc:	09 c0       	rjmp	.+18     	; 0x2b7d0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x174>
   2b7be:	8c cf       	rjmp	.-232    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
        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 <memcmp>
   2b7ca:	89 2b       	or	r24, r25
   2b7cc:	09 f0       	breq	.+2      	; 0x2b7d0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x174>
   2b7ce:	66 cf       	rjmp	.-308    	; 0x2b69c <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x40>
}
//------------------------------------------------------------------------------
// 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x192>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x192>
   2b7ec:	fc c0       	rjmp	.+504    	; 0x2b9e6 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x38a>
}
//------------------------------------------------------------------------------
// 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 <SdVolume::cacheBlockNumber_>
   2b7f8:	50 91 91 0e 	lds	r21, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2b7fc:	60 91 92 0e 	lds	r22, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2b800:	70 91 93 0e 	lds	r23, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x1fc>
   2b856:	b9 c0       	rjmp	.+370    	; 0x2b9ca <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x36e>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x236>
   2b88c:	c8 01       	movw	r24, r16
   2b88e:	0f 94 74 77 	call	0x2eee8	; 0x2eee8 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]>
  // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x264>
   2b8be:	0c cf       	rjmp	.-488    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
// 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x27c>
   2b8d6:	00 cf       	rjmp	.-512    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  if (!addCluster()) goto fail;
   2b8d8:	c7 01       	movw	r24, r14
   2b8da:	0f 94 1d 58 	call	0x2b03a	; 0x2b03a <SdBaseFile::addCluster()>
   2b8de:	88 23       	and	r24, r24
   2b8e0:	09 f4       	brne	.+2      	; 0x2b8e4 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x288>
   2b8e2:	fa ce       	rjmp	.-524    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
  if (!vol_->cacheFlush()) goto fail;
   2b8e4:	0f 94 0c 54 	call	0x2a818	; 0x2a818 <SdVolume::cacheFlush()>
   2b8e8:	88 23       	and	r24, r24
   2b8ea:	09 f4       	brne	.+2      	; 0x2b8ee <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x292>
   2b8ec:	f5 ce       	rjmp	.-534    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x2be>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x2b6>
   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 <SdVolume::cacheDirty_>
    cacheBlockNumber_  = blockNumber;
   2b934:	40 92 90 0e 	sts	0x0E90, r4	; 0x800e90 <SdVolume::cacheBlockNumber_>
   2b938:	50 92 91 0e 	sts	0x0E91, r5	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2b93c:	60 92 92 0e 	sts	0x0E92, r6	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2b940:	70 92 93 0e 	sts	0x0E93, r7	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>

  // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x2f4>

  // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x334>
    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 <SdVolume::sdCard_>
   2b97e:	90 91 9a 0e 	lds	r25, 0x0E9A	; 0x800e9a <SdVolume::sdCard_+0x1>
   2b982:	0f 94 a8 53 	call	0x2a750	; 0x2a750 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
    if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail;
   2b986:	88 23       	and	r24, r24
   2b988:	09 f4       	brne	.+2      	; 0x2b98c <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x330>
   2b98a:	a6 ce       	rjmp	.-692    	; 0x2b6d8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x300>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x348>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x340>
   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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x124>

  // 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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x38a>
    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 <SdVolume::chainSize(unsigned long, unsigned long*)>
   2b9d8:	88 23       	and	r24, r24
   2b9da:	29 f0       	breq	.+10     	; 0x2b9e6 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x38a>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x212>
  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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

0002b9ee <recover_print(unsigned char)>:
        // 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 <lang_get_translation>
   2ba20:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
    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 <current_position>
   2ba28:	10 92 92 06 	sts	0x0692, r1	; 0x800692 <current_position+0x1>
   2ba2c:	10 92 93 06 	sts	0x0693, r1	; 0x800693 <current_position+0x2>
   2ba30:	10 92 94 06 	sts	0x0694, r1	; 0x800694 <current_position+0x3>
    current_position[Y_AXIS] = 0;
   2ba34:	10 92 95 06 	sts	0x0695, r1	; 0x800695 <current_position+0x4>
   2ba38:	10 92 96 06 	sts	0x0696, r1	; 0x800696 <current_position+0x5>
   2ba3c:	10 92 97 06 	sts	0x0697, r1	; 0x800697 <current_position+0x6>
   2ba40:	10 92 98 06 	sts	0x0698, r1	; 0x800698 <current_position+0x7>
   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 <eeprom_read_block>
        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 <recover_print(unsigned char)+0x8e>
            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 <recover_print(unsigned char)+0x66>
        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 <eeprom_read_dword>
   2bad0:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   2bad4:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   2bad8:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   2badc:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>

    // 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 <eeprom_read_dword>
   2bae8:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   2baec:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   2baf0:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   2baf4:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>

    // 3) Initialize the logical to physical coordinate system transformation.
    world2machine_initialize();
   2baf8:	0f 94 8f ce 	call	0x39d1e	; 0x39d1e <world2machine_initialize()>

    // 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 <babystep_load()>

    // 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 <clamp_to_software_endstops(float*)>
    set_destination_to_current();
   2bb08:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
    plan_set_position_curposXYZE();
   2bb0c:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
    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 <serialprintPGM(char const*)>
    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 <current_position+0xb>
   2bb1c:	8f 93       	push	r24
   2bb1e:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   2bb22:	8f 93       	push	r24
   2bb24:	80 91 9a 06 	lds	r24, 0x069A	; 0x80069a <current_position+0x9>
   2bb28:	8f 93       	push	r24
   2bb2a:	80 91 99 06 	lds	r24, 0x0699	; 0x800699 <current_position+0x8>
   2bb2e:	8f 93       	push	r24
   2bb30:	80 91 98 06 	lds	r24, 0x0698	; 0x800698 <current_position+0x7>
   2bb34:	8f 93       	push	r24
   2bb36:	80 91 97 06 	lds	r24, 0x0697	; 0x800697 <current_position+0x6>
   2bb3a:	8f 93       	push	r24
   2bb3c:	80 91 96 06 	lds	r24, 0x0696	; 0x800696 <current_position+0x5>
   2bb40:	8f 93       	push	r24
   2bb42:	80 91 95 06 	lds	r24, 0x0695	; 0x800695 <current_position+0x4>
   2bb46:	8f 93       	push	r24
   2bb48:	80 91 94 06 	lds	r24, 0x0694	; 0x800694 <current_position+0x3>
   2bb4c:	8f 93       	push	r24
   2bb4e:	80 91 93 06 	lds	r24, 0x0693	; 0x800693 <current_position+0x2>
   2bb52:	8f 93       	push	r24
   2bb54:	80 91 92 06 	lds	r24, 0x0692	; 0x800692 <current_position+0x1>
   2bb58:	8f 93       	push	r24
   2bb5a:	80 91 91 06 	lds	r24, 0x0691	; 0x800691 <current_position>
   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 <printf_P>
    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 <axis_known_position+0x2>
    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 <eeprom_read_word>
   2bb7c:	90 93 b6 0d 	sts	0x0DB6, r25	; 0x800db6 <target_temperature+0x1>
   2bb80:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <target_temperature>
    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 <eeprom_read_byte>
   2bb8c:	90 e0       	ldi	r25, 0x00	; 0
   2bb8e:	90 93 72 06 	sts	0x0672, r25	; 0x800672 <target_temperature_bed+0x1>
   2bb92:	80 93 71 06 	sts	0x0671, r24	; 0x800671 <target_temperature_bed>

    // 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 <eeprom_read_dword>
   2bb9e:	60 93 93 02 	sts	0x0293, r22	; 0x800293 <extruder_multiplier>
   2bba2:	70 93 94 02 	sts	0x0294, r23	; 0x800294 <extruder_multiplier+0x1>
   2bba6:	80 93 95 02 	sts	0x0295, r24	; 0x800295 <extruder_multiplier+0x2>
   2bbaa:	90 93 96 02 	sts	0x0296, r25	; 0x800296 <extruder_multiplier+0x3>
    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 <eeprom_read_word>
   2bbb6:	90 93 bd 02 	sts	0x02BD, r25	; 0x8002bd <extrudemultiply+0x1>
   2bbba:	80 93 bc 02 	sts	0x02BC, r24	; 0x8002bc <extrudemultiply>

    // 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 <eeprom_read_block>

    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 <eeprom_read_word>
   2bbd6:	90 93 69 05 	sts	0x0569, r25	; 0x800569 <saved_segment_idx+0x1>
   2bbda:	80 93 68 05 	sts	0x0568, r24	; 0x800568 <saved_segment_idx>

#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 <eeprom_read_dword>
   2bbe6:	60 93 64 05 	sts	0x0564, r22	; 0x800564 <extruder_advance_K>
   2bbea:	70 93 65 05 	sts	0x0565, r23	; 0x800565 <extruder_advance_K+0x1>
   2bbee:	80 93 66 05 	sts	0x0566, r24	; 0x800566 <extruder_advance_K+0x2>
   2bbf2:	90 93 67 05 	sts	0x0567, r25	; 0x800567 <extruder_advance_K+0x3>
#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 <eeprom_read_word>
   2bbfe:	90 93 6c 02 	sts	0x026C, r25	; 0x80026c <extrude_min_temp+0x1>
   2bc02:	80 93 6b 02 	sts	0x026B, r24	; 0x80026b <extrude_min_temp>
#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>
    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>
    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>
    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 <eeprom_read_block>
    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 <eeprom_read_dword>
   2bc4e:	60 93 f9 0d 	sts	0x0DF9, r22	; 0x800df9 <cs+0x3c>
   2bc52:	70 93 fa 0d 	sts	0x0DFA, r23	; 0x800dfa <cs+0x3d>
   2bc56:	80 93 fb 0d 	sts	0x0DFB, r24	; 0x800dfb <cs+0x3e>
   2bc5a:	90 93 fc 0d 	sts	0x0DFC, r25	; 0x800dfc <cs+0x3f>
    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 <eeprom_read_dword>
   2bc66:	60 93 fd 0d 	sts	0x0DFD, r22	; 0x800dfd <cs+0x40>
   2bc6a:	70 93 fe 0d 	sts	0x0DFE, r23	; 0x800dfe <cs+0x41>
   2bc6e:	80 93 ff 0d 	sts	0x0DFF, r24	; 0x800dff <cs+0x42>
   2bc72:	90 93 00 0e 	sts	0x0E00, r25	; 0x800e00 <cs+0x43>
    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 <eeprom_read_dword>
   2bc7e:	60 93 01 0e 	sts	0x0E01, r22	; 0x800e01 <cs+0x44>
   2bc82:	70 93 02 0e 	sts	0x0E02, r23	; 0x800e02 <cs+0x45>
   2bc86:	80 93 03 0e 	sts	0x0E03, r24	; 0x800e03 <cs+0x46>
   2bc8a:	90 93 04 0e 	sts	0x0E04, r25	; 0x800e04 <cs+0x47>
    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 <eeprom_read_block>
    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 <eeprom_read_byte>
   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 <recover_print(unsigned char)+0x2f2>
        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 <current_position+0x8>
   2bcc0:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   2bcc4:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   2bcc8:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   2bccc:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   2bcd0:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   2bcd4:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   2bcd8:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   2bcdc:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
    }

    // 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 <eeprom_read_byte>
   2bce8:	81 11       	cpse	r24, r1
   2bcea:	23 c0       	rjmp	.+70     	; 0x2bd32 <recover_print(unsigned char)+0x344>
        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 <current_position+0x8>
   2bcf8:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   2bcfc:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   2bd00:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   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 <enquecommandf_P(char const*, ...)>
   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 <eeprom_update_byte>
   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 <enquecommand(char const*, bool)>
    // 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 <target_temperature+0x1>
   2bd40:	8f 93       	push	r24
   2bd42:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   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(char const*, ...)>
    enquecommandf_P(PSTR("M140 S%d"), target_temperature_bed);
   2bd54:	80 91 72 06 	lds	r24, 0x0672	; 0x800672 <target_temperature_bed+0x1>
   2bd58:	8f 93       	push	r24
   2bd5a:	80 91 71 06 	lds	r24, 0x0671	; 0x800671 <target_temperature_bed>
   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 <enquecommandf_P(char const*, ...)>
    //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 <eeprom_read_byte>
   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 <recover_print(unsigned char)+0x3b4>
        enquecommandf_P(PSTR("M109 S%d"), target_temperature[active_extruder]);
   2bd82:	80 91 b6 0d 	lds	r24, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   2bd86:	8f 93       	push	r24
   2bd88:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   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 <enquecommandf_P(char const*, ...)>
   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 <enquecommand(char const*, bool)>

    // If not automatically recoreverd (long power loss)
    if(automatic == 0){
   2bdac:	a1 10       	cpse	r10, r1
   2bdae:	17 c0       	rjmp	.+46     	; 0x2bdde <recover_print(unsigned char)+0x3f0>
        //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 <enquecommand(char const*, bool)>
        // 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 <enquecommandf_P(char const*, ...)>
   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 <puts_P>
    gcode_M114();
   2bde6:	0e 94 df 77 	call	0xefbe	; 0xefbe <gcode_M114()>
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 <eeprom_read_byte>
   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 <eeprom_read_word>
   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 <eeprom_read_word>
   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 <serialprintPGM(char const*)>
  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 <MarlinSerial::print(long, int) [clone .part.1]>
    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 <serialprintPGM(char const*)>
    MYSERIAL.println(feedmultiply_rec);
   2be28:	8f 2d       	mov	r24, r15
   2be2a:	9e 2d       	mov	r25, r14
   2be2c:	0f 94 ec 75 	call	0x2ebd8	; 0x2ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>

    if (saved_printing_type == PowerPanic::PRINT_TYPE_SD)
   2be30:	80 91 6a 02 	lds	r24, 0x026A	; 0x80026a <saved_printing_type>
   2be34:	81 11       	cpse	r24, r1
   2be36:	02 c0       	rjmp	.+4      	; 0x2be3c <recover_print(unsigned char)+0x44e>
    { // M23
        restore_file_from_sd();
   2be38:	0e 94 7b 88 	call	0x110f6	; 0x110f6 <restore_file_from_sd()>
    }

    // 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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <recover_print(unsigned char)+0x4ac>
        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 <enquecommandf_P(char const*, ...)>
   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 <recover_print(unsigned char)+0x4ba>
        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 <enquecommand(char const*, bool)>

    // 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 <eeprom_read_dword>
   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 <enquecommandf_P(char const*, ...)>

    // 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 <eeprom_read_dword>
   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 <eeprom_read_dword>
   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 <eeprom_read_dword>
    // 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 <enquecommandf_P(char const*, ...)>

    // 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 <enquecommandf_P(char const*, ...)>
    // 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 <eeprom_read_dword>
    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 <enquecommandf_P(char const*, ...)>
    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 <eeprom_read_byte>
   2bf56:	88 23       	and	r24, r24
   2bf58:	29 f0       	breq	.+10     	; 0x2bf64 <recover_print(unsigned char)+0x576>
        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 <enquecommand(char const*, bool)>
    // 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(char const*, ...)>
    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 <enquecommandf_P(char const*, ...)>
    // 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 <enquecommandf_P(char const*, ...)>

    // 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 <eeprom_read_dword>
    if (saved_printing_type == PowerPanic::PRINT_TYPE_SD)
   2bf9c:	20 91 6a 02 	lds	r18, 0x026A	; 0x80026a <saved_printing_type>
   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 <recover_print(unsigned char)+0x626>
    {
        // 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 <enquecommandf_P(char const*, ...)>
   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(char const*, bool)>
    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 <enquecommand(char const*, bool)>
    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 <puts_P>
    gcode_M114();
   2bfea:	0e 94 df 77 	call	0xefbe	; 0xefbe <gcode_M114()>
}
   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 <recover_print(unsigned char)+0x5e0>
    {
        // 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 <recover_print(unsigned char)+0x5cc>

0002c026 <uvlo_drain_reset() [clone .lto_priv.428]>:
   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_clear()>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   2c05a:	ff cf       	rjmp	.-2      	; 0x2c05a <uvlo_drain_reset() [clone .lto_priv.428]+0x34>

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 <serialprintlnPGM(char const*)>
    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 <eeprom_read_byte>
   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 <printer_active()>
   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 <millis2>
   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 <saved_printing>
   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 <saved_printing_type>
   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 <mesh_bed_leveling_flag>
   2c0dc:	d1 11       	cpse	r29, r1
   2c0de:	02 c0       	rjmp	.+4      	; 0x2c0e4 <__vector_5+0x88>
   2c0e0:	d0 91 a6 0d 	lds	r29, 0x0DA6	; 0x800da6 <homing_flag>

    // 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 <backlightMode>
    backlightLevel_LOW = 0;
   2c0e8:	10 92 ff 03 	sts	0x03FF, r1	; 0x8003ff <backlightLevel_LOW>
    backlight_update();
   2c0ec:	0e 94 a6 89 	call	0x1134c	; 0x1134c <backlight_update()>
#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 <axis_known_position>
    disable_y();
   2c0f6:	16 9a       	sbi	0x02, 6	; 2
   2c0f8:	10 92 8f 06 	sts	0x068F, r1	; 0x80068f <axis_known_position+0x1>

    // 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 <MotorCurrents::setiHold(unsigned char)>
    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 <MotorCurrents::setiRun(unsigned char)>
    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 <tmc2130_mres+0x2>
   2c118:	82 e0       	ldi	r24, 0x02	; 2
   2c11a:	0f 94 6b 25 	call	0x24ad6	; 0x24ad6 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
    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 <MotorCurrents::setiHold(unsigned char)>
    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 <MotorCurrents::setiRun(unsigned char)>
    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 <tmc2130_mres+0x3>
   2c13a:	83 e0       	ldi	r24, 0x03	; 3
   2c13c:	0f 94 6b 25 	call	0x24ad6	; 0x24ad6 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
#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 <isPartialBackupAvailable>
   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 <target_temperature_bed>
   2c150:	80 93 ad 05 	sts	0x05AD, r24	; 0x8005ad <saved_bed_temperature>
        saved_extruder_temperature = target_temperature[active_extruder];
   2c154:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   2c158:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   2c15c:	90 93 ac 05 	sts	0x05AC, r25	; 0x8005ac <saved_extruder_temperature+0x1>
   2c160:	80 93 ab 05 	sts	0x05AB, r24	; 0x8005ab <saved_extruder_temperature>
        saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
   2c164:	80 91 e3 03 	lds	r24, 0x03E3	; 0x8003e3 <axis_relative_modes>
   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_extruder_relative_mode>
        saved_fan_speed = fanSpeed;
   2c172:	80 91 e5 03 	lds	r24, 0x03E5	; 0x8003e5 <fanSpeed>
   2c176:	80 93 aa 05 	sts	0x05AA, r24	; 0x8005aa <saved_fan_speed>
    }

    // Stop all heaters before continuing
    disable_heater();
   2c17a:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>

    // 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_print_file_state()>

        // save the global state at planning time
        save_planner_global_state();
   2c186:	0e 94 88 64 	call	0xc910	; 0xc910 <save_planner_global_state()>
    }

    // 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>
    mbl.active = false;
   2c18e:	10 92 c1 13 	sts	0x13C1, r1	; 0x8013c1 <mbl>

    // 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 <planner_abort_hard()>

    // 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 <isPartialBackupAvailable>
   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 <saved_pos>
   2c1c4:	90 93 74 02 	sts	0x0274, r25	; 0x800274 <saved_pos+0x1>
   2c1c8:	a0 93 75 02 	sts	0x0275, r26	; 0x800275 <saved_pos+0x2>
   2c1cc:	b0 93 76 02 	sts	0x0276, r27	; 0x800276 <saved_pos+0x3>
    }

    // 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 <saved_pos+0x8>
   2c1d4:	90 90 7c 02 	lds	r9, 0x027C	; 0x80027c <saved_pos+0x9>
   2c1d8:	a0 90 7d 02 	lds	r10, 0x027D	; 0x80027d <saved_pos+0xa>
   2c1dc:	b0 90 7e 02 	lds	r11, 0x027E	; 0x80027e <saved_pos+0xb>
    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 <saved_pos+0x4>
   2c1e8:	30 91 78 02 	lds	r19, 0x0278	; 0x800278 <saved_pos+0x5>
   2c1ec:	40 91 79 02 	lds	r20, 0x0279	; 0x800279 <saved_pos+0x6>
   2c1f0:	50 91 7a 02 	lds	r21, 0x027A	; 0x80027a <saved_pos+0x7>
   2c1f4:	60 91 73 02 	lds	r22, 0x0273	; 0x800273 <saved_pos>
   2c1f8:	70 91 74 02 	lds	r23, 0x0274	; 0x800274 <saved_pos+0x1>
   2c1fc:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <saved_pos+0x2>
   2c200:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <saved_pos+0x3>
   2c204:	0f 94 a5 a1 	call	0x3434a	; 0x3434a <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]>
   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 <eeprom_update_dword>
   2c224:	40 91 7f 02 	lds	r20, 0x027F	; 0x80027f <saved_pos+0xc>
   2c228:	50 91 80 02 	lds	r21, 0x0280	; 0x800280 <saved_pos+0xd>
   2c22c:	60 91 81 02 	lds	r22, 0x0281	; 0x800281 <saved_pos+0xe>
   2c230:	70 91 82 02 	lds	r23, 0x0282	; 0x800282 <saved_pos+0xf>
   2c234:	8e e6       	ldi	r24, 0x6E	; 110
   2c236:	9f e0       	ldi	r25, 0x0F	; 15
   2c238:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
    }
    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 <saved_extruder_relative_mode>
   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 <eeprom_update_byte>

    // Clean the input command queue, inhibit serial processing using saved_printing
    cmdqueue_reset();
   2c24c:	0e 94 dc 7e 	call	0xfdb8	; 0xfdb8 <cmdqueue_reset()>
    card.sdprinting = false;
   2c250:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>
    saved_printing = true;
   2c254:	c0 93 a8 0d 	sts	0x0DA8, r28	; 0x800da8 <saved_printing>

    // 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 <planner_aborted>
    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 <current_position+0xc>
   2c26a:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   2c26e:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   2c272:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   2c276:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   2c27a:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   2c27e:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   2c282:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   2c286:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
    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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   2c296:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <tmc2130_mres+0x2>
   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 <tmc2130_rd_MSCNT(unsigned char)>
    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 <cs+0xc>
   2c2d6:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   2c2da:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   2c2de:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <current_position+0x8>
   2c302:	30 91 9a 06 	lds	r19, 0x069A	; 0x80069a <current_position+0x9>
   2c306:	40 91 9b 06 	lds	r20, 0x069B	; 0x80069b <current_position+0xa>
   2c30a:	50 91 9c 06 	lds	r21, 0x069C	; 0x80069c <current_position+0xb>
   2c30e:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   2c312:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   2c316:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   2c31a:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   2c31e:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
                                / (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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   2c32e:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        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 <saved_sdpos>
   2c336:	50 91 60 05 	lds	r21, 0x0560	; 0x800560 <saved_sdpos+0x1>
   2c33a:	60 91 61 05 	lds	r22, 0x0561	; 0x800561 <saved_sdpos+0x2>
   2c33e:	70 91 62 05 	lds	r23, 0x0562	; 0x800562 <saved_sdpos+0x3>
   2c342:	81 e9       	ldi	r24, 0x91	; 145
   2c344:	9f e0       	ldi	r25, 0x0F	; 15
   2c346:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
   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 <floor>
   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 <eeprom_update_word>

    // 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 <current_position+0x8>
   2c3b2:	50 91 9a 06 	lds	r21, 0x069A	; 0x80069a <current_position+0x9>
   2c3b6:	60 91 9b 06 	lds	r22, 0x069B	; 0x80069b <current_position+0xa>
   2c3ba:	70 91 9c 06 	lds	r23, 0x069C	; 0x80069c <current_position+0xb>
   2c3be:	8a ed       	ldi	r24, 0xDA	; 218
   2c3c0:	9e e0       	ldi	r25, 0x0E	; 14
   2c3c2:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
   2c3c6:	40 91 73 02 	lds	r20, 0x0273	; 0x800273 <saved_pos>
   2c3ca:	50 91 74 02 	lds	r21, 0x0274	; 0x800274 <saved_pos+0x1>
   2c3ce:	60 91 75 02 	lds	r22, 0x0275	; 0x800275 <saved_pos+0x2>
   2c3d2:	70 91 76 02 	lds	r23, 0x0276	; 0x800276 <saved_pos+0x3>
   2c3d6:	8d e9       	ldi	r24, 0x9D	; 157
   2c3d8:	9f e0       	ldi	r25, 0x0F	; 15
   2c3da:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
   2c3de:	40 91 77 02 	lds	r20, 0x0277	; 0x800277 <saved_pos+0x4>
   2c3e2:	50 91 78 02 	lds	r21, 0x0278	; 0x800278 <saved_pos+0x5>
   2c3e6:	60 91 79 02 	lds	r22, 0x0279	; 0x800279 <saved_pos+0x6>
   2c3ea:	70 91 7a 02 	lds	r23, 0x027A	; 0x80027a <saved_pos+0x7>
   2c3ee:	81 ea       	ldi	r24, 0xA1	; 161
   2c3f0:	9f e0       	ldi	r25, 0x0F	; 15
   2c3f2:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
        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 <saved_feedrate2>
   2c3fa:	70 91 5e 05 	lds	r23, 0x055E	; 0x80055e <saved_feedrate2+0x1>
   2c3fe:	89 e8       	ldi	r24, 0x89	; 137
   2c400:	9f e0       	ldi	r25, 0x0F	; 15
   2c402:	0f 94 52 dc 	call	0x3b8a4	; 0x3b8a4 <eeprom_update_word>
   2c406:	60 91 39 02 	lds	r22, 0x0239	; 0x800239 <feedmultiply>
   2c40a:	70 91 3a 02 	lds	r23, 0x023A	; 0x80023a <feedmultiply+0x1>
   2c40e:	85 e3       	ldi	r24, 0x35	; 53
   2c410:	9d e0       	ldi	r25, 0x0D	; 13
   2c412:	0f 94 52 dc 	call	0x3b8a4	; 0x3b8a4 <eeprom_update_word>
   2c416:	60 91 ab 05 	lds	r22, 0x05AB	; 0x8005ab <saved_extruder_temperature>
   2c41a:	70 91 ac 05 	lds	r23, 0x05AC	; 0x8005ac <saved_extruder_temperature+0x1>
   2c41e:	88 ed       	ldi	r24, 0xD8	; 216
   2c420:	9e e0       	ldi	r25, 0x0E	; 14
   2c422:	0f 94 52 dc 	call	0x3b8a4	; 0x3b8a4 <eeprom_update_word>
        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 <saved_bed_temperature>
   2c42a:	8b e8       	ldi	r24, 0x8B	; 139
   2c42c:	9f e0       	ldi	r25, 0x0F	; 15
   2c42e:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   2c432:	60 91 aa 05 	lds	r22, 0x05AA	; 0x8005aa <saved_fan_speed>
   2c436:	88 e8       	ldi	r24, 0x88	; 136
   2c438:	9f e0       	ldi	r25, 0x0F	; 15
   2c43a:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
        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 <extruder_multiplier>
   2c442:	50 91 94 02 	lds	r21, 0x0294	; 0x800294 <extruder_multiplier+0x1>
   2c446:	60 91 95 02 	lds	r22, 0x0295	; 0x800295 <extruder_multiplier+0x2>
   2c44a:	70 91 96 02 	lds	r23, 0x0296	; 0x800296 <extruder_multiplier+0x3>
   2c44e:	88 ee       	ldi	r24, 0xE8	; 232
   2c450:	9e e0       	ldi	r25, 0x0E	; 14
   2c452:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
        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 <extrudemultiply>
   2c45a:	70 91 bd 02 	lds	r23, 0x02BD	; 0x8002bd <extrudemultiply+0x1>
   2c45e:	8e ed       	ldi	r24, 0xDE	; 222
   2c460:	9e e0       	ldi	r25, 0x0E	; 14
   2c462:	0f 94 52 dc 	call	0x3b8a4	; 0x3b8a4 <eeprom_update_word>
        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 <cs+0x34>
   2c46a:	50 91 f2 0d 	lds	r21, 0x0DF2	; 0x800df2 <cs+0x35>
   2c46e:	60 91 f3 0d 	lds	r22, 0x0DF3	; 0x800df3 <cs+0x36>
   2c472:	70 91 f4 0d 	lds	r23, 0x0DF4	; 0x800df4 <cs+0x37>
   2c476:	81 e1       	ldi	r24, 0x11	; 17
   2c478:	9d e0       	ldi	r25, 0x0D	; 13
   2c47a:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
   2c47e:	40 91 f5 0d 	lds	r20, 0x0DF5	; 0x800df5 <cs+0x38>
   2c482:	50 91 f6 0d 	lds	r21, 0x0DF6	; 0x800df6 <cs+0x39>
   2c486:	60 91 f7 0d 	lds	r22, 0x0DF7	; 0x800df7 <cs+0x3a>
   2c48a:	70 91 f8 0d 	lds	r23, 0x0DF8	; 0x800df8 <cs+0x3b>
   2c48e:	8d e0       	ldi	r24, 0x0D	; 13
   2c490:	9d e0       	ldi	r25, 0x0D	; 13
   2c492:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
   2c496:	40 91 7d 0e 	lds	r20, 0x0E7D	; 0x800e7d <cs+0xc0>
   2c49a:	50 91 7e 0e 	lds	r21, 0x0E7E	; 0x800e7e <cs+0xc1>
   2c49e:	60 91 7f 0e 	lds	r22, 0x0E7F	; 0x800e7f <cs+0xc2>
   2c4a2:	70 91 80 0e 	lds	r23, 0x0E80	; 0x800e80 <cs+0xc3>
   2c4a6:	89 e0       	ldi	r24, 0x09	; 9
   2c4a8:	9d e0       	ldi	r25, 0x0D	; 13
   2c4aa:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
#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 <eeprom_update_block>
        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 <saved_segment_idx>
   2c4c2:	70 91 69 05 	lds	r23, 0x0569	; 0x800569 <saved_segment_idx+0x1>
   2c4c6:	8c e6       	ldi	r24, 0x6C	; 108
   2c4c8:	9f e0       	ldi	r25, 0x0F	; 15
   2c4ca:	0f 94 52 dc 	call	0x3b8a4	; 0x3b8a4 <eeprom_update_word>
        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 <saved_printing_type>
   2c4d2:	8c e8       	ldi	r24, 0x8C	; 140
   2c4d4:	9f e0       	ldi	r25, 0x0F	; 15
   2c4d6:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
        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 <extruder_advance_K>
   2c4de:	50 91 65 05 	lds	r21, 0x0565	; 0x800565 <extruder_advance_K+0x1>
   2c4e2:	60 91 66 05 	lds	r22, 0x0566	; 0x800566 <extruder_advance_K+0x2>
   2c4e6:	70 91 67 05 	lds	r23, 0x0567	; 0x800567 <extruder_advance_K+0x3>
   2c4ea:	8c e2       	ldi	r24, 0x2C	; 44
   2c4ec:	9d e0       	ldi	r25, 0x0D	; 13
   2c4ee:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
        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 <extrude_min_temp>
   2c4f6:	70 91 6c 02 	lds	r23, 0x026C	; 0x80026c <extrude_min_temp+0x1>
   2c4fa:	8d e7       	ldi	r24, 0x7D	; 125
   2c4fc:	9c e0       	ldi	r25, 0x0C	; 12
   2c4fe:	0f 94 52 dc 	call	0x3b8a4	; 0x3b8a4 <eeprom_update_word>
#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 <eeprom_update_block>
   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 <eeprom_update_block>
   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 <eeprom_update_block>
   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 <eeprom_update_block>
        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 <cs+0x3c>
   2c546:	50 91 fa 0d 	lds	r21, 0x0DFA	; 0x800dfa <cs+0x3d>
   2c54a:	60 91 fb 0d 	lds	r22, 0x0DFB	; 0x800dfb <cs+0x3e>
   2c54e:	70 91 fc 0d 	lds	r23, 0x0DFC	; 0x800dfc <cs+0x3f>
   2c552:	89 e3       	ldi	r24, 0x39	; 57
   2c554:	9c e0       	ldi	r25, 0x0C	; 12
   2c556:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
   2c55a:	40 91 fd 0d 	lds	r20, 0x0DFD	; 0x800dfd <cs+0x40>
   2c55e:	50 91 fe 0d 	lds	r21, 0x0DFE	; 0x800dfe <cs+0x41>
   2c562:	60 91 ff 0d 	lds	r22, 0x0DFF	; 0x800dff <cs+0x42>
   2c566:	70 91 00 0e 	lds	r23, 0x0E00	; 0x800e00 <cs+0x43>
   2c56a:	85 e3       	ldi	r24, 0x35	; 53
   2c56c:	9c e0       	ldi	r25, 0x0C	; 12
   2c56e:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
        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 <cs+0x44>
   2c576:	50 91 02 0e 	lds	r21, 0x0E02	; 0x800e02 <cs+0x45>
   2c57a:	60 91 03 0e 	lds	r22, 0x0E03	; 0x800e03 <cs+0x46>
   2c57e:	70 91 04 0e 	lds	r23, 0x0E04	; 0x800e04 <cs+0x47>
   2c582:	81 e3       	ldi	r24, 0x31	; 49
   2c584:	9c e0       	ldi	r25, 0x0C	; 12
   2c586:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
#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_block>
    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 <did_pause_print>
   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 <eeprom_update_byte>
   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>
    }

    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_byte(unsigned char*)>
    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 <eeprom_increment_word(unsigned int*)>

    printf_P(_N("UVLO - end %d\n"), _millis() - time_start);
   2c5c6:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <printf_P>
    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 <current_position>
   2c614:	70 91 92 06 	lds	r23, 0x0692	; 0x800692 <current_position+0x1>
   2c618:	80 91 93 06 	lds	r24, 0x0693	; 0x800693 <current_position+0x2>
   2c61c:	90 91 94 06 	lds	r25, 0x0694	; 0x800694 <current_position+0x3>
   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 <current_position>
   2c634:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   2c638:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   2c63c:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
    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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   2c64c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
   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 <millis2>
   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 <axis_known_position>
    disable_y();
   2c67c:	16 9a       	sbi	0x02, 6	; 2
   2c67e:	10 92 8f 06 	sts	0x068F, r1	; 0x80068f <axis_known_position+0x1>
    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 <MotorCurrents::setiHold(unsigned char)>
    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 <MotorCurrents::setiRun(unsigned char)>
    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 <tmc2130_mres+0x2>
   2c6a0:	82 e0       	ldi	r24, 0x02	; 2
   2c6a2:	0f 94 6b 25 	call	0x24ad6	; 0x24ad6 <tmc2130_setup_chopper(unsigned char, unsigned char, MotorCurrents const*)>
#endif //TMC2130

    // Stop all heaters
    disable_heater();
   2c6a6:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>

    // 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 <mbl>
    planner_abort_hard();
   2c6ae:	0f 94 b7 c1 	call	0x3836e	; 0x3836e <planner_abort_hard()>

    // 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 <current_position+0x8>
   2c6b6:	90 90 9a 06 	lds	r9, 0x069A	; 0x80069a <current_position+0x9>
   2c6ba:	a0 90 9b 06 	lds	r10, 0x069B	; 0x80069b <current_position+0xa>
   2c6be:	b0 90 9c 06 	lds	r11, 0x069C	; 0x80069c <current_position+0xb>
   2c6c2:	8a ed       	ldi	r24, 0xDA	; 218
   2c6c4:	9e e0       	ldi	r25, 0x0E	; 14
   2c6c6:	0f 94 18 dc 	call	0x3b830	; 0x3b830 <eeprom_read_dword>
   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 <cs+0xc>
   2c6e2:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   2c6e6:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   2c6ea:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <cmdqueue_reset()>
        card.sdprinting = false;
   2c70e:	10 92 8f 14 	sts	0x148F, r1	; 0x80148f <card+0x2>
        saved_printing = true;
   2c712:	81 e0       	ldi	r24, 0x01	; 1
   2c714:	80 93 a8 0d 	sts	0x0DA8, r24	; 0x800da8 <saved_printing>

        // 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 <planner_aborted>
        sei();
   2c71c:	78 94       	sei
   2c71e:	80 91 f6 04 	lds	r24, 0x04F6	; 0x8004f6 <tmc2130_mres+0x2>
   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 <tmc2130_rd_MSCNT(unsigned char)>
        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 <cs+0xc>
   2c758:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   2c75c:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   2c760:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <current_position+0x8>
   2c784:	30 91 9a 06 	lds	r19, 0x069A	; 0x80069a <current_position+0x9>
   2c788:	40 91 9b 06 	lds	r20, 0x069B	; 0x80069b <current_position+0xa>
   2c78c:	50 91 9c 06 	lds	r21, 0x069C	; 0x80069c <current_position+0xb>
   2c790:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   2c794:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   2c798:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   2c79c:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   2c7a0:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
                                    / (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 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   2c7b0:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        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 <current_position+0x8>
   2c7b8:	50 91 9a 06 	lds	r21, 0x069A	; 0x80069a <current_position+0x9>
   2c7bc:	60 91 9b 06 	lds	r22, 0x069B	; 0x80069b <current_position+0xa>
   2c7c0:	70 91 9c 06 	lds	r23, 0x069C	; 0x80069c <current_position+0xb>
   2c7c4:	8a ed       	ldi	r24, 0xDA	; 218
   2c7c6:	9e e0       	ldi	r25, 0x0E	; 14
   2c7c8:	0f 94 46 dc 	call	0x3b88c	; 0x3b88c <eeprom_update_dword>
        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 <eeprom_update_byte>

    // 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_byte(unsigned char*)>
    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 <eeprom_increment_word(unsigned int*)>

    printf_P(_N("UVLO_TINY - end %d\n"), _millis() - time_start);
   2c7e6:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <printf_P>
    uvlo_drain_reset();
   2c80a:	0f 94 13 60 	call	0x2c026	; 0x2c026 <uvlo_drain_reset() [clone .lto_priv.428]>
        // 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 <planner_calc_sd_length()>:
  }
}

uint16_t planner_calc_sd_length()
{
	uint8_t _block_buffer_head = block_buffer_head;
   2c84c:	60 91 a4 0d 	lds	r22, 0x0DA4	; 0x800da4 <block_buffer_head>
	uint8_t _block_buffer_tail = block_buffer_tail;
   2c850:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
	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 <planner_calc_sd_length()+0x2a>
	{
		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 <planner_calc_sd_length()+0xe>
	}
	return sdlen;
}
   2c876:	c9 01       	movw	r24, r18
   2c878:	08 95       	ret

0002c87a <planner_add_sd_length(unsigned int)>:
}
#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 <block_buffer_head>
   2c87e:	20 91 a5 0d 	lds	r18, 0x0DA5	; 0x800da5 <block_buffer_tail>
   2c882:	32 17       	cp	r19, r18
   2c884:	91 f0       	breq	.+36     	; 0x2c8aa <planner_add_sd_length(unsigned int)+0x30>
    // 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 <block_buffer_head>
}


// 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 <planner_add_sd_length(unsigned int)+0x16>
    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 <reset_acceleration_rates()>:
}
#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 <max_acceleration_mm_per_s2>
   2c8c8:	d0 91 70 02 	lds	r29, 0x0270	; 0x800270 <max_acceleration_mm_per_s2+0x1>
   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 <reset_acceleration_rates()+0x34>
        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 <update_mode_profile()>:

#ifdef TMC2130
void update_mode_profile()
{
	if (tmc2130_mode == TMC2130_MODE_NORMAL)
   2c930:	80 91 8b 06 	lds	r24, 0x068B	; 0x80068b <tmc2130_mode>
   2c934:	81 11       	cpse	r24, r1
   2c936:	0e c0       	rjmp	.+28     	; 0x2c954 <update_mode_profile()+0x24>
	{
		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 <max_feedrate+0x1>
   2c940:	80 93 71 02 	sts	0x0271, r24	; 0x800271 <max_feedrate>
		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 <max_acceleration_mm_per_s2+0x1>
   2c94c:	80 93 6f 02 	sts	0x026F, r24	; 0x80026f <max_acceleration_mm_per_s2>
	}
	reset_acceleration_rates();
   2c950:	0d 94 56 64 	jmp	0x2c8ac	; 0x2c8ac <reset_acceleration_rates()>
	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 <update_mode_profile()+0x20>
	{
		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 <max_feedrate+0x1>
   2c960:	80 93 71 02 	sts	0x0271, r24	; 0x800271 <max_feedrate>
		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 <update_mode_profile()+0x18>

0002c96a <plan_set_e_position(float const&)>:
}

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 <position_float+0xc>
   2c978:	50 93 d9 04 	sts	0x04D9, r21	; 0x8004d9 <position_float+0xd>
   2c97c:	60 93 da 04 	sts	0x04DA, r22	; 0x8004da <position_float+0xe>
   2c980:	70 93 db 04 	sts	0x04DB, r23	; 0x8004db <position_float+0xf>
  #endif
  position[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]);
   2c984:	20 91 cd 0d 	lds	r18, 0x0DCD	; 0x800dcd <cs+0x10>
   2c988:	30 91 ce 0d 	lds	r19, 0x0DCE	; 0x800dce <cs+0x11>
   2c98c:	40 91 cf 0d 	lds	r20, 0x0DCF	; 0x800dcf <cs+0x12>
   2c990:	50 91 d0 0d 	lds	r21, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <lround>
   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 <count_position+0xc>
   2c9c0:	50 93 bf 06 	sts	0x06BF, r21	; 0x8006bf <count_position+0xd>
   2c9c4:	60 93 c0 06 	sts	0x06C0, r22	; 0x8006c0 <count_position+0xe>
   2c9c8:	70 93 c1 06 	sts	0x06C1, r23	; 0x8006c1 <count_position+0xf>
  CRITICAL_SECTION_END;
   2c9cc:	8f bf       	out	0x3f, r24	; 63
  st_set_e_position(position[E_AXIS]);
}
   2c9ce:	08 95       	ret

0002c9d0 <plan_set_z_position(float const&)>:

// 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 <position_float+0x8>
   2c9de:	50 93 d5 04 	sts	0x04D5, r21	; 0x8004d5 <position_float+0x9>
   2c9e2:	60 93 d6 04 	sts	0x04D6, r22	; 0x8004d6 <position_float+0xa>
   2c9e6:	70 93 d7 04 	sts	0x04D7, r23	; 0x8004d7 <position_float+0xb>
  #endif
  position[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]);
   2c9ea:	20 91 c9 0d 	lds	r18, 0x0DC9	; 0x800dc9 <cs+0xc>
   2c9ee:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   2c9f2:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   2c9f6:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <lround>
   2ca0a:	60 93 aa 06 	sts	0x06AA, r22	; 0x8006aa <position+0x8>
   2ca0e:	70 93 ab 06 	sts	0x06AB, r23	; 0x8006ab <position+0x9>
   2ca12:	80 93 ac 06 	sts	0x06AC, r24	; 0x8006ac <position+0xa>
   2ca16:	90 93 ad 06 	sts	0x06AD, r25	; 0x8006ad <position+0xb>
  st_set_position(position);
   2ca1a:	0d 94 df 87 	jmp	0x30fbe	; 0x30fbe <st_set_position(long const*) [clone .constprop.151]>

0002ca1e <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>:
 * 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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x92>
    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 <SdBaseFile::~SdBaseFile()>
   2ca72:	ce 01       	movw	r24, r28
   2ca74:	01 96       	adiw	r24, 0x01	; 1
   2ca76:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
  }
  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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>

  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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xd2>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xa4>
  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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xd2>
      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 <SdBaseFile::openRoot(SdVolume*)>
      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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xd4>
   2caee:	bc cf       	rjmp	.-136    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
  // 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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xf6>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x160>
   2cb2c:	8f 32       	cpi	r24, 0x2F	; 47
   2cb2e:	39 f1       	breq	.+78     	; 0x2cb7e <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x160>
    c = *str++;
   2cb30:	28 2f       	mov	r18, r24
    if (c == '.') {
   2cb32:	8e 32       	cpi	r24, 0x2E	; 46
   2cb34:	39 f4       	brne	.+14     	; 0x2cb44 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x126>
      if (n == 10) goto fail;  // only one dot allowed
   2cb36:	6a 30       	cpi	r22, 0x0A	; 10
   2cb38:	09 f4       	brne	.+2      	; 0x2cb3c <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x11e>
   2cb3a:	96 cf       	rjmp	.-212    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
      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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x106>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x138>
   2cb4e:	31 96       	adiw	r30, 0x01	; 1
   2cb50:	83 13       	cpse	r24, r19
   2cb52:	fa cf       	rjmp	.-12     	; 0x2cb48 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x12a>
   2cb54:	89 cf       	rjmp	.-238    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
      // 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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x13e>
   2cb5a:	86 cf       	rjmp	.-244    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x148>
   2cb64:	81 cf       	rjmp	.-254    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
      // 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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x154>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x122>
      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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x168>
   2cb84:	71 cf       	rjmp	.-286    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x168>
    if (!*path) break;
   2cb94:	88 23       	and	r24, r24
   2cb96:	d9 f0       	breq	.+54     	; 0x2cbce <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x1b0>
    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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)>
   2cba2:	88 23       	and	r24, r24
   2cba4:	09 f4       	brne	.+2      	; 0x2cba8 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x18a>
   2cba6:	60 cf       	rjmp	.-320    	; 0x2ca68 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
    if (parent != dirFile) parent->close();
   2cba8:	0a 15       	cp	r16, r10
   2cbaa:	1b 05       	cpc	r17, r11
   2cbac:	19 f0       	breq	.+6      	; 0x2cbb4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x196>
   2cbae:	c8 01       	movw	r24, r16
   2cbb0:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
    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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x1a8>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xec>
  }
  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 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)>
   2cbd8:	18 2f       	mov	r17, r24
   2cbda:	47 cf       	rjmp	.-370    	; 0x2ca6a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4c>

0002cbdc <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]>:
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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0x26>
   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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0xb0>
			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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0xa8>
				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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0x3a>
   2cc8c:	01 50       	subi	r16, 0x01	; 1
   2cc8e:	11 09       	sbc	r17, r1
   2cc90:	08 f6       	brcc	.-126    	; 0x2cc14 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0x38>

/// 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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0x100>
   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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0x10a>
   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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]+0x10a>
   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 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.339]>:
bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
}

void ProtocolLogic::RecordUARTActivity() {
    lastUARTActivityMs = _millis();
   2cd1a:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   2cd1e:	60 93 59 13 	sts	0x1359, r22	; 0x801359 <MMU2::mmu2+0xf>
   2cd22:	70 93 5a 13 	sts	0x135A, r23	; 0x80135a <MMU2::mmu2+0x10>
   2cd26:	80 93 5b 13 	sts	0x135B, r24	; 0x80135b <MMU2::mmu2+0x11>
   2cd2a:	90 93 5c 13 	sts	0x135C, r25	; 0x80135c <MMU2::mmu2+0x12>
}
   2cd2e:	08 95       	ret

0002cd30 <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.293]>:
    }
    return (uint8_t)ReqMsg().code;
}

void ProtocolLogic::DecrementRetryAttempts() {
    if (inAutoRetry && retryAttempts) {
   2cd30:	80 91 9f 13 	lds	r24, 0x139F	; 0x80139f <MMU2::mmu2+0x55>
   2cd34:	88 23       	and	r24, r24
   2cd36:	69 f0       	breq	.+26     	; 0x2cd52 <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.293]+0x22>
   2cd38:	80 91 9e 13 	lds	r24, 0x139E	; 0x80139e <MMU2::mmu2+0x54>
   2cd3c:	88 23       	and	r24, r24
   2cd3e:	49 f0       	breq	.+18     	; 0x2cd52 <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.293]+0x22>
        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 <serialprintlnPGM(char const*)>
        retryAttempts--;
   2cd48:	80 91 9e 13 	lds	r24, 0x139E	; 0x80139e <MMU2::mmu2+0x54>
   2cd4c:	81 50       	subi	r24, 0x01	; 1
   2cd4e:	80 93 9e 13 	sts	0x139E, r24	; 0x80139e <MMU2::mmu2+0x54>
    }
}
   2cd52:	08 95       	ret

0002cd54 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]>:
        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 <MMU2::mmu2+0x3d>
   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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]+0x60>
    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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]+0xda>
    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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]+0xde>
    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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]+0x42>
        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 <serialprintPGM(char const*)>
   2cdee:	8c ee       	ldi	r24, 0xEC	; 236
   2cdf0:	9a ea       	ldi	r25, 0xAA	; 170
   2cdf2:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
   2cdf6:	c8 01       	movw	r24, r16
   2cdf8:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
    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 <serialprintPGM(char const*)>
    SERIAL_ECHOLN(lrb);
   2ce04:	c5 01       	movw	r24, r10
   2ce06:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
}
   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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]+0x72>
   2ce32:	89 5a       	subi	r24, 0xA9	; 169
   2ce34:	cf cf       	rjmp	.-98     	; 0x2cdd4 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]+0x80>

0002ce36 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.310]>:
    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 <MMU2::mmu2+0x14>
   2ce3c:	9a 30       	cpi	r25, 0x0A	; 10
   2ce3e:	11 f4       	brne	.+4      	; 0x2ce44 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.310]+0xe>
        cause = ss;
   2ce40:	60 93 5d 13 	sts	0x135D, r22	; 0x80135d <MMU2::mmu2+0x13>
    }
    --occurrences;
   2ce44:	91 50       	subi	r25, 0x01	; 1
   2ce46:	90 93 5e 13 	sts	0x135E, r25	; 0x80135e <MMU2::mmu2+0x14>
    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 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.310]+0x32>
   2ce4e:	c9 01       	movw	r24, r18
        LogError(msg_P);
   2ce50:	0f 94 aa 66 	call	0x2cd54	; 0x2cd54 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]>
    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 <serialprintlnPGM(char const*)>

    /// @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 <MMU2::mmu2+0x14>
   2ce62:	80 91 5d 13 	lds	r24, 0x135D	; 0x80135d <MMU2::mmu2+0x13>
   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 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]>:
    }
    *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 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]+0x24>
   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 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]+0x4c>
        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 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]+0x48>
            b = '.';
   2ceb2:	8e e2       	ldi	r24, 0x2E	; 46
        }
        tmp[i + 1] = b;
   2ceb4:	8d 93       	st	X+, r24
   2ceb6:	f4 cf       	rjmp	.-24     	; 0x2cea0 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]+0x34>
    }
    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 <strncmp_P>
   2ced0:	89 2b       	or	r24, r25
   2ced2:	59 f4       	brne	.+22     	; 0x2ceea <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]+0x7e>
   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 <strncmp>
   2cee6:	89 2b       	or	r24, r25
   2cee8:	61 f0       	breq	.+24     	; 0x2cf02 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]+0x96>
        // 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 <serialprintPGM(char const*)>
   2cef2:	8c ee       	ldi	r24, 0xEC	; 236
   2cef4:	9a ea       	ldi	r25, 0xAA	; 170
   2cef6:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
   2cefa:	ce 01       	movw	r24, r28
   2cefc:	01 96       	adiw	r24, 0x01	; 1
   2cefe:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
    }
    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 <strncpy>
}
   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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>:
        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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]+0x92>
        *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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]+0xa0>
        *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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]+0xac>
        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 <fputc>
   2cfb6:	f4 cf       	rjmp	.-24     	; 0x2cfa0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]+0x7a>
   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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2cfc2:	18 2f       	mov	r17, r24
   2cfc4:	cb cf       	rjmp	.-106    	; 0x2cf5c <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]+0x36>
    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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2cfd0:	d6 cf       	rjmp	.-84     	; 0x2cf7e <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]+0x58>
    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 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]>
    RecordUARTActivity();
   2cfdc:	0f 94 8d 66 	call	0x2cd1a	; 0x2cd1a <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.339]>
}
   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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]>:
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 <modules::protocol::RequestMsg::ComputeCRC8() const>
   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 <modules::protocol::RequestMsg::ComputeCRC8() const>
   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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0xa6>
        *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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0xda>
        *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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0xb4>
        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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x9a>
        --charsOut;
   2d09e:	11 50       	subi	r17, 0x01	; 1
   2d0a0:	f4 cf       	rjmp	.-24     	; 0x2d08a <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x8e>
   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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2d0ae:	d5 cf       	rjmp	.-86     	; 0x2d05a <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x5e>
        *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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0xe2>
        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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0xc6>
   2d0ca:	0f 94 27 c5 	call	0x38a4e	; 0x38a4e <modules::protocol::Protocol::Nibble2Char(unsigned char)>
   2d0ce:	f4 01       	movw	r30, r8
   2d0d0:	81 93       	st	Z+, r24
   2d0d2:	4f 01       	movw	r8, r30
   2d0d4:	ee cf       	rjmp	.-36     	; 0x2d0b2 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0xb6>
}

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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x13c>
        *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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x148>
        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 <fputc>
   2d136:	f4 cf       	rjmp	.-24     	; 0x2d120 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x124>
    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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2d142:	dc cf       	rjmp	.-72     	; 0x2d0fc <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]+0x100>
    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 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.338]>
    RecordUARTActivity();
   2d14e:	0f 94 8d 66 	call	0x2cd1a	; 0x2cd1a <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.339]>
    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 <MMU2::mmu2+0x3>
}
   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 <MMU2::ProtocolLogic::ProcessWritingInitRegister() [clone .constprop.301]>:
    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 <MMU2::mmu2+0x4e>
   2d17e:	2f 5f       	subi	r18, 0xFF	; 255
   2d180:	20 93 98 13 	sts	0x1398, r18	; 0x801398 <MMU2::mmu2+0x4e>
    if (regIndex >= initRegs8Count) {
   2d184:	22 30       	cpi	r18, 0x02	; 2
   2d186:	78 f4       	brcc	.+30     	; 0x2d1a6 <MMU2::ProtocolLogic::ProcessWritingInitRegister() [clone .constprop.301]+0x2c>
        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 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]>
    }
    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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]>:
}

/// 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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x26>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x76>
   2d21a:	4b 30       	cpi	r20, 0x0B	; 11
   2d21c:	09 f0       	breq	.+2      	; 0x2d220 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x76>
   2d21e:	7d c0       	rjmp	.+250    	; 0x2d31a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x170>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x80>
   2d228:	7a c0       	rjmp	.+244    	; 0x2d31e <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x174>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x6c>
/// 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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x62>
	// 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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0xa4>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x52>
	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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x44>
			// 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 <printf_P>

	*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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x178>
   2d31e:	2b 30       	cpi	r18, 0x0B	; 11
   2d320:	21 f4       	brne	.+8      	; 0x2d32a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x180>
   2d322:	ab 81       	ldd	r26, Y+3	; 0x03
   2d324:	a8 30       	cpi	r26, 0x08	; 8
   2d326:	08 f0       	brcs	.+2      	; 0x2d32a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x180>
   2d328:	80 cf       	rjmp	.-256    	; 0x2d22a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x80>
			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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x192>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x1a0>
   2d346:	aa 0f       	add	r26, r26
   2d348:	bb 1f       	adc	r27, r27
   2d34a:	0a 94       	dec	r0
   2d34c:	e2 f7       	brpl	.-8      	; 0x2d346 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x19c>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x1b2>
   2d35a:	b1 2c       	mov	r11, r1
			if (high_pix == high_pat)
   2d35c:	9b 10       	cpse	r9, r11
   2d35e:	65 cf       	rjmp	.-310    	; 0x2d22a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x80>
				match++;
   2d360:	0f 5f       	subi	r16, 0xFF	; 255
   2d362:	63 cf       	rjmp	.-314    	; 0x2d22a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]+0x80>

0002d364 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]>:
 * \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 <SdVolume::sdCard_+0x1>
   2d380:	20 93 99 0e 	sts	0x0E99, r18	; 0x800e99 <SdVolume::sdCard_>
  fatType_ = 0;
   2d384:	10 92 18 17 	sts	0x1718, r1	; 0x801718 <card+0x28b>
  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 <card+0x274>
   2d394:	50 93 02 17 	sts	0x1702, r21	; 0x801702 <card+0x275>
   2d398:	60 93 03 17 	sts	0x1703, r22	; 0x801703 <card+0x276>
   2d39c:	70 93 04 17 	sts	0x1704, r23	; 0x801704 <card+0x277>
  cacheDirty_ = 0;  // cacheFlush() will write block if true
   2d3a0:	10 92 98 0e 	sts	0x0E98, r1	; 0x800e98 <SdVolume::cacheDirty_>
  cacheMirrorBlock_ = 0;
   2d3a4:	10 92 94 0e 	sts	0x0E94, r1	; 0x800e94 <SdVolume::cacheMirrorBlock_>
   2d3a8:	10 92 95 0e 	sts	0x0E95, r1	; 0x800e95 <SdVolume::cacheMirrorBlock_+0x1>
   2d3ac:	10 92 96 0e 	sts	0x0E96, r1	; 0x800e96 <SdVolume::cacheMirrorBlock_+0x2>
   2d3b0:	10 92 97 0e 	sts	0x0E97, r1	; 0x800e97 <SdVolume::cacheMirrorBlock_+0x3>
  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 <SdVolume::cacheBlockNumber_>
   2d3be:	50 93 91 0e 	sts	0x0E91, r21	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2d3c2:	60 93 92 0e 	sts	0x0E92, r22	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2d3c6:	70 93 93 0e 	sts	0x0E93, r23	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>

  // 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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x6c>
   2d3ce:	70 c0       	rjmp	.+224    	; 0x2d4b0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x14c>
    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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2d3dc:	81 11       	cpse	r24, r1
   2d3de:	0d c0       	rjmp	.+26     	; 0x2d3fa <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x96>
    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 <SdVolume::cacheBuffer_+0x1be>
   2d3fe:	8f 77       	andi	r24, 0x7F	; 127
   2d400:	79 f7       	brne	.-34     	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
   2d402:	80 91 66 10 	lds	r24, 0x1066	; 0x801066 <SdVolume::cacheBuffer_+0x1ca>
   2d406:	90 91 67 10 	lds	r25, 0x1067	; 0x801067 <SdVolume::cacheBuffer_+0x1cb>
   2d40a:	a0 91 68 10 	lds	r26, 0x1068	; 0x801068 <SdVolume::cacheBuffer_+0x1cc>
   2d40e:	b0 91 69 10 	lds	r27, 0x1069	; 0x801069 <SdVolume::cacheBuffer_+0x1cd>
   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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
      p->totalSectors < 100 ||
      p->firstSector == 0) {
   2d41c:	c0 90 62 10 	lds	r12, 0x1062	; 0x801062 <SdVolume::cacheBuffer_+0x1c6>
   2d420:	d0 90 63 10 	lds	r13, 0x1063	; 0x801063 <SdVolume::cacheBuffer_+0x1c7>
   2d424:	e0 90 64 10 	lds	r14, 0x1064	; 0x801064 <SdVolume::cacheBuffer_+0x1c8>
   2d428:	f0 90 65 10 	lds	r15, 0x1065	; 0x801065 <SdVolume::cacheBuffer_+0x1c9>
  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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
      // 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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2d440:	c8 2f       	mov	r28, r24
   2d442:	88 23       	and	r24, r24
   2d444:	69 f2       	breq	.-102    	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
  fbs = &cacheBuffer_.fbs32;
  if (fbs->bytesPerSector != 512 ||
   2d446:	80 91 a7 0e 	lds	r24, 0x0EA7	; 0x800ea7 <SdVolume::cacheBuffer_+0xb>
   2d44a:	90 91 a8 0e 	lds	r25, 0x0EA8	; 0x800ea8 <SdVolume::cacheBuffer_+0xc>
   2d44e:	81 15       	cp	r24, r1
   2d450:	92 40       	sbci	r25, 0x02	; 2
   2d452:	31 f6       	brne	.-116    	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
    fbs->fatCount == 0 ||
   2d454:	a0 91 ac 0e 	lds	r26, 0x0EAC	; 0x800eac <SdVolume::cacheBuffer_+0x10>
    }
    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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
    fbs->fatCount == 0 ||
    fbs->reservedSectorCount == 0 ||
   2d45c:	60 91 aa 0e 	lds	r22, 0x0EAA	; 0x800eaa <SdVolume::cacheBuffer_+0xe>
   2d460:	70 91 ab 0e 	lds	r23, 0x0EAB	; 0x800eab <SdVolume::cacheBuffer_+0xf>
    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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x108>
   2d46a:	ba cf       	rjmp	.-140    	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
    fbs->reservedSectorCount == 0 ||
    fbs->sectorsPerCluster == 0) {
   2d46c:	20 91 a9 0e 	lds	r18, 0x0EA9	; 0x800ea9 <SdVolume::cacheBuffer_+0xd>
  }
  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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x112>
   2d474:	b5 cf       	rjmp	.-150    	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
    fbs->sectorsPerCluster == 0) {
       // not valid FAT volume
      goto fail;
  }
  fatCount_ = fbs->fatCount;
   2d476:	a0 93 13 17 	sts	0x1713, r26	; 0x801713 <card+0x286>
  blocksPerCluster_ = fbs->sectorsPerCluster;
   2d47a:	20 93 05 17 	sts	0x1705, r18	; 0x801705 <card+0x278>
  // 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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x130>
   2d490:	44 0f       	add	r20, r20
   2d492:	55 1f       	adc	r21, r21
   2d494:	0a 94       	dec	r0
   2d496:	e2 f7       	brpl	.-8      	; 0x2d490 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x12c>
   2d498:	24 17       	cp	r18, r20
   2d49a:	35 07       	cpc	r19, r21
   2d49c:	69 f0       	breq	.+26     	; 0x2d4b8 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x154>
   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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x124>
   2d4aa:	40 93 0e 17 	sts	0x170E, r20	; 0x80170e <card+0x281>
   2d4ae:	98 cf       	rjmp	.-208    	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
 * 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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0xd2>
   2d4b8:	80 93 0e 17 	sts	0x170E, r24	; 0x80170e <card+0x281>
  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 <SdVolume::cacheBuffer_+0x16>
   2d4c0:	30 91 b3 0e 	lds	r19, 0x0EB3	; 0x800eb3 <SdVolume::cacheBuffer_+0x17>
   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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x17a>
   2d4ce:	20 91 c0 0e 	lds	r18, 0x0EC0	; 0x800ec0 <SdVolume::cacheBuffer_+0x24>
   2d4d2:	30 91 c1 0e 	lds	r19, 0x0EC1	; 0x800ec1 <SdVolume::cacheBuffer_+0x25>
   2d4d6:	40 91 c2 0e 	lds	r20, 0x0EC2	; 0x800ec2 <SdVolume::cacheBuffer_+0x26>
   2d4da:	50 91 c3 0e 	lds	r21, 0x0EC3	; 0x800ec3 <SdVolume::cacheBuffer_+0x27>
   2d4de:	20 93 06 17 	sts	0x1706, r18	; 0x801706 <card+0x279>
   2d4e2:	30 93 07 17 	sts	0x1707, r19	; 0x801707 <card+0x27a>
   2d4e6:	40 93 08 17 	sts	0x1708, r20	; 0x801708 <card+0x27b>
   2d4ea:	50 93 09 17 	sts	0x1709, r21	; 0x801709 <card+0x27c>
                    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 <card+0x287>
   2d4fe:	90 92 15 17 	sts	0x1715, r9	; 0x801715 <card+0x288>
   2d502:	a0 92 16 17 	sts	0x1716, r10	; 0x801716 <card+0x289>
   2d506:	b0 92 17 17 	sts	0x1717, r11	; 0x801717 <card+0x28a>

  // count for FAT16 zero for FAT32
  rootDirEntryCount_ = fbs->rootDirEntryCount;
   2d50a:	e0 91 ad 0e 	lds	r30, 0x0EAD	; 0x800ead <SdVolume::cacheBuffer_+0x11>
   2d50e:	f0 91 ae 0e 	lds	r31, 0x0EAE	; 0x800eae <SdVolume::cacheBuffer_+0x12>
   2d512:	f0 93 1a 17 	sts	0x171A, r31	; 0x80171a <card+0x28d>
   2d516:	e0 93 19 17 	sts	0x1719, r30	; 0x801719 <card+0x28c>

  // 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 <card+0x28e>
   2d530:	90 93 1c 17 	sts	0x171C, r25	; 0x80171c <card+0x28f>
   2d534:	a0 93 1d 17 	sts	0x171D, r26	; 0x80171d <card+0x290>
   2d538:	b0 93 1e 17 	sts	0x171E, r27	; 0x80171e <card+0x291>

  // 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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x1da>
   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 <card+0x282>
   2d55c:	90 93 10 17 	sts	0x1710, r25	; 0x801710 <card+0x283>
   2d560:	a0 93 11 17 	sts	0x1711, r26	; 0x801711 <card+0x284>
   2d564:	b0 93 12 17 	sts	0x1712, r27	; 0x801712 <card+0x285>

  // total blocks for FAT16 or FAT32
  totalBlocks = fbs->totalSectors16 ?
   2d568:	80 90 af 0e 	lds	r8, 0x0EAF	; 0x800eaf <SdVolume::cacheBuffer_+0x13>
   2d56c:	90 90 b0 0e 	lds	r9, 0x0EB0	; 0x800eb0 <SdVolume::cacheBuffer_+0x14>
   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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x226>
   2d57a:	80 90 bc 0e 	lds	r8, 0x0EBC	; 0x800ebc <SdVolume::cacheBuffer_+0x20>
   2d57e:	90 90 bd 0e 	lds	r9, 0x0EBD	; 0x800ebd <SdVolume::cacheBuffer_+0x21>
   2d582:	a0 90 be 0e 	lds	r10, 0x0EBE	; 0x800ebe <SdVolume::cacheBuffer_+0x22>
   2d586:	b0 90 bf 0e 	lds	r11, 0x0EBF	; 0x800ebf <SdVolume::cacheBuffer_+0x23>
                           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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x240>
   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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x238>
   2d5a8:	c0 92 0a 17 	sts	0x170A, r12	; 0x80170a <card+0x27d>
   2d5ac:	d0 92 0b 17 	sts	0x170B, r13	; 0x80170b <card+0x27e>
   2d5b0:	e0 92 0c 17 	sts	0x170C, r14	; 0x80170c <card+0x27f>
   2d5b4:	f0 92 0d 17 	sts	0x170D, r15	; 0x80170d <card+0x280>

  // 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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x26a>
    fatType_ = 12;
   2d5c6:	8c e0       	ldi	r24, 0x0C	; 12
   2d5c8:	80 93 18 17 	sts	0x1718, r24	; 0x801718 <card+0x28b>
   2d5cc:	09 cf       	rjmp	.-494    	; 0x2d3e0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7c>
    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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x29c>
    fatType_ = 16;
  } else {
    rootDirStart_ = fbs->fat32RootCluster;
   2d5de:	80 91 c8 0e 	lds	r24, 0x0EC8	; 0x800ec8 <SdVolume::cacheBuffer_+0x2c>
   2d5e2:	90 91 c9 0e 	lds	r25, 0x0EC9	; 0x800ec9 <SdVolume::cacheBuffer_+0x2d>
   2d5e6:	a0 91 ca 0e 	lds	r26, 0x0ECA	; 0x800eca <SdVolume::cacheBuffer_+0x2e>
   2d5ea:	b0 91 cb 0e 	lds	r27, 0x0ECB	; 0x800ecb <SdVolume::cacheBuffer_+0x2f>
   2d5ee:	80 93 1b 17 	sts	0x171B, r24	; 0x80171b <card+0x28e>
   2d5f2:	90 93 1c 17 	sts	0x171C, r25	; 0x80171c <card+0x28f>
   2d5f6:	a0 93 1d 17 	sts	0x171D, r26	; 0x80171d <card+0x290>
   2d5fa:	b0 93 1e 17 	sts	0x171E, r27	; 0x80171e <card+0x291>
    fatType_ = 32;
   2d5fe:	80 e2       	ldi	r24, 0x20	; 32
   2d600:	80 93 18 17 	sts	0x1718, r24	; 0x801718 <card+0x28b>
   2d604:	ee ce       	rjmp	.-548    	; 0x2d3e2 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]+0x7e>

0002d606 <MMU2::MMU2::HelpUnloadToFinda() [clone .constprop.203]>:
        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 <MMU2::extruder_move(float, float)>

0002d61a <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.142]>:
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 <MMU2::mmu2+0x70>
   2d61e:	91 fd       	sbrc	r25, 1
   2d620:	17 c0       	rjmp	.+46     	; 0x2d650 <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.142]+0x36>
        return;
    }

    if (turn_off_nozzle && !(mmu_print_saved & SavedState::CooldownPending)) {
   2d622:	88 23       	and	r24, r24
   2d624:	a9 f0       	breq	.+42     	; 0x2d650 <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.142]+0x36>
   2d626:	92 fd       	sbrc	r25, 2
   2d628:	13 c0       	rjmp	.+38     	; 0x2d650 <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.142]+0x36>
        Disable_E0();
   2d62a:	0f 94 a3 c5 	call	0x38b46	; 0x38b46 <MMU2::Disable_E0()>
        resume_hotend_temp = thermal_degTargetHotend();
   2d62e:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <target_temperature>
   2d632:	90 91 b6 0d 	lds	r25, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   2d636:	90 93 af 13 	sts	0x13AF, r25	; 0x8013af <MMU2::mmu2+0x65>
   2d63a:	80 93 ae 13 	sts	0x13AE, r24	; 0x8013ae <MMU2::mmu2+0x64>
        mmu_print_saved |= SavedState::CooldownPending;
   2d63e:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   2d642:	84 60       	ori	r24, 0x04	; 4
   2d644:	80 93 ba 13 	sts	0x13BA, r24	; 0x8013ba <MMU2::mmu2+0x70>
        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 <MMU2::LogEchoEvent_P(char const*)>
    }
}
   2d650:	08 95       	ret

0002d652 <MMU2::MMU2::ResumeUnpark() [clone .constprop.144]>:
        ScreenClear();
    }
}

void MMU2::ResumeUnpark() {
    if (mmu_print_saved & SavedState::ParkExtruder) {
   2d652:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   2d656:	80 ff       	sbrs	r24, 0
   2d658:	47 c0       	rjmp	.+142    	; 0x2d6e8 <MMU2::MMU2::ResumeUnpark() [clone .constprop.144]+0x96>
        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 <MMU2::LogEchoEvent_P(char const*)>

        // 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 <MMU2::mmu2+0x5c>
   2d666:	90 91 a7 13 	lds	r25, 0x13A7	; 0x8013a7 <MMU2::mmu2+0x5d>
   2d66a:	a0 91 a8 13 	lds	r26, 0x13A8	; 0x8013a8 <MMU2::mmu2+0x5e>
   2d66e:	b0 91 a9 13 	lds	r27, 0x13A9	; 0x8013a9 <MMU2::mmu2+0x5f>
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 <MMU2::mmu2+0x58>
   2d676:	50 91 a3 13 	lds	r21, 0x13A3	; 0x8013a3 <MMU2::mmu2+0x59>
   2d67a:	60 91 a4 13 	lds	r22, 0x13A4	; 0x8013a4 <MMU2::mmu2+0x5a>
   2d67e:	70 91 a5 13 	lds	r23, 0x13A5	; 0x8013a5 <MMU2::mmu2+0x5b>
   2d682:	40 93 91 06 	sts	0x0691, r20	; 0x800691 <current_position>
   2d686:	50 93 92 06 	sts	0x0692, r21	; 0x800692 <current_position+0x1>
   2d68a:	60 93 93 06 	sts	0x0693, r22	; 0x800693 <current_position+0x2>
   2d68e:	70 93 94 06 	sts	0x0694, r23	; 0x800694 <current_position+0x3>
    current_position[Y_AXIS] = ry;
   2d692:	80 93 95 06 	sts	0x0695, r24	; 0x800695 <current_position+0x4>
   2d696:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   2d69a:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   2d69e:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
    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 <go_to_current(float) [clone .lto_priv.388]>
}

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 <MMU2::mmu2+0x60>
   2d6b2:	90 91 ab 13 	lds	r25, 0x13AB	; 0x8013ab <MMU2::mmu2+0x61>
   2d6b6:	a0 91 ac 13 	lds	r26, 0x13AC	; 0x8013ac <MMU2::mmu2+0x62>
   2d6ba:	b0 91 ad 13 	lds	r27, 0x13AD	; 0x8013ad <MMU2::mmu2+0x63>
   2d6be:	80 93 99 06 	sts	0x0699, r24	; 0x800699 <current_position+0x8>
   2d6c2:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   2d6c6:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   2d6ca:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
    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 <go_to_current(float) [clone .lto_priv.388]>

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 <isPartialBackupAvailable>
        // 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 <MMU2::mmu2+0x70>
   2d6e2:	8e 7f       	andi	r24, 0xFE	; 254
   2d6e4:	80 93 ba 13 	sts	0x13BA, r24	; 0x8013ba <MMU2::mmu2+0x70>
    }
}
   2d6e8:	08 95       	ret

0002d6ea <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]>:
        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 <MMU2::mmu2+0x70>
   2d6f4:	91 11       	cpse	r25, r1
   2d6f6:	72 c0       	rjmp	.+228    	; 0x2d7dc <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]+0xf2>
   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 <MMU2::LogEchoEvent_P(char const*)>
        Disable_E0();
   2d702:	0f 94 a3 c5 	call	0x38b46	; 0x38b46 <MMU2::Disable_E0()>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   2d706:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
/// 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 <saved_printing>
   2d70e:	81 11       	cpse	r24, r1
   2d710:	02 c0       	rjmp	.+4      	; 0x2d716 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]+0x2c>
   2d712:	0e 94 e1 63 	call	0xc7c2	; 0xc7c2 <refresh_print_state_in_ram() [clone .part.39]>

        // 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 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]+0x32>
   2d71a:	60 c0       	rjmp	.+192    	; 0x2d7dc <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]+0xf2>
            mmu_print_saved |= SavedState::ParkExtruder;
   2d71c:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   2d720:	81 60       	ori	r24, 0x01	; 1
   2d722:	80 93 ba 13 	sts	0x13BA, r24	; 0x8013ba <MMU2::mmu2+0x70>
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 <current_position+0x8>
   2d72a:	90 91 9a 06 	lds	r25, 0x069A	; 0x80069a <current_position+0x9>
   2d72e:	a0 91 9b 06 	lds	r26, 0x069B	; 0x80069b <current_position+0xa>
   2d732:	b0 91 9c 06 	lds	r27, 0x069C	; 0x80069c <current_position+0xb>
   2d736:	40 91 95 06 	lds	r20, 0x0695	; 0x800695 <current_position+0x4>
   2d73a:	50 91 96 06 	lds	r21, 0x0696	; 0x800696 <current_position+0x5>
   2d73e:	60 91 97 06 	lds	r22, 0x0697	; 0x800697 <current_position+0x6>
   2d742:	70 91 98 06 	lds	r23, 0x0698	; 0x800698 <current_position+0x7>
            resume_position = planner_current_position(); // save current pos
   2d746:	00 91 91 06 	lds	r16, 0x0691	; 0x800691 <current_position>
   2d74a:	10 91 92 06 	lds	r17, 0x0692	; 0x800692 <current_position+0x1>
   2d74e:	20 91 93 06 	lds	r18, 0x0693	; 0x800693 <current_position+0x2>
   2d752:	30 91 94 06 	lds	r19, 0x0694	; 0x800694 <current_position+0x3>
   2d756:	00 93 a2 13 	sts	0x13A2, r16	; 0x8013a2 <MMU2::mmu2+0x58>
   2d75a:	10 93 a3 13 	sts	0x13A3, r17	; 0x8013a3 <MMU2::mmu2+0x59>
   2d75e:	20 93 a4 13 	sts	0x13A4, r18	; 0x8013a4 <MMU2::mmu2+0x5a>
   2d762:	30 93 a5 13 	sts	0x13A5, r19	; 0x8013a5 <MMU2::mmu2+0x5b>
   2d766:	40 93 a6 13 	sts	0x13A6, r20	; 0x8013a6 <MMU2::mmu2+0x5c>
   2d76a:	50 93 a7 13 	sts	0x13A7, r21	; 0x8013a7 <MMU2::mmu2+0x5d>
   2d76e:	60 93 a8 13 	sts	0x13A8, r22	; 0x8013a8 <MMU2::mmu2+0x5e>
   2d772:	70 93 a9 13 	sts	0x13A9, r23	; 0x8013a9 <MMU2::mmu2+0x5f>
   2d776:	80 93 aa 13 	sts	0x13AA, r24	; 0x8013aa <MMU2::mmu2+0x60>
   2d77a:	90 93 ab 13 	sts	0x13AB, r25	; 0x8013ab <MMU2::mmu2+0x61>
   2d77e:	a0 93 ac 13 	sts	0x13AC, r26	; 0x8013ac <MMU2::mmu2+0x62>
   2d782:	b0 93 ad 13 	sts	0x13AD, r27	; 0x8013ad <MMU2::mmu2+0x63>
    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 <raise_z(float)>
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 <axis_known_position>
   2d796:	88 23       	and	r24, r24
   2d798:	09 f1       	breq	.+66     	; 0x2d7dc <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]+0xf2>
   2d79a:	80 91 8f 06 	lds	r24, 0x068F	; 0x80068f <axis_known_position+0x1>
   2d79e:	88 23       	and	r24, r24
   2d7a0:	e9 f0       	breq	.+58     	; 0x2d7dc <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]+0xf2>
    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 <current_position>
   2d7ae:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   2d7b2:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   2d7b6:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
    current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS;
   2d7ba:	10 92 95 06 	sts	0x0695, r1	; 0x800695 <current_position+0x4>
   2d7be:	10 92 96 06 	sts	0x0696, r1	; 0x800696 <current_position+0x5>
   2d7c2:	10 92 97 06 	sts	0x0697, r1	; 0x800697 <current_position+0x6>
   2d7c6:	10 92 98 06 	sts	0x0698, r1	; 0x800698 <current_position+0x7>
    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 <go_to_current(float) [clone .lto_priv.388]>
   2d7dc:	cf 91       	pop	r28
   2d7de:	1f 91       	pop	r17
   2d7e0:	0f 91       	pop	r16
   2d7e2:	08 95       	ret

0002d7e4 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]>:

/// 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 <sin>
   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 <cos>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x19a>
   2d97c:	7a c2       	rjmp	.+1268   	; 0x2de72 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x68e>
		// 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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x1e6>
   2d9c8:	54 c2       	rjmp	.+1192   	; 0x2de72 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x68e>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x68e>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x68e>
		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 <floor>
   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 <floor>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x2bc>
	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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x4f0>
   2dcd2:	10 ce       	rjmp	.-992    	; 0x2d8f4 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x110>
		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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]>
   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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]>
   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 <CLAMP_median(float*, unsigned char, float) [clone .constprop.95]>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x5be>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x66>

		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 <printf_P>
   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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]+0x440>

0002de7a <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.83]>:
		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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]>
	while (steps--){
   2dea6:	01 50       	subi	r16, 0x01	; 1
   2dea8:	11 09       	sbc	r17, r1
   2deaa:	78 f0       	brcs	.+30     	; 0x2deca <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.83]+0x50>
		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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
		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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]>
   2dec8:	ee cf       	rjmp	.-36     	; 0x2dea6 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.83]+0x2c>
}

/// \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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]>
		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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]>:
/// 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 <printf_P>
   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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0xca>
   2dfac:	ba c0       	rjmp	.+372    	; 0x2e122 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0x23e>
		{
			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 <cos>
   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 <sin>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
   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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0x25e>
   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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0xe0>
	// 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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0x276>
   2e158:	26 cf       	rjmp	.-436    	; 0x2dfa6 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0xc2>
   2e15a:	c4 cf       	rjmp	.-120    	; 0x2e0e4 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]+0x200>

0002e15c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]>:
	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 <printf_P>
   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 <count_position+0x8>
   2e21c:	70 90 bb 06 	lds	r7, 0x06BB	; 0x8006bb <count_position+0x9>
   2e220:	80 90 bc 06 	lds	r8, 0x06BC	; 0x8006bc <count_position+0xa>
   2e224:	90 90 bd 06 	lds	r9, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0xe0>
   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 <count_position>
   2e240:	90 91 b3 06 	lds	r25, 0x06B3	; 0x8006b3 <count_position+0x1>
   2e244:	a0 91 b4 06 	lds	r26, 0x06B4	; 0x8006b4 <count_position+0x2>
   2e248:	b0 91 b5 06 	lds	r27, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x116>
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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x108>
   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 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.83]>

	// DBG(_n("y %d -> %d, "), y, _Y);
	length = y - _Y;
   2e272:	80 91 b6 06 	lds	r24, 0x06B6	; 0x8006b6 <count_position+0x4>
   2e276:	90 91 b7 06 	lds	r25, 0x06B7	; 0x8006b7 <count_position+0x5>
   2e27a:	a0 91 b8 06 	lds	r26, 0x06B8	; 0x8006b8 <count_position+0x6>
   2e27e:	b0 91 b9 06 	lds	r27, 0x06B9	; 0x8006b9 <count_position+0x7>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x29a>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x140>
   2e29a:	ae c0       	rjmp	.+348    	; 0x2e3f8 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x29c>
	// 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 <count_position+0x8>
   2e2a0:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e2a4:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e2a8:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2ae>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x162>
   2e2bc:	a7 c0       	rjmp	.+334    	; 0x2e40c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2b0>
	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 <count_position+0x8>
   2e2c2:	50 91 bb 06 	lds	r21, 0x06BB	; 0x8006bb <count_position+0x9>
   2e2c6:	60 91 bc 06 	lds	r22, 0x06BC	; 0x8006bc <count_position+0xa>
   2e2ca:	70 91 bd 06 	lds	r23, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
			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 <sm4_set_dir(unsigned char, unsigned char)>
            //@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 <printf_P>
			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_set_cursor(unsigned char, unsigned char)>
			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 <lcd_printf_P(char const*, ...)>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x1cc>
   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 <count_position>
   2e38c:	90 91 b3 06 	lds	r25, 0x06B3	; 0x8006b3 <count_position+0x1>
   2e390:	a0 91 b4 06 	lds	r26, 0x06B4	; 0x8006b4 <count_position+0x2>
   2e394:	b0 91 b5 06 	lds	r27, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x24c>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2c4>
   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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]>
	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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2ca>
		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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
		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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]>
   2e3ee:	ef cf       	rjmp	.-34     	; 0x2e3ce <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x272>
	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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0xbc>
	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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2a6>
   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 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.83]>
   2e408:	49 cf       	rjmp	.-366    	; 0x2e29c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x140>

	// 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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2bc>
   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 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.83]>
   2e41e:	4f cf       	rjmp	.-354    	; 0x2e2be <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x162>
				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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x262>
				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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]>
	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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>
   2e454:	88 23       	and	r24, r24
   2e456:	29 f0       	breq	.+10     	; 0x2e462 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x306>
		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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]>
   2e460:	f0 cf       	rjmp	.-32     	; 0x2e442 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x2e6>


				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 <sm4_set_dir(unsigned char, unsigned char)>
				/// 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 <count_position+0x8>
   2e47a:	10 91 bb 06 	lds	r17, 0x06BB	; 0x8006bb <count_position+0x9>
   2e47e:	20 91 bc 06 	lds	r18, 0x06BC	; 0x8006bc <count_position+0xa>
   2e482:	30 91 bd 06 	lds	r19, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x336>
   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 <count_position+0x8>
   2e49a:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e49e:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e4a2:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   2e4a6:	80 17       	cp	r24, r16
   2e4a8:	91 07       	cpc	r25, r17
   2e4aa:	f4 f4       	brge	.+60     	; 0x2e4e8 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x38c>
					if (!_PINDA){
   2e4ac:	1c 9b       	sbis	0x03, 4	; 3
   2e4ae:	1c c0       	rjmp	.+56     	; 0x2e4e8 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x38c>
						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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>

				/// 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 <count_position+0x8>
   2e4c4:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e4c8:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e4cc:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   2e4da:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   2e4de:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   2e4e2:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
   2e4e6:	d7 cf       	rjmp	.-82     	; 0x2e496 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x33a>
						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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x40e>
					steps_to_go = MAX(0, max_z - _Z);
   2e4ec:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e4f0:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e4f4:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e4f8:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x3b2>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x40e>
   2e51a:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e51e:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e522:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e526:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   2e52a:	80 36       	cpi	r24, 0x60	; 96
   2e52c:	99 40       	sbci	r25, 0x09	; 9
   2e52e:	ec f4       	brge	.+58     	; 0x2e56a <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x40e>
						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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>
						++_Z_;
   2e542:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e546:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e54a:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e54e:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   2e55c:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   2e560:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   2e564:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
   2e568:	d6 cf       	rjmp	.-84     	; 0x2e516 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x3ba>
/// \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 <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.391]>
	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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x43a>
		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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
		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 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.390]>
   2e594:	ee cf       	rjmp	.-36     	; 0x2e572 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x416>
					}
				}
				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 <sm4_set_dir(unsigned char, unsigned char)>
				/// 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 <count_position+0x8>
   2e5ac:	10 91 bb 06 	lds	r17, 0x06BB	; 0x8006bb <count_position+0x9>
   2e5b0:	20 91 bc 06 	lds	r18, 0x06BC	; 0x8006bc <count_position+0xa>
   2e5b4:	30 91 bd 06 	lds	r19, 0x06BD	; 0x8006bd <count_position+0xb>
   2e5b8:	0c 0d       	add	r16, r12
   2e5ba:	1d 1d       	adc	r17, r13
   2e5bc:	17 ff       	sbrs	r17, 7
   2e5be:	02 c0       	rjmp	.+4      	; 0x2e5c4 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x468>
   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 <count_position+0x8>
   2e5cc:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e5d0:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e5d4:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   2e5d8:	08 17       	cp	r16, r24
   2e5da:	19 07       	cpc	r17, r25
   2e5dc:	0c f0       	brlt	.+2      	; 0x2e5e0 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x484>
   2e5de:	d9 c0       	rjmp	.+434    	; 0x2e792 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x636>
					if (_PINDA){
   2e5e0:	1c 9b       	sbis	0x03, 4	; 3
   2e5e2:	bb c0       	rjmp	.+374    	; 0x2e75a <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x5fe>
						z_trig = _Z;
   2e5e4:	00 91 ba 06 	lds	r16, 0x06BA	; 0x8006ba <count_position+0x8>
   2e5e8:	10 91 bb 06 	lds	r17, 0x06BB	; 0x8006bb <count_position+0x9>
   2e5ec:	20 91 bc 06 	lds	r18, 0x06BC	; 0x8006bc <count_position+0xa>
   2e5f0:	30 91 bd 06 	lds	r19, 0x06BD	; 0x8006bd <count_position+0xb>
						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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x4ec>
					steps_to_go = MAX(0, _Z - min_z);
   2e5f8:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e5fc:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e600:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e604:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   2e608:	8c 19       	sub	r24, r12
   2e60a:	9d 09       	sbc	r25, r13
   2e60c:	97 ff       	sbrs	r25, 7
   2e60e:	02 c0       	rjmp	.+4      	; 0x2e614 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x4b8>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x4dc>
   2e620:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e624:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e628:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e62c:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   2e630:	c8 16       	cp	r12, r24
   2e632:	d9 06       	cpc	r13, r25
   2e634:	0c f4       	brge	.+2      	; 0x2e638 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x4dc>
   2e636:	af c0       	rjmp	.+350    	; 0x2e796 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x63a>
						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 <count_position+0x8>
   2e63c:	10 91 bb 06 	lds	r17, 0x06BB	; 0x8006bb <count_position+0x9>
   2e640:	20 91 bc 06 	lds	r18, 0x06BC	; 0x8006bc <count_position+0xa>
   2e644:	30 91 bd 06 	lds	r19, 0x06BD	; 0x8006bd <count_position+0xb>
				}
				/// 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 <count_position+0x8>
   2e64c:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e650:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e654:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   2e658:	c8 16       	cp	r12, r24
   2e65a:	d9 06       	cpc	r13, r25
   2e65c:	3c f4       	brge	.+14     	; 0x2e66c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x510>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x510>
   2e66a:	b2 c0       	rjmp	.+356    	; 0x2e7d0 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x674>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x6ac>
					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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x56e>
   2e6c8:	59 ce       	rjmp	.-846    	; 0x2e37c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x220>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x294>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x5ba>
   2e714:	72 cd       	rjmp	.-1308   	; 0x2e1fa <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x9e>
					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 <printf_P>
   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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>

				/// 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 <count_position+0x8>
   2e76e:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e772:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e776:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   2e784:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   2e788:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   2e78c:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
   2e790:	1b cf       	rjmp	.-458    	; 0x2e5c8 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x46c>
   2e792:	86 01       	movw	r16, r12
   2e794:	2f cf       	rjmp	.-418    	; 0x2e5f4 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x498>
				}
				/// 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 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>
						--_Z_;
   2e7a8:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e7ac:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e7b0:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e7b4:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   2e7c2:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   2e7c6:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   2e7ca:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
   2e7ce:	26 cf       	rjmp	.-436    	; 0x2e61c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x4c0>
					}
					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 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
					--_Z_;
   2e7e0:	80 91 ba 06 	lds	r24, 0x06BA	; 0x8006ba <count_position+0x8>
   2e7e4:	90 91 bb 06 	lds	r25, 0x06BB	; 0x8006bb <count_position+0x9>
   2e7e8:	a0 91 bc 06 	lds	r26, 0x06BC	; 0x8006bc <count_position+0xa>
   2e7ec:	b0 91 bd 06 	lds	r27, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <count_position+0x8>
   2e7fa:	90 93 bb 06 	sts	0x06BB, r25	; 0x8006bb <count_position+0x9>
   2e7fe:	a0 93 bc 06 	sts	0x06BC, r26	; 0x8006bc <count_position+0xa>
   2e802:	b0 93 bd 06 	sts	0x06BD, r27	; 0x8006bd <count_position+0xb>
   2e806:	20 cf       	rjmp	.-448    	; 0x2e648 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x4ec>
					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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x6e4>
   2e836:	20 f0       	brcs	.+8      	; 0x2e840 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x6e4>
   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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]+0x52e>

0002e84c <global constructors keyed to 65535_0_adc.cpp.obj.14572>:
   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 <SpoolJoin::spooljoin>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <global constructors keyed to 65535_0_adc.cpp.obj.14572+0x94>
   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 <global constructors keyed to 65535_0_adc.cpp.obj.14572+0xa6>
   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 <modules::protocol::ResponseMsg::ComputeCRC8() const>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <global constructors keyed to 65535_0_adc.cpp.obj.14572+0xf6>
   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 <global constructors keyed to 65535_0_adc.cpp.obj.14572+0x108>
   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 <modules::protocol::ResponseMsg::ComputeCRC8() const>
   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 <MMU2::mmu2+0x41>
   2e98a:	e0 92 8a 13 	sts	0x138A, r14	; 0x80138a <MMU2::mmu2+0x40>
   2e98e:	10 92 8c 13 	sts	0x138C, r1	; 0x80138c <MMU2::mmu2+0x42>
   2e992:	1f ef       	ldi	r17, 0xFF	; 255
   2e994:	10 93 8d 13 	sts	0x138D, r17	; 0x80138d <MMU2::mmu2+0x43>
   2e998:	0f 94 d9 c5 	call	0x38bb2	; 0x38bb2 <MMU2::WhereIsFilament()>
   2e99c:	80 93 8e 13 	sts	0x138E, r24	; 0x80138e <MMU2::mmu2+0x44>
   2e9a0:	10 92 8f 13 	sts	0x138F, r1	; 0x80138f <MMU2::mmu2+0x45>
   2e9a4:	10 92 90 13 	sts	0x1390, r1	; 0x801390 <MMU2::mmu2+0x46>
   2e9a8:	10 92 91 13 	sts	0x1391, r1	; 0x801391 <MMU2::mmu2+0x47>
   2e9ac:	10 92 93 13 	sts	0x1393, r1	; 0x801393 <MMU2::mmu2+0x49>
   2e9b0:	10 92 92 13 	sts	0x1392, r1	; 0x801392 <MMU2::mmu2+0x48>
   2e9b4:	10 92 95 13 	sts	0x1395, r1	; 0x801395 <MMU2::mmu2+0x4b>
   2e9b8:	10 92 94 13 	sts	0x1394, r1	; 0x801394 <MMU2::mmu2+0x4a>
   2e9bc:	10 92 98 13 	sts	0x1398, r1	; 0x801398 <MMU2::mmu2+0x4e>
   2e9c0:	10 92 99 13 	sts	0x1399, r1	; 0x801399 <MMU2::mmu2+0x4f>
   2e9c4:	10 92 9a 13 	sts	0x139A, r1	; 0x80139a <MMU2::mmu2+0x50>
   2e9c8:	10 92 9b 13 	sts	0x139B, r1	; 0x80139b <MMU2::mmu2+0x51>
   2e9cc:	83 e0       	ldi	r24, 0x03	; 3
   2e9ce:	80 93 9e 13 	sts	0x139E, r24	; 0x80139e <MMU2::mmu2+0x54>
   2e9d2:	10 92 9f 13 	sts	0x139F, r1	; 0x80139f <MMU2::mmu2+0x55>
   2e9d6:	85 e1       	ldi	r24, 0x15	; 21
   2e9d8:	80 93 96 13 	sts	0x1396, r24	; 0x801396 <MMU2::mmu2+0x4c>
   2e9dc:	84 e1       	ldi	r24, 0x14	; 20
   2e9de:	80 93 97 13 	sts	0x1397, r24	; 0x801397 <MMU2::mmu2+0x4d>
   2e9e2:	83 e6       	ldi	r24, 0x63	; 99
   2e9e4:	80 93 a0 13 	sts	0x13A0, r24	; 0x8013a0 <MMU2::mmu2+0x56>
   2e9e8:	80 93 a1 13 	sts	0x13A1, r24	; 0x8013a1 <MMU2::mmu2+0x57>
   2e9ec:	10 92 a2 13 	sts	0x13A2, r1	; 0x8013a2 <MMU2::mmu2+0x58>
   2e9f0:	10 92 a3 13 	sts	0x13A3, r1	; 0x8013a3 <MMU2::mmu2+0x59>
   2e9f4:	10 92 a4 13 	sts	0x13A4, r1	; 0x8013a4 <MMU2::mmu2+0x5a>
   2e9f8:	10 92 a5 13 	sts	0x13A5, r1	; 0x8013a5 <MMU2::mmu2+0x5b>
   2e9fc:	10 92 a6 13 	sts	0x13A6, r1	; 0x8013a6 <MMU2::mmu2+0x5c>
   2ea00:	10 92 a7 13 	sts	0x13A7, r1	; 0x8013a7 <MMU2::mmu2+0x5d>
   2ea04:	10 92 a8 13 	sts	0x13A8, r1	; 0x8013a8 <MMU2::mmu2+0x5e>
   2ea08:	10 92 a9 13 	sts	0x13A9, r1	; 0x8013a9 <MMU2::mmu2+0x5f>
   2ea0c:	10 92 aa 13 	sts	0x13AA, r1	; 0x8013aa <MMU2::mmu2+0x60>
   2ea10:	10 92 ab 13 	sts	0x13AB, r1	; 0x8013ab <MMU2::mmu2+0x61>
   2ea14:	10 92 ac 13 	sts	0x13AC, r1	; 0x8013ac <MMU2::mmu2+0x62>
   2ea18:	10 92 ad 13 	sts	0x13AD, r1	; 0x8013ad <MMU2::mmu2+0x63>
   2ea1c:	10 92 af 13 	sts	0x13AF, r1	; 0x8013af <MMU2::mmu2+0x65>
   2ea20:	10 92 ae 13 	sts	0x13AE, r1	; 0x8013ae <MMU2::mmu2+0x64>
   2ea24:	10 92 b0 13 	sts	0x13B0, r1	; 0x8013b0 <MMU2::mmu2+0x66>
   2ea28:	8e e2       	ldi	r24, 0x2E	; 46
   2ea2a:	90 e8       	ldi	r25, 0x80	; 128
   2ea2c:	90 93 b2 13 	sts	0x13B2, r25	; 0x8013b2 <MMU2::mmu2+0x68>
   2ea30:	80 93 b1 13 	sts	0x13B1, r24	; 0x8013b1 <MMU2::mmu2+0x67>
   2ea34:	10 93 b3 13 	sts	0x13B3, r17	; 0x8013b3 <MMU2::mmu2+0x69>
   2ea38:	10 93 b4 13 	sts	0x13B4, r17	; 0x8013b4 <MMU2::mmu2+0x6a>
   2ea3c:	10 92 b6 13 	sts	0x13B6, r1	; 0x8013b6 <MMU2::mmu2+0x6c>
   2ea40:	10 92 b5 13 	sts	0x13B5, r1	; 0x8013b5 <MMU2::mmu2+0x6b>
   2ea44:	10 93 b7 13 	sts	0x13B7, r17	; 0x8013b7 <MMU2::mmu2+0x6d>
   2ea48:	82 e0       	ldi	r24, 0x02	; 2
   2ea4a:	80 93 b8 13 	sts	0x13B8, r24	; 0x8013b8 <MMU2::mmu2+0x6e>
   2ea4e:	10 92 b9 13 	sts	0x13B9, r1	; 0x8013b9 <MMU2::mmu2+0x6f>
   2ea52:	10 92 ba 13 	sts	0x13BA, r1	; 0x8013ba <MMU2::mmu2+0x70>
   2ea56:	10 92 bb 13 	sts	0x13BB, r1	; 0x8013bb <MMU2::mmu2+0x71>
   2ea5a:	10 92 bc 13 	sts	0x13BC, r1	; 0x8013bc <MMU2::mmu2+0x72>
   2ea5e:	10 92 be 13 	sts	0x13BE, r1	; 0x8013be <MMU2::mmu2+0x74>
   2ea62:	10 92 bd 13 	sts	0x13BD, r1	; 0x8013bd <MMU2::mmu2+0x73>
   2ea66:	10 92 c0 13 	sts	0x13C0, r1	; 0x8013c0 <MMU2::mmu2+0x76>
   2ea6a:	10 92 bf 13 	sts	0x13BF, r1	; 0x8013bf <MMU2::mmu2+0x75>
   2ea6e:	0f 94 41 8c 	call	0x31882	; 0x31882 <mesh_bed_leveling::reset() [clone .constprop.100]>
   2ea72:	ed e8       	ldi	r30, 0x8D	; 141
   2ea74:	f4 e1       	ldi	r31, 0x14	; 20
   2ea76:	10 92 15 15 	sts	0x1515, r1	; 0x801515 <card+0x88>
   2ea7a:	10 92 18 15 	sts	0x1518, r1	; 0x801518 <card+0x8b>
   2ea7e:	10 92 3a 15 	sts	0x153A, r1	; 0x80153a <card+0xad>
   2ea82:	10 92 3d 15 	sts	0x153D, r1	; 0x80153d <card+0xb0>
   2ea86:	89 e1       	ldi	r24, 0x19	; 25
   2ea88:	80 93 fc 16 	sts	0x16FC, r24	; 0x8016fc <card+0x26f>
   2ea8c:	10 92 ff 16 	sts	0x16FF, r1	; 0x8016ff <card+0x272>
   2ea90:	10 92 00 17 	sts	0x1700, r1	; 0x801700 <card+0x273>
   2ea94:	10 92 18 17 	sts	0x1718, r1	; 0x801718 <card+0x28b>
   2ea98:	10 92 1f 17 	sts	0x171F, r1	; 0x80171f <card+0x292>
   2ea9c:	10 92 22 17 	sts	0x1722, r1	; 0x801722 <card+0x295>
   2eaa0:	10 92 a0 17 	sts	0x17A0, r1	; 0x8017a0 <card+0x313>
   2eaa4:	10 92 a2 17 	sts	0x17A2, r1	; 0x8017a2 <card+0x315>
   2eaa8:	10 92 a1 17 	sts	0x17A1, r1	; 0x8017a1 <card+0x314>
   2eaac:	10 92 31 16 	sts	0x1631, r1	; 0x801631 <card+0x1a4>
   2eab0:	10 92 30 16 	sts	0x1630, r1	; 0x801630 <card+0x1a3>
   2eab4:	10 92 9c 17 	sts	0x179C, r1	; 0x80179c <card+0x30f>
   2eab8:	10 92 9d 17 	sts	0x179D, r1	; 0x80179d <card+0x310>
   2eabc:	10 92 9e 17 	sts	0x179E, r1	; 0x80179e <card+0x311>
   2eac0:	10 92 9f 17 	sts	0x179F, r1	; 0x80179f <card+0x312>
   2eac4:	10 92 a3 17 	sts	0x17A3, r1	; 0x8017a3 <card+0x316>
   2eac8:	10 92 a4 17 	sts	0x17A4, r1	; 0x8017a4 <card+0x317>
   2eacc:	10 92 a5 17 	sts	0x17A5, r1	; 0x8017a5 <card+0x318>
   2ead0:	10 92 a6 17 	sts	0x17A6, r1	; 0x8017a6 <card+0x319>
   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 <card+0x1a2>
   2eae0:	10 92 42 17 	sts	0x1742, r1	; 0x801742 <card+0x2b5>
   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 <global constructors keyed to 65535_0_adc.cpp.obj.14572+0x2a0>
   2eaf2:	10 92 de 14 	sts	0x14DE, r1	; 0x8014de <card+0x51>
   2eaf6:	10 92 dd 14 	sts	0x14DD, r1	; 0x8014dd <card+0x50>
   2eafa:	10 92 dc 14 	sts	0x14DC, r1	; 0x8014dc <card+0x4f>
   2eafe:	80 ea       	ldi	r24, 0xA0	; 160
   2eb00:	97 e1       	ldi	r25, 0x17	; 23
   2eb02:	0f 94 89 2a 	call	0x25512	; 0x25512 <Timer<unsigned short>::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 <millis2>
   2eb2c:	60 93 bf 17 	sts	0x17BF, r22	; 0x8017bf <extruder_autofan_last_check>
   2eb30:	70 93 c0 17 	sts	0x17C0, r23	; 0x8017c0 <extruder_autofan_last_check+0x1>
   2eb34:	80 93 c1 17 	sts	0x17C1, r24	; 0x8017c1 <extruder_autofan_last_check+0x2>
   2eb38:	90 93 c2 17 	sts	0x17C2, r25	; 0x8017c2 <extruder_autofan_last_check+0x3>
   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 <MarlinSerial::println(double, int) [clone .constprop.367]>:
  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 <MarlinSerial::printFloat(double, unsigned char)>
}

void MarlinSerial::println(double n, int digits)
{
  print(n, digits);
  println();
   2eb5c:	0d 94 f1 d5 	jmp	0x3abe2	; 0x3abe2 <MarlinSerial::println()>

0002eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>:
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 <MMU2::mmu2+0x56>
   2eb64:	83 36       	cpi	r24, 0x63	; 99
   2eb66:	09 f4       	brne	.+2      	; 0x2eb6a <MMU2::MMU2::get_current_tool() const [clone .constprop.364]+0xa>
   2eb68:	8f ef       	ldi	r24, 0xFF	; 255
}
   2eb6a:	08 95       	ret

0002eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>:
    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 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.358]>:
  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 <millis2>
   2eb8c:	8b 01       	movw	r16, r22
  while (spiRec() != 0XFF) {
   2eb8e:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   2eb92:	8f 3f       	cpi	r24, 0xFF	; 255
   2eb94:	69 f0       	breq	.+26     	; 0x2ebb0 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.358]+0x32>
    if (((uint16_t)_millis() - t0) >= timeoutMillis) goto fail;
   2eb96:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.358]+0x10>
  }
  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 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.358]+0x28>

0002ebb4 <MMU2::MMU2::Status() [clone .constprop.342]>:
    , 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 <serialprintPGM(char const*)>
    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 <eeprom_init_default_byte(unsigned char*, unsigned char)>
    if (status == 1) {
   2ebc6:	81 30       	cpi	r24, 0x01	; 1
   2ebc8:	21 f4       	brne	.+8      	; 0x2ebd2 <MMU2::MMU2::Status() [clone .constprop.342]+0x1e>
        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 <serialprintlnPGM(char const*)>
   2ebd2:	8d e4       	ldi	r24, 0x4D	; 77
   2ebd4:	9c e5       	ldi	r25, 0x5C	; 92
   2ebd6:	fb cf       	rjmp	.-10     	; 0x2ebce <MMU2::MMU2::Status() [clone .constprop.342]+0x1a>

0002ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>:
  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 <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::println(int n, int base)
{
  print(n, base);
  println();
   2ebe4:	0d 94 f1 d5 	jmp	0x3abe2	; 0x3abe2 <MarlinSerial::println()>

0002ebe8 <enquecommand_front(char const*, bool) [clone .constprop.323]>:
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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x18>
   2ebfe:	85 c0       	rjmp	.+266    	; 0x2ed0a <enquecommand_front(char const*, bool) [clone .constprop.323]+0x122>
        return false;
    // Remove the currently processed command from the queue.
    if (! cmdbuffer_front_already_processed) {
   2ec00:	80 91 a1 10 	lds	r24, 0x10A1	; 0x8010a1 <cmdbuffer_front_already_processed>
   2ec04:	81 11       	cpse	r24, r1
   2ec06:	05 c0       	rjmp	.+10     	; 0x2ec12 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x2a>
        cmdqueue_pop_front();
   2ec08:	0e 94 54 76 	call	0xeca8	; 0xeca8 <cmdqueue_pop_front()>
        cmdbuffer_front_already_processed = true;
   2ec0c:	81 e0       	ldi	r24, 0x01	; 1
   2ec0e:	80 93 a1 10 	sts	0x10A1, r24	; 0x8010a1 <cmdbuffer_front_already_processed>
    }
    if (bufindr == bufindw && buflen > 0)
   2ec12:	40 91 91 12 	lds	r20, 0x1291	; 0x801291 <bufindr>
   2ec16:	50 91 92 12 	lds	r21, 0x1292	; 0x801292 <bufindr+0x1>
   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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x50>
   2ec28:	20 91 a2 10 	lds	r18, 0x10A2	; 0x8010a2 <buflen>
   2ec2c:	30 91 a3 10 	lds	r19, 0x10A3	; 0x8010a3 <buflen+0x1>
   2ec30:	12 16       	cp	r1, r18
   2ec32:	13 06       	cpc	r1, r19
   2ec34:	0c f4       	brge	.+2      	; 0x2ec38 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x50>
   2ec36:	69 c0       	rjmp	.+210    	; 0x2ed0a <enquecommand_front(char const*, bool) [clone .constprop.323]+0x122>
        // 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 <serial_count>
   2ec3c:	30 91 9e 10 	lds	r19, 0x109E	; 0x80109e <serial_count+0x1>
   2ec40:	12 16       	cp	r1, r18
   2ec42:	13 06       	cpc	r1, r19
   2ec44:	0c f0       	brlt	.+2      	; 0x2ec48 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x60>
   2ec46:	41 c0       	rjmp	.+130    	; 0x2ecca <enquecommand_front(char const*, bool) [clone .constprop.323]+0xe2>
   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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0xe6>
        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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x7c>
   2ec62:	53 c0       	rjmp	.+166    	; 0x2ed0a <enquecommand_front(char const*, bool) [clone .constprop.323]+0x122>
        }
    } 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 <bufindr+0x1>
   2ec68:	40 93 91 12 	sts	0x1291, r20	; 0x801291 <bufindr>
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 <bufindr>
   2ec70:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
   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 <strcpy_P>
        else
            strcpy(cmdbuffer + bufindr + CMDHDRSIZE, cmd);
        ++ buflen;
   2ec88:	80 91 a2 10 	lds	r24, 0x10A2	; 0x8010a2 <buflen>
   2ec8c:	90 91 a3 10 	lds	r25, 0x10A3	; 0x8010a3 <buflen+0x1>
   2ec90:	01 96       	adiw	r24, 0x01	; 1
   2ec92:	90 93 a3 10 	sts	0x10A3, r25	; 0x8010a3 <buflen+0x1>
   2ec96:	80 93 a2 10 	sts	0x10A2, r24	; 0x8010a2 <buflen>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
        SERIAL_ECHO(cmdbuffer + bufindr + CMDHDRSIZE);
   2ecaa:	80 91 91 12 	lds	r24, 0x1291	; 0x801291 <bufindr>
   2ecae:	90 91 92 12 	lds	r25, 0x1292	; 0x801292 <bufindr+0x1>
      }
    }*/

    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 <MarlinSerial::write(char const*)>
        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 <serialprintlnPGM(char const*)>
    // 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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x66>
            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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0xfa>
            // 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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x7c>
            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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0x122>
            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 <memset>
            bufindr = bufindr_new;
   2ed00:	10 93 92 12 	sts	0x1292, r17	; 0x801292 <bufindr+0x1>
   2ed04:	00 93 91 12 	sts	0x1291, r16	; 0x801291 <bufindr>
   2ed08:	b1 cf       	rjmp	.-158    	; 0x2ec6c <enquecommand_front(char const*, bool) [clone .constprop.323]+0x84>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
        if (from_progmem)
            SERIAL_PROTOCOLRPGM(cmd);
   2ed1a:	ce 01       	movw	r24, r28
   2ed1c:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
        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 <enquecommand_front(char const*, bool) [clone .constprop.323]+0xd6>

0002ed26 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]>:
    } 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 <SdBaseFile::seekSet(unsigned long)>
   2ed32:	81 11       	cpse	r24, r1
   2ed34:	02 c0       	rjmp	.+4      	; 0x2ed3a <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]+0x14>
   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 <SdFile::gfComputeNextFileBlock()>
   2ed42:	88 23       	and	r24, r24
   2ed44:	c1 f3       	breq	.-16     	; 0x2ed36 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]+0x10>
    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 <card+0x2b3>
   2ed4a:	30 91 41 17 	lds	r19, 0x1741	; 0x801741 <card+0x2b4>
   2ed4e:	24 56       	subi	r18, 0x64	; 100
   2ed50:	31 4f       	sbci	r19, 0xF1	; 241
   2ed52:	30 93 3b 17 	sts	0x173B, r19	; 0x80173b <card+0x2ae>
   2ed56:	20 93 3a 17 	sts	0x173A, r18	; 0x80173a <card+0x2ad>
bool SdFile::seekSetFilteredGcode(uint32_t pos){
    if(! seekSet(pos) )return false;
    if(! gfComputeNextFileBlock() )return false;
    gfReset();
    return true;
}
   2ed5a:	08 95       	ret

0002ed5c <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]>:
    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 <card+0x50>
   2ed88:	8f 93       	push	r24
   2ed8a:	80 91 dc 14 	lds	r24, 0x14DC	; 0x8014dc <card+0x4f>
   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 <sprintf_P>
   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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x5a>
   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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x8a>
    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 <tolower>
   2edde:	f6 01       	movw	r30, r12
   2ede0:	80 83       	st	Z, r24
   2ede2:	f3 94       	inc	r15
   2ede4:	e7 cf       	rjmp	.-50     	; 0x2edb4 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x58>
  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 <SdBaseFile::rewind()>

  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 <card+0x8b>
   2ee02:	82 30       	cpi	r24, 0x02	; 2
   2ee04:	08 f4       	brcc	.+2      	; 0x2ee08 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xac>
   2ee06:	50 c0       	rjmp	.+160    	; 0x2eea8 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x14c>
   2ee08:	80 91 1d 15 	lds	r24, 0x151D	; 0x80151d <card+0x90>
   2ee0c:	90 91 1e 15 	lds	r25, 0x151E	; 0x80151e <card+0x91>
   2ee10:	a0 91 1f 15 	lds	r26, 0x151F	; 0x80151f <card+0x92>
   2ee14:	b0 91 20 15 	lds	r27, 0x1520	; 0x801520 <card+0x93>
   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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xce>
   2ee28:	3f c0       	rjmp	.+126    	; 0x2eea8 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x14c>
   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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]>
  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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x14c>
  {
    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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xe4>
   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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x110>
    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 <tolower>
   2ee64:	f4 01       	movw	r30, r8
   2ee66:	80 83       	st	Z, r24
   2ee68:	b3 94       	inc	r11
   2ee6a:	e9 cf       	rjmp	.-46     	; 0x2ee3e <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xe2>
    //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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xa2>
    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 <strncmp>
   2ee7e:	89 2b       	or	r24, r25
   2ee80:	09 f0       	breq	.+2      	; 0x2ee84 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x128>
   2ee82:	bd cf       	rjmp	.-134    	; 0x2edfe <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xa2>
    {
      // 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 <enquecommandf_P(char const*, ...)>
      // 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 <enquecommand(char const*, bool)>
   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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0xa2>
    }
  }
  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 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.266]+0x15e>
    lastnr=-1;
  else
    lastnr++;
   2eeb0:	80 91 dc 14 	lds	r24, 0x14DC	; 0x8014dc <card+0x4f>
   2eeb4:	90 91 dd 14 	lds	r25, 0x14DD	; 0x8014dd <card+0x50>
   2eeb8:	01 96       	adiw	r24, 0x01	; 1
   2eeba:	90 93 dd 14 	sts	0x14DD, r25	; 0x8014dd <card+0x50>
   2eebe:	80 93 dc 14 	sts	0x14DC, r24	; 0x8014dc <card+0x4f>
}
   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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]>:
 * \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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x1a>
   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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x2c>

  // set file to correct position
  return seekSet(newPos);

 fail:
  return false;
   2ef10:	80 e0       	ldi	r24, 0x00	; 0
   2ef12:	60 c0       	rjmp	.+192    	; 0x2efd4 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0xec>
 * \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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x28>

  // 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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x44>
   2ef2a:	6e c0       	rjmp	.+220    	; 0x2f008 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x120>
   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 <SdBaseFile::seekSet(unsigned long)>
   2ef3a:	88 23       	and	r24, r24
   2ef3c:	49 f3       	breq	.-46     	; 0x2ef10 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x28>

  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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   2ef6e:	88 23       	and	r24, r24
   2ef70:	79 f2       	breq	.-98     	; 0x2ef10 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x28>

    // 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 <SdVolume::fatPut(unsigned long, unsigned long)>
   2ef82:	88 23       	and	r24, r24
   2ef84:	29 f2       	breq	.-118    	; 0x2ef10 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x28>

    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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x10e>
   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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x76>
    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 <SdBaseFile::sync()>
   2efc2:	88 23       	and	r24, r24
   2efc4:	09 f4       	brne	.+2      	; 0x2efc8 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0xe0>
   2efc6:	a4 cf       	rjmp	.-184    	; 0x2ef10 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x28>

  // 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 <SdBaseFile::seekSet(unsigned long)>

 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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0xbc>
   2f006:	ab cf       	rjmp	.-170    	; 0x2ef5e <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0x76>

  // 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 <SdBaseFile::truncate(unsigned long) [clone .constprop.263]+0xec>

0002f00c <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>:
+*   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
   2f05c:	8f 5f       	subi	r24, 0xFF	; 255
   2f05e:	80 93 9b 0e 	sts	0x0E9B, r24	; 0x800e9b <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
	} 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 <card+0x15>
   2f070:	90 93 a3 14 	sts	0x14A3, r25	; 0x8014a3 <card+0x16>
   2f074:	a0 93 a4 14 	sts	0x14A4, r26	; 0x8014a4 <card+0x17>
   2f078:	b0 93 a5 14 	sts	0x14A5, r27	; 0x8014a5 <card+0x18>
		_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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x84>
   2f08e:	c0 c1       	rjmp	.+896    	; 0x2f410 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x404>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x9e>
   2f0a8:	b3 c1       	rjmp	.+870    	; 0x2f410 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x404>

  //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 <card+0x19>
   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 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]>
	} 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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xb8>
   2f0c2:	a6 c1       	rjmp	.+844    	; 0x2f410 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x404>
			if (recursionCnt > MAX_DIR_DEPTH)
   2f0c4:	80 91 9b 0e 	lds	r24, 0x0E9B	; 0x800e9b <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
   2f0c8:	87 30       	cpi	r24, 0x07	; 7
   2f0ca:	08 f0       	brcs	.+2      	; 0x2f0ce <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xc2>
   2f0cc:	a1 c1       	rjmp	.+834    	; 0x2f410 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x404>
				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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xce>
   2f0d8:	9b c1       	rjmp	.+822    	; 0x2f410 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x404>
			if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue;
   2f0da:	85 3e       	cpi	r24, 0xE5	; 229
   2f0dc:	09 f4       	brne	.+2      	; 0x2f0e0 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xd4>
   2f0de:	39 c1       	rjmp	.+626    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
   2f0e0:	8e 32       	cpi	r24, 0x2E	; 46
   2f0e2:	09 f4       	brne	.+2      	; 0x2f0e6 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xda>
   2f0e4:	36 c1       	rjmp	.+620    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
			if (longFilename[0] == '.') continue;
   2f0e6:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   2f0ea:	8e 32       	cpi	r24, 0x2E	; 46
   2f0ec:	09 f4       	brne	.+2      	; 0x2f0f0 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xe4>
   2f0ee:	31 c1       	rjmp	.+610    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0xf2>
   2f0fc:	2a c1       	rjmp	.+596    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x100>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x10c>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x10c>
   2f116:	94 c0       	rjmp	.+296    	; 0x2f240 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x234>

				if (lsParams.LFN)
					puts_P(PSTR("DIR_EXIT"));
			}
			else {
				filenameIsDir = DIR_IS_SUBDIR(&p);
   2f118:	90 93 db 14 	sts	0x14DB, r25	; 0x8014db <card+0x4e>
				if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue;
   2f11c:	80 31       	cpi	r24, 0x10	; 16
   2f11e:	61 f0       	breq	.+24     	; 0x2f138 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x12c>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x120>
   2f12a:	13 c1       	rjmp	.+550    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x12c>
   2f136:	0d c1       	rjmp	.+538    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
				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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x138>
   2f142:	1b c1       	rjmp	.+566    	; 0x2f37a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x36e>
   2f144:	f2 30       	cpi	r31, 0x02	; 2
   2f146:	09 f4       	brne	.+2      	; 0x2f14a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x13e>
   2f148:	25 c1       	rjmp	.+586    	; 0x2f394 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x388>
					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 <createFilename(char*, directoryEntry const&)>
   2f158:	c4 01       	movw	r24, r8
   2f15a:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
   2f15e:	81 e9       	ldi	r24, 0x91	; 145
   2f160:	94 e1       	ldi	r25, 0x14	; 20
   2f162:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
						SERIAL_PROTOCOL(prepend);
						SERIAL_PROTOCOL(filename);

						MYSERIAL.write(' ');
   2f166:	80 e2       	ldi	r24, 0x20	; 32
   2f168:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
}

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 <MarlinSerial::printNumber(unsigned long, unsigned char)>
						SERIAL_PROTOCOL(p.fileSize);

						if (lsParams.timestamp)
   2f17e:	51 fe       	sbrs	r5, 1
   2f180:	45 c0       	rjmp	.+138    	; 0x2f20c <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x200>
						{
							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 <card+0x14>
   2f18e:	20 93 a0 14 	sts	0x14A0, r18	; 0x8014a0 <card+0x13>
							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 <card+0x12>
   2f19e:	40 93 9e 14 	sts	0x149E, r20	; 0x80149e <card+0x11>
							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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x1b8>
   2f1b0:	28 17       	cp	r18, r24
   2f1b2:	39 07       	cpc	r19, r25
   2f1b4:	99 f4       	brne	.+38     	; 0x2f1dc <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x1d0>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x1d0>
								crmodDate = p.creationDate;
   2f1c4:	90 93 a1 14 	sts	0x14A1, r25	; 0x8014a1 <card+0x14>
   2f1c8:	80 93 a0 14 	sts	0x14A0, r24	; 0x8014a0 <card+0x13>
								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 <card+0x12>
   2f1d8:	80 93 9e 14 	sts	0x149E, r24	; 0x80149e <card+0x11>
							}
							printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime);
   2f1dc:	80 91 a1 14 	lds	r24, 0x14A1	; 0x8014a1 <card+0x14>
   2f1e0:	8f 93       	push	r24
   2f1e2:	80 91 a0 14 	lds	r24, 0x14A0	; 0x8014a0 <card+0x13>
   2f1e6:	8f 93       	push	r24
   2f1e8:	80 91 9f 14 	lds	r24, 0x149F	; 0x80149f <card+0x12>
   2f1ec:	8f 93       	push	r24
   2f1ee:	80 91 9e 14 	lds	r24, 0x149E	; 0x80149e <card+0x11>
   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 <printf_P>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x22a>
							printf_P(PSTR(" \"%s\""), LONGEST_FILENAME);
   2f210:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   2f214:	88 23       	and	r24, r24
   2f216:	09 f4       	brne	.+2      	; 0x2f21a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x20e>
   2f218:	ba c0       	rjmp	.+372    	; 0x2f38e <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x382>
   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 <printf_P>
   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 <MarlinSerial::println()>
						manage_heater();
   2f23a:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
   2f23e:	89 c0       	rjmp	.+274    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
				}
				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 <createFilename(char*, directoryEntry const&)>
				// 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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x256>
   2f260:	86 c0       	rjmp	.+268    	; 0x2f36e <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x362>
   2f262:	01 90       	ld	r0, Z+
   2f264:	00 20       	and	r0, r0
   2f266:	e9 f7       	brne	.-6      	; 0x2f262 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x256>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x264>
   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 <strcpy>
				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>
				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 <strcat>
				// 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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x2dc>
					printf_P(PSTR("DIR_ENTER: %s \"%s\"\n"), path, longFilename[0] ? longFilename : lfilename);
   2f2be:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   2f2c2:	81 11       	cpse	r24, r1
   2f2c4:	57 c0       	rjmp	.+174    	; 0x2f374 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x368>
   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 <printf_P>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
				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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x2f8>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   2f324:	ce 01       	movw	r24, r28
   2f326:	01 96       	adiw	r24, 0x01	; 1
   2f328:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
				// close() is done automatically by destructor of SdFile

				if (lsParams.LFN)
   2f32c:	11 23       	and	r17, r17
   2f32e:	21 f0       	breq	.+8      	; 0x2f338 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x32c>
					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 <puts_P>
   2f338:	ce 01       	movw	r24, r28
   2f33a:	84 96       	adiw	r24, 0x24	; 36
   2f33c:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
   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 <card+0x15>
   2f360:	90 93 a3 14 	sts	0x14A3, r25	; 0x8014a3 <card+0x16>
   2f364:	a0 93 a4 14 	sts	0x14A4, r26	; 0x8014a4 <card+0x17>
   2f368:	b0 93 a5 14 	sts	0x14A5, r27	; 0x8014a5 <card+0x18>
   2f36c:	8c ce       	rjmp	.-744    	; 0x2f086 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x7a>
				// 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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x262>
				// 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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x2bc>
			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 <card+0x31a>
   2f37e:	90 91 a8 17 	lds	r25, 0x17A8	; 0x8017a8 <card+0x31b>
   2f382:	01 96       	adiw	r24, 0x01	; 1
   2f384:	90 93 a8 17 	sts	0x17A8, r25	; 0x8017a8 <card+0x31b>
   2f388:	80 93 a7 17 	sts	0x17A7, r24	; 0x8017a7 <card+0x31a>
   2f38c:	e2 cf       	rjmp	.-60     	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>
							}
							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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x212>
						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 <createFilename(char*, directoryEntry const&)>
						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 <card+0x14>
   2f3ae:	20 93 a0 14 	sts	0x14A0, r18	; 0x8014a0 <card+0x13>
						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 <card+0x12>
   2f3be:	40 93 9e 14 	sts	0x149E, r20	; 0x80149e <card+0x11>
						// 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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x3d8>
   2f3d0:	28 17       	cp	r18, r24
   2f3d2:	39 07       	cpc	r19, r25
   2f3d4:	99 f4       	brne	.+38     	; 0x2f3fc <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x3f0>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x3f0>
							crmodDate = p.creationDate;
   2f3e4:	90 93 a1 14 	sts	0x14A1, r25	; 0x8014a1 <card+0x14>
   2f3e8:	80 93 a0 14 	sts	0x14A0, r24	; 0x8014a0 <card+0x13>
							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 <card+0x12>
   2f3f8:	80 93 9e 14 	sts	0x149E, r24	; 0x80149e <card+0x11>
						}
						//writeDate = p.lastAccessDate;
						if (match != NULL) {
   2f3fc:	61 14       	cp	r6, r1
   2f3fe:	71 04       	cpc	r7, r1
   2f400:	59 f1       	breq	.+86     	; 0x2f458 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x44c>
							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 <strcasecmp>
   2f40c:	89 2b       	or	r24, r25
   2f40e:	59 f5       	brne	.+86     	; 0x2f466 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x45a>
	// RAII incrementer for the recursionCnt
	class _incrementer
	{
		public:
		_incrementer() {recursionCnt++;}
		~_incrementer() {recursionCnt--;}
   2f410:	80 91 9b 0e 	lds	r24, 0x0E9B	; 0x800e9b <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
   2f414:	81 50       	subi	r24, 0x01	; 1
   2f416:	80 93 9b 0e 	sts	0x0E9B, r24	; 0x800e9b <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
						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 <card+0x31a>
   2f45c:	90 91 a8 17 	lds	r25, 0x17A8	; 0x8017a8 <card+0x31b>
   2f460:	48 16       	cp	r4, r24
   2f462:	19 06       	cpc	r1, r25
   2f464:	a9 f2       	breq	.-86     	; 0x2f410 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x404>
						cnt++;
   2f466:	43 94       	inc	r4
   2f468:	74 cf       	rjmp	.-280    	; 0x2f352 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]+0x346>

0002f46a <CardReader::getfilename(unsigned int, char const*) [clone .constprop.259]>:
  }


}

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 <card+0x31b>
   2f4a0:	10 92 a7 17 	sts	0x17A7, r1	; 0x8017a7 <card+0x31a>
  curDir->rewind();
   2f4a4:	0e 94 c4 76 	call	0xed88	; 0xed88 <SdBaseFile::rewind()>
  };
  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 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.259]+0x50>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   2f4d4:	ce 01       	movw	r24, r28
   2f4d6:	01 96       	adiw	r24, 0x01	; 1
   2f4d8:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>

}
   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 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.257]>:

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 <card+0x31b>
   2f528:	10 92 a7 17 	sts	0x17A7, r1	; 0x8017a7 <card+0x31a>
	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 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.257]+0x3e>
   2f542:	c9 01       	movw	r24, r18
   2f544:	0f 94 89 57 	call	0x2af12	; 0x2af12 <SdBaseFile::seekSet(unsigned long)>
   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 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.257]+0x62>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   2f576:	ce 01       	movw	r24, r28
   2f578:	01 96       	adiw	r24, 0x01	; 1
   2f57a:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
}
   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 <CardReader::getnrfilenames() [clone .constprop.260]>:
	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 <SdBaseFile::rewind()>
   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 <CardReader::getnrfilenames() [clone .constprop.260]+0x54>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   2f606:	ce 01       	movw	r24, r28
   2f608:	01 96       	adiw	r24, 0x01	; 1
   2f60a:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
  //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 <CardReader::printAbsFilenameFast() [clone .constprop.250]>:
    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 <MarlinSerial::write(unsigned char)>
{
    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 <card+0x1a2>
   2f642:	c8 17       	cp	r28, r24
   2f644:	60 f4       	brcc	.+24     	; 0x2f65e <CardReader::printAbsFilenameFast() [clone .constprop.250]+0x2e>
    {
        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 <MarlinSerial::write(char const*)>
   2f654:	8f e2       	ldi	r24, 0x2F	; 47
   2f656:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
}

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 <CardReader::printAbsFilenameFast() [clone .constprop.250]+0xe>
    {
        SERIAL_PROTOCOL(dir_names[i]);
        SERIAL_PROTOCOL('/');
    }
    SERIAL_PROTOCOL(LONGEST_FILENAME);
   2f65e:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   2f662:	81 11       	cpse	r24, r1
   2f664:	06 c0       	rjmp	.+12     	; 0x2f672 <CardReader::printAbsFilenameFast() [clone .constprop.250]+0x42>
   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 <MarlinSerial::write(char const*)>
    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 <CardReader::printAbsFilenameFast() [clone .constprop.250]+0x3a>

0002f678 <eeprom_add_dword(unsigned long*, unsigned long) [clone .constprop.247]>:

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 <eeprom_read_dword>
   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 <eeprom_write_dword>

0002f6a8 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.246]>:
        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 <eeprom_read_dword>
    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 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.246]+0x28>
    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 <eeprom_write_dword>

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 <SdFile::gfUpdateCurrentPosition(unsigned int) [clone .constprop.245]>:
}

// 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 <SdFile::gfEnsureBlock() [clone .constprop.243]>:
    // 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 <card+0x2af>
   2f6fc:	70 91 3d 17 	lds	r23, 0x173D	; 0x80173d <card+0x2b0>
   2f700:	80 91 3e 17 	lds	r24, 0x173E	; 0x80173e <card+0x2b1>
   2f704:	90 91 3f 17 	lds	r25, 0x173F	; 0x80173f <card+0x2b2>
   2f708:	00 91 90 0e 	lds	r16, 0x0E90	; 0x800e90 <SdVolume::cacheBlockNumber_>
   2f70c:	10 91 91 0e 	lds	r17, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   2f710:	20 91 92 0e 	lds	r18, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   2f714:	30 91 93 0e 	lds	r19, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdFile::gfEnsureBlock() [clone .constprop.243]+0x7c>
        if ( ! vol_->cacheRawBlock(gfBlock, SdVolume::CACHE_FOR_READ)){
   2f722:	40 e0       	ldi	r20, 0x00	; 0
   2f724:	0f 94 04 55 	call	0x2aa08	; 0x2aa08 <SdVolume::cacheRawBlock(unsigned long, bool)>
   2f728:	88 23       	and	r24, r24
   2f72a:	f9 f0       	breq	.+62     	; 0x2f76a <SdFile::gfEnsureBlock() [clone .constprop.243]+0x76>
            return false;
        }
        // terminate with a '\n'
        const uint32_t terminateOfs = fileSize_ - gfOffset;
   2f72c:	20 91 40 17 	lds	r18, 0x1740	; 0x801740 <card+0x2b3>
   2f730:	30 91 41 17 	lds	r19, 0x1741	; 0x801741 <card+0x2b4>
   2f734:	40 91 30 17 	lds	r20, 0x1730	; 0x801730 <card+0x2a3>
   2f738:	50 91 31 17 	lds	r21, 0x1731	; 0x801731 <card+0x2a4>
   2f73c:	60 91 32 17 	lds	r22, 0x1732	; 0x801732 <card+0x2a5>
   2f740:	70 91 33 17 	lds	r23, 0x1733	; 0x801733 <card+0x2a6>
   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 <SdFile::gfEnsureBlock() [clone .constprop.243]+0x6c>
   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 <SdFile::gfEnsureBlock() [clone .constprop.243]+0x76>

0002f774 <twi_start(unsigned char, unsigned char) [clone .constprop.239]>:
}


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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   2f786:	81 11       	cpse	r24, r1
   2f788:	16 c0       	rjmp	.+44     	; 0x2f7b6 <twi_start(unsigned char, unsigned char) [clone .constprop.239]+0x42>
      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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   2f79c:	81 11       	cpse	r24, r1
   2f79e:	0f c0       	rjmp	.+30     	; 0x2f7be <twi_start(unsigned char, unsigned char) [clone .constprop.239]+0x4a>
      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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   2f7ae:	88 23       	and	r24, r24
   2f7b0:	19 f0       	breq	.+6      	; 0x2f7b8 <twi_start(unsigned char, unsigned char) [clone .constprop.239]+0x44>
      return 3;
   2f7b2:	83 e0       	ldi	r24, 0x03	; 3
   2f7b4:	01 c0       	rjmp	.+2      	; 0x2f7b8 <twi_start(unsigned char, unsigned char) [clone .constprop.239]+0x44>
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 <twi_start(unsigned char, unsigned char) [clone .constprop.239]+0x44>

0002f7c2 <PAT9125_sensor::resetStepCount() [clone .constprop.234]>:
    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 <fsensor+0x12>
   2f7ca:	10 92 ba 17 	sts	0x17BA, r1	; 0x8017ba <fsensor+0x11>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   2f7ce:	8f bf       	out	0x3f, r24	; 63
}
   2f7d0:	08 95       	ret

0002f7d2 <PAT9125_sensor::settings_init() [clone .constprop.231]>:
        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 <eeprom_read_byte>
   2f7da:	91 e0       	ldi	r25, 0x01	; 1
   2f7dc:	81 11       	cpse	r24, r1
   2f7de:	01 c0       	rjmp	.+2      	; 0x2f7e2 <PAT9125_sensor::settings_init() [clone .constprop.231]+0x10>
   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 <fsensor>
   2f7e8:	21 11       	cpse	r18, r1
   2f7ea:	01 c0       	rjmp	.+2      	; 0x2f7ee <PAT9125_sensor::settings_init() [clone .constprop.231]+0x1c>
   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 <fsensor>
    }

    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 <eeprom_read_byte>
   2f7fc:	91 e0       	ldi	r25, 0x01	; 1
   2f7fe:	81 11       	cpse	r24, r1
   2f800:	01 c0       	rjmp	.+2      	; 0x2f804 <PAT9125_sensor::settings_init() [clone .constprop.231]+0x32>
   2f802:	90 e0       	ldi	r25, 0x00	; 0
   2f804:	90 93 aa 17 	sts	0x17AA, r25	; 0x8017aa <fsensor+0x1>
    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 <eeprom_read_byte>
   2f810:	91 e0       	ldi	r25, 0x01	; 1
   2f812:	81 11       	cpse	r24, r1
   2f814:	01 c0       	rjmp	.+2      	; 0x2f818 <PAT9125_sensor::settings_init() [clone .constprop.231]+0x46>
   2f816:	90 e0       	ldi	r25, 0x00	; 0
   2f818:	90 93 ab 17 	sts	0x17AB, r25	; 0x8017ab <fsensor+0x2>
    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 <eeprom_read_byte>
    if (sensorActionOnError == SensorActionOnError::_Undef) {
   2f824:	8f 3f       	cpi	r24, 0xFF	; 255
   2f826:	c9 f0       	breq	.+50     	; 0x2f85a <PAT9125_sensor::settings_init() [clone .constprop.231]+0x88>
        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 <fsensor+0x8>
}

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 <eeprom_read_byte>
   2f834:	91 e0       	ldi	r25, 0x01	; 1
   2f836:	81 11       	cpse	r24, r1
   2f838:	01 c0       	rjmp	.+2      	; 0x2f83c <PAT9125_sensor::settings_init() [clone .constprop.231]+0x6a>
   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 <fsensor+0xe>
    oldPos = pat9125_y;
   2f840:	80 91 8e 0e 	lds	r24, 0x0E8E	; 0x800e8e <pat9125_y>
   2f844:	90 91 8f 0e 	lds	r25, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   2f848:	90 93 b9 17 	sts	0x17B9, r25	; 0x8017b9 <fsensor+0x10>
   2f84c:	80 93 b8 17 	sts	0x17B8, r24	; 0x8017b8 <fsensor+0xf>
    resetStepCount();
   2f850:	0f 94 e1 7b 	call	0x2f7c2	; 0x2f7c2 <PAT9125_sensor::resetStepCount() [clone .constprop.234]>
    jamErrCnt = 0;
   2f854:	10 92 be 17 	sts	0x17BE, r1	; 0x8017be <fsensor+0x15>

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 <fsensor+0x8>
   2f85e:	e6 cf       	rjmp	.-52     	; 0x2f82c <PAT9125_sensor::settings_init() [clone .constprop.231]+0x5a>

0002f860 <PAT9125_sensor::init() [clone .constprop.230]>:
#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 <fsensor>
   2f864:	83 30       	cpi	r24, 0x03	; 3
   2f866:	21 f4       	brne	.+8      	; 0x2f870 <PAT9125_sensor::init() [clone .constprop.230]+0x10>
}

void PAT9125_sensor::deinit() {
//    puts_P(PSTR("fsensor::deinit()"));
    ; //
    state = State::disabled;
   2f868:	10 92 a9 17 	sts	0x17A9, r1	; 0x8017a9 <fsensor>
    filter = 0;
   2f86c:	10 92 b5 17 	sts	0x17B5, r1	; 0x8017b5 <fsensor+0xc>
    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 <PAT9125_sensor::settings_init() [clone .constprop.231]>
    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 <cs+0x10>
   2f880:	70 91 ce 0d 	lds	r23, 0x0DCE	; 0x800dce <cs+0x11>
   2f884:	80 91 cf 0d 	lds	r24, 0x0DCF	; 0x800dcf <cs+0x12>
   2f888:	90 91 d0 0d 	lds	r25, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <fsensor+0x14>
   2f898:	60 93 bc 17 	sts	0x17BC, r22	; 0x8017bc <fsensor+0x13>


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 <PAT9125_sensor::init() [clone .constprop.230]+0x4a>
   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 <PAT9125_sensor::init() [clone .constprop.230]+0x54>
   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 <PAT9125_sensor::init() [clone .constprop.230]+0x46>
    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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   2f8de:	81 11       	cpse	r24, r1
   2f8e0:	68 c0       	rjmp	.+208    	; 0x2f9b2 <PAT9125_sensor::init() [clone .constprop.230]+0x152>
        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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   2f8f4:	81 11       	cpse	r24, r1
   2f8f6:	5d c0       	rjmp	.+186    	; 0x2f9b2 <PAT9125_sensor::init() [clone .constprop.230]+0x152>
}


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 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>

	// 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 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   2f90c:	80 93 bc 0d 	sts	0x0DBC, r24	; 0x800dbc <pat9125_PID1>
	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
   2f910:	81 e0       	ldi	r24, 0x01	; 1
   2f912:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   2f916:	80 93 bb 0d 	sts	0x0DBB, r24	; 0x800dbb <pat9125_PID2>
	if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
   2f91a:	90 91 bc 0d 	lds	r25, 0x0DBC	; 0x800dbc <pat9125_PID1>
   2f91e:	91 33       	cpi	r25, 0x31	; 49
   2f920:	b9 f5       	brne	.+110    	; 0x2f990 <PAT9125_sensor::init() [clone .constprop.230]+0x130>
   2f922:	81 39       	cpi	r24, 0x91	; 145
   2f924:	a9 f5       	brne	.+106    	; 0x2f990 <PAT9125_sensor::init() [clone .constprop.230]+0x130>
	}

#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 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>
	#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 <PAT9125_sensor::init() [clone .constprop.230]+0xd2>
   2f936:	00 c0       	rjmp	.+0      	; 0x2f938 <PAT9125_sensor::init() [clone .constprop.230]+0xd8>
   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 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.381]>
   2f942:	88 23       	and	r24, r24
   2f944:	b1 f1       	breq	.+108    	; 0x2f9b2 <PAT9125_sensor::init() [clone .constprop.230]+0x152>
   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 <PAT9125_sensor::init() [clone .constprop.230]+0xea>
   2f94e:	00 c0       	rjmp	.+0      	; 0x2f950 <PAT9125_sensor::init() [clone .constprop.230]+0xf0>
   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 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>
	//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 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.381]>
   2f962:	88 23       	and	r24, r24
   2f964:	31 f1       	breq	.+76     	; 0x2f9b2 <PAT9125_sensor::init() [clone .constprop.230]+0x152>
		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 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>

	// 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_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>

	pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
   2f976:	80 e0       	ldi	r24, 0x00	; 0
   2f978:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   2f97c:	80 93 bc 0d 	sts	0x0DBC, r24	; 0x800dbc <pat9125_PID1>
	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
   2f980:	81 e0       	ldi	r24, 0x01	; 1
   2f982:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   2f986:	80 93 bb 0d 	sts	0x0DBB, r24	; 0x800dbb <pat9125_PID2>
        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 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   2f996:	80 93 bc 0d 	sts	0x0DBC, r24	; 0x800dbc <pat9125_PID1>
		pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
   2f99a:	81 e0       	ldi	r24, 0x01	; 1
   2f99c:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   2f9a0:	80 93 bb 0d 	sts	0x0DBB, r24	; 0x800dbb <pat9125_PID2>
		if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
   2f9a4:	90 91 bc 0d 	lds	r25, 0x0DBC	; 0x800dbc <pat9125_PID1>
   2f9a8:	91 33       	cpi	r25, 0x31	; 49
   2f9aa:	19 f4       	brne	.+6      	; 0x2f9b2 <PAT9125_sensor::init() [clone .constprop.230]+0x152>
   2f9ac:	81 39       	cpi	r24, 0x91	; 145
   2f9ae:	09 f4       	brne	.+2      	; 0x2f9b2 <PAT9125_sensor::init() [clone .constprop.230]+0x152>
   2f9b0:	ba cf       	rjmp	.-140    	; 0x2f926 <PAT9125_sensor::init() [clone .constprop.230]+0xc6>

void PAT9125_sensor::deinit() {
//    puts_P(PSTR("fsensor::deinit()"));
    ; //
    state = State::disabled;
    filter = 0;
   2f9b2:	10 92 b5 17 	sts	0x17B5, r1	; 0x8017b5 <fsensor+0xc>
    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 <fsensor>
#ifdef IR_SENSOR_PIN
    else if (!READ(IR_SENSOR_PIN)) {
        ; // MK3 fw on MK3S printer
    }
#endif // IR_SENSOR_PIN
}
   2f9bc:	08 95       	ret

0002f9be <PAT9125_sensor::updatePAT9125() [clone .constprop.226]>:
    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 <fsensor+0xe>
   2f9c6:	88 23       	and	r24, r24
   2f9c8:	09 f4       	brne	.+2      	; 0x2f9cc <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0xe>
   2f9ca:	62 c0       	rjmp	.+196    	; 0x2fa90 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0xd2>
    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 <fsensor+0x11>
   2f9d4:	d0 91 bb 17 	lds	r29, 0x17BB	; 0x8017bb <fsensor+0x12>
    (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 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x2a>
   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 <fsensor+0x13>
   2f9ec:	30 91 bd 17 	lds	r19, 0x17BD	; 0x8017bd <fsensor+0x14>
   2f9f0:	82 17       	cp	r24, r18
   2f9f2:	93 07       	cpc	r25, r19
   2f9f4:	4c f1       	brlt	.+82     	; 0x2fa48 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x8a>
            resetStepCount();
   2f9f6:	0f 94 e1 7b 	call	0x2f7c2	; 0x2f7c2 <PAT9125_sensor::resetStepCount() [clone .constprop.234]>
            if (!pat9125_update()) { // get up to date data. reinit on error.
   2f9fa:	0f 94 68 c2 	call	0x384d0	; 0x384d0 <pat9125_update()>
   2f9fe:	81 11       	cpse	r24, r1
   2fa00:	02 c0       	rjmp	.+4      	; 0x2fa06 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x48>
                init();              // try to reinit.
   2fa02:	0f 94 30 7c 	call	0x2f860	; 0x2f860 <PAT9125_sensor::init() [clone .constprop.230]>
            }
            bool fsDir = (pat9125_y - oldPos) > 0;
   2fa06:	20 91 8e 0e 	lds	r18, 0x0E8E	; 0x800e8e <pat9125_y>
   2fa0a:	30 91 8f 0e 	lds	r19, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   2fa0e:	80 91 be 17 	lds	r24, 0x17BE	; 0x8017be <fsensor+0x15>
   2fa12:	40 91 b8 17 	lds	r20, 0x17B8	; 0x8017b8 <fsensor+0xf>
   2fa16:	50 91 b9 17 	lds	r21, 0x17B9	; 0x8017b9 <fsensor+0x10>
   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 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x6c>
   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 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x76>
   2fa32:	90 e0       	ldi	r25, 0x00	; 0
            if (fsDir != stDir) {
   2fa34:	49 17       	cp	r20, r25
   2fa36:	09 f4       	brne	.+2      	; 0x2fa3a <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x7c>
   2fa38:	63 c0       	rjmp	.+198    	; 0x2fb00 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x142>
                jamErrCnt++;
   2fa3a:	8f 5f       	subi	r24, 0xFF	; 255
            } else if (jamErrCnt) {
                jamErrCnt--;
   2fa3c:	80 93 be 17 	sts	0x17BE, r24	; 0x8017be <fsensor+0x15>
            }
            oldPos = pat9125_y;
   2fa40:	30 93 b9 17 	sts	0x17B9, r19	; 0x8017b9 <fsensor+0x10>
   2fa44:	20 93 b8 17 	sts	0x17B8, r18	; 0x8017b8 <fsensor+0xf>
        }
        if (jamErrCnt > 10) {
   2fa48:	80 91 be 17 	lds	r24, 0x17BE	; 0x8017be <fsensor+0x15>
   2fa4c:	8b 30       	cpi	r24, 0x0B	; 11
   2fa4e:	00 f1       	brcs	.+64     	; 0x2fa90 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0xd2>
            jamErrCnt = 0;
   2fa50:	10 92 be 17 	sts	0x17BE, r1	; 0x8017be <fsensor+0x15>
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 <fsensor+0x2>
    autoLoadEnabled = false;
   2fa58:	10 92 aa 17 	sts	0x17AA, r1	; 0x8017aa <fsensor+0x1>
    jamDetection = false;
   2fa5c:	10 92 b7 17 	sts	0x17B7, r1	; 0x8017b7 <fsensor+0xe>
    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 <stop_and_save_print_to_ram(float, float)>
    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 <restore_print_from_ram_and_continue(float)>
    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_byte(unsigned char*)>
    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 <eeprom_increment_word(unsigned int*)>
    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 <enquecommand_front(char const*, bool) [clone .constprop.323]>
            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 <Timer<unsigned short>::expired_cont(unsigned short)>
   2fa9c:	c8 2f       	mov	r28, r24
   2fa9e:	88 23       	and	r24, r24
   2faa0:	39 f1       	breq	.+78     	; 0x2faf0 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x132>
        pollingTimer.start();
   2faa2:	82 eb       	ldi	r24, 0xB2	; 178
   2faa4:	97 e1       	ldi	r25, 0x17	; 23
   2faa6:	0f 94 89 2a 	call	0x25512	; 0x25512 <Timer<unsigned short>::start()>
        if (!pat9125_update()) {
   2faaa:	0f 94 68 c2 	call	0x384d0	; 0x384d0 <pat9125_update()>
   2faae:	81 11       	cpse	r24, r1
   2fab0:	02 c0       	rjmp	.+4      	; 0x2fab6 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0xf8>
            init(); // try to reinit.
   2fab2:	0f 94 30 7c 	call	0x2f860	; 0x2f860 <PAT9125_sensor::init() [clone .constprop.230]>
        }

        bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50);
   2fab6:	80 91 ba 0d 	lds	r24, 0x0DBA	; 0x800dba <pat9125_s>
   2faba:	81 31       	cpi	r24, 0x11	; 17
   2fabc:	30 f0       	brcs	.+12     	; 0x2faca <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x10c>
   2fabe:	c1 e0       	ldi	r28, 0x01	; 1
   2fac0:	80 91 b9 0d 	lds	r24, 0x0DB9	; 0x800db9 <pat9125_b>
   2fac4:	82 33       	cpi	r24, 0x32	; 50
   2fac6:	08 f4       	brcc	.+2      	; 0x2faca <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x10c>
   2fac8:	c0 e0       	ldi	r28, 0x00	; 0
   2faca:	80 91 b5 17 	lds	r24, 0x17B5	; 0x8017b5 <fsensor+0xc>
        if (present != filterFilPresent) {
   2face:	20 91 b6 17 	lds	r18, 0x17B6	; 0x8017b6 <fsensor+0xd>
   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 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x14c>
            filter++;
   2fada:	8f 5f       	subi	r24, 0xFF	; 255
        } else if (filter) {
            filter--;
   2fadc:	80 93 b5 17 	sts	0x17B5, r24	; 0x8017b5 <fsensor+0xc>
        }
        if (filter >= filterCnt) {
   2fae0:	80 91 b5 17 	lds	r24, 0x17B5	; 0x8017b5 <fsensor+0xc>
   2fae4:	85 30       	cpi	r24, 0x05	; 5
   2fae6:	20 f0       	brcs	.+8      	; 0x2faf0 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x132>
            filter = 0;
   2fae8:	10 92 b5 17 	sts	0x17B5, r1	; 0x8017b5 <fsensor+0xc>
            filterFilPresent = present;
   2faec:	c0 93 b6 17 	sts	0x17B6, r28	; 0x8017b6 <fsensor+0xd>
        }
    }
    return (filter == 0); // return stability
   2faf0:	81 e0       	ldi	r24, 0x01	; 1
   2faf2:	90 91 b5 17 	lds	r25, 0x17B5	; 0x8017b5 <fsensor+0xc>
   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 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x148>
   2fb04:	9d cf       	rjmp	.-198    	; 0x2fa40 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x82>
                jamErrCnt--;
   2fb06:	81 50       	subi	r24, 0x01	; 1
   2fb08:	99 cf       	rjmp	.-206    	; 0x2fa3c <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x7e>
        }

        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 <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x122>
            filter--;
   2fb0e:	81 50       	subi	r24, 0x01	; 1
   2fb10:	e5 cf       	rjmp	.-54     	; 0x2fadc <PAT9125_sensor::updatePAT9125() [clone .constprop.226]+0x11e>

0002fb12 <CardReader::presort() [clone .constprop.218]>:
* 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 <card+0x1a4>
   2fb4a:	10 92 30 16 	sts	0x1630, r1	; 0x801630 <card+0x1a3>
	lastSortedFilePosition = 0;
   2fb4e:	10 92 fb 16 	sts	0x16FB, r1	; 0x8016fb <card+0x26e>
   2fb52:	10 92 fa 16 	sts	0x16FA, r1	; 0x8016fa <card+0x26d>
*/
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 <CardReader::presort() [clone .constprop.218]+0x22a>
	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 <eeprom_read_byte>
   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 <busy_state>

	// If there are files, sort up to the limit
	uint16_t fileCnt = getnrfilenames();
   2fb6e:	0f 94 cb 7a 	call	0x2f596	; 0x2f596 <CardReader::getnrfilenames() [clone .constprop.260]>
   2fb72:	6c 01       	movw	r12, r24
	if (fileCnt > 0) {
   2fb74:	00 97       	sbiw	r24, 0x00	; 0
   2fb76:	09 f4       	brne	.+2      	; 0x2fb7a <CardReader::presort() [clone .constprop.218]+0x68>
   2fb78:	de c0       	rjmp	.+444    	; 0x2fd36 <CardReader::presort() [clone .constprop.218]+0x224>
		// 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 <CardReader::presort() [clone .constprop.218]+0x86>
			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 <CardReader::presort() [clone .constprop.218]+0x80>
				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 <lang_get_translation>
   2fb8e:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			}
			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 <card+0x1a4>
   2fb9c:	c0 92 30 16 	sts	0x1630, r12	; 0x801630 <card+0x1a3>
   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 <CardReader::presort() [clone .constprop.218]+0x22a>
			manage_heater();
   2fbc2:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
			if (i == 0)
   2fbc6:	e1 14       	cp	r14, r1
   2fbc8:	f1 04       	cpc	r15, r1
   2fbca:	09 f0       	breq	.+2      	; 0x2fbce <CardReader::presort() [clone .constprop.218]+0xbc>
   2fbcc:	d0 c0       	rjmp	.+416    	; 0x2fd6e <CardReader::presort() [clone .constprop.218]+0x25c>
				getfilename(0);
   2fbce:	90 e0       	ldi	r25, 0x00	; 0
   2fbd0:	80 e0       	ldi	r24, 0x00	; 0
   2fbd2:	0f 94 35 7a 	call	0x2f46a	; 0x2f46a <CardReader::getfilename(unsigned int, char const*) [clone .constprop.259]>
			else
				getfilename_next(position);
			sort_entries[i] = position >> 5;
   2fbd6:	80 91 a2 14 	lds	r24, 0x14A2	; 0x8014a2 <card+0x15>
   2fbda:	90 91 a3 14 	lds	r25, 0x14A3	; 0x8014a3 <card+0x16>
   2fbde:	a0 91 a4 14 	lds	r26, 0x14A4	; 0x8014a4 <card+0x17>
   2fbe2:	b0 91 a5 14 	lds	r27, 0x14A5	; 0x8014a5 <card+0x18>
   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 <CardReader::presort() [clone .constprop.218]+0xd6>
   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 <CardReader::presort() [clone .constprop.218]+0xa8>
			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 <CardReader::presort() [clone .constprop.218]+0x100>
   2fc10:	92 c0       	rjmp	.+292    	; 0x2fd36 <CardReader::presort() [clone .constprop.218]+0x224>
   2fc12:	32 e0       	ldi	r19, 0x02	; 2
   2fc14:	33 16       	cp	r3, r19
   2fc16:	09 f4       	brne	.+2      	; 0x2fc1a <CardReader::presort() [clone .constprop.218]+0x108>
   2fc18:	8e c0       	rjmp	.+284    	; 0x2fd36 <CardReader::presort() [clone .constprop.218]+0x224>

#ifdef SORTING_SPEEDTEST
			LongTimer sortingSpeedtestTimer;
			sortingSpeedtestTimer.start();
#endif //SORTING_SPEEDTEST
			lastSortedFilePosition = position >> 5;
   2fc1a:	90 93 fb 16 	sts	0x16FB, r25	; 0x8016fb <card+0x26e>
   2fc1e:	80 93 fa 16 	sts	0x16FA, r24	; 0x8016fa <card+0x26d>
#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 <lang_get_translation>
   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 <menu_progressbar_init(unsigned int, char const*)>
   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 <menu_progressbar_update(unsigned int)>
        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 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.257]>
        strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it)
   2fc70:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   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 <CardReader::presort() [clone .constprop.218]+0x16e>
   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 <strcpy>
        crmod_date_bckp = crmodDate;
   2fc88:	60 90 a0 14 	lds	r6, 0x14A0	; 0x8014a0 <card+0x13>
   2fc8c:	70 90 a1 14 	lds	r7, 0x14A1	; 0x8014a1 <card+0x14>
        crmod_time_bckp = crmodTime;
   2fc90:	20 91 9e 14 	lds	r18, 0x149E	; 0x80149e <card+0x11>
   2fc94:	30 91 9f 14 	lds	r19, 0x149F	; 0x80149f <card+0x12>
   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 <card+0x4e>
   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 <CardReader::presort() [clone .constprop.218]+0x22a>
            printf_P(PSTR("%2u "), sort_entries[z]);
          }
          MYSERIAL.println();
          #endif

          manage_heater();
   2fcae:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
          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 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.257]>
          char *name2 = LONGEST_FILENAME; // use the string in-place
   2fccc:	80 91 a6 14 	lds	r24, 0x14A6	; 0x8014a6 <card+0x19>
   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 <CardReader::presort() [clone .constprop.218]+0x1ca>
   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 <CardReader::presort() [clone .constprop.218]+0x2e2>
   2fce0:	80 91 db 14 	lds	r24, 0x14DB	; 0x8014db <card+0x4e>
   2fce4:	28 12       	cpse	r2, r24
   2fce6:	83 c0       	rjmp	.+262    	; 0x2fdee <CardReader::presort() [clone .constprop.218]+0x2dc>
          #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 <card+0x13>
   2fcec:	90 91 a1 14 	lds	r25, 0x14A1	; 0x8014a1 <card+0x14>
   2fcf0:	68 16       	cp	r6, r24
   2fcf2:	79 06       	cpc	r7, r25
   2fcf4:	09 f0       	breq	.+2      	; 0x2fcf8 <CardReader::presort() [clone .constprop.218]+0x1e6>
   2fcf6:	6c c0       	rjmp	.+216    	; 0x2fdd0 <CardReader::presort() [clone .constprop.218]+0x2be>
   2fcf8:	80 91 9e 14 	lds	r24, 0x149E	; 0x80149e <card+0x11>
   2fcfc:	90 91 9f 14 	lds	r25, 0x149F	; 0x80149f <card+0x12>
   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 <CardReader::presort() [clone .constprop.218]+0x1fa>
   2fd0a:	66 c0       	rjmp	.+204    	; 0x2fdd8 <CardReader::presort() [clone .constprop.218]+0x2c6>
            #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 <CardReader::presort() [clone .constprop.218]+0x220>
   2fd30:	91 cf       	rjmp	.-222    	; 0x2fc54 <CardReader::presort() [clone .constprop.218]+0x142>
			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 <menu_progressbar_finish()>
		}
	}

	KEEPALIVE_STATE(NOT_BUSY);
   2fd36:	81 e0       	ldi	r24, 0x01	; 1
   2fd38:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
}
   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 <card+0x15>
   2fd72:	50 91 a3 14 	lds	r21, 0x14A3	; 0x8014a3 <card+0x16>
   2fd76:	60 91 a4 14 	lds	r22, 0x14A4	; 0x8014a4 <card+0x17>
   2fd7a:	70 91 a5 14 	lds	r23, 0x14A5	; 0x8014a5 <card+0x18>
	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 <card+0xac>
   2fd82:	a0 92 38 15 	sts	0x1538, r10	; 0x801538 <card+0xab>
	nrFiles = 1;
   2fd86:	90 92 a8 17 	sts	0x17A8, r9	; 0x8017a8 <card+0x31b>
   2fd8a:	80 92 a7 17 	sts	0x17A7, r8	; 0x8017a7 <card+0x31a>
	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 <SdBaseFile::seekSet(unsigned long)>
   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 <card+0xab>
   2fd9e:	f0 91 39 15 	lds	r31, 0x1539	; 0x801539 <card+0xac>
   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 <CardReader::presort() [clone .constprop.218]+0x296>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   2fdc6:	ce 01       	movw	r24, r28
   2fdc8:	01 96       	adiw	r24, 0x01	; 1
   2fdca:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
   2fdce:	03 cf       	rjmp	.-506    	; 0x2fbd6 <CardReader::presort() [clone .constprop.218]+0xc4>
          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 <CardReader::presort() [clone .constprop.218]+0x2c6>
   2fdd6:	9a cf       	rjmp	.-204    	; 0x2fd0c <CardReader::presort() [clone .constprop.218]+0x1fa>
            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 <CardReader::presort() [clone .constprop.218]+0x2da>
   2fdea:	5d cf       	rjmp	.-326    	; 0x2fca6 <CardReader::presort() [clone .constprop.218]+0x194>
   2fdec:	8f cf       	rjmp	.-226    	; 0x2fd0c <CardReader::presort() [clone .constprop.218]+0x1fa>
          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 <CardReader::presort() [clone .constprop.218]+0x2c6>
   2fdf2:	8c cf       	rjmp	.-232    	; 0x2fd0c <CardReader::presort() [clone .constprop.218]+0x1fa>
   2fdf4:	31 e0       	ldi	r19, 0x01	; 1
   2fdf6:	33 12       	cpse	r3, r19
   2fdf8:	ef cf       	rjmp	.-34     	; 0x2fdd8 <CardReader::presort() [clone .constprop.218]+0x2c6>

          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 <card+0x4e>
   2fdfe:	28 12       	cpse	r2, r24
   2fe00:	07 c0       	rjmp	.+14     	; 0x2fe10 <CardReader::presort() [clone .constprop.218]+0x2fe>
          #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 <strcasecmp>
   2fe0a:	97 fd       	sbrc	r25, 7
   2fe0c:	e5 cf       	rjmp	.-54     	; 0x2fdd8 <CardReader::presort() [clone .constprop.218]+0x2c6>
   2fe0e:	7e cf       	rjmp	.-260    	; 0x2fd0c <CardReader::presort() [clone .constprop.218]+0x1fa>
   2fe10:	21 10       	cpse	r2, r1
   2fe12:	e2 cf       	rjmp	.-60     	; 0x2fdd8 <CardReader::presort() [clone .constprop.218]+0x2c6>
   2fe14:	7b cf       	rjmp	.-266    	; 0x2fd0c <CardReader::presort() [clone .constprop.218]+0x1fa>

0002fe16 <CardReader::chdir(char const*, bool) [clone .constprop.224]>:
  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 <card+0xb0>
    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 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x40>
}

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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   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 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x9c>
   2fe6a:	80 91 2f 16 	lds	r24, 0x162F	; 0x80162f <card+0x1a2>
   2fe6e:	85 30       	cpi	r24, 0x05	; 5
   2fe70:	00 f5       	brcc	.+64     	; 0x2feb2 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x9c>
   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 <strcpy>
    puts(relpath);
   2fe84:	c7 01       	movw	r24, r14
   2fe86:	0f 94 9f e2 	call	0x3c53e	; 0x3c53e <puts>

    if (workDirDepth < MAX_DIR_DEPTH) {
   2fe8a:	80 91 2f 16 	lds	r24, 0x162F	; 0x80162f <card+0x1a2>
   2fe8e:	86 30       	cpi	r24, 0x06	; 6
   2fe90:	80 f1       	brcs	.+96     	; 0x2fef2 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0xdc>
      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 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x86>

#ifdef SDCARD_SORT_ALPHA
	if (doPresort)
   2fea4:	00 23       	and	r16, r16
   2fea6:	09 f4       	brne	.+2      	; 0x2feaa <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x94>
   2fea8:	4c c0       	rjmp	.+152    	; 0x2ff42 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x12c>
		presort();
   2feaa:	0f 94 89 7d 	call	0x2fb12	; 0x2fb12 <CardReader::presort() [clone .constprop.218]>
	else
		presort_flag = true;
#endif
	return 1;
   2feae:	10 2f       	mov	r17, r16
   2feb0:	0c c0       	rjmp	.+24     	; 0x2feca <CardReader::chdir(char const*, bool) [clone .constprop.224]+0xb4>
  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 <serialprintPGM(char const*)>
   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 <serialprintPGM(char const*)>
   SERIAL_ECHOLN(relpath);
   2fec2:	c7 01       	movw	r24, r14
   2fec4:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
   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 <SdBaseFile::~SdBaseFile()>
	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 <card+0x1a2>
        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 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x11a>
        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 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x110>
   2ff2e:	e5 cf       	rjmp	.-54     	; 0x2fefa <CardReader::chdir(char const*, bool) [clone .constprop.224]+0xe4>
      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 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x122>
   2ff40:	a8 cf       	rjmp	.-176    	; 0x2fe92 <CardReader::chdir(char const*, bool) [clone .constprop.224]+0x7c>

#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 <card+0x51>
   2ff48:	c0 cf       	rjmp	.-128    	; 0x2feca <CardReader::chdir(char const*, bool) [clone .constprop.224]+0xb4>

0002ff4a <CardReader::cdroot(bool) [clone .constprop.217]>:
  }
}

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 <CardReader::cdroot(bool) [clone .constprop.217]+0xa>
  workDirDepth = 0;
   2ff5c:	10 92 2f 16 	sts	0x162F, r1	; 0x80162f <card+0x1a2>
  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 <card+0xac>
   2ff68:	20 93 38 15 	sts	0x1538, r18	; 0x801538 <card+0xab>
#ifdef SDCARD_SORT_ALPHA
	if (doPresort)
   2ff6c:	81 11       	cpse	r24, r1
		presort();
   2ff6e:	0d 94 89 7d 	jmp	0x2fb12	; 0x2fb12 <CardReader::presort() [clone .constprop.218]>
	else
		presort_flag = true;
   2ff72:	81 e0       	ldi	r24, 0x01	; 1
   2ff74:	80 93 de 14 	sts	0x14DE, r24	; 0x8014de <card+0x51>
#endif
}
   2ff78:	08 95       	ret

0002ff7a <CardReader::diveSubfolder(char const*&) [clone .constprop.222]>:
 *
 * @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 <card+0xac>
   2ffaa:	20 93 38 15 	sts	0x1538, r18	; 0x801538 <card+0xab>
    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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x66>
    }
    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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x6e>
   2ffe6:	47 c0       	rjmp	.+142    	; 0x30076 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0xfc>
   2ffe8:	6c 01       	movw	r12, r24
    {
        cdroot(false);
   2ffea:	80 e0       	ldi	r24, 0x00	; 0
   2ffec:	0f 94 a5 7f 	call	0x2ff4a	; 0x2ff4a <CardReader::cdroot(bool) [clone .constprop.217]>
        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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x3e>
        {
            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 <strchr>
   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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0xf4>
   3001a:	08 17       	cp	r16, r24
   3001c:	19 07       	cpc	r17, r25
   3001e:	38 f5       	brcc	.+78     	; 0x3006e <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0xf4>
            {
                const size_t maxLen = 12;
                char subdirname[maxLen+1];
                const size_t len = ((static_cast<size_t>(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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0xba>
   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 <strncpy>
                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 <CardReader::chdir(char const*, bool) [clone .constprop.224]>
   30058:	88 23       	and	r24, r24
   3005a:	09 f4       	brne	.+2      	; 0x3005e <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0xe4>
   3005c:	ae cf       	rjmp	.-164    	; 0x2ffba <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x40>
                    return 0;

                curDir = &workDir;
   3005e:	90 92 39 15 	sts	0x1539, r9	; 0x801539 <card+0xac>
   30062:	80 92 38 15 	sts	0x1538, r8	; 0x801538 <card+0xab>
                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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x88>
            }
            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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x3e>

        }
    }
    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 <card+0xac>
   3007e:	80 93 38 15 	sts	0x1538, r24	; 0x801538 <card+0xab>
   30082:	9a cf       	rjmp	.-204    	; 0x2ffb8 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]+0x3e>

00030084 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]>:
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 <card+0x3>
   300a2:	22 23       	and	r18, r18
   300a4:	09 f4       	brne	.+2      	; 0x300a8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x24>
   300a6:	ef c0       	rjmp	.+478    	; 0x30286 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x202>
   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 <card+0x295>
   300ae:	88 23       	and	r24, r24
   300b0:	09 f4       	brne	.+2      	; 0x300b4 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x30>
   300b2:	04 c1       	rjmp	.+520    	; 0x302bc <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x238>
        if(!replace_current){
   300b4:	61 11       	cpse	r22, r1
   300b6:	f6 c0       	rjmp	.+492    	; 0x302a4 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x220>
            if((int)file_subcall_ctr>(int)SD_PROCEDURE_DEPTH-1){
   300b8:	d0 90 42 17 	lds	r13, 0x1742	; 0x801742 <card+0x2b5>
   300bc:	dd 20       	and	r13, r13
   300be:	21 f0       	breq	.+8      	; 0x300c8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x44>
                // 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 <kill(char const*)>
                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 <serialprintPGM(char const*)>
            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 <serialprintPGM(char const*)>
   300d8:	c7 01       	movw	r24, r14
   300da:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
            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 <serialprintPGM(char const*)>

            //store current filename and position
            getAbsFilename(filenames[file_subcall_ctr]);
   300e6:	00 91 42 17 	lds	r16, 0x1742	; 0x801742 <card+0x2b5>
   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<workDirDepth;i++)
  {
    workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
   30102:	83 e2       	ldi	r24, 0x23	; 35
   30104:	b8 2e       	mov	r11, r24

void CardReader::getAbsFilename(char *t)
{
  uint8_t cnt=0;
  *t='/';t++;cnt++;
  for(uint8_t i=0;i<workDirDepth;i++)
   30106:	80 91 2f 16 	lds	r24, 0x162F	; 0x80162f <card+0x1a2>
   3010a:	d8 16       	cp	r13, r24
   3010c:	b0 f4       	brcc	.+44     	; 0x3013a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0xb6>
  {
    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 <SdBaseFile::getFilename(char*)>
   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 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0xb2>
   3012c:	f4 e5       	ldi	r31, 0x54	; 84
   3012e:	fc 15       	cp	r31, r12
   30130:	10 f0       	brcs	.+4      	; 0x30136 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0xb2>
    {t++;cnt++;}  //crawl counter forward.
   30132:	c3 94       	inc	r12
   30134:	f5 cf       	rjmp	.-22     	; 0x30120 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x9c>

void CardReader::getAbsFilename(char *t)
{
  uint8_t cnt=0;
  *t='/';t++;cnt++;
  for(uint8_t i=0;i<workDirDepth;i++)
   30136:	d3 94       	inc	r13
   30138:	e6 cf       	rjmp	.-52     	; 0x30106 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x82>
  {
    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 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0xbe>
   30140:	ae c0       	rjmp	.+348    	; 0x3029e <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x21a>
    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 <SdBaseFile::getFilename(char*)>
            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 <card+0x2b5>
   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 <MarlinSerial::write(char const*)>
            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 <serialprintPGM(char const*)>
}

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 <card+0x316>
   3016c:	70 91 a4 17 	lds	r23, 0x17A4	; 0x8017a4 <card+0x317>
   30170:	80 91 a5 17 	lds	r24, 0x17A5	; 0x8017a5 <card+0x318>
   30174:	90 91 a6 17 	lds	r25, 0x17A6	; 0x8017a6 <card+0x319>
   30178:	4a e0       	ldi	r20, 0x0A	; 10
   3017a:	0f 94 fa d4 	call	0x3a9f4	; 0x3a9f4 <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned long n, int base)
{
  print(n, base);
  println();
   3017e:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
            SERIAL_ECHOLN(sdpos);
            filespos[file_subcall_ctr]=sdpos;
   30182:	80 91 42 17 	lds	r24, 0x1742	; 0x801742 <card+0x2b5>
   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 <card+0x316>
   30196:	50 91 a4 17 	lds	r21, 0x17A4	; 0x8017a4 <card+0x317>
   3019a:	60 91 a5 17 	lds	r22, 0x17A5	; 0x8017a5 <card+0x318>
   3019e:	70 91 a6 17 	lds	r23, 0x17A6	; 0x8017a6 <card+0x319>
   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 <card+0x2b5>
        } 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 <SdBaseFile::close()>
        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 <card+0x2>

    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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]>
   301c8:	88 23       	and	r24, r24
   301ca:	09 f4       	brne	.+2      	; 0x301ce <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x14a>
   301cc:	5c c0       	rjmp	.+184    	; 0x30286 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x202>
 */
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 <card+0xab>
   301d6:	70 91 39 15 	lds	r23, 0x1539	; 0x801539 <card+0xac>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   301e4:	88 23       	and	r24, r24
   301e6:	09 f4       	brne	.+2      	; 0x301ea <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x166>
   301e8:	77 c0       	rjmp	.+238    	; 0x302d8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x254>
        // 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 <SdFile::gfComputeNextFileBlock()>
   301f2:	88 23       	and	r24, r24
   301f4:	09 f4       	brne	.+2      	; 0x301f8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x174>
   301f6:	70 c0       	rjmp	.+224    	; 0x302d8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x254>
    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 <card+0x2b3>
   301fc:	90 91 41 17 	lds	r25, 0x1741	; 0x801741 <card+0x2b4>
   30200:	84 56       	subi	r24, 0x64	; 100
   30202:	91 4f       	sbci	r25, 0xF1	; 241
   30204:	90 93 3b 17 	sts	0x173B, r25	; 0x80173b <card+0x2ae>
   30208:	80 93 3a 17 	sts	0x173A, r24	; 0x80173a <card+0x2ad>
      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 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.259]>
        filesize = file.fileSize();
   30214:	80 91 30 17 	lds	r24, 0x1730	; 0x801730 <card+0x2a3>
   30218:	90 91 31 17 	lds	r25, 0x1731	; 0x801731 <card+0x2a4>
   3021c:	a0 91 32 17 	lds	r26, 0x1732	; 0x801732 <card+0x2a5>
   30220:	b0 91 33 17 	lds	r27, 0x1733	; 0x801733 <card+0x2a6>
   30224:	80 93 9c 17 	sts	0x179C, r24	; 0x80179c <card+0x30f>
   30228:	90 93 9d 17 	sts	0x179D, r25	; 0x80179d <card+0x310>
   3022c:	a0 93 9e 17 	sts	0x179E, r26	; 0x80179e <card+0x311>
   30230:	b0 93 9f 17 	sts	0x179F, r27	; 0x80179f <card+0x312>
        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 <serialprintPGM(char const*)>
        printAbsFilenameFast();
   3023c:	0f 94 18 7b 	call	0x2f630	; 0x2f630 <CardReader::printAbsFilenameFast() [clone .constprop.250]>
        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 <serialprintPGM(char const*)>
}

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 <card+0x30f>
   3024c:	70 91 9d 17 	lds	r23, 0x179D	; 0x80179d <card+0x310>
   30250:	80 91 9e 17 	lds	r24, 0x179E	; 0x80179e <card+0x311>
   30254:	90 91 9f 17 	lds	r25, 0x179F	; 0x80179f <card+0x312>
   30258:	4a e0       	ldi	r20, 0x0A	; 10
   3025a:	0f 94 fa d4 	call	0x3a9f4	; 0x3a9f4 <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned long n, int base)
{
  print(n, base);
  println();
   3025e:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
        SERIAL_PROTOCOLLN(filesize);
        sdpos = 0;
   30262:	10 92 a3 17 	sts	0x17A3, r1	; 0x8017a3 <card+0x316>
   30266:	10 92 a4 17 	sts	0x17A4, r1	; 0x8017a4 <card+0x317>
   3026a:	10 92 a5 17 	sts	0x17A5, r1	; 0x8017a5 <card+0x318>
   3026e:	10 92 a6 17 	sts	0x17A6, r1	; 0x8017a6 <card+0x319>

        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 <serialprintlnPGM(char const*)>
        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 <lcd_setstatuspgm(char const*)>
        scrollstuff = 0;
   30282:	10 92 b8 0d 	sts	0x0DB8, r1	; 0x800db8 <scrollstuff>
      } 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 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0xc8>
            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 <serialprintPGM(char const*)>
            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 <serialprintPGM(char const*)>
            SERIAL_ECHOLN(name);
   302b4:	c7 01       	movw	r24, r14
   302b6:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
   302ba:	7a cf       	rjmp	.-268    	; 0x301b0 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x12c>
        }
        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 <card+0x2b5>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
        SERIAL_ECHOLN(name);
   302d0:	c7 01       	movw	r24, r14
   302d2:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
   302d6:	70 cf       	rjmp	.-288    	; 0x301b8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x134>

        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 <serialprintPGM(char const*)>
   302e0:	89 81       	ldd	r24, Y+1	; 0x01
   302e2:	9a 81       	ldd	r25, Y+2	; 0x02
   302e4:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
}

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 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   302ee:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
   302f2:	c9 cf       	rjmp	.-110    	; 0x30286 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]+0x202>

000302f4 <CardReader::printingHasFinished() [clone .constprop.220]>:



void CardReader::printingHasFinished()
{
    st_synchronize();
   302f4:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    file.close();
   302f8:	8f e1       	ldi	r24, 0x1F	; 31
   302fa:	97 e1       	ldi	r25, 0x17	; 23
   302fc:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>

    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 <card+0x2b5>
   30304:	88 23       	and	r24, r24
   30306:	69 f1       	breq	.+90     	; 0x30362 <CardReader::printingHasFinished() [clone .constprop.220]+0x6e>
    {
      file_subcall_ctr--;
   30308:	81 50       	subi	r24, 0x01	; 1
   3030a:	80 93 42 17 	sts	0x1742, r24	; 0x801742 <card+0x2b5>
      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 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.221]>
      setIndex(filespos[file_subcall_ctr]);
   30320:	e0 91 42 17 	lds	r30, 0x1742	; 0x801742 <card+0x2b5>
   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 <card+0x316>
   3033c:	70 93 a4 17 	sts	0x17A4, r23	; 0x8017a4 <card+0x317>
   30340:	80 93 a5 17 	sts	0x17A5, r24	; 0x8017a5 <card+0x318>
   30344:	90 93 a6 17 	sts	0x17A6, r25	; 0x8017a6 <card+0x319>
   30348:	0f 94 93 76 	call	0x2ed26	; 0x2ed26 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.317]>
  SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
}

void CardReader::startFileprint()
{
  if(mounted)
   3034c:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   30350:	88 23       	and	r24, r24
   30352:	71 f0       	breq	.+28     	; 0x30370 <CardReader::printingHasFinished() [clone .constprop.220]+0x7c>
  {
    sdprinting = true;
   30354:	81 e0       	ldi	r24, 0x01	; 1
   30356:	80 93 8f 14 	sts	0x148F, r24	; 0x80148f <card+0x2>
   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 <card+0x2>
   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 <finishAndDisableSteppers()>
      autotempShutdown();
	  #ifdef SDCARD_SORT_ALPHA
		  //presort();
	  #endif
    }
}
   30370:	08 95       	ret

00030372 <CardReader::mount(bool) [clone .constprop.216]>:
  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 <card+0x3>
  if(root.isOpen())
   30388:	80 91 18 15 	lds	r24, 0x1518	; 0x801518 <card+0x8b>
   3038c:	88 23       	and	r24, r24
   3038e:	21 f0       	breq	.+8      	; 0x30398 <CardReader::mount(bool) [clone .constprop.216]+0x26>
    root.close();
   30390:	85 e1       	ldi	r24, 0x15	; 21
   30392:	95 e1       	ldi	r25, 0x15	; 21
   30394:	0f 94 67 59 	call	0x2b2ce	; 0x2b2ce <SdBaseFile::close()>
 * \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 <card+0x272>
   3039c:	10 92 fc 16 	sts	0x16FC, r1	; 0x8016fc <card+0x26f>
  // 16-bit init start time allows over a minute
  uint16_t t0 = (uint16_t)_millis();
   303a0:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   303a4:	eb 01       	movw	r28, r22
  uint32_t arg;

  // set pin modes
  chipSelectHigh();
   303a6:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  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 <card+0x270>
 * 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 <spiSend(unsigned char) [clone .lto_priv.382]>
   303d2:	11 50       	subi	r17, 0x01	; 1
   303d4:	d9 f7       	brne	.-10     	; 0x303cc <CardReader::mount(bool) [clone .constprop.216]+0x5a>

  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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   303e8:	80 93 fe 16 	sts	0x16FE, r24	; 0x8016fe <card+0x271>
   303ec:	81 30       	cpi	r24, 0x01	; 1
   303ee:	61 f0       	breq	.+24     	; 0x30408 <CardReader::mount(bool) [clone .constprop.216]+0x96>
    if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) {
   303f0:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <CardReader::mount(bool) [clone .constprop.216]+0x66>
      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 <card+0x26f>
   30406:	22 c0       	rjmp	.+68     	; 0x3044c <CardReader::mount(bool) [clone .constprop.216]+0xda>
      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 <millis2>
   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 <serialprintlnPGM(char const*)>
  spiSend(0XFF);
   30418:	8f ef       	ldi	r24, 0xFF	; 255
   3041a:	0f 94 3c 53 	call	0x2a678	; 0x2a678 <spiSend(unsigned char) [clone .lto_priv.382]>
  while ((status_ = spiRec()) != 0xFF)
   3041e:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   30422:	80 93 fe 16 	sts	0x16FE, r24	; 0x8016fe <card+0x271>
   30426:	8f 3f       	cpi	r24, 0xFF	; 255
   30428:	59 f1       	breq	.+86     	; 0x30480 <CardReader::mount(bool) [clone .constprop.216]+0x10e>
  {
    spiSend(0XFF);
   3042a:	8f ef       	ldi	r24, 0xFF	; 255
   3042c:	0f 94 3c 53 	call	0x2a678	; 0x2a678 <spiSend(unsigned char) [clone .lto_priv.382]>
    if (((uint16_t)_millis() - t0) > SD_CARD_ERROR_FF_TIMEOUT)
   30430:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <CardReader::mount(bool) [clone .constprop.216]+0xac>
   3043e:	82 e0       	ldi	r24, 0x02	; 2
   30440:	80 93 fc 16 	sts	0x16FC, r24	; 0x8016fc <card+0x26f>
    {
      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 <serialprintlnPGM(char const*)>
#else  // SOFTWARE_SPI
  return true;
#endif  // SOFTWARE_SPI

 fail:
  chipSelectHigh();
   3044c:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
#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 <serialprintPGM(char const*)>
    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 <serialprintlnPGM(char const*)>
  }

  if (mounted)
   30460:	80 91 90 14 	lds	r24, 0x1490	; 0x801490 <card+0x3>
   30464:	88 23       	and	r24, r24
   30466:	09 f4       	brne	.+2      	; 0x3046a <CardReader::mount(bool) [clone .constprop.216]+0xf8>
   30468:	9a c0       	rjmp	.+308    	; 0x3059e <CardReader::mount(bool) [clone .constprop.216]+0x22c>
  {
    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 <CardReader::cdroot(bool) [clone .constprop.217]>
      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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   30492:	82 ff       	sbrs	r24, 2
   30494:	2b c0       	rjmp	.+86     	; 0x304ec <CardReader::mount(bool) [clone .constprop.216]+0x17a>

  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 <card+0x272>
      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 <card+0x272>
   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 <CardReader::mount(bool) [clone .constprop.216]+0x142>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
    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 <Sd2Card::cardCommand(unsigned char, unsigned long)>

  while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) {
   304d2:	80 93 fe 16 	sts	0x16FE, r24	; 0x8016fe <card+0x271>
   304d6:	88 23       	and	r24, r24
   304d8:	b1 f0       	breq	.+44     	; 0x30506 <CardReader::mount(bool) [clone .constprop.216]+0x194>
    // check for timeout
    if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) {
   304da:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <CardReader::mount(bool) [clone .constprop.216]+0x142>
  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 <CardReader::mount(bool) [clone .constprop.216]+0x90>
      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 <spiRec() [clone .lto_priv.376]>
   304f2:	80 93 fe 16 	sts	0x16FE, r24	; 0x8016fe <card+0x271>
   304f6:	11 50       	subi	r17, 0x01	; 1
   304f8:	d1 f7       	brne	.-12     	; 0x304ee <CardReader::mount(bool) [clone .constprop.216]+0x17c>
    if (status_ != 0XAA) {
   304fa:	8a 3a       	cpi	r24, 0xAA	; 170
   304fc:	11 f0       	breq	.+4      	; 0x30502 <CardReader::mount(bool) [clone .constprop.216]+0x190>
   304fe:	82 e0       	ldi	r24, 0x02	; 2
   30500:	80 cf       	rjmp	.-256    	; 0x30402 <CardReader::mount(bool) [clone .constprop.216]+0x90>

  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 <CardReader::mount(bool) [clone .constprop.216]+0x126>
      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 <card+0x272>
   3050a:	82 30       	cpi	r24, 0x02	; 2
   3050c:	d1 f4       	brne	.+52     	; 0x30542 <CardReader::mount(bool) [clone .constprop.216]+0x1d0>
    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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   3051e:	88 23       	and	r24, r24
   30520:	11 f0       	breq	.+4      	; 0x30526 <CardReader::mount(bool) [clone .constprop.216]+0x1b4>
  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 <CardReader::mount(bool) [clone .constprop.216]+0x90>
      error(SD_CARD_ERROR_CMD58);
      goto fail;
    }
    if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC);
   30526:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   3052a:	80 7c       	andi	r24, 0xC0	; 192
   3052c:	80 3c       	cpi	r24, 0xC0	; 192
   3052e:	19 f4       	brne	.+6      	; 0x30536 <CardReader::mount(bool) [clone .constprop.216]+0x1c4>

  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 <card+0x272>
    // 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 <spiRec() [clone .lto_priv.376]>
   3053a:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   3053e:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
  }
  chipSelectHigh();
   30542:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
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 <card+0x270>
   * \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 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]>
   30550:	81 11       	cpse	r24, r1
   30552:	0c c0       	rjmp	.+24     	; 0x3056c <CardReader::mount(bool) [clone .constprop.216]+0x1fa>
   30554:	80 e0       	ldi	r24, 0x00	; 0
   30556:	0f 94 b2 69 	call	0x2d364	; 0x2d364 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.256]>
#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 <CardReader::mount(bool) [clone .constprop.216]+0x1fa>
  {
    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 <serialprintPGM(char const*)>
    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 <CardReader::mount(bool) [clone .constprop.216]+0xea>
  }
  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 <SdBaseFile::openRoot(SdVolume*)>
   30578:	81 11       	cpse	r24, r1
   3057a:	07 c0       	rjmp	.+14     	; 0x3058a <CardReader::mount(bool) [clone .constprop.216]+0x218>
  {
    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 <serialprintPGM(char const*)>
    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 <CardReader::mount(bool) [clone .constprop.216]+0xea>
  }
  else
  {
    mounted = true;
   3058a:	81 e0       	ldi	r24, 0x01	; 1
   3058c:	80 93 90 14 	sts	0x1490, r24	; 0x801490 <card+0x3>
    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 <serialprintPGM(char const*)>
    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 <CardReader::mount(bool) [clone .constprop.216]+0xea>

  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 <wait_for_heater(long, unsigned char) [clone .constprop.214]>:
            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 <target_temperature>
   305d0:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x72>
#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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x72>
   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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x8c>
		(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 <lcd_commands_type>
   3061e:	82 30       	cpi	r24, 0x02	; 2
   30620:	b9 f4       	brne	.+46     	; 0x30650 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0xa0>
			{
				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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x72>
		(residencyStart >= 0 && (((unsigned int)(_millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) {
   30640:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x6a>
   3064e:	e9 cf       	rjmp	.-46     	; 0x30622 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x72>
        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 <millis2>
   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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x132>
		{ //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 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   3066e:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   30672:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   30676:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   3067a:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   3067e:	41 e0       	ldi	r20, 0x01	; 1
   30680:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
				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 <serialprintPGM(char const*)>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
				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 <serialprintPGM(char const*)>
				if (residencyStart > -1)
   3069e:	f7 fc       	sbrc	r15, 7
   306a0:	52 c0       	rjmp	.+164    	; 0x30746 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x196>
				{
					codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL;
   306a2:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   306d6:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>
				}
			}
#else
				SERIAL_PROTOCOLLN();
#endif
				codenum = _millis();
   306da:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <delay_keep_alive(unsigned int)>
#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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x148>
   306f6:	46 c0       	rjmp	.+140    	; 0x30784 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x1d4>
		}
		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 <target_temperature>
   30700:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   30704:	88 23       	and	r24, r24
   30706:	19 f1       	breq	.+70     	; 0x3074e <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x19e>
   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 <current_temperature>
   30728:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   3072c:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   30730:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   30734:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   30738:	87 fd       	sbrc	r24, 7
   3073a:	65 cf       	rjmp	.-310    	; 0x30606 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x56>
				(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 <millis2>
   30740:	6b 01       	movw	r12, r22
   30742:	7c 01       	movw	r14, r24
   30744:	60 cf       	rjmp	.-320    	; 0x30606 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x56>
}

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 <MarlinSerial::write(unsigned char)>
   3074c:	c4 cf       	rjmp	.-120    	; 0x306d6 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x126>
   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 <current_temperature>
   3076e:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   30772:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   30776:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   3077a:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   3077e:	18 16       	cp	r1, r24
   30780:	ec f6       	brge	.-70     	; 0x3073c <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x18c>
   30782:	41 cf       	rjmp	.-382    	; 0x30606 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x56>
   30784:	f7 fc       	sbrc	r15, 7
   30786:	3f cf       	rjmp	.-386    	; 0x30606 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x56>
   30788:	60 91 b5 0d 	lds	r22, 0x0DB5	; 0x800db5 <target_temperature>
   3078c:	70 91 b6 0d 	lds	r23, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <current_temperature>
   307a4:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   307a8:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   307ac:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x218>
   307c6:	1f cf       	rjmp	.-450    	; 0x30606 <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x56>
   307c8:	b9 cf       	rjmp	.-142    	; 0x3073c <wait_for_heater(long, unsigned char) [clone .constprop.214]+0x18c>

000307ca <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]>:
    // 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 <MMU2::mmu2+0x42>
   307d8:	83 30       	cpi	r24, 0x03	; 3
   307da:	09 f4       	brne	.+2      	; 0x307de <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x14>
   307dc:	4e c0       	rjmp	.+156    	; 0x3087a <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0xb0>
   307de:	8c 31       	cpi	r24, 0x1C	; 28
   307e0:	09 f4       	brne	.+2      	; 0x307e4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x1a>
   307e2:	52 c0       	rjmp	.+164    	; 0x30888 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0xbe>
        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 <MMU2::mmu2+0x67>
   307e8:	90 91 b2 13 	lds	r25, 0x13B2	; 0x8013b2 <MMU2::mmu2+0x68>
   307ec:	8c 17       	cp	r24, r28
   307ee:	9d 07       	cpc	r25, r29
   307f0:	79 f1       	breq	.+94     	; 0x30850 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x86>
        lastErrorCode = ec;
   307f2:	d0 93 b2 13 	sts	0x13B2, r29	; 0x8013b2 <MMU2::mmu2+0x68>
   307f6:	c0 93 b1 13 	sts	0x13B1, r28	; 0x8013b1 <MMU2::mmu2+0x67>
        lastErrorSource = res;
   307fa:	10 93 b3 13 	sts	0x13B3, r17	; 0x8013b3 <MMU2::mmu2+0x69>
        LogErrorEvent_P(_O(PrusaErrorTitle(PrusaErrorCodeIndex(ec))));
   307fe:	ce 01       	movw	r24, r28
   30800:	0f 94 e0 c5 	call	0x38bc0	; 0x38bc0 <MMU2::PrusaErrorCodeIndex(ErrorCode)>
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 <MMU2::LogEchoEvent_P(char const*)>

        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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x86>
   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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x86>
   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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x86>
            IncrementMMUFails();
   30830:	0f 94 e2 c4 	call	0x389c4	; 0x389c4 <MMU2::IncrementMMUFails()>
                | (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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x86>

    /// 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 <MMU2::mmu2+0x75>
   30842:	90 91 c0 13 	lds	r25, 0x13C0	; 0x8013c0 <MMU2::mmu2+0x76>
   30846:	01 96       	adiw	r24, 0x01	; 1
   30848:	90 93 c0 13 	sts	0x13C0, r25	; 0x8013c0 <MMU2::mmu2+0x76>
   3084c:	80 93 bf 13 	sts	0x13BF, r24	; 0x8013bf <MMU2::mmu2+0x75>
        return true;
    }
}

bool MMU2::RetryIfPossible(ErrorCode ec) {
    if (logic.RetryAttempts()) {
   30850:	80 91 9e 13 	lds	r24, 0x139E	; 0x80139e <MMU2::mmu2+0x54>
   30854:	88 23       	and	r24, r24
   30856:	d9 f0       	breq	.+54     	; 0x3088e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0xc4>

    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 <MMU2::ButtonAvailable(ErrorCode)>
   30864:	8f 3f       	cpi	r24, 0xFF	; 255
   30866:	99 f0       	breq	.+38     	; 0x3088e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0xc4>

    void ResetCommunicationTimeoutAttempts();

    constexpr bool InAutoRetry() const { return inAutoRetry; }
    void SetInAutoRetry(bool iar) {
        inAutoRetry = iar;
   30868:	10 93 9f 13 	sts	0x139F, r17	; 0x80139f <MMU2::mmu2+0x55>
            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 <serialprintlnPGM(char const*)>
    // 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 <MMU2::mmu2+0x72>
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 <planner_abort_hard()>
    // 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 <planner_aborted>
   30886:	ae cf       	rjmp	.-164    	; 0x307e4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0x1a>
        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 <MMU2::mmu2+0x71>
   3088c:	f8 cf       	rjmp	.-16     	; 0x3087e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0xb4>
   3088e:	10 92 9f 13 	sts	0x139F, r1	; 0x80139f <MMU2::mmu2+0x55>
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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]+0xdc>
   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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]>
   308a6:	df 91       	pop	r29
   308a8:	cf 91       	pop	r28
   308aa:	1f 91       	pop	r17
   308ac:	08 95       	ret

000308ae <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]>:
 * \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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x26>
   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 <card+0x295>
   308e2:	81 30       	cpi	r24, 0x01	; 1
   308e4:	09 f0       	breq	.+2      	; 0x308e8 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x3a>
   308e6:	de c0       	rjmp	.+444    	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>
   308e8:	80 91 20 17 	lds	r24, 0x1720	; 0x801720 <card+0x293>
   308ec:	81 ff       	sbrs	r24, 1
   308ee:	da c0       	rjmp	.+436    	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>

  // 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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1be>
 * \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 <card+0x29a>
   30900:	10 91 28 17 	lds	r17, 0x1728	; 0x801728 <card+0x29b>
   30904:	20 91 29 17 	lds	r18, 0x1729	; 0x801729 <card+0x29c>
   30908:	30 91 2a 17 	lds	r19, 0x172A	; 0x80172a <card+0x29d>
  // 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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x66>
   30912:	30 c1       	rjmp	.+608    	; 0x30b74 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x2c6>
    uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_);
   30914:	80 91 38 17 	lds	r24, 0x1738	; 0x801738 <card+0x2ab>
   30918:	90 91 39 17 	lds	r25, 0x1739	; 0x801739 <card+0x2ac>
  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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x7c>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xda>
   3093e:	01 15       	cp	r16, r1
   30940:	11 05       	cpc	r17, r1
   30942:	11 f5       	brne	.+68     	; 0x30988 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xda>
   30944:	40 91 23 17 	lds	r20, 0x1723	; 0x801723 <card+0x296>
   30948:	50 91 24 17 	lds	r21, 0x1724	; 0x801724 <card+0x297>
   3094c:	60 91 25 17 	lds	r22, 0x1725	; 0x801725 <card+0x298>
   30950:	70 91 26 17 	lds	r23, 0x1726	; 0x801726 <card+0x299>
      // 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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xb2>
   3095e:	a8 c0       	rjmp	.+336    	; 0x30ab0 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x202>
        if (firstCluster_ == 0) {
   30960:	80 91 34 17 	lds	r24, 0x1734	; 0x801734 <card+0x2a7>
   30964:	90 91 35 17 	lds	r25, 0x1735	; 0x801735 <card+0x2a8>
   30968:	a0 91 36 17 	lds	r26, 0x1736	; 0x801736 <card+0x2a9>
   3096c:	b0 91 37 17 	lds	r27, 0x1737	; 0x801737 <card+0x2aa>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xcc>
   30978:	b4 c0       	rjmp	.+360    	; 0x30ae2 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x234>
      } 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 <SdBaseFile::addCluster()>
   30982:	88 23       	and	r24, r24
   30984:	09 f4       	brne	.+2      	; 0x30988 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xda>
   30986:	8e c0       	rjmp	.+284    	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>
          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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xea>
   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 <card+0x2ab>
   3099c:	f0 91 39 17 	lds	r31, 0x1739	; 0x801739 <card+0x2ac>
  uint32_t clusterStartBlock(uint32_t cluster) const {
           return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}
   309a0:	80 91 23 17 	lds	r24, 0x1723	; 0x801723 <card+0x296>
   309a4:	90 91 24 17 	lds	r25, 0x1724	; 0x801724 <card+0x297>
   309a8:	a0 91 25 17 	lds	r26, 0x1725	; 0x801725 <card+0x298>
   309ac:	b0 91 26 17 	lds	r27, 0x1726	; 0x801726 <card+0x299>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x114>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x10c>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x142>
   309ee:	8a c0       	rjmp	.+276    	; 0x30b04 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x256>
      // full block - don't need to use cache
      if (vol_->cacheBlockNumber() == block) {
   309f0:	80 91 90 0e 	lds	r24, 0x0E90	; 0x800e90 <SdVolume::cacheBlockNumber_>
   309f4:	90 91 91 0e 	lds	r25, 0x0E91	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   309f8:	a0 91 92 0e 	lds	r26, 0x0E92	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   309fc:	b0 91 93 0e 	lds	r27, 0x0E93	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x176>
  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 <SdVolume::cacheDirty_>
    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 <SdVolume::cacheBlockNumber_>
   30a18:	90 93 91 0e 	sts	0x0E91, r25	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   30a1c:	a0 93 92 0e 	sts	0x0E92, r26	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   30a20:	b0 93 93 0e 	sts	0x0E93, r27	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
    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 <SdVolume::sdCard_>
   30a2e:	90 91 9a 0e 	lds	r25, 0x0E9A	; 0x800e9a <SdVolume::sdCard_+0x1>
   30a32:	0f 94 a8 53 	call	0x2a750	; 0x2a750 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
        // 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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>
        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 <card+0x29a>
   30a3e:	90 91 28 17 	lds	r25, 0x1728	; 0x801728 <card+0x29b>
   30a42:	a0 91 29 17 	lds	r26, 0x1729	; 0x801729 <card+0x29c>
   30a46:	b0 91 2a 17 	lds	r27, 0x172A	; 0x80172a <card+0x29d>
   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 <card+0x29a>
   30a56:	90 93 28 17 	sts	0x1728, r25	; 0x801728 <card+0x29b>
   30a5a:	a0 93 29 17 	sts	0x1729, r26	; 0x801729 <card+0x29c>
   30a5e:	b0 93 2a 17 	sts	0x172A, r27	; 0x80172a <card+0x29d>
    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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x4e>

  // 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 <card+0x2a3>
   30a70:	50 91 31 17 	lds	r21, 0x1731	; 0x801731 <card+0x2a4>
   30a74:	60 91 32 17 	lds	r22, 0x1732	; 0x801732 <card+0x2a5>
   30a78:	70 91 33 17 	lds	r23, 0x1733	; 0x801733 <card+0x2a6>
   30a7c:	80 91 27 17 	lds	r24, 0x1727	; 0x801727 <card+0x29a>
   30a80:	90 91 28 17 	lds	r25, 0x1728	; 0x801728 <card+0x29b>
   30a84:	a0 91 29 17 	lds	r26, 0x1729	; 0x801729 <card+0x29c>
   30a88:	b0 91 2a 17 	lds	r27, 0x172A	; 0x80172a <card+0x29d>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1ea>
   30a96:	2e cf       	rjmp	.-420    	; 0x308f4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x46>
  }
  /** 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 <SdBaseFile::seekSet(unsigned long)>
    if (!seekEnd()) goto fail;
   30aa0:	81 11       	cpse	r24, r1
   30aa2:	28 cf       	rjmp	.-432    	; 0x308f4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x46>
  }
  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 <card+0x292>
  return -1;
   30aaa:	8f ef       	ldi	r24, 0xFF	; 255
   30aac:	9f ef       	ldi	r25, 0xFF	; 255
   30aae:	81 c0       	rjmp	.+258    	; 0x30bb2 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x304>
        } 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 <SdVolume::fatGet(unsigned long, unsigned long*)>
   30aba:	88 23       	and	r24, r24
   30abc:	99 f3       	breq	.-26     	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>
        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 <card+0x2ab>
   30aca:	f0 91 39 17 	lds	r31, 0x1739	; 0x801739 <card+0x2ac>
   30ace:	27 89       	ldd	r18, Z+23	; 0x17
   30ad0:	20 31       	cpi	r18, 0x10	; 16
   30ad2:	81 f4       	brne	.+32     	; 0x30af4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x246>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x234>
   30ae0:	4c cf       	rjmp	.-360    	; 0x3097a <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xcc>
          // add cluster if at end of chain
          if (!addCluster()) goto fail;
        } else {
          curCluster_ = next;
   30ae2:	80 93 23 17 	sts	0x1723, r24	; 0x801723 <card+0x296>
   30ae6:	90 93 24 17 	sts	0x1724, r25	; 0x801724 <card+0x297>
   30aea:	a0 93 25 17 	sts	0x1725, r26	; 0x801725 <card+0x298>
   30aee:	b0 93 26 17 	sts	0x1726, r27	; 0x801726 <card+0x299>
   30af2:	4a cf       	rjmp	.-364    	; 0x30988 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xda>
    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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x234>
   30b02:	3b cf       	rjmp	.-394    	; 0x3097a <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0xcc>
        // 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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x2b6>
   30b0a:	40 91 27 17 	lds	r20, 0x1727	; 0x801727 <card+0x29a>
   30b0e:	50 91 28 17 	lds	r21, 0x1728	; 0x801728 <card+0x29b>
   30b12:	60 91 29 17 	lds	r22, 0x1729	; 0x801729 <card+0x29c>
   30b16:	70 91 2a 17 	lds	r23, 0x172A	; 0x80172a <card+0x29d>
   30b1a:	80 91 30 17 	lds	r24, 0x1730	; 0x801730 <card+0x2a3>
   30b1e:	90 91 31 17 	lds	r25, 0x1731	; 0x801731 <card+0x2a4>
   30b22:	a0 91 32 17 	lds	r26, 0x1732	; 0x801732 <card+0x2a5>
   30b26:	b0 91 33 17 	lds	r27, 0x1733	; 0x801733 <card+0x2a6>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x2b6>
        // start of new block don't need to read into cache
        if (!vol_->cacheFlush()) goto fail;
   30b34:	0f 94 0c 54 	call	0x2a818	; 0x2a818 <SdVolume::cacheFlush()>
   30b38:	88 23       	and	r24, r24
   30b3a:	09 f4       	brne	.+2      	; 0x30b3e <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x290>
   30b3c:	b3 cf       	rjmp	.-154    	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>
  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 <SdVolume::cacheDirty_>
    cacheBlockNumber_  = blockNumber;
   30b44:	40 92 90 0e 	sts	0x0E90, r4	; 0x800e90 <SdVolume::cacheBlockNumber_>
   30b48:	50 92 91 0e 	sts	0x0E91, r5	; 0x800e91 <SdVolume::cacheBlockNumber_+0x1>
   30b4c:	60 92 92 0e 	sts	0x0E92, r6	; 0x800e92 <SdVolume::cacheBlockNumber_+0x2>
   30b50:	70 92 93 0e 	sts	0x0E93, r7	; 0x800e93 <SdVolume::cacheBlockNumber_+0x3>
      } 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 <memcpy>
   30b62:	6b cf       	rjmp	.-298    	; 0x30a3a <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x18c>
        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 <SdVolume::cacheRawBlock(unsigned long, bool)>
   30b6e:	81 11       	cpse	r24, r1
   30b70:	f1 cf       	rjmp	.-30     	; 0x30b54 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x2a6>
   30b72:	98 cf       	rjmp	.-208    	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>
    }
    curPosition_ += n;
    src += n;
    nToWrite -= n;
  }
  if (curPosition_ > fileSize_) {
   30b74:	80 91 30 17 	lds	r24, 0x1730	; 0x801730 <card+0x2a3>
   30b78:	90 91 31 17 	lds	r25, 0x1731	; 0x801731 <card+0x2a4>
   30b7c:	a0 91 32 17 	lds	r26, 0x1732	; 0x801732 <card+0x2a5>
   30b80:	b0 91 33 17 	lds	r27, 0x1733	; 0x801733 <card+0x2a6>
   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 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x2fa>
   30b8e:	80 91 20 17 	lds	r24, 0x1720	; 0x801720 <card+0x293>
    // update fileSize and insure sync will update dir entry
    fileSize_ = curPosition_;
   30b92:	00 93 30 17 	sts	0x1730, r16	; 0x801730 <card+0x2a3>
   30b96:	10 93 31 17 	sts	0x1731, r17	; 0x801731 <card+0x2a4>
   30b9a:	20 93 32 17 	sts	0x1732, r18	; 0x801732 <card+0x2a5>
   30b9e:	30 93 33 17 	sts	0x1733, r19	; 0x801733 <card+0x2a6>
    flags_ |= F_FILE_DIR_DIRTY;
   30ba2:	80 68       	ori	r24, 0x80	; 128
   30ba4:	80 93 20 17 	sts	0x1720, r24	; 0x801720 <card+0x293>
  } 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 <card+0x293>
   30bac:	83 fd       	sbrc	r24, 3
   30bae:	18 c0       	rjmp	.+48     	; 0x30be0 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x332>
    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 <SdBaseFile::sync()>
   30be8:	81 11       	cpse	r24, r1
   30bea:	e2 cf       	rjmp	.-60     	; 0x30bb0 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x302>
   30bec:	5b cf       	rjmp	.-330    	; 0x30aa4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.187]+0x1f6>

00030bee <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]>:
#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 <card+0x1a3>
   30c08:	30 91 31 16 	lds	r19, 0x1631	; 0x801631 <card+0x1a4>
   30c0c:	82 17       	cp	r24, r18
   30c0e:	93 07       	cpc	r25, r19
   30c10:	d8 f4       	brcc	.+54     	; 0x30c48 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]+0x5a>
        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 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]+0x34>
   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 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.257]>
    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 <card+0xac>
   30c50:	40 93 38 15 	sts	0x1538, r20	; 0x801538 <card+0xab>
	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 <card+0x31b>
   30c5e:	80 93 a7 17 	sts	0x17A7, r24	; 0x8017a7 <card+0x31a>
	curDir->seekSet(lastSortedFilePosition << 5);
   30c62:	40 91 fa 16 	lds	r20, 0x16FA	; 0x8016fa <card+0x26d>
   30c66:	50 91 fb 16 	lds	r21, 0x16FB	; 0x8016fb <card+0x26e>
   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 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]+0x7e>
   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 <SdBaseFile::seekSet(unsigned long)>
  };
  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 <card+0xab>
   30c8a:	f0 91 39 15 	lds	r31, 0x1539	; 0x801539 <card+0xac>
   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 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]+0xa6>
   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 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.261]>
   30cb0:	ce 01       	movw	r24, r28
   30cb2:	01 96       	adiw	r24, 0x01	; 1
   30cb4:	0e 94 c9 76 	call	0xed92	; 0xed92 <SdBaseFile::~SdBaseFile()>
   30cb8:	bd cf       	rjmp	.-134    	; 0x30c34 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.183]+0x46>

00030cba <CardReader::openFileWrite(char const*) [clone .constprop.182]>:
        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 <card+0x3>
   30cce:	22 23       	and	r18, r18
   30cd0:	69 f1       	breq	.+90     	; 0x30d2c <CardReader::openFileWrite(char const*) [clone .constprop.182]+0x72>
   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 <card+0x295>
   30cd8:	88 23       	and	r24, r24
   30cda:	79 f1       	breq	.+94     	; 0x30d3a <CardReader::openFileWrite(char const*) [clone .constprop.182]+0x80>
        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 <serialprintlnPGM(char const*)>
        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 <card+0x2>

    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 <CardReader::diveSubfolder(char const*&) [clone .constprop.222]>
   30cf4:	88 23       	and	r24, r24
   30cf6:	d1 f0       	breq	.+52     	; 0x30d2c <CardReader::openFileWrite(char const*) [clone .constprop.182]+0x72>
      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 <card+0xab>
   30d00:	70 91 39 15 	lds	r23, 0x1539	; 0x801539 <card+0xac>
   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 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   30d0e:	81 11       	cpse	r24, r1
   30d10:	22 c0       	rjmp	.+68     	; 0x30d56 <CardReader::openFileWrite(char const*) [clone .constprop.182]+0x9c>
        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 <serialprintPGM(char const*)>
   30d1a:	89 81       	ldd	r24, Y+1	; 0x01
   30d1c:	9a 81       	ldd	r25, Y+2	; 0x02
   30d1e:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
   30d22:	8e e2       	ldi	r24, 0x2E	; 46
   30d24:	0e 94 cf 76 	call	0xed9e	; 0xed9e <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   30d28:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>

        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 <card+0x2b5>
        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 <serialprintPGM(char const*)>
        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 <serialprintPGM(char const*)>
        SERIAL_ECHOLN(name);
   30d4e:	c8 01       	movw	r24, r16
   30d50:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
   30d54:	c7 cf       	rjmp	.-114    	; 0x30ce4 <CardReader::openFileWrite(char const*) [clone .constprop.182]+0x2a>
    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 <card>
        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 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.259]>
        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 <serialprintPGM(char const*)>
        printAbsFilenameFast();
   30d6c:	0f 94 18 7b 	call	0x2f630	; 0x2f630 <CardReader::printAbsFilenameFast() [clone .constprop.250]>
        SERIAL_PROTOCOLLN();
   30d70:	0f 94 f1 d5 	call	0x3abe2	; 0x3abe2 <MarlinSerial::println()>

        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 <serialprintlnPGM(char const*)>
        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 <lcd_setstatuspgm(char const*)>
        scrollstuff = 0;
   30d84:	10 92 b8 0d 	sts	0x0DB8, r1	; 0x800db8 <scrollstuff>
   30d88:	d1 cf       	rjmp	.-94     	; 0x30d2c <CardReader::openFileWrite(char const*) [clone .constprop.182]+0x72>

00030d8a <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]>:
		  //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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0xe>
/** 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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   30db0:	88 23       	and	r24, r24
   30db2:	91 f0       	breq	.+36     	; 0x30dd8 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x4e>
   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 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   30dc6:	88 23       	and	r24, r24
   30dc8:	39 f0       	breq	.+14     	; 0x30dd8 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x4e>
  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 <card+0x26f>
  chipSelectHigh();
  spiSend(0xFF); // dummy clock to force FlashAir finish the command.
  return true;

 fail:
  chipSelectHigh();
   30dd0:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  return false;
   30dd4:	80 e0       	ldi	r24, 0x00	; 0
   30dd6:	2f c0       	rjmp	.+94     	; 0x30e36 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0xac>
//------------------------------------------------------------------------------
/** 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 <millis2>
   30ddc:	8b 01       	movw	r16, r22
  while ((status_ = spiRec()) == 0XFF) {
   30dde:	0f 94 41 53 	call	0x2a682	; 0x2a682 <spiRec() [clone .lto_priv.376]>
   30de2:	80 93 fe 16 	sts	0x16FE, r24	; 0x8016fe <card+0x271>
   30de6:	8f 3f       	cpi	r24, 0xFF	; 255
   30de8:	69 f4       	brne	.+26     	; 0x30e04 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x7a>
    if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) {
   30dea:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x54>
   30df8:	81 e1       	ldi	r24, 0x11	; 17
   30dfa:	80 93 fc 16 	sts	0x16FC, r24	; 0x8016fc <card+0x26f>
    goto fail;
  }
  return true;

 fail:
  chipSelectHigh();
   30dfe:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
   30e02:	e6 cf       	rjmp	.-52     	; 0x30dd0 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x46>
    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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x82>
   30e08:	8f e0       	ldi	r24, 0x0F	; 15
   30e0a:	f7 cf       	rjmp	.-18     	; 0x30dfa <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x70>
   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 <spiRec() [clone .lto_priv.376]>
   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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x88>
   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 <spiRec() [clone .lto_priv.376]>
   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 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.174]+0x98>
    spiRec();
  }

  chipSelectHigh();
   30e2a:	0f 94 b6 75 	call	0x2eb6c	; 0x2eb6c <Sd2Card::chipSelectHigh() [clone .constprop.359]>
  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 <spiSend(unsigned char) [clone .lto_priv.382]>
   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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]>:
}


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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0x30>
	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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0x3c>
   30e7a:	59 c0       	rjmp	.+178    	; 0x30f2e <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xee>
#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 <print_hex_byte(unsigned char)>
#endif
    print_hex_byte((val >> 8) & 0xFF);
   30e82:	8d 2d       	mov	r24, r13
   30e84:	0e 94 49 76 	call	0xec92	; 0xec92 <print_hex_byte(unsigned char)>
    print_hex_byte(val & 0xFF);
   30e88:	8c 2d       	mov	r24, r12
   30e8a:	0e 94 49 76 	call	0xec92	; 0xec92 <print_hex_byte(unsigned char)>
        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 <fputc>
		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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xd2>
   30ea6:	88 f1       	brcs	.+98     	; 0x30f0a <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xca>
   30ea8:	03 30       	cpi	r16, 0x03	; 3
   30eaa:	b9 f1       	breq	.+110    	; 0x30f1a <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xda>
            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 <fputc>
			print_hex_byte(data);
   30ec6:	89 81       	ldd	r24, Y+1	; 0x01
   30ec8:	0e 94 49 76 	call	0xec92	; 0xec92 <print_hex_byte(unsigned char)>
			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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xaa>
   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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xaa>
                manage_heater();
   30ee6:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
	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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xb8>
   30ef4:	11 11       	cpse	r17, r1
   30ef6:	d4 cf       	rjmp	.-88     	; 0x30ea0 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0x60>
            // 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 <fputc>
   30f08:	b3 cf       	rjmp	.-154    	; 0x30e70 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0x30>
		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 <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0x6c>
   30f12:	c6 01       	movw	r24, r12
   30f14:	0f 94 10 dc 	call	0x3b820	; 0x3b820 <eeprom_read_byte>
   30f18:	fa cf       	rjmp	.-12     	; 0x30f0e <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0xce>
			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 <xflash_rd_data>
   30f2c:	bf cf       	rjmp	.-130    	; 0x30eac <print_mem(unsigned long, unsigned long, dcode_mem_t, unsigned char) [clone .constprop.170]+0x6c>
            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 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>:
#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 <pat9125_y>
   30f5c:	90 91 8f 0e 	lds	r25, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   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 <PAT9125_sensor::resetStepCount() [clone .constprop.234]>
    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 <count_e(float, float, float, float) [clone .constprop.161]>:
//!
//! @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 <st_set_position(long const*) [clone .constprop.151]>:
	}
}

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 <st_set_position(long const*) [clone .constprop.151]+0xe>
  CRITICAL_SECTION_END;
   30fd4:	9f bf       	out	0x3f, r25	; 63
}
   30fd6:	08 95       	ret

00030fd8 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>:
#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 <custom_message_type>
};

const char *ProgressCodeToText(ProgressCode pc) {
    // @@TODO ?? a better fallback option?
    return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])))
        ? static_cast<const char *>(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 <lang_get_translation>
   30fea:	0c 94 16 f2 	jmp	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>

00030fee <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.148]>:

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::mmu2+0x56>
    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 <serialprintPGM(char const*)>
   30ffe:	83 e6       	ldi	r24, 0x63	; 99
   31000:	97 ea       	ldi	r25, 0xA7	; 167
   31002:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
   31006:	89 e5       	ldi	r24, 0x59	; 89
   31008:	97 ea       	ldi	r25, 0xA7	; 167
   3100a:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
    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 <MarlinSerial::println(int, int) [clone .constprop.325]>

00031018 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]>:
	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 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]+0xa>
   31022:	00 d0       	rcall	.+0      	; 0x31024 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]+0xc>
   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_rx(unsigned char, unsigned char, unsigned long*) [clone .lto_priv.384]>
		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 <tmc2130_rx(unsigned char, unsigned char, unsigned long*) [clone .lto_priv.384]>
//		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_wait_standstill_xy(int) [clone .constprop.139]+0x5e>
		tmc2130_check_overtemp();
   31068:	0f 94 c3 2a 	call	0x25586	; 0x25586 <tmc2130_check_overtemp()>
   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 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]+0x18>
   31072:	80 e0       	ldi	r24, 0x00	; 0
   31074:	09 c0       	rjmp	.+18     	; 0x31088 <tmc2130_wait_standstill_xy(int) [clone .constprop.139]+0x70>
		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_wait_standstill_xy(int) [clone .constprop.139]+0x50>
		tmc2130_check_overtemp();
   31082:	0f 94 c3 2a 	call	0x25586	; 0x25586 <tmc2130_check_overtemp()>
   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 <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.132]>:

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 <st_synchronize()>
    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 <MMU2::extruder_move(float, float)>
        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 <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.132]+0xe>
   310cc:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    // 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 <MMU2::Disable_E0()>

000310da <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>:
}

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 <printJobOngoing()>
   310de:	81 11       	cpse	r24, r1
   310e0:	04 c0       	rjmp	.+8      	; 0x310ea <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]+0x10>
        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 <lcd_setstatuspgm(char const*)>
    }
    custom_message_type = CustomMsg::Status;
   310ea:	10 92 c3 06 	sts	0x06C3, r1	; 0x8006c3 <custom_message_type>
}
   310ee:	08 95       	ret

000310f0 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>:
        EndReport(cip, ProgressCode::OK);
    }
};

bool MMU2::WaitForMMUReady() {
    switch (State()) {
   310f0:	80 91 b9 13 	lds	r24, 0x13B9	; 0x8013b9 <MMU2::mmu2+0x6f>
   310f4:	88 23       	and	r24, r24
   310f6:	11 f0       	breq	.+4      	; 0x310fc <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]+0xc>
        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_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]>:
	}
	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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x64>
	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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x46>
   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 <busy_state+0x1>
   31168:	90 91 c0 02 	lds	r25, 0x02C0	; 0x8002c0 <busy_state+0x2>
   3116c:	a0 91 c1 02 	lds	r26, 0x02C1	; 0x8002c1 <busy_state+0x3>
   31170:	b0 91 c2 02 	lds	r27, 0x02C2	; 0x8002c2 <busy_state+0x4>
   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 <busy_state+0x5>
   31180:	90 91 c4 02 	lds	r25, 0x02C4	; 0x8002c4 <busy_state+0x6>
   31184:	a0 91 c5 02 	lds	r26, 0x02C5	; 0x8002c5 <busy_state+0x7>
   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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
	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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0xc2>
			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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x190>
			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 <sin>
   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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x184>
		else if (dA == d1) b = 1; //delta == delta1 => bit=1
   31246:	80 17       	cp	r24, r16
   31248:	09 f4       	brne	.+2      	; 0x3124c <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x14c>
   3124a:	71 c0       	rjmp	.+226    	; 0x3132e <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x22e>
		else
		{
			if (dA < d0) // delta < delta0 => switch wbit down
   3124c:	8d 15       	cp	r24, r13
   3124e:	0c f0       	brlt	.+2      	; 0x31252 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x152>
   31250:	53 c0       	rjmp	.+166    	; 0x312f8 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x1f8>
			{
				//printf("dn\n");
				b = 0;
				switch (dA)
   31252:	88 23       	and	r24, r24
   31254:	e9 f1       	breq	.+122    	; 0x312d0 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x1d0>
   31256:	81 30       	cpi	r24, 0x01	; 1
   31258:	09 f4       	brne	.+2      	; 0x3125c <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x15c>
   3125a:	44 c0       	rjmp	.+136    	; 0x312e4 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x1e4>
   3125c:	8f 3f       	cpi	r24, 0xFF	; 255
   3125e:	09 f0       	breq	.+2      	; 0x31262 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x162>
   31260:	81 c0       	rjmp	.+258    	; 0x31364 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x264>
				{
				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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x18a>
   31288:	56 c0       	rjmp	.+172    	; 0x31336 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x236>
   3128a:	6c c0       	rjmp	.+216    	; 0x31364 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x264>
		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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0xae>
			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 <sin>
   312a8:	a3 01       	movw	r20, r6
   312aa:	92 01       	movw	r18, r4
   312ac:	0f 94 a8 e0 	call	0x3c150	; 0x3c150 <pow>
   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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x13c>
				//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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x172>
				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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x172>
				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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x264>
			{
				//printf("up\n");
				b = 1;
				switch (dA)
   312fc:	82 30       	cpi	r24, 0x02	; 2
   312fe:	09 f4       	brne	.+2      	; 0x31302 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x202>
   31300:	80 c0       	rjmp	.+256    	; 0x31402 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x302>
   31302:	83 30       	cpi	r24, 0x03	; 3
   31304:	09 f4       	brne	.+2      	; 0x31308 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x208>
   31306:	88 c0       	rjmp	.+272    	; 0x31418 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x318>
   31308:	81 30       	cpi	r24, 0x01	; 1
   3130a:	61 f5       	brne	.+88     	; 0x31364 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x264>
				{
				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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x264>
		//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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x23e>
   3133c:	78 c0       	rjmp	.+240    	; 0x3142e <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x32e>
			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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x242>
	//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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
		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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x18c>

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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x26e>
	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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x284>
   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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x2aa>
   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 <tmc2130_tx(unsigned char, unsigned char, unsigned long) [clone .lto_priv.387]>
				//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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x21e>
				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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x21e>
		//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 <tmc2130_set_wave(unsigned char, unsigned char, unsigned char) [clone .constprop.108]+0x258>

00031438 <retract(bool, bool) [clone .constprop.106]>:
{
  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 <retracted>
    // 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 <retract(bool, bool) [clone .constprop.106]+0x1a>
   31450:	9d c0       	rjmp	.+314    	; 0x3158c <retract(bool, bool) [clone .constprop.106]+0x154>
   31452:	91 11       	cpse	r25, r1
   31454:	92 c0       	rjmp	.+292    	; 0x3157a <retract(bool, bool) [clone .constprop.106]+0x142>
        st_synchronize();
   31456:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        set_destination_to_current();
   3145a:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
        current_position[E_AXIS]+=(swapretract?retract_length_swap:cs.retract_length)*float(extrudemultiply)*0.01f;
   3145e:	60 91 bc 02 	lds	r22, 0x02BC	; 0x8002bc <extrudemultiply>
   31462:	70 91 bd 02 	lds	r23, 0x02BD	; 0x8002bd <extrudemultiply+0x1>
   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 <cs+0x83>
   31476:	30 91 41 0e 	lds	r19, 0x0E41	; 0x800e41 <cs+0x84>
   3147a:	40 91 42 0e 	lds	r20, 0x0E42	; 0x800e42 <cs+0x85>
   3147e:	50 91 43 0e 	lds	r21, 0x0E43	; 0x800e43 <cs+0x86>
   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 <current_position+0xc>
   31496:	30 91 9e 06 	lds	r19, 0x069E	; 0x80069e <current_position+0xd>
   3149a:	40 91 9f 06 	lds	r20, 0x069F	; 0x80069f <current_position+0xe>
   3149e:	50 91 a0 06 	lds	r21, 0x06A0	; 0x8006a0 <current_position+0xf>
   314a2:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   314a6:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   314aa:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   314ae:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   314b2:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
        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 <plan_set_e_position(float const&)>
        float oldFeedrate = feedrate;
   314be:	c0 90 b8 02 	lds	r12, 0x02B8	; 0x8002b8 <feedrate>
   314c2:	d0 90 b9 02 	lds	r13, 0x02B9	; 0x8002b9 <feedrate+0x1>
   314c6:	e0 90 ba 02 	lds	r14, 0x02BA	; 0x8002ba <feedrate+0x2>
   314ca:	f0 90 bb 02 	lds	r15, 0x02BB	; 0x8002bb <feedrate+0x3>
        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 <cs+0x87>
   314da:	70 91 45 0e 	lds	r23, 0x0E45	; 0x800e45 <cs+0x88>
   314de:	80 91 46 0e 	lds	r24, 0x0E46	; 0x800e46 <cs+0x89>
   314e2:	90 91 47 0e 	lds	r25, 0x0E47	; 0x800e47 <cs+0x8a>
   314e6:	0f 94 dd d6 	call	0x3adba	; 0x3adba <__mulsf3>
   314ea:	60 93 b8 02 	sts	0x02B8, r22	; 0x8002b8 <feedrate>
   314ee:	70 93 b9 02 	sts	0x02B9, r23	; 0x8002b9 <feedrate+0x1>
   314f2:	80 93 ba 02 	sts	0x02BA, r24	; 0x8002ba <feedrate+0x2>
   314f6:	90 93 bb 02 	sts	0x02BB, r25	; 0x8002bb <feedrate+0x3>
        retracted[active_extruder]=true;
   314fa:	81 e0       	ldi	r24, 0x01	; 1
   314fc:	80 93 8d 06 	sts	0x068D, r24	; 0x80068d <retracted>
        prepare_move();
   31500:	90 e0       	ldi	r25, 0x00	; 0
   31502:	80 e0       	ldi	r24, 0x00	; 0
   31504:	0e 94 a0 6b 	call	0xd740	; 0xd740 <prepare_move(unsigned int)>
        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 <cs+0x8b>
   31512:	70 91 49 0e 	lds	r23, 0x0E49	; 0x800e49 <cs+0x8c>
   31516:	80 91 4a 0e 	lds	r24, 0x0E4A	; 0x800e4a <cs+0x8d>
   3151a:	90 91 4b 0e 	lds	r25, 0x0E4B	; 0x800e4b <cs+0x8e>
   3151e:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   31522:	88 23       	and	r24, r24
   31524:	11 f1       	breq	.+68     	; 0x3156a <retract(bool, bool) [clone .constprop.106]+0x132>
            st_synchronize();
   31526:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            current_position[Z_AXIS]-=cs.retract_zlift;
   3152a:	20 91 48 0e 	lds	r18, 0x0E48	; 0x800e48 <cs+0x8b>
   3152e:	30 91 49 0e 	lds	r19, 0x0E49	; 0x800e49 <cs+0x8c>
   31532:	40 91 4a 0e 	lds	r20, 0x0E4A	; 0x800e4a <cs+0x8d>
   31536:	50 91 4b 0e 	lds	r21, 0x0E4B	; 0x800e4b <cs+0x8e>
   3153a:	60 91 99 06 	lds	r22, 0x0699	; 0x800699 <current_position+0x8>
   3153e:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   31542:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   31546:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   3154a:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   3154e:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   31552:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   31556:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   3155a:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
            plan_set_position_curposXYZE();
   3155e:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
            prepare_move();
   31562:	90 e0       	ldi	r25, 0x00	; 0
   31564:	80 e0       	ldi	r24, 0x00	; 0
   31566:	0e 94 a0 6b 	call	0xd740	; 0xd740 <prepare_move(unsigned int)>
        }
        feedrate = oldFeedrate;
   3156a:	c0 92 b8 02 	sts	0x02B8, r12	; 0x8002b8 <feedrate>
   3156e:	d0 92 b9 02 	sts	0x02B9, r13	; 0x8002b9 <feedrate+0x1>
   31572:	e0 92 ba 02 	sts	0x02BA, r14	; 0x8002ba <feedrate+0x2>
   31576:	f0 92 bb 02 	sts	0x02BB, r15	; 0x8002bb <feedrate+0x3>
        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 <retract(bool, bool) [clone .constprop.106]+0x142>
        st_synchronize();
   31590:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        set_destination_to_current();
   31594:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
        float oldFeedrate = feedrate;
   31598:	80 90 b8 02 	lds	r8, 0x02B8	; 0x8002b8 <feedrate>
   3159c:	90 90 b9 02 	lds	r9, 0x02B9	; 0x8002b9 <feedrate+0x1>
   315a0:	a0 90 ba 02 	lds	r10, 0x02BA	; 0x8002ba <feedrate+0x2>
   315a4:	b0 90 bb 02 	lds	r11, 0x02BB	; 0x8002bb <feedrate+0x3>
        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 <cs+0x93>
   315b4:	70 91 51 0e 	lds	r23, 0x0E51	; 0x800e51 <cs+0x94>
   315b8:	80 91 52 0e 	lds	r24, 0x0E52	; 0x800e52 <cs+0x95>
   315bc:	90 91 53 0e 	lds	r25, 0x0E53	; 0x800e53 <cs+0x96>
   315c0:	0f 94 dd d6 	call	0x3adba	; 0x3adba <__mulsf3>
   315c4:	60 93 b8 02 	sts	0x02B8, r22	; 0x8002b8 <feedrate>
   315c8:	70 93 b9 02 	sts	0x02B9, r23	; 0x8002b9 <feedrate+0x1>
   315cc:	80 93 ba 02 	sts	0x02BA, r24	; 0x8002ba <feedrate+0x2>
   315d0:	90 93 bb 02 	sts	0x02BB, r25	; 0x8002bb <feedrate+0x3>
        if(cs.retract_zlift) {
   315d4:	c0 90 48 0e 	lds	r12, 0x0E48	; 0x800e48 <cs+0x8b>
   315d8:	d0 90 49 0e 	lds	r13, 0x0E49	; 0x800e49 <cs+0x8c>
   315dc:	e0 90 4a 0e 	lds	r14, 0x0E4A	; 0x800e4a <cs+0x8d>
   315e0:	f0 90 4b 0e 	lds	r15, 0x0E4B	; 0x800e4b <cs+0x8e>
   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 <retract(bool, bool) [clone .constprop.106]+0x1f6>
            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 <current_position+0x8>
   315fe:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   31602:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   31606:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   3160a:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   3160e:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   31612:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   31616:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   3161a:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
            plan_set_position_curposXYZE();
   3161e:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
            prepare_move();
   31622:	90 e0       	ldi	r25, 0x00	; 0
   31624:	80 e0       	ldi	r24, 0x00	; 0
   31626:	0e 94 a0 6b 	call	0xd740	; 0xd740 <prepare_move(unsigned int)>
            st_synchronize();
   3162a:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        }
        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 <cs+0x8f>
   31632:	30 91 4d 0e 	lds	r19, 0x0E4D	; 0x800e4d <cs+0x90>
   31636:	40 91 4e 0e 	lds	r20, 0x0E4E	; 0x800e4e <cs+0x91>
   3163a:	50 91 4f 0e 	lds	r21, 0x0E4F	; 0x800e4f <cs+0x92>
   3163e:	60 91 40 0e 	lds	r22, 0x0E40	; 0x800e40 <cs+0x83>
   31642:	70 91 41 0e 	lds	r23, 0x0E41	; 0x800e41 <cs+0x84>
   31646:	80 91 42 0e 	lds	r24, 0x0E42	; 0x800e42 <cs+0x85>
   3164a:	90 91 43 0e 	lds	r25, 0x0E43	; 0x800e43 <cs+0x86>
   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 <extrudemultiply>
   3165a:	70 91 bd 02 	lds	r23, 0x02BD	; 0x8002bd <extrudemultiply+0x1>
   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 <current_position+0xc>
   3168a:	70 91 9e 06 	lds	r23, 0x069E	; 0x80069e <current_position+0xd>
   3168e:	80 91 9f 06 	lds	r24, 0x069F	; 0x80069f <current_position+0xe>
   31692:	90 91 a0 06 	lds	r25, 0x06A0	; 0x8006a0 <current_position+0xf>
   31696:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   3169a:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   3169e:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   316a2:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   316a6:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>
        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 <plan_set_e_position(float const&)>
        retracted[active_extruder]=false;
   316b2:	10 92 8d 06 	sts	0x068D, r1	; 0x80068d <retracted>
        prepare_move();
   316b6:	90 e0       	ldi	r25, 0x00	; 0
   316b8:	80 e0       	ldi	r24, 0x00	; 0
   316ba:	0e 94 a0 6b 	call	0xd740	; 0xd740 <prepare_move(unsigned int)>
        feedrate = oldFeedrate;
   316be:	80 92 b8 02 	sts	0x02B8, r8	; 0x8002b8 <feedrate>
   316c2:	90 92 b9 02 	sts	0x02B9, r9	; 0x8002b9 <feedrate+0x1>
   316c6:	a0 92 ba 02 	sts	0x02BA, r10	; 0x8002ba <feedrate+0x2>
   316ca:	b0 92 bb 02 	sts	0x02BB, r11	; 0x8002bb <feedrate+0x3>
   316ce:	55 cf       	rjmp	.-342    	; 0x3157a <retract(bool, bool) [clone .constprop.106]+0x142>

000316d0 <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]>:
	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 <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x44>
   316e6:	c2 30       	cpi	r28, 0x02	; 2
   316e8:	c1 f0       	breq	.+48     	; 0x3171a <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x4a>
	{
	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_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x28>
        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 <tmc2130_set_dir(unsigned char, unsigned char)>
   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_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x52>
    {
		tmc2130_do_step(axis);
   31706:	8c 2f       	mov	r24, r28
   31708:	0f 94 79 24 	call	0x248f2	; 0x248f2 <tmc2130_do_step(unsigned char)>
   3170c:	c7 01       	movw	r24, r14
   3170e:	01 97       	sbiw	r24, 0x01	; 1
   31710:	f1 f7       	brne	.-4      	; 0x3170e <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x3e>
   31712:	f6 cf       	rjmp	.-20     	; 0x31700 <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x30>
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 <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x1a>
	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 <tmc2130_do_steps(unsigned char, unsigned int, unsigned char, unsigned int) [clone .constprop.104]+0x1c>
    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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]>:

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 <printf_P>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x68>
   31792:	76 95       	lsr	r23
   31794:	67 95       	ror	r22
   31796:	0a 94       	dec	r0
   31798:	e2 f7       	brpl	.-8      	; 0x31792 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x64>
   3179a:	06 17       	cp	r16, r22
   3179c:	17 07       	cpc	r17, r23
   3179e:	29 f0       	breq	.+10     	; 0x317aa <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x7c>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x5c>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x94>
   317be:	aa 0c       	add	r10, r10
   317c0:	bb 1c       	adc	r11, r11
   317c2:	8a 95       	dec	r24
   317c4:	e2 f7       	brpl	.-8      	; 0x317be <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x90>
	uint16_t mscnt = tmc2130_rd_MSCNT(axis);
   317c6:	8c 2f       	mov	r24, r28
   317c8:	0f 94 51 25 	call	0x24aa2	; 0x24aa2 <tmc2130_rd_MSCNT(unsigned char)>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0xb0>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0xb8>
   317e2:	36 95       	lsr	r19
   317e4:	27 95       	ror	r18
   317e6:	0a 94       	dec	r0
   317e8:	e2 f7       	brpl	.-8      	; 0x317e2 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0xb4>
   317ea:	86 01       	movw	r16, r12
   317ec:	02 1b       	sub	r16, r18
   317ee:	13 0b       	sbc	r17, r19
		if (steps > static_cast<int>(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<int>(cnt / 2))
   317f8:	20 17       	cp	r18, r16
   317fa:	31 07       	cpc	r19, r17
   317fc:	74 f1       	brlt	.+92     	; 0x3185a <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x12c>
	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<int>(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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0xe2>
		{
			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 <tmc2130_set_dir(unsigned char, unsigned char)>
	mscnt = tmc2130_rd_MSCNT(axis);
   31816:	8c 2f       	mov	r24, r28
   31818:	0f 94 51 25 	call	0x24aa2	; 0x24aa2 <tmc2130_rd_MSCNT(unsigned char)>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x13c>
   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 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x10e>
   31838:	96 95       	lsr	r25
   3183a:	87 95       	ror	r24
   3183c:	0a 94       	dec	r0
   3183e:	e2 f7       	brpl	.-8      	; 0x31838 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x10a>
   31840:	8c 15       	cp	r24, r12
   31842:	9d 05       	cpc	r25, r13
   31844:	91 f0       	breq	.+36     	; 0x3186a <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x13c>
	{
		tmc2130_do_step(axis);
   31846:	8c 2f       	mov	r24, r28
   31848:	0f 94 79 24 	call	0x248f2	; 0x248f2 <tmc2130_do_step(unsigned char)>
   3184c:	c4 01       	movw	r24, r8
   3184e:	01 97       	sbiw	r24, 0x01	; 1
   31850:	f1 f7       	brne	.-4      	; 0x3184e <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x120>
		delayMicroseconds(delay_us);
		mscnt = tmc2130_rd_MSCNT(axis);
   31852:	8c 2f       	mov	r24, r28
   31854:	0f 94 51 25 	call	0x24aa2	; 0x24aa2 <tmc2130_rd_MSCNT(unsigned char)>
   31858:	e7 cf       	rjmp	.-50     	; 0x31828 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0xfa>
	{
		dir = tmc2130_get_inv(axis)?0:1;
		int steps = (int)step - (int)(mscnt >> shift);
		if (steps > static_cast<int>(cnt / 2))
		{
			dir ^= 1;
   3185a:	91 11       	cpse	r25, r1
   3185c:	01 c0       	rjmp	.+2      	; 0x31860 <tmc2130_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0x132>
   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_goto_step(unsigned char, unsigned char, unsigned char, unsigned int, unsigned int) [clone .constprop.103]+0xd4>
	{
		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 <mesh_bed_leveling::reset() [clone .constprop.100]>:
#ifdef MESH_BED_LEVELING

mesh_bed_leveling mbl;

void mesh_bed_leveling::reset() {
    active = 0;
   31882:	10 92 c1 13 	sts	0x13C1, r1	; 0x8013c1 <mbl>
    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 <mesh_bed_leveling::reset() [clone .constprop.100]+0xc>
}
   31894:	08 95       	ret

00031896 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>:
      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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x26>
   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 <bedPWMDisabled>
#ifdef TMC2130
    bool bHighPowerForced = false;
	if (tmc2130_mode == TMC2130_MODE_SILENT)
   318ce:	80 91 8b 06 	lds	r24, 0x068B	; 0x80068b <tmc2130_mode>
        )
{
	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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x48>
    {
        FORCE_HIGH_POWER_START;
   318d8:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
        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 <enable_z_endstop(bool)>
   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 <endstop_z_hit_on_purpose()>

    // move down until you find the bed
    current_position[Z_AXIS] = minimum_z;
   318f6:	80 92 99 06 	sts	0x0699, r8	; 0x800699 <current_position+0x8>
   318fa:	90 92 9a 06 	sts	0x069A, r9	; 0x80069a <current_position+0x9>
   318fe:	a0 92 9b 06 	sts	0x069B, r10	; 0x80069b <current_position+0xa>
   31902:	b0 92 9c 06 	sts	0x069C, r11	; 0x80069c <current_position+0xb>
    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 <go_to_current(float) [clone .lto_priv.388]>
    // 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 <update_current_position_z() [clone .lto_priv.389]>
    if (! endstop_z_hit_on_purpose())
   31916:	0f 94 b1 4e 	call	0x29d62	; 0x29d62 <endstop_z_hit_on_purpose()>
   3191a:	8c 83       	std	Y+4, r24	; 0x04
   3191c:	88 23       	and	r24, r24
   3191e:	09 f4       	brne	.+2      	; 0x31922 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x8c>
   31920:	f9 c0       	rjmp	.+498    	; 0x31b14 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x27e>
	{
		//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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x27e>
	{
		//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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0xa6>
   3193a:	a8 c0       	rjmp	.+336    	; 0x31a8c <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x1f6>
	{

		current_position[Z_AXIS] += high_deviation_occured ? 0.5 : 0.2;
   3193c:	60 91 99 06 	lds	r22, 0x0699	; 0x800699 <current_position+0x8>
   31940:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   31944:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   31948:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0xca>
   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 <current_position+0x8>
   3196c:	50 92 9a 06 	sts	0x069A, r5	; 0x80069a <current_position+0x9>
   31970:	60 92 9b 06 	sts	0x069B, r6	; 0x80069b <current_position+0xa>
   31974:	70 92 9c 06 	sts	0x069C, r7	; 0x80069c <current_position+0xb>
		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 <go_to_current(float) [clone .lto_priv.388]>
		// Move back down slowly to find bed.
        current_position[Z_AXIS] = minimum_z;
   31984:	80 92 99 06 	sts	0x0699, r8	; 0x800699 <current_position+0x8>
   31988:	90 92 9a 06 	sts	0x069A, r9	; 0x80069a <current_position+0x9>
   3198c:	a0 92 9b 06 	sts	0x069B, r10	; 0x80069b <current_position+0xa>
   31990:	b0 92 9c 06 	sts	0x069C, r11	; 0x80069c <current_position+0xb>
		//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 <go_to_current(float) [clone .lto_priv.388]>
        // 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 <update_current_position_z() [clone .lto_priv.389]>
		//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 <current_position+0x8>
   319ac:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   319b0:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   319b4:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x164>
			//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 <raise_z(float)>
			current_position[Z_AXIS] = minimum_z;
   319da:	80 92 99 06 	sts	0x0699, r8	; 0x800699 <current_position+0x8>
   319de:	90 92 9a 06 	sts	0x069A, r9	; 0x80069a <current_position+0x9>
   319e2:	a0 92 9b 06 	sts	0x069B, r10	; 0x80069b <current_position+0xa>
   319e6:	b0 92 9c 06 	sts	0x069C, r11	; 0x80069c <current_position+0xb>
            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 <go_to_current(float) [clone .lto_priv.388]>
            // 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 <update_current_position_z() [clone .lto_priv.389]>
		}



		if (!endstop_z_hit_on_purpose())
   319fa:	0f 94 b1 4e 	call	0x29d62	; 0x29d62 <endstop_z_hit_on_purpose()>
   319fe:	28 2e       	mov	r2, r24
   31a00:	88 23       	and	r24, r24
   31a02:	09 f4       	brne	.+2      	; 0x31a06 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x170>
   31a04:	87 c0       	rjmp	.+270    	; 0x31b14 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x27e>
		{
			//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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x27e>
   31a0e:	40 90 99 06 	lds	r4, 0x0699	; 0x800699 <current_position+0x8>
   31a12:	50 90 9a 06 	lds	r5, 0x069A	; 0x80069a <current_position+0x9>
   31a16:	60 90 9b 06 	lds	r6, 0x069B	; 0x80069b <current_position+0xa>
   31a1a:	70 90 9c 06 	lds	r7, 0x069C	; 0x80069c <current_position+0xb>
		}
#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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x1c4>
   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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x1dc>
#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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x9e>
		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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x27e>
				//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 <delay_keep_alive(unsigned int)>
				//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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x1d4>
			}
		}
		//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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x254>
				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 <current_position+0x8>
   31a94:	d0 92 9a 06 	sts	0x069A, r13	; 0x80069a <current_position+0x9>
   31a98:	e0 92 9b 06 	sts	0x069B, r14	; 0x80069b <current_position+0xa>
   31a9c:	f0 92 9c 06 	sts	0x069C, r15	; 0x80069c <current_position+0xb>
   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 <enable_z_endstop(bool)>
//    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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x220>
   31ab0:	80 e0       	ldi	r24, 0x00	; 0
   31ab2:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
#endif
    bedPWMDisabled = 0;
   31ab6:	10 92 8c 06 	sts	0x068C, r1	; 0x80068c <bedPWMDisabled>
#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 <current_position+0x8>
   31b06:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   31b0a:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   31b0e:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
   31b12:	c6 cf       	rjmp	.-116    	; 0x31aa0 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x20a>
   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 <enable_z_endstop(bool)>
#ifdef TMC2130
	if (bHighPowerForced) FORCE_HIGH_POWER_END;
   31b20:	11 23       	and	r17, r17
   31b22:	19 f0       	breq	.+6      	; 0x31b2a <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x294>
   31b24:	80 e0       	ldi	r24, 0x00	; 0
   31b26:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
#endif
    bedPWMDisabled = 0;
   31b2a:	10 92 8c 06 	sts	0x068C, r1	; 0x80068c <bedPWMDisabled>
	return false;
   31b2e:	1c 82       	std	Y+4, r1	; 0x04
   31b30:	c4 cf       	rjmp	.-120    	; 0x31aba <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]+0x224>

00031b32 <gcode_M45(bool, signed char) [clone .constprop.76]>:
//! @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 <force_high_power_mode(bool)>
	#endif // TMC2130

    FORCE_BL_ON_START;
   31b70:	81 e0       	ldi	r24, 0x01	; 1
   31b72:	0e 94 e9 89 	call	0x113d2	; 0x113d2 <force_bl_on(bool)>

    // Only Z calibration?
	if (!onlyZ)
   31b76:	11 11       	cpse	r17, r1
   31b78:	04 c0       	rjmp	.+8      	; 0x31b82 <gcode_M45(bool, signed char) [clone .constprop.76]+0x50>
	{
		disable_heater();
   31b7a:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
		eeprom_adjust_bed_reset(); //reset bed level correction
   31b7e:	0e 94 30 76 	call	0xec60	; 0xec60 <eeprom_adjust_bed_reset()>
	}

	// 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 <lcd_update_enable(unsigned char)>
	// Let the planner use the uncorrected coordinates.
	mbl.reset();
   31b88:	0f 94 41 8c 	call	0x31882	; 0x31882 <mesh_bed_leveling::reset() [clone .constprop.100]>
	// 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 <world2machine_revert_to_uncorrected()>
      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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x6e>

	// 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 <setup_for_endstop_move(bool) [clone .lto_priv.392]>
   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 <lang_get_translation>
   31bc0:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
  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 <raise_z_above(float)>
}

/**/
void home_xy()
{
    set_destination_to_current();
   31bd0:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
    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(unsigned char, unsigned char, unsigned char*)>
    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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
    plan_set_position_curposXYZE();
   31bec:	0f 94 fd be 	call	0x37dfa	; 0x37dfa <plan_set_position_curposXYZE()>
    endstops_hit_on_purpose();
   31bf0:	0f 94 bf 4e 	call	0x29d7e	; 0x29d7e <endstops_hit_on_purpose()>
   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 <current_position>
   31c04:	70 91 92 06 	lds	r23, 0x0692	; 0x800692 <current_position+0x1>
   31c08:	80 91 93 06 	lds	r24, 0x0693	; 0x800693 <current_position+0x2>
   31c0c:	90 91 94 06 	lds	r25, 0x0694	; 0x800694 <current_position+0x3>
   31c10:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   31c14:	60 93 91 06 	sts	0x0691, r22	; 0x800691 <current_position>
   31c18:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   31c1c:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   31c20:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
	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 <current_position+0x4>
   31c30:	70 91 96 06 	lds	r23, 0x0696	; 0x800696 <current_position+0x5>
   31c34:	80 91 97 06 	lds	r24, 0x0697	; 0x800697 <current_position+0x6>
   31c38:	90 91 98 06 	lds	r25, 0x0698	; 0x800698 <current_position+0x7>
   31c3c:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   31c40:	60 93 95 06 	sts	0x0695, r22	; 0x800695 <current_position+0x4>
   31c44:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
   31c48:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
   31c4c:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>
	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 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   31c5c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

	// 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 <calibrate_z_auto()>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x144>
//! @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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xa2c>
	{
#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 <lang_get_translation>
   31c7e:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
		if(onlyZ){
   31c82:	11 23       	and	r17, r17
   31c84:	09 f4       	brne	.+2      	; 0x31c88 <gcode_M45(bool, signed char) [clone .constprop.76]+0x156>
   31c86:	46 c4       	rjmp	.+2188   	; 0x32514 <gcode_M45(bool, signed char) [clone .constprop.76]+0x9e2>
			prompt_steel_sheet_on_bed(true);
   31c88:	81 e0       	ldi	r24, 0x01	; 1
   31c8a:	0f 94 75 0d 	call	0x21aea	; 0x21aea <prompt_steel_sheet_on_bed(bool)>
			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 <lang_get_translation>
   31c96:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
			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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		}

		refresh_cmd_timeout();
   31ca6:	0e 94 5b 66 	call	0xccb6	; 0xccb6 <refresh_cmd_timeout()>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1b2>
		{
			KEEPALIVE_STATE(PAUSED_FOR_USER);
   31cae:	84 e0       	ldi	r24, 0x04	; 4
   31cb0:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
			prompt_steel_sheet_on_bed(false);
   31cb4:	80 e0       	ldi	r24, 0x00	; 0
   31cb6:	0f 94 75 0d 	call	0x21aea	; 0x21aea <prompt_steel_sheet_on_bed(bool)>
			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 <lang_get_translation>
   31cc2:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
			KEEPALIVE_STATE(IN_HANDLER);
   31cc6:	82 e0       	ldi	r24, 0x02	; 2
   31cc8:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
			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 <lang_get_translation>
   31cd4:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
			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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  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 <raise_z(float)>

		// 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 <current_position+0x8>
   31d08:	d0 92 9a 06 	sts	0x069A, r13	; 0x80069a <current_position+0x9>
   31d0c:	e0 92 9b 06 	sts	0x069B, r14	; 0x80069b <current_position+0xa>
   31d10:	f0 92 9c 06 	sts	0x069C, r15	; 0x80069c <current_position+0xb>
   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 <tmc2130_home_enter(unsigned char)>
#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 <plan_buffer_line_curposXYZE(float)>

		st_synchronize();
   31d2c:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
#ifdef TMC2130
		tmc2130_home_exit();
   31d30:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
   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 <st_get_position_mm(unsigned char)>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x21e>
   31d4e:	eb c3       	rjmp	.+2006   	; 0x32526 <gcode_M45(bool, signed char) [clone .constprop.76]+0x9f4>
		    (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 <st_get_position_mm(unsigned char)>
#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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x9f4>
		    (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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x9fe>
				}
			}
			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 <calibration_status_clear(unsigned char)>
				eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_byte>
   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 <eeprom_update_word>
}

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 <refresh_cmd_timeout()>
    // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x266>
	{
#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 <serialprintPGM(char const*)>
		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 <MarlinSerial::println(int, int) [clone .constprop.325]>
			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 <lang_get_translation>
   31db6:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
#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 <current_position+0x8>
   31dbe:	d0 92 9a 06 	sts	0x069A, r13	; 0x80069a <current_position+0x9>
   31dc2:	e0 92 9b 06 	sts	0x069B, r14	; 0x80069b <current_position+0xa>
   31dc6:	f0 92 9c 06 	sts	0x069C, r15	; 0x80069c <current_position+0xb>
   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 <refresh_cmd_timeout()>
#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_set_cursor(unsigned char, unsigned char)>
		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 <lcd_printf_P(char const*, ...)>
		}
#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 <go_to_current(float) [clone .lto_priv.388]>
			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 <current_position>
   31e4e:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   31e52:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   31e56:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
			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 <current_position+0x4>
   31e70:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   31e74:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   31e78:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
			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 <go_to_current(float) [clone .lto_priv.388]>
	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 <printf_P>
	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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	// disable heaters and stop motion before we initialize sm4
	disable_heater();
   31ea0:	0f 94 f4 2f 	call	0x25fe8	; 0x25fe8 <disable_heater()>
	st_synchronize();
   31ea4:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>

	// 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 <sm4_stop_cb+0x1>
   31ecc:	10 92 87 06 	sts	0x0687, r1	; 0x800687 <sm4_stop_cb>
	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 <sm4_update_pos_cb+0x1>
   31ed8:	80 93 85 06 	sts	0x0685, r24	; 0x800685 <sm4_update_pos_cb>
	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 <sm4_calc_delay_cb+0x1>
   31ee4:	a0 93 83 06 	sts	0x0683, r26	; 0x800683 <sm4_calc_delay_cb>
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 <count_position+0x8>
   31eec:	10 91 bb 06 	lds	r17, 0x06BB	; 0x8006bb <count_position+0x9>
   31ef0:	20 91 bc 06 	lds	r18, 0x06BC	; 0x8006bc <count_position+0xa>
   31ef4:	30 91 bd 06 	lds	r19, 0x06BD	; 0x8006bd <count_position+0xb>
   31ef8:	40 91 b6 06 	lds	r20, 0x06B6	; 0x8006b6 <count_position+0x4>
   31efc:	50 91 b7 06 	lds	r21, 0x06B7	; 0x8006b7 <count_position+0x5>
   31f00:	60 91 b8 06 	lds	r22, 0x06B8	; 0x8006b8 <count_position+0x6>
   31f04:	70 91 b9 06 	lds	r23, 0x06B9	; 0x8006b9 <count_position+0x7>
   31f08:	80 91 b2 06 	lds	r24, 0x06B2	; 0x8006b2 <count_position>
   31f0c:	90 91 b3 06 	lds	r25, 0x06B3	; 0x8006b3 <count_position+0x1>
   31f10:	a0 91 b4 06 	lds	r26, 0x06B4	; 0x8006b4 <count_position+0x2>
   31f14:	b0 91 b5 06 	lds	r27, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <printf_P>
	int16_t x0 = _X;
   31f3c:	40 90 b2 06 	lds	r4, 0x06B2	; 0x8006b2 <count_position>
   31f40:	50 90 b3 06 	lds	r5, 0x06B3	; 0x8006b3 <count_position+0x1>
   31f44:	60 90 b4 06 	lds	r6, 0x06B4	; 0x8006b4 <count_position+0x2>
   31f48:	70 90 b5 06 	lds	r7, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <count_position+0x4>
   31f54:	90 91 b7 06 	lds	r25, 0x06B7	; 0x8006b7 <count_position+0x5>
   31f58:	a0 91 b8 06 	lds	r26, 0x06B8	; 0x8006b8 <count_position+0x6>
   31f5c:	b0 91 b9 06 	lds	r27, 0x06B9	; 0x8006b9 <count_position+0x7>
   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 <count_position+0x8>
   31f7c:	d0 90 bb 06 	lds	r13, 0x06BB	; 0x8006bb <count_position+0x9>
   31f80:	e0 90 bc 06 	lds	r14, 0x06BC	; 0x8006bc <count_position+0xa>
   31f84:	f0 90 bd 06 	lds	r15, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x46c>
   31f9c:	40 c3       	rjmp	.+1664   	; 0x3261e <gcode_M45(bool, signed char) [clone .constprop.76]+0xaec>
}

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 <printf_P>
	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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x4b0>
   31fe0:	e9 c2       	rjmp	.+1490   	; 0x325b4 <gcode_M45(bool, signed char) [clone .constprop.76]+0xa82>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x4be>
   31fec:	0d 94 e4 9e 	jmp	0x33dc8	; 0x33dc8 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2296>
		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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]>
   32012:	88 23       	and	r24, r24
   32014:	11 f4       	brne	.+4      	; 0x3201a <gcode_M45(bool, signed char) [clone .constprop.76]+0x4e8>
   32016:	0d 94 e4 9e 	jmp	0x33dc8	; 0x33dc8 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2296>
			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 <count_position+0x8>
   32026:	d0 90 bb 06 	lds	r13, 0x06BB	; 0x8006bb <count_position+0x9>
   3202a:	e0 90 bc 06 	lds	r14, 0x06BC	; 0x8006bc <count_position+0xa>
   3202e:	f0 90 bd 06 	lds	r15, 0x06BD	; 0x8006bd <count_position+0xb>
   32032:	00 91 b6 06 	lds	r16, 0x06B6	; 0x8006b6 <count_position+0x4>
   32036:	10 91 b7 06 	lds	r17, 0x06B7	; 0x8006b7 <count_position+0x5>
   3203a:	20 91 b8 06 	lds	r18, 0x06B8	; 0x8006b8 <count_position+0x6>
   3203e:	30 91 b9 06 	lds	r19, 0x06B9	; 0x8006b9 <count_position+0x7>
   32042:	40 91 b2 06 	lds	r20, 0x06B2	; 0x8006b2 <count_position>
   32046:	50 91 b3 06 	lds	r21, 0x06B3	; 0x8006b3 <count_position+0x1>
   3204a:	60 91 b4 06 	lds	r22, 0x06B4	; 0x8006b4 <count_position+0x2>
   3204e:	70 91 b5 06 	lds	r23, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <printf_P>

			/// 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 <count_position+0x8>
   32072:	50 91 bb 06 	lds	r21, 0x06BB	; 0x8006bb <count_position+0x9>
   32076:	60 91 bc 06 	lds	r22, 0x06BC	; 0x8006bc <count_position+0xa>
   3207a:	70 91 bd 06 	lds	r23, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
/// 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 <count_position>
   3209e:	30 91 b3 06 	lds	r19, 0x06B3	; 0x8006b3 <count_position+0x1>
   320a2:	40 91 b4 06 	lds	r20, 0x06B4	; 0x8006b4 <count_position+0x2>
   320a6:	50 91 b5 06 	lds	r21, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <count_position+0x4>
   320ba:	90 91 b7 06 	lds	r25, 0x06B7	; 0x8006b7 <count_position+0x5>
   320be:	a0 91 b8 06 	lds	r26, 0x06B8	; 0x8006b8 <count_position+0x6>
   320c2:	b0 91 b9 06 	lds	r27, 0x06B9	; 0x8006b9 <count_position+0x7>
   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 <count_position+0x8>
   320d6:	30 91 bb 06 	lds	r19, 0x06BB	; 0x8006bb <count_position+0x9>
   320da:	40 91 bc 06 	lds	r20, 0x06BC	; 0x8006bc <count_position+0xa>
   320de:	50 91 bd 06 	lds	r21, 0x06BD	; 0x8006bd <count_position+0xb>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x5ce>
		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 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.80]>
   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 <printf_P>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x636>
			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 <printf_P>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x630>
		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 <printf_P>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf6a>
			++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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x68a>
			++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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x6ce>
		&& mins > threshold_extreme
   321d8:	43 33       	cpi	r20, 0x33	; 51
   321da:	51 05       	cpc	r21, r1
   321dc:	8c f0       	brlt	.+34     	; 0x32200 <gcode_M45(bool, signed char) [clone .constprop.76]+0x6ce>
		&& maxs > threshold_extreme
   321de:	83 33       	cpi	r24, 0x33	; 51
   321e0:	91 05       	cpc	r25, r1
   321e2:	74 f0       	brlt	.+28     	; 0x32200 <gcode_M45(bool, signed char) [clone .constprop.76]+0x6ce>
			++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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x6ce>
	}

	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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x6ce>
   321fe:	3f c2       	rjmp	.+1150   	; 0x3267e <gcode_M45(bool, signed char) [clone .constprop.76]+0xb4c>
}

/// 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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]>
   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 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.90]>

	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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x726>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x72c>
   3225c:	24 c4       	rjmp	.+2120   	; 0x32aa6 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf74>
		/// 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 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.92]>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x816>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x816>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x884>
			//@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 <printf_P>
			/// 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 <printf_P>
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 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x9c8>
   32512:	b5 c0       	rjmp	.+362    	; 0x3267e <gcode_M45(bool, signed char) [clone .constprop.76]+0xb4c>
			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 <lang_get_translation>
   3251c:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
			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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x16c>
				}
			}
		}
		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 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   3252e:	9f cb       	rjmp	.-2242   	; 0x31c6e <gcode_M45(bool, signed char) [clone .constprop.76]+0x13c>
		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 <clean_up_after_endstop_move(int) [clone .lto_priv.393]>
				// Z only calibration.
				// Load the machine correction matrix
				world2machine_initialize();
   32540:	0f 94 8f ce 	call	0x39d1e	; 0x39d1e <world2machine_initialize()>
				// and correct the current_position to match the transformed coordinate system.
				world2machine_update_current();
   32544:	0f 94 2d cc 	call	0x3985a	; 0x3985a <world2machine_update_current()>
				//FIXME
				bool result = sample_mesh_and_store_reference();
   32548:	0f 94 3c ca 	call	0x39478	; 0x39478 <sample_mesh_and_store_reference()>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xa26>
   32556:	8b cb       	rjmp	.-2282   	; 0x31c6e <gcode_M45(bool, signed char) [clone .constprop.76]+0x13c>
				{
					calibration_status_set(CALIBRATION_STATUS_Z);
   32558:	84 e0       	ldi	r24, 0x04	; 4
   3255a:	0e 94 4b ef 	call	0x1de96	; 0x1de96 <calibration_status_set(unsigned char)>
	}
	else
	{
		// Timeouted.
	}
	lcd_update_enable(true);
   3255e:	81 e0       	ldi	r24, 0x01	; 1
   32560:	0e 94 bd 6e 	call	0xdd7a	; 0xdd7a <lcd_update_enable(unsigned char)>
#ifdef TMC2130
	FORCE_HIGH_POWER_END;
   32564:	80 e0       	ldi	r24, 0x00	; 0
   32566:	0e 94 48 66 	call	0xcc90	; 0xcc90 <force_high_power_mode(bool)>
#endif // TMC2130

    FORCE_BL_ON_END;
   3256a:	80 e0       	ldi	r24, 0x00	; 0
   3256c:	0e 94 e9 89 	call	0x113d2	; 0x113d2 <force_bl_on(bool)>

	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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2a0>
	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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]>
			ad += 0;
	if (!ret && (ad < 1440))
   325d0:	88 23       	and	r24, r24
   325d2:	09 f4       	brne	.+2      	; 0x325d6 <gcode_M45(bool, signed char) [clone .constprop.76]+0xaa4>
   325d4:	06 cd       	rjmp	.-1524   	; 0x31fe2 <gcode_M45(bool, signed char) [clone .constprop.76]+0x4b0>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x4f0>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xae2>
		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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]>
   32606:	88 23       	and	r24, r24
   32608:	29 f0       	breq	.+10     	; 0x32614 <gcode_M45(bool, signed char) [clone .constprop.76]+0xae2>
			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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x4f0>
			/// 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x460>
	}
	//@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 <count_position+0x8>
   32622:	10 91 bb 06 	lds	r17, 0x06BB	; 0x8006bb <count_position+0x9>
   32626:	20 91 bc 06 	lds	r18, 0x06BC	; 0x8006bc <count_position+0xa>
   3262a:	30 91 bd 06 	lds	r19, 0x06BD	; 0x8006bd <count_position+0xb>
   3262e:	40 91 b6 06 	lds	r20, 0x06B6	; 0x8006b6 <count_position+0x4>
   32632:	50 91 b7 06 	lds	r21, 0x06B7	; 0x8006b7 <count_position+0x5>
   32636:	60 91 b8 06 	lds	r22, 0x06B8	; 0x8006b8 <count_position+0x6>
   3263a:	70 91 b9 06 	lds	r23, 0x06B9	; 0x8006b9 <count_position+0x7>
   3263e:	80 91 b2 06 	lds	r24, 0x06B2	; 0x8006b2 <count_position>
   32642:	90 91 b3 06 	lds	r25, 0x06B3	; 0x8006b3 <count_position+0x1>
   32646:	a0 91 b4 06 	lds	r26, 0x06B4	; 0x8006b4 <count_position+0x2>
   3264a:	b0 91 b5 06 	lds	r27, 0x06B5	; 0x8006b5 <count_position+0x3>
   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 <printf_P>
   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 <printf_P>
	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_set_cursor(unsigned char, unsigned char)>
	lcd_space(16);
   32692:	80 e1       	ldi	r24, 0x10	; 16
   32694:	0e 94 6e 6e 	call	0xdcdc	; 0xdcdc <lcd_space(unsigned char)>

	// resync planner position from counters (changed by xyzcal_update_pos)
	planner_reset_position();
   32698:	0f 94 70 c0 	call	0x380e0	; 0x380e0 <planner_reset_position()>
				: "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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xb9c>
   326cc:	ee c1       	rjmp	.+988    	; 0x32aaa <gcode_M45(bool, signed char) [clone .constprop.76]+0xf78>
   326ce:	1f 3f       	cpi	r17, 0xFF	; 255
   326d0:	11 f4       	brne	.+4      	; 0x326d6 <gcode_M45(bool, signed char) [clone .constprop.76]+0xba4>
   326d2:	0d 94 a0 9e 	jmp	0x33d40	; 0x33d40 <gcode_M45(bool, signed char) [clone .constprop.76]+0x220e>
				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 <current_position>
   326f4:	30 91 92 06 	lds	r19, 0x0692	; 0x800692 <current_position+0x1>
   326f8:	40 91 93 06 	lds	r20, 0x0693	; 0x800693 <current_position+0x2>
   326fc:	50 91 94 06 	lds	r21, 0x0694	; 0x800694 <current_position+0x3>
   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 <current_position+0x4>
   3271c:	d0 90 96 06 	lds	r13, 0x0696	; 0x800696 <current_position+0x5>
   32720:	e0 90 97 06 	lds	r14, 0x0697	; 0x800697 <current_position+0x6>
   32724:	f0 90 98 06 	lds	r15, 0x0698	; 0x800698 <current_position+0x7>
				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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xc50>
				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 <current_position+0x4>
   32776:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   3277a:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   3277e:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
			// 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 <current_position+0x8>
   3278e:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   32792:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   32796:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   3279a:	0f 94 38 dd 	call	0x3ba70	; 0x3ba70 <__addsf3>
   3279e:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   327a2:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   327a6:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   327aa:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xcae>
   327de:	16 cb       	rjmp	.-2516   	; 0x31e0c <gcode_M45(bool, signed char) [clone .constprop.76]+0x2da>
				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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xcc4>
	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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xcc4>
   327f4:	da ce       	rjmp	.-588    	; 0x325aa <gcode_M45(bool, signed char) [clone .constprop.76]+0xa78>
			#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 <printf_P>
        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 <delay_keep_alive(unsigned int)>
				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 <mbl+0x5>
   3281a:	70 91 c7 13 	lds	r23, 0x13C7	; 0x8013c7 <mbl+0x6>
   3281e:	80 91 c8 13 	lds	r24, 0x13C8	; 0x8013c8 <mbl+0x7>
   32822:	90 91 c9 13 	lds	r25, 0x13C9	; 0x8013c9 <mbl+0x8>
   32826:	0f 94 2d de 	call	0x3bc5a	; 0x3bc5a <__cmpsf2>
   3282a:	87 ff       	sbrs	r24, 7
   3282c:	45 c1       	rjmp	.+650    	; 0x32ab8 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf86>
			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 <serialprintlnPGM(char const*)>
				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 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   3283e:	60 91 c6 13 	lds	r22, 0x13C6	; 0x8013c6 <mbl+0x5>
   32842:	70 91 c7 13 	lds	r23, 0x13C7	; 0x8013c7 <mbl+0x6>
   32846:	80 91 c8 13 	lds	r24, 0x13C8	; 0x8013c8 <mbl+0x7>
   3284a:	90 91 c9 13 	lds	r25, 0x13C9	; 0x8013c9 <mbl+0x8>
   3284e:	42 e0       	ldi	r20, 0x02	; 2
   32850:	0f 94 7b d5 	call	0x3aaf6	; 0x3aaf6 <MarlinSerial::printFloat(double, unsigned char)>
				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 <serialprintPGM(char const*)>
				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 <MarlinSerial::println(double, int) [clone .constprop.367]>
				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 <mbl+0x31>
   32874:	10 92 f3 13 	sts	0x13F3, r1	; 0x8013f3 <mbl+0x32>
   32878:	10 92 f4 13 	sts	0x13F4, r1	; 0x8013f4 <mbl+0x33>
   3287c:	10 92 f5 13 	sts	0x13F5, r1	; 0x8013f5 <mbl+0x34>
    cntr[1] = 0.f;
   32880:	10 92 f6 13 	sts	0x13F6, r1	; 0x8013f6 <mbl+0x35>
   32884:	10 92 f7 13 	sts	0x13F7, r1	; 0x8013f7 <mbl+0x36>
   32888:	10 92 f8 13 	sts	0x13F8, r1	; 0x8013f8 <mbl+0x37>
   3288c:	10 92 f9 13 	sts	0x13F9, r1	; 0x8013f9 <mbl+0x38>
   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 <cos>
   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 <sin>
   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 <cos>
   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 <sin>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xe1e>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xe2e>
        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 <delay_keep_alive(unsigned int)>
                    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 <mbl+0x31>
   32972:	30 91 f3 13 	lds	r19, 0x13F3	; 0x8013f3 <mbl+0x32>
   32976:	40 91 f4 13 	lds	r20, 0x13F4	; 0x8013f4 <mbl+0x33>
   3297a:	50 91 f5 13 	lds	r21, 0x13F5	; 0x8013f5 <mbl+0x34>
   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 <mbl+0x35>
   32992:	90 91 f7 13 	lds	r25, 0x13F7	; 0x8013f7 <mbl+0x36>
   32996:	a0 91 f8 13 	lds	r26, 0x13F8	; 0x8013f8 <mbl+0x37>
   3299a:	b0 91 f9 13 	lds	r27, 0x13F9	; 0x8013f9 <mbl+0x38>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf22>
   32a50:	0d 94 54 9f 	jmp	0x33ea8	; 0x33ea8 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2376>
   32a54:	11 30       	cpi	r17, 0x01	; 1
   32a56:	11 f4       	brne	.+4      	; 0x32a5c <gcode_M45(bool, signed char) [clone .constprop.76]+0xf2a>
   32a58:	0d 94 06 9f 	jmp	0x33e0c	; 0x33e0c <gcode_M45(bool, signed char) [clone .constprop.76]+0x22da>
                        float a =
                             (r == 0) ? 1.f :
   32a5c:	00 23       	and	r16, r16
   32a5e:	11 f4       	brne	.+4      	; 0x32a64 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf32>
   32a60:	0d 94 46 9f 	jmp	0x33e8c	; 0x33e8c <gcode_M45(bool, signed char) [clone .constprop.76]+0x235a>
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
   32a64:	02 30       	cpi	r16, 0x02	; 2
   32a66:	61 f5       	brne	.+88     	; 0x32ac0 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf8e>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xfaa>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xfd4>
	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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf70>
   32aa0:	92 cb       	rjmp	.-2268   	; 0x321c6 <gcode_M45(bool, signed char) [clone .constprop.76]+0x694>
			++maxs;
   32aa2:	01 96       	adiw	r24, 0x01	; 1
   32aa4:	90 cb       	rjmp	.-2272   	; 0x321c6 <gcode_M45(bool, signed char) [clone .constprop.76]+0x694>
/// 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x9c4>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xba4>
				// Reset the baby step value and the baby step applied flag.
				calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
				eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xd3e>
                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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf54>
                                        (-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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xfb2>
   32ae0:	0d 94 47 9e 	jmp	0x33c8e	; 0x33c8e <gcode_M45(bool, signed char) [clone .constprop.76]+0x215c>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x238a>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xf1a>
                                        (-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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1016>
   32b46:	79 cf       	rjmp	.-270    	; 0x32a3a <gcode_M45(bool, signed char) [clone .constprop.76]+0xf08>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x107e>
   32bac:	0d 94 7a 9e 	jmp	0x33cf4	; 0x33cf4 <gcode_M45(bool, signed char) [clone .constprop.76]+0x21c2>
                        ((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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x10a8>
                        ((r == 2) ? (-s1 * measured_pts[2 * i]) :
   32bba:	02 30       	cpi	r16, 0x02	; 2
   32bbc:	11 f0       	breq	.+4      	; 0x32bc2 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1090>
   32bbe:	0d 94 6e 9e 	jmp	0x33cdc	; 0x33cdc <gcode_M45(bool, signed char) [clone .constprop.76]+0x21aa>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1172>
   32ca0:	0d 94 82 9e 	jmp	0x33d04	; 0x33d04 <gcode_M45(bool, signed char) [clone .constprop.76]+0x21d2>
                        ((r == 1) ? 1.f :
   32ca4:	01 30       	cpi	r16, 0x01	; 1
   32ca6:	11 f4       	brne	.+4      	; 0x32cac <gcode_M45(bool, signed char) [clone .constprop.76]+0x117a>
   32ca8:	0d 94 87 9e 	jmp	0x33d0e	; 0x33d0e <gcode_M45(bool, signed char) [clone .constprop.76]+0x21dc>
                        ((r == 2) ? ( c1 * measured_pts[2 * i]) :
   32cac:	02 30       	cpi	r16, 0x02	; 2
   32cae:	61 f0       	breq	.+24     	; 0x32cc8 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1196>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1280>
   32db0:	e5 ce       	rjmp	.-566    	; 0x32b7c <gcode_M45(bool, signed char) [clone .constprop.76]+0x104a>
                    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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x12bc>
   32dec:	21 ce       	rjmp	.-958    	; 0x32a30 <gcode_M45(bool, signed char) [clone .constprop.76]+0xefe>
        }

        // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1722>
   33252:	c9 ce       	rjmp	.-622    	; 0x32fe6 <gcode_M45(bool, signed char) [clone .constprop.76]+0x14b4>

        // 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 <mbl+0x31>
   33278:	70 93 f3 13 	sts	0x13F3, r23	; 0x8013f3 <mbl+0x32>
   3327c:	80 93 f4 13 	sts	0x13F4, r24	; 0x8013f4 <mbl+0x33>
   33280:	90 93 f5 13 	sts	0x13F5, r25	; 0x8013f5 <mbl+0x34>
        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 <mbl+0x35>
   332a0:	70 93 f7 13 	sts	0x13F7, r23	; 0x8013f7 <mbl+0x36>
   332a4:	80 93 f8 13 	sts	0x13F8, r24	; 0x8013f8 <mbl+0x37>
   332a8:	90 93 f9 13 	sts	0x13F9, r25	; 0x8013f9 <mbl+0x38>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xd98>
            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 <cos>
   3330e:	60 93 e2 13 	sts	0x13E2, r22	; 0x8013e2 <mbl+0x21>
   33312:	70 93 e3 13 	sts	0x13E3, r23	; 0x8013e3 <mbl+0x22>
   33316:	80 93 e4 13 	sts	0x13E4, r24	; 0x8013e4 <mbl+0x23>
   3331a:	90 93 e5 13 	sts	0x13E5, r25	; 0x8013e5 <mbl+0x24>
    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 <sin>
   3332e:	60 93 e6 13 	sts	0x13E6, r22	; 0x8013e6 <mbl+0x25>
   33332:	70 93 e7 13 	sts	0x13E7, r23	; 0x8013e7 <mbl+0x26>
   33336:	80 93 e8 13 	sts	0x13E8, r24	; 0x8013e8 <mbl+0x27>
   3333a:	90 93 e9 13 	sts	0x13E9, r25	; 0x8013e9 <mbl+0x28>
    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 <sin>
   3334e:	90 58       	subi	r25, 0x80	; 128
   33350:	60 93 ea 13 	sts	0x13EA, r22	; 0x8013ea <mbl+0x29>
   33354:	70 93 eb 13 	sts	0x13EB, r23	; 0x8013eb <mbl+0x2a>
   33358:	80 93 ec 13 	sts	0x13EC, r24	; 0x8013ec <mbl+0x2b>
   3335c:	90 93 ed 13 	sts	0x13ED, r25	; 0x8013ed <mbl+0x2c>
    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 <cos>
   33370:	60 93 ee 13 	sts	0x13EE, r22	; 0x8013ee <mbl+0x2d>
   33374:	70 93 ef 13 	sts	0x13EF, r23	; 0x8013ef <mbl+0x2e>
   33378:	80 93 f0 13 	sts	0x13F0, r24	; 0x8013f0 <mbl+0x2f>
   3337c:	90 93 f1 13 	sts	0x13F1, r25	; 0x8013f1 <mbl+0x30>

    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 <printf_P>
        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_dword>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x18fe>
            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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x18fe>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x191e>
   3344e:	67 c4       	rjmp	.+2254   	; 0x33d1e <gcode_M45(bool, signed char) [clone .constprop.76]+0x21ec>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x193e>
   3346e:	57 c4       	rjmp	.+2222   	; 0x33d1e <gcode_M45(bool, signed char) [clone .constprop.76]+0x21ec>
        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 <mbl+0x21>
   33474:	30 91 e3 13 	lds	r19, 0x13E3	; 0x8013e3 <mbl+0x22>
   33478:	40 91 e4 13 	lds	r20, 0x13E4	; 0x8013e4 <mbl+0x23>
   3347c:	50 91 e5 13 	lds	r21, 0x13E5	; 0x8013e5 <mbl+0x24>
   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 <mbl+0x29>
   33490:	90 91 eb 13 	lds	r25, 0x13EB	; 0x8013eb <mbl+0x2a>
   33494:	a0 91 ec 13 	lds	r26, 0x13EC	; 0x8013ec <mbl+0x2b>
   33498:	b0 91 ed 13 	lds	r27, 0x13ED	; 0x8013ed <mbl+0x2c>
   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 <mbl+0x31>
   334ac:	30 91 f3 13 	lds	r19, 0x13F3	; 0x8013f3 <mbl+0x32>
   334b0:	40 91 f4 13 	lds	r20, 0x13F4	; 0x8013f4 <mbl+0x33>
   334b4:	50 91 f5 13 	lds	r21, 0x13F5	; 0x8013f5 <mbl+0x34>
   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 <mbl+0x25>
   334c8:	90 91 e7 13 	lds	r25, 0x13E7	; 0x8013e7 <mbl+0x26>
   334cc:	a0 91 e8 13 	lds	r26, 0x13E8	; 0x8013e8 <mbl+0x27>
   334d0:	b0 91 e9 13 	lds	r27, 0x13E9	; 0x8013e9 <mbl+0x28>
   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 <mbl+0x2d>
   334e4:	30 91 ef 13 	lds	r19, 0x13EF	; 0x8013ef <mbl+0x2e>
   334e8:	40 91 f0 13 	lds	r20, 0x13F0	; 0x8013f0 <mbl+0x2f>
   334ec:	50 91 f1 13 	lds	r21, 0x13F1	; 0x8013f1 <mbl+0x30>
   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 <mbl+0x35>
   33504:	90 91 f7 13 	lds	r25, 0x13F7	; 0x8013f7 <mbl+0x36>
   33508:	a0 91 f8 13 	lds	r26, 0x13F8	; 0x8013f8 <mbl+0x37>
   3350c:	b0 91 f9 13 	lds	r27, 0x13F9	; 0x8013f9 <mbl+0x38>
   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 <hypot>
		}
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1b38>
				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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1b62>
   33692:	50 cf       	rjmp	.-352    	; 0x33534 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1a02>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1e2a>
		#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 <cos>
   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 <mbl+0x21>
   336d8:	70 93 e3 13 	sts	0x13E3, r23	; 0x8013e3 <mbl+0x22>
   336dc:	80 93 e4 13 	sts	0x13E4, r24	; 0x8013e4 <mbl+0x23>
   336e0:	90 93 e5 13 	sts	0x13E5, r25	; 0x8013e5 <mbl+0x24>
        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 <sin>
   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 <mbl+0x25>
   336fc:	70 93 e7 13 	sts	0x13E7, r23	; 0x8013e7 <mbl+0x26>
   33700:	80 93 e8 13 	sts	0x13E8, r24	; 0x8013e8 <mbl+0x27>
   33704:	90 93 e9 13 	sts	0x13E9, r25	; 0x8013e9 <mbl+0x28>
        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 <mbl+0x29>
   3371e:	30 93 eb 13 	sts	0x13EB, r19	; 0x8013eb <mbl+0x2a>
   33722:	40 93 ec 13 	sts	0x13EC, r20	; 0x8013ec <mbl+0x2b>
   33726:	50 93 ed 13 	sts	0x13ED, r21	; 0x8013ed <mbl+0x2c>
        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 <mbl+0x2d>
   3373a:	90 93 ef 13 	sts	0x13EF, r25	; 0x8013ef <mbl+0x2e>
   3373e:	a0 93 f0 13 	sts	0x13F0, r26	; 0x8013f0 <mbl+0x2f>
   33742:	b0 93 f1 13 	sts	0x13F1, r27	; 0x8013f1 <mbl+0x30>
        // Refresh the offset.
        cntr[0] = 0.f;
   33746:	10 92 f2 13 	sts	0x13F2, r1	; 0x8013f2 <mbl+0x31>
   3374a:	10 92 f3 13 	sts	0x13F3, r1	; 0x8013f3 <mbl+0x32>
   3374e:	10 92 f4 13 	sts	0x13F4, r1	; 0x8013f4 <mbl+0x33>
   33752:	10 92 f5 13 	sts	0x13F5, r1	; 0x8013f5 <mbl+0x34>
        cntr[1] = 0.f;
   33756:	10 92 f6 13 	sts	0x13F6, r1	; 0x8013f6 <mbl+0x35>
   3375a:	10 92 f7 13 	sts	0x13F7, r1	; 0x8013f7 <mbl+0x36>
   3375e:	10 92 f8 13 	sts	0x13F8, r1	; 0x8013f8 <mbl+0x37>
   33762:	10 92 f9 13 	sts	0x13F9, r1	; 0x8013f9 <mbl+0x38>
        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 <mbl+0x31>
   33810:	30 91 f3 13 	lds	r19, 0x13F3	; 0x8013f3 <mbl+0x32>
   33814:	40 91 f4 13 	lds	r20, 0x13F4	; 0x8013f4 <mbl+0x33>
   33818:	50 91 f5 13 	lds	r21, 0x13F5	; 0x8013f5 <mbl+0x34>
   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 <mbl+0x31>
   33828:	d0 92 f3 13 	sts	0x13F3, r13	; 0x8013f3 <mbl+0x32>
   3382c:	e0 92 f4 13 	sts	0x13F4, r14	; 0x8013f4 <mbl+0x33>
   33830:	f0 92 f5 13 	sts	0x13F5, r15	; 0x8013f5 <mbl+0x34>
			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 <mbl+0x35>
   338c2:	30 91 f7 13 	lds	r19, 0x13F7	; 0x8013f7 <mbl+0x36>
   338c6:	40 91 f8 13 	lds	r20, 0x13F8	; 0x8013f8 <mbl+0x37>
   338ca:	50 91 f9 13 	lds	r21, 0x13F9	; 0x8013f9 <mbl+0x38>
   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 <mbl+0x35>
   338da:	90 92 f7 13 	sts	0x13F7, r9	; 0x8013f7 <mbl+0x36>
   338de:	a0 92 f8 13 	sts	0x13F8, r10	; 0x8013f8 <mbl+0x37>
   338e2:	b0 92 f9 13 	sts	0x13F9, r11	; 0x8013f9 <mbl+0x38>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1df2>
   33922:	24 cf       	rjmp	.-440    	; 0x3376c <gcode_M45(bool, signed char) [clone .constprop.76]+0x1c3a>
				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 <mbl+0x31>
   33934:	70 93 f3 13 	sts	0x13F3, r23	; 0x8013f3 <mbl+0x32>
   33938:	80 93 f4 13 	sts	0x13F4, r24	; 0x8013f4 <mbl+0x33>
   3393c:	90 93 f5 13 	sts	0x13F5, r25	; 0x8013f5 <mbl+0x34>
        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 <mbl+0x35>
   33950:	70 93 f7 13 	sts	0x13F7, r23	; 0x8013f7 <mbl+0x36>
   33954:	80 93 f8 13 	sts	0x13F8, r24	; 0x8013f8 <mbl+0x37>
   33958:	90 93 f9 13 	sts	0x13F9, r25	; 0x8013f9 <mbl+0x38>
		#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 <mbl+0x21>
   33960:	50 90 e3 13 	lds	r5, 0x13E3	; 0x8013e3 <mbl+0x22>
   33964:	60 90 e4 13 	lds	r6, 0x13E4	; 0x8013e4 <mbl+0x23>
   33968:	70 90 e5 13 	lds	r7, 0x13E5	; 0x8013e5 <mbl+0x24>
   3396c:	c0 90 ee 13 	lds	r12, 0x13EE	; 0x8013ee <mbl+0x2d>
   33970:	d0 90 ef 13 	lds	r13, 0x13EF	; 0x8013ef <mbl+0x2e>
   33974:	e0 90 f0 13 	lds	r14, 0x13F0	; 0x8013f0 <mbl+0x2f>
   33978:	f0 90 f1 13 	lds	r15, 0x13F1	; 0x8013f1 <mbl+0x30>
   3397c:	20 91 e6 13 	lds	r18, 0x13E6	; 0x8013e6 <mbl+0x25>
   33980:	30 91 e7 13 	lds	r19, 0x13E7	; 0x8013e7 <mbl+0x26>
   33984:	40 91 e8 13 	lds	r20, 0x13E8	; 0x8013e8 <mbl+0x27>
   33988:	50 91 e9 13 	lds	r21, 0x13E9	; 0x8013e9 <mbl+0x28>
   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 <mbl+0x29>
   3399c:	90 91 eb 13 	lds	r25, 0x13EB	; 0x8013eb <mbl+0x2a>
   339a0:	a0 91 ec 13 	lds	r26, 0x13EC	; 0x8013ec <mbl+0x2b>
   339a4:	b0 91 ed 13 	lds	r27, 0x13ED	; 0x8013ed <mbl+0x2c>
   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 <mbl+0x31>
   33a58:	50 90 f3 13 	lds	r5, 0x13F3	; 0x8013f3 <mbl+0x32>
   33a5c:	60 90 f4 13 	lds	r6, 0x13F4	; 0x8013f4 <mbl+0x33>
   33a60:	70 90 f5 13 	lds	r7, 0x13F5	; 0x8013f5 <mbl+0x34>
   33a64:	20 91 f6 13 	lds	r18, 0x13F6	; 0x8013f6 <mbl+0x35>
   33a68:	30 91 f7 13 	lds	r19, 0x13F7	; 0x8013f7 <mbl+0x36>
   33a6c:	40 91 f8 13 	lds	r20, 0x13F8	; 0x8013f8 <mbl+0x37>
   33a70:	50 91 f9 13 	lds	r21, 0x13F9	; 0x8013f9 <mbl+0x38>
   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 <mbl+0x21>
   33a84:	d0 92 e3 13 	sts	0x13E3, r13	; 0x8013e3 <mbl+0x22>
   33a88:	e0 92 e4 13 	sts	0x13E4, r14	; 0x8013e4 <mbl+0x23>
   33a8c:	f0 92 e5 13 	sts	0x13E5, r15	; 0x8013e5 <mbl+0x24>
        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 <mbl+0x25>
   33aa0:	90 93 e7 13 	sts	0x13E7, r25	; 0x8013e7 <mbl+0x26>
   33aa4:	a0 93 e8 13 	sts	0x13E8, r26	; 0x8013e8 <mbl+0x27>
   33aa8:	b0 93 e9 13 	sts	0x13E9, r27	; 0x8013e9 <mbl+0x28>
        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 <mbl+0x29>
   33abc:	30 93 eb 13 	sts	0x13EB, r19	; 0x8013eb <mbl+0x2a>
   33ac0:	40 93 ec 13 	sts	0x13EC, r20	; 0x8013ec <mbl+0x2b>
   33ac4:	50 93 ed 13 	sts	0x13ED, r21	; 0x8013ed <mbl+0x2c>
        vec_y[1] = Ainv[1][1];
   33ac8:	80 92 ee 13 	sts	0x13EE, r8	; 0x8013ee <mbl+0x2d>
   33acc:	90 92 ef 13 	sts	0x13EF, r9	; 0x8013ef <mbl+0x2e>
   33ad0:	a0 92 f0 13 	sts	0x13F0, r10	; 0x8013f0 <mbl+0x2f>
   33ad4:	b0 92 f1 13 	sts	0x13F1, r11	; 0x8013f1 <mbl+0x30>
        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 <mbl+0x31>
   33b16:	70 93 f3 13 	sts	0x13F3, r23	; 0x8013f3 <mbl+0x32>
   33b1a:	80 93 f4 13 	sts	0x13F4, r24	; 0x8013f4 <mbl+0x33>
   33b1e:	90 93 f5 13 	sts	0x13F5, r25	; 0x8013f5 <mbl+0x34>
            { 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 <mbl+0x35>
   33b60:	70 93 f7 13 	sts	0x13F7, r23	; 0x8013f7 <mbl+0x36>
   33b64:	80 93 f8 13 	sts	0x13F8, r24	; 0x8013f8 <mbl+0x37>
   33b68:	90 93 f9 13 	sts	0x13F9, r25	; 0x8013f9 <mbl+0x38>
				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 <delay_keep_alive(unsigned int)>

		if (result >= 0) {
   33b74:	17 fd       	sbrc	r17, 7
   33b76:	d5 c0       	rjmp	.+426    	; 0x33d22 <gcode_M45(bool, signed char) [clone .constprop.76]+0x21f0>
            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 <printf_P>
			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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]>
#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 <eeprom_update_block>
   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 <eeprom_update_block>
   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 <eeprom_update_block>
				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 <world2machine_update_current()>
			}
			#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 <clean_up_after_endstop_move(int) [clone .lto_priv.393]>
				// 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 <current_position+0x8>
   33be8:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   33bec:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   33bf0:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
				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 <plan_buffer_line_curposXYZE(float)>
				st_synchronize();
   33c00:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
//#ifndef NEW_XYZCAL
				if (result >= 0)
   33c04:	17 fd       	sbrc	r17, 7
   33c06:	22 c0       	rjmp	.+68     	; 0x33c4c <gcode_M45(bool, signed char) [clone .constprop.76]+0x211a>
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 <current_position+0x8>
   33c0c:	10 92 9a 06 	sts	0x069A, r1	; 0x80069a <current_position+0x9>
   33c10:	10 92 9b 06 	sts	0x069B, r1	; 0x80069b <current_position+0xa>
   33c14:	10 92 9c 06 	sts	0x069C, r1	; 0x80069c <current_position+0xb>
    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 <destination+0x8>
   33c24:	90 93 7c 06 	sts	0x067C, r25	; 0x80067c <destination+0x9>
   33c28:	a0 93 7d 06 	sts	0x067D, r26	; 0x80067d <destination+0xa>
   33c2c:	b0 93 7e 06 	sts	0x067E, r27	; 0x80067e <destination+0xb>
    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 <plan_buffer_line_destinationXYZE(float)>

    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 <lang_get_translation>
   33c44:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>

    // 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 <sample_mesh_and_store_reference()>
					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_enable(unsigned char)>
				lcd_update(2);
   33c52:	82 e0       	ldi	r24, 0x02	; 2
   33c54:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>

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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2154>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2134>
   33c64:	73 c0       	rjmp	.+230    	; 0x33d4c <gcode_M45(bool, signed char) [clone .constprop.76]+0x221a>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2154>
            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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2154>
            // 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 <lang_get_translation>
   33c8a:	0d 94 95 92 	jmp	0x3252a	; 0x3252a <gcode_M45(bool, signed char) [clone .constprop.76]+0x9f8>
                             (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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xfd0>
                    // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2302>
                                        (-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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2336>
            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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x10a0>
            // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x10a8>
                    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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1196>
                        ((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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x1196>
            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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x193e>
				}
			}
			#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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2216>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2200>
   33d30:	4d cf       	rjmp	.-358    	; 0x33bcc <gcode_M45(bool, signed char) [clone .constprop.76]+0x209a>
            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 <printf_P>
   33d3e:	44 cf       	rjmp	.-376    	; 0x33bc8 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2096>
				// Reset the baby step value and the baby step applied flag.
				calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
				eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x209a>
				}
			}
			#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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x209a>
        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x224a>
                    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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2240>
                    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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2240>
                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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2240>
                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 <lang_get_translation>
                    break;
            }
            lcd_show_fullscreen_message_and_wait_P(msg);
   33d76:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   33d7a:	0d c0       	rjmp	.+26     	; 0x33d96 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2264>
            // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2290>
                // 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 <lang_get_translation>
            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 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        }
        if (point_too_far_mask == 0 || result > 0) {
   33d92:	11 16       	cp	r1, r17
   33d94:	04 f3       	brlt	.-64     	; 0x33d56 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2224>
//#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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x226c>
   33d9a:	0d 94 37 8e 	jmp	0x31c6e	; 0x31c6e <gcode_M45(bool, signed char) [clone .constprop.76]+0x13c>
				{
					// 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 <calibration_status_set(unsigned char)>
					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 <eeprom_read_byte>
   33dac:	81 11       	cpse	r24, r1
   33dae:	0d 94 af 92 	jmp	0x3255e	; 0x3255e <gcode_M45(bool, signed char) [clone .constprop.76]+0xa2c>
						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 <lang_get_translation>
   33dba:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
   33dbe:	0d 94 af 92 	jmp	0x3255e	; 0x3255e <gcode_M45(bool, signed char) [clone .constprop.76]+0xa2c>
            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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2258>
		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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x22a4>
   33dd2:	0d 94 ee 92 	jmp	0x325dc	; 0x325dc <gcode_M45(bool, signed char) [clone .constprop.76]+0xaaa>
		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 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.79]>
   33df8:	88 23       	and	r24, r24
   33dfa:	11 f4       	brne	.+4      	; 0x33e00 <gcode_M45(bool, signed char) [clone .constprop.76]+0x22ce>
   33dfc:	0d 94 ee 92 	jmp	0x325dc	; 0x325dc <gcode_M45(bool, signed char) [clone .constprop.76]+0xaaa>
			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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x4f0>
                        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x22e2>
   33e10:	0d 94 94 95 	jmp	0x32b28	; 0x32b28 <gcode_M45(bool, signed char) [clone .constprop.76]+0xff6>
                        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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x22e8>
   33e18:	49 cf       	rjmp	.-366    	; 0x33cac <gcode_M45(bool, signed char) [clone .constprop.76]+0x217a>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x233a>
                            ((c == 2) ? ( c1 * measured_pts[2 * i]) :
   33e48:	12 30       	cpi	r17, 0x02	; 2
   33e4a:	09 f0       	breq	.+2      	; 0x33e4e <gcode_M45(bool, signed char) [clone .constprop.76]+0x231c>
   33e4c:	3b cf       	rjmp	.-394    	; 0x33cc4 <gcode_M45(bool, signed char) [clone .constprop.76]+0x2192>
   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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xff6>
                // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0xfaa>
                            ((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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x234a>
                    // 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 <gcode_M45(bool, signed char) [clone .constprop.76]+0x230a>
   33eb8:	0d 94 94 95 	jmp	0x32b28	; 0x32b28 <gcode_M45(bool, signed char) [clone .constprop.76]+0xff6>
   33ebc:	11 11       	cpse	r17, r1
   33ebe:	aa cf       	rjmp	.-172    	; 0x33e14 <gcode_M45(bool, signed char) [clone .constprop.76]+0x22e2>
   33ec0:	0d 94 94 95 	jmp	0x32b28	; 0x32b28 <gcode_M45(bool, signed char) [clone .constprop.76]+0xff6>

00033ec4 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]>:
	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 <Sound_MakeSound(eSOUND_TYPE)>
{
	lcd_beeper_quick_feedback();

    FORCE_BL_ON_END;
   33ed4:	80 e0       	ldi	r24, 0x00	; 0
   33ed6:	0e 94 e9 89 	call	0x113d2	; 0x113d2 <force_bl_on(bool)>

	target_temperature[0] = 0;
   33eda:	10 92 b6 0d 	sts	0x0DB6, r1	; 0x800db6 <target_temperature+0x1>
   33ede:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
	target_temperature_bed = 0;
   33ee2:	10 92 72 06 	sts	0x0672, r1	; 0x800672 <target_temperature_bed+0x1>
   33ee6:	10 92 71 06 	sts	0x0671, r1	; 0x800671 <target_temperature_bed>
	manage_heater();
   33eea:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
	manage_inactivity();
   33eee:	80 e0       	ldi	r24, 0x00	; 0
   33ef0:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>

	lcd_clear();
   33ef4:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>

	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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
	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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

	switch (testError)
   33f1c:	11 50       	subi	r17, 0x01	; 1
   33f1e:	1a 30       	cpi	r17, 0x0A	; 10
   33f20:	90 f4       	brcc	.+36     	; 0x33f46 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x82>
   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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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 <lang_get_translation>
   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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   33f6a:	45 c0       	rjmp	.+138    	; 0x33ff6 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x132>
	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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x98>
	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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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_set_cursor(unsigned char, unsigned char)>
		lcd_print(_error_1);
   33fb0:	ce 01       	movw	r24, r28
   33fb2:	1f c0       	rjmp	.+62     	; 0x33ff2 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x12e>
		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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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_set_cursor(unsigned char, unsigned char)>
		lcd_print(_error_1);
   33fce:	ce 01       	movw	r24, r28
   33fd0:	0e 94 7f 70 	call	0xe0fe	; 0xe0fe <lcd_print(char const*)>
		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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		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_set_cursor(unsigned char, unsigned char)>
		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_print(char const*)>
          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 <delay2>
   34002:	80 e0       	ldi	r24, 0x00	; 0
   34004:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
	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 <delay2>
		manage_heater();
   34014:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
		manage_inactivity();
   34018:	80 e0       	ldi	r24, 0x00	; 0
   3401a:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
	} while (!lcd_clicked());
   3401e:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   34022:	88 23       	and	r24, r24
   34024:	89 f3       	breq	.-30     	; 0x34008 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x144>

	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 <lang_get_translation>
   3402e:	62 e0       	ldi	r22, 0x02	; 2
   34030:	0e 94 d6 f1 	call	0x1e3ac	; 0x1e3ac <lcd_setalertstatuspgm(char const*, unsigned char)>
	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_return_to_status()>
		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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xd6>
		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_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xc4>
		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_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xc4>
		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_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0x17e>
		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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xd6>
		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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xd6>
		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 <lcd_selftest_error(TestError, char const*, char const*) [clone .constprop.74]+0xac>

0003409e <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]>:
    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_clear()>

	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 <lang_get_translation>
   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(unsigned char, unsigned char, char const*)>
		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 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]+0x2c>
   340c6:	86 e9       	ldi	r24, 0x96	; 150
   340c8:	96 e5       	ldi	r25, 0x56	; 86
   340ca:	0e 94 44 72 	call	0xe488	; 0xe488 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_selftest_setfan(255);
   340d8:	8f ef       	ldi	r24, 0xFF	; 255
   340da:	0e 94 13 f6 	call	0x1ec26	; 0x1ec26 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>
		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 <delay2>

	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 <lang_get_translation>
   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_puts_at_P(unsigned char, unsigned char, char const*)>
	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_putc_at(unsigned char, unsigned char, char)>
	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 <lang_get_translation>
   3410e:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>

	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 <lcd_encoder+0x1>
   3411a:	60 93 6f 06 	sts	0x066F, r22	; 0x80066f <lcd_encoder>

	KEEPALIVE_STATE(PAUSED_FOR_USER);
   3411e:	84 e0       	ldi	r24, 0x04	; 4
   34120:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
	lcd_consume_click();
   34124:	0e 94 90 70 	call	0xe120	; 0xe120 <lcd_consume_click()>
   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 <lcd_encoder>
   34132:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   34136:	00 97       	sbiw	r24, 0x00	; 0
   34138:	19 f1       	breq	.+70     	; 0x34180 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]+0xe2>
			if (lcd_encoder < 0) {
   3413a:	97 ff       	sbrs	r25, 7
   3413c:	0b c0       	rjmp	.+22     	; 0x34154 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]+0xb6>
				_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(unsigned char, unsigned char, char)>
				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 <lcd_putc_at(unsigned char, unsigned char, char)>
			}

			if (lcd_encoder > 0) {
   34154:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   34158:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3415c:	18 16       	cp	r1, r24
   3415e:	19 06       	cpc	r1, r25
   34160:	5c f4       	brge	.+22     	; 0x34178 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]+0xda>
				_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(unsigned char, unsigned char, char)>
				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 <lcd_putc_at(unsigned char, unsigned char, char)>
   34176:	dc 2f       	mov	r29, r28
			}
			lcd_encoder = 0;
   34178:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   3417c:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
		}

		manage_heater();
   34180:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
		manage_inactivity(true);
   34184:	81 e0       	ldi	r24, 0x01	; 1
   34186:	0e 94 4f 8a 	call	0x1149e	; 0x1149e <manage_inactivity(bool)>
		_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 <delay2>

	} while (!lcd_clicked());
   34196:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   3419a:	88 23       	and	r24, r24
   3419c:	41 f2       	breq	.-112    	; 0x3412e <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.73]+0x90>
	KEEPALIVE_STATE(IN_HANDLER);
   3419e:	82 e0       	ldi	r24, 0x02	; 2
   341a0:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>
	setExtruderAutoFanState(0); // Turn off hotend fan
   341a4:	80 e0       	ldi	r24, 0x00	; 0
   341a6:	0e 94 f3 74 	call	0xe9e6	; 0xe9e6 <setExtruderAutoFanState(unsigned char)>
	lcd_selftest_setfan(0); // Turn off print fan
   341aa:	80 e0       	ldi	r24, 0x00	; 0
   341ac:	0e 94 13 f6 	call	0x1ec26	; 0x1ec26 <lcd_selftest_setfan(unsigned char) [clone .lto_priv.395]>

	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 <lcd_selftest_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]>:

#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 <lcd_selftest_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]+0x32>
        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 <lcd_putc_at(unsigned char, unsigned char, char)>
            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 <delay_keep_alive(unsigned int)>
    // 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 <lcd_putc_at(unsigned char, unsigned char, char)>
            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 <delay_keep_alive(unsigned int)>
   341ea:	eb cf       	rjmp	.-42     	; 0x341c2 <lcd_selftest_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]+0x8>
        }
    }

#ifdef FANCHECK
    extruder_autofan_last_check = _millis();
   341ec:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   341f0:	60 93 bf 17 	sts	0x17BF, r22	; 0x8017bf <extruder_autofan_last_check>
   341f4:	70 93 c0 17 	sts	0x17C0, r23	; 0x8017c0 <extruder_autofan_last_check+0x1>
   341f8:	80 93 c1 17 	sts	0x17C1, r24	; 0x8017c1 <extruder_autofan_last_check+0x2>
   341fc:	90 93 c2 17 	sts	0x17C2, r25	; 0x8017c2 <extruder_autofan_last_check+0x3>
#endif
    fan_measuring = true;
   34200:	81 e0       	ldi	r24, 0x01	; 1
   34202:	80 93 6e 06 	sts	0x066E, r24	; 0x80066e <fan_measuring>
    while(fan_measuring) {
   34206:	80 91 6e 06 	lds	r24, 0x066E	; 0x80066e <fan_measuring>
   3420a:	88 23       	and	r24, r24
   3420c:	29 f0       	breq	.+10     	; 0x34218 <lcd_selftest_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]+0x5e>
        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 <delay_keep_alive(unsigned int)>
   34216:	f7 cf       	rjmp	.-18     	; 0x34206 <lcd_selftest_measure_fans(unsigned char, unsigned char, unsigned char) [clone .constprop.72]+0x4c>
    }

    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 <gcode_M123()>

00034220 <analog2temp(int, unsigned char) [clone .constprop.70]>:
}

#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<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > 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 <analog2temp(int, unsigned char) [clone .constprop.70]+0x38>
   34256:	66 c0       	rjmp	.+204    	; 0x34324 <analog2temp(int, unsigned char) [clone .constprop.70]+0x104>
      {
        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<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > 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<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > 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<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > 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<heater_ttbllen_map[e]; i++)
   3432c:	20 38       	cpi	r18, 0x80	; 128
   3432e:	31 05       	cpc	r19, r1
   34330:	09 f0       	breq	.+2      	; 0x34334 <analog2temp(int, unsigned char) [clone .constprop.70]+0x114>
   34332:	88 cf       	rjmp	.-240    	; 0x34244 <analog2temp(int, unsigned char) [clone .constprop.70]+0x24>
        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 <analog2temp(int, unsigned char) [clone .constprop.70]+0xe6>

0003434a <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]>:

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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0x26>
   34370:	00 d0       	rcall	.+0      	; 0x34372 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0x28>
   34372:	00 d0       	rcall	.+0      	; 0x34374 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0x2a>
   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 <floor>
   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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0xa0>
   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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0x72>
   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 <BED_X(unsigned char)>
   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 <floor>
   34412:	0f 94 a9 de 	call	0x3bd52	; 0x3bd52 <__fixsfsi>
    if (j < 0) {
   34416:	77 fd       	sbrc	r23, 7
   34418:	da c0       	rjmp	.+436    	; 0x345ce <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0x284>
   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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0xe2>
   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 <BED_X(unsigned char)>
   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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]+0x114>

000345d4 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]>:
    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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x26>
   345fa:	00 d0       	rcall	.+0      	; 0x345fc <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x28>
   345fc:	00 d0       	rcall	.+0      	; 0x345fe <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x2a>
   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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x54>
   34626:	7c c0       	rjmp	.+248    	; 0x34720 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x14c>

    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 <BED_X(unsigned char)>
   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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x15e>
   34730:	6f cf       	rjmp	.-290    	; 0x34610 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x3c>
   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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x170>
   34742:	63 cf       	rjmp	.-314    	; 0x3460a <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x36>
    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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x1a4>
   34776:	79 c0       	rjmp	.+242    	; 0x3486a <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x296>
    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 <BED_X(unsigned char)>
   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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x2ac>
   3487e:	6f cf       	rjmp	.-290    	; 0x3475e <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x18a>
   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 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x2ba>
   3488c:	5b cf       	rjmp	.-330    	; 0x34744 <mesh_bed_leveling::upsample_3x3() [clone .constprop.75]+0x170>
                    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 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>:
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 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x8>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
    scopeState = nextState;
   348ec:	10 93 4d 13 	sts	0x134D, r17	; 0x80134d <MMU2::mmu2+0x3>
}
   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 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.295]>:
    SendMsg(RequestMsg(RequestMsgCodes::Query, 0));
    scopeState = ScopeState::QuerySent;
}

void ProtocolLogic::StartReading8bitRegisters() {
    regIndex = 0;
   34902:	10 92 98 13 	sts	0x1398, r1	; 0x801398 <MMU2::mmu2+0x4e>
    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 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>

00034912 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.292]>:
    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 <MMU2::mmu2+0x4e>
   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 <MMU2::mmu2+0x1b>
   34926:	30 91 66 13 	lds	r19, 0x1366	; 0x801366 <MMU2::mmu2+0x1c>
   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 <MMU2::mmu2+0x4e>
    if (regIndex >= regs16Count) {
   34934:	e2 30       	cpi	r30, 0x02	; 2
   34936:	40 f4       	brcc	.+16     	; 0x34948 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.292]+0x36>
        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 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>
    }
    return ScopeState::Reading16bitRegisters;
   34946:	88 e0       	ldi	r24, 0x08	; 8
}
   34948:	08 95       	ret

0003494a <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.290]>:
    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 <MMU2::mmu2+0x4e>
   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 <MMU2::mmu2+0x1b>
   3495a:	8c 93       	st	X, r24
    ++regIndex;
   3495c:	ef 5f       	subi	r30, 0xFF	; 255
   3495e:	e0 93 98 13 	sts	0x1398, r30	; 0x801398 <MMU2::mmu2+0x4e>
    if (regIndex >= regs8Count) {
   34962:	e3 30       	cpi	r30, 0x03	; 3
   34964:	40 f0       	brcs	.+16     	; 0x34976 <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.290]+0x2c>
        SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
    }
}

void ProtocolLogic::StartReading16bitRegisters() {
    regIndex = 0;
   34966:	10 92 98 13 	sts	0x1398, r1	; 0x801398 <MMU2::mmu2+0x4e>
    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 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>
   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 <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.290]+0x28>

00034982 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]>:
    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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x6>
   34988:	00 d0       	rcall	.+0      	; 0x3498a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x8>
   3498a:	00 d0       	rcall	.+0      	; 0x3498c <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xa>
   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 <MMU2::mmu2+0xa>
   34996:	82 34       	cpi	r24, 0x42	; 66
   34998:	09 f4       	brne	.+2      	; 0x3499c <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x1a>
   3499a:	46 c0       	rjmp	.+140    	; 0x34a28 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xa6>
   3499c:	b8 f5       	brcc	.+110    	; 0x34a0c <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x8a>
   3499e:	88 23       	and	r24, r24
   349a0:	09 f4       	brne	.+2      	; 0x349a4 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x22>
   349a2:	72 c0       	rjmp	.+228    	; 0x34a88 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x106>
        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 <MMU2::mmu2+0x2>
   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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x32>
    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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x44>
        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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x62>
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 <MMU2::mmu2+0x3>
    SendMsg(rq);
   349f2:	40 91 4f 13 	lds	r20, 0x134F	; 0x80134f <MMU2::mmu2+0x5>
   349f6:	50 91 50 13 	lds	r21, 0x1350	; 0x801350 <MMU2::mmu2+0x6>
   349fa:	60 91 51 13 	lds	r22, 0x1351	; 0x801351 <MMU2::mmu2+0x7>
   349fe:	70 91 52 13 	lds	r23, 0x1352	; 0x801352 <MMU2::mmu2+0x8>
   34a02:	80 91 53 13 	lds	r24, 0x1353	; 0x801353 <MMU2::mmu2+0x9>
   34a06:	0f 94 93 67 	call	0x2cf26	; 0x2cf26 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
   34a0a:	2e c0       	rjmp	.+92     	; 0x34a68 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xe6>
        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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xfa>
   34a10:	87 35       	cpi	r24, 0x57	; 87
   34a12:	41 f6       	brne	.-112    	; 0x349a4 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0x22>
    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 <MMU2::mmu2+0xc>
   34a18:	70 91 57 13 	lds	r23, 0x1357	; 0x801357 <MMU2::mmu2+0xd>
   34a1c:	4c e0       	ldi	r20, 0x0C	; 12
   34a1e:	80 91 55 13 	lds	r24, 0x1355	; 0x801355 <MMU2::mmu2+0xb>
   34a22:	0f 94 fe 67 	call	0x2cffc	; 0x2cffc <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]>
   34a26:	11 c0       	rjmp	.+34     	; 0x34a4a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xc8>
    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 <MMU2::mmu2+0xb>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
    scopeState = ScopeState::ButtonSent;
   34a44:	8a e0       	ldi	r24, 0x0A	; 10
   34a46:	80 93 4d 13 	sts	0x134D, r24	; 0x80134d <MMU2::mmu2+0x3>
        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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xde>
    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 <MMU2::mmu2+0xb>
   34a82:	0f 94 60 a4 	call	0x348c0	; 0x348c0 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>
   34a86:	e1 cf       	rjmp	.-62     	; 0x34a4a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xc8>
    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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]+0xe8>

00034a8c <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>:

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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]+0x6>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]+0x22>
    if (!ExpectsResponse()) {
   34ab6:	80 91 4d 13 	lds	r24, 0x134D	; 0x80134d <MMU2::mmu2+0x3>
   34aba:	87 ff       	sbrs	r24, 7
   34abc:	09 c0       	rjmp	.+18     	; 0x34ad0 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]+0x44>
        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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]>
    } // 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 <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.309]>:
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 <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.309]+0x8>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
    scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage);
   34b0c:	10 93 4d 13 	sts	0x134D, r17	; 0x80134d <MMU2::mmu2+0x3>
}
   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 <MMU2::ProtocolLogic::SendQuery() [clone .constprop.304]>:
    if (fs != lastFSensor) {
        SendAndUpdateFilamentSensor();
    }
}

void ProtocolLogic::SendQuery() {
   34b22:	cf 93       	push	r28
   34b24:	df 93       	push	r29
   34b26:	00 d0       	rcall	.+0      	; 0x34b28 <MMU2::ProtocolLogic::SendQuery() [clone .constprop.304]+0x6>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
    scopeState = ScopeState::QuerySent;
   34b4a:	84 e0       	ldi	r24, 0x04	; 4
   34b4c:	80 93 4d 13 	sts	0x134D, r24	; 0x80134d <MMU2::mmu2+0x3>
}
   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 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.302]>:
        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 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.302]+0x6>
   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 <MMU2::WhereIsFilament()>
   34b72:	80 93 8e 13 	sts	0x138E, r24	; 0x80138e <MMU2::mmu2+0x44>
   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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
    scopeState = ScopeState::FilamentSensorStateSent;
   34b90:	86 e0       	ldi	r24, 0x06	; 6
   34b92:	80 93 4d 13 	sts	0x134D, r24	; 0x80134d <MMU2::mmu2+0x3>
}
   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 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]>:
        CheckAndReportAsyncEvents();
    }
    return Processing;
}

StepStatus ProtocolLogic::ProcessCommandQueryResponse() {
   34ba6:	cf 93       	push	r28
   34ba8:	df 93       	push	r29
   34baa:	00 d0       	rcall	.+0      	; 0x34bac <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x6>
   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 <MMU2::mmu2+0x1a>
   34bb8:	85 34       	cpi	r24, 0x45	; 69
   34bba:	f1 f0       	breq	.+60     	; 0x34bf8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x52>
   34bbc:	20 f4       	brcc	.+8      	; 0x34bc6 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x20>
   34bbe:	82 34       	cpi	r24, 0x42	; 66
   34bc0:	51 f1       	breq	.+84     	; 0x34c16 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x70>
        } 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 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x42>
    }
    return Processing;
}

StepStatus ProtocolLogic::ProcessCommandQueryResponse() {
    switch (rsp.paramCode) {
   34bc6:	86 34       	cpi	r24, 0x46	; 70
   34bc8:	71 f1       	breq	.+92     	; 0x34c26 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x80>
   34bca:	80 35       	cpi	r24, 0x50	; 80
   34bcc:	d1 f7       	brne	.-12     	; 0x34bc2 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x1c>
    case ResponseMsgParamCodes::Processing:
        progressCode = static_cast<ProgressCode>(rsp.paramValue);
   34bce:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   34bd2:	80 93 8c 13 	sts	0x138C, r24	; 0x80138c <MMU2::mmu2+0x42>
        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 <MMU2::mmu2+0x41>
   34bde:	80 93 8a 13 	sts	0x138A, r24	; 0x80138a <MMU2::mmu2+0x40>
        SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly
   34be2:	0f 94 b0 a5 	call	0x34b60	; 0x34b60 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.302]>
        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 <MMU2::mmu2+0x42>
        errorCode = static_cast<ErrorCode>(rsp.paramValue);
   34bfe:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   34c02:	90 91 66 13 	lds	r25, 0x1366	; 0x801366 <MMU2::mmu2+0x1c>
   34c06:	90 93 8b 13 	sts	0x138B, r25	; 0x80138b <MMU2::mmu2+0x41>
   34c0a:	80 93 8a 13 	sts	0x138A, r24	; 0x80138a <MMU2::mmu2+0x40>
        // 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 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.302]>
        return CommandError;
   34c12:	87 e0       	ldi	r24, 0x07	; 7
   34c14:	e9 cf       	rjmp	.-46     	; 0x34be8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x42>
    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<Buttons>(rsp.paramValue);
   34c16:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   34c1a:	80 93 8d 13 	sts	0x138D, r24	; 0x80138d <MMU2::mmu2+0x43>
        SendAndUpdateFilamentSensor();
   34c1e:	0f 94 b0 a5 	call	0x34b60	; 0x34b60 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.302]>
        return ButtonPushed;
   34c22:	8b e0       	ldi	r24, 0x0B	; 11
   34c24:	e1 cf       	rjmp	.-62     	; 0x34be8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x42>
    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 <MMU2::mmu2+0x5>
   34c2a:	80 91 5f 13 	lds	r24, 0x135F	; 0x80135f <MMU2::mmu2+0x15>
   34c2e:	98 13       	cpse	r25, r24
   34c30:	22 c0       	rjmp	.+68     	; 0x34c76 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0xd0>
   34c32:	90 91 50 13 	lds	r25, 0x1350	; 0x801350 <MMU2::mmu2+0x6>
   34c36:	80 91 60 13 	lds	r24, 0x1360	; 0x801360 <MMU2::mmu2+0x16>
   34c3a:	98 13       	cpse	r25, r24
   34c3c:	1c c0       	rjmp	.+56     	; 0x34c76 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0xd0>
            progressCode = ProgressCode::OK;
   34c3e:	10 92 8c 13 	sts	0x138C, r1	; 0x80138c <MMU2::mmu2+0x42>
            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 <MMU2::mmu2+0x41>
   34c4a:	80 93 8a 13 	sts	0x138A, r24	; 0x80138a <MMU2::mmu2+0x40>
            scopeState = ScopeState::Ready;
   34c4e:	82 e8       	ldi	r24, 0x82	; 130
   34c50:	80 93 4d 13 	sts	0x134D, r24	; 0x80134d <MMU2::mmu2+0x3>
            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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0xc4>
   34c72:	82 e0       	ldi	r24, 0x02	; 2
   34c74:	b9 cf       	rjmp	.-142    	; 0x34be8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x42>
            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 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]+0x42>

00034c7a <MMU2::MMU2::CheckUserInput() [clone .constprop.202]>:

        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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x8>
   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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x6c>
    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 <MMU2::mmu2+0x6a>
   34c96:	1f 3f       	cpi	r17, 0xFF	; 255
   34c98:	91 f5       	brne	.+100    	; 0x34cfe <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x84>
        btn = lastButton;
        lastButton = Buttons::NoButton; // Clear it.
    }

    if (mmu2.MMULastErrorSource() == ErrorSourcePrinter && btn != Buttons::NoButton) {
   34c9a:	80 91 b3 13 	lds	r24, 0x13B3	; 0x8013b3 <MMU2::mmu2+0x69>
   34c9e:	81 11       	cpse	r24, r1
   34ca0:	60 c0       	rjmp	.+192    	; 0x34d62 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0xe8>
   34ca2:	1f 3f       	cpi	r17, 0xFF	; 255
   34ca4:	b9 f0       	breq	.+46     	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>

    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 <MMU2::mmu2+0x1>
   34cae:	80 93 4a 13 	sts	0x134A, r24	; 0x80134a <MMU2::mmu2>
        }
    }

    void ClearPrinterError() {
        logic.ClearPrinterError();
        lastErrorCode = ErrorCode::OK;
   34cb2:	90 93 b2 13 	sts	0x13B2, r25	; 0x8013b2 <MMU2::mmu2+0x68>
   34cb6:	80 93 b1 13 	sts	0x13B1, r24	; 0x8013b1 <MMU2::mmu2+0x67>
        lastErrorSource = ErrorSource::ErrorSourceNone;
   34cba:	8f ef       	ldi	r24, 0xFF	; 255
   34cbc:	80 93 b3 13 	sts	0x13B3, r24	; 0x8013b3 <MMU2::mmu2+0x69>
        // 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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x4c>
   34cc4:	82 c0       	rjmp	.+260    	; 0x34dca <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x150>
   34cc6:	f8 f0       	brcs	.+62     	; 0x34d06 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x8c>
   34cc8:	16 30       	cpi	r17, 0x06	; 6
   34cca:	08 f4       	brcc	.+2      	; 0x34cce <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x54>
   34ccc:	7b c0       	rjmp	.+246    	; 0x34dc4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x14a>
   34cce:	17 30       	cpi	r17, 0x07	; 7
   34cd0:	09 f4       	brne	.+2      	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
   34cd2:	7e c0       	rjmp	.+252    	; 0x34dd0 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x156>
        // @@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 <MMU2::mmu2+0x67>
   34cea:	90 91 b2 13 	lds	r25, 0x13B2	; 0x8013b2 <MMU2::mmu2+0x68>
   34cee:	0f 94 6b c8 	call	0x390d6	; 0x390d6 <MMU2::ButtonAvailable(ErrorCode)>
   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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x20>
   34cfc:	ca cf       	rjmp	.-108    	; 0x34c92 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x18>
        btn = lastButton;
        lastButton = Buttons::NoButton; // Clear it.
   34cfe:	8f ef       	ldi	r24, 0xFF	; 255
   34d00:	80 93 b4 13 	sts	0x13B4, r24	; 0x8013b4 <MMU2::mmu2+0x6a>
   34d04:	ca cf       	rjmp	.-108    	; 0x34c9a <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x20>

    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 <serialprintPGM(char const*)>
        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 <MarlinSerial::println(int, int) [clone .constprop.325]>
        ResumeHotendTemp(); // Recover the hotend temp before we attempt to do anything else...
   34d16:	0f 94 08 ac 	call	0x35810	; 0x35810 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]>

        if (mmu2.MMULastErrorSource() == ErrorSourceMMU) {
   34d1a:	80 91 b3 13 	lds	r24, 0x13B3	; 0x8013b3 <MMU2::mmu2+0x69>
   34d1e:	81 30       	cpi	r24, 0x01	; 1
   34d20:	89 f4       	brne	.+34     	; 0x34d44 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0xca>
    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 <MMU2::LogEchoEvent_P(char const*)>
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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
        }

        // 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 <MMU2::mmu2+0x67>
   34d48:	90 91 b2 13 	lds	r25, 0x13B2	; 0x8013b2 <MMU2::mmu2+0x68>
   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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0xe2>
   34d54:	89 30       	cpi	r24, 0x09	; 9
   34d56:	90 48       	sbci	r25, 0x80	; 128
   34d58:	09 f0       	breq	.+2      	; 0x34d5c <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0xe2>
   34d5a:	bc cf       	rjmp	.-136    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
        case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF:
        case ErrorCode::FSENSOR_TOO_EARLY:
            HelpUnloadToFinda();
   34d5c:	0f 94 03 6b 	call	0x2d606	; 0x2d606 <MMU2::MMU2::HelpUnloadToFinda() [clone .constprop.203]>
   34d60:	b9 cf       	rjmp	.-142    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
        // 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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0xee>
   34d66:	b6 cf       	rjmp	.-148    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
   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 <MMU2::mmu2+0x67>
   34d8e:	90 91 b2 13 	lds	r25, 0x13B2	; 0x8013b2 <MMU2::mmu2+0x68>
   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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x128>
   34d9a:	87 30       	cpi	r24, 0x07	; 7
   34d9c:	91 48       	sbci	r25, 0x81	; 129
   34d9e:	09 f0       	breq	.+2      	; 0x34da2 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x128>
   34da0:	99 cf       	rjmp	.-206    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
    // 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 <MMU2::mmu2+0x2>
   34da6:	84 30       	cpi	r24, 0x04	; 4
   34da8:	21 f4       	brne	.+8      	; 0x34db2 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x138>
    );
    MENU_END();
}

void tuneIdlerStallguardThreshold() {
    if ((CommandInProgress)mmu2.GetCommandInProgress() != NoCommand)
   34daa:	80 91 4f 13 	lds	r24, 0x134F	; 0x80134f <MMU2::mmu2+0x5>
   34dae:	81 11       	cpse	r24, r1
   34db0:	91 cf       	rjmp	.-222    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
        // 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 <menu_submenu(void (*)(), bool)>
   34dc2:	88 cf       	rjmp	.-240    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
    }

    /// @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 <MMU2::mmu2+0x6d>
   34dc8:	85 cf       	rjmp	.-246    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
void MMU2::ResetX42() {
    logic.ResetMMU(42);
}

void MMU2::TriggerResetPin() {
    reset();
   34dca:	0f 94 8e c5 	call	0x38b1c	; 0x38b1c <MMU2::reset()>
   34dce:	82 cf       	rjmp	.-252    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   34dd0:	10 92 b9 13 	sts	0x13B9, r1	; 0x8013b9 <MMU2::mmu2+0x6f>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   34dd8:	10 92 4c 13 	sts	0x134C, r1	; 0x80134c <MMU2::mmu2+0x2>
        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 <eeprom_update_byte>
}

/// 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 <MMU2::MMU2::Status() [clone .constprop.342]>
   34dea:	74 cf       	rjmp	.-280    	; 0x34cd4 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]+0x5a>

00034dec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]>:
    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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]>
    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 <MMU2::mmu2+0x3>
   34e26:	87 fd       	sbrc	r24, 7
        ActivatePlannedRequest();
   34e28:	0f 94 c1 a4 	call	0x34982	; 0x34982 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]>
   34e2c:	90 91 4d 13 	lds	r25, 0x134D	; 0x80134d <MMU2::mmu2+0x3>
    }
    return Processing;
}

StepStatus ProtocolLogic::ScopeStep() {
    if (!ExpectsResponse()) {
   34e30:	97 ff       	sbrs	r25, 7
   34e32:	7d c0       	rjmp	.+250    	; 0x34f2e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x142>
        // we are waiting for something
        switch (currentScope) {
   34e34:	80 91 4c 13 	lds	r24, 0x134C	; 0x80134c <MMU2::mmu2+0x2>
   34e38:	82 30       	cpi	r24, 0x02	; 2
   34e3a:	b1 f0       	breq	.+44     	; 0x34e68 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x7c>
   34e3c:	08 f4       	brcc	.+2      	; 0x34e40 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x54>
   34e3e:	75 c0       	rjmp	.+234    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
   34e40:	83 30       	cpi	r24, 0x03	; 3
   34e42:	e1 f1       	breq	.+120    	; 0x34ebc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xd0>
   34e44:	84 30       	cpi	r24, 0x04	; 4
   34e46:	09 f4       	brne	.+2      	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>
   34e48:	54 c0       	rjmp	.+168    	; 0x34ef2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x106>
        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 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.329]>
   34e4e:	81 11       	cpse	r24, r1
   34e50:	6b c3       	rjmp	.+1750   	; 0x35528 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x73c>
    // 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 <MMU2::mmu2+0x1d>
    currentScope = Scope::Idle;
   34e58:	83 e0       	ldi	r24, 0x03	; 3
   34e5a:	80 93 4c 13 	sts	0x134C, r24	; 0x80134c <MMU2::mmu2+0x2>
    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 <MMU2::mmu2+0x3>
        // 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
    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 <millis2>
   34e6c:	ab 01       	movw	r20, r22
   34e6e:	bc 01       	movw	r22, r24
   34e70:	80 91 59 13 	lds	r24, 0x1359	; 0x801359 <MMU2::mmu2+0xf>
   34e74:	90 91 5a 13 	lds	r25, 0x135A	; 0x80135a <MMU2::mmu2+0x10>
   34e78:	a0 91 5b 13 	lds	r26, 0x135B	; 0x80135b <MMU2::mmu2+0x11>
   34e7c:	b0 91 5c 13 	lds	r27, 0x135C	; 0x80135c <MMU2::mmu2+0x12>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xa8>
   34e92:	4b c0       	rjmp	.+150    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
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 <fgetc>
        while (uart->read() != -1)
   34e9c:	01 96       	adiw	r24, 0x01	; 1
   34e9e:	d1 f7       	brne	.-12     	; 0x34e94 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xa8>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::StartSeq;
   34ea6:	80 93 4c 13 	sts	0x134C, r24	; 0x80134c <MMU2::mmu2+0x2>
        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 <MMU2::mmu2+0x24>
    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 <MMU2::mmu2+0x4>
    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 <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.309]>
   34eba:	37 c0       	rjmp	.+110    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
    }
    return Processing;
}

StepStatus ProtocolLogic::IdleWait() {
    if (scopeState == ScopeState::Ready) { // check timeout
   34ebc:	92 38       	cpi	r25, 0x82	; 130
   34ebe:	29 f6       	brne	.-118    	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>
    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 <millis2>
   34ec4:	ab 01       	movw	r20, r22
   34ec6:	bc 01       	movw	r22, r24
   34ec8:	80 91 59 13 	lds	r24, 0x1359	; 0x801359 <MMU2::mmu2+0xf>
   34ecc:	90 91 5a 13 	lds	r25, 0x135A	; 0x80135a <MMU2::mmu2+0x10>
   34ed0:	a0 91 5b 13 	lds	r26, 0x135B	; 0x80135b <MMU2::mmu2+0x11>
   34ed4:	b0 91 5c 13 	lds	r27, 0x135C	; 0x80135c <MMU2::mmu2+0x12>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x100>
   34eea:	af cf       	rjmp	.-162    	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>

void ProtocolLogic::SwitchFromStartToIdle() {
    state = State::Running;
    currentScope = Scope::Idle;
    IdleRestart();
    SendQuery(); // force sending Q0 immediately
   34eec:	0f 94 91 a5 	call	0x34b22	; 0x34b22 <MMU2::ProtocolLogic::SendQuery() [clone .constprop.304]>
   34ef0:	1c c0       	rjmp	.+56     	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
}

bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
   34ef2:	0f 94 28 2a 	call	0x25450	; 0x25450 <millis2>
   34ef6:	ab 01       	movw	r20, r22
   34ef8:	bc 01       	movw	r22, r24
   34efa:	80 91 59 13 	lds	r24, 0x1359	; 0x801359 <MMU2::mmu2+0xf>
   34efe:	90 91 5a 13 	lds	r25, 0x135A	; 0x80135a <MMU2::mmu2+0x10>
   34f02:	a0 91 5b 13 	lds	r26, 0x135B	; 0x80135b <MMU2::mmu2+0x11>
   34f06:	b0 91 5c 13 	lds	r27, 0x135C	; 0x80135c <MMU2::mmu2+0x12>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x100>
};

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 <MMU2::WhereIsFilament()>
    if (fs != lastFSensor) {
   34f20:	90 91 8e 13 	lds	r25, 0x138E	; 0x80138e <MMU2::mmu2+0x44>
   34f24:	89 13       	cpse	r24, r25
        SendAndUpdateFilamentSensor();
   34f26:	0f 94 b0 a5 	call	0x34b60	; 0x34b60 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.302]>
        // 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>

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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x22a>
    ++i;
    return i;
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
   34f4a:	23 30       	cpi	r18, 0x03	; 3
   34f4c:	09 f4       	brne	.+2      	; 0x34f50 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x164>
   34f4e:	e0 c0       	rjmp	.+448    	; 0x35110 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x324>
   34f50:	24 30       	cpi	r18, 0x04	; 4
   34f52:	09 f0       	breq	.+2      	; 0x34f56 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x16a>
   34f54:	83 c0       	rjmp	.+262    	; 0x3505c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x270>
    }
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x174>
   34f5e:	f8 c0       	rjmp	.+496    	; 0x35150 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x364>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x17e>
   34f68:	f3 c0       	rjmp	.+486    	; 0x35150 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x364>

    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x184>
   34f6e:	fa c0       	rjmp	.+500    	; 0x35164 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x378>
            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 <MMU2::mmu2+0x29>
   34f74:	8f e6       	ldi	r24, 0x6F	; 111
   34f76:	93 e1       	ldi	r25, 0x13	; 19
   34f78:	0f 94 70 c5 	call	0x38ae0	; 0x38ae0 <modules::protocol::ResponseMsg::ComputeCRC8() const>
   34f7c:	48 12       	cpse	r4, r24
   34f7e:	b8 c0       	rjmp	.+368    	; 0x350f0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x304>
                // 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 <MMU2::mmu2+0x24>

    /// @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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1a2>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1b4>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1c6>
    }
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1e4>
   34fce:	cd c0       	rjmp	.+410    	; 0x3516a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x37e>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1f0>
            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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1de>
}

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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1fc>
   34fe6:	56 c0       	rjmp	.+172    	; 0x35094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2a8>
   34fe8:	8b 34       	cpi	r24, 0x4B	; 75
   34fea:	08 f0       	brcs	.+2      	; 0x34fee <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x202>
   34fec:	46 c0       	rjmp	.+140    	; 0x3507a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x28e>
   34fee:	82 34       	cpi	r24, 0x42	; 66
   34ff0:	09 f4       	brne	.+2      	; 0x34ff4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x208>
   34ff2:	43 c0       	rjmp	.+134    	; 0x3507a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x28e>
   34ff4:	e0 f5       	brcc	.+120    	; 0x3506e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x282>
   34ff6:	8a 30       	cpi	r24, 0x0A	; 10
   34ff8:	59 f0       	breq	.+22     	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
   34ffa:	8d 30       	cpi	r24, 0x0D	; 13
   34ffc:	49 f0       	breq	.+18     	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
        } 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 <MMU2::mmu2+0x24>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x424>
   35006:	1f 36       	cpi	r17, 0x6F	; 111
   35008:	09 f0       	breq	.+2      	; 0x3500c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x220>
   3500a:	fc c3       	rjmp	.+2040   	; 0x35804 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xa18>
            ++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 <fgetc>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x436>
        ++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 <MMU2::mmu2+0x3d>
   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 <MMU2::mmu2+0x3d>
    ++i;
    return i;
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
   35046:	20 91 6e 13 	lds	r18, 0x136E	; 0x80136e <MMU2::mmu2+0x24>
   3504a:	22 30       	cpi	r18, 0x02	; 2
   3504c:	09 f4       	brne	.+2      	; 0x35050 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x264>
   3504e:	48 c0       	rjmp	.+144    	; 0x350e0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2f4>
   35050:	08 f0       	brcs	.+2      	; 0x35054 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x268>
   35052:	7b cf       	rjmp	.-266    	; 0x34f4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x15e>
   35054:	22 23       	and	r18, r18
   35056:	29 f2       	breq	.-118    	; 0x34fe2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x1f6>
   35058:	21 30       	cpi	r18, 0x01	; 1
   3505a:	51 f1       	breq	.+84     	; 0x350b0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2c4>

    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x276>
   35060:	8f cf       	rjmp	.-226    	; 0x34f80 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x194>
   35062:	1d 30       	cpi	r17, 0x0D	; 13
   35064:	09 f4       	brne	.+2      	; 0x35068 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x27c>
   35066:	8c cf       	rjmp	.-232    	; 0x34f80 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x194>
    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 <MMU2::mmu2+0x2a>
   3506c:	ca cf       	rjmp	.-108    	; 0x35002 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x216>
}

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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x212>
   35072:	87 34       	cpi	r24, 0x47	; 71
   35074:	10 f0       	brcs	.+4      	; 0x3507a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x28e>
   35076:	88 34       	cpi	r24, 0x48	; 72
   35078:	11 f6       	brne	.-124    	; 0x34ffe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x212>
        case 'K':
        case 'F':
        case 'f':
        case 'H':
        case 'R':
            responseMsg.request.code = (RequestMsgCodes)c;
   3507a:	80 93 6f 13 	sts	0x136F, r24	; 0x80136f <MMU2::mmu2+0x25>
            responseMsg.request.value = 0;
   3507e:	10 92 70 13 	sts	0x1370, r1	; 0x801370 <MMU2::mmu2+0x26>
            responseMsg.request.value2 = 0;
   35082:	10 92 72 13 	sts	0x1372, r1	; 0x801372 <MMU2::mmu2+0x28>
   35086:	10 92 71 13 	sts	0x1371, r1	; 0x801371 <MMU2::mmu2+0x27>
            responseMsg.request.crc8 = 0;
   3508a:	10 92 73 13 	sts	0x1373, r1	; 0x801373 <MMU2::mmu2+0x29>
            rspState = ResponseStates::RequestValue;
   3508e:	90 92 6e 13 	sts	0x136E, r9	; 0x80136e <MMU2::mmu2+0x24>
   35092:	be cf       	rjmp	.-132    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
}

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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2bc>
   35098:	87 35       	cpi	r24, 0x57	; 87
   3509a:	78 f7       	brcc	.-34     	; 0x3507a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x28e>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2ba>
   350a4:	ac cf       	rjmp	.-168    	; 0x34ffe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x212>
   350a6:	e9 cf       	rjmp	.-46     	; 0x3507a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x28e>
   350a8:	86 36       	cpi	r24, 0x66	; 102
   350aa:	09 f0       	breq	.+2      	; 0x350ae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2c2>
   350ac:	a8 cf       	rjmp	.-176    	; 0x34ffe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x212>
   350ae:	e5 cf       	rjmp	.-54     	; 0x3507a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x28e>
    }
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2e0>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2e0>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x2da>
   350c4:	9c cf       	rjmp	.-200    	; 0x34ffe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x212>
            rspState = ResponseStates::ParamCode;
   350c6:	60 92 6e 13 	sts	0x136E, r6	; 0x80136e <MMU2::mmu2+0x24>
   350ca:	a2 cf       	rjmp	.-188    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
            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 <modules::protocol::Protocol::Char2Nibble(unsigned char)>
            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 <MMU2::mmu2+0x26>
   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 <MMU2::mmu2+0x26>
   350de:	98 cf       	rjmp	.-208    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
        } 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x30a>
   350e4:	85 34       	cpi	r24, 0x45	; 69
   350e6:	58 f4       	brcc	.+22     	; 0x350fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x312>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x312>
            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 <MMU2::mmu2+0x2a>
   350f4:	84 cf       	rjmp	.-248    	; 0x34ffe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x212>
        } 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x312>
   350fa:	82 35       	cpi	r24, 0x52	; 82
   350fc:	c9 f7       	brne	.-14     	; 0x350f0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x304>
        case 'E':
        case 'F':
        case 'A':
        case 'R':
        case 'B':
            rspState = ResponseStates::ParamValue;
   350fe:	80 92 6e 13 	sts	0x136E, r8	; 0x80136e <MMU2::mmu2+0x24>
            responseMsg.paramCode = (ResponseMsgParamCodes)c;
   35102:	80 93 74 13 	sts	0x1374, r24	; 0x801374 <MMU2::mmu2+0x2a>
            responseMsg.paramValue = 0;
   35106:	10 92 76 13 	sts	0x1376, r1	; 0x801376 <MMU2::mmu2+0x2c>
   3510a:	10 92 75 13 	sts	0x1375, r1	; 0x801375 <MMU2::mmu2+0x2b>
   3510e:	80 cf       	rjmp	.-256    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x33e>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x33e>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x304>
            rspState = ResponseStates::CRC;
   35124:	70 92 6e 13 	sts	0x136E, r7	; 0x80136e <MMU2::mmu2+0x24>
   35128:	73 cf       	rjmp	.-282    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
            return DecodeStatus::Error;
        }
    case ResponseStates::ParamValue:
        if (IsHexDigit(c)) {
            responseMsg.paramValue <<= 4U;
            responseMsg.paramValue += Char2Nibble(c);
   3512a:	0f 94 4f c5 	call	0x38a9e	; 0x38a9e <modules::protocol::Protocol::Char2Nibble(unsigned char)>
            rspState = ResponseStates::Error;
            return DecodeStatus::Error;
        }
    case ResponseStates::ParamValue:
        if (IsHexDigit(c)) {
            responseMsg.paramValue <<= 4U;
   3512e:	20 91 75 13 	lds	r18, 0x1375	; 0x801375 <MMU2::mmu2+0x2b>
   35132:	30 91 76 13 	lds	r19, 0x1376	; 0x801376 <MMU2::mmu2+0x2c>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x34c>
            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 <MMU2::mmu2+0x2c>
   3514a:	80 93 75 13 	sts	0x1375, r24	; 0x801375 <MMU2::mmu2+0x2b>
   3514e:	60 cf       	rjmp	.-320    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>
            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 <modules::protocol::Protocol::Char2Nibble(unsigned char)>
            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 <MMU2::mmu2+0x29>
   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 <MMU2::mmu2+0x29>
   35162:	56 cf       	rjmp	.-340    	; 0x35010 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x224>

    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x304>
   35168:	03 cf       	rjmp	.-506    	; 0x34f70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x184>
        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 <MMU2::mmu2+0x3d>
}

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 <serialprintPGM(char const*)>
   3517e:	8c ee       	ldi	r24, 0xEC	; 236
   35180:	9a ea       	ldi	r25, 0xAA	; 170
   35182:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
   35186:	ce 01       	movw	r24, r28
   35188:	01 96       	adiw	r24, 0x01	; 1
   3518a:	0f 94 f4 d5 	call	0x3abe8	; 0x3abe8 <MarlinSerial::println(char const*)>
        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 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.339]>
        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 <MMU2::mmu2+0x2>
   35196:	81 30       	cpi	r24, 0x01	; 1
   35198:	09 f4       	brne	.+2      	; 0x3519c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3b0>
   3519a:	74 c0       	rjmp	.+232    	; 0x35284 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x498>
   3519c:	08 f4       	brcc	.+2      	; 0x351a0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3b4>
   3519e:	c5 ce       	rjmp	.-630    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
   351a0:	83 30       	cpi	r24, 0x03	; 3
   351a2:	09 f4       	brne	.+2      	; 0x351a6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3ba>
   351a4:	d1 c0       	rjmp	.+418    	; 0x35348 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x55c>
   351a6:	84 30       	cpi	r24, 0x04	; 4
   351a8:	09 f0       	breq	.+2      	; 0x351ac <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3c0>
   351aa:	4f ce       	rjmp	.-866    	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>
        return ProtocolError;
    }
}

StepStatus ProtocolLogic::CommandStep() {
    switch (scopeState) {
   351ac:	80 91 4d 13 	lds	r24, 0x134D	; 0x80134d <MMU2::mmu2+0x3>
   351b0:	86 30       	cpi	r24, 0x06	; 6
   351b2:	09 f4       	brne	.+2      	; 0x351b6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3ca>
   351b4:	6c c1       	rjmp	.+728    	; 0x3548e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6a2>
   351b6:	08 f0       	brcs	.+2      	; 0x351ba <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3ce>
   351b8:	93 c1       	rjmp	.+806    	; 0x354e0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6f4>
   351ba:	84 30       	cpi	r24, 0x04	; 4
   351bc:	09 f4       	brne	.+2      	; 0x351c0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3d4>
   351be:	09 c1       	rjmp	.+530    	; 0x353d2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e6>
   351c0:	85 30       	cpi	r24, 0x05	; 5
   351c2:	09 f0       	breq	.+2      	; 0x351c6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3da>
   351c4:	cc c0       	rjmp	.+408    	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
    case ScopeState::CommandSent: {
        switch (rsp.paramCode) { // the response should be either accepted or rejected
   351c6:	80 91 64 13 	lds	r24, 0x1364	; 0x801364 <MMU2::mmu2+0x1a>
   351ca:	81 34       	cpi	r24, 0x41	; 65
   351cc:	09 f4       	brne	.+2      	; 0x351d0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3e4>
   351ce:	96 c1       	rjmp	.+812    	; 0x354fc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x710>
   351d0:	82 35       	cpi	r24, 0x52	; 82
   351d2:	09 f0       	breq	.+2      	; 0x351d6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3ea>
   351d4:	c4 c0       	rjmp	.+392    	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
            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 <MMU2::mmu2+0x42>
            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 <MMU2::mmu2+0x41>
   351e2:	80 93 8a 13 	sts	0x138A, r24	; 0x80138a <MMU2::mmu2+0x40>
    } 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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]>
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 <MMU2::mmu2+0x3>
    SendMsg(rq);
   351f4:	40 91 4f 13 	lds	r20, 0x134F	; 0x80134f <MMU2::mmu2+0x5>
   351f8:	50 91 50 13 	lds	r21, 0x1350	; 0x801350 <MMU2::mmu2+0x6>
   351fc:	60 91 51 13 	lds	r22, 0x1351	; 0x801351 <MMU2::mmu2+0x7>
   35200:	70 91 52 13 	lds	r23, 0x1352	; 0x801352 <MMU2::mmu2+0x8>
   35204:	80 91 53 13 	lds	r24, 0x1353	; 0x801353 <MMU2::mmu2+0x9>
   35208:	0f 94 93 67 	call	0x2cf26	; 0x2cf26 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.336]>
   3520c:	16 e0       	ldi	r17, 0x06	; 6
   3520e:	07 c1       	rjmp	.+526    	; 0x3541e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x42a>
   35214:	f7 c2       	rjmp	.+1518   	; 0x35804 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xa18>
        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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]>
   3521e:	18 e0       	ldi	r17, 0x08	; 8
   35220:	fe c0       	rjmp	.+508    	; 0x3541e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x440>
        RecordUARTActivity(); // something has happened on the UART, update the timeout record
   35226:	0f 94 8d 66 	call	0x2cd1a	; 0x2cd1a <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.339]>
   3522a:	7f ce       	rjmp	.-770    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
    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 <millis2>
   35230:	ab 01       	movw	r20, r22
   35232:	bc 01       	movw	r22, r24
   35234:	80 91 59 13 	lds	r24, 0x1359	; 0x801359 <MMU2::mmu2+0xf>
   35238:	90 91 5a 13 	lds	r25, 0x135A	; 0x80135a <MMU2::mmu2+0x10>
   3523c:	a0 91 5b 13 	lds	r26, 0x135B	; 0x80135b <MMU2::mmu2+0x11>
   35240:	b0 91 5c 13 	lds	r27, 0x135C	; 0x80135c <MMU2::mmu2+0x12>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x46c>
   35256:	69 ce       	rjmp	.-814    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
   35258:	80 91 4c 13 	lds	r24, 0x134C	; 0x80134c <MMU2::mmu2+0x2>
   3525c:	88 23       	and	r24, r24
   3525e:	09 f4       	brne	.+2      	; 0x35262 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x476>
   35260:	64 ce       	rjmp	.-824    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
        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 <MMU2::mmu2+0x24>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::StartSeq;
   3526c:	80 93 4c 13 	sts	0x134C, r24	; 0x80134c <MMU2::mmu2+0x2>
    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 <MMU2::mmu2+0x4>
    SendVersion(0);
   35276:	80 e0       	ldi	r24, 0x00	; 0
   35278:	0f 94 70 a5 	call	0x34ae0	; 0x34ae0 <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.309]>

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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x58a>
    return Finished;
}

StepStatus ProtocolLogic::StartSeqStep() {
    // solve initial handshake
    switch (scopeState) {
   35284:	10 91 4d 13 	lds	r17, 0x134D	; 0x80134d <MMU2::mmu2+0x3>
   35288:	13 30       	cpi	r17, 0x03	; 3
   3528a:	b1 f1       	breq	.+108    	; 0x352f8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x50c>
   3528c:	60 f0       	brcs	.+24     	; 0x352a6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4ba>
   3528e:	16 30       	cpi	r17, 0x06	; 6
   35290:	09 f4       	brne	.+2      	; 0x35294 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4a8>
   35292:	50 c0       	rjmp	.+160    	; 0x35334 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x548>
   35294:	19 30       	cpi	r17, 0x09	; 9
   35296:	09 f0       	breq	.+2      	; 0x3529a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4ae>
   35298:	be cf       	rjmp	.-132    	; 0x35216 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x42a>
            // 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 <MMU2::ProtocolLogic::ProcessWritingInitRegister() [clone .constprop.301]>
   3529e:	88 23       	and	r24, r24
   352a0:	09 f4       	brne	.+2      	; 0x352a4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4b8>
   352a2:	43 ce       	rjmp	.-890    	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
   352a4:	40 ce       	rjmp	.-896    	; 0x34f26 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13a>
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 <MMU2::mmu2+0x15>
   352aa:	83 35       	cpi	r24, 0x53	; 83
   352ac:	21 f4       	brne	.+8      	; 0x352b6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4ca>
   352ae:	80 91 60 13 	lds	r24, 0x1360	; 0x801360 <MMU2::mmu2+0x16>
   352b2:	18 17       	cp	r17, r24
   352b4:	11 f0       	breq	.+4      	; 0x352ba <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4ce>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xca>
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 <MMU2::mmu2+0x1b>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4f8>
            if (--retries == 0) {
   352d4:	80 91 4e 13 	lds	r24, 0x134E	; 0x80134e <MMU2::mmu2+0x4>
   352d8:	81 50       	subi	r24, 0x01	; 1
   352da:	80 93 4e 13 	sts	0x134E, r24	; 0x80134e <MMU2::mmu2+0x4>
   352de:	81 11       	cpse	r24, r1
   352e0:	ea cf       	rjmp	.-44     	; 0x352b6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x4ca>
   352e2:	99 cf       	rjmp	.-206    	; 0x35216 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x42a>
    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 <serialprintlnPGM(char const*)>

    /// @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 <MMU2::mmu2+0x14>
            } 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xca>
    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 <MMU2::mmu2+0x15>
   352fc:	83 35       	cpi	r24, 0x53	; 83
   352fe:	21 f4       	brne	.+8      	; 0x35308 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x51c>
   35300:	80 91 60 13 	lds	r24, 0x1360	; 0x801360 <MMU2::mmu2+0x16>
   35304:	83 30       	cpi	r24, 0x03	; 3
   35306:	11 f0       	breq	.+4      	; 0x3530c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x520>
            // 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xca>
        } else {
            mmuFwVersionBuild = rsp.paramValue; // just register the build number
   3530c:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   35310:	90 91 66 13 	lds	r25, 0x1366	; 0x801366 <MMU2::mmu2+0x1c>
   35314:	90 93 9d 13 	sts	0x139D, r25	; 0x80139d <MMU2::mmu2+0x53>
   35318:	80 93 9c 13 	sts	0x139C, r24	; 0x80139c <MMU2::mmu2+0x52>
    }
    return ScopeState::Reading16bitRegisters;
}

void ProtocolLogic::StartWritingInitRegisters() {
    regIndex = 0;
   3531c:	10 92 98 13 	sts	0x1398, r1	; 0x801398 <MMU2::mmu2+0x4e>
    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 <MMU2::mmu2+0x4c>
   3532a:	70 e0       	ldi	r23, 0x00	; 0
   3532c:	49 e0       	ldi	r20, 0x09	; 9
   3532e:	0f 94 fe 67 	call	0x2cffc	; 0x2cffc <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.332]>
   35332:	fb cd       	rjmp	.-1034   	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::Idle;
   3533a:	83 e0       	ldi	r24, 0x03	; 3
   3533c:	80 93 4c 13 	sts	0x134C, r24	; 0x80134c <MMU2::mmu2+0x2>
    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 <MMU2::mmu2+0x3>
   35346:	d2 cd       	rjmp	.-1116   	; 0x34eec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x100>
    }
    return Finished;
}

StepStatus ProtocolLogic::IdleStep() {
    switch (scopeState) {
   35348:	80 91 4d 13 	lds	r24, 0x134D	; 0x80134d <MMU2::mmu2+0x3>
   3534c:	88 30       	cpi	r24, 0x08	; 8
   3534e:	09 f4       	brne	.+2      	; 0x35352 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x566>
   35350:	b7 c0       	rjmp	.+366    	; 0x354c0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6d4>
   35352:	a8 f4       	brcc	.+42     	; 0x3537e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x592>
   35354:	84 30       	cpi	r24, 0x04	; 4
   35356:	d9 f0       	breq	.+54     	; 0x3538e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5a2>
   35358:	87 30       	cpi	r24, 0x07	; 7
   3535a:	09 f4       	brne	.+2      	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
   3535c:	ae c0       	rjmp	.+348    	; 0x354ba <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6ce>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::DelayedRestart;
   35364:	82 e0       	ldi	r24, 0x02	; 2
   35366:	80 93 4c 13 	sts	0x134C, r24	; 0x80134c <MMU2::mmu2+0x2>
    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 <MMU2::mmu2+0x3>
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 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.310]>
   3537a:	18 2f       	mov	r17, r24
   3537c:	50 c0       	rjmp	.+160    	; 0x3541e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
    }
    return Finished;
}

StepStatus ProtocolLogic::IdleStep() {
    switch (scopeState) {
   3537e:	8a 30       	cpi	r24, 0x0A	; 10
   35380:	09 f4       	brne	.+2      	; 0x35384 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x598>
   35382:	a7 c0       	rjmp	.+334    	; 0x354d2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6e6>
   35384:	60 f3       	brcs	.-40     	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
   35386:	8d 30       	cpi	r24, 0x0D	; 13
   35388:	08 f4       	brcc	.+2      	; 0x3538c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5a0>
   3538a:	5f cd       	rjmp	.-1346   	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>
   3538c:	e8 cf       	rjmp	.-48     	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
    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 <MMU2::mmu2+0x15>
   35392:	8e 34       	cpi	r24, 0x4E	; 78
   35394:	60 f5       	brcc	.+88     	; 0x353ee <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x602>
   35396:	8b 34       	cpi	r24, 0x4B	; 75
   35398:	10 f4       	brcc	.+4      	; 0x3539e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5b2>
   3539a:	85 34       	cpi	r24, 0x45	; 69
   3539c:	01 f7       	brne	.-64     	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
        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 <MMU2::mmu2+0x1a>
   353a2:	86 34       	cpi	r24, 0x46	; 70
   353a4:	09 f4       	brne	.+2      	; 0x353a8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5bc>
   353a6:	73 c0       	rjmp	.+230    	; 0x3548e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6a2>
        return true;
    }
}

StepStatus ProtocolLogic::SwitchFromIdleToCommand() {
    currentScope = Scope::Command;
   353a8:	84 e0       	ldi	r24, 0x04	; 4
   353aa:	80 93 4c 13 	sts	0x134C, r24	; 0x80134c <MMU2::mmu2+0x2>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5cc>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5de>
        default:
            return ProtocolError;
        }
    } break;
    case ScopeState::QuerySent:
        return ProcessCommandQueryResponse();
   353d2:	0f 94 d3 a5 	call	0x34ba6	; 0x34ba6 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.288]>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
   353dc:	08 f0       	brcs	.+2      	; 0x353e0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5f4>
   353de:	9c c0       	rjmp	.+312    	; 0x35518 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x72c>
   353e0:	82 30       	cpi	r24, 0x02	; 2
   353e2:	09 f4       	brne	.+2      	; 0x353e6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5fa>
   353e4:	32 cd       	rjmp	.-1436   	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>
   353e6:	84 30       	cpi	r24, 0x04	; 4
   353e8:	09 f4       	brne	.+2      	; 0x353ec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x600>
   353ea:	3b cf       	rjmp	.-394    	; 0x35262 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x476>
   353ec:	18 c0       	rjmp	.+48     	; 0x3541e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x608>
   353f2:	b5 cf       	rjmp	.-150    	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
   353f4:	86 35       	cpi	r24, 0x56	; 86
   353f6:	98 f2       	brcs	.-90     	; 0x3539e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5b2>
   353f8:	88 35       	cpi	r24, 0x58	; 88
   353fa:	09 f0       	breq	.+2      	; 0x353fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x612>
   353fc:	b0 cf       	rjmp	.-160    	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
            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 <MMU2::mmu2+0x1a>
   35402:	86 34       	cpi	r24, 0x46	; 70
   35404:	89 f1       	breq	.+98     	; 0x35468 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x67c>
   35406:	80 35       	cpi	r24, 0x50	; 80
   35408:	c1 f1       	breq	.+112    	; 0x3547a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x68e>
   3540a:	82 34       	cpi	r24, 0x42	; 66
   3540c:	09 f0       	breq	.+2      	; 0x35410 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x624>
   3540e:	42 c0       	rjmp	.+132    	; 0x35494 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6a8>
            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<Buttons>(rsp.paramValue);
   35410:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   35414:	80 93 8d 13 	sts	0x138D, r24	; 0x80138d <MMU2::mmu2+0x43>
                StartReading8bitRegisters();
   35418:	0f 94 81 a4 	call	0x34902	; 0x34902 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.295]>
                return ButtonPushed;
   3541c:	1b e0       	ldi	r17, 0x0B	; 11
   3541e:	80 91 4a 13 	lds	r24, 0x134A	; 0x80134a <MMU2::mmu2>
   35422:	90 91 4b 13 	lds	r25, 0x134B	; 0x80134b <MMU2::mmu2+0x1>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x642>
   3542c:	ee c1       	rjmp	.+988    	; 0x3580a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xa1e>

    const StepStatus ss = logic.Step();
    switch (ss) {
   3542e:	12 30       	cpi	r17, 0x02	; 2
   35430:	09 f4       	brne	.+2      	; 0x35434 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x648>
   35432:	90 c0       	rjmp	.+288    	; 0x35554 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x768>
   35434:	08 f0       	brcs	.+2      	; 0x35438 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x64c>
   35436:	7d c0       	rjmp	.+250    	; 0x35532 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x746>
   35438:	11 23       	and	r17, r17
   3543a:	09 f4       	brne	.+2      	; 0x3543e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x652>
   3543c:	18 c1       	rjmp	.+560    	; 0x3566e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x882>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x658>
   35442:	e4 c0       	rjmp	.+456    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
            switch (ss) {
   35444:	17 30       	cpi	r17, 0x07	; 7
   35446:	09 f4       	brne	.+2      	; 0x3544a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x65e>
   35448:	c4 c1       	rjmp	.+904    	; 0x357d2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9e6>
   3544a:	08 f0       	brcs	.+2      	; 0x3544e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x662>
   3544c:	b8 c1       	rjmp	.+880    	; 0x357be <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9d2>
   3544e:	14 30       	cpi	r17, 0x04	; 4
   35450:	09 f4       	brne	.+2      	; 0x35454 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x668>
   35452:	c7 c1       	rjmp	.+910    	; 0x357e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9f6>
   35454:	15 30       	cpi	r17, 0x05	; 5
   35456:	09 f0       	breq	.+2      	; 0x3545a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x66e>
   35458:	d9 c0       	rjmp	.+434    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
                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 <MMU2::mmu2+0x6f>
                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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9f0>
                // to prepare, then pass it back to the MMU so it can work its magic.
                buttonCode = static_cast<Buttons>(rsp.paramValue);
                StartReading8bitRegisters();
                return ButtonPushed;
            case ResponseMsgParamCodes::Finished:
                if (ReqMsg().code != RequestMsgCodes::unknown) {
   35468:	80 91 4f 13 	lds	r24, 0x134F	; 0x80134f <MMU2::mmu2+0x5>
   3546c:	88 23       	and	r24, r24
   3546e:	29 f0       	breq	.+10     	; 0x3547a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x68e>
    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 <MMU2::mmu2+0x3>
            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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
                }
                [[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<ProgressCode>(rsp.paramValue);
   3547a:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   3547e:	80 93 8c 13 	sts	0x138C, r24	; 0x80138c <MMU2::mmu2+0x42>
                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 <MMU2::mmu2+0x41>
   3548a:	80 93 8a 13 	sts	0x138A, r24	; 0x80138a <MMU2::mmu2+0x40>
        }
    } break;
    case ScopeState::QuerySent:
        return ProcessCommandQueryResponse();
    case ScopeState::FilamentSensorStateSent:
        StartReading8bitRegisters();
   3548e:	0f 94 81 a4 	call	0x34902	; 0x34902 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.295]>
   35492:	4b cd       	rjmp	.-1386   	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
                // The MMU sends e.g. X0 P27 after its restart when the user presses an MMU button to move the Selector
                progressCode = static_cast<ProgressCode>(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 <MMU2::mmu2+0x42>
                errorCode = static_cast<ErrorCode>(rsp.paramValue);
   3549a:	80 91 65 13 	lds	r24, 0x1365	; 0x801365 <MMU2::mmu2+0x1b>
   3549e:	90 91 66 13 	lds	r25, 0x1366	; 0x801366 <MMU2::mmu2+0x1c>
   354a2:	90 93 8b 13 	sts	0x138B, r25	; 0x80138b <MMU2::mmu2+0x41>
   354a6:	80 93 8a 13 	sts	0x138A, r24	; 0x80138a <MMU2::mmu2+0x40>
                StartReading8bitRegisters(); // continue Idle state without restarting the communication
   354aa:	0f 94 81 a4 	call	0x34902	; 0x34902 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.295]>
        // @@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 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.314]>
   354b6:	17 e0       	ldi	r17, 0x07	; 7
   354b8:	b2 cf       	rjmp	.-156    	; 0x3541e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
            return ProtocolError;
        }
        StartReading8bitRegisters();
        return Processing;
    case ScopeState::Reading8bitRegisters:
        ProcessRead8bitRegister();
   354ba:	0f 94 a5 a4 	call	0x3494a	; 0x3494a <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.290]>
   354be:	35 cd       	rjmp	.-1430   	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
        return Processing;
    case ScopeState::Reading16bitRegisters:
        scopeState = ProcessRead16bitRegister(ScopeState::Ready);
   354c0:	82 e8       	ldi	r24, 0x82	; 130
   354c2:	0f 94 89 a4 	call	0x34912	; 0x34912 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.292]>
   354c6:	80 93 4d 13 	sts	0x134D, r24	; 0x80134d <MMU2::mmu2+0x3>
        return scopeState == ScopeState::Ready ? Finished : Processing;
   354ca:	82 38       	cpi	r24, 0x82	; 130
   354cc:	09 f0       	breq	.+2      	; 0x354d0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6e4>
   354ce:	2d cd       	rjmp	.-1446   	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
   354d0:	bc cc       	rjmp	.-1672   	; 0x34e4a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x5e>
    case ScopeState::ButtonSent:
        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
   354d2:	80 91 64 13 	lds	r24, 0x1364	; 0x801364 <MMU2::mmu2+0x1a>
   354d6:	81 34       	cpi	r24, 0x41	; 65
   354d8:	d1 f6       	brne	.-76     	; 0x3548e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6a2>
            // Button was accepted, decrement the retry.
            DecrementRetryAttempts();
   354da:	0f 94 98 66 	call	0x2cd30	; 0x2cd30 <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.293]>
   354de:	d7 cf       	rjmp	.-82     	; 0x3548e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6a2>
        return ProtocolError;
    }
}

StepStatus ProtocolLogic::CommandStep() {
    switch (scopeState) {
   354e0:	88 30       	cpi	r24, 0x08	; 8
   354e2:	b1 f0       	breq	.+44     	; 0x35510 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x724>
   354e4:	50 f3       	brcs	.-44     	; 0x354ba <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6ce>
   354e6:	8a 30       	cpi	r24, 0x0A	; 10
   354e8:	09 f0       	breq	.+2      	; 0x354ec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x700>
   354ea:	39 cf       	rjmp	.-398    	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
        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 <MMU2::mmu2+0x1a>
   354f0:	81 34       	cpi	r24, 0x41	; 65
   354f2:	09 f0       	breq	.+2      	; 0x354f6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x70a>
   354f4:	18 cd       	rjmp	.-1488   	; 0x34f26 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13a>
            // Button was accepted, decrement the retry.
            DecrementRetryAttempts();
   354f6:	0f 94 98 66 	call	0x2cd30	; 0x2cd30 <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.293]>
   354fa:	15 cd       	rjmp	.-1494   	; 0x34f26 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13a>
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 <MMU2::mmu2+0x42>
            errorCode = ErrorCode::RUNNING;
   35500:	10 92 8b 13 	sts	0x138B, r1	; 0x80138b <MMU2::mmu2+0x41>
   35504:	10 92 8a 13 	sts	0x138A, r1	; 0x80138a <MMU2::mmu2+0x40>
            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 <MMU2::mmu2+0x3>
   3550e:	0d cd       	rjmp	.-1510   	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
   35510:	81 e8       	ldi	r24, 0x81	; 129
   35512:	0f 94 89 a4 	call	0x34912	; 0x34912 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.292]>
   35516:	f9 cf       	rjmp	.-14     	; 0x3550a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x71e>
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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x6c2>
   3551c:	08 f4       	brcc	.+2      	; 0x35520 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x734>
   3551e:	63 ce       	rjmp	.-826    	; 0x351e6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x3fa>
   35520:	88 30       	cpi	r24, 0x08	; 8
   35522:	09 f4       	brne	.+2      	; 0x35526 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x73a>
   35524:	78 ce       	rjmp	.-784    	; 0x35216 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x42a>
   35526:	7b cf       	rjmp	.-266    	; 0x3541e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x632>
        // 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 <MMU2::mmu2+0x3>
   3552c:	87 fd       	sbrc	r24, 7
   3552e:	9a cc       	rjmp	.-1740   	; 0x34e64 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x78>
   35530:	fc cc       	rjmp	.-1544   	; 0x34f2a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x13e>
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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x74c>
   35536:	6a c0       	rjmp	.+212    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
   35538:	1b 30       	cpi	r17, 0x0B	; 11
   3553a:	09 f0       	breq	.+2      	; 0x3553e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x752>
   3553c:	80 cf       	rjmp	.-256    	; 0x3543e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x652>
    case Processing:
        OnMMUProgressMsg(logic.Progress());
        break;

    case ButtonPushed:
        lastButton = logic.Button();
   3553e:	80 91 8d 13 	lds	r24, 0x138D	; 0x80138d <MMU2::mmu2+0x43>
   35542:	80 93 b4 13 	sts	0x13B4, r24	; 0x8013b4 <MMU2::mmu2+0x6a>
        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 <MMU2::LogEchoEvent_P(char const*)>
        CheckUserInput(); // Process the button immediately
   3554e:	0f 94 3d a6 	call	0x34c7a	; 0x34c7a <MMU2::MMU2::CheckUserInput() [clone .constprop.202]>
   35552:	5c c0       	rjmp	.+184    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
    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 <MMU2::mmu2+0x45>
   35558:	81 11       	cpse	r24, r1
   3555a:	58 c0       	rjmp	.+176    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
    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 <printJobOngoing()>
        && 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x77a>
   35564:	53 c0       	rjmp	.+166    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
}

// 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x78a>
   35574:	4b c0       	rjmp	.+150    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
        && !saved_printing
   35576:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <saved_printing>
   3557a:	81 11       	cpse	r24, r1
   3557c:	47 c0       	rjmp	.+142    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
        && !mesh_bed_leveling_flag
   3557e:	80 91 a7 0d 	lds	r24, 0x0DA7	; 0x800da7 <mesh_bed_leveling_flag>
   35582:	81 11       	cpse	r24, r1
   35584:	43 c0       	rjmp	.+134    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
        && !homing_flag
   35586:	80 91 a6 0d 	lds	r24, 0x0DA6	; 0x800da6 <homing_flag>
   3558a:	81 11       	cpse	r24, r1
   3558c:	3f c0       	rjmp	.+126    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>

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 <block_buffer_tail>
   35592:	80 91 a4 0d 	lds	r24, 0x0DA4	; 0x800da4 <block_buffer_head>
   35596:	98 17       	cp	r25, r24
   35598:	c9 f1       	breq	.+114    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
  {
    uint8_t block_index = block_buffer_tail;
   3559a:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
}
#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 <block_buffer_head>
   355a6:	38 17       	cp	r19, r24
   355a8:	89 f0       	breq	.+34     	; 0x355cc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x7e0>
    {
      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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x7da>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x7b6>
        && e_active();
   355cc:	99 23       	and	r25, r25
   355ce:	f1 f0       	breq	.+60     	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
        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 <serialprintlnPGM(char const*)>
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 <stop_and_save_print_to_ram(float, float)>
        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 <restore_print_from_ram_and_continue(float)>
    }
}

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 <eeprom_read_byte>
   355f8:	81 30       	cpi	r24, 0x01	; 1
   355fa:	21 f4       	brne	.+8      	; 0x35604 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x818>
        if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=?
   355fc:	0f 94 b0 75 	call	0x2eb60	; 0x2eb60 <MMU2::MMU2::get_current_tool() const [clone .constprop.364]>
   35600:	8f 3f       	cpi	r24, 0xFF	; 255
   35602:	91 f5       	brne	.+100    	; 0x35668 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x87c>
            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 <enquecommand_front(char const*, bool) [clone .constprop.323]>
                break;
            }
        }
    }

    if (logic.Running()) {
   3560c:	80 91 67 13 	lds	r24, 0x1367	; 0x801367 <MMU2::mmu2+0x1d>
   35610:	82 30       	cpi	r24, 0x02	; 2
   35612:	19 f4       	brne	.+6      	; 0x3561a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x82e>
        state = xState::Active;
   35614:	81 e0       	ldi	r24, 0x01	; 1
   35616:	80 93 b9 13 	sts	0x13B9, r24	; 0x8013b9 <MMU2::mmu2+0x6f>
    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 <MMU2::mmu2+0x6e>
// 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x84e>
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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x84e>
   3562e:	80 91 b1 13 	lds	r24, 0x13B1	; 0x8013b1 <MMU2::mmu2+0x67>
   35632:	90 91 b2 13 	lds	r25, 0x13B2	; 0x8013b2 <MMU2::mmu2+0x68>
   35636:	0f 94 31 c7 	call	0x38e62	; 0x38e62 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x81c>
   3566e:	00 91 8c 13 	lds	r16, 0x138C	; 0x80138c <MMU2::mmu2+0x42>
    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 <MMU2::mmu2+0x66>
   35676:	08 17       	cp	r16, r24
   35678:	09 f4       	brne	.+2      	; 0x3567c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x890>
   3567a:	49 c0       	rjmp	.+146    	; 0x3570e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x922>
    // 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 <MMU2::mmu2+0x2>
   35680:	84 30       	cpi	r24, 0x04	; 4
   35682:	b9 f4       	brne	.+46     	; 0x356b2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x8c6>
        break;
    }
}

void ReportProgressHook(CommandInProgress cip, ProgressCode ec) {
    if (cip != CommandInProgress::NoCommand) {
   35684:	80 91 4f 13 	lds	r24, 0x134F	; 0x80134f <MMU2::mmu2+0x5>
   35688:	88 23       	and	r24, r24
   3568a:	99 f0       	breq	.+38     	; 0x356b2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x8c6>
        custom_message_type = CustomMsg::MMUProgress;
   3568c:	89 e0       	ldi	r24, 0x09	; 9
   3568e:	80 93 c3 06 	sts	0x06C3, r24	; 0x8006c3 <custom_message_type>
        : static_cast<const char *>(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<const char *>(pgm_read_ptr(&progressTexts[(uint16_t)pc]))
   35696:	0e 31       	cpi	r16, 0x1E	; 30
   35698:	30 f4       	brcc	.+12     	; 0x356a6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x8ba>
   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<const char *>(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 <lang_get_translation>
   356ae:	0e 94 16 f2 	call	0x1e42c	; 0x1e42c <lcd_setstatuspgm(char const*)>
   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<const char *>(pgm_read_ptr(&progressTexts[(uint16_t)pc]))
   356b6:	0e 31       	cpi	r16, 0x1E	; 30
   356b8:	30 f4       	brcc	.+12     	; 0x356c6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x8da>
   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<const char *>(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 <MMU2::LogEchoEvent_P(char const*)>
    }
}

void MMU2::OnMMUProgressMsgChanged(ProgressCode pc) {
    ReportProgress(pc);
    lastProgressCode = pc;
   356d0:	00 93 b0 13 	sts	0x13B0, r16	; 0x8013b0 <MMU2::mmu2+0x66>
    switch (pc) {
   356d4:	03 30       	cpi	r16, 0x03	; 3
   356d6:	49 f0       	breq	.+18     	; 0x356ea <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x8fe>
   356d8:	0c 31       	cpi	r16, 0x1C	; 28
   356da:	09 f0       	breq	.+2      	; 0x356de <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x8f2>
   356dc:	97 cf       	rjmp	.-210    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   356de:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        }
        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 <MMU2::mmu2+0x71>
   356e8:	91 cf       	rjmp	.-222    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
   356ea:	80 91 4c 13 	lds	r24, 0x134C	; 0x80134c <MMU2::mmu2+0x2>
   356ee:	84 30       	cpi	r24, 0x04	; 4
   356f0:	31 f4       	brne	.+12     	; 0x356fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x912>
    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 <MMU2::mmu2+0x5>
   356f6:	84 55       	subi	r24, 0x54	; 84
   356f8:	82 30       	cpi	r24, 0x02	; 2
   356fa:	08 f4       	brcc	.+2      	; 0x356fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x912>
   356fc:	87 cf       	rjmp	.-242    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
   356fe:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
            // 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 <MMU2::mmu2+0x72>
        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 <MMU2::MMU2::HelpUnloadToFinda() [clone .constprop.203]>
   3570c:	7f cf       	rjmp	.-258    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x982>
   35712:	0c 31       	cpi	r16, 0x1C	; 28
   35714:	09 f0       	breq	.+2      	; 0x35718 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x92c>
   35716:	7a cf       	rjmp	.-268    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
                unloadFilamentStarted = false;
            }
        }
        break;
    case ProgressCode::FeedingToFSensor:
        if (loadFilamentStarted) {
   35718:	80 91 bb 13 	lds	r24, 0x13BB	; 0x8013bb <MMU2::mmu2+0x71>
   3571c:	88 23       	and	r24, r24
   3571e:	09 f4       	brne	.+2      	; 0x35722 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x936>
   35720:	75 cf       	rjmp	.-278    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
            switch (WhereIsFilament()) {
   35722:	0f 94 d9 c5 	call	0x38bb2	; 0x38bb2 <MMU2::WhereIsFilament()>
   35726:	88 23       	and	r24, r24
   35728:	b1 f1       	breq	.+108    	; 0x35796 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9aa>
   3572a:	81 30       	cpi	r24, 0x01	; 1
   3572c:	09 f0       	breq	.+2      	; 0x35730 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x944>
   3572e:	6e cf       	rjmp	.-292    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
            case FilamentState::AT_FSENSOR:
                // fsensor triggered, finish FeedingToExtruder state
                loadFilamentStarted = false;
   35730:	10 92 bb 13 	sts	0x13BB, r1	; 0x8013bb <MMU2::mmu2+0x71>
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 <planner_abort_hard()>
    // 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_aborted>
                planner_abort_queued_moves();
                {
                    extruder_move(logic.ExtraLoadDistance() + 2, logic.PulleySlowFeedRate());
   3573c:	60 91 97 13 	lds	r22, 0x1397	; 0x801397 <MMU2::mmu2+0x4d>
   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 <MMU2::mmu2+0x4c>
   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 <MMU2::extruder_move(float, float)>
   3576c:	4f cf       	rjmp	.-354    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
}

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 <MMU2::mmu2+0x72>
   35772:	88 23       	and	r24, r24
   35774:	09 f4       	brne	.+2      	; 0x35778 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x98c>
   35776:	4a cf       	rjmp	.-364    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
  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 <block_buffer_head>
   3577c:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   35780:	98 13       	cpse	r25, r24
   35782:	44 cf       	rjmp	.-376    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
            switch (WhereIsFilament()) {
   35784:	0f 94 d9 c5 	call	0x38bb2	; 0x38bb2 <MMU2::WhereIsFilament()>
   35788:	81 50       	subi	r24, 0x01	; 1
   3578a:	83 30       	cpi	r24, 0x03	; 3
   3578c:	08 f4       	brcc	.+2      	; 0x35790 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9a4>
   3578e:	bc cf       	rjmp	.-136    	; 0x35708 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x91c>
            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 <MMU2::mmu2+0x72>
   35794:	3b cf       	rjmp	.-394    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
   35796:	90 91 a4 0d 	lds	r25, 0x0DA4	; 0x800da4 <block_buffer_head>
   3579a:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
                    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
                    // 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 <MMU2::mmu2+0x4d>
   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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x97c>
        // 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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0xa04>
   357c2:	19 30       	cpi	r17, 0x09	; 9
   357c4:	09 f0       	breq	.+2      	; 0x357c8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9dc>
   357c6:	22 cf       	rjmp	.-444    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
                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 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]>
   357ce:	19 e0       	ldi	r17, 0x09	; 9
   357d0:	1d cf       	rjmp	.-454    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
    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 <MMU2::mmu2+0x40>
   357d8:	90 91 8b 13 	lds	r25, 0x138B	; 0x80138b <MMU2::mmu2+0x41>
                ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter);
                break;

            case VersionMismatch:
                StopKeepPowered();
                ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter);
   357dc:	0f 94 e5 83 	call	0x307ca	; 0x307ca <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.201]>
   357e0:	15 cf       	rjmp	.-470    	; 0x3560c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x820>
            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 <MMU2::mmu2+0x6f>
                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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9f0>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   357f0:	10 92 b9 13 	sts	0x13B9, r1	; 0x8013b9 <MMU2::mmu2+0x6f>
    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 <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   357f8:	10 92 4c 13 	sts	0x134C, r1	; 0x80134c <MMU2::mmu2+0x2>
                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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9f0>
                break;
            }
        }
            [[fallthrough]]; // otherwise
        default:
            RecordUARTActivity(); // something has happened on the UART, update the timeout record
   35804:	0f 94 8d 66 	call	0x2cd1a	; 0x2cd1a <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.339]>
   35808:	aa cd       	rjmp	.-1196   	; 0x3535e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x572>
    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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9e2>
   3580e:	dc cf       	rjmp	.-72     	; 0x357c8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]+0x9dc>

00035810 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]>:
        }
    }
}

void MMU2::ResumeHotendTemp() {
    if ((mmu_print_saved & SavedState::CooldownPending)) {
   35810:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   35814:	82 ff       	sbrs	r24, 2
   35816:	07 c0       	rjmp	.+14     	; 0x35826 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]+0x16>
        // 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 <MMU2::mmu2+0x70>
        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 <MMU2::LogEchoEvent_P(char const*)>
    }
    if ((mmu_print_saved & SavedState::Cooldown) && resume_hotend_temp) {
   35826:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   3582a:	81 ff       	sbrs	r24, 1
   3582c:	52 c0       	rjmp	.+164    	; 0x358d2 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]+0xc2>
   3582e:	80 91 ae 13 	lds	r24, 0x13AE	; 0x8013ae <MMU2::mmu2+0x64>
   35832:	90 91 af 13 	lds	r25, 0x13AF	; 0x8013af <MMU2::mmu2+0x65>
   35836:	89 2b       	or	r24, r25
   35838:	09 f4       	brne	.+2      	; 0x3583c <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]+0x2c>
   3583a:	4b c0       	rjmp	.+150    	; 0x358d2 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]+0xc2>
        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 <MMU2::LogEchoEvent_P(char const*)>
        // @@TODO MMU2_ECHO_MSGRPGM(PSTR("Restoring hotend temperature "));
        SERIAL_ECHOLN(resume_hotend_temp);
   35844:	80 91 ae 13 	lds	r24, 0x13AE	; 0x8013ae <MMU2::mmu2+0x64>
   35848:	90 91 af 13 	lds	r25, 0x13AF	; 0x8013af <MMU2::mmu2+0x65>
   3584c:	0f 94 ec 75 	call	0x2ebd8	; 0x2ebd8 <MarlinSerial::println(int, int) [clone .constprop.325]>
        mmu_print_saved &= ~(SavedState::Cooldown);
   35850:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   35854:	8d 7f       	andi	r24, 0xFD	; 253
   35856:	80 93 ba 13 	sts	0x13BA, r24	; 0x8013ba <MMU2::mmu2+0x70>
  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 <MMU2::mmu2+0x64>
   3585e:	90 91 af 13 	lds	r25, 0x13AF	; 0x8013af <MMU2::mmu2+0x65>
   35862:	90 93 b6 0d 	sts	0x0DB6, r25	; 0x800db6 <target_temperature+0x1>
   35866:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <target_temperature>
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 <lang_get_translation>
   35872:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
int16_t thermal_degTargetHotend() {
    return degTargetHotend(0);
}

int16_t thermal_degHotend() {
    return degHotend(0);
   35882:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   35886:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   3588a:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   3588e:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   35892:	0f 94 a9 de 	call	0x3bd52	; 0x3bd52 <__fixsfsi>

namespace MMU2 {

template <typename F>
void waitForHotendTargetTemp(uint16_t delay, F f) {
    while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) {
   35896:	20 91 b5 0d 	lds	r18, 0x0DB5	; 0x800db5 <target_temperature>
   3589a:	30 91 b6 0d 	lds	r19, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]+0xb2>
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 <manage_inactivity(bool)>
        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 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.198]>
            ReportErrorHookDynamicRender();
   358b4:	0f 94 ea c4 	call	0x389d4	; 0x389d4 <MMU2::ReportErrorHookDynamicRender()>
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 <delay_keep_alive(unsigned int)>
   358c0:	e0 cf       	rjmp	.-64     	; 0x35882 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]+0x72>
        });
        ScreenUpdateEnable(); // temporary hack to stop this locking the printer...
   358c2:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
        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 <MMU2::LogEchoEvent_P(char const*)>
void ScreenUpdateEnable(){
    lcd_update_enable(true);
}

void ScreenClear(){
    lcd_clear();
   358ce:	0c 94 ab 6e 	jmp	0xdd56	; 0xdd56 <lcd_clear()>
        ScreenClear();
    }
}
   358d2:	08 95       	ret

000358d4 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>:
/// 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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xa>
   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 <MMU2::mmu2+0x70>

    MARLIN_KEEPALIVE_STATE_IN_PROCESS;
   358ee:	83 e0       	ldi	r24, 0x03	; 3
   358f0:	80 93 be 02 	sts	0x02BE, r24	; 0x8002be <busy_state>

    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 <delay_keep_alive(unsigned int)>
        // - 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 <MMU2::mmu2+0x70>
   3590a:	89 81       	ldd	r24, Y+1	; 0x01
   3590c:	92 ff       	sbrs	r25, 2
   3590e:	37 c0       	rjmp	.+110    	; 0x3597e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xaa>
            if (!nozzleTimeout.running()) {
   35910:	81 11       	cpse	r24, r1
   35912:	1e c0       	rjmp	.+60     	; 0x35950 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x7c>
                nozzleTimeout.start();
   35914:	ce 01       	movw	r24, r28
   35916:	01 96       	adiw	r24, 0x01	; 1
   35918:	0f 94 cb 2c 	call	0x25996	; 0x25996 <Timer<unsigned long>::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 <MMU2::LogEchoEvent_P(char const*)>
        }

        switch (logicStepLastStatus) {
   35924:	e0 91 b8 13 	lds	r30, 0x13B8	; 0x8013b8 <MMU2::mmu2+0x6e>
   35928:	e2 50       	subi	r30, 0x02	; 2
   3592a:	ea 30       	cpi	r30, 0x0A	; 10
   3592c:	40 f7       	brcc	.-48     	; 0x358fe <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x2a>
   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 <Timer<unsigned long>::expired(unsigned long)>
   35960:	88 23       	and	r24, r24
   35962:	01 f3       	breq	.-64     	; 0x35924 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x50>
                mmu_print_saved &= ~(SavedState::CooldownPending);
   35964:	80 91 ba 13 	lds	r24, 0x13BA	; 0x8013ba <MMU2::mmu2+0x70>
   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 <MMU2::mmu2+0x70>
   35970:	10 92 b6 0d 	sts	0x0DB6, r1	; 0x800db6 <target_temperature+0x1>
   35974:	10 92 b5 0d 	sts	0x0DB5, r1	; 0x800db5 <target_temperature>
                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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x4c>
            }
        } else if (nozzleTimeout.running()) {
   3597e:	88 23       	and	r24, r24
   35980:	89 f2       	breq	.-94     	; 0x35924 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x50>
   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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x4c>

        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 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]>
            ResumeUnpark(); // We can now travel back to the tower or wherever we were when we saved.
   3598e:	0f 94 29 6b 	call	0x2d652	; 0x2d652 <MMU2::MMU2::ResumeUnpark() [clone .constprop.144]>
            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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xd4>
        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 <serialprintlnPGM(char const*)>
    retryAttempts = MAX_RETRIES;
   359a2:	83 e0       	ldi	r24, 0x03	; 3
   359a4:	80 93 9e 13 	sts	0x139E, r24	; 0x80139e <MMU2::mmu2+0x54>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   359a8:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        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 <MMU2::MMU2::CheckUserInput() [clone .constprop.202]>
   359c6:	f2 cf       	rjmp	.-28     	; 0x359ac <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xd8>
            break;
        case CommandError:
        case CommunicationTimeout:
        case ProtocolError:
        case ButtonPushed:
            if (!logic.InAutoRetry()) {
   359c8:	80 91 9f 13 	lds	r24, 0x139F	; 0x80139f <MMU2::mmu2+0x55>
   359cc:	81 11       	cpse	r24, r1
   359ce:	97 cf       	rjmp	.-210    	; 0x358fe <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x2a>
                // 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 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.136]>
                SaveHotendTemp(turn_off_nozzle);
   359d6:	80 2f       	mov	r24, r16
   359d8:	0f 94 0d 6b 	call	0x2d61a	; 0x2d61a <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.142]>
                CheckUserInput();
   359dc:	0f 94 3d a6 	call	0x34c7a	; 0x34c7a <MMU2::MMU2::CheckUserInput() [clone .constprop.202]>
   359e0:	8e cf       	rjmp	.-228    	; 0x358fe <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x2a>
            }
            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 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.204]>
            ResumeUnpark();
   359e6:	0f 94 29 6b 	call	0x2d652	; 0x2d652 <MMU2::MMU2::ResumeUnpark() [clone .constprop.144]>
   359ea:	89 cf       	rjmp	.-238    	; 0x358fe <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0x2a>
            }
            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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]+0xda>

000359f0 <MMU2::MMU2::UnloadInner() [clone .constprop.130]>:
    } // 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 <MMU2::MMU2::UnloadInner() [clone .constprop.130]+0x6>
   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 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.163]>

    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 <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.132]>
    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 <MMU2::Disable_E0()>
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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
        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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   35a32:	81 11       	cpse	r24, r1
   35a34:	03 c0       	rjmp	.+6      	; 0x35a3c <MMU2::MMU2::UnloadInner() [clone .constprop.130]+0x4c>
            break;
        }
        IncrementMMUFails();
   35a36:	0f 94 e2 c4 	call	0x389c4	; 0x389c4 <MMU2::IncrementMMUFails()>
   35a3a:	e8 cf       	rjmp	.-48     	; 0x35a0c <MMU2::MMU2::UnloadInner() [clone .constprop.130]+0x1c>
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 <Sound_MakeSound(eSOUND_TYPE)>
    }
    MakeSound(Confirm);

    // no active tool
    SetCurrentTool(MMU2_NO_TOOL);
   35a42:	83 e6       	ldi	r24, 0x63	; 99
   35a44:	0f 94 f7 87 	call	0x30fee	; 0x30fee <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.148]>
    tool_change_extruder = MMU2_NO_TOOL;
   35a48:	83 e6       	ldi	r24, 0x63	; 99
   35a4a:	80 93 a1 13 	sts	0x13A1, r24	; 0x8013a1 <MMU2::mmu2+0x57>

FSensorBlockRunout::~FSensorBlockRunout() {
    fsensor.settings_init(); // restore filament runout state.
   35a4e:	0f 94 e9 7b 	call	0x2f7d2	; 0x2f7d2 <PAT9125_sensor::settings_init() [clone .constprop.231]>
}
   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 <MMU2::MMU2::unload() [clone .constprop.126]>:

bool MMU2::unload() {
   35a62:	cf 93       	push	r28
    if (!WaitForMMUReady()) {
   35a64:	0f 94 78 88 	call	0x310f0	; 0x310f0 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   35a68:	c8 2f       	mov	r28, r24
   35a6a:	88 23       	and	r24, r24
   35a6c:	79 f0       	breq	.+30     	; 0x35a8c <MMU2::MMU2::unload() [clone .constprop.126]+0x2a>
        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 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(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 <Sound_MakeSound(eSOUND_TYPE)>

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 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>

    WaitForHotendTargetTempBeep();

    {
        ReportingRAII rep(CommandInProgress::UnloadFilament);
        UnloadInner();
   35a80:	0f 94 f8 ac 	call	0x359f0	; 0x359f0 <MMU2::MMU2::UnloadInner() [clone .constprop.130]>
    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 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>
    {
        ReportingRAII rep(CommandInProgress::UnloadFilament);
        UnloadInner();
    }

    ScreenUpdateEnable();
   35a88:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
    return true;
}
   35a8c:	8c 2f       	mov	r24, r28
   35a8e:	cf 91       	pop	r28
   35a90:	08 95       	ret

00035a92 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]>:
    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 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]+0xa>
   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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   35aaa:	18 2f       	mov	r17, r24
   35aac:	88 23       	and	r24, r24
   35aae:	49 f1       	breq	.+82     	; 0x35b02 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]+0x70>
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 <lang_get_translation>
   35ab8:	60 2f       	mov	r22, r16
   35aba:	0f 94 c3 c4 	call	0x38986	; 0x38986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>

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 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>

    FullScreenMsgLoad(slot);
    {
        ReportingRAII rep(CommandInProgress::LoadFilament);
        for (;;) {
            Disable_E0();
   35ac2:	0f 94 a3 c5 	call	0x38b46	; 0x38b46 <MMU2::Disable_E0()>
}

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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
            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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   35ae8:	18 2f       	mov	r17, r24
   35aea:	81 11       	cpse	r24, r1
   35aec:	03 c0       	rjmp	.+6      	; 0x35af4 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]+0x62>
                break;
            }
            IncrementMMUFails();
   35aee:	0f 94 e2 c4 	call	0x389c4	; 0x389c4 <MMU2::IncrementMMUFails()>
   35af2:	e7 cf       	rjmp	.-50     	; 0x35ac2 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.123]+0x30>
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 <Sound_MakeSound(eSOUND_TYPE)>
    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 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>
            }
            IncrementMMUFails();
        }
        MakeSound(SoundType::Confirm);
    }
    ScreenUpdateEnable();
   35afe:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
    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 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]>:
    }
    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 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]+0xc>
   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 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.127]>
   35b34:	18 2f       	mov	r17, r24
   35b36:	88 23       	and	r24, r24
   35b38:	b1 f1       	breq	.+108    	; 0x35ba6 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]+0x8e>
        return false;
    }

    if (enableFullScreenMsg) {
   35b3a:	ff 20       	and	r15, r15
   35b3c:	39 f0       	breq	.+14     	; 0x35b4c <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]+0x34>
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 <lang_get_translation>
   35b46:	60 2f       	mov	r22, r16
   35b48:	0f 94 c3 c4 	call	0x38986	; 0x38986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>
        FullScreenMsgEject(slot);
    }
    {
        if (FindaDetectsFilament()) {
   35b4c:	80 91 8f 13 	lds	r24, 0x138F	; 0x80138f <MMU2::mmu2+0x45>
   35b50:	81 11       	cpse	r24, r1
            unload();
   35b52:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>

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 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>
            unload();
        }

        ReportingRAII rep(CommandInProgress::EjectFilament);
        for (;;) {
            Disable_E0();
   35b5a:	0f 94 a3 c5 	call	0x38b46	; 0x38b46 <MMU2::Disable_E0()>
}

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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
            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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   35b80:	18 2f       	mov	r17, r24
   35b82:	81 11       	cpse	r24, r1
   35b84:	03 c0       	rjmp	.+6      	; 0x35b8c <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]+0x74>
                break;
            }
            IncrementMMUFails();
   35b86:	0f 94 e2 c4 	call	0x389c4	; 0x389c4 <MMU2::IncrementMMUFails()>
   35b8a:	e7 cf       	rjmp	.-50     	; 0x35b5a <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.120]+0x42>
        }
        SetCurrentTool(MMU2_NO_TOOL);
   35b8c:	83 e6       	ldi	r24, 0x63	; 99
   35b8e:	0f 94 f7 87 	call	0x30fee	; 0x30fee <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.148]>
        tool_change_extruder = MMU2_NO_TOOL;
   35b92:	83 e6       	ldi	r24, 0x63	; 99
   35b94:	80 93 a1 13 	sts	0x13A1, r24	; 0x8013a1 <MMU2::mmu2+0x57>
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 <Sound_MakeSound(eSOUND_TYPE)>
    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 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>
        }
        SetCurrentTool(MMU2_NO_TOOL);
        tool_change_extruder = MMU2_NO_TOOL;
        MakeSound(Confirm);
    }
    ScreenUpdateEnable();
   35ba2:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
    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 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.118]>:

    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 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.118]+0x8>
   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 <MMU2::Disable_E0()>
}

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 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   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 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.328]>
        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 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.134]>
   35bf6:	81 11       	cpse	r24, r1
   35bf8:	03 c0       	rjmp	.+6      	; 0x35c00 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.118]+0x42>
            break;
        }
        IncrementMMUFails();
   35bfa:	0f 94 e2 c4 	call	0x389c4	; 0x389c4 <MMU2::IncrementMMUFails()>
   35bfe:	e8 cf       	rjmp	.-48     	; 0x35bd0 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.118]+0x12>
    }
}
   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 <MMU2::MMU2::cut_filament(unsigned char, bool) [clone .part.39] [clone .constprop.117]>:

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 <lang_get_translation>
   35c1e:	6c 2f       	mov	r22, r28
   35c20:	0f 94 c3 c4 	call	0x38986	; 0x38986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>

    if (enableFullScreenMsg) {
        FullScreenMsgCut(slot);
    }
    {
        if (FindaDetectsFilament()) {
   35c24:	80 91 8f 13 	lds	r24, 0x138F	; 0x80138f <MMU2::mmu2+0x45>
   35c28:	81 11       	cpse	r24, r1
            unload();
   35c2a:	0f 94 31 ad 	call	0x35a62	; 0x35a62 <MMU2::MMU2::unload() [clone .constprop.126]>

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 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.149]>
        if (FindaDetectsFilament()) {
            unload();
        }

        ReportingRAII rep(CommandInProgress::CutFilament);
        CutFilamentInner(slot);
   35c32:	8c 2f       	mov	r24, r28
   35c34:	0f 94 df ad 	call	0x35bbe	; 0x35bbe <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.118]>
        SetCurrentTool(MMU2_NO_TOOL);
   35c38:	83 e6       	ldi	r24, 0x63	; 99
   35c3a:	0f 94 f7 87 	call	0x30fee	; 0x30fee <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.148]>
        tool_change_extruder = MMU2_NO_TOOL;
   35c3e:	83 e6       	ldi	r24, 0x63	; 99
   35c40:	80 93 a1 13 	sts	0x13A1, r24	; 0x8013a1 <MMU2::mmu2+0x57>
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 <Sound_MakeSound(eSOUND_TYPE)>
    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 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.129]>
        CutFilamentInner(slot);
        SetCurrentTool(MMU2_NO_TOOL);
        tool_change_extruder = MMU2_NO_TOOL;
        MakeSound(SoundType::Confirm);
    }
    ScreenUpdateEnable();
   35c4e:	0f 94 c0 c4 	call	0x38980	; 0x38980 <MMU2::ScreenUpdateEnable()>
    return true;
}
   35c52:	81 e0       	ldi	r24, 0x01	; 1
   35c54:	cf 91       	pop	r28
   35c56:	08 95       	ret

00035c58 <putch(char)>:
  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 <putch(char)>
  UDR0 = ch;
   35c60:	80 93 c6 00 	sts	0x00C6, r24	; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6>
}
   35c64:	08 95       	ret

00035c66 <getch()>:

#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 <getch()>
  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 <getch()+0x12>
       * 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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>:
    /// 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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)+0x6>
            } else {
                data <<= 1U;
            }
        }
        return data;
    }
   35c90:	08 95       	ret

00035c92 <calculate_trapezoid_for_block(block_t*, float, float)>:
// 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 <ceil>
   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 <ceil>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0x92>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0xba>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0xd2>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0xec>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0x11a>
      // 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 <calculate_trapezoid_for_block(block_t*, float, float)+0x1f4>
   35e84:	8d c0       	rjmp	.+282    	; 0x35fa0 <calculate_trapezoid_for_block(block_t*, float, float)+0x30e>
      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 <calculate_trapezoid_for_block(block_t*, float, float)+0x244>
   35ed4:	68 c0       	rjmp	.+208    	; 0x35fa6 <calculate_trapezoid_for_block(block_t*, float, float)+0x314>
    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 <calculate_trapezoid_for_block(block_t*, float, float)+0x27c>
        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 <calculate_trapezoid_for_block(block_t*, float, float)+0x2da>
    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 <calculate_trapezoid_for_block(block_t*, float, float)+0x21a>
#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 <calculate_trapezoid_for_block(block_t*, float, float)+0x31e>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0x36e>
   35ffe:	6f c0       	rjmp	.+222    	; 0x360de <calculate_trapezoid_for_block(block_t*, float, float)+0x44c>
        // 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 <calculate_trapezoid_for_block(block_t*, float, float)+0x3b8>
            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 <calculate_trapezoid_for_block(block_t*, float, float)+0x3de>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0x3e6>
   36076:	69 c0       	rjmp	.+210    	; 0x3614a <calculate_trapezoid_for_block(block_t*, float, float)+0x4b8>
        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 <calculate_trapezoid_for_block(block_t*, float, float)+0x3f2>
   36082:	66 c0       	rjmp	.+204    	; 0x36150 <calculate_trapezoid_for_block(block_t*, float, float)+0x4be>
            // 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 <calculate_trapezoid_for_block(block_t*, float, float)+0x402>
   36092:	3d cf       	rjmp	.-390    	; 0x35f0e <calculate_trapezoid_for_block(block_t*, float, float)+0x27c>
            // 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 <sqrt>
            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 <calculate_trapezoid_for_block(block_t*, float, float)+0x27c>
            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 <calculate_trapezoid_for_block(block_t*, float, float)+0x484>
            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 <calculate_trapezoid_for_block(block_t*, float, float)+0x4a6>
   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 <calculate_trapezoid_for_block(block_t*, float, float)+0x3de>
  // 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 <calculate_trapezoid_for_block(block_t*, float, float)+0x444>
#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 <calculate_trapezoid_for_block(block_t*, float, float)+0x444>

00036156 <verifySpace()>:
  while (!(UCSR0A & _BV(UDRE0)));
  UDR0 = ch;
}

static void verifySpace() {
  if (getch() != CRC_EOP) {
   36156:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   3615a:	80 32       	cpi	r24, 0x20	; 32
   3615c:	29 f0       	breq	.+10     	; 0x36168 <verifySpace()+0x12>
    putch(STK_FAILED);
   3615e:	81 e1       	ldi	r24, 0x11	; 17
   36160:	0f 94 2c ae 	call	0x35c58	; 0x35c58 <putch(char)>
    softReset();
   36164:	0e 94 e4 66 	call	0xcdc8	; 0xcdc8 <softReset>
  }
  putch(STK_INSYNC);
   36168:	84 e1       	ldi	r24, 0x14	; 20
   3616a:	0d 94 2c ae 	jmp	0x35c58	; 0x35c58 <putch(char)>

0003616e <getNch(unsigned char)>:
}

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 <getch()>
   36176:	c1 50       	subi	r28, 0x01	; 1
   36178:	e1 f7       	brne	.-8      	; 0x36172 <getNch(unsigned char)+0x4>
  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 <verifySpace()>

00036180 <menu_draw_P(char, char const*, int)>:
/// @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_putc(char)>
	lcd_puts_P(str);
   36192:	ce 01       	movw	r24, r28
   36194:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
	lcd_putc(':');
   36198:	8a e3       	ldi	r24, 0x3A	; 58
   3619a:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
   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 <lcd_space(unsigned char)>

	// 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 <lcd_printf_P(char const*, ...)>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>:

// 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 <block_buffer_head>
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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x84>
    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 <block_buffer_tail>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb0>
      do {
          manage_heater();
   36262:	0f 94 34 39 	call	0x27268	; 0x27268 <manage_heater()>
          // 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 <manage_inactivity(bool)>
          lcd_update(0);
   3626c:	80 e0       	ldi	r24, 0x00	; 0
   3626e:	0e 94 3f 6e 	call	0xdc7e	; 0xdc7e <lcd_update(unsigned char)>
      } while (block_buffer_tail == next_buffer_head);
   36272:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x92>
  }
#ifdef PLANNER_DIAGNOSTICS
  planner_update_queue_min_counter();
#endif /* PLANNER_DIAGNOSTICS */
  if(planner_aborted) {
   36280:	40 91 ab 0d 	lds	r20, 0x0DAB	; 0x800dab <planner_aborted>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x102>
      // 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 <serialprintPGM(char const*)>
      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 <serialprintlnPGM(char const*)>
  // 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 <block_buffer_head>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x13c>
   36308:	0d 94 dc bb 	jmp	0x377b8	; 0x377b8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x15e8>
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x144>

  // 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 <feedrate>
   3634a:	70 91 b9 02 	lds	r23, 0x02B9	; 0x8002b9 <feedrate+0x1>
   3634e:	80 91 ba 02 	lds	r24, 0x02BA	; 0x8002ba <feedrate+0x2>
   36352:	90 91 bb 02 	lds	r25, 0x02BB	; 0x8002bb <feedrate+0x3>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c2>
  {
      position[E_AXIS] = 0;
   36368:	10 92 ae 06 	sts	0x06AE, r1	; 0x8006ae <position+0xc>
   3636c:	10 92 af 06 	sts	0x06AF, r1	; 0x8006af <position+0xd>
   36370:	10 92 b0 06 	sts	0x06B0, r1	; 0x8006b0 <position+0xe>
   36374:	10 92 b1 06 	sts	0x06B1, r1	; 0x8006b1 <position+0xf>
#ifdef LIN_ADVANCE
      position_float[E_AXIS] = 0;
   36378:	10 92 d8 04 	sts	0x04D8, r1	; 0x8004d8 <position_float+0xc>
   3637c:	10 92 d9 04 	sts	0x04D9, r1	; 0x8004d9 <position_float+0xd>
   36380:	10 92 da 04 	sts	0x04DA, r1	; 0x8004da <position_float+0xe>
   36384:	10 92 db 04 	sts	0x04DB, r1	; 0x8004db <position_float+0xf>
#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 <world2machine(float&, float&)>

  // 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 <cs+0x4>
   363ac:	30 91 c2 0d 	lds	r19, 0x0DC2	; 0x800dc2 <cs+0x5>
   363b0:	40 91 c3 0d 	lds	r20, 0x0DC3	; 0x800dc3 <cs+0x6>
   363b4:	50 91 c4 0d 	lds	r21, 0x0DC4	; 0x800dc4 <cs+0x7>
   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 <lround>
   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 <cs+0x8>
   363e0:	30 91 c6 0d 	lds	r19, 0x0DC6	; 0x800dc6 <cs+0x9>
   363e4:	40 91 c7 0d 	lds	r20, 0x0DC7	; 0x800dc7 <cs+0xa>
   363e8:	50 91 c8 0d 	lds	r21, 0x0DC8	; 0x800dc8 <cs+0xb>
   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 <lround>
   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 <mbl>
   3640c:	88 23       	and	r24, r24
   3640e:	11 f4       	brne	.+4      	; 0x36414 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x244>
   36410:	0d 94 e3 bb 	jmp	0x377c6	; 0x377c6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x15f6>
        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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]>
   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 <cs+0xc>
   36434:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   36438:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   3643c:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
    }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 <lround>
   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 <cs+0x10>
   36468:	30 91 ce 0d 	lds	r19, 0x0DCE	; 0x800dce <cs+0x11>
   3646c:	40 91 cf 0d 	lds	r20, 0x0DCF	; 0x800dcf <cs+0x12>
   36470:	50 91 d0 0d 	lds	r21, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <lround>
   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 <position+0xc>
   36490:	90 91 af 06 	lds	r25, 0x06AF	; 0x8006af <position+0xd>
   36494:	a0 91 b0 06 	lds	r26, 0x06B0	; 0x8006b0 <position+0xe>
   36498:	b0 91 b1 06 	lds	r27, 0x06B1	; 0x8006b1 <position+0xf>
   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 <position>
   364b4:	90 91 a3 06 	lds	r25, 0x06A3	; 0x8006a3 <position+0x1>
   364b8:	a0 91 a4 06 	lds	r26, 0x06A4	; 0x8006a4 <position+0x2>
   364bc:	b0 91 a5 06 	lds	r27, 0x06A5	; 0x8006a5 <position+0x3>
   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 <position+0x4>
   364dc:	90 91 a7 06 	lds	r25, 0x06A7	; 0x8006a7 <position+0x5>
   364e0:	a0 91 a8 06 	lds	r26, 0x06A8	; 0x8006a8 <position+0x6>
   364e4:	b0 91 a9 06 	lds	r27, 0x06A9	; 0x8006a9 <position+0x7>
   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 <position+0x8>
   3650c:	90 91 ab 06 	lds	r25, 0x06AB	; 0x8006ab <position+0x9>
   36510:	a0 91 ac 06 	lds	r26, 0x06AC	; 0x8006ac <position+0xa>
   36514:	b0 91 ad 06 	lds	r27, 0x06AD	; 0x8006ad <position+0xb>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x370>
   3653e:	80 c0       	rjmp	.+256    	; 0x36640 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x470>
  {
    if((int)degHotend(active_extruder)<extrude_min_temp)
   36540:	60 91 af 0d 	lds	r22, 0x0DAF	; 0x800daf <current_temperature>
   36544:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   36548:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   3654c:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   36550:	0f 94 a9 de 	call	0x3bd52	; 0x3bd52 <__fixsfsi>
   36554:	20 91 6b 02 	lds	r18, 0x026B	; 0x80026b <extrude_min_temp>
   36558:	30 91 6c 02 	lds	r19, 0x026C	; 0x80026c <extrude_min_temp+0x1>
   3655c:	62 17       	cp	r22, r18
   3655e:	73 07       	cpc	r23, r19
   36560:	0c f5       	brge	.+66     	; 0x365a4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x3d4>
    {
      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 <position+0xc>
   36572:	90 93 af 06 	sts	0x06AF, r25	; 0x8006af <position+0xd>
   36576:	a0 93 b0 06 	sts	0x06B0, r26	; 0x8006b0 <position+0xe>
   3657a:	b0 93 b1 06 	sts	0x06B1, r27	; 0x8006b1 <position+0xf>
      #ifdef LIN_ADVANCE
      position_float[E_AXIS] = e;
   3657e:	80 92 d8 04 	sts	0x04D8, r8	; 0x8004d8 <position_float+0xc>
   36582:	90 92 d9 04 	sts	0x04D9, r9	; 0x8004d9 <position_float+0xd>
   36586:	a0 92 da 04 	sts	0x04DA, r10	; 0x8004da <position_float+0xe>
   3658a:	b0 92 db 04 	sts	0x04DB, r11	; 0x8004db <position_float+0xf>
      #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 <serialprintPGM(char const*)>
      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 <serialprintlnPGM(char const*)>
    {
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x3ea>
   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 <cs+0x10>
   365ce:	70 91 ce 0d 	lds	r23, 0x0DCE	; 0x800dce <cs+0x11>
   365d2:	80 91 cf 0d 	lds	r24, 0x0DCF	; 0x800dcf <cs+0x12>
   365d6:	90 91 d0 0d 	lds	r25, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x470>
    {
      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 <position+0xc>
   365fe:	30 93 af 06 	sts	0x06AF, r19	; 0x8006af <position+0xd>
   36602:	40 93 b0 06 	sts	0x06B0, r20	; 0x8006b0 <position+0xe>
   36606:	50 93 b1 06 	sts	0x06B1, r21	; 0x8006b1 <position+0xf>
      #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 <position_float+0xc>
   3661e:	90 93 d9 04 	sts	0x04D9, r25	; 0x8004d9 <position_float+0xd>
   36622:	a0 93 da 04 	sts	0x04DA, r26	; 0x8004da <position_float+0xe>
   36626:	b0 93 db 04 	sts	0x04DB, r27	; 0x8004db <position_float+0xf>
      #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 <serialprintPGM(char const*)>
      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 <serialprintlnPGM(char const*)>
    {
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x496>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x4c8>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x4fa>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x518>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x54e>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x576>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x584>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5a6>
   36774:	94 cd       	rjmp	.-1240   	; 0x3629e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xce>
    planner_update_queue_min_counter();
#endif /* PLANNER_DIAGNOSTICS */
    return;
  }

  block->fan_speed = fanSpeed;
   36776:	80 91 e5 03 	lds	r24, 0x03E5	; 0x8003e5 <fanSpeed>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5ba>
   36786:	0d 94 f3 bb 	jmp	0x377e6	; 0x377e6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1616>
  }

  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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5de>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x600>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x61a>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x624>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x646>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x668>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x68a>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x6b8>
   36886:	b3 c7       	rjmp	.+3942   	; 0x377ee <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x161e>
  {
    if(feed_rate<cs.mintravelfeedrate) feed_rate=cs.mintravelfeedrate;
   36888:	a0 90 fd 0d 	lds	r10, 0x0DFD	; 0x800dfd <cs+0x40>
   3688c:	b0 90 fe 0d 	lds	r11, 0x0DFE	; 0x800dfe <cs+0x41>
   36890:	00 91 ff 0d 	lds	r16, 0x0DFF	; 0x800dff <cs+0x42>
   36894:	10 91 00 0e 	lds	r17, 0x0E00	; 0x800e00 <cs+0x43>
  }
  else
  {
    if(feed_rate<cs.minimumfeedrate) feed_rate=cs.minimumfeedrate;
   36898:	29 a9       	ldd	r18, Y+49	; 0x31
   3689a:	39 ad       	ldd	r19, Y+57	; 0x39
   3689c:	4d ad       	ldd	r20, Y+61	; 0x3d
   3689e:	5d a9       	ldd	r21, Y+53	; 0x35
   368a0:	b5 01       	movw	r22, r10
   368a2:	c8 01       	movw	r24, r16
   368a4:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   368a8:	18 16       	cp	r1, r24
   368aa:	24 f4       	brge	.+8      	; 0x368b4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x6e4>
   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 <cs+0x4>
   368c0:	30 91 c2 0d 	lds	r19, 0x0DC2	; 0x800dc2 <cs+0x5>
   368c4:	40 91 c3 0d 	lds	r20, 0x0DC3	; 0x800dc3 <cs+0x6>
   368c8:	50 91 c4 0d 	lds	r21, 0x0DC4	; 0x800dc4 <cs+0x7>
   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 <cs+0x8>
   368ec:	30 91 c6 0d 	lds	r19, 0x0DC6	; 0x800dc6 <cs+0x9>
   368f0:	40 91 c7 0d 	lds	r20, 0x0DC7	; 0x800dc7 <cs+0xa>
   368f4:	50 91 c8 0d 	lds	r21, 0x0DC8	; 0x800dc8 <cs+0xb>
   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 <cs+0xc>
   36918:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   3691c:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   36920:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <cs+0x10>
   36948:	30 91 ce 0d 	lds	r19, 0x0DCE	; 0x800dce <cs+0x11>
   3694c:	40 91 cf 0d 	lds	r20, 0x0DCF	; 0x800dcf <cs+0x12>
   36950:	50 91 d0 0d 	lds	r21, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x7ca>
   36998:	33 c7       	rjmp	.+3686   	; 0x37800 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1630>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x7dc>
   369aa:	2a c7       	rjmp	.+3668   	; 0x37800 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1630>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x7ee>
   369bc:	21 c7       	rjmp	.+3650   	; 0x37800 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1630>
  {
    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 <block_buffer_head>
   36a10:	90 91 a5 0d 	lds	r25, 0x0DA5	; 0x800da5 <block_buffer_tail>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x852>
   36a20:	40 c0       	rjmp	.+128    	; 0x36aa2 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x8d2>
      // 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 <lround>
   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 <cs+0x44>
   36a3e:	90 91 02 0e 	lds	r25, 0x0E02	; 0x800e02 <cs+0x45>
   36a42:	a0 91 03 0e 	lds	r26, 0x0E03	; 0x800e03 <cs+0x46>
   36a46:	b0 91 04 0e 	lds	r27, 0x0E04	; 0x800e04 <cs+0x47>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x8d2>
          // 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 <ceil>
   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 <max_feedrate>
   36b3e:	90 91 72 02 	lds	r25, 0x0272	; 0x800272 <max_feedrate+0x1>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa24>
	{
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa24>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa38>
   36c06:	ac cf       	rjmp	.-168    	; 0x36b60 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x990>
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xaee>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa64>
    {
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb1c>
   36cea:	b9 c5       	rjmp	.+2930   	; 0x3785e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x168e>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb40>
   36d0e:	a7 c5       	rjmp	.+2894   	; 0x3785e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x168e>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb52>
   36d20:	9e c5       	rjmp	.+2876   	; 0x3785e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x168e>
  {
    accel = ceil(cs.retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2
   36d22:	20 91 f5 0d 	lds	r18, 0x0DF5	; 0x800df5 <cs+0x38>
   36d26:	30 91 f6 0d 	lds	r19, 0x0DF6	; 0x800df6 <cs+0x39>
   36d2a:	40 91 f7 0d 	lds	r20, 0x0DF7	; 0x800df7 <cs+0x3a>
   36d2e:	50 91 f8 0d 	lds	r21, 0x0DF8	; 0x800df8 <cs+0x3b>
   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 <ceil>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd02>
          // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xc96>
   36e64:	7e c6       	rjmp	.+3324   	; 0x37b62 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1992>
              // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd02>
                  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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd0a>
   36ed8:	ac cf       	rjmp	.-168    	; 0x36e32 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xc62>
          }
      }
  }

  // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd2c>
  {
      // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd34>
   36f02:	8f c6       	rjmp	.+3358   	; 0x37c22 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a52>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd70>
   36f3e:	71 c6       	rjmp	.+3298   	; 0x37c22 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a52>
      // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x19a0>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xe86>
              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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xeb0>
              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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xec8>
   37096:	a3 c5       	rjmp	.+2886   	; 0x37bde <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a0e>
                  ((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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xee6>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x19f0>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xf42>
              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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xf56>
   37124:	5d cf       	rjmp	.-326    	; 0x36fe0 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xe10>
          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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xf80>
          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 <previous_safe_speed>
   37174:	70 91 10 18 	lds	r23, 0x1810	; 0x801810 <previous_safe_speed+0x1>
   37178:	80 91 11 18 	lds	r24, 0x1811	; 0x801811 <previous_safe_speed+0x2>
   3717c:	90 91 12 18 	lds	r25, 0x1812	; 0x801812 <previous_safe_speed+0x3>
   37180:	0f 94 c1 df 	call	0x3bf82	; 0x3bf82 <__gesf2>
   37184:	18 16       	cp	r1, r24
   37186:	fc f4       	brge	.+62     	; 0x371c6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xff6>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xff6>
          // 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 <sqrt>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1092>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x10e0>
   372ae:	cf c4       	rjmp	.+2462   	; 0x37c4e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a7e>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1102>
  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 <previous_safe_speed>
   3730e:	90 93 10 18 	sts	0x1810, r25	; 0x801810 <previous_safe_speed+0x1>
   37312:	a0 93 11 18 	sts	0x1811, r26	; 0x801811 <previous_safe_speed+0x2>
   37316:	b0 93 12 18 	sts	0x1812, r27	; 0x801812 <previous_safe_speed+0x3>

  // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1194>
   37362:	89 c0       	rjmp	.+274    	; 0x37476 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x12a6>
      // 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 <extruder_advance_K>
   37368:	30 91 65 05 	lds	r19, 0x0565	; 0x800565 <extruder_advance_K+0x1>
   3736c:	40 91 66 05 	lds	r20, 0x0566	; 0x800566 <extruder_advance_K+0x2>
   37370:	50 91 67 05 	lds	r21, 0x0567	; 0x800567 <extruder_advance_K+0x3>
   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 <cs+0x10>
   3738c:	d0 90 ce 0d 	lds	r13, 0x0DCE	; 0x800dce <cs+0x11>
   37390:	e0 90 cf 0d 	lds	r14, 0x0DCF	; 0x800dcf <cs+0x12>
   37394:	f0 90 d0 0d 	lds	r15, 0x0DD0	; 0x800dd0 <cs+0x13>
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1202>
   373d0:	40 c4       	rjmp	.+2176   	; 0x37c52 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a82>
          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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1240>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x126a>
   37438:	17 c4       	rjmp	.+2094   	; 0x37c68 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a98>
          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 <calculate_trapezoid_for_block(block_t*, float, float)>

  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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x12f2>
    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 <planner_aborted>
   374ca:	91 11       	cpse	r25, r1
   374cc:	93 c4       	rjmp	.+2342   	; 0x37df4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c24>
      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 <block_buffer_head>
    (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 <position>
   374ee:	90 93 a3 06 	sts	0x06A3, r25	; 0x8006a3 <position+0x1>
   374f2:	a0 93 a4 06 	sts	0x06A4, r26	; 0x8006a4 <position+0x2>
   374f6:	b0 93 a5 06 	sts	0x06A5, r27	; 0x8006a5 <position+0x3>
   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 <position+0x4>
   3750e:	30 93 a7 06 	sts	0x06A7, r19	; 0x8006a7 <position+0x5>
   37512:	40 93 a8 06 	sts	0x06A8, r20	; 0x8006a8 <position+0x6>
   37516:	50 93 a9 06 	sts	0x06A9, r21	; 0x8006a9 <position+0x7>
   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 <position+0x8>
   3752a:	90 93 ab 06 	sts	0x06AB, r25	; 0x8006ab <position+0x9>
   3752e:	a0 93 ac 06 	sts	0x06AC, r26	; 0x8006ac <position+0xa>
   37532:	b0 93 ad 06 	sts	0x06AD, r27	; 0x8006ad <position+0xb>
   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 <position+0xc>
   37546:	30 93 af 06 	sts	0x06AF, r19	; 0x8006af <position+0xd>
   3754a:	40 93 b0 06 	sts	0x06B0, r20	; 0x8006b0 <position+0xe>
   3754e:	50 93 b1 06 	sts	0x06B1, r21	; 0x8006b1 <position+0xf>

  #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 <position_float>
   3755e:	90 93 cd 04 	sts	0x04CD, r25	; 0x8004cd <position_float+0x1>
   37562:	a0 93 ce 04 	sts	0x04CE, r26	; 0x8004ce <position_float+0x2>
   37566:	b0 93 cf 04 	sts	0x04CF, r27	; 0x8004cf <position_float+0x3>
  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 <position_float+0x4>
   37576:	90 93 d1 04 	sts	0x04D1, r25	; 0x8004d1 <position_float+0x5>
   3757a:	a0 93 d2 04 	sts	0x04D2, r26	; 0x8004d2 <position_float+0x6>
   3757e:	b0 93 d3 04 	sts	0x04D3, r27	; 0x8004d3 <position_float+0x7>
  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 <position_float+0x8>
   37592:	90 93 d5 04 	sts	0x04D5, r25	; 0x8004d5 <position_float+0x9>
   37596:	a0 93 d6 04 	sts	0x04D6, r26	; 0x8004d6 <position_float+0xa>
   3759a:	b0 93 d7 04 	sts	0x04D7, r27	; 0x8004d7 <position_float+0xb>
  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 <position_float+0xc>
   375b2:	90 93 d9 04 	sts	0x04D9, r25	; 0x8004d9 <position_float+0xd>
   375b6:	a0 93 da 04 	sts	0x04DA, r26	; 0x8004da <position_float+0xe>
   375ba:	b0 93 db 04 	sts	0x04DB, r27	; 0x8004db <position_float+0xf>
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_buffer_tail>
    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 <block_buffer_head>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x144e>
        // Initialize the last tripple of blocks.
        block_index = prev_block_index(block_buffer_head);
   375ce:	10 91 a4 0d 	lds	r17, 0x0DA4	; 0x800da4 <block_buffer_head>
}


// 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1408>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1420>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1454>
            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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b40>
                // 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 <block_buffer_head>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1454>
   37622:	a3 c0       	rjmp	.+326    	; 0x3776a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x159a>
        // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x146e>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1542>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1542>
// 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 <sqrt>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1518>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1542>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x157c>
                // 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 <calculate_trapezoid_for_block(block_t*, float, float)>
                // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1586>
    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 <block_buffer_head>
                // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c20>
    }

//    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 <block_buffer_head>
}


// 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x15a4>
    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 <calculate_trapezoid_for_block(block_t*, float, float)>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xce>

  // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x144>
  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 <cs+0xc>
   377ca:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   377ce:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   377d2:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x270>
  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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5bc>
  {
    if(feed_rate<cs.mintravelfeedrate) feed_rate=cs.mintravelfeedrate;
  }
  else
  {
    if(feed_rate<cs.minimumfeedrate) feed_rate=cs.minimumfeedrate;
   377ee:	a0 90 f9 0d 	lds	r10, 0x0DF9	; 0x800df9 <cs+0x3c>
   377f2:	b0 90 fa 0d 	lds	r11, 0x0DFA	; 0x800dfa <cs+0x3d>
   377f6:	00 91 fb 0d 	lds	r16, 0x0DFB	; 0x800dfb <cs+0x3e>
   377fa:	10 91 fc 0d 	lds	r17, 0x0DFC	; 0x800dfc <cs+0x3f>
   377fe:	4c c8       	rjmp	.-3944   	; 0x36898 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x6c8>
    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 <square>
   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 <square>
   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 <square>
   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 <sqrt>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x804>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x16a4>
   37872:	0e c1       	rjmp	.+540    	; 0x37a90 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18c0>
   37874:	60 91 f1 0d 	lds	r22, 0x0DF1	; 0x800df1 <cs+0x34>
   37878:	70 91 f2 0d 	lds	r23, 0x0DF2	; 0x800df2 <cs+0x35>
   3787c:	80 91 f3 0d 	lds	r24, 0x0DF3	; 0x800df3 <cs+0x36>
   37880:	90 91 f4 0d 	lds	r25, 0x0DF4	; 0x800df4 <cs+0x37>
   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 <ceil>
   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 <extruder_advance_K>
   378a0:	90 91 65 05 	lds	r25, 0x0565	; 0x800565 <extruder_advance_K+0x1>
   378a4:	a0 91 66 05 	lds	r26, 0x0566	; 0x800566 <extruder_advance_K+0x2>
   378a8:	b0 91 67 05 	lds	r27, 0x0567	; 0x800567 <extruder_advance_K+0x3>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x16f8>
   378c6:	ed c0       	rjmp	.+474    	; 0x37aa2 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18d2>
     * 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18d2>
                              && 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18d2>
     *
     * 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 <position_float>
   3791a:	30 91 cd 04 	lds	r19, 0x04CD	; 0x8004cd <position_float+0x1>
   3791e:	40 91 ce 04 	lds	r20, 0x04CE	; 0x8004ce <position_float+0x2>
   37922:	50 91 cf 04 	lds	r21, 0x04CF	; 0x8004cf <position_float+0x3>
   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 <position_float+0x4>
   3793e:	30 91 d1 04 	lds	r19, 0x04D1	; 0x8004d1 <position_float+0x5>
   37942:	40 91 d2 04 	lds	r20, 0x04D2	; 0x8004d2 <position_float+0x6>
   37946:	50 91 d3 04 	lds	r21, 0x04D3	; 0x8004d3 <position_float+0x7>
   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 <position_float+0x8>
   3795e:	30 91 d5 04 	lds	r19, 0x04D5	; 0x8004d5 <position_float+0x9>
   37962:	40 91 d6 04 	lds	r20, 0x04D6	; 0x8004d6 <position_float+0xa>
   37966:	50 91 d7 04 	lds	r21, 0x04D7	; 0x8004d7 <position_float+0xb>
   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 <sqrt>
   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 <position_float+0xc>
   379da:	30 91 d9 04 	lds	r19, 0x04D9	; 0x8004d9 <position_float+0xd>
   379de:	40 91 da 04 	lds	r20, 0x04DA	; 0x8004da <position_float+0xe>
   379e2:	50 91 db 04 	lds	r21, 0x04DB	; 0x8004db <position_float+0xf>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1850>
   37a1e:	9e c0       	rjmp	.+316    	; 0x37b5c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x198c>
            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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x186c>
   37a3a:	42 c0       	rjmp	.+132    	; 0x37ac0 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18f0>
            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 <cs+0x54>
   37a5c:	70 91 12 0e 	lds	r23, 0x0E12	; 0x800e12 <cs+0x55>
   37a60:	80 91 13 0e 	lds	r24, 0x0E13	; 0x800e13 <cs+0x56>
   37a64:	90 91 14 0e 	lds	r25, 0x0E14	; 0x800e14 <cs+0x57>
   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 <ceil>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18f0>
   37a8a:	2b 01       	movw	r4, r22
   37a8c:	3c 01       	movw	r6, r24
   37a8e:	18 c0       	rjmp	.+48     	; 0x37ac0 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18f0>
    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 <cs+0xc0>
   37a94:	70 91 7e 0e 	lds	r23, 0x0E7E	; 0x800e7e <cs+0xc1>
   37a98:	80 91 7f 0e 	lds	r24, 0x0E7F	; 0x800e7f <cs+0xc2>
   37a9c:	90 91 80 0e 	lds	r25, 0x0E80	; 0x800e80 <cs+0xc3>
   37aa0:	f1 ce       	rjmp	.-542    	; 0x37884 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x16b4>
     *
     * 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x197e>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x197e>
      {
        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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x197e>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x198a>
   37b58:	b5 cf       	rjmp	.-150    	; 0x37ac4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18f4>
   37b5a:	01 c9       	rjmp	.-3582   	; 0x36d5e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb8e>
        // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18f0>
              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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd02>
      // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xdf8>
              (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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xef6>
                  // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xef6>
                      // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a2c>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a36>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xeee>
                      // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a50>
   37c1e:	53 ca       	rjmp	.-2906   	; 0x370c6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xef6>
   37c20:	db cf       	rjmp	.-74     	; 0x37bd8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a08>
          // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xff6>
  // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x10e2>

      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 <cs+0x54>
   37c56:	30 91 12 0e 	lds	r19, 0x0E12	; 0x800e12 <cs+0x55>
   37c5a:	40 91 13 0e 	lds	r20, 0x0E13	; 0x800e13 <cs+0x56>
   37c5e:	50 91 14 0e 	lds	r21, 0x0E14	; 0x800e14 <cs+0x57>
   37c62:	c7 01       	movw	r24, r14
   37c64:	b6 01       	movw	r22, r12
   37c66:	c1 cb       	rjmp	.-2174   	; 0x373ea <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x121a>
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1ae0>
          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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x12a4>
      }
      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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b26>
              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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x12a4>
      {
          // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b12>
                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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b64>
   37d32:	51 c0       	rjmp	.+162    	; 0x37dd6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c06>
                // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1bf0>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1bf0>
// 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 <sqrt>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1bf0>
   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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c0c>
    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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1436>
                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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1482>
   37df4:	8f bf       	out	0x3f, r24	; 63
    __asm__ volatile ("" ::: "memory");
   37df6:	0d 94 4f b1 	jmp	0x3629e	; 0x3629e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xce>

00037dfa <plan_set_position_curposXYZE()>:

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 <current_position+0x8>
   37e2a:	d0 90 9a 06 	lds	r13, 0x069A	; 0x80069a <current_position+0x9>
   37e2e:	e0 90 9b 06 	lds	r14, 0x069B	; 0x80069b <current_position+0xa>
   37e32:	f0 90 9c 06 	lds	r15, 0x069C	; 0x80069c <current_position+0xb>
   37e36:	80 91 95 06 	lds	r24, 0x0695	; 0x800695 <current_position+0x4>
   37e3a:	90 91 96 06 	lds	r25, 0x0696	; 0x800696 <current_position+0x5>
   37e3e:	a0 91 97 06 	lds	r26, 0x0697	; 0x800697 <current_position+0x6>
   37e42:	b0 91 98 06 	lds	r27, 0x0698	; 0x800698 <current_position+0x7>
   37e46:	40 91 91 06 	lds	r20, 0x0691	; 0x800691 <current_position>
   37e4a:	50 91 92 06 	lds	r21, 0x0692	; 0x800692 <current_position+0x1>
   37e4e:	60 91 93 06 	lds	r22, 0x0693	; 0x800693 <current_position+0x2>
   37e52:	70 91 94 06 	lds	r23, 0x0694	; 0x800694 <current_position+0x3>
   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 <world2machine(float&, float&)>

  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 <cs+0x4>
   37e80:	30 91 c2 0d 	lds	r19, 0x0DC2	; 0x800dc2 <cs+0x5>
   37e84:	40 91 c3 0d 	lds	r20, 0x0DC3	; 0x800dc3 <cs+0x6>
   37e88:	50 91 c4 0d 	lds	r21, 0x0DC4	; 0x800dc4 <cs+0x7>
   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 <lround>
   37e98:	60 93 a2 06 	sts	0x06A2, r22	; 0x8006a2 <position>
   37e9c:	70 93 a3 06 	sts	0x06A3, r23	; 0x8006a3 <position+0x1>
   37ea0:	80 93 a4 06 	sts	0x06A4, r24	; 0x8006a4 <position+0x2>
   37ea4:	90 93 a5 06 	sts	0x06A5, r25	; 0x8006a5 <position+0x3>
  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 <cs+0x8>
   37eb4:	30 91 c6 0d 	lds	r19, 0x0DC6	; 0x800dc6 <cs+0x9>
   37eb8:	40 91 c7 0d 	lds	r20, 0x0DC7	; 0x800dc7 <cs+0xa>
   37ebc:	50 91 c8 0d 	lds	r21, 0x0DC8	; 0x800dc8 <cs+0xb>
   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 <lround>
   37ecc:	60 93 a6 06 	sts	0x06A6, r22	; 0x8006a6 <position+0x4>
   37ed0:	70 93 a7 06 	sts	0x06A7, r23	; 0x8006a7 <position+0x5>
   37ed4:	80 93 a8 06 	sts	0x06A8, r24	; 0x8006a8 <position+0x6>
   37ed8:	90 93 a9 06 	sts	0x06A9, r25	; 0x8006a9 <position+0x7>
#ifdef MESH_BED_LEVELING
  position[Z_AXIS] = mbl.active ?
   37edc:	80 91 c1 13 	lds	r24, 0x13C1	; 0x8013c1 <mbl>
   37ee0:	88 23       	and	r24, r24
   37ee2:	09 f4       	brne	.+2      	; 0x37ee6 <plan_set_position_curposXYZE()+0xec>
   37ee4:	8c c0       	rjmp	.+280    	; 0x37ffe <plan_set_position_curposXYZE()+0x204>
    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 <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]>
   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 <cs+0xc>
   37f02:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   37f06:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   37f0a:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
    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 <lround>
   37f16:	60 93 aa 06 	sts	0x06AA, r22	; 0x8006aa <position+0x8>
   37f1a:	70 93 ab 06 	sts	0x06AB, r23	; 0x8006ab <position+0x9>
   37f1e:	80 93 ac 06 	sts	0x06AC, r24	; 0x8006ac <position+0xa>
   37f22:	90 93 ad 06 	sts	0x06AD, r25	; 0x8006ad <position+0xb>
    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 <current_position+0xc>
   37f2a:	90 91 9e 06 	lds	r25, 0x069E	; 0x80069e <current_position+0xd>
   37f2e:	a0 91 9f 06 	lds	r26, 0x069F	; 0x80069f <current_position+0xe>
   37f32:	b0 91 a0 06 	lds	r27, 0x06A0	; 0x8006a0 <current_position+0xf>
   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 <cs+0x10>
   37f42:	30 91 ce 0d 	lds	r19, 0x0DCE	; 0x800dce <cs+0x11>
   37f46:	40 91 cf 0d 	lds	r20, 0x0DCF	; 0x800dcf <cs+0x12>
   37f4a:	50 91 d0 0d 	lds	r21, 0x0DD0	; 0x800dd0 <cs+0x13>
   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 <lround>
   37f5a:	60 93 ae 06 	sts	0x06AE, r22	; 0x8006ae <position+0xc>
   37f5e:	70 93 af 06 	sts	0x06AF, r23	; 0x8006af <position+0xd>
   37f62:	80 93 b0 06 	sts	0x06B0, r24	; 0x8006b0 <position+0xe>
   37f66:	90 93 b1 06 	sts	0x06B1, r25	; 0x8006b1 <position+0xf>
  #ifdef LIN_ADVANCE
  position_float[X_AXIS] = x;
   37f6a:	40 92 cc 04 	sts	0x04CC, r4	; 0x8004cc <position_float>
   37f6e:	50 92 cd 04 	sts	0x04CD, r5	; 0x8004cd <position_float+0x1>
   37f72:	60 92 ce 04 	sts	0x04CE, r6	; 0x8004ce <position_float+0x2>
   37f76:	70 92 cf 04 	sts	0x04CF, r7	; 0x8004cf <position_float+0x3>
  position_float[Y_AXIS] = y;
   37f7a:	80 92 d0 04 	sts	0x04D0, r8	; 0x8004d0 <position_float+0x4>
   37f7e:	90 92 d1 04 	sts	0x04D1, r9	; 0x8004d1 <position_float+0x5>
   37f82:	a0 92 d2 04 	sts	0x04D2, r10	; 0x8004d2 <position_float+0x6>
   37f86:	b0 92 d3 04 	sts	0x04D3, r11	; 0x8004d3 <position_float+0x7>
  position_float[Z_AXIS] = z;
   37f8a:	c0 92 d4 04 	sts	0x04D4, r12	; 0x8004d4 <position_float+0x8>
   37f8e:	d0 92 d5 04 	sts	0x04D5, r13	; 0x8004d5 <position_float+0x9>
   37f92:	e0 92 d6 04 	sts	0x04D6, r14	; 0x8004d6 <position_float+0xa>
   37f96:	f0 92 d7 04 	sts	0x04D7, r15	; 0x8004d7 <position_float+0xb>
  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 <position_float+0xc>
   37fa6:	90 93 d9 04 	sts	0x04D9, r25	; 0x8004d9 <position_float+0xd>
   37faa:	a0 93 da 04 	sts	0x04DA, r26	; 0x8004da <position_float+0xe>
   37fae:	b0 93 db 04 	sts	0x04DB, r27	; 0x8004db <position_float+0xf>
  #endif
  st_set_position(position);
   37fb2:	0f 94 df 87 	call	0x30fbe	; 0x30fbe <st_set_position(long const*) [clone .constprop.151]>
  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_set_position_curposXYZE()+0x1d4>
    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 <cs+0xc>
   38002:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   38006:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   3800a:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   3800e:	c7 01       	movw	r24, r14
   38010:	b6 01       	movw	r22, r12
   38012:	7d cf       	rjmp	.-262    	; 0x37f0e <plan_set_position_curposXYZE()+0x114>

00038014 <plan_buffer_line_destinationXYZE(float)>:

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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   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 <plan_buffer_line_curposXYZE(float)>:
    // 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 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   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 <planner_reset_position()>:
#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 <st_get_position(unsigned char)>
   38100:	60 93 a2 06 	sts	0x06A2, r22	; 0x8006a2 <position>
   38104:	70 93 a3 06 	sts	0x06A3, r23	; 0x8006a3 <position+0x1>
   38108:	80 93 a4 06 	sts	0x06A4, r24	; 0x8006a4 <position+0x2>
   3810c:	90 93 a5 06 	sts	0x06A5, r25	; 0x8006a5 <position+0x3>
    position[Y_AXIS] = st_get_position(Y_AXIS);
   38110:	81 e0       	ldi	r24, 0x01	; 1
   38112:	0f 94 87 43 	call	0x2870e	; 0x2870e <st_get_position(unsigned char)>
   38116:	60 93 a6 06 	sts	0x06A6, r22	; 0x8006a6 <position+0x4>
   3811a:	70 93 a7 06 	sts	0x06A7, r23	; 0x8006a7 <position+0x5>
   3811e:	80 93 a8 06 	sts	0x06A8, r24	; 0x8006a8 <position+0x6>
   38122:	90 93 a9 06 	sts	0x06A9, r25	; 0x8006a9 <position+0x7>
    position[Z_AXIS] = st_get_position(Z_AXIS);
   38126:	82 e0       	ldi	r24, 0x02	; 2
   38128:	0f 94 87 43 	call	0x2870e	; 0x2870e <st_get_position(unsigned char)>
   3812c:	60 93 aa 06 	sts	0x06AA, r22	; 0x8006aa <position+0x8>
   38130:	70 93 ab 06 	sts	0x06AB, r23	; 0x8006ab <position+0x9>
   38134:	80 93 ac 06 	sts	0x06AC, r24	; 0x8006ac <position+0xa>
   38138:	90 93 ad 06 	sts	0x06AD, r25	; 0x8006ad <position+0xb>
    position[E_AXIS] = st_get_position(E_AXIS);
   3813c:	83 e0       	ldi	r24, 0x03	; 3
   3813e:	0f 94 87 43 	call	0x2870e	; 0x2870e <st_get_position(unsigned char)>
   38142:	60 93 ae 06 	sts	0x06AE, r22	; 0x8006ae <position+0xc>
   38146:	70 93 af 06 	sts	0x06AF, r23	; 0x8006af <position+0xd>
   3814a:	80 93 b0 06 	sts	0x06B0, r24	; 0x8006b0 <position+0xe>
   3814e:	90 93 b1 06 	sts	0x06B1, r25	; 0x8006b1 <position+0xf>

    // 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 <st_get_position_mm(unsigned char)>
   38158:	60 93 91 06 	sts	0x0691, r22	; 0x800691 <current_position>
   3815c:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   38160:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   38164:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
    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 <st_get_position_mm(unsigned char)>
   3816e:	60 93 95 06 	sts	0x0695, r22	; 0x800695 <current_position+0x4>
   38172:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
   38176:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
   3817a:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>
    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 <st_get_position_mm(unsigned char)>
   38184:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   38188:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   3818c:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   38190:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
    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 <st_get_position_mm(unsigned char)>
   3819a:	60 93 9d 06 	sts	0x069D, r22	; 0x80069d <current_position+0xc>
   3819e:	70 93 9e 06 	sts	0x069E, r23	; 0x80069e <current_position+0xd>
   381a2:	80 93 9f 06 	sts	0x069F, r24	; 0x80069f <current_position+0xe>
   381a6:	90 93 a0 06 	sts	0x06A0, r25	; 0x8006a0 <current_position+0xf>

    // 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 <mbl>
   381ae:	88 23       	and	r24, r24
   381b0:	31 f1       	breq	.+76     	; 0x381fe <planner_reset_position()+0x11e>
#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 <current_position+0x4>
   381b6:	30 91 96 06 	lds	r19, 0x0696	; 0x800696 <current_position+0x5>
   381ba:	40 91 97 06 	lds	r20, 0x0697	; 0x800697 <current_position+0x6>
   381be:	50 91 98 06 	lds	r21, 0x0698	; 0x800698 <current_position+0x7>
   381c2:	60 91 91 06 	lds	r22, 0x0691	; 0x800691 <current_position>
   381c6:	70 91 92 06 	lds	r23, 0x0692	; 0x800692 <current_position+0x1>
   381ca:	80 91 93 06 	lds	r24, 0x0693	; 0x800693 <current_position+0x2>
   381ce:	90 91 94 06 	lds	r25, 0x0694	; 0x800694 <current_position+0x3>
   381d2:	0f 94 a5 a1 	call	0x3434a	; 0x3434a <mesh_bed_leveling::get_z(float, float) [clone .constprop.351]>
   381d6:	9b 01       	movw	r18, r22
   381d8:	ac 01       	movw	r20, r24
   381da:	60 91 99 06 	lds	r22, 0x0699	; 0x800699 <current_position+0x8>
   381de:	70 91 9a 06 	lds	r23, 0x069A	; 0x80069a <current_position+0x9>
   381e2:	80 91 9b 06 	lds	r24, 0x069B	; 0x80069b <current_position+0xa>
   381e6:	90 91 9c 06 	lds	r25, 0x069C	; 0x80069c <current_position+0xb>
   381ea:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   381ee:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   381f2:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   381f6:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   381fa:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
	}
}

inline void machine2world(float &x, float &y)
{
	if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) {
   381fe:	c0 91 0e 18 	lds	r28, 0x180E	; 0x80180e <world2machine_correction_mode>
   38202:	cc 23       	and	r28, r28
   38204:	09 f4       	brne	.+2      	; 0x38208 <planner_reset_position()+0x128>
   38206:	9a c0       	rjmp	.+308    	; 0x3833c <planner_reset_position()+0x25c>
		// No correction.
	} else {
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) {
   38208:	c0 ff       	sbrs	r28, 0
   3820a:	34 c0       	rjmp	.+104    	; 0x38274 <planner_reset_position()+0x194>
			// Then add the offset.
			x -= world2machine_shift[0];
   3820c:	20 91 06 18 	lds	r18, 0x1806	; 0x801806 <world2machine_shift>
   38210:	30 91 07 18 	lds	r19, 0x1807	; 0x801807 <world2machine_shift+0x1>
   38214:	40 91 08 18 	lds	r20, 0x1808	; 0x801808 <world2machine_shift+0x2>
   38218:	50 91 09 18 	lds	r21, 0x1809	; 0x801809 <world2machine_shift+0x3>
   3821c:	60 91 91 06 	lds	r22, 0x0691	; 0x800691 <current_position>
   38220:	70 91 92 06 	lds	r23, 0x0692	; 0x800692 <current_position+0x1>
   38224:	80 91 93 06 	lds	r24, 0x0693	; 0x800693 <current_position+0x2>
   38228:	90 91 94 06 	lds	r25, 0x0694	; 0x800694 <current_position+0x3>
   3822c:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   38230:	60 93 91 06 	sts	0x0691, r22	; 0x800691 <current_position>
   38234:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   38238:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   3823c:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
			y -= world2machine_shift[1];
   38240:	20 91 0a 18 	lds	r18, 0x180A	; 0x80180a <world2machine_shift+0x4>
   38244:	30 91 0b 18 	lds	r19, 0x180B	; 0x80180b <world2machine_shift+0x5>
   38248:	40 91 0c 18 	lds	r20, 0x180C	; 0x80180c <world2machine_shift+0x6>
   3824c:	50 91 0d 18 	lds	r21, 0x180D	; 0x80180d <world2machine_shift+0x7>
   38250:	60 91 95 06 	lds	r22, 0x0695	; 0x800695 <current_position+0x4>
   38254:	70 91 96 06 	lds	r23, 0x0696	; 0x800696 <current_position+0x5>
   38258:	80 91 97 06 	lds	r24, 0x0697	; 0x800697 <current_position+0x6>
   3825c:	90 91 98 06 	lds	r25, 0x0698	; 0x800698 <current_position+0x7>
   38260:	0f 94 37 dd 	call	0x3ba6e	; 0x3ba6e <__subsf3>
   38264:	60 93 95 06 	sts	0x0695, r22	; 0x800695 <current_position+0x4>
   38268:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
   3826c:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
   38270:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>
		}
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
   38274:	c1 ff       	sbrs	r28, 1
   38276:	62 c0       	rjmp	.+196    	; 0x3833c <planner_reset_position()+0x25c>
			// 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 <current_position>
   3827c:	90 90 92 06 	lds	r9, 0x0692	; 0x800692 <current_position+0x1>
   38280:	a0 90 93 06 	lds	r10, 0x0693	; 0x800693 <current_position+0x2>
   38284:	b0 90 94 06 	lds	r11, 0x0694	; 0x800694 <current_position+0x3>
   38288:	c0 90 95 06 	lds	r12, 0x0695	; 0x800695 <current_position+0x4>
   3828c:	d0 90 96 06 	lds	r13, 0x0696	; 0x800696 <current_position+0x5>
   38290:	e0 90 97 06 	lds	r14, 0x0697	; 0x800697 <current_position+0x6>
   38294:	f0 90 98 06 	lds	r15, 0x0698	; 0x800698 <current_position+0x7>
			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 <world2machine_rotation_and_skew_inv+0x8>
   3829c:	30 91 ff 17 	lds	r19, 0x17FF	; 0x8017ff <world2machine_rotation_and_skew_inv+0x9>
   382a0:	40 91 00 18 	lds	r20, 0x1800	; 0x801800 <world2machine_rotation_and_skew_inv+0xa>
   382a4:	50 91 01 18 	lds	r21, 0x1801	; 0x801801 <world2machine_rotation_and_skew_inv+0xb>
   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 <world2machine_rotation_and_skew_inv+0xc>
   382b8:	30 91 03 18 	lds	r19, 0x1803	; 0x801803 <world2machine_rotation_and_skew_inv+0xd>
   382bc:	40 91 04 18 	lds	r20, 0x1804	; 0x801804 <world2machine_rotation_and_skew_inv+0xe>
   382c0:	50 91 05 18 	lds	r21, 0x1805	; 0x801805 <world2machine_rotation_and_skew_inv+0xf>
   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 <world2machine_rotation_and_skew_inv>
   382e0:	30 91 f7 17 	lds	r19, 0x17F7	; 0x8017f7 <world2machine_rotation_and_skew_inv+0x1>
   382e4:	40 91 f8 17 	lds	r20, 0x17F8	; 0x8017f8 <world2machine_rotation_and_skew_inv+0x2>
   382e8:	50 91 f9 17 	lds	r21, 0x17F9	; 0x8017f9 <world2machine_rotation_and_skew_inv+0x3>
   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 <world2machine_rotation_and_skew_inv+0x4>
   382fc:	30 91 fb 17 	lds	r19, 0x17FB	; 0x8017fb <world2machine_rotation_and_skew_inv+0x5>
   38300:	40 91 fc 17 	lds	r20, 0x17FC	; 0x8017fc <world2machine_rotation_and_skew_inv+0x6>
   38304:	50 91 fd 17 	lds	r21, 0x17FD	; 0x8017fd <world2machine_rotation_and_skew_inv+0x7>
   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 <current_position>
   38320:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   38324:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   38328:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
			y = out_y;
   3832c:	40 92 95 06 	sts	0x0695, r4	; 0x800695 <current_position+0x4>
   38330:	50 92 96 06 	sts	0x0696, r5	; 0x800696 <current_position+0x5>
   38334:	60 92 97 06 	sts	0x0697, r6	; 0x800697 <current_position+0x6>
   38338:	70 92 98 06 	sts	0x0698, r7	; 0x800698 <current_position+0x7>
    }
#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 <set_destination_to_current()>
#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 <planner_reset_position()+0x26a>
#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 <planner_abort_hard()>:

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 <planner_reset_position()>

    // 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 <planner_aborted>
}


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 <block_buffer_head>
   38390:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
  while (blocks_queued()) plan_discard_current_block();
   38394:	98 17       	cp	r25, r24
   38396:	69 f0       	breq	.+26     	; 0x383b2 <planner_abort_hard()+0x44>
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 <block_buffer_head>
   3839c:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   383a0:	98 17       	cp	r25, r24
   383a2:	a1 f3       	breq	.-24     	; 0x3838c <planner_abort_hard()+0x1e>
    block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1);
   383a4:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <block_buffer_tail>
   383a8:	8f 5f       	subi	r24, 0xFF	; 255
   383aa:	8f 70       	andi	r24, 0x0F	; 15
   383ac:	80 93 a5 0d 	sts	0x0DA5, r24	; 0x800da5 <block_buffer_tail>
   383b0:	ed cf       	rjmp	.-38     	; 0x3838c <planner_abort_hard()+0x1e>
  current_block = NULL;
   383b2:	10 92 a1 05 	sts	0x05A1, r1	; 0x8005a1 <current_block+0x1>
   383b6:	10 92 a0 05 	sts	0x05A0, r1	; 0x8005a0 <current_block>
#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 <st_reset_timer()>
  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 <planner_abort_hard()+0x86>

    // 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_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>:
    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 <twi_start(unsigned char, unsigned char) [clone .constprop.239]>
   3840c:	81 11       	cpse	r24, r1
   3840e:	0f c0       	rjmp	.+30     	; 0x3842e <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]+0x2a>
      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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   38420:	81 11       	cpse	r24, r1
   38422:	05 c0       	rjmp	.+10     	; 0x3842e <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]+0x2a>
}


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_PID1>
    pat9125_PID2 = 0xff;
   38434:	80 93 bb 0d 	sts	0x0DBB, r24	; 0x800dbb <pat9125_PID2>
   38438:	f8 cf       	rjmp	.-16     	; 0x3842a <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]+0x26>

0003843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>:
	}
	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 <twi_start(unsigned char, unsigned char) [clone .constprop.239]>
   38440:	81 11       	cpse	r24, r1
   38442:	21 c0       	rjmp	.+66     	; 0x38486 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]+0x4c>
      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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   38450:	81 11       	cpse	r24, r1
   38452:	19 c0       	rjmp	.+50     	; 0x38486 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]+0x4c>
      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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   38466:	81 11       	cpse	r24, r1
   38468:	0e c0       	rjmp	.+28     	; 0x38486 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]+0x4c>
      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 <twi_wait(unsigned char) [clone .lto_priv.378]>
   38474:	81 11       	cpse	r24, r1
   38476:	07 c0       	rjmp	.+14     	; 0x38486 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]+0x4c>
      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_PID1>
    pat9125_PID2 = 0xff;
   3848c:	80 93 bb 0d 	sts	0x0DBB, r24	; 0x800dbb <pat9125_PID2>
    return 0;
   38490:	80 e0       	ldi	r24, 0x00	; 0
   38492:	f7 cf       	rjmp	.-18     	; 0x38482 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]+0x48>

00038494 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.381]>:
	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 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.381]+0x38>
			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 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.380]>
	return pat9125_rd_reg(addr) == data;
   384b2:	8d 2f       	mov	r24, r29
   384b4:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
{
	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 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.381]+0xa>
			// 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 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.381]+0x2e>

000384d0 <pat9125_update()>:

	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 <pat9125_PID1>
   384d8:	81 33       	cpi	r24, 0x31	; 49
   384da:	21 f0       	breq	.+8      	; 0x384e4 <pat9125_update()+0x14>
			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 <pat9125_PID2>
   384e8:	81 39       	cpi	r24, 0x91	; 145
   384ea:	c1 f7       	brne	.-16     	; 0x384dc <pat9125_update()+0xc>
	{
		uint8_t ucMotion = pat9125_rd_reg(PAT9125_MOTION);
   384ec:	82 e0       	ldi	r24, 0x02	; 2
   384ee:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   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 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   384fa:	80 93 b9 0d 	sts	0x0DB9, r24	; 0x800db9 <pat9125_b>
		pat9125_s = pat9125_rd_reg(PAT9125_SHUTTER);
   384fe:	84 e1       	ldi	r24, 0x14	; 20
   38500:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   38504:	80 93 ba 0d 	sts	0x0DBA, r24	; 0x800dba <pat9125_s>
		if (pat9125_PID1 == 0xff) return 0;
   38508:	80 91 bc 0d 	lds	r24, 0x0DBC	; 0x800dbc <pat9125_PID1>
   3850c:	8f 3f       	cpi	r24, 0xFF	; 255
   3850e:	31 f3       	breq	.-52     	; 0x384dc <pat9125_update()+0xc>
		if (ucMotion & 0x80)
   38510:	c7 ff       	sbrs	r28, 7
   38512:	36 c0       	rjmp	.+108    	; 0x38580 <pat9125_update()+0xb0>
		{
			uint16_t ucXL = pat9125_rd_reg(PAT9125_DELTA_XL);
   38514:	83 e0       	ldi	r24, 0x03	; 3
   38516:	0f 94 1d c2 	call	0x3843a	; 0x3843a <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   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 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
   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 <pat9125_rd_reg(unsigned char) [clone .lto_priv.379]>
			if (pat9125_PID1 == 0xff) return 0;
   3852a:	90 91 bc 0d 	lds	r25, 0x0DBC	; 0x800dbc <pat9125_PID1>
   3852e:	9f 3f       	cpi	r25, 0xFF	; 255
   38530:	a9 f2       	breq	.-86     	; 0x384dc <pat9125_update()+0xc>
		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 <pat9125_update()+0x68>
   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 <pat9125_x>
   3855c:	50 91 96 03 	lds	r21, 0x0396	; 0x800396 <pat9125_x+0x1>
   38560:	24 0f       	add	r18, r20
   38562:	35 1f       	adc	r19, r21
   38564:	30 93 96 03 	sts	0x0396, r19	; 0x800396 <pat9125_x+0x1>
   38568:	20 93 95 03 	sts	0x0395, r18	; 0x800395 <pat9125_x>
			pat9125_y += iDY;
   3856c:	20 91 8e 0e 	lds	r18, 0x0E8E	; 0x800e8e <pat9125_y>
   38570:	30 91 8f 0e 	lds	r19, 0x0E8F	; 0x800e8f <pat9125_y+0x1>
   38574:	82 0f       	add	r24, r18
   38576:	93 1f       	adc	r25, r19
   38578:	90 93 8f 0e 	sts	0x0E8F, r25	; 0x800e8f <pat9125_y+0x1>
   3857c:	80 93 8e 0e 	sts	0x0E8E, r24	; 0x800e8e <pat9125_y>
		}
		return 1;
   38580:	81 e0       	ldi	r24, 0x01	; 1
   38582:	ad cf       	rjmp	.-166    	; 0x384de <pat9125_update()+0xe>

00038584 <spi_init.lto_priv.427>:
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 <optiboot_xflash_enter()>:

//! @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 <optiboot_xflash_enter()+0x58>
   385f0:	80 91 fb 1f 	lds	r24, 0x1FFB	; 0x801ffb <__bss_end+0x7dc>
   385f4:	87 fd       	sbrc	r24, 7
   385f6:	c2 c1       	rjmp	.+900    	; 0x3897c <optiboot_xflash_enter()+0x3dc>
  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 <selectedSerialPort>
    // 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 <optiboot_xflash_enter()+0x6e>
      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 <optiboot_xflash_enter()+0x5e>
    }
    selectedSerialPort = 0; //switch to Serial0
   3860e:	10 92 38 05 	sts	0x0538, r1	; 0x800538 <selectedSerialPort>
  // 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 <rx_buffer+0x82>
   38616:	10 91 9b 04 	lds	r17, 0x049B	; 0x80049b <rx_buffer+0x83>
   3861a:	10 93 99 04 	sts	0x0499, r17	; 0x800499 <rx_buffer+0x81>
   3861e:	00 93 98 04 	sts	0x0498, r16	; 0x800498 <rx_buffer+0x80>
   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 <putch(char)>
   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 <optiboot_xflash_enter()+0x92>
      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 <rx_buffer+0x80>
   3865c:	f0 91 99 04 	lds	r31, 0x0499	; 0x800499 <rx_buffer+0x81>
   38660:	e0 17       	cp	r30, r16
   38662:	f1 07       	cpc	r31, r17
   38664:	19 f5       	brne	.+70     	; 0x386ac <optiboot_xflash_enter()+0x10c>
        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 <optiboot_xflash_enter()+0xb8>
      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 <selectedSerialPort>
          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 <optiboot_xflash_enter()+0xd2>
      {
          // 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 <optiboot_xflash_enter()+0x130>
   386ce:	c0 cf       	rjmp	.-128    	; 0x38650 <optiboot_xflash_enter()+0xb0>
          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 <putch(char)>
   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 <optiboot_xflash_enter()+0x13e>
      putch(pgm_read_byte(ptr ++));
  }

  spi_init();
   386f2:	0f 94 c2 c2 	call	0x38584	; 0x38584 <spi_init.lto_priv.427>
  xflash_init();
   386f6:	0e 94 d0 ee 	call	0x1dda0	; 0x1dda0 <xflash_init>
				"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_clear()>
  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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

  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 <getch()>

    if(ch == STK_GET_PARAMETER) {
   3874c:	81 34       	cpi	r24, 0x41	; 65
   3874e:	a9 f4       	brne	.+42     	; 0x3877a <optiboot_xflash_enter()+0x1da>
      unsigned char which = getch();
   38750:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   38754:	e8 2e       	mov	r14, r24
      verifySpace();
   38756:	0f 94 ab b0 	call	0x36156	; 0x36156 <verifySpace()>
      /*
       * 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 <optiboot_xflash_enter()+0x1ca>
        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 <optiboot_xflash_enter()+0x1d6>
        putch(optiboot_version >> 8);
   38768:	86 e0       	ldi	r24, 0x06	; 6
   3876a:	0f 94 2c ae 	call	0x35c58	; 0x35c58 <putch(char)>
    }
    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 <putch(char)>
   38774:	e9 cf       	rjmp	.-46     	; 0x38748 <optiboot_xflash_enter()+0x1a8>
      } 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 <optiboot_xflash_enter()+0x1ca>
      }
    }
    else if(ch == STK_SET_DEVICE) {
   3877a:	82 34       	cpi	r24, 0x42	; 66
   3877c:	21 f4       	brne	.+8      	; 0x38786 <optiboot_xflash_enter()+0x1e6>
      // 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 <getNch(unsigned char)>
   38784:	f4 cf       	rjmp	.-24     	; 0x3876e <optiboot_xflash_enter()+0x1ce>
    }
    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 <optiboot_xflash_enter()+0x1ee>
      // SET DEVICE EXT is ignored
      getNch(5);
   3878a:	85 e0       	ldi	r24, 0x05	; 5
   3878c:	f9 cf       	rjmp	.-14     	; 0x38780 <optiboot_xflash_enter()+0x1e0>
    }
    else if(ch == STK_LOAD_ADDRESS) {
   3878e:	85 35       	cpi	r24, 0x55	; 85
   38790:	c9 f4       	brne	.+50     	; 0x387c4 <optiboot_xflash_enter()+0x224>
      // 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 <getch()>
   38796:	08 2f       	mov	r16, r24
      newAddress |= getch();
   38798:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   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 <getch()>
   387a4:	18 2b       	or	r17, r24
      newAddress |= (((uint16_t)getch()) << 8);
   387a6:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   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 <optiboot_xflash_enter()+0x21e>
        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 <verifySpace()>
   387bc:	d8 cf       	rjmp	.-80     	; 0x3876e <optiboot_xflash_enter()+0x1ce>
      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 <optiboot_xflash_enter()+0x214>
      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 <optiboot_xflash_enter()+0x250>
      // 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 <getch()>
   387cc:	8d 34       	cpi	r24, 0x4D	; 77
   387ce:	71 f4       	brne	.+28     	; 0x387ec <optiboot_xflash_enter()+0x24c>
        // get address
        getch();  // get '0'
   387d0:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
        rampz = (rampz & 0x01) | ((getch() << 1) & 0xff);  // get address and put it in rampz
   387d4:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   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 <getNch(unsigned char)>
        putch(0x00);
   387e8:	80 e0       	ldi	r24, 0x00	; 0
   387ea:	bf cf       	rjmp	.-130    	; 0x3876a <optiboot_xflash_enter()+0x1ca>
        // response
        putch(0x00);
      }
      else {
        // everything else is ignored
        getNch(3);
   387ec:	83 e0       	ldi	r24, 0x03	; 3
   387ee:	fa cf       	rjmp	.-12     	; 0x387e4 <optiboot_xflash_enter()+0x244>
        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 <optiboot_xflash_enter()+0x256>
   387f4:	77 c0       	rjmp	.+238    	; 0x388e4 <optiboot_xflash_enter()+0x344>
      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 <getch()>
   387fa:	b8 2e       	mov	r11, r24
      length |= ((pagelen_t)getch()) << 8;
   387fc:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   38800:	c8 2e       	mov	r12, r24
      length |= getch();
   38802:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   38806:	e8 2e       	mov	r14, r24
      length |= getch();
   38808:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
      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 <getch()>
   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 <getch()>
   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 <optiboot_xflash_enter()+0x296>

      // Read command terminator, start reply
      verifySpace();
   38846:	0f 94 ab b0 	call	0x36156	; 0x36156 <verifySpace()>
      if (desttype == 'E') {
   3884a:	f5 e4       	ldi	r31, 0x45	; 69
   3884c:	5f 12       	cpse	r5, r31
   3884e:	01 c0       	rjmp	.+2      	; 0x38852 <optiboot_xflash_enter()+0x2b2>
   38850:	ff cf       	rjmp	.-2      	; 0x38850 <optiboot_xflash_enter()+0x2b0>
        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 <optiboot_xflash_enter()+0x316>
   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 <optiboot_xflash_enter()+0x2da>
   38876:	95 95       	asr	r25
   38878:	87 95       	ror	r24
   3887a:	0a 94       	dec	r0
   3887c:	e2 f7       	brpl	.-8      	; 0x38876 <optiboot_xflash_enter()+0x2d6>
   3887e:	80 fd       	sbrc	r24, 0
   38880:	1a c0       	rjmp	.+52     	; 0x388b6 <optiboot_xflash_enter()+0x316>
          xflash_wait_busy();
   38882:	0e 94 5d ed 	call	0x1daba	; 0x1daba <xflash_wait_busy>
          xflash_enable_wr();
   38886:	0e 94 f9 ed 	call	0x1dbf2	; 0x1dbf2 <xflash_enable_wr>
	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_erase>
          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 <optiboot_xflash_enter()+0x2fc>
   3889a:	88 0f       	add	r24, r24
   3889c:	8a 94       	dec	r8
   3889e:	ea f7       	brpl	.-6      	; 0x3889a <optiboot_xflash_enter()+0x2fa>
   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_wait_busy>
        xflash_enable_wr();
   388ba:	0e 94 f9 ed 	call	0x1dbf2	; 0x1dbf2 <xflash_enable_wr>
        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_page_program>
        xflash_wait_busy();
   388d4:	0e 94 5d ed 	call	0x1daba	; 0x1daba <xflash_wait_busy>
	_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 <spi_txrx.lto_priv.531>
	_CS_HIGH();
   388e0:	45 9a       	sbi	0x08, 5	; 8
   388e2:	45 cf       	rjmp	.-374    	; 0x3876e <optiboot_xflash_enter()+0x1ce>
        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 <optiboot_xflash_enter()+0x3a8>
      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 <getch()>
   388f0:	d8 2e       	mov	r13, r24
      length |= ((pagelen_t)getch()) << 8;
   388f2:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   388f6:	c8 2e       	mov	r12, r24
      length |= getch();
   388f8:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
   388fc:	e8 2e       	mov	r14, r24
      length |= getch();
   388fe:	0f 94 33 ae 	call	0x35c66	; 0x35c66 <getch()>
      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 <getch()>
      verifySpace();
   38918:	0f 94 ab b0 	call	0x36156	; 0x36156 <verifySpace()>
      xflash_wait_busy();
   3891c:	0e 94 5d ed 	call	0x1daba	; 0x1daba <xflash_wait_busy>
      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 <xflash_rd_data>
   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 <optiboot_xflash_enter()+0x39c>
   3893a:	19 cf       	rjmp	.-462    	; 0x3876e <optiboot_xflash_enter()+0x1ce>
        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 <putch(char)>
   38946:	f3 cf       	rjmp	.-26     	; 0x3892e <optiboot_xflash_enter()+0x38e>
    }
    /* Get device signature bytes  */
    else if(ch == STK_READ_SIGN) {
   38948:	85 37       	cpi	r24, 0x75	; 117
   3894a:	51 f4       	brne	.+20     	; 0x38960 <optiboot_xflash_enter()+0x3c0>
      // READ SIGN - return what Avrdude wants to hear
      verifySpace();
   3894c:	0f 94 ab b0 	call	0x36156	; 0x36156 <verifySpace()>
      putch(XFLASH_SIGNATURE_0);
   38950:	8e e1       	ldi	r24, 0x1E	; 30
   38952:	0f 94 2c ae 	call	0x35c58	; 0x35c58 <putch(char)>
      putch(XFLASH_SIGNATURE_1);
   38956:	88 e9       	ldi	r24, 0x98	; 152
   38958:	0f 94 2c ae 	call	0x35c58	; 0x35c58 <putch(char)>
      putch(XFLASH_SIGNATURE_2);
   3895c:	81 e0       	ldi	r24, 0x01	; 1
   3895e:	05 cf       	rjmp	.-502    	; 0x3876a <optiboot_xflash_enter()+0x1ca>
    }
    else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
   38960:	81 35       	cpi	r24, 0x51	; 81
   38962:	09 f0       	breq	.+2      	; 0x38966 <optiboot_xflash_enter()+0x3c6>
   38964:	29 cf       	rjmp	.-430    	; 0x387b8 <optiboot_xflash_enter()+0x218>
				: "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 <optiboot_xflash_enter()+0x218>
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 <optiboot_xflash_enter()+0xd8>

00038980 <MMU2::ScreenUpdateEnable()>:
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 <lcd_update_enable(unsigned char)>

00038986 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.386]>:

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_update_enable(unsigned char)>
    lcd_clear();
   38996:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
    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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
}

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_write(unsigned char) [clone .lto_priv.432]>
    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 <lcd_print(long, int) [clone .part.3]>

000389c4 <MMU2::IncrementMMUFails()>:
    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_byte(unsigned char*)>
    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 <eeprom_increment_word(unsigned int*)>

000389d4 <MMU2::ReportErrorHookDynamicRender()>:
    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 <MMU2::mmu2+0x45>
   389da:	81 11       	cpse	r24, r1
   389dc:	01 c0       	rjmp	.+2      	; 0x389e0 <MMU2::ReportErrorHookDynamicRender()+0xc>
   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 <lcd_putc_at(unsigned char, unsigned char, char)>
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 <fsensor+0xd>
   389f0:	81 11       	cpse	r24, r1
   389f2:	01 c0       	rjmp	.+2      	; 0x389f6 <MMU2::ReportErrorHookDynamicRender()+0x22>
   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 <lcd_putc_at(unsigned char, unsigned char, char)>

    // 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 <lcd_set_cursor(unsigned char, unsigned char)>
    lcdui_print_extruder();
   38a08:	0f 94 24 22 	call	0x24448	; 0x24448 <lcdui_print_extruder()>

    // 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_set_cursor(unsigned char, unsigned char)>
    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 <current_temperature>
   38a20:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   38a24:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   38a28:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   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 <lcd_printf_P(char const*, ...)>
   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 <modules::protocol::Protocol::Nibble2Char(unsigned char)>:
            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 <modules::protocol::Protocol::Nibble2Char(unsigned char)+0xc>
   38a52:	80 31       	cpi	r24, 0x10	; 16
   38a54:	20 f4       	brcc	.+8      	; 0x38a5e <modules::protocol::Protocol::Nibble2Char(unsigned char)+0x10>
        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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>:
    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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]+0x10>
    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 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]+0x26>
        *dst = Nibble2Char(v);
   38a80:	0f 94 27 c5 	call	0x38a4e	; 0x38a4e <modules::protocol::Protocol::Nibble2Char(unsigned char)>
   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 <modules::protocol::Protocol::Nibble2Char(unsigned char)>
   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 <modules::protocol::Protocol::Char2Nibble(unsigned char)>:
    }
    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 <modules::protocol::Protocol::Char2Nibble(unsigned char)+0x10>
   38aa2:	8a 33       	cpi	r24, 0x3A	; 58
   38aa4:	30 f0       	brcs	.+12     	; 0x38ab2 <modules::protocol::Protocol::Char2Nibble(unsigned char)+0x14>
   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 <modules::protocol::Protocol::Char2Nibble(unsigned char)+0x18>
        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 <modules::protocol::RequestMsg::ComputeCRC8() const>:
    /// 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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
        crc = modules::crc::CRC8::CCITT_updateCX(crc, value);
   38ac8:	69 81       	ldd	r22, Y+1	; 0x01
   38aca:	0f 94 3f ae 	call	0x35c7e	; 0x35c7e <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
        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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
   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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>

00038ae0 <modules::protocol::ResponseMsg::ComputeCRC8() const>:
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 <modules::protocol::RequestMsg::ComputeCRC8() const>
        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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
        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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
   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 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>

00038b02 <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>:
        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 <modules::protocol::RequestMsg::ComputeCRC8() const>
   38b14:	8c 83       	std	Y+4, r24	; 0x04
    }
   38b16:	df 91       	pop	r29
   38b18:	cf 91       	pop	r28
   38b1a:	08 95       	ret

00038b1c <MMU2::reset()>:
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 <MMU2::reset()+0x14>
   38b34:	00 c0       	rjmp	.+0      	; 0x38b36 <MMU2::reset()+0x1a>
   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 <MMU2::Disable_E0()>:
void Enable_E0() {
    enable_e0();
}

void Disable_E0() {
    disable_e0();
   38b46:	14 9a       	sbi	0x02, 4	; 2
}
   38b48:	08 95       	ret

00038b4a <MMU2::extruder_move(float, float)>:
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 <plan_buffer_line_curposXYZE(float)>

00038b8a <go_to_current(float) [clone .lto_priv.388]>:
    st_synchronize();
}

static inline void go_to_current(float fr)
{
    plan_buffer_line_curposXYZE(fr);
   38b8a:	0f 94 3d c0 	call	0x3807a	; 0x3807a <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   38b8e:	0d 94 a9 43 	jmp	0x28752	; 0x28752 <st_synchronize()>

00038b92 <MMU2::LogEchoEvent_P(char const*)>:
#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 <serialprintPGM(char const*)>
    SERIAL_MMU2();
   38ba0:	85 e3       	ldi	r24, 0x35	; 53
   38ba2:	9b ea       	ldi	r25, 0xAB	; 171
   38ba4:	0e 94 e8 76 	call	0xedd0	; 0xedd0 <serialprintPGM(char const*)>
    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 <serialprintlnPGM(char const*)>

00038bb2 <MMU2::WhereIsFilament()>:
#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 <fsensor+0xd>
   38bb8:	91 11       	cpse	r25, r1
   38bba:	01 c0       	rjmp	.+2      	; 0x38bbe <MMU2::WhereIsFilament()+0xc>
   38bbc:	80 e0       	ldi	r24, 0x00	; 0
}
   38bbe:	08 95       	ret

00038bc0 <MMU2::PrusaErrorCodeIndex(ErrorCode)>:
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xa>
   38bc8:	97 c0       	rjmp	.+302    	; 0x38cf8 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x138>
   38bca:	08 f0       	brcs	.+2      	; 0x38bce <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xe>
   38bcc:	48 c0       	rjmp	.+144    	; 0x38c5e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x9e>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x18>
   38bd6:	9a c0       	rjmp	.+308    	; 0x38d0c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x14c>
   38bd8:	30 f5       	brcc	.+76     	; 0x38c26 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x66>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x24>
   38be2:	80 c0       	rjmp	.+256    	; 0x38ce4 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x124>
   38be4:	a8 f4       	brcc	.+42     	; 0x38c10 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x50>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x30>
   38bee:	17 c1       	rjmp	.+558    	; 0x38e1e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x25e>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
   38bf8:	73 c0       	rjmp	.+230    	; 0x38ce0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x120>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x15c>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x4c>
   38c0a:	9e c0       	rjmp	.+316    	; 0x38d48 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x188>
            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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x5a>
   38c18:	67 c0       	rjmp	.+206    	; 0x38ce8 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x128>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x70>
   38c2e:	5e c0       	rjmp	.+188    	; 0x38cec <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x12c>
   38c30:	58 f4       	brcc	.+22     	; 0x38c48 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x88>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x7c>
   38c3a:	6e c0       	rjmp	.+220    	; 0x38d18 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x158>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x92>
   38c50:	51 c0       	rjmp	.+162    	; 0x38cf4 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x134>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xa8>
   38c66:	56 c0       	rjmp	.+172    	; 0x38d14 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x154>
   38c68:	e0 f4       	brcc	.+56     	; 0x38ca2 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xe2>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xb4>
   38c72:	4e c0       	rjmp	.+156    	; 0x38d10 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x150>
   38c74:	58 f4       	brcc	.+22     	; 0x38c8c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xcc>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x130>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xc8>
   38c86:	b9 cf       	rjmp	.-142    	; 0x38bfa <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x148>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xde>
   38c9c:	ae cf       	rjmp	.-164    	; 0x38bfa <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
        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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x13c>
   38caa:	58 f4       	brcc	.+22     	; 0x38cc2 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x102>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xfe>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xfe>
   38cbc:	9e cf       	rjmp	.-196    	; 0x38bfa <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x140>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x144>
   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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x11c>
   38cda:	8f cf       	rjmp	.-226    	; 0x38bfa <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
        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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x16e>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1d2>
            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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x21a>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x184>
   38d42:	4b c0       	rjmp	.+150    	; 0x38dda <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x21a>
            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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x194>
   38d52:	67 c0       	rjmp	.+206    	; 0x38e22 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x262>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1a0>
   38d5e:	63 c0       	rjmp	.+198    	; 0x38e26 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x266>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1ac>
   38d6a:	5f c0       	rjmp	.+190    	; 0x38e2a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x26a>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1b8>
   38d76:	5b c0       	rjmp	.+182    	; 0x38e2e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x26e>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1c4>
   38d82:	57 c0       	rjmp	.+174    	; 0x38e32 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x272>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1ce>
   38d8c:	68 c0       	rjmp	.+208    	; 0x38e5e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
            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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1de>
   38d9c:	4c c0       	rjmp	.+152    	; 0x38e36 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x276>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1ea>
   38da8:	48 c0       	rjmp	.+144    	; 0x38e3a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x27a>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1f6>
   38db4:	44 c0       	rjmp	.+136    	; 0x38e3e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x27e>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x202>
   38dc0:	40 c0       	rjmp	.+128    	; 0x38e42 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x282>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x286>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x216>
   38dd4:	44 c0       	rjmp	.+136    	; 0x38e5e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
            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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x220>
   38dde:	3f c0       	rjmp	.+126    	; 0x38e5e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x28a>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x28e>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x292>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x296>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29a>
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 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
            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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]>:

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 <MMU2::mmu2+0x40>
   38e76:	30 91 8b 13 	lds	r19, 0x138B	; 0x80138b <MMU2::mmu2+0x41>
   38e7a:	21 30       	cpi	r18, 0x01	; 1
   38e7c:	31 05       	cpc	r19, r1
   38e7e:	39 f4       	brne	.+14     	; 0x38e8e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x2c>
   38e80:	20 91 b3 13 	lds	r18, 0x13B3	; 0x8013b3 <MMU2::mmu2+0x69>
   38e84:	21 30       	cpi	r18, 0x01	; 1
   38e86:	19 f4       	brne	.+6      	; 0x38e8e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x2c>
        // 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 <MMU2::ReportErrorHookState>
    }

    const uint8_t ei = PrusaErrorCodeIndex((ErrorCode)ec);
   38e8e:	0f 94 e0 c5 	call	0x38bc0	; 0x38bc0 <MMU2::PrusaErrorCodeIndex(ErrorCode)>
   38e92:	d8 2f       	mov	r29, r24

    switch ((uint8_t)ReportErrorHookState) {
   38e94:	80 91 f5 17 	lds	r24, 0x17F5	; 0x8017f5 <MMU2::ReportErrorHookState>
   38e98:	81 30       	cpi	r24, 0x01	; 1
   38e9a:	09 f4       	brne	.+2      	; 0x38e9e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x3c>
   38e9c:	64 c0       	rjmp	.+200    	; 0x38f66 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x104>
   38e9e:	60 f0       	brcs	.+24     	; 0x38eb8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x56>
   38ea0:	82 30       	cpi	r24, 0x02	; 2
   38ea2:	09 f4       	brne	.+2      	; 0x38ea6 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x44>
   38ea4:	f4 c0       	rjmp	.+488    	; 0x3908e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x22c>
        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 <busy_state>
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_update_enable(unsigned char)>
    lcd_clear();
   38eda:	0e 94 ab 6e 	call	0xdd56	; 0xdd56 <lcd_clear()>
    // 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 <lang_get_translation>
   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_printf_P(char const*, ...)>
    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_puts_at_P(unsigned char, unsigned char, char const*)>
    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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x254>
   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 <lang_get_translation>
   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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0xf6>
   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 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>

    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 <MMU2::ReportErrorHookState>
        [[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 <MMU2::ReportErrorHookDynamicRender()>
        sound_wait_for_user();
   38f70:	0f 94 e1 52 	call	0x2a5c2	; 0x2a5c2 <sound_wait_for_user()>
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 <guard variable for MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   38f8a:	81 11       	cpse	r24, r1
   38f8c:	09 c0       	rjmp	.+18     	; 0x38fa0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x13e>
   38f8e:	81 e0       	ldi	r24, 0x01	; 1
   38f90:	d1 11       	cpse	r29, r1
   38f92:	01 c0       	rjmp	.+2      	; 0x38f96 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x134>
   38f94:	80 e0       	ldi	r24, 0x00	; 0
   38f96:	80 93 ec 17 	sts	0x17EC, r24	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   38f9a:	81 e0       	ldi	r24, 0x01	; 1
   38f9c:	80 93 ed 17 	sts	0x17ED, r24	; 0x8017ed <guard variable for MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
    static int8_t choice_selected = -1;

    if (reset_button_selection) {
   38fa0:	80 91 eb 17 	lds	r24, 0x17EB	; 0x8017eb <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
   38fa4:	88 23       	and	r24, r24
   38fa6:	41 f0       	breq	.+16     	; 0x38fb8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x156>
        // 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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x14e>
   38fae:	80 e0       	ldi	r24, 0x00	; 0
   38fb0:	80 93 ec 17 	sts	0x17EC, r24	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        choice_selected = -1;
        reset_button_selection = 0;
   38fb4:	10 92 eb 17 	sts	0x17EB, r1	; 0x8017eb <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
    }

    // Check if knob was rotated
    if (lcd_encoder) {
   38fb8:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   38fbc:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   38fc0:	21 15       	cp	r18, r1
   38fc2:	31 05       	cpc	r19, r1
   38fc4:	b9 f1       	breq	.+110    	; 0x39034 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1d2>
   38fc6:	80 91 ec 17 	lds	r24, 0x17EC	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        if (two_choices == false) { // third_choice is not nullptr, safe to dereference
   38fca:	dd 23       	and	r29, r29
   38fcc:	61 f0       	breq	.+24     	; 0x38fe6 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x184>
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   38fce:	37 ff       	sbrs	r19, 7
   38fd0:	06 c0       	rjmp	.+12     	; 0x38fde <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x17c>
   38fd2:	88 23       	and	r24, r24
   38fd4:	69 f0       	breq	.+26     	; 0x38ff0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
                // 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 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   38fdc:	09 c0       	rjmp	.+18     	; 0x38ff0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
    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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
                // Rotating knob clockwise
                current_selection++;
   38fe2:	8f 5f       	subi	r24, 0xFF	; 255
   38fe4:	f9 cf       	rjmp	.-14     	; 0x38fd8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x176>
            }
        } else {
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   38fe6:	37 ff       	sbrs	r19, 7
   38fe8:	41 c0       	rjmp	.+130    	; 0x3906c <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x20a>
   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 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        //! ----------------------
        //! |>(left)   >(mid)    |
        //! ----------------------
        //! @endcode
        //
        lcd_putc_at(0, 3, current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
   38ff0:	80 91 ec 17 	lds	r24, 0x17EC	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   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 <lcd_putc_at(unsigned char, unsigned char, char)>
   39002:	80 91 ec 17 	lds	r24, 0x17EC	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        if (two_choices == false)
   39006:	dd 23       	and	r29, r29
   39008:	b1 f1       	breq	.+108    	; 0x39076 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x214>
        {
            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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1b0>
   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(unsigned char, unsigned char, char)>
            lcd_putc_at(18, 3, current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
   3901a:	80 91 ec 17 	lds	r24, 0x17EC	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   3901e:	82 30       	cpi	r24, 0x02	; 2
   39020:	61 f5       	brne	.+88     	; 0x3907a <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x218>
        } 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 <lcd_putc_at(unsigned char, unsigned char, char)>
        }
        // Consume rotation event
        lcd_encoder = 0;
   3902c:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   39030:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
    }

    // Check if knob was clicked and consume the event
    if (lcd_clicked()) {
   39034:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   39038:	88 23       	and	r24, r24
   3903a:	09 f4       	brne	.+2      	; 0x3903e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1dc>
   3903c:	34 cf       	rjmp	.-408    	; 0x38ea6 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x44>
        choice_selected = current_selection;
   3903e:	80 91 ec 17 	lds	r24, 0x17EC	; 0x8017ec <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
    } 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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x21c>
   39046:	81 30       	cpi	r24, 0x01	; 1
   39048:	89 f5       	brne	.+98     	; 0x390ac <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x24a>
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 <lang_get_translation>
   3905c:	0f 94 cd 20 	call	0x2419a	; 0x2419a <lcd_show_fullscreen_message_and_wait_P(char const*)>
        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 <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
                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 <MMU2::ReportErrorHookState>
   3906a:	1d cf       	rjmp	.-454    	; 0x38ea6 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x44>
            }
        } 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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x210>
   39070:	bf cf       	rjmp	.-130    	; 0x38ff0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
                // Rotating knob clockwise
                current_selection = LCD_MIDDLE_BUTTON_CHOICE;
   39072:	81 e0       	ldi	r24, 0x01	; 1
   39074:	b1 cf       	rjmp	.-158    	; 0x38fd8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x176>
        {
            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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1c0>
   3907a:	40 e2       	ldi	r20, 0x20	; 32
   3907c:	d3 cf       	rjmp	.-90     	; 0x39024 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1c2>
        // 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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1e8>
    {
        // '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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x24a>

    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 <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
                // 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_update_enable(unsigned char)>
                lcd_return_to_status();
   39094:	0f 94 82 1f 	call	0x23f04	; 0x23f04 <lcd_return_to_status()>
   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 <busy_state>
   390aa:	dd cf       	rjmp	.-70     	; 0x39066 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x204>
    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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x228>
    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 <lang_get_translation>
   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 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0xd8>

000390d6 <MMU2::ButtonAvailable(ErrorCode)>:
    buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation
    return result;
}

Buttons ButtonAvailable(ErrorCode ec) {
    uint8_t ei = PrusaErrorCodeIndex(ec);
   390d6:	0f 94 e0 c5 	call	0x38bc0	; 0x38bc0 <MMU2::PrusaErrorCodeIndex(ErrorCode)>
    // 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 <MMU2::ButtonAvailable(ErrorCode)+0x1e>
   390f2:	41 c0       	rjmp	.+130    	; 0x39176 <MMU2::ButtonAvailable(ErrorCode)+0xa0>
   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 <MMU2::ButtonAvailable(ErrorCode)+0x84>
   390fc:	2e 37       	cpi	r18, 0x7E	; 126
   390fe:	31 05       	cpc	r19, r1
   39100:	09 f4       	brne	.+2      	; 0x39104 <MMU2::ButtonAvailable(ErrorCode)+0x2e>
   39102:	83 c0       	rjmp	.+262    	; 0x3920a <MMU2::ButtonAvailable(ErrorCode)+0x134>
   39104:	f0 f4       	brcc	.+60     	; 0x39142 <MMU2::ButtonAvailable(ErrorCode)+0x6c>
   39106:	2c 36       	cpi	r18, 0x6C	; 108
   39108:	31 05       	cpc	r19, r1
   3910a:	09 f4       	brne	.+2      	; 0x3910e <MMU2::ButtonAvailable(ErrorCode)+0x38>
   3910c:	85 c0       	rjmp	.+266    	; 0x39218 <MMU2::ButtonAvailable(ErrorCode)+0x142>
   3910e:	30 f4       	brcc	.+12     	; 0x3911c <MMU2::ButtonAvailable(ErrorCode)+0x46>
   39110:	25 36       	cpi	r18, 0x65	; 101
   39112:	31 05       	cpc	r19, r1
   39114:	08 f0       	brcs	.+2      	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
   39116:	79 c0       	rjmp	.+242    	; 0x3920a <MMU2::ButtonAvailable(ErrorCode)+0x134>

    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 <MMU2::ButtonAvailable(ErrorCode)+0x4e>
   39122:	73 c0       	rjmp	.+230    	; 0x3920a <MMU2::ButtonAvailable(ErrorCode)+0x134>
   39124:	2d 37       	cpi	r18, 0x7D	; 125
   39126:	31 05       	cpc	r19, r1
   39128:	19 f0       	breq	.+6      	; 0x39130 <MMU2::ButtonAvailable(ErrorCode)+0x5a>
   3912a:	23 37       	cpi	r18, 0x73	; 115
   3912c:	31 05       	cpc	r19, r1
   3912e:	a1 f7       	brne	.-24     	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
            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 <MMU2::ButtonAvailable(ErrorCode)+0x64>
   39138:	6d c0       	rjmp	.+218    	; 0x39214 <MMU2::ButtonAvailable(ErrorCode)+0x13e>
   3913a:	87 30       	cpi	r24, 0x07	; 7
   3913c:	69 f7       	brne	.-38     	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        // 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 <MMU2::ButtonAvailable(ErrorCode)+0x74>
   39148:	6e c0       	rjmp	.+220    	; 0x39226 <MMU2::ButtonAvailable(ErrorCode)+0x150>
   3914a:	50 f4       	brcc	.+20     	; 0x39160 <MMU2::ButtonAvailable(ErrorCode)+0x8a>
   3914c:	29 3c       	cpi	r18, 0xC9	; 201
   3914e:	31 05       	cpc	r19, r1
   39150:	09 f4       	brne	.+2      	; 0x39154 <MMU2::ButtonAvailable(ErrorCode)+0x7e>
   39152:	69 c0       	rjmp	.+210    	; 0x39226 <MMU2::ButtonAvailable(ErrorCode)+0x150>
   39154:	2a 3c       	cpi	r18, 0xCA	; 202
   39156:	31 05       	cpc	r19, r1
   39158:	f9 f6       	brne	.-66     	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
    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 <MMU2::ButtonAvailable(ErrorCode)+0x158>

    // 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 <MMU2::ButtonAvailable(ErrorCode)+0x92>
   39166:	5f c0       	rjmp	.+190    	; 0x39226 <MMU2::ButtonAvailable(ErrorCode)+0x150>
   39168:	2e 3d       	cpi	r18, 0xDE	; 222
   3916a:	31 05       	cpc	r19, r1
   3916c:	b1 f3       	breq	.-20     	; 0x3915a <MMU2::ButtonAvailable(ErrorCode)+0x84>
   3916e:	24 3d       	cpi	r18, 0xD4	; 212
   39170:	31 05       	cpc	r19, r1
   39172:	91 f6       	brne	.-92     	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
   39174:	f2 cf       	rjmp	.-28     	; 0x3915a <MMU2::ButtonAvailable(ErrorCode)+0x84>
   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 <MMU2::ButtonAvailable(ErrorCode)+0xaa>
   3917e:	5c c0       	rjmp	.+184    	; 0x39238 <MMU2::ButtonAvailable(ErrorCode)+0x162>
   39180:	f8 f4       	brcc	.+62     	; 0x391c0 <MMU2::ButtonAvailable(ErrorCode)+0xea>
   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 <MMU2::ButtonAvailable(ErrorCode)+0xca>
   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 <MMU2::ButtonAvailable(ErrorCode)+0x84>
   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 <MMU2::ButtonAvailable(ErrorCode)+0xc8>
   3919c:	bd cf       	rjmp	.-134    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
   3919e:	dd cf       	rjmp	.-70     	; 0x3915a <MMU2::ButtonAvailable(ErrorCode)+0x84>
   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 <MMU2::ButtonAvailable(ErrorCode)+0xd6>
   391aa:	b6 cf       	rjmp	.-148    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        }
        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 <MMU2::ButtonAvailable(ErrorCode)+0xe0>
   391b4:	3f c0       	rjmp	.+126    	; 0x39234 <MMU2::ButtonAvailable(ErrorCode)+0x15e>
   391b6:	89 30       	cpi	r24, 0x09	; 9
   391b8:	09 f0       	breq	.+2      	; 0x391bc <MMU2::ButtonAvailable(ErrorCode)+0xe6>
   391ba:	ae cf       	rjmp	.-164    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        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 <MMU2::ButtonAvailable(ErrorCode)+0x84>
   391c8:	70 f4       	brcc	.+28     	; 0x391e6 <MMU2::ButtonAvailable(ErrorCode)+0x110>
   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 <MMU2::ButtonAvailable(ErrorCode)+0x84>
   391d2:	60 f7       	brcc	.-40     	; 0x391ac <MMU2::ButtonAvailable(ErrorCode)+0xd6>
            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 <MMU2::ButtonAvailable(ErrorCode)+0x15e>
   391dc:	88 30       	cpi	r24, 0x08	; 8
   391de:	09 f0       	breq	.+2      	; 0x391e2 <MMU2::ButtonAvailable(ErrorCode)+0x10c>
   391e0:	9b cf       	rjmp	.-202    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        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 <MMU2::ButtonAvailable(ErrorCode)+0x142>
   391ee:	68 f0       	brcs	.+26     	; 0x3920a <MMU2::ButtonAvailable(ErrorCode)+0x134>
   391f0:	2c 3f       	cpi	r18, 0xFC	; 252
   391f2:	31 40       	sbci	r19, 0x01	; 1
   391f4:	09 f0       	breq	.+2      	; 0x391f8 <MMU2::ButtonAvailable(ErrorCode)+0x122>
   391f6:	90 cf       	rjmp	.-224    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        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 <MMU2::ButtonAvailable(ErrorCode)+0x14c>
   39200:	86 30       	cpi	r24, 0x06	; 6
   39202:	09 f0       	breq	.+2      	; 0x39206 <MMU2::ButtonAvailable(ErrorCode)+0x130>
   39204:	89 cf       	rjmp	.-238    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        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 <MMU2::ButtonAvailable(ErrorCode)+0x13e>
   39212:	82 cf       	rjmp	.-252    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        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 <MMU2::ButtonAvailable(ErrorCode)+0x13e>
   39220:	7b cf       	rjmp	.-266    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
        }
        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 <MMU2::ButtonAvailable(ErrorCode)+0x170>
    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 <MMU2::ButtonAvailable(ErrorCode)+0x15e>
   39232:	72 cf       	rjmp	.-284    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
    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 <MMU2::ButtonAvailable(ErrorCode)+0x174>
   39240:	84 30       	cpi	r24, 0x04	; 4
   39242:	09 f0       	breq	.+2      	; 0x39246 <MMU2::ButtonAvailable(ErrorCode)+0x170>
   39244:	69 cf       	rjmp	.-302    	; 0x39118 <MMU2::ButtonAvailable(ErrorCode)+0x42>
    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 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]>:
#endif

namespace MMU2 {

template <typename F>
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 <current_temperature>
   39258:	70 91 b0 0d 	lds	r23, 0x0DB0	; 0x800db0 <current_temperature+0x1>
   3925c:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <current_temperature+0x2>
   39260:	90 91 b2 0d 	lds	r25, 0x0DB2	; 0x800db2 <current_temperature+0x3>
   39264:	0f 94 a9 de 	call	0x3bd52	; 0x3bd52 <__fixsfsi>
    while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) {
   39268:	20 91 b5 0d 	lds	r18, 0x0DB5	; 0x800db5 <target_temperature>
   3926c:	30 91 b6 0d 	lds	r19, 0x0DB6	; 0x800db6 <target_temperature+0x1>
   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 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(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 <delay_keep_alive(unsigned int)>
   39280:	e9 cf       	rjmp	.-46     	; 0x39254 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(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 <mbl_point_measurement_valid(unsigned char, unsigned char)>:
}

//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 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x6>
   3928e:	00 d0       	rcall	.+0      	; 0x39290 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x8>
   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 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x66>
   3929a:	67 30       	cpi	r22, 0x07	; 7
   3929c:	40 f5       	brcc	.+80     	; 0x392ee <mbl_point_measurement_valid(unsigned char, unsigned char)+0x66>
            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 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x20>
			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 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x4e>
   392d2:	95 95       	asr	r25
   392d4:	87 95       	ror	r24
   392d6:	4a 95       	dec	r20
   392d8:	e2 f7       	brpl	.-8      	; 0x392d2 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x4a>
   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 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x54>

000392f2 <babystep_load()>:
// 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 <calibration_status_get(unsigned char)>
   39300:	88 23       	and	r24, r24
   39302:	91 f0       	breq	.+36     	; 0x39328 <babystep_load()+0x36>
    {
        check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0
   39304:	0e 94 17 79 	call	0xf22e	; 0xf22e <check_babystep()>

        // End of G80: Apply the baby stepping value.
        babystepLoadZ = eeprom_read_word(reinterpret_cast<uint16_t *>(&(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 <eeprom_read_byte>
    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<uint16_t *>(&(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 <eeprom_read_word>
   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 <shift_z(float) [clone .lto_priv.562]>:
#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 <shift_z(float) [clone .lto_priv.562]+0xa>
   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 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   3936e:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
    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 <plan_set_z_position(float const&)>
}
   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 <babystep_undo()>:
    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 <cs+0xc>
   393b6:	30 91 ca 0d 	lds	r19, 0x0DCA	; 0x800dca <cs+0xd>
   393ba:	40 91 cb 0d 	lds	r20, 0x0DCB	; 0x800dcb <cs+0xe>
   393be:	50 91 cc 0d 	lds	r21, 0x0DCC	; 0x800dcc <cs+0xf>
   393c2:	0f 94 37 de 	call	0x3bc6e	; 0x3bc6e <__divsf3>
   393c6:	0f 94 95 c9 	call	0x3932a	; 0x3932a <shift_z(float) [clone .lto_priv.562]>
      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 <go_home_with_z_lift()>:

    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 <refresh_cmd_timeout()>
    // 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 <go_to_current(float) [clone .lto_priv.388]>
    // 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 <world2machine_clamp(float&, float&)>
    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 <go_to_current(float) [clone .lto_priv.388]>
    // 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 <go_to_current(float) [clone .lto_priv.388]>

00039452 <BED_X(unsigned char)>:

#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_mesh_and_store_reference()>:
// 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 <sample_mesh_and_store_reference()+0x26>
   3949e:	00 d0       	rcall	.+0      	; 0x394a0 <sample_mesh_and_store_reference()+0x28>
   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 <tmc2130_home_enter(unsigned char)>
  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 <enable_z_endstop(bool)>
   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 <refresh_cmd_timeout()>

#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 <lang_get_translation>
   394c8:	0f 94 c0 20 	call	0x24180	; 0x24180 <lcd_display_message_fullscreen_P(char const*)>
    // 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 <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   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 <current_position+0x8>
   394ea:	90 93 9a 06 	sts	0x069A, r25	; 0x80069a <current_position+0x9>
   394ee:	a0 93 9b 06 	sts	0x069B, r26	; 0x80069b <current_position+0xa>
   394f2:	b0 93 9c 06 	sts	0x069C, r27	; 0x80069c <current_position+0xb>
        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 <go_to_current(float) [clone .lto_priv.388]>
#ifdef TMC2130
        check_Z_crash();
   39502:	0e 94 c9 79 	call	0xf392	; 0xf392 <check_Z_crash()>
   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 <current_position>
   39516:	90 93 92 06 	sts	0x0692, r25	; 0x800692 <current_position+0x1>
   3951a:	a0 93 93 06 	sts	0x0693, r26	; 0x800693 <current_position+0x2>
   3951e:	b0 93 94 06 	sts	0x0694, r27	; 0x800694 <current_position+0x3>
        current_position[Y_AXIS] = BED_Y0;
   39522:	80 93 95 06 	sts	0x0695, r24	; 0x800695 <current_position+0x4>
   39526:	90 93 96 06 	sts	0x0696, r25	; 0x800696 <current_position+0x5>
   3952a:	a0 93 97 06 	sts	0x0697, r26	; 0x800697 <current_position+0x6>
   3952e:	b0 93 98 06 	sts	0x0698, r27	; 0x800698 <current_position+0x7>
        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 <world2machine_clamp(float&, float&)>
        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 <go_to_current(float) [clone .lto_priv.388]>
        set_destination_to_current();
   3954a:	0e 94 d2 67 	call	0xcfa4	; 0xcfa4 <set_destination_to_current()>
        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 <homeaxis(unsigned char, unsigned char, unsigned char*)>
		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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>
   39568:	81 11       	cpse	r24, r1
   3956a:	06 c0       	rjmp	.+12     	; 0x39578 <sample_mesh_and_store_reference()+0x100>
		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 <lang_get_translation>
   39574:	0e 94 a2 79 	call	0xf344	; 0xf344 <kill(char const*)>
    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 <current_position+0x8>
   3957c:	90 91 9a 06 	lds	r25, 0x069A	; 0x80069a <current_position+0x9>
   39580:	a0 91 9b 06 	lds	r26, 0x069B	; 0x80069b <current_position+0xa>
   39584:	b0 91 9c 06 	lds	r27, 0x069C	; 0x80069c <current_position+0xb>
   39588:	80 93 c2 13 	sts	0x13C2, r24	; 0x8013c2 <mbl+0x1>
   3958c:	90 93 c3 13 	sts	0x13C3, r25	; 0x8013c3 <mbl+0x2>
   39590:	a0 93 c4 13 	sts	0x13C4, r26	; 0x8013c4 <mbl+0x3>
   39594:	b0 93 c5 13 	sts	0x13C5, r27	; 0x8013c5 <mbl+0x4>
   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 <refresh_cmd_timeout()>
        // 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 <current_position+0x8>
   395c4:	d0 92 9a 06 	sts	0x069A, r13	; 0x80069a <current_position+0x9>
   395c8:	e0 92 9b 06 	sts	0x069B, r14	; 0x80069b <current_position+0xa>
   395cc:	f0 92 9c 06 	sts	0x069C, r15	; 0x80069c <current_position+0xb>
        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 <go_to_current(float) [clone .lto_priv.388]>
		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 <sample_mesh_and_store_reference()+0x184>
   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 <BED_X(unsigned char)>
   39606:	60 93 91 06 	sts	0x0691, r22	; 0x800691 <current_position>
   3960a:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   3960e:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   39612:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
		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 <BED_X(unsigned char)>
   39620:	60 93 95 06 	sts	0x0695, r22	; 0x800695 <current_position+0x4>
   39624:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
   39628:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
   3962c:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>
        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 <world2machine_clamp(float&, float&)>
        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 <go_to_current(float) [clone .lto_priv.388]>
#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_set_cursor(unsigned char, unsigned char)>
        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 <lcd_printf_P(char const*, ...)>
#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 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.99]>
   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 <sample_mesh_and_store_reference()+0x206>
   3967c:	77 cf       	rjmp	.-274    	; 0x3956c <sample_mesh_and_store_reference()+0xf4>
   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 <current_position+0x8>
   39698:	90 91 9a 06 	lds	r25, 0x069A	; 0x80069a <current_position+0x9>
   3969c:	a0 91 9b 06 	lds	r26, 0x069B	; 0x80069b <current_position+0xa>
   396a0:	b0 91 9c 06 	lds	r27, 0x069C	; 0x80069c <current_position+0xb>
   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 <sample_mesh_and_store_reference()+0x244>
   396ba:	80 cf       	rjmp	.-256    	; 0x395bc <sample_mesh_and_store_reference()+0x144>

        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 <mbl+0x1>
   396c0:	70 90 c3 13 	lds	r7, 0x13C3	; 0x8013c3 <mbl+0x2>
   396c4:	80 90 c4 13 	lds	r8, 0x13C4	; 0x8013c4 <mbl+0x3>
   396c8:	90 90 c5 13 	lds	r9, 0x13C5	; 0x8013c5 <mbl+0x4>
        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 <sample_mesh_and_store_reference()+0x298>
   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 <sample_mesh_and_store_reference()+0x2b4>
   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 <sample_mesh_and_store_reference()+0x274>
   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 <sample_mesh_and_store_reference()+0x260>
           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 <sample_mesh_and_store_reference()+0x338>
            // 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 <serialprintlnPGM(char const*)>
// 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 <enable_z_endstop(bool)>
#ifdef TMC2130
    tmc2130_home_exit();
   39778:	0f 94 85 26 	call	0x24d0a	; 0x24d0a <tmc2130_home_exit()>
#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 <sample_mesh_and_store_reference()+0x352>
   397c4:	e9 81       	ldd	r30, Y+1	; 0x01
   397c6:	ee 23       	and	r30, r30
   397c8:	29 f1       	breq	.+74     	; 0x39814 <sample_mesh_and_store_reference()+0x39c>
                    continue;
                float dif = mbl.z_values[j][i] - mbl.z_values[0][0];
   397ca:	20 91 c2 13 	lds	r18, 0x13C2	; 0x8013c2 <mbl+0x1>
   397ce:	30 91 c3 13 	lds	r19, 0x13C3	; 0x8013c3 <mbl+0x2>
   397d2:	40 91 c4 13 	lds	r20, 0x13C4	; 0x8013c4 <mbl+0x3>
   397d6:	50 91 c5 13 	lds	r21, 0x13C5	; 0x8013c5 <mbl+0x4>
   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 <floor>
   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 <eeprom_update_word>
                    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 <sample_mesh_and_store_reference()+0x346>
   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 <sample_mesh_and_store_reference()+0x342>
                #endif
                addr += 2;
            }
    }

    mbl.reset();
   39832:	0f 94 41 8c 	call	0x31882	; 0x31882 <mesh_bed_leveling::reset() [clone .constprop.100]>

    go_home_with_z_lift();
   39836:	0f 94 ea c9 	call	0x393d4	; 0x393d4 <go_home_with_z_lift()>
   3983a:	98 cf       	rjmp	.-208    	; 0x3976c <sample_mesh_and_store_reference()+0x2f4>

0003983c <update_current_position_z() [clone .lto_priv.389]>:
      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 <st_get_position_mm(unsigned char)>
   39842:	60 93 99 06 	sts	0x0699, r22	; 0x800699 <current_position+0x8>
   39846:	70 93 9a 06 	sts	0x069A, r23	; 0x80069a <current_position+0x9>
   3984a:	80 93 9b 06 	sts	0x069B, r24	; 0x80069b <current_position+0xa>
   3984e:	90 93 9c 06 	sts	0x069C, r25	; 0x80069c <current_position+0xb>
      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 <plan_set_z_position(float const&)>

0003985a <world2machine_update_current()>:
 * 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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]>:
	}
    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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x22>
   39972:	00 d0       	rcall	.+0      	; 0x39974 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x24>
   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 <world2machine_rotation_and_skew>
   3998c:	d0 92 dc 17 	sts	0x17DC, r13	; 0x8017dc <world2machine_rotation_and_skew+0x1>
   39990:	e0 92 dd 17 	sts	0x17DD, r14	; 0x8017dd <world2machine_rotation_and_skew+0x2>
   39994:	f0 92 de 17 	sts	0x17DE, r15	; 0x8017de <world2machine_rotation_and_skew+0x3>
    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 <world2machine_rotation_and_skew+0x8>
   399b0:	10 93 e4 17 	sts	0x17E4, r17	; 0x8017e4 <world2machine_rotation_and_skew+0x9>
   399b4:	20 93 e5 17 	sts	0x17E5, r18	; 0x8017e5 <world2machine_rotation_and_skew+0xa>
   399b8:	30 93 e6 17 	sts	0x17E6, r19	; 0x8017e6 <world2machine_rotation_and_skew+0xb>
    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 <world2machine_rotation_and_skew+0x4>
   399d4:	10 93 e0 17 	sts	0x17E0, r17	; 0x8017e0 <world2machine_rotation_and_skew+0x5>
   399d8:	20 93 e1 17 	sts	0x17E1, r18	; 0x8017e1 <world2machine_rotation_and_skew+0x6>
   399dc:	30 93 e2 17 	sts	0x17E2, r19	; 0x8017e2 <world2machine_rotation_and_skew+0x7>
    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 <world2machine_rotation_and_skew+0xc>
   399f0:	50 92 e8 17 	sts	0x17E8, r5	; 0x8017e8 <world2machine_rotation_and_skew+0xd>
   399f4:	60 92 e9 17 	sts	0x17E9, r6	; 0x8017e9 <world2machine_rotation_and_skew+0xe>
   399f8:	70 92 ea 17 	sts	0x17EA, r7	; 0x8017ea <world2machine_rotation_and_skew+0xf>
    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 <world2machine_shift>
   39a0a:	70 93 07 18 	sts	0x1807, r23	; 0x801807 <world2machine_shift+0x1>
   39a0e:	80 93 08 18 	sts	0x1808, r24	; 0x801808 <world2machine_shift+0x2>
   39a12:	90 93 09 18 	sts	0x1809, r25	; 0x801809 <world2machine_shift+0x3>
    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 <world2machine_shift+0x4>
   39a22:	90 92 0b 18 	sts	0x180B, r9	; 0x80180b <world2machine_shift+0x5>
   39a26:	a0 92 0c 18 	sts	0x180C, r10	; 0x80180c <world2machine_shift+0x6>
   39a2a:	b0 92 0d 18 	sts	0x180D, r11	; 0x80180d <world2machine_shift+0x7>
    // 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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x240>
   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_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x240>
    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 <world2machine_correction_mode>
    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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x158>
   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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x158>
   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_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x158>
        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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x158>
   39aa6:	78 c0       	rjmp	.+240    	; 0x39b98 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x248>
        // Rotation & skew correction.
        world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SKEW;
   39aa8:	80 91 0e 18 	lds	r24, 0x180E	; 0x80180e <world2machine_correction_mode>
   39aac:	82 60       	ori	r24, 0x02	; 2
   39aae:	80 93 0e 18 	sts	0x180E, r24	; 0x80180e <world2machine_correction_mode>
        // 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 <world2machine_rotation_and_skew_inv>
   39af6:	70 93 f7 17 	sts	0x17F7, r23	; 0x8017f7 <world2machine_rotation_and_skew_inv+0x1>
   39afa:	80 93 f8 17 	sts	0x17F8, r24	; 0x8017f8 <world2machine_rotation_and_skew_inv+0x2>
   39afe:	90 93 f9 17 	sts	0x17F9, r25	; 0x8017f9 <world2machine_rotation_and_skew_inv+0x3>
        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 <world2machine_rotation_and_skew_inv+0x4>
   39b18:	70 93 fb 17 	sts	0x17FB, r23	; 0x8017fb <world2machine_rotation_and_skew_inv+0x5>
   39b1c:	80 93 fc 17 	sts	0x17FC, r24	; 0x8017fc <world2machine_rotation_and_skew_inv+0x6>
   39b20:	90 93 fd 17 	sts	0x17FD, r25	; 0x8017fd <world2machine_rotation_and_skew_inv+0x7>
        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 <world2machine_rotation_and_skew_inv+0x8>
   39b3a:	70 93 ff 17 	sts	0x17FF, r23	; 0x8017ff <world2machine_rotation_and_skew_inv+0x9>
   39b3e:	80 93 00 18 	sts	0x1800, r24	; 0x801800 <world2machine_rotation_and_skew_inv+0xa>
   39b42:	90 93 01 18 	sts	0x1801, r25	; 0x801801 <world2machine_rotation_and_skew_inv+0xb>
        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 <world2machine_rotation_and_skew_inv+0xc>
   39b56:	70 93 03 18 	sts	0x1803, r23	; 0x801803 <world2machine_rotation_and_skew_inv+0xd>
   39b5a:	80 93 04 18 	sts	0x1804, r24	; 0x801804 <world2machine_rotation_and_skew_inv+0xe>
   39b5e:	90 93 05 18 	sts	0x1805, r25	; 0x801805 <world2machine_rotation_and_skew_inv+0xf>
        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 <world2machine_correction_mode>
   39b96:	5d cf       	rjmp	.-326    	; 0x39a52 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x102>
        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 <world2machine_rotation_and_skew_inv>
   39ba4:	90 93 f7 17 	sts	0x17F7, r25	; 0x8017f7 <world2machine_rotation_and_skew_inv+0x1>
   39ba8:	a0 93 f8 17 	sts	0x17F8, r26	; 0x8017f8 <world2machine_rotation_and_skew_inv+0x2>
   39bac:	b0 93 f9 17 	sts	0x17F9, r27	; 0x8017f9 <world2machine_rotation_and_skew_inv+0x3>
        world2machine_rotation_and_skew_inv[0][1] = 0.f;
   39bb0:	10 92 fa 17 	sts	0x17FA, r1	; 0x8017fa <world2machine_rotation_and_skew_inv+0x4>
   39bb4:	10 92 fb 17 	sts	0x17FB, r1	; 0x8017fb <world2machine_rotation_and_skew_inv+0x5>
   39bb8:	10 92 fc 17 	sts	0x17FC, r1	; 0x8017fc <world2machine_rotation_and_skew_inv+0x6>
   39bbc:	10 92 fd 17 	sts	0x17FD, r1	; 0x8017fd <world2machine_rotation_and_skew_inv+0x7>
        world2machine_rotation_and_skew_inv[1][0] = 0.f;
   39bc0:	10 92 fe 17 	sts	0x17FE, r1	; 0x8017fe <world2machine_rotation_and_skew_inv+0x8>
   39bc4:	10 92 ff 17 	sts	0x17FF, r1	; 0x8017ff <world2machine_rotation_and_skew_inv+0x9>
   39bc8:	10 92 00 18 	sts	0x1800, r1	; 0x801800 <world2machine_rotation_and_skew_inv+0xa>
   39bcc:	10 92 01 18 	sts	0x1801, r1	; 0x801801 <world2machine_rotation_and_skew_inv+0xb>
        world2machine_rotation_and_skew_inv[1][1] = 1.f;
   39bd0:	80 93 02 18 	sts	0x1802, r24	; 0x801802 <world2machine_rotation_and_skew_inv+0xc>
   39bd4:	90 93 03 18 	sts	0x1803, r25	; 0x801803 <world2machine_rotation_and_skew_inv+0xd>
   39bd8:	a0 93 04 18 	sts	0x1804, r26	; 0x801804 <world2machine_rotation_and_skew_inv+0xe>
   39bdc:	b0 93 05 18 	sts	0x1805, r27	; 0x801805 <world2machine_rotation_and_skew_inv+0xf>
   39be0:	c0 cf       	rjmp	.-128    	; 0x39b62 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]+0x212>

00039be2 <world2machine_reset()>:
 *
 * 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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]>
}
   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 <world2machine_revert_to_uncorrected()>:
 *
 * 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 <world2machine_correction_mode>
   39c58:	88 23       	and	r24, r24
   39c5a:	d1 f0       	breq	.+52     	; 0x39c90 <world2machine_revert_to_uncorrected()+0x3c>
        world2machine_reset();
   39c5c:	0f 94 f1 cd 	call	0x39be2	; 0x39be2 <world2machine_reset()>
        st_synchronize();
   39c60:	0f 94 a9 43 	call	0x28752	; 0x28752 <st_synchronize()>
        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 <st_get_position_mm(unsigned char)>
   39c6a:	60 93 91 06 	sts	0x0691, r22	; 0x800691 <current_position>
   39c6e:	70 93 92 06 	sts	0x0692, r23	; 0x800692 <current_position+0x1>
   39c72:	80 93 93 06 	sts	0x0693, r24	; 0x800693 <current_position+0x2>
   39c76:	90 93 94 06 	sts	0x0694, r25	; 0x800694 <current_position+0x3>
        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 <st_get_position_mm(unsigned char)>
   39c80:	60 93 95 06 	sts	0x0695, r22	; 0x800695 <current_position+0x4>
   39c84:	70 93 96 06 	sts	0x0696, r23	; 0x800696 <current_position+0x5>
   39c88:	80 93 97 06 	sts	0x0697, r24	; 0x800697 <current_position+0x6>
   39c8c:	90 93 98 06 	sts	0x0698, r25	; 0x800698 <current_position+0x7>
    }
}
   39c90:	08 95       	ret

00039c92 <reset_bed_offset_and_skew()>:
        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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>
   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 <eeprom_update_dword>

00039d1e <world2machine_initialize()>:

/**
 * @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>
    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>
    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 <eeprom_read_block>
}

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 <world2machine_initialize()+0x7a>
   39d96:	b1 c0       	rjmp	.+354    	; 0x39efa <world2machine_initialize()+0x1dc>
   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 <world2machine_initialize()+0x96>
   39db2:	a3 c0       	rjmp	.+326    	; 0x39efa <world2machine_initialize()+0x1dc>
   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 <world2machine_initialize()+0xac>
   39dc8:	98 c0       	rjmp	.+304    	; 0x39efa <world2machine_initialize()+0x1dc>
   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 <world2machine_initialize()+0xc8>
   39de4:	8a c0       	rjmp	.+276    	; 0x39efa <world2machine_initialize()+0x1dc>
   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 <world2machine_initialize()+0xde>
   39dfa:	7f c0       	rjmp	.+254    	; 0x39efa <world2machine_initialize()+0x1dc>
   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 <world2machine_initialize()+0xfa>
   39e16:	71 c0       	rjmp	.+226    	; 0x39efa <world2machine_initialize()+0x1dc>
        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 <hypot>
   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 <world2machine_initialize()+0x136>
   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 <world2machine_initialize()+0x136>
   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 <hypot>
   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 <world2machine_initialize()+0x258>
   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 <world2machine_initialize()+0x170>
   39e8c:	74 c0       	rjmp	.+232    	; 0x39f76 <world2machine_initialize()+0x258>
            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 <hypot>
        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 <world2machine_initialize()+0x196>
#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 <world2machine_initialize()+0x1dc>
#endif
            reset = true;
        }
    }

    if (reset)
   39ef6:	11 23       	and	r17, r17
   39ef8:	f1 f0       	breq	.+60     	; 0x39f36 <world2machine_initialize()+0x218>
    {
#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 <reset_bed_offset_and_skew()>
 * @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 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.394]>
    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 <world2machine_initialize()+0x170>

00039f7a <menu_progressbar_update(unsigned int)>:
	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 <progressbar_total>
   39f8e:	70 91 da 17 	lds	r23, 0x17DA	; 0x8017da <progressbar_total+0x1>
   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 <menu_progressbar_update(unsigned int)+0x24>
   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 <progressbar_block_count>
   39fa2:	8c 17       	cp	r24, r28
   39fa4:	48 f4       	brcc	.+18     	; 0x39fb8 <menu_progressbar_update(unsigned int)+0x3e>
}

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_write(unsigned char) [clone .lto_priv.432]>
	{
		lcd_print(LCD_STR_SOLID_BLOCK[0]);
		progressbar_block_count++;
   39fac:	80 91 d8 17 	lds	r24, 0x17D8	; 0x8017d8 <progressbar_block_count>
   39fb0:	8f 5f       	subi	r24, 0xFF	; 255
   39fb2:	80 93 d8 17 	sts	0x17D8, r24	; 0x8017d8 <progressbar_block_count>
   39fb6:	f3 cf       	rjmp	.-26     	; 0x39f9e <menu_progressbar_update(unsigned int)+0x24>
	}
}
   39fb8:	cf 91       	pop	r28
   39fba:	08 95       	ret

00039fbc <menu_progressbar_finish()>:

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 <progressbar_total+0x1>
   39fc4:	80 93 d9 17 	sts	0x17D9, r24	; 0x8017d9 <progressbar_total>
	menu_progressbar_update(1);
   39fc8:	0f 94 bd cf 	call	0x39f7a	; 0x39f7a <menu_progressbar_update(unsigned int)>
	_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 <delay2>

00039fd8 <menu_progressbar_init(unsigned int, char const*)>:
}

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 <lcd_clear()>
	progressbar_block_count = 0;
   39fe8:	10 92 d8 17 	sts	0x17D8, r1	; 0x8017d8 <progressbar_block_count>
	progressbar_total = total;
   39fec:	10 93 da 17 	sts	0x17DA, r17	; 0x8017da <progressbar_total+0x1>
   39ff0:	00 93 d9 17 	sts	0x17D9, r16	; 0x8017d9 <progressbar_total>

	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_set_cursor(unsigned char, unsigned char)>
	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_print_pad_P(char const*, unsigned char)>
	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 <lcd_set_cursor(unsigned char, unsigned char)>

0003a014 <menu_item_leave()>:
	}
	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 <menu_item>
   3a018:	90 91 13 05 	lds	r25, 0x0513	; 0x800513 <menu_line>
   3a01c:	89 13       	cpse	r24, r25
   3a01e:	0b c0       	rjmp	.+22     	; 0x3a036 <menu_item_leave()+0x22>
   3a020:	90 91 12 05 	lds	r25, 0x0512	; 0x800512 <menu_clicked>
   3a024:	99 23       	and	r25, r25
   3a026:	39 f0       	breq	.+14     	; 0x3a036 <menu_item_leave()+0x22>
   3a028:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   3a02c:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a030:	82 17       	cp	r24, r18
   3a032:	13 06       	cpc	r1, r19
   3a034:	39 f0       	breq	.+14     	; 0x3a044 <menu_item_leave()+0x30>
   3a036:	81 e0       	ldi	r24, 0x01	; 1
   3a038:	90 91 d5 03 	lds	r25, 0x03D5	; 0x8003d5 <menu_leaving>
   3a03c:	91 11       	cpse	r25, r1
   3a03e:	03 c0       	rjmp	.+6      	; 0x3a046 <menu_item_leave()+0x32>
   3a040:	80 e0       	ldi	r24, 0x00	; 0
   3a042:	08 95       	ret
   3a044:	81 e0       	ldi	r24, 0x01	; 1
}
   3a046:	08 95       	ret

0003a048 <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)>:
//! @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 <lang_get_translation>
   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 <sprintf_P>
    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 <eeprom_read_block>
    //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_selection_mark() [clone .lto_priv.426]>:
	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 <menu_item>
   3a09c:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a0a0:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a0a4:	28 17       	cp	r18, r24
   3a0a6:	19 06       	cpc	r1, r25
   3a0a8:	11 f0       	breq	.+4      	; 0x3a0ae <menu_selection_mark() [clone .lto_priv.426]+0x16>
   3a0aa:	80 e2       	ldi	r24, 0x20	; 32
   3a0ac:	08 95       	ret
   3a0ae:	8e e3       	ldi	r24, 0x3E	; 62
}
   3a0b0:	08 95       	ret

0003a0b2 <menu_draw_item_puts_P(char, char const*)>:

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 <menu_selection_mark() [clone .lto_priv.426]>
   3a0c0:	48 2f       	mov	r20, r24
   3a0c2:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   3a0c6:	80 e0       	ldi	r24, 0x00	; 0
   3a0c8:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    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_print_pad_P(char const*, unsigned char)>
    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 <lcd_putc(char)>

0003a0e0 <menu_item_ret()>:
	}
}

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 <lcd_draw_update>
	menu_item++;
   3a0e6:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a0ea:	8f 5f       	subi	r24, 0xFF	; 255
   3a0ec:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>

	//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_row>
	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_line>
	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 <menu_clicked>
}
   3a0fe:	08 95       	ret

0003a100 <menu_item_gcode_P(char const*, char const*)>:
	}
	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 <menu_item>
   3a108:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   3a10c:	32 13       	cpse	r19, r18
   3a10e:	20 c0       	rjmp	.+64     	; 0x3a150 <menu_item_gcode_P(char const*, char const*)+0x50>
   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 <lcd_draw_update>
   3a118:	88 23       	and	r24, r24
   3a11a:	19 f0       	breq	.+6      	; 0x3a122 <menu_item_gcode_P(char const*, char const*)+0x22>
   3a11c:	80 e2       	ldi	r24, 0x20	; 32
   3a11e:	0f 94 59 d0 	call	0x3a0b2	; 0x3a0b2 <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
   3a122:	80 91 12 05 	lds	r24, 0x0512	; 0x800512 <menu_clicked>
   3a126:	88 23       	and	r24, r24
   3a128:	99 f0       	breq	.+38     	; 0x3a150 <menu_item_gcode_P(char const*, char const*)+0x50>
   3a12a:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a12e:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a132:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a136:	28 17       	cp	r18, r24
   3a138:	19 06       	cpc	r1, r25
   3a13a:	51 f4       	brne	.+20     	; 0x3a150 <menu_item_gcode_P(char const*, char const*)+0x50>
		{
			if (str_gcode) enquecommand_P(str_gcode);
   3a13c:	20 97       	sbiw	r28, 0x00	; 0
   3a13e:	21 f0       	breq	.+8      	; 0x3a148 <menu_item_gcode_P(char const*, char const*)+0x48>
   3a140:	61 e0       	ldi	r22, 0x01	; 1
   3a142:	ce 01       	movw	r24, r28
   3a144:	0e 94 b8 87 	call	0x10f70	; 0x10f70 <enquecommand(char const*, bool)>
			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 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
   3a150:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a154:	8f 5f       	subi	r24, 0xFF	; 255
   3a156:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   3a15a:	df 91       	pop	r29
   3a15c:	cf 91       	pop	r28
   3a15e:	08 95       	ret

0003a160 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>:
//! @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 <menu_item>
   3a170:	30 91 13 05 	lds	r19, 0x0513	; 0x800513 <menu_line>
   3a174:	73 13       	cpse	r23, r19
   3a176:	3f c0       	rjmp	.+126    	; 0x3a1f6 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x96>
   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 <lcd_draw_update>
   3a184:	88 23       	and	r24, r24
   3a186:	d1 f0       	breq	.+52     	; 0x3a1bc <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x5c>
}

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 <menu_selection_mark() [clone .lto_priv.426]>
   3a18c:	48 2f       	mov	r20, r24
   3a18e:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   3a192:	80 e0       	ldi	r24, 0x00	; 0
   3a194:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    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_print_pad_P(char const*, unsigned char)>
    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 <menu_row>
   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(unsigned char, unsigned char, char)>
    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 <menu_row>
   3a1b6:	83 e1       	ldi	r24, 0x13	; 19
   3a1b8:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
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 <menu_clicked>
   3a1c0:	88 23       	and	r24, r24
   3a1c2:	c9 f0       	breq	.+50     	; 0x3a1f6 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x96>
   3a1c4:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a1c8:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a1cc:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a1d0:	28 17       	cp	r18, r24
   3a1d2:	19 06       	cpc	r1, r25
   3a1d4:	81 f4       	brne	.+32     	; 0x3a1f6 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x96>
        {
            lcd_update_enabled = 0;
   3a1d6:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
            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 <lcd_update_enabled>
            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 <menu_item_ret()>
            return;
        }
    }
    menu_item++;
   3a1f6:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a1fa:	8f 5f       	subi	r24, 0xFF	; 255
   3a1fc:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   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 <menu_item_function_P(char const*, void (*)())>:
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 <menu_item>
   3a216:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   3a21a:	32 13       	cpse	r19, r18
   3a21c:	21 c0       	rjmp	.+66     	; 0x3a260 <menu_item_function_P(char const*, void (*)())+0x52>
   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 <lcd_draw_update>
   3a226:	88 23       	and	r24, r24
   3a228:	19 f0       	breq	.+6      	; 0x3a230 <menu_item_function_P(char const*, void (*)())+0x22>
   3a22a:	80 e2       	ldi	r24, 0x20	; 32
   3a22c:	0f 94 59 d0 	call	0x3a0b2	; 0x3a0b2 <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
   3a230:	80 91 12 05 	lds	r24, 0x0512	; 0x800512 <menu_clicked>
   3a234:	88 23       	and	r24, r24
   3a236:	a1 f0       	breq	.+40     	; 0x3a260 <menu_item_function_P(char const*, void (*)())+0x52>
   3a238:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a23c:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a240:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a244:	28 17       	cp	r18, r24
   3a246:	19 06       	cpc	r1, r25
   3a248:	59 f4       	brne	.+22     	; 0x3a260 <menu_item_function_P(char const*, void (*)())+0x52>
		{
			lcd_update_enabled = 0;
   3a24a:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
			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 <lcd_update_enabled>
			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 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
   3a260:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a264:	8f 5f       	subi	r24, 0xFF	; 255
   3a266:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   3a26a:	df 91       	pop	r29
   3a26c:	cf 91       	pop	r28
   3a26e:	08 95       	ret

0003a270 <menu_item_text_P(char const*)>:
	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 <menu_item>
   3a274:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   3a278:	32 13       	cpse	r19, r18
   3a27a:	19 c0       	rjmp	.+50     	; 0x3a2ae <menu_item_text_P(char const*)+0x3e>
   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 <lcd_draw_update>
   3a282:	88 23       	and	r24, r24
   3a284:	19 f0       	breq	.+6      	; 0x3a28c <menu_item_text_P(char const*)+0x1c>
   3a286:	80 e2       	ldi	r24, 0x20	; 32
   3a288:	0f 94 59 d0 	call	0x3a0b2	; 0x3a0b2 <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
   3a28c:	80 91 12 05 	lds	r24, 0x0512	; 0x800512 <menu_clicked>
   3a290:	88 23       	and	r24, r24
   3a292:	69 f0       	breq	.+26     	; 0x3a2ae <menu_item_text_P(char const*)+0x3e>
   3a294:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a298:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a29c:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a2a0:	28 17       	cp	r18, r24
   3a2a2:	19 06       	cpc	r1, r25
   3a2a4:	21 f4       	brne	.+8      	; 0x3a2ae <menu_item_text_P(char const*)+0x3e>
		{
			menu_item_ret();
   3a2a6:	0f 94 70 d0 	call	0x3a0e0	; 0x3a0e0 <menu_item_ret()>
			return 1;
   3a2aa:	81 e0       	ldi	r24, 0x01	; 1
   3a2ac:	08 95       	ret
		}
	}
	menu_item++;
   3a2ae:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a2b2:	8f 5f       	subi	r24, 0xFF	; 255
   3a2b4:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
	return 0;
   3a2b8:	80 e0       	ldi	r24, 0x00	; 0
}
   3a2ba:	08 95       	ret

0003a2bc <menu_end()>:
    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 <menu_row>
   3a2c0:	84 30       	cpi	r24, 0x04	; 4
   3a2c2:	38 f5       	brcc	.+78     	; 0x3a312 <menu_end()+0x56>
	{
		// 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 <menu_item>
   3a2c8:	90 e0       	ldi	r25, 0x00	; 0
   3a2ca:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   3a2ce:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a2d2:	28 17       	cp	r18, r24
   3a2d4:	39 07       	cpc	r19, r25
   3a2d6:	44 f0       	brlt	.+16     	; 0x3a2e8 <menu_end()+0x2c>
	{
		lcd_encoder = menu_item - 1;
   3a2d8:	01 97       	sbiw	r24, 0x01	; 1
   3a2da:	90 93 70 06 	sts	0x0670, r25	; 0x800670 <lcd_encoder+0x1>
   3a2de:	80 93 6f 06 	sts	0x066F, r24	; 0x80066f <lcd_encoder>
		Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   3a2e2:	87 e0       	ldi	r24, 0x07	; 7
   3a2e4:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
	}
	if (((uint8_t)lcd_encoder) >= menu_top + LCD_HEIGHT)
   3a2e8:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a2ec:	20 91 a3 03 	lds	r18, 0x03A3	; 0x8003a3 <menu_top>
   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 <menu_end()+0x56>
   3a2fc:	54 f0       	brlt	.+20     	; 0x3a312 <menu_end()+0x56>
	{
		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_top>
		menu_line = menu_top - 1;
   3a306:	84 50       	subi	r24, 0x04	; 4
   3a308:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
		menu_row = -1;
   3a30c:	8f ef       	ldi	r24, 0xFF	; 255
   3a30e:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
	}
}
   3a312:	08 95       	ret

0003a314 <menu_start()>:
		CRITICAL_SECTION_END;
}

void menu_start(void)
{
    if (lcd_encoder < 0)
   3a314:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a318:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a31c:	97 ff       	sbrs	r25, 7
   3a31e:	07 c0       	rjmp	.+14     	; 0x3a32e <menu_start()+0x1a>
    {
        lcd_encoder = 0;
   3a320:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   3a324:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
		Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   3a328:	87 e0       	ldi	r24, 0x07	; 7
   3a32a:	0f 94 c8 4e 	call	0x29d90	; 0x29d90 <Sound_MakeSound(eSOUND_TYPE)>
    }
    if (lcd_encoder < menu_top)
   3a32e:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a332:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a336:	20 91 a3 03 	lds	r18, 0x03A3	; 0x8003a3 <menu_top>
   3a33a:	28 17       	cp	r18, r24
   3a33c:	19 06       	cpc	r1, r25
   3a33e:	19 f0       	breq	.+6      	; 0x3a346 <menu_start()+0x32>
   3a340:	14 f0       	brlt	.+4      	; 0x3a346 <menu_start()+0x32>
		menu_top = lcd_encoder;
   3a342:	80 93 a3 03 	sts	0x03A3, r24	; 0x8003a3 <menu_top>
    menu_line = menu_top;
   3a346:	80 91 a3 03 	lds	r24, 0x03A3	; 0x8003a3 <menu_top>
   3a34a:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
    menu_clicked = lcd_clicked(); // Consume click event
   3a34e:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   3a352:	80 93 12 05 	sts	0x0512, r24	; 0x800512 <menu_clicked>
}
   3a356:	08 95       	ret

0003a358 <menu_data_reset()>:

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 <menu_data_reset()+0x8>
}
   3a366:	08 95       	ret

0003a368 <menu_goto(void (*)(), int, bool, bool)>:

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 <menu_menu>
   3a372:	f0 91 13 04 	lds	r31, 0x0413	; 0x800413 <menu_menu+0x1>
   3a376:	e8 17       	cp	r30, r24
   3a378:	f9 07       	cpc	r31, r25
   3a37a:	c9 f0       	breq	.+50     	; 0x3a3ae <menu_goto(void (*)(), int, bool, bool)+0x46>
   3a37c:	c4 2f       	mov	r28, r20
	{
		menu_menu = menu;
   3a37e:	90 93 13 04 	sts	0x0413, r25	; 0x800413 <menu_menu+0x1>
   3a382:	80 93 12 04 	sts	0x0412, r24	; 0x800412 <menu_menu>
		lcd_encoder = encoder;
   3a386:	70 93 70 06 	sts	0x0670, r23	; 0x800670 <lcd_encoder+0x1>
   3a38a:	60 93 6f 06 	sts	0x066F, r22	; 0x80066f <lcd_encoder>
		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 <menu_top>
		lcd_draw_update = 2; // Full LCD re-draw
   3a392:	82 e0       	ldi	r24, 0x02	; 2
   3a394:	80 93 6d 02 	sts	0x026D, r24	; 0x80026d <lcd_draw_update>
		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 <menu_goto(void (*)(), int, bool, bool)+0x3c>
	}
    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 <Sound_MakeSound(eSOUND_TYPE)>
		if (reset_menu_state) menu_data_reset();
   3a3a4:	cc 23       	and	r28, r28
   3a3a6:	21 f0       	breq	.+8      	; 0x3a3b0 <menu_goto(void (*)(), int, bool, bool)+0x48>
	}
	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 <menu_data_reset()>
	}
	else
		CRITICAL_SECTION_END;
   3a3ae:	3f bf       	out	0x3f, r19	; 63
}
   3a3b0:	cf 91       	pop	r28
   3a3b2:	08 95       	ret

0003a3b4 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>:
		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 <menu_item>
   3a3d2:	50 91 13 05 	lds	r21, 0x0513	; 0x800513 <menu_line>
   3a3d6:	e5 13       	cpse	r30, r21
   3a3d8:	73 c0       	rjmp	.+230    	; 0x3a4c0 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x10c>
	{
        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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x2e>
   3a3e0:	6c c0       	rjmp	.+216    	; 0x3a4ba <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x106>
   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 <lcd_draw_update>
   3a3f2:	88 23       	and	r24, r24
   3a3f4:	59 f0       	breq	.+22     	; 0x3a40c <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x58>
		{
			lcd_set_cursor(0, menu_row);
   3a3f6:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   3a3fa:	80 e0       	ldi	r24, 0x00	; 0
   3a3fc:	0e 94 78 6e 	call	0xdcf0	; 0xdcf0 <lcd_set_cursor(unsigned char, unsigned char)>
			menu_draw_P(menu_selection_mark(), str, cur_val);
   3a400:	0f 94 4c d0 	call	0x3a098	; 0x3a098 <menu_selection_mark() [clone .lto_priv.426]>
   3a404:	ae 01       	movw	r20, r28
   3a406:	b5 01       	movw	r22, r10
   3a408:	0f 94 c0 b0 	call	0x36180	; 0x36180 <menu_draw_P(char, char const*, int)>
		}
		if (menu_clicked && (lcd_encoder == menu_item))
   3a40c:	80 91 12 05 	lds	r24, 0x0512	; 0x800512 <menu_clicked>
   3a410:	88 23       	and	r24, r24
   3a412:	09 f4       	brne	.+2      	; 0x3a416 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x62>
   3a414:	55 c0       	rjmp	.+170    	; 0x3a4c0 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x10c>
   3a416:	90 91 14 05 	lds	r25, 0x0514	; 0x800514 <menu_item>
   3a41a:	20 91 6f 06 	lds	r18, 0x066F	; 0x80066f <lcd_encoder>
   3a41e:	30 91 70 06 	lds	r19, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a422:	92 17       	cp	r25, r18
   3a424:	13 06       	cpc	r1, r19
   3a426:	09 f0       	breq	.+2      	; 0x3a42a <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x76>
   3a428:	4b c0       	rjmp	.+150    	; 0x3a4c0 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x10c>
	}
}

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 <menu_depth>
   3a42e:	87 30       	cpi	r24, 0x07	; 7
   3a430:	d8 f4       	brcc	.+54     	; 0x3a468 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0xb4>
	{
		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 <menu_menu>
   3a448:	30 91 13 04 	lds	r19, 0x0413	; 0x800413 <menu_menu+0x1>
   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 <menu_depth>
   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_goto(void (*)(), int, bool, bool)>
			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 <menu_data+0x1>
   3a46c:	a0 92 a7 03 	sts	0x03A7, r10	; 0x8003a7 <menu_data>
			_md->editValuePtr = pval;
   3a470:	d0 92 ab 03 	sts	0x03AB, r13	; 0x8003ab <menu_data+0x4>
   3a474:	c0 92 aa 03 	sts	0x03AA, r12	; 0x8003aa <menu_data+0x3>
			_md->editValueBits = pbits;
   3a478:	70 92 a9 03 	sts	0x03A9, r7	; 0x8003a9 <menu_data+0x2>
			_md->currentValue = cur_val;
   3a47c:	d0 93 ad 03 	sts	0x03AD, r29	; 0x8003ad <menu_data+0x6>
   3a480:	c0 93 ac 03 	sts	0x03AC, r28	; 0x8003ac <menu_data+0x5>
			_md->minEditValue = min_val;
   3a484:	90 92 af 03 	sts	0x03AF, r9	; 0x8003af <menu_data+0x8>
   3a488:	80 92 ae 03 	sts	0x03AE, r8	; 0x8003ae <menu_data+0x7>
			_md->maxEditValue = max_val;
   3a48c:	10 93 b1 03 	sts	0x03B1, r17	; 0x8003b1 <menu_data+0xa>
   3a490:	00 93 b0 03 	sts	0x03B0, r16	; 0x8003b0 <menu_data+0x9>
			_md->minJumpValue = jmp_val;
   3a494:	f0 92 b3 03 	sts	0x03B3, r15	; 0x8003b3 <menu_data+0xc>
   3a498:	e0 92 b2 03 	sts	0x03B2, r14	; 0x8003b2 <menu_data+0xb>
			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 <menu_item_ret()>
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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x32>
			_md->minJumpValue = jmp_val;
			menu_item_ret();
			return;
		}
	}
	menu_item++;
   3a4c0:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a4c4:	8f 5f       	subi	r24, 0xFF	; 255
   3a4c6:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   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 <lcd_draw_update>
   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 <menu_data+0xb>
   3a4f4:	30 91 b3 03 	lds	r19, 0x03B3	; 0x8003b3 <menu_data+0xc>
   3a4f8:	80 91 ae 03 	lds	r24, 0x03AE	; 0x8003ae <menu_data+0x7>
   3a4fc:	90 91 af 03 	lds	r25, 0x03AF	; 0x8003af <menu_data+0x8>
   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 <lcd_encoder>
   3a50a:	50 91 70 06 	lds	r21, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <menu_data+0x5>
   3a51a:	50 91 ad 03 	lds	r21, 0x03AD	; 0x8003ad <menu_data+0x6>
   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 <menu_data+0x6>
   3a528:	20 93 ac 03 	sts	0x03AC, r18	; 0x8003ac <menu_data+0x5>
                lcd_encoder = 0;
   3a52c:	10 92 70 06 	sts	0x0670, r1	; 0x800670 <lcd_encoder+0x1>
   3a530:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
            }
            // 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 <menu_data+0xc>
   3a538:	10 92 b2 03 	sts	0x03B2, r1	; 0x8003b2 <menu_data+0xb>
        }
		_md->currentValue += lcd_encoder;
   3a53c:	20 91 ac 03 	lds	r18, 0x03AC	; 0x8003ac <menu_data+0x5>
   3a540:	30 91 ad 03 	lds	r19, 0x03AD	; 0x8003ad <menu_data+0x6>
   3a544:	40 91 6f 06 	lds	r20, 0x066F	; 0x80066f <lcd_encoder>
   3a548:	50 91 70 06 	lds	r21, 0x0670	; 0x800670 <lcd_encoder+0x1>
   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 <lcd_encoder+0x1>
   3a554:	10 92 6f 06 	sts	0x066F, r1	; 0x80066f <lcd_encoder>
		// 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 <menu_data+0x9>
   3a562:	90 91 b1 03 	lds	r25, 0x03B1	; 0x8003b1 <menu_data+0xa>
   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 <menu_data+0x6>
   3a572:	80 93 ac 03 	sts	0x03AC, r24	; 0x8003ac <menu_data+0x5>
		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 <lcd_set_cursor(unsigned char, unsigned char)>
		menu_draw_P(' ', _md->editLabel, _md->currentValue);
   3a57e:	40 91 ac 03 	lds	r20, 0x03AC	; 0x8003ac <menu_data+0x5>
   3a582:	50 91 ad 03 	lds	r21, 0x03AD	; 0x8003ad <menu_data+0x6>
   3a586:	60 91 a7 03 	lds	r22, 0x03A7	; 0x8003a7 <menu_data>
   3a58a:	70 91 a8 03 	lds	r23, 0x03A8	; 0x8003a8 <menu_data+0x1>
   3a58e:	80 e2       	ldi	r24, 0x20	; 32
   3a590:	0f 94 c0 b0 	call	0x36180	; 0x36180 <menu_draw_P(char, char const*, int)>
	}
	if (lcd_clicked())
   3a594:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   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 <menu_data+0x3>
   3a5a0:	f0 91 ab 03 	lds	r31, 0x03AB	; 0x8003ab <menu_data+0x4>
   3a5a4:	80 91 ac 03 	lds	r24, 0x03AC	; 0x8003ac <menu_data+0x5>
   3a5a8:	90 91 ad 03 	lds	r25, 0x03AD	; 0x8003ad <menu_data+0x6>
	{
        if (_md->editValueBits == 8)
   3a5ac:	20 91 a9 03 	lds	r18, 0x03A9	; 0x8003a9 <menu_data+0x2>
            *((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 <menu_depth>
   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_depth>
		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 <menu_goto(void (*)(), int, bool, bool)>
	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 <menu_submenu(void (*)(), bool)>:
	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 <menu_depth>
   3a5f6:	97 30       	cpi	r25, 0x07	; 7
   3a5f8:	d8 f4       	brcc	.+54     	; 0x3a630 <menu_submenu(void (*)(), bool)+0x42>
	{
		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 <menu_menu>
   3a610:	50 91 13 04 	lds	r21, 0x0413	; 0x800413 <menu_menu+0x1>
   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 <lcd_encoder>
   3a61c:	9f 5f       	subi	r25, 0xFF	; 255
   3a61e:	90 93 f7 03 	sts	0x03F7, r25	; 0x8003f7 <menu_depth>
   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 <menu_goto(void (*)(), int, bool, bool)>
	}
}
   3a630:	08 95       	ret

0003a632 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>:
    }
    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 <menu_item>
   3a64e:	30 91 13 05 	lds	r19, 0x0513	; 0x800513 <menu_line>
   3a652:	e3 13       	cpse	r30, r19
   3a654:	73 c0       	rjmp	.+230    	; 0x3a73c <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x10a>
   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 <lcd_draw_update>
   3a662:	88 23       	and	r24, r24
   3a664:	a1 f1       	breq	.+104    	; 0x3a6ce <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x9c>
   3a666:	0f 94 4c d0 	call	0x3a098	; 0x3a098 <menu_selection_mark() [clone .lto_priv.426]>
   3a66a:	01 e0       	ldi	r16, 0x01	; 1
   3a66c:	8e 33       	cpi	r24, 0x3E	; 62
   3a66e:	09 f0       	breq	.+2      	; 0x3a672 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x40>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x50>
   3a680:	6f c0       	rjmp	.+222    	; 0x3a760 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x12e>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x5c>
   3a68c:	41 c0       	rjmp	.+130    	; 0x3a710 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xde>
   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 <menu_row>
   3a6a2:	80 e0       	ldi	r24, 0x00	; 0
   3a6a4:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    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_print_pad_P(char const*, unsigned char)>
    lcd_putc('[');
   3a6b2:	8b e5       	ldi	r24, 0x5B	; 91
   3a6b4:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
    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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xee>
    {
        lcd_puts_P(toggle);
   3a6be:	0e 94 63 6e 	call	0xdcc6	; 0xdcc6 <lcd_puts_P(char const*)>
    } else {
        lcd_print(toggle);
    }
    lcd_putc(']');
   3a6c2:	8d e5       	ldi	r24, 0x5D	; 93
   3a6c4:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
    lcd_putc(eol);
   3a6c8:	89 2d       	mov	r24, r9
   3a6ca:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
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 <menu_clicked>
   3a6d2:	88 23       	and	r24, r24
   3a6d4:	99 f1       	breq	.+102    	; 0x3a73c <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x10a>
   3a6d6:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a6da:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a6de:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a6e2:	28 17       	cp	r18, r24
   3a6e4:	19 06       	cpc	r1, r25
   3a6e6:	51 f5       	brne	.+84     	; 0x3a73c <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x10a>
		{
			if (toggle == NULL) // print N/A warning message
   3a6e8:	ef 28       	or	r14, r15
   3a6ea:	e9 f4       	brne	.+58     	; 0x3a726 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xf4>
			{
				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_submenu(void (*)(), bool)>
			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 <menu_item_ret()>
    //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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xe0>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x66>
    lcd_putc('[');
    if (is_progmem)
    {
        lcd_puts_P(toggle);
    } else {
        lcd_print(toggle);
   3a720:	0e 94 7f 70 	call	0xe0fe	; 0xe0fe <lcd_print(char const*)>
   3a724:	ce cf       	rjmp	.-100    	; 0x3a6c2 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x90>
			{
				menu_submenu(func);
			}
			else // do the actual toggling
			{
				lcd_update_enabled = 0;
   3a726:	10 92 6e 02 	sts	0x026E, r1	; 0x80026e <lcd_update_enabled>
				if (func) func();
   3a72a:	c1 14       	cp	r12, r1
   3a72c:	d1 04       	cpc	r13, r1
   3a72e:	11 f0       	breq	.+4      	; 0x3a734 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x102>
   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 <lcd_update_enabled>
   3a73a:	dc cf       	rjmp	.-72     	; 0x3a6f4 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xc2>
			}
			menu_item_ret();
			return;
		}
	}
	menu_item++;
   3a73c:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a740:	8f 5f       	subi	r24, 0xFF	; 255
   3a742:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   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 <lang_get_translation>
   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 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x56>

0003a770 <menu_item_submenu_E(Sheet const&, void (*)())>:
	}
	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 <menu_item>
   3a78c:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   3a790:	32 13       	cpse	r19, r18
   3a792:	38 c0       	rjmp	.+112    	; 0x3a804 <menu_item_submenu_E(Sheet const&, void (*)())+0x94>
   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 <lcd_draw_update>
   3a79a:	22 23       	and	r18, r18
   3a79c:	a9 f0       	breq	.+42     	; 0x3a7c8 <menu_item_submenu_E(Sheet const&, void (*)())+0x58>


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 <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)>
    lcd_putc_at(0, menu_row, menu_selection_mark());
   3a7a8:	0f 94 4c d0 	call	0x3a098	; 0x3a098 <menu_selection_mark() [clone .lto_priv.426]>
   3a7ac:	48 2f       	mov	r20, r24
   3a7ae:	60 91 11 05 	lds	r22, 0x0511	; 0x800511 <menu_row>
   3a7b2:	80 e0       	ldi	r24, 0x00	; 0
   3a7b4:	0e 94 98 6e 	call	0xdd30	; 0xdd30 <lcd_putc_at(unsigned char, unsigned char, char)>
    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_print_pad(char const*, unsigned char)>
    lcd_putc(type_char);
   3a7c2:	8e e7       	ldi	r24, 0x7E	; 126
   3a7c4:	0e 94 67 6e 	call	0xdcce	; 0xdcce <lcd_putc(char)>
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 <menu_clicked>
   3a7cc:	88 23       	and	r24, r24
   3a7ce:	d1 f0       	breq	.+52     	; 0x3a804 <menu_item_submenu_E(Sheet const&, void (*)())+0x94>
   3a7d0:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a7d4:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a7d8:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a7dc:	28 17       	cp	r18, r24
   3a7de:	19 06       	cpc	r1, r25
   3a7e0:	89 f4       	brne	.+34     	; 0x3a804 <menu_item_submenu_E(Sheet const&, void (*)())+0x94>
	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_submenu(void (*)(), bool)>
			menu_item_ret();
   3a7ea:	0f 94 70 d0 	call	0x3a0e0	; 0x3a0e0 <menu_item_ret()>
            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 <menu_item>
   3a808:	8f 5f       	subi	r24, 0xFF	; 255
   3a80a:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
   3a80e:	ef cf       	rjmp	.-34     	; 0x3a7ee <menu_item_submenu_E(Sheet const&, void (*)())+0x7e>

0003a810 <menu_item_submenu_P(char const*, void (*)())>:
	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 <menu_item>
   3a818:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   3a81c:	32 13       	cpse	r19, r18
   3a81e:	1e c0       	rjmp	.+60     	; 0x3a85c <menu_item_submenu_P(char const*, void (*)())+0x4c>
   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 <lcd_draw_update>
   3a828:	88 23       	and	r24, r24
   3a82a:	19 f0       	breq	.+6      	; 0x3a832 <menu_item_submenu_P(char const*, void (*)())+0x22>
   3a82c:	8e e7       	ldi	r24, 0x7E	; 126
   3a82e:	0f 94 59 d0 	call	0x3a0b2	; 0x3a0b2 <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
   3a832:	80 91 12 05 	lds	r24, 0x0512	; 0x800512 <menu_clicked>
   3a836:	88 23       	and	r24, r24
   3a838:	89 f0       	breq	.+34     	; 0x3a85c <menu_item_submenu_P(char const*, void (*)())+0x4c>
   3a83a:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a83e:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a842:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a846:	28 17       	cp	r18, r24
   3a848:	19 06       	cpc	r1, r25
   3a84a:	41 f4       	brne	.+16     	; 0x3a85c <menu_item_submenu_P(char const*, void (*)())+0x4c>
		{
			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_submenu(void (*)(), bool)>
			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 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
   3a85c:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a860:	8f 5f       	subi	r24, 0xFF	; 255
   3a862:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   3a866:	df 91       	pop	r29
   3a868:	cf 91       	pop	r28
   3a86a:	08 95       	ret

0003a86c <menu_back(unsigned char)>:
		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 <menu_depth>
   3a872:	98 17       	cp	r25, r24
   3a874:	a8 f4       	brcc	.+42     	; 0x3a8a0 <menu_back(unsigned char)+0x34>
   3a876:	89 1b       	sub	r24, r25
   3a878:	80 93 f7 03 	sts	0x03F7, r24	; 0x8003f7 <menu_depth>
     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 <menu_goto(void (*)(), int, bool, bool)>
	}
}

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 <menu_back(unsigned char)+0xc>

0003a8a4 <menu_back()>:
     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 <menu_back(unsigned char)>

0003a8aa <menu_item_back_P(char const*)>:
    menu_item++;
}

void menu_item_back_P(const char* str)
{
	if (menu_item == menu_line)
   3a8aa:	30 91 14 05 	lds	r19, 0x0514	; 0x800514 <menu_item>
   3a8ae:	20 91 13 05 	lds	r18, 0x0513	; 0x800513 <menu_line>
   3a8b2:	32 13       	cpse	r19, r18
   3a8b4:	19 c0       	rjmp	.+50     	; 0x3a8e8 <menu_item_back_P(char const*)+0x3e>
   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 <lcd_draw_update>
   3a8bc:	88 23       	and	r24, r24
   3a8be:	19 f0       	breq	.+6      	; 0x3a8c6 <menu_item_back_P(char const*)+0x1c>
   3a8c0:	83 e8       	ldi	r24, 0x83	; 131
   3a8c2:	0f 94 59 d0 	call	0x3a0b2	; 0x3a0b2 <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
   3a8c6:	80 91 12 05 	lds	r24, 0x0512	; 0x800512 <menu_clicked>
   3a8ca:	88 23       	and	r24, r24
   3a8cc:	69 f0       	breq	.+26     	; 0x3a8e8 <menu_item_back_P(char const*)+0x3e>
   3a8ce:	20 91 14 05 	lds	r18, 0x0514	; 0x800514 <menu_item>
   3a8d2:	80 91 6f 06 	lds	r24, 0x066F	; 0x80066f <lcd_encoder>
   3a8d6:	90 91 70 06 	lds	r25, 0x0670	; 0x800670 <lcd_encoder+0x1>
   3a8da:	28 17       	cp	r18, r24
   3a8dc:	19 06       	cpc	r1, r25
   3a8de:	21 f4       	brne	.+8      	; 0x3a8e8 <menu_item_back_P(char const*)+0x3e>
		{
			menu_back();
   3a8e0:	0f 94 52 d4 	call	0x3a8a4	; 0x3a8a4 <menu_back()>
			menu_item_ret();
   3a8e4:	0d 94 70 d0 	jmp	0x3a0e0	; 0x3a0e0 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
   3a8e8:	80 91 14 05 	lds	r24, 0x0514	; 0x800514 <menu_item>
   3a8ec:	8f 5f       	subi	r24, 0xFF	; 255
   3a8ee:	80 93 14 05 	sts	0x0514, r24	; 0x800514 <menu_item>
}
   3a8f2:	08 95       	ret

0003a8f4 <MMU2::tuneIdlerStallguardThresholdMenu()>:
};

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 <lcd_timeoutToStatus>
    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 <menu_data+0xd>
   3a908:	81 11       	cpse	r24, r1
   3a90a:	23 c0       	rjmp	.+70     	; 0x3a952 <MMU2::tuneIdlerStallguardThresholdMenu()+0x5e>
    {
        _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 <menu_data+0xd>

        // 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 <MMU2::mmu2+0x40>
   3a91a:	30 91 8b 13 	lds	r19, 0x138B	; 0x80138b <MMU2::mmu2+0x41>
   3a91e:	27 30       	cpi	r18, 0x07	; 7
   3a920:	31 48       	sbci	r19, 0x81	; 129
   3a922:	11 f0       	breq	.+4      	; 0x3a928 <MMU2::tuneIdlerStallguardThresholdMenu()+0x34>
   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 <memcpy_P>

        // Fetch the value which is currently in MMU EEPROM
        mmu2.ReadRegister(_md->item.address);
   3a942:	80 91 b6 03 	lds	r24, 0x03B6	; 0x8003b6 <menu_data+0xf>
   3a946:	0f 94 77 10 	call	0x220ee	; 0x220ee <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.31]>
        _md->currentValue = mmu2.GetLastReadRegisterValue();
   3a94a:	80 91 b5 13 	lds	r24, 0x13B5	; 0x8013b5 <MMU2::mmu2+0x6b>
   3a94e:	80 93 b5 03 	sts	0x03B5, r24	; 0x8003b5 <menu_data+0xe>
    }

    MENU_BEGIN();
   3a952:	0f 94 8a d1 	call	0x3a314	; 0x3a314 <menu_start()>
   3a956:	10 92 11 05 	sts	0x0511, r1	; 0x800511 <menu_row>
   3a95a:	80 91 11 05 	lds	r24, 0x0511	; 0x800511 <menu_row>
   3a95e:	84 30       	cpi	r24, 0x04	; 4
   3a960:	e0 f5       	brcc	.+120    	; 0x3a9da <MMU2::tuneIdlerStallguardThresholdMenu()+0xe6>
   3a962:	10 92 14 05 	sts	0x0514, r1	; 0x800514 <menu_item>
    ON_MENU_LEAVE(
   3a966:	0f 94 0a d0 	call	0x3a014	; 0x3a014 <menu_item_leave()>
   3a96a:	88 23       	and	r24, r24
   3a96c:	89 f0       	breq	.+34     	; 0x3a990 <MMU2::tuneIdlerStallguardThresholdMenu()+0x9c>
   3a96e:	60 91 b5 03 	lds	r22, 0x03B5	; 0x8003b5 <menu_data+0xe>
   3a972:	70 e0       	ldi	r23, 0x00	; 0
   3a974:	80 91 b6 03 	lds	r24, 0x03B6	; 0x8003b6 <menu_data+0xf>
   3a978:	0e 94 fd e8 	call	0x1d1fa	; 0x1d1fa <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.29]>
   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 <lcd_return_to_status()>
        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 <lang_get_translation>
   3a998:	0f 94 55 d4 	call	0x3a8aa	; 0x3a8aa <menu_item_back_P(char const*)>
    MENU_ITEM_EDIT_int3_P(
   3a99c:	00 91 b8 03 	lds	r16, 0x03B8	; 0x8003b8 <menu_data+0x11>
   3a9a0:	10 e0       	ldi	r17, 0x00	; 0
   3a9a2:	c0 91 b7 03 	lds	r28, 0x03B7	; 0x8003b7 <menu_data+0x10>
   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 <lang_get_translation>
   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 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
        _T(MSG_MMU_SENSITIVITY),
        &_md->currentValue,
        _md->item.minValue,
        _md->item.maxValue
    );
    MENU_END();
   3a9c0:	0f 94 5e d1 	call	0x3a2bc	; 0x3a2bc <menu_end()>
        // 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 <menu_row>
   3a9c8:	8f 5f       	subi	r24, 0xFF	; 255
   3a9ca:	80 93 11 05 	sts	0x0511, r24	; 0x800511 <menu_row>
   3a9ce:	80 91 13 05 	lds	r24, 0x0513	; 0x800513 <menu_line>
   3a9d2:	8f 5f       	subi	r24, 0xFF	; 255
   3a9d4:	80 93 13 05 	sts	0x0513, r24	; 0x800513 <menu_line>
   3a9d8:	c0 cf       	rjmp	.-128    	; 0x3a95a <MMU2::tuneIdlerStallguardThresholdMenu()+0x66>
        &_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 <menu_back_if_clicked()>:
	}
}

void menu_back_if_clicked(void)
{
	if (lcd_clicked())
   3a9e8:	0e 94 95 70 	call	0xe12a	; 0xe12a <lcd_clicked()>
   3a9ec:	81 11       	cpse	r24, r1
		menu_back();
   3a9ee:	0d 94 52 d4 	jmp	0x3a8a4	; 0x3a8a4 <menu_back()>
}
   3a9f2:	08 95       	ret

0003a9f4 <MarlinSerial::printNumber(unsigned long, unsigned char)>:
}

// 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 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x54>
}

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 <MarlinSerial::write(unsigned char)>
// 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 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x66>
   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 <MarlinSerial::printNumber(unsigned long, unsigned char)+0xa8>
    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 <MarlinSerial::printNumber(unsigned long, unsigned char)+0xa4>
      '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 <MarlinSerial::write(unsigned char)>
   3aa96:	f4 cf       	rjmp	.-24     	; 0x3aa80 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x8c>
  }

  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 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x9e>
}
   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 <MarlinSerial::print(long, int) [clone .part.1]>:
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 <MarlinSerial::print(long, int) [clone .part.1]+0x26>
}

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 <MarlinSerial::write(unsigned char)>
  } 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 <MarlinSerial::printNumber(unsigned long, unsigned char)>

0003aaf6 <MarlinSerial::printFloat(double, unsigned char)>:
      '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 <MarlinSerial::printFloat(double, unsigned char)+0x34>
}

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 <MarlinSerial::write(unsigned char)>
{
  // 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<digits; ++i)
   3ab2a:	c0 e0       	ldi	r28, 0x00	; 0
     print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
   3ab2c:	60 e0       	ldi	r22, 0x00	; 0
   3ab2e:	70 e0       	ldi	r23, 0x00	; 0
   3ab30:	80 e0       	ldi	r24, 0x00	; 0
   3ab32:	9f e3       	ldi	r25, 0x3F	; 63
  for (uint8_t i=0; i<digits; ++i)
   3ab34:	cb 15       	cp	r28, r11
   3ab36:	41 f0       	breq	.+16     	; 0x3ab48 <MarlinSerial::printFloat(double, unsigned char)+0x52>
    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<digits; ++i)
   3ab44:	cf 5f       	subi	r28, 0xFF	; 255
   3ab46:	f6 cf       	rjmp	.-20     	; 0x3ab34 <MarlinSerial::printFloat(double, unsigned char)+0x3e>
    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 <MarlinSerial::printNumber(unsigned long, unsigned char)>
  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 <MarlinSerial::printFloat(double, unsigned char)+0xd8>

  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 <MarlinSerial::write(unsigned char)>
  // 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 <MarlinSerial::printFloat(double, unsigned char)+0xd8>
  {
    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 <MarlinSerial::print(long, int) [clone .part.1]>
  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 <MarlinSerial::printFloat(double, unsigned char)+0x92>
  }
}
   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 <MarlinSerial::println()>:
}

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 <MarlinSerial::write(unsigned char)>

0003abe8 <MarlinSerial::println(char const*)>:
   3abe8:	0e 94 ac 87 	call	0x10f58	; 0x10f58 <MarlinSerial::write(char const*)>
}*/

void MarlinSerial::println(const char c[])
{
  print(c);
  println();
   3abec:	0d 94 f1 d5 	jmp	0x3abe2	; 0x3abe2 <MarlinSerial::println()>

0003abf0 <MarlinSerial::read()>:
}

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 <rx_buffer+0x82>
   3abf4:	30 91 9b 04 	lds	r19, 0x049B	; 0x80049b <rx_buffer+0x83>
   3abf8:	80 91 98 04 	lds	r24, 0x0498	; 0x800498 <rx_buffer+0x80>
   3abfc:	90 91 99 04 	lds	r25, 0x0499	; 0x800499 <rx_buffer+0x81>
   3ac00:	82 17       	cp	r24, r18
   3ac02:	93 07       	cpc	r25, r19
   3ac04:	71 f0       	breq	.+28     	; 0x3ac22 <MarlinSerial::read()+0x32>
    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 <rx_buffer+0x83>
   3ac1a:	20 93 9a 04 	sts	0x049A, r18	; 0x80049a <rx_buffer+0x82>
    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<<FE1))
   3ac48:	80 91 c8 00 	lds	r24, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
   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 <selectedSerialPort>
   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 <rx_buffer+0x80>
   3ac84:	30 91 99 04 	lds	r19, 0x0499	; 0x800499 <rx_buffer+0x81>
   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 <rx_buffer+0x82>
   3ac94:	70 91 9b 04 	lds	r23, 0x049B	; 0x80049b <rx_buffer+0x83>
   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 <rx_buffer+0x81>
   3acaa:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <rx_buffer+0x80>
   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<<M_FEx))
   3acd0:	80 91 c0 00 	lds	r24, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
   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 <selectedSerialPort>
   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 <rx_buffer+0x80>
   3ad0c:	30 91 99 04 	lds	r19, 0x0499	; 0x800499 <rx_buffer+0x81>
   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 <rx_buffer+0x82>
   3ad1c:	70 91 9b 04 	lds	r23, 0x049B	; 0x80049b <rx_buffer+0x83>
   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 <rx_buffer+0x81>
   3ad32:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <rx_buffer+0x80>
   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 <square>:
   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 <strtol>:
   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 <strtol+0x34>
   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 <strtol+0x4e>
   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 <strtol+0x4e>
   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 <strtol+0x122>
   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 <isspace>
   3af94:	89 2b       	or	r24, r25
   3af96:	a9 f7       	brne	.-22     	; 0x3af82 <strtol+0x4c>
   3af98:	1d 32       	cpi	r17, 0x2D	; 45
   3af9a:	01 f5       	brne	.+64     	; 0x3afdc <strtol+0xa6>
   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 <strtol+0x76>
   3afaa:	e6 c0       	rjmp	.+460    	; 0x3b178 <strtol+0x242>
   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 <strtol+0x80>
   3afb4:	88 c0       	rjmp	.+272    	; 0x3b0c6 <strtol+0x190>
   3afb6:	10 33       	cpi	r17, 0x30	; 48
   3afb8:	59 f4       	brne	.+22     	; 0x3afd0 <strtol+0x9a>
   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 <strtol+0x8e>
   3afc2:	7c c0       	rjmp	.+248    	; 0x3b0bc <strtol+0x186>
   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 <strtol+0x1ca>
   3afdc:	1b 32       	cpi	r17, 0x2B	; 43
   3afde:	21 f4       	brne	.+8      	; 0x3afe8 <strtol+0xb2>
   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 <strtol+0x6e>
   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 <strtol+0xc0>
   3aff4:	c7 c0       	rjmp	.+398    	; 0x3b184 <strtol+0x24e>
   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 <strtol+0xca>
   3affe:	73 c0       	rjmp	.+230    	; 0x3b0e6 <strtol+0x1b0>
   3b000:	e7 cf       	rjmp	.-50     	; 0x3afd0 <strtol+0x9a>
   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 <strtol+0x1ca>
   3b014:	21 e0       	ldi	r18, 0x01	; 1
   3b016:	ad c0       	rjmp	.+346    	; 0x3b172 <strtol+0x23c>
   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 <strtol+0xf8>
   3b022:	22 23       	and	r18, r18
   3b024:	71 f1       	breq	.+92     	; 0x3b082 <strtol+0x14c>
   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 <strtol+0x158>
   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 <strtol+0x110>
   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 <errno+0x1>
   3b04e:	20 93 13 18 	sts	0x1813, r18	; 0x801813 <errno>
   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 <strtol+0x158>
   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 <strtol+0x16c>
   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 <strtol+0x11c>
   3b0a2:	97 ff       	sbrs	r25, 7
   3b0a4:	d6 cf       	rjmp	.-84     	; 0x3b052 <strtol+0x11c>
   3b0a6:	82 e2       	ldi	r24, 0x22	; 34
   3b0a8:	90 e0       	ldi	r25, 0x00	; 0
   3b0aa:	90 93 14 18 	sts	0x1814, r25	; 0x801814 <errno+0x1>
   3b0ae:	80 93 13 18 	sts	0x1813, r24	; 0x801813 <errno>
   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 <strtol+0x11c>
   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 <strtol+0x190>
   3b0c4:	9e cf       	rjmp	.-196    	; 0x3b002 <strtol+0xcc>
   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 <strtol+0x19a>
   3b0ce:	9c cf       	rjmp	.-200    	; 0x3b008 <strtol+0xd2>
   3b0d0:	0c f0       	brlt	.+2      	; 0x3b0d4 <strtol+0x19e>
   3b0d2:	8c cf       	rjmp	.-232    	; 0x3afec <strtol+0xb6>
   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 <strtol+0x1ca>
   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 <strtol+0x206>
   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 <strtol+0x204>
   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 <strtol+0x200>
   3b134:	71 cf       	rjmp	.-286    	; 0x3b018 <strtol+0xe2>
   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 <strtol+0x20e>
   3b142:	6a cf       	rjmp	.-300    	; 0x3b018 <strtol+0xe2>
   3b144:	27 fd       	sbrc	r18, 7
   3b146:	15 c0       	rjmp	.+42     	; 0x3b172 <strtol+0x23c>
   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 <strtol+0x23a>
   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 <strtol+0x23a>
   3b16e:	52 cf       	rjmp	.-348    	; 0x3b014 <strtol+0xde>
   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 <strtol+0x1dc>
   3b178:	10 33       	cpi	r17, 0x30	; 48
   3b17a:	09 f4       	brne	.+2      	; 0x3b17e <strtol+0x248>
   3b17c:	1e cf       	rjmp	.-452    	; 0x3afba <strtol+0x84>
   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 <strtol+0x1ca>

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 <isspace>:
   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 <isspace+0x10>
   3b34c:	89 50       	subi	r24, 0x09	; 9
   3b34e:	85 50       	subi	r24, 0x05	; 5
   3b350:	c8 f7       	brcc	.-14     	; 0x3b344 <isspace+0x2>
   3b352:	08 95       	ret

0003b354 <memcpy_P>:
   3b354:	fb 01       	movw	r30, r22
   3b356:	dc 01       	movw	r26, r24
   3b358:	02 c0       	rjmp	.+4      	; 0x3b35e <memcpy_P+0xa>
   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 <memcpy_P+0x6>
   3b364:	08 95       	ret

0003b366 <strcat_P>:
   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 <strcat_P+0x4>
   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 <strcat_P+0xc>
   3b37a:	08 95       	ret

0003b37c <strcmp_P>:
   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 <strcmp_P+0x4>
   3b38a:	99 0b       	sbc	r25, r25
   3b38c:	08 95       	ret

0003b38e <strcpy_P>:
   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 <strcpy_P+0x4>
   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 <strncasecmp_P>:
   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 <strncasecmp_P+0x2c>
   3b3b8:	8d 91       	ld	r24, X+
   3b3ba:	81 34       	cpi	r24, 0x41	; 65
   3b3bc:	1c f0       	brlt	.+6      	; 0x3b3c4 <strncasecmp_P+0x16>
   3b3be:	8b 35       	cpi	r24, 0x5B	; 91
   3b3c0:	0c f4       	brge	.+2      	; 0x3b3c4 <strncasecmp_P+0x16>
   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 <strncasecmp_P+0x22>
   3b3ca:	6b 35       	cpi	r22, 0x5B	; 91
   3b3cc:	0c f4       	brge	.+2      	; 0x3b3d0 <strncasecmp_P+0x22>
   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 <strncasecmp_P+0x4>
   3b3d6:	99 0b       	sbc	r25, r25
   3b3d8:	08 95       	ret
   3b3da:	88 1b       	sub	r24, r24
   3b3dc:	fc cf       	rjmp	.-8      	; 0x3b3d6 <strncasecmp_P+0x28>

0003b3de <strncmp_P>:
   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 <strncmp_P+0x16>
   3b3e8:	8d 91       	ld	r24, X+
   3b3ea:	05 90       	lpm	r0, Z+
   3b3ec:	80 19       	sub	r24, r0
   3b3ee:	19 f4       	brne	.+6      	; 0x3b3f6 <strncmp_P+0x18>
   3b3f0:	00 20       	and	r0, r0
   3b3f2:	b9 f7       	brne	.-18     	; 0x3b3e2 <strncmp_P+0x4>
   3b3f4:	88 1b       	sub	r24, r24
   3b3f6:	99 0b       	sbc	r25, r25
   3b3f8:	08 95       	ret

0003b3fa <strncpy_P>:
   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 <strncpy_P+0x1c>
   3b404:	05 90       	lpm	r0, Z+
   3b406:	0d 92       	st	X+, r0
   3b408:	00 20       	and	r0, r0
   3b40a:	c9 f7       	brne	.-14     	; 0x3b3fe <strncpy_P+0x4>
   3b40c:	01 c0       	rjmp	.+2      	; 0x3b410 <strncpy_P+0x16>
   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 <strncpy_P+0x14>
   3b416:	08 95       	ret

0003b418 <strnlen_P>:
   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 <strnlen_P+0x2>
   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 <strstr_P>:
   3b42e:	fb 01       	movw	r30, r22
   3b430:	55 91       	lpm	r21, Z+
   3b432:	55 23       	and	r21, r21
   3b434:	a9 f0       	breq	.+42     	; 0x3b460 <strstr_P+0x32>
   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 <strstr_P+0xc>
   3b442:	59 f4       	brne	.+22     	; 0x3b45a <strstr_P+0x2c>
   3b444:	cd 01       	movw	r24, r26
   3b446:	05 90       	lpm	r0, Z+
   3b448:	00 20       	and	r0, r0
   3b44a:	49 f0       	breq	.+18     	; 0x3b45e <strstr_P+0x30>
   3b44c:	4d 91       	ld	r20, X+
   3b44e:	40 15       	cp	r20, r0
   3b450:	41 11       	cpse	r20, r1
   3b452:	c9 f3       	breq	.-14     	; 0x3b446 <strstr_P+0x18>
   3b454:	fb 01       	movw	r30, r22
   3b456:	41 11       	cpse	r20, r1
   3b458:	ef cf       	rjmp	.-34     	; 0x3b438 <strstr_P+0xa>
   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 <strnlen>:
   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 <strnlen+0x2>
   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 <fgetc>:
   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 <fgetc+0x40>
   3b484:	26 ff       	sbrs	r18, 6
   3b486:	0c c0       	rjmp	.+24     	; 0x3b4a0 <fgetc+0x28>
   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 <fgetc+0x5c>
   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 <fgetc+0x46>
   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 <fgetc+0x22>
   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 <fgetc+0x22>
   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 <fgetc+0x4c>
   3b4de:	2b 81       	ldd	r18, Y+3	; 0x03
   3b4e0:	01 96       	adiw	r24, 0x01	; 1
   3b4e2:	21 f0       	breq	.+8      	; 0x3b4ec <fgetc+0x74>
   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 <fgetc+0x40>
   3b4ec:	80 e1       	ldi	r24, 0x10	; 16
   3b4ee:	fb cf       	rjmp	.-10     	; 0x3b4e6 <fgetc+0x6e>

0003b4f0 <fputc>:
   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 <fputc+0x26>
   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 <fputc+0x52>
   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 <fputc+0x46>
   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 <fputc+0x18>
   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 <fputc+0x46>
   3b54e:	da cf       	rjmp	.-76     	; 0x3b504 <fputc+0x14>

0003b550 <fputs_P>:
   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 <fputs_P+0x3c>
   3b56e:	cf ef       	ldi	r28, 0xFF	; 255
   3b570:	df ef       	ldi	r29, 0xFF	; 255
   3b572:	10 c0       	rjmp	.+32     	; 0x3b594 <fputs_P+0x44>
   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 <fputs_P+0x38>
   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 <fputs_P+0x24>
   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 <printf_P>:
   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 <vfprintf>
   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 <puts_P>:
   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 <puts_P+0x30>
   3b60e:	cf ef       	ldi	r28, 0xFF	; 255
   3b610:	df ef       	ldi	r29, 0xFF	; 255
   3b612:	17 c0       	rjmp	.+46     	; 0x3b642 <puts_P+0x50>
   3b614:	19 95       	eicall
   3b616:	89 2b       	or	r24, r25
   3b618:	11 f0       	breq	.+4      	; 0x3b61e <puts_P+0x2c>
   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 <puts_P+0x22>
   3b63a:	8a e0       	ldi	r24, 0x0A	; 10
   3b63c:	19 95       	eicall
   3b63e:	89 2b       	or	r24, r25
   3b640:	31 f7       	brne	.-52     	; 0x3b60e <puts_P+0x1c>
   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 <sprintf_P>:
   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 <vfprintf>
   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 <vfprintf_P>:
   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 <vfprintf>
   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 <vsnprintf_P>:
   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 <vsnprintf_P+0x2c>
   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 <vfprintf>
   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 <vsnprintf_P+0x5c>
   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 <vsnprintf_P+0x54>
   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 <eeprom_read_block>:
   3b800:	dc 01       	movw	r26, r24
   3b802:	cb 01       	movw	r24, r22

0003b804 <eeprom_read_blraw>:
   3b804:	fc 01       	movw	r30, r24
   3b806:	f9 99       	sbic	0x1f, 1	; 31
   3b808:	fe cf       	rjmp	.-4      	; 0x3b806 <eeprom_read_blraw+0x2>
   3b80a:	06 c0       	rjmp	.+12     	; 0x3b818 <eeprom_read_blraw+0x14>
   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 <eeprom_read_blraw+0x8>
   3b81e:	08 95       	ret

0003b820 <eeprom_read_byte>:
   3b820:	f9 99       	sbic	0x1f, 1	; 31
   3b822:	fe cf       	rjmp	.-4      	; 0x3b820 <eeprom_read_byte>
   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 <eeprom_read_dword>:
   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 <eeprom_read_blraw>

0003b83c <eeprom_read_word>:
   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 <eeprom_read_blraw>

0003b848 <eeprom_update_block>:
   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 <eeprom_update_block+0x1e>
   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 <eeprom_update_r18>
   3b860:	41 50       	subi	r20, 0x01	; 1
   3b862:	50 40       	sbci	r21, 0x00	; 0
   3b864:	d0 f7       	brcc	.-12     	; 0x3b85a <eeprom_update_block+0x12>
   3b866:	08 95       	ret

0003b868 <eeprom_update_byte>:
   3b868:	26 2f       	mov	r18, r22

0003b86a <eeprom_update_r18>:
   3b86a:	f9 99       	sbic	0x1f, 1	; 31
   3b86c:	fe cf       	rjmp	.-4      	; 0x3b86a <eeprom_update_r18>
   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 <eeprom_update_r18+0x20>
   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 <eeprom_update_dword>:
   3b88c:	03 96       	adiw	r24, 0x03	; 3
   3b88e:	27 2f       	mov	r18, r23
   3b890:	0f 94 35 dc 	call	0x3b86a	; 0x3b86a <eeprom_update_r18>
   3b894:	0f 94 34 dc 	call	0x3b868	; 0x3b868 <eeprom_update_byte>
   3b898:	25 2f       	mov	r18, r21
   3b89a:	0f 94 35 dc 	call	0x3b86a	; 0x3b86a <eeprom_update_r18>
   3b89e:	24 2f       	mov	r18, r20
   3b8a0:	0d 94 35 dc 	jmp	0x3b86a	; 0x3b86a <eeprom_update_r18>

0003b8a4 <eeprom_update_word>:
   3b8a4:	01 96       	adiw	r24, 0x01	; 1
   3b8a6:	27 2f       	mov	r18, r23
   3b8a8:	0f 94 35 dc 	call	0x3b86a	; 0x3b86a <eeprom_update_r18>
   3b8ac:	0d 94 34 dc 	jmp	0x3b868	; 0x3b868 <eeprom_update_byte>

0003b8b0 <eeprom_write_byte>:
   3b8b0:	26 2f       	mov	r18, r22

0003b8b2 <eeprom_write_r18>:
   3b8b2:	f9 99       	sbic	0x1f, 1	; 31
   3b8b4:	fe cf       	rjmp	.-4      	; 0x3b8b2 <eeprom_write_r18>
   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 <eeprom_write_dword>:
   3b8cc:	24 2f       	mov	r18, r20
   3b8ce:	0f 94 59 dc 	call	0x3b8b2	; 0x3b8b2 <eeprom_write_r18>
   3b8d2:	25 2f       	mov	r18, r21
   3b8d4:	0f 94 59 dc 	call	0x3b8b2	; 0x3b8b2 <eeprom_write_r18>
   3b8d8:	0d 94 6e dc 	jmp	0x3b8dc	; 0x3b8dc <eeprom_write_word>

0003b8dc <eeprom_write_word>:
   3b8dc:	0f 94 58 dc 	call	0x3b8b0	; 0x3b8b0 <eeprom_write_byte>
   3b8e0:	27 2f       	mov	r18, r23
   3b8e2:	0d 94 59 dc 	jmp	0x3b8b2	; 0x3b8b2 <eeprom_write_r18>

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 <atan2+0x10>
   3bb62:	5e ef       	ldi	r21, 0xFE	; 254
   3bb64:	0c c0       	rjmp	.+24     	; 0x3bb7e <atan2+0x10>
   3bb66:	0d 94 50 d7 	jmp	0x3aea0	; 0x3aea0 <__fp_nan>
   3bb6a:	0d 94 94 d7 	jmp	0x3af28	; 0x3af28 <__fp_zero>

0003bb6e <atan2>:
   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 <atan2+0x28>
   3bb88:	0e 2e       	mov	r0, r30
   3bb8a:	07 f8       	bld	r0, 7
   3bb8c:	e0 25       	eor	r30, r0
   3bb8e:	69 f0       	breq	.+26     	; 0x3bbaa <atan2+0x3c>
   3bb90:	e0 25       	eor	r30, r0
   3bb92:	e0 64       	ori	r30, 0x40	; 64
   3bb94:	0a c0       	rjmp	.+20     	; 0x3bbaa <atan2+0x3c>
   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 <atan>
   3bbb8:	5f 91       	pop	r21
   3bbba:	55 23       	and	r21, r21
   3bbbc:	39 f0       	breq	.+14     	; 0x3bbcc <atan2+0x5e>
   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 <atan>:
   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 <atan+0x1c>
   3bbe4:	d9 2f       	mov	r29, r25
   3bbe6:	0f 94 33 e0 	call	0x3c066	; 0x3c066 <inverse>
   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 <square>
   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 <atan+0x58>
   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 <ceil>:
   3bc2c:	0f 94 a9 df 	call	0x3bf52	; 0x3bf52 <__fp_trunc>
   3bc30:	90 f0       	brcs	.+36     	; 0x3bc56 <ceil+0x2a>
   3bc32:	9f 37       	cpi	r25, 0x7F	; 127
   3bc34:	48 f4       	brcc	.+18     	; 0x3bc48 <ceil+0x1c>
   3bc36:	91 11       	cpse	r25, r1
   3bc38:	16 f4       	brtc	.+4      	; 0x3bc3e <ceil+0x12>
   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 <ceil+0x26>
   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 <cos>:
   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 <floor>:
   3bdbe:	0f 94 a9 df 	call	0x3bf52	; 0x3bf52 <__fp_trunc>
   3bdc2:	90 f0       	brcs	.+36     	; 0x3bde8 <floor+0x2a>
   3bdc4:	9f 37       	cpi	r25, 0x7F	; 127
   3bdc6:	48 f4       	brcc	.+18     	; 0x3bdda <floor+0x1c>
   3bdc8:	91 11       	cpse	r25, r1
   3bdca:	16 f0       	brts	.+4      	; 0x3bdd0 <floor+0x12>
   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 <floor+0x26>
   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 <hypot>:
   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 <hypot+0x2e>
   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 <hypot+0x28>
   3bfcc:	f1 e4       	ldi	r31, 0x41	; 65
   3bfce:	1c c0       	rjmp	.+56     	; 0x3c008 <hypot+0x60>
   3bfd0:	90 34       	cpi	r25, 0x40	; 64
   3bfd2:	e0 f4       	brcc	.+56     	; 0x3c00c <hypot+0x64>
   3bfd4:	0a c0       	rjmp	.+20     	; 0x3bfea <hypot+0x42>
   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 <hypot+0x3e>
   3bfe2:	f1 e4       	ldi	r31, 0x41	; 65
   3bfe4:	11 c0       	rjmp	.+34     	; 0x3c008 <hypot+0x60>
   3bfe6:	50 34       	cpi	r21, 0x40	; 64
   3bfe8:	88 f4       	brcc	.+34     	; 0x3c00c <hypot+0x64>
   3bfea:	f9 ea       	ldi	r31, 0xA9	; 169
   3bfec:	88 23       	and	r24, r24
   3bfee:	2a f0       	brmi	.+10     	; 0x3bffa <hypot+0x52>
   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 <hypot+0x48>
   3bffa:	44 23       	and	r20, r20
   3bffc:	2a f0       	brmi	.+10     	; 0x3c008 <hypot+0x60>
   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 <hypot+0x56>
   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 <sqrt>
   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 <ldexp>

0003c066 <inverse>:
   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 <ldexp>:
   3c07e:	0f 94 7a d7 	call	0x3aef4	; 0x3aef4 <__fp_splitA>
   3c082:	d8 f3       	brcs	.-10     	; 0x3c07a <inverse+0x14>
   3c084:	99 23       	and	r25, r25
   3c086:	c9 f3       	breq	.-14     	; 0x3c07a <inverse+0x14>
   3c088:	94 0f       	add	r25, r20
   3c08a:	51 1d       	adc	r21, r1
   3c08c:	a3 f3       	brvs	.-24     	; 0x3c076 <inverse+0x10>
   3c08e:	91 50       	subi	r25, 0x01	; 1
   3c090:	50 40       	sbci	r21, 0x00	; 0
   3c092:	94 f0       	brlt	.+36     	; 0x3c0b8 <ldexp+0x3a>
   3c094:	59 f0       	breq	.+22     	; 0x3c0ac <ldexp+0x2e>
   3c096:	88 23       	and	r24, r24
   3c098:	32 f0       	brmi	.+12     	; 0x3c0a6 <ldexp+0x28>
   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 <ldexp+0x18>
   3c0a6:	9e 3f       	cpi	r25, 0xFE	; 254
   3c0a8:	51 05       	cpc	r21, r1
   3c0aa:	2c f7       	brge	.-54     	; 0x3c076 <inverse+0x10>
   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 <ldexp+0x68>
   3c0bc:	98 3e       	cpi	r25, 0xE8	; 232
   3c0be:	9c f0       	brlt	.+38     	; 0x3c0e6 <ldexp+0x68>
   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 <ldexp+0x50>
   3c0cc:	b1 60       	ori	r27, 0x01	; 1
   3c0ce:	93 95       	inc	r25
   3c0d0:	c1 f7       	brne	.-16     	; 0x3c0c2 <ldexp+0x44>
   3c0d2:	bb 0f       	add	r27, r27
   3c0d4:	58 f7       	brcc	.-42     	; 0x3c0ac <ldexp+0x2e>
   3c0d6:	11 f4       	brne	.+4      	; 0x3c0dc <ldexp+0x5e>
   3c0d8:	60 ff       	sbrs	r22, 0
   3c0da:	e8 cf       	rjmp	.-48     	; 0x3c0ac <ldexp+0x2e>
   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 <ldexp+0x2e>
   3c0e6:	0d 94 95 d7 	jmp	0x3af2a	; 0x3af2a <__fp_szero>

0003c0ea <lround>:
   3c0ea:	0f 94 7a d7 	call	0x3aef4	; 0x3aef4 <__fp_splitA>
   3c0ee:	58 f1       	brcs	.+86     	; 0x3c146 <lround+0x5c>
   3c0f0:	9e 57       	subi	r25, 0x7E	; 126
   3c0f2:	60 f1       	brcs	.+88     	; 0x3c14c <lround+0x62>
   3c0f4:	98 51       	subi	r25, 0x18	; 24
   3c0f6:	a0 f0       	brcs	.+40     	; 0x3c120 <lround+0x36>
   3c0f8:	e9 f0       	breq	.+58     	; 0x3c134 <lround+0x4a>
   3c0fa:	98 30       	cpi	r25, 0x08	; 8
   3c0fc:	20 f5       	brcc	.+72     	; 0x3c146 <lround+0x5c>
   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 <lround+0x18>
   3c10e:	12 c0       	rjmp	.+36     	; 0x3c134 <lround+0x4a>
   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 <lround+0x36>
   3c11c:	00 0c       	add	r0, r0
   3c11e:	07 c0       	rjmp	.+14     	; 0x3c12e <lround+0x44>
   3c120:	99 3f       	cpi	r25, 0xF9	; 249
   3c122:	b4 f3       	brlt	.-20     	; 0x3c110 <lround+0x26>
   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 <lround+0x3a>
   3c12e:	61 1d       	adc	r22, r1
   3c130:	71 1d       	adc	r23, r1
   3c132:	81 1d       	adc	r24, r1
   3c134:	3e f4       	brtc	.+14     	; 0x3c144 <lround+0x5a>
   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 <pow>:
   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 <pow+0x76>
   3c15e:	61 15       	cp	r22, r1
   3c160:	71 05       	cpc	r23, r1
   3c162:	61 f4       	brne	.+24     	; 0x3c17c <pow+0x2c>
   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 <pow+0x6e>
   3c16c:	68 94       	set
   3c16e:	90 38       	cpi	r25, 0x80	; 128
   3c170:	81 05       	cpc	r24, r1
   3c172:	61 f0       	breq	.+24     	; 0x3c18c <pow+0x3c>
   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 <pow+0x3c>
   3c17c:	99 23       	and	r25, r25
   3c17e:	4a f5       	brpl	.+82     	; 0x3c1d2 <pow+0x82>
   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 <pow+0x80>
   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 <pow+0x50>
   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 <pow+0x42>
   3c19e:	10 c0       	rjmp	.+32     	; 0x3c1c0 <pow+0x70>
   3c1a0:	ff 5f       	subi	r31, 0xFF	; 255
   3c1a2:	70 f4       	brcc	.+28     	; 0x3c1c0 <pow+0x70>
   3c1a4:	a6 95       	lsr	r26
   3c1a6:	e0 f7       	brcc	.-8      	; 0x3c1a0 <pow+0x50>
   3c1a8:	f7 39       	cpi	r31, 0x97	; 151
   3c1aa:	50 f0       	brcs	.+20     	; 0x3c1c0 <pow+0x70>
   3c1ac:	19 f0       	breq	.+6      	; 0x3c1b4 <pow+0x64>
   3c1ae:	ff 3a       	cpi	r31, 0xAF	; 175
   3c1b0:	38 f4       	brcc	.+14     	; 0x3c1c0 <pow+0x70>
   3c1b2:	9f 77       	andi	r25, 0x7F	; 127
   3c1b4:	9f 93       	push	r25
   3c1b6:	0d d0       	rcall	.+26     	; 0x3c1d2 <pow+0x82>
   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 <pow+0x82>
   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 <log>
   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 <exp>

0003c1f0 <sin>:
   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 <sin+0x18>
   3c202:	16 f4       	brtc	.+4      	; 0x3c208 <sin+0x18>
   3c204:	0d 94 50 d7 	jmp	0x3aea0	; 0x3aea0 <__fp_nan>
   3c208:	0d 94 35 df 	jmp	0x3be6a	; 0x3be6a <__fp_mpack>

0003c20c <sqrt>:
   3c20c:	0f 94 7a d7 	call	0x3aef4	; 0x3aef4 <__fp_splitA>
   3c210:	b8 f3       	brcs	.-18     	; 0x3c200 <sin+0x10>
   3c212:	99 23       	and	r25, r25
   3c214:	c9 f3       	breq	.-14     	; 0x3c208 <sin+0x18>
   3c216:	b6 f3       	brts	.-20     	; 0x3c204 <sin+0x14>
   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 <sqrt+0x30>
   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 <sqrt+0x38>
   3c23c:	26 17       	cp	r18, r22
   3c23e:	37 07       	cpc	r19, r23
   3c240:	48 07       	cpc	r20, r24
   3c242:	30 f4       	brcc	.+12     	; 0x3c250 <sqrt+0x44>
   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 <sqrt+0x28>
   3c25e:	66 0f       	add	r22, r22
   3c260:	77 1f       	adc	r23, r23
   3c262:	88 1f       	adc	r24, r24
   3c264:	20 f0       	brcs	.+8      	; 0x3c26e <sqrt+0x62>
   3c266:	26 17       	cp	r18, r22
   3c268:	37 07       	cpc	r19, r23
   3c26a:	48 07       	cpc	r20, r24
   3c26c:	30 f4       	brcc	.+12     	; 0x3c27a <sqrt+0x6e>
   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 <sqrt+0x52>
   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 <exp>:
   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 <modf>
   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 <exp+0x56>
   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 <exp+0x4a>
   3c2f8:	41 95       	neg	r20
   3c2fa:	55 0b       	sbc	r21, r21
   3c2fc:	0f 94 3f e0 	call	0x3c07e	; 0x3c07e <ldexp>
   3c300:	0f 90       	pop	r0
   3c302:	07 fe       	sbrs	r0, 7
   3c304:	0d 94 33 e0 	jmp	0x3c066	; 0x3c066 <inverse>
   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 <log>:
   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 <log+0x28>
   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 <log+0x1e>
   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 <log+0x3e>
   3c386:	80 3e       	cpi	r24, 0xE0	; 224
   3c388:	38 f0       	brcs	.+14     	; 0x3c398 <log+0x48>
   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 <log+0x50>
   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 <modf>:
   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 <modf+0x1a>
   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 <modf+0x5a>
   3c3fa:	b7 51       	subi	r27, 0x17	; 23
   3c3fc:	90 f4       	brcc	.+36     	; 0x3c422 <modf+0x42>
   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 <modf+0x22>
   3c40e:	00 20       	and	r0, r0
   3c410:	71 f0       	breq	.+28     	; 0x3c42e <modf+0x4e>
   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 <modf+0x32>
   3c41c:	0e d0       	rcall	.+28     	; 0x3c43a <modf+0x5a>
   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 <modf+0x5a>
   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 <modf+0x66>
   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 <tolower>:
   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 <tolower+0xc>
   3c452:	80 5e       	subi	r24, 0xE0	; 224
   3c454:	85 5a       	subi	r24, 0xA5	; 165
   3c456:	08 95       	ret

0003c458 <memcmp>:
   3c458:	fb 01       	movw	r30, r22
   3c45a:	dc 01       	movw	r26, r24
   3c45c:	04 c0       	rjmp	.+8      	; 0x3c466 <memcmp+0xe>
   3c45e:	8d 91       	ld	r24, X+
   3c460:	01 90       	ld	r0, Z+
   3c462:	80 19       	sub	r24, r0
   3c464:	21 f4       	brne	.+8      	; 0x3c46e <memcmp+0x16>
   3c466:	41 50       	subi	r20, 0x01	; 1
   3c468:	50 40       	sbci	r21, 0x00	; 0
   3c46a:	c8 f7       	brcc	.-14     	; 0x3c45e <memcmp+0x6>
   3c46c:	88 1b       	sub	r24, r24
   3c46e:	99 0b       	sbc	r25, r25
   3c470:	08 95       	ret

0003c472 <memcpy>:
   3c472:	fb 01       	movw	r30, r22
   3c474:	dc 01       	movw	r26, r24
   3c476:	02 c0       	rjmp	.+4      	; 0x3c47c <memcpy+0xa>
   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 <memcpy+0x6>
   3c482:	08 95       	ret

0003c484 <memset>:
   3c484:	dc 01       	movw	r26, r24
   3c486:	01 c0       	rjmp	.+2      	; 0x3c48a <memset+0x6>
   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 <memset+0x4>
   3c490:	08 95       	ret

0003c492 <strcasecmp>:
   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 <strcasecmp+0x10>
   3c49c:	8b 35       	cpi	r24, 0x5B	; 91
   3c49e:	0c f4       	brge	.+2      	; 0x3c4a2 <strcasecmp+0x10>
   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 <strcasecmp+0x1c>
   3c4a8:	6b 35       	cpi	r22, 0x5B	; 91
   3c4aa:	0c f4       	brge	.+2      	; 0x3c4ae <strcasecmp+0x1c>
   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 <strcasecmp+0x4>
   3c4b4:	99 0b       	sbc	r25, r25
   3c4b6:	08 95       	ret

0003c4b8 <strcat>:
   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 <strcat+0x4>
   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 <strcat+0xc>
   3c4cc:	08 95       	ret

0003c4ce <strchr>:
   3c4ce:	fc 01       	movw	r30, r24
   3c4d0:	81 91       	ld	r24, Z+
   3c4d2:	86 17       	cp	r24, r22
   3c4d4:	21 f0       	breq	.+8      	; 0x3c4de <strchr+0x10>
   3c4d6:	88 23       	and	r24, r24
   3c4d8:	d9 f7       	brne	.-10     	; 0x3c4d0 <strchr+0x2>
   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 <strcmp>:
   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 <strcmp+0x4>
   3c4f2:	99 0b       	sbc	r25, r25
   3c4f4:	08 95       	ret

0003c4f6 <strcpy>:
   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 <strcpy+0x4>
   3c502:	08 95       	ret

0003c504 <strncmp>:
   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 <strncmp+0x16>
   3c50e:	8d 91       	ld	r24, X+
   3c510:	01 90       	ld	r0, Z+
   3c512:	80 19       	sub	r24, r0
   3c514:	19 f4       	brne	.+6      	; 0x3c51c <strncmp+0x18>
   3c516:	00 20       	and	r0, r0
   3c518:	b9 f7       	brne	.-18     	; 0x3c508 <strncmp+0x4>
   3c51a:	88 1b       	sub	r24, r24
   3c51c:	99 0b       	sbc	r25, r25
   3c51e:	08 95       	ret

0003c520 <strncpy>:
   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 <strncpy+0x1c>
   3c52a:	01 90       	ld	r0, Z+
   3c52c:	0d 92       	st	X+, r0
   3c52e:	00 20       	and	r0, r0
   3c530:	c9 f7       	brne	.-14     	; 0x3c524 <strncpy+0x4>
   3c532:	01 c0       	rjmp	.+2      	; 0x3c536 <strncpy+0x16>
   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 <strncpy+0x14>
   3c53c:	08 95       	ret

0003c53e <puts>:
   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 <puts+0x2c>
   3c55a:	0f ef       	ldi	r16, 0xFF	; 255
   3c55c:	1f ef       	ldi	r17, 0xFF	; 255
   3c55e:	14 c0       	rjmp	.+40     	; 0x3c588 <puts+0x4a>
   3c560:	19 95       	eicall
   3c562:	89 2b       	or	r24, r25
   3c564:	11 f0       	breq	.+4      	; 0x3c56a <puts+0x2c>
   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 <puts+0x22>
   3c580:	8a e0       	ldi	r24, 0x0A	; 10
   3c582:	19 95       	eicall
   3c584:	89 2b       	or	r24, r25
   3c586:	49 f7       	brne	.-46     	; 0x3c55a <puts+0x1c>
   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>
