
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░
рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрди рдХреЗ рдмрд╛рдж рдХрд╛рдлреА рд╕рдордп рдХреЗ рдмрд╛рдж , рдореИрдВрдиреЗ рдЕрднреА рднреА рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдереЛрдбрд╝рд╛ рдмрд╣реБрдд, рдЖрдИрдбреАрдП рдкреНрд░реЛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд / рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрд╣ рдЖрд▓реЗрдЦ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЙрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЬрд╛рдо рдХреЛ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рдирдХреЗ рд╕реНрд░реЛрдд рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд╛рдо рд▓рд╛рдЗрд╡ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрд╛рдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рд╣рдо рдмрдЧреЛрдВ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ
рдиреЛрдЯ: рдЗрд╕рдХреЗ рдмрд╛рдж рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореЛрдЯреЛрд░реЛрд▓рд╛ M68000 рдореЙрдбреНрдпреВрд▓ (рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдФрд░ рдмрд╣реБрдд рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ) рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдкрд╣рд▓реА рдХреЗрдВрдЯ : рдкреАрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ред рдЧрд▓рддреА рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрддреБрд╖реНрдЯ рд╕реВрдЪреА рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рд▓рдЧрддрд╛ рд╣реИ рдпрд╣рд╛рдВ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди, рдУрдкрдХреЛрдб рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдХреБрдЫ рдСрдирд▓рд╛рдЗрди рдбрд┐рд╕рд╕рдореЗрдВрдмрд░ рдореЗрдВ рдбрд┐рд╕рдорд┐рд╕ рдХреЛ рджреЗрдЦреЗрдВ:

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдмреЛрдзрди рдкреАрд╕реА- рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХ рдЧрдВрддрд╡реНрдп рдХрд╛ рдкрддрд╛ signed short
рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рдЖрддрд╛ рд╣реИред
рдХреЗрдВрдЯ рджреЛ : рд░реИрдо рдХреЗ рд▓рд┐рдП "рджрд░реНрдкрдг", рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ред рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ m68k рдореЗрдВ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ 24-рдмрд┐рдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЙрд▓ рдЙрдЪреНрдЪ (рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдирд┐рдЪрд▓реЗ) рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреНрд░реЙрд╕-рд░реЗрдлрд░реЗрдВрд╕ рдХреЗ рд╕рдорд╛рди рд░реЗрдВрдЬ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреАрди рдХреИрдВрдЯ (рдмрд▓реНрдХрд┐, рдПрдХ рдХреИрдВрдЯ рднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдХрдореА) рд╣реИрдВ: рддрдерд╛рдХрдерд┐рдд рд▓рд╛рдЗрдирдП ( 1010 ) рдФрд░ рд▓рд╛рдЗрдирдПрдл ( 1111 ) рдПрдореБрд▓реЗрдЯрд░ред рдпреЗ рдРрд╕реЗ рдСрдкрдХреЛрдб рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рдореВрд▓ рд╕реЗрдЯ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рдзрд┐рдд рд╡реИрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдУрдкрдХреЛрдбреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рджреЛ-рдмрд╛рдЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрд╛ред рд╣рдо рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
рдЬрд╛рдо рдЪрд╛рд░ : рдЯреНрд░реИрдк # рдПрди рдирд┐рд░реНрджреЗрд╢ рдЦреБрдж рдХреЛ рд╣реБрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдлрд╝реНрд╕ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдЬрд╛рдВрдм рдкрд╛рдБрдЪ : movea.w рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдПрдХ рд╢рдмреНрдж рд▓рд┐рдВрдХ рд╕реЗ рдПрдХ рдкрддреЗ рдкрд░ рдПрдХ рдкреВрд░реНрдг xref рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╢рдмреНрдж рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рд╣рдо рдмрдЧреНрд╕ (рдЯреЗрдореНрдкрд▓реЗрдЯ) рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ рдФрд░ "рдлрд┐рдХреНрд╕" рдХреНрдпрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, "рдлрд┐рдХреНрд╕рд░" рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд▓рдЧрдЗрди рд╣реИред рдпрд╣, рдпрд╣ рдХреА рддрд░рд╣ рд╣реИ, рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдореИрдВрдиреЗ "рдкреНрд▓рд╕рд╕" рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред рдХреЗрд╡рд▓ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдЧреНрд░рд╕реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдкрд╛рдпрдерди рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЙрдкрдХреНрд░рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Visual Studio рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА DLL рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ: File-> New-> Project-> рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╕реНрдХрдЯреЙрдк рд╡рд┐рдЬрд╛рд░реНрдб-> рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (.dll), рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд░рдХреЗ рдФрд░ рдмрд╛рдХреА рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░рдХреЗ :

рдЖрдИрдбреАрдП рдПрд╕рдбреАрдХреЗ рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореИрдХреНрд░реЛрдЬрд╝ (рдореИрдВ 2017 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛) рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред рдЙрд╕реА рд╕рдордп, рд╣рдо рдЖрдИрдбреАрдП рдкреНрд░реЛ рдХреЗ рдкрде рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
рджреЗрдЦреЗрдВ -> рдЕрдиреНрдп рд╡рд┐рдВрдбреЛрдЬ -> рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдмрдВрдзрдХ :

рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрд╕рдбреАрдХреЗ рд╕рдВрд╕реНрдХрд░рдг 7.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕рдВрдХрд▓рди x64- рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдбреАрдмрдЧ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ x64 -> Microsoft.Cpp.x64.user -> рдЧреБрдг :

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореИрдХреНрд░реЛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝реЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдФрд░ IDA_SDK рдореИрдХреНрд░реЛ рдХреЛ рдЙрд╕ рдкрде рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдиреЗ SDK рдХреЛ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдерд╛:

рд╣рдо IDA_DIR (рдЖрдкрдХреЗ IDA рдкреНрд░реЛ рдХрд╛ рдкрде) рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ:

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ IDA рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ % Program Files% рдкрд░ рд╕реЗрдЯ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЖрдЗрдП Win32 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрдВ (рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдореИрдВ x86 рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛), рдХреЗрд╡рд▓ x64 рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЫреЛрдбрд╝рдХрд░ред
рдПрдХ рдЦрд╛рд▓реА ida_plugin.cpp рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рд╣рдо рдЕрднреА рддрдХ рдХреЛрдб рдирд╣реАрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред
рдЕрдм рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ C ++ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕:



рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдФрд░ рдПрд╕рдбреАрдХреЗ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп:


рдЕрдм рдХреЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬреЛрдбрд╝реЗрдВ:
Ida_plugin.cpp рдХреЛрдб #include <ida.hpp> #include <idp.hpp> #include <ua.hpp> #include <bytes.hpp> #include <loader.hpp> #include <offset.hpp> #define NAME "M68000 proc-fixer plugin" #define VERSION "1.0" static bool plugin_inited; static bool my_dbg; //-------------------------------------------------------------------------- static void print_version() { static const char format[] = NAME " v%s\n"; info(format, VERSION); msg(format, VERSION); } //-------------------------------------------------------------------------- static bool init_plugin(void) { if (ph.id != PLFM_68K) return false; return true; } #ifdef _DEBUG static const char* const optype_names[] = { "o_void", "o_reg", "o_mem", "o_phrase", "o_displ", "o_imm", "o_far", "o_near", "o_idpspec0", "o_idpspec1", "o_idpspec2", "o_idpspec3", "o_idpspec4", "o_idpspec5", }; static const char* const dtyp_names[] = { "dt_byte", "dt_word", "dt_dword", "dt_float", "dt_double", "dt_tbyte", "dt_packreal", "dt_qword", "dt_byte16", "dt_code", "dt_void", "dt_fword", "dt_bitfild", "dt_string", "dt_unicode", "dt_3byte", "dt_ldbl", "dt_byte32", "dt_byte64", }; static void print_insn(const insn_t *insn) { if (my_dbg) { msg("cs=%x, ", insn->cs); msg("ip=%x, ", insn->ip); msg("ea=%x, ", insn->ea); msg("itype=%x, ", insn->itype); msg("size=%x, ", insn->size); msg("auxpref=%x, ", insn->auxpref); msg("segpref=%x, ", insn->segpref); msg("insnpref=%x, ", insn->insnpref); msg("insnpref=%x, ", insn->insnpref); msg("flags["); if (insn->flags & INSN_MACRO) msg("INSN_MACRO|"); if (insn->flags & INSN_MODMAC) msg("OF_OUTER_DISP"); msg("]\n"); } } static void print_op(ea_t ea, const op_t *op) { if (my_dbg) { msg("type[%s], ", optype_names[op->type]); msg("flags["); if (op->flags & OF_NO_BASE_DISP) msg("OF_NO_BASE_DISP|"); if (op->flags & OF_OUTER_DISP) msg("OF_OUTER_DISP|"); if (op->flags & PACK_FORM_DEF) msg("PACK_FORM_DEF|"); if (op->flags & OF_NUMBER) msg("OF_NUMBER|"); if (op->flags & OF_SHOW) msg("OF_SHOW"); msg("], "); msg("dtyp[%s], ", dtyp_names[op->dtype]); if (op->type == o_reg) msg("reg=%x, ", op->reg); else if (op->type == o_displ || op->type == o_phrase) msg("phrase=%x, ", op->phrase); else msg("reg_phrase=%x, ", op->phrase); msg("addr=%x, ", op->addr); msg("value=%x, ", op->value); msg("specval=%x, ", op->specval); msg("specflag1=%x, ", op->specflag1); msg("specflag2=%x, ", op->specflag2); msg("specflag3=%x, ", op->specflag3); msg("specflag4=%x, ", op->specflag4); msg("refinfo["); opinfo_t buf; if (get_opinfo(&buf, ea, op->n, op->flags)) { msg("target=%x, ", buf.ri.target); msg("base=%x, ", buf.ri.base); msg("tdelta=%x, ", buf.ri.tdelta); msg("flags["); if (buf.ri.flags & REFINFO_TYPE) msg("REFINFO_TYPE|"); if (buf.ri.flags & REFINFO_RVAOFF) msg("REFINFO_RVAOFF|"); if (buf.ri.flags & REFINFO_PASTEND) msg("REFINFO_PASTEND|"); if (buf.ri.flags & REFINFO_CUSTOM) msg("REFINFO_CUSTOM|"); if (buf.ri.flags & REFINFO_NOBASE) msg("REFINFO_NOBASE|"); if (buf.ri.flags & REFINFO_SUBTRACT) msg("REFINFO_SUBTRACT|"); if (buf.ri.flags & REFINFO_SIGNEDOP) msg("REFINFO_SIGNEDOP"); msg("]"); } msg("]\n"); } } #endif static bool ana_addr = 0; static ssize_t idaapi hook_idp(void *user_data, int notification_code, va_list va) { switch (notification_code) { case processor_t::ev_ana_insn: { insn_t *out = va_arg(va, insn_t*); if (ana_addr) break; ana_addr = 1; if (ph.ana_insn(out) <= 0) { ana_addr = 0; break; } ana_addr = 0; #ifdef _DEBUG print_insn(out); #endif for (int i = 0; i < UA_MAXOP; ++i) { op_t &op = out->ops[i]; #ifdef _DEBUG print_op(out->ea, &op); #endif } return out->size; } break; case processor_t::ev_emu_insn: { const insn_t *insn = va_arg(va, const insn_t*); } break; case processor_t::ev_out_mnem: { outctx_t *outbuffer = va_arg(va, outctx_t *); //outbuffer->out_custom_mnem(mnem); //return 1; } break; default: { #ifdef _DEBUG if (my_dbg) { msg("msg = %d\n", notification_code); } #endif } break; } return 0; } //-------------------------------------------------------------------------- static int idaapi init(void) { if (init_plugin()) { plugin_inited = true; my_dbg = false; hook_to_notification_point(HT_IDP, hook_idp, NULL); print_version(); return PLUGIN_KEEP; } return PLUGIN_SKIP; } //-------------------------------------------------------------------------- static void idaapi term(void) { if (plugin_inited) { unhook_from_notification_point(HT_IDP, hook_idp); plugin_inited = false; } } //-------------------------------------------------------------------------- static bool idaapi run(size_t /*arg*/) { return false; } //-------------------------------------------------------------------------- const char comment[] = NAME; const char help[] = NAME; //-------------------------------------------------------------------------- // // PLUGIN DESCRIPTION BLOCK // //-------------------------------------------------------------------------- plugin_t PLUGIN = { IDP_INTERFACE_VERSION, PLUGIN_PROC | PLUGIN_MOD, // plugin flags init, // initialize term, // terminate. this pointer may be NULL. run, // invoke plugin comment, // long comment about the plugin // it could appear in the status line // or as a hint help, // multiline help about the plugin NAME, // the preferred short name of the plugin "" // the preferred hotkey to run the plugin };
рд╣рдо рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ)
рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХреМрди рд╕реЗ рдЭрдВрдбреЗ print_insn()
рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП print_op()
рдФрд░ print_insn()
рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ рд╣рдо рдореМрдЬреВрджрд╛ рдСрдкрдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЭрдВрдбреЗ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЗ рд╕рдордп рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реЗ "рдлрд┐рдХреНрд╕" рдХрд╛ рд╢рд░реАрд░ hook_idp()
рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдорд╛рд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди рдХреЙрд▓рдмреИрдХ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
processor_t::ev_ana_insn
: рдЕрдЧрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреБрдЫ processor_t::ev_ana_insn
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬрд░реВрд░рдд рд╣реИprocessor_t::ev_emu_insn
: рдпрд╣рд╛рдВ рдЖрдк рдбреЗрдЯрд╛ / рдХреЛрдб рдкрд░ рдХреНрд░реЙрд╕- processor_t::ev_emu_insn
рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдирдП opcodes рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдкреБрд░рд╛рдиреЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рд╣реИрдВ)processor_t::ev_out_mnem
: рдирдП opcodes рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдм рдпрд╣рд╛рдБ рд╣реИ
init_plugin()
рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рдкреИрдЪ рдХреЛ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЛрдб init_plugin()
рд╕реЗ init_plugin()
ред
рдЦреИрд░, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд - рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдШрдЯрдирд╛рдУрдВ рдкрд░ рдкреВрд░реЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ:
hook_to_notification_point(HT_IDP, hook_idp, NULL);
рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ ana_addr
рд╕рд╛рде рдЪрд╛рд▓ ana_addr
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ ana_insn
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рди рдЬрд╛рдП рдЬрдм рд╣рдо рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рдБ, рдЕрдлрд╕реЛрд╕, рдпрд╣ "рдмреИрд╕рд╛рдЦреА" рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рднреАред
рд╕рдорд╕реНрдпрд╛ рдирдВрдмрд░ 1 рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдИрдбреАрдП рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреАрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдСрдлрд╕реЗрдЯ рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдПрдХ рдХреВрдж рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдХреЗрд╕-рдЗрдВрдбреЗрдХреНрд╕), рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП, рдкрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирддреАрдЬрддрди, рдореБрдЭреЗ рдРрд╕рд╛ рдХреВрдж рдирд┐рд░реНрджреЗрд╢ рдорд┐рд▓рд╛, рдФрд░ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХреНрдпрд╛ рдЭрдВрдбреЗ рд▓рдЧрд╛рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдкреАрд╕реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ:

рд╕рдорд╕реНрдпрд╛ рдирдВрдмрд░ 1 рдХреЛ рдареАрдХ рдХрд░реЗрдВ case processor_t::ev_ana_insn: { insn_t *out = va_arg(va, insn_t*); if (ana_addr) break; ana_addr = 1; if (ph.ana_insn(out) <= 0) { ana_addr = 0; break; } ana_addr = 0; for (int i = 0; i < UA_MAXOP; ++i) { op_t &op = out->ops[i]; switch (op.type) { case o_near: case o_mem: { if (out->itype != 0x76 || op.n != 0 || (op.phrase != 0x09 && op.phrase != 0x0A) || (op.addr == 0 || op.addr >= (1 << 23)) || op.specflag1 != 2)
рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 2 рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдмрд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реАрдорд╛ рддрдХ рдкрддреЛрдВ рдХреЛ рдорд╛рд╕реНрдХ рдХрд░реЗрдВ: 0xFF0000-0xFFFFFF (RAM рдХреЗ рд▓рд┐рдП) рдФрд░ 0xC00000-0xC000FF ( VDP рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП)ред рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ o_near
рдФрд░ o_mem
рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдирдВрдмрд░ 2 рдХреЛ рдареАрдХ рдХрд░реЗрдВ case processor_t::ev_ana_insn: { insn_t *out = va_arg(va, insn_t*); if (ana_addr) break; ana_addr = 1; if (ph.ana_insn(out) <= 0) { ana_addr = 0; break; } ana_addr = 0; for (int i = 0; i < UA_MAXOP; ++i) { op_t &op = out->ops[i]; switch (op.type) { case o_near: case o_mem: { op.addr &= 0xFFFFFF;
рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 3 рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рдВрдЫрд┐рдд opcode рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдирдП рдСрдкрдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╕рднреА рдирдП рд╕реВрдЪрдХрд╛рдВрдХ
CUSTOM_INSN_ITYPE
рд╢реБрд░реВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП
enum m68k_insn_type_t { M68K_linea = CUSTOM_INSN_ITYPE, M68K_linef, };
- рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ: 0xA0 / 0xF0 ред рддреЛ рд╣рдо рдПрдХ рдмрд╛рдЗрдЯ рдкрдврд╝рддреЗ рд╣реИрдВ
- рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╣реЗрдбрд░ рдХреЗ рдкрд╣рд▓реЗ 64 рдпрд╛рд░реНрдб рдореЗрдВ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╛рдзрд┐рдд рд╡реИрдХреНрдЯрд░ рд╣реИрдВред 0x0A рдФрд░ 0x0B рдкрджреЛрдВ рдкрд░ рд▓рд╛рдЗрдирдП / рд▓рд╛рдЗрдирдПрдл рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ :
value = get_dword(0x0A * sizeof(uint32));
ev_emu_insn
рд╣реИрдВрдбрд▓рд░ рдФрд░ рдирд┐рдореНрди рдХрдерди рдореЗрдВ ev_emu_insn
рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдХреЛрдб-рдкреНрд░рд╡рд╛рд╣ рдмрд╛рдзрд┐рдд рди рд╣реЛ:
insn->add_cref(insn->Op1.addr, 0, fl_CN);
ev_out_mnem
рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо opcode рдХрд╛ ev_out_mnem
рдХрд░реЗрдВ:
const char *mnem = (outbuffer->insn.itype == M68K_linef) ? "line_f" : "line_a"; outbuffer->out_custom_mnem(mnem);

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рей enum m68k_insn_type_t { M68K_linea = CUSTOM_INSN_ITYPE, M68K_linef, }; case processor_t::ev_ana_insn: { insn_t *out = va_arg(va, insn_t*); if (ana_addr) break; uint16 itype = 0; ea_t value = out->ea; uchar b = get_byte(out->ea); if (b == 0xA0 || b == 0xF0) { switch (b) { case 0xA0: itype = M68K_linea; value = get_dword(0x0A * sizeof(uint32)); break; case 0xF0: itype = M68K_linef; value = get_dword(0x0B * sizeof(uint32)); break; } out->itype = itype; out->size = 2; out->Op1.type = o_near; out->Op1.offb = 1; out->Op1.dtype = dt_dword; out->Op1.addr = value; out->Op1.phrase = 0x0A; out->Op1.specflag1 = 2; out->Op2.type = o_imm; out->Op2.offb = 1; out->Op2.dtype = dt_byte; out->Op2.value = get_byte(out->ea + 1); } return out->size; } break; case processor_t::ev_emu_insn: { const insn_t *insn = va_arg(va, const insn_t*); if (insn->itype == M68K_linea || insn->itype == M68K_linef) { insn->add_cref(insn->Op1.addr, 0, fl_CN); insn->add_cref(insn->ea + insn->size, insn->Op1.offb, fl_F); return 1; } } break; case processor_t::ev_out_mnem: { outctx_t *outbuffer = va_arg(va, outctx_t *); if (outbuffer->insn.itype != M68K_linea && outbuffer->insn.itype != M68K_linef) break; const char *mnem = (outbuffer->insn.itype == M68K_linef) ? "line_f" : "line_a"; outbuffer->out_custom_mnem(mnem); return 1; } break;
рдЕрдВрдХ 4 рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░реЗрдВ
рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╣рдо trap
рдЕрдиреБрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдУрдкрдХреЛрдб рдкрд╛рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рд╣реИрдВрдбрд▓рд░ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ 4 case processor_t::ev_emu_insn: { const insn_t *insn = va_arg(va, const insn_t*); if (insn->itype == 0xB6)
рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 5 рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░
рдпрд╣рд╛рдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдкрд╣рд▓реЗ, рдСрдкрд░реЗрд╢рди movea.w
рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВред рдлрд┐рд░, рдпрджрд┐ рдСрдкрд░реЗрдВрдб рд╢рдмреНрдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рдФрд░ рд░реИрдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд▓рд┐рдВрдХ рдХреЛ рдПрдХ рдардВрдбреЗ рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЖрдзрд╛рд░ 0xFF0000 рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 5 рдХреЛ рдареАрдХ рдХрд░реЗрдВ case processor_t::ev_ana_insn: { insn_t *out = va_arg(va, insn_t*); if (ana_addr) break; ana_addr = 1; if (ph.ana_insn(out) <= 0) { ana_addr = 0; break; } ana_addr = 0; for (int i = 0; i < UA_MAXOP; ++i) { op_t &op = out->ops[i]; switch (op.type) { case o_imm: { if (out->itype != 0x7F || op.n != 0)
рдирд┐рд╖реНрдХрд░реНрд╖
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореМрдЬреВрджрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рди рдХреЗрд╡рд▓ рдЕрдЬреНрдЮрд╛рдд рдСрдкрдХреЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдХрднреА-рдХрднреА рдкреНрд░рддрд┐рд╢рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд рднреА) рдХреА рд╕рдордЭред рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ: https://github.com/lab313ru/m68k_fixer