рдкрд┐рдЫрд▓реЗ PHDays 9 рдореЗрдВ рд╣рдордиреЗ рдЧреИрд╕ рдкрдВрдкрд┐рдВрдЧ рдкреНрд▓рд╛рдВрдЯ рдХреЛ рд╣реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдЖрдпреЛрдЬрд┐рдд рдХреА - рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛
рд╡рд┐рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕реНрдЯреИрдВрдб рдХреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд░рдЪрдирд╛ рд╕рдорд╛рди рдереА: рд╕реАрдореЗрдВрд╕ рд╕рд┐рдореЗрдЯрд┐рдХ рдкреАрдПрд▓рд╕реА рдПрд╕7-300 рд╢реНрд░реГрдВрдЦрд▓рд╛; рдЖрдкрд╛рддрдХрд╛рд▓реАрди рдЕрдкрд╕реНрдлреАрддрд┐ рдмрдЯрди рдФрд░ рджрдмрд╛рд╡ рдорд╛рдкрдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг (рдкреАрдПрд▓рд╕реА рдбрд┐рдЬрд┐рдЯрд▓ рдЗрдирдкреБрдЯ (рдбреАрдЖрдИ) рд╕реЗ рдЬреБрдбрд╝рд╛); рд╣рд╡рд╛ рдХреА рдореБрджреНрд░рд╛рд╕реНрдлреАрддрд┐ рдФрд░ рдЕрдкрд╕реНрдлреАрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд╛рд▓реНрд╡ (рдкреАрдПрд▓рд╕реА (рдбреАрдУ) рдХреЗ рдбрд┐рдЬрд┐рдЯрд▓ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ) - рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВред
рдкреАрдПрд▓рд╕реА рдиреЗ, рджрдмрд╛рд╡ рд░реАрдбрд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдФрд░ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЧреЗрдВрдж рдХреЛ рдбрд┐рдлреНрд▓реЗрдЯ рдпрд╛ рдлреБрд▓рд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ (рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╛рд▓реНрд╡ рдЦреЛрд▓реЗ рдФрд░ рдмрдВрдж рдХрд┐рдП)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рднреА рд╕реНрдЯреИрдВрдбреЛрдВ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рдирд┐рдпрдВрддреНрд░рдг рдореЛрдб рдерд╛, рдЬрд┐рд╕рд╕реЗ рд╡рд╛рд▓реНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред
рдЗрд╕ рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рд╕реНрдЯреИрдВрдб рднрд┐рдиреНрди рдереЗ: рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдЯреИрдВрдб рдкрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдерд╛, рдФрд░ рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдЯреИрдВрдб рдкрд░ рдпрд╣ рддрджрдиреБрд╕рд╛рд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдерд╛ред
рдЫрд╣ рдореЗрдВ рд╕реЗ рдкрд╛рдВрдЪ рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЛ рджрд┐рдиреЛрдВ рдореЗрдВ рд╣рд▓ рд╣реЛ рдЧрдИрдВ; рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рднрд╛рдЧреА рдиреЗ 233 рдЕрдВрдХ рдЕрд░реНрдЬрд┐рдд рдХрд┐рдП (рдЙрд╕рдиреЗ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдмрд┐рддрд╛рдпрд╛)ред рддреАрди рд╡рд┐рдЬреЗрддрд╛: I рд╕реНрдерд╛рди - a1exdandy, II - Rubikoid, III - Zeред
рд╣рд╛рд▓рд╛рдБрдХрд┐, PHDays рдХреЗ рджреМрд░рд╛рди, рдХреЛрдИ рднреА рдкреНрд░рддрд┐рднрд╛рдЧреА рд╕рднреА рддреАрди рд╕реНрдЯреИрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рдСрдирд▓рд╛рдЗрди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдФрд░ рдЬреВрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдирд╛ рдерд╛, рдзреНрд╡рдЬ рдвреВрдВрдврдирд╛ рдерд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдерд╛ред
рдХрдЯ рдХреЗ рдиреАрдЪреЗ рд╣рдо рдорд╣реАрдиреЗ рднрд░ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдбрд┐рдЬрд┐рдЯрд▓ рд╕реБрд░рдХреНрд╖рд╛ рдХрдВрдкрдиреА рдХреЗ рдПрд▓реЗрдХреНрд╕реА рдХреЛрд╡рд░рд┐рдЬрд╝реНрдирд┐рдЦ (a1exdandy) рджреНрд╡рд╛рд░рд╛ рдкрд╛рдпрд╛ рдЧрдпрд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ PHDays рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдкреНрд░рдердо рд╕реНрдерд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред рдиреАрдЪреЗ рд╣рдо рдЗрд╕рдХрд╛ рдкрд╛рда рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рддреЛ, рдХрд╛рд░реНрдп рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рдерд╛:
- рдмреНрд▓реЙрдХ_рдЕрдкрд▓реЛрдб_рдЯреНрд░реИрдлрд╝рд┐рдХ.pcapng
- DB100.bin
- рд╕рдВрдХреЗрдд.txt
рд╕рдВрдХреЗрдд.txt рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╕рдВрдХреЗрдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣рд╛рдБ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:
- рдкреЗрддреНрд░реЛрд╡рд┐рдЪ рдиреЗ рдХрд▓ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЖрдк PlcSim рд╕реЗ рд╕реНрдЯреЗрдк7 рдореЗрдВ рдмреНрд▓реЙрдХ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рд╕реНрдЯреИрдВрдб рдкрд░ рд╕реАрдореЗрдВрд╕ рд╕рд┐рдореЗрдЯрд┐рдХ рдПрд╕7-300 рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреАрдПрд▓рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- PlcSim рдПрдХ PLC рдПрдореБрд▓реЗрдЯрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реАрдореЗрдВрд╕ S7 PLC рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ DB100.bin рдлрд╝рд╛рдЗрд▓ рдореЗрдВ DB100 PLC рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ: 00000000: 0100 0102 6e02 0401 0206 0100 0101 0102 ....n......... 00000010: 1002 0501 0202 2002 0501 0206 0100 0102 00000020 0102 . ............ 7702: 0401 0206 0100 0103 0102 0 02 00000030a0501 ..w........... 0202: 1602 0501 0206 0100 0104 0102 00000040 7502 ................ 0401: 0206 0100 0105 0102 0 02 0501a00000050 0202 рдпреВ........... 1602: 0501 0206 0100 0106 0102 3402 4 00000060............0401. 0206: 0100 0107 0102 2602 0501 0202 00000070 4 ........... & ..... 02: 0501C0206 0100 0108 0102 3302 0401 3 00000080 0206 L ......... 0100ред .. 0109 : 0102 0 02 0501 0202a1602 00000090 0501 0206 ................ 0100: 010 0102 3702 0401a 0206 7 000000 0 .......0100. .... 010a0102: 2202 0501b 0202 4602 0501 000000 0 0206 ......"...F... 0100b010: 0102 3302 0401c 0206 0100 3 000000 0 ........010. .... .. 0102c0: 02d 0501 0202a1602 0501 0206 000000 0 0100 ................ 010d0102: 6 02e 0401 0206d0100 010 000000 0 0102f ......m.... .... 1102e0501: 0202 2302 0501 0206 0100 000000 0 0110 ........#...... 0102f3502: 0401 0206 0100 0111 0102 5 00000100 1202 ....0501. ..... ..... 0202: 2502 0501 0206 0100 0112 00000110 0102 3302 ......%... 0401: 0206 0100 0113 0102 2602 3 00000120 0501 ..0202. ..... ....&. 4: 02 0501 0206c0100 XNUMX XNUMX XNUMX ....L......
рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдмреНрд▓реЙрдХ_рдЕрдкрд▓реЛрдб_рдЯреНрд░реИрдлрд╝рд┐рдХ.рдкреАрдХреИрдкрдПрдирдЬреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреАрдПрд▓рд╕реА рдкрд░ рдмреНрд▓реЙрдХ рдЕрдкрд▓реЛрдб рдЯреНрд░реИрдлрд╝рд┐рдХ рдХрд╛ рдбрдВрдк рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рдореНрдореЗрд▓рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд▓ рдкрд░ рдЗрд╕ рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрдВрдк рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TeslaSCADA2 рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдЗрд╕рд╕реЗ рдпрд╣ рд╕рдордЭрдирд╛ рд╕рдВрднрд╡ рдерд╛ рдХрд┐ RC4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбрдВрдк рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рдерд╛ рдФрд░ рдЗрд╕реЗ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред S7 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЗрдЯ рдкрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдбрдВрдк рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ Snap7 рдкреИрдХреЗрдЬ рд╕реЗ рдбреЗрдореЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрдВрдк рд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХ рдирд┐рдХрд╛рд▓рдирд╛
рдбрдВрдк рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрдХрд░, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХ OB1, FC1, FC2 рдФрд░ FC3 рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП. рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ pcapng рдкреНрд░рд╛рд░реВрдк рд╕реЗ pcap рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
#!/usr/bin/env python2
import struct
from scapy.all import *
packets = rdpcap('block_upload_traffic.pcap')
s7_hdr_struct = '>BBHHHHBB'
s7_hdr_sz = struct.calcsize(s7_hdr_struct)
tpkt_cotp_sz = 7
names = iter(['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin'])
buf = ''
for packet in packets:
if packet.getlayer(IP).src == '10.0.102.11':
tpkt_cotp_s7 = str(packet.getlayer(TCP).payload)
if len(tpkt_cotp_s7) < tpkt_cotp_sz + s7_hdr_sz:
continue
s7 = tpkt_cotp_s7[tpkt_cotp_sz:]
s7_hdr = s7[:s7_hdr_sz]
param_sz = struct.unpack(s7_hdr_struct, s7_hdr)[4]
s7_param = s7[12:12+param_sz]
s7_data = s7[12+param_sz:]
if s7_param in ('x1ex00', 'x1ex01'): # upload
buf += s7_data[4:]
elif s7_param == 'x1f':
with open(next(names), 'wb') as f:
f.write(buf)
buf = ''
рдкрд░рд┐рдгрд╛рдореА рдмреНрд▓реЙрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдкрд░, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдмрд╛рдЗрдЯреНрд╕ 70 70 (рдкреАрдкреА) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдХреЗрдд рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП PlcSim рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдорд╛рдирд╡-рдкрдардиреАрдп рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╕рд┐рдореИрдЯрд┐рдХ рдореИрдиреЗрдЬрд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рджреЛрд╣рд░рд╛рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ (= рдХреНрдпреВ 7) рдХреЗ рд╕рд╛рде рдХрдИ рдмреНрд▓реЙрдХ рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкреАрдПрд▓рд╕реА рдХреЛ example.plc рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдХрд░ S0.0-PlcSim рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрдХрд░, рдЖрдк рд╣рд╕реНрддрд╛рдХреНрд╖рд░ 70 70 рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЦреЛрдЬрд╛ рдерд╛ред рдмреНрд▓реЙрдХ рд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ 4-рдмрд╛рдЗрдЯ рдЫреЛрдЯреЗ-рдПрдВрдбрд┐рдпрди рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреАрдПрд▓рд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреАрдПрд▓рд╕реА рдПрд╕7 рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рд╕рд╛рдордиреЗ рдЖрдИ:
- рд╕рд┐рдореИрдЯрд┐рдХ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо S7-PlcSim рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдбрдВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереАред рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рдХреЛ рднрд░рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдЙрдирдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (OB1, FC1, FC2, FC3)ред
- рдкреАрдПрд▓рд╕реА рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред
- рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрдВрдк рдХреЗ рдмреНрд▓реЙрдХ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
- рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рдХреЛ S7-PlcSim рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдореЗрдЯрд┐рдХ рдореИрдиреЗрдЬрд░ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
with open('original.plc', 'rb') as f:
plc = f.read()
blocks = []
for fname in ['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin']:
with open(fname, 'rb') as f:
blocks.append(f.read())
i = plc.find(b'pp')
for block in blocks:
plc = plc[:i] + block + plc[i+len(block):]
i = plc.find(b'pp', i + 1)
with open('target.plc', 'wb') as f:
f.write(plc)
рдПрд▓реЗрдХреНрд╕реА рдиреЗ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдХрдард┐рди, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рд╣реА рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛ред рд╣рдордиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдкреНрд░рддрд┐рднрд╛рдЧреА NetToPlcSim рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ PlcSim рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рдВрдЪрд╛рд░ рдХрд░ рд╕рдХреЗ, Snap7 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PlcSim рдкрд░ рдмреНрд▓реЙрдХ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХреЗ, рдФрд░ рдлрд┐рд░ рд╡рд┐рдХрд╛рд╕ рдкрд░рд┐рд╡реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ PlcSim рд╕реЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХреЗред
рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рдХреЛ S7-PlcSim рдореЗрдВ рдЦреЛрд▓рдХрд░, рдЖрдк рд╕рд┐рдореЗрдЯрд┐рдХ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рдмреНрд▓реЙрдХ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдп рдмреНрд▓реЙрдХ FC1 рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдд #TEMP0 рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИ, рдЬреЛ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ M2.2 рдФрд░ M2.3 рдмрд┐рдЯ рдореЗрдореЛрд░реА рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ PLC рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рдореЛрдб рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред #TEMP0 рдорд╛рди рдлрд╝рдВрдХреНрд╢рди FC3 рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ FC3 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХреЗред
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд▓ рдкрд░ рдХрдо рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдЯреИрдВрдб рдкрд░ рдкреАрдПрд▓рд╕реА рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди #TEMP0 рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреАрдмреА1 рдмреНрд▓реЙрдХ рдореЗрдВ рдореЗрд░реА рдирд┐рдВрдЬрд╛ рд▓рд╛рдЗрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рд╕реАрдзрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдЧрд╣рди рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░ рдкрд░, рдореИрдиреНрдпреБрдЕрд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛ рдФрд░ рдПрд╕рдЯреАрдПрд▓ рднрд╛рд╖рд╛ (рдПрд╕7 рдкреАрдПрд▓рд╕реА рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ) рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд░рд┐рд╡рд░реНрд╕ рдмреНрд▓реЙрдХ FC3
рдПрд╕рдЯреАрдПрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдПрдлрд╕реА3 рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА:
L B#16#0
T #TEMP13
T #TEMP15
L P#DBX 0.0
T #TEMP4
CLR
= #TEMP14
M015: L #TEMP4
LAR1
OPN DB 100
L DBLG
TAR1
<=D
JC M016
L DW#16#0
T #TEMP0
L #TEMP6
L W#16#0
<>I
JC M00d
L P#DBX 0.0
LAR1
M00d: L B [AR1,P#0.0]
T #TEMP5
L W#16#1
==I
JC M007
L #TEMP5
L W#16#2
==I
JC M008
L #TEMP5
L W#16#3
==I
JC M00f
L #TEMP5
L W#16#4
==I
JC M00e
L #TEMP5
L W#16#5
==I
JC M011
L #TEMP5
L W#16#6
==I
JC M012
JU M010
M007: +AR1 P#1.0
L P#DBX 0.0
LAR2
L B [AR1,P#0.0]
L C#8
*I
+AR2
+AR1 P#1.0
L B [AR1,P#0.0]
JL M003
JU M001
JU M002
JU M004
M003: JU M005
M001: OPN DB 101
L B [AR2,P#0.0]
T #TEMP0
JU M006
M002: OPN DB 101
L B [AR2,P#0.0]
T #TEMP1
JU M006
M004: OPN DB 101
L B [AR2,P#0.0]
T #TEMP2
JU M006
M00f: +AR1 P#1.0
L B [AR1,P#0.0]
L C#8
*I
T #TEMP11
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9
TAR1 #TEMP4
OPN DB 101
L P#DBX 0.0
LAR1
L #TEMP11
+AR1
LAR2 #TEMP9
L B [AR2,P#0.0]
T B [AR1,P#0.0]
L #TEMP4
LAR1
JU M006
M008: +AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP3
+AR1 P#1.0
L B [AR1,P#0.0]
JL M009
JU M00b
JU M00a
JU M00c
M009: JU M005
M00b: L #TEMP3
T #TEMP0
JU M006
M00a: L #TEMP3
T #TEMP1
JU M006
M00c: L #TEMP3
T #TEMP2
JU M006
M00e: +AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP8
L P#M 100.0
LAR2
L #TEMP8
L C#8
*I
+AR2
TAR2 #TEMP10
TAR1 #TEMP4
LAR1 #TEMP9
LAR2 #TEMP10
L B [AR1,P#0.0]
L B [AR2,P#0.0]
AW
INVI
T #TEMP12
L B [AR1,P#0.0]
L B [AR2,P#0.0]
OW
L #TEMP12
AW
T B [AR1,P#0.0]
L DW#16#0
T #TEMP0
L MB 101
T #TEMP1
L MB 102
T #TEMP2
L #TEMP4
LAR1
JU M006
M011: +AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP8
L P#M 100.0
LAR2
L #TEMP8
L C#8
*I
+AR2
TAR2 #TEMP10
TAR1 #TEMP4
LAR1 #TEMP9
LAR2 #TEMP10
L B [AR1,P#0.0]
L B [AR2,P#0.0]
-I
T B [AR1,P#0.0]
L DW#16#0
T #TEMP0
L MB 101
T #TEMP1
L MB 102
T #TEMP2
L #TEMP4
LAR1
JU M006
M012: L #TEMP15
INC 1
T #TEMP15
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP8
L P#M 100.0
LAR2
L #TEMP8
L C#8
*I
+AR2
TAR2 #TEMP10
TAR1 #TEMP4
LAR1 #TEMP9
LAR2 #TEMP10
L B [AR1,P#0.0]
L B [AR2,P#0.0]
==I
JCN M013
JU M014
M013: L P#DBX 0.0
LAR1
T #TEMP4
L B#16#0
T #TEMP6
JU M006
M014: L #TEMP4
LAR1
L #TEMP13
L L#1
+I
T #TEMP13
JU M006
M006: L #TEMP0
T MB 100
L #TEMP1
T MB 101
L #TEMP2
T MB 102
+AR1 P#1.0
L #TEMP6
+ 1
T #TEMP6
JU M005
M010: L P#DBX 0.0
LAR1
L 0
T #TEMP6
TAR1 #TEMP4
M005: TAR1 #TEMP4
CLR
= #TEMP16
L #TEMP13
L L#20
==I
S #TEMP16
L #TEMP15
==I
A #TEMP16
JC M017
L #TEMP13
L L#20
<I
S #TEMP16
L #TEMP15
==I
A #TEMP16
JC M018
JU M019
M017: SET
= #TEMP14
JU M016
M018: CLR
= #TEMP14
JU M016
M019: CLR
O #TEMP14
= #RET_VAL
JU M015
M016: CLR
O #TEMP14
= #RET_VAL
рдХреЛрдб рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ рдФрд░ рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдЖрд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ; рдПрд╕рдЯреАрдПрд▓ рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдХреНрд╖рдорддрд╛рдПрдВ рд╕рдВрдмрдВрдзрд┐рдд рдореИрдиреБрдЕрд▓ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ:
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рдХреЛрдб]
# ╨Ш╨╜╨╕╤Ж╨╕╨░╨╗╨╕╨╖╨░╤Ж╨╕╤П ╤А╨░╨╖╨╗╨╕╤З╨╜╤Л╤Е ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╤Е
L B#16#0
T #CHECK_N # ╨б╤З╨╡╤В╤З╨╕╨║ ╤Г╤Б╨┐╨╡╤И╨╜╨╛ ╨┐╤А╨╛╨╣╨┤╨╡╨╜╨╜╤Л╤Е ╨┐╤А╨╛╨▓╨╡╤А╨╛╨║
T #COUNTER_N # ╨б╤З╨╡╤В╤З╨╕╨║ ╨╛╨▒╤Й╨╡╨│╨╛ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨░ ╨┐╤А╨╛╨▓╨╡╤А╨╛╨║
L P#DBX 0.0
T #POINTER # ╨г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤В╨╡╨║╤Г╤Й╤Г╤О ╨╕╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╤О
CLR
= #PRE_RET_VAL
# ╨Ю╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨╕╨║╨╗ ╤А╨░╨▒╨╛╤В╤Л ╨╕╨╜╤В╨╡╤А╨┐╤А╨╡╤В╨░╤В╨╛╤А╨░ ╨▒╨░╨╣╤В-╨║╨╛╨┤╨░
LOOP: L #POINTER
LAR1
OPN DB 100
L DBLG
TAR1
<=D # ╨Я╤А╨╛╨▓╨╡╤А╨║╨░ ╨▓╤Л╤Е╨╛╨┤╨░ ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤П ╨╖╨░ ╨┐╤А╨╡╨┤╨╡╨╗╤Л ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л
JC FINISH
L DW#16#0
T #REG0
L #TEMP6
L W#16#0
<>I
JC M00d
L P#DBX 0.0
LAR1
# ╨Ъ╨╛╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╤П switch - case ╨┤╨╗╤П ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ ╤А╨░╨╖╨╗╨╕╤З╨╜╤Л╤Е ╨╛╨┐╨║╨╛╨┤╨╛╨▓
M00d: L B [AR1,P#0.0]
T #OPCODE
L W#16#1
==I
JC OPCODE_1
L #OPCODE
L W#16#2
==I
JC OPCODE_2
L #OPCODE
L W#16#3
==I
JC OPCODE_3
L #OPCODE
L W#16#4
==I
JC OPCODE_4
L #OPCODE
L W#16#5
==I
JC OPCODE_5
L #OPCODE
L W#16#6
==I
JC OPCODE_6
JU OPCODE_OTHER
# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 01: ╨╖╨░╨│╤А╤Г╨╖╨║╨░ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨╕╨╖ DB101[X] ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А Y
# OP01(X, Y): REG[Y] = DB101[X]
OPCODE_1: +AR1 P#1.0
L P#DBX 0.0
LAR2
L B [AR1,P#0.0] # ╨Ч╨░╨│╤А╤Г╨╖╨║╨░ ╨░╤А╨│╤Г╨╝╨╡╨╜╤В╨░ X (╨╕╨╜╨┤╨╡╨║╤Б ╨▓ DB101)
L C#8
*I
+AR2
+AR1 P#1.0
L B [AR1,P#0.0] # ╨Ч╨░╨│╤А╤Г╨╖╨║╨░ ╨░╤А╨│╤Г╨╝╨╡╨╜╤В╨░ Y (╨╕╨╜╨┤╨╡╨║╤Б ╤А╨╡╨│╨╕╤Б╤В╤А╨░)
JL M003 # ╨Р╨╜╨░╨╗╨╛╨│ switch - case ╨╜╨░ ╨╛╤Б╨╜╨╛╨▓╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П Y
JU M001 # ╨┤╨╗╤П ╨▓╤Л╨▒╨╛╤А╨░ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛╨│╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕.
JU M002 # ╨Я╨╛╨┤╨╛╨▒╨╜╤Л╨╡ ╨║╨╛╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╨╕ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╤О╤В╤Б╤П ╨╕ ╨▓ ╨┤╤А╤Г╨│╨╕╤Е
JU M004 # ╨╛╨┐╨╡╤А╨░╤Ж╨╕╤П╤Е ╨╜╨╕╨╢╨╡ ╨┤╨╗╤П ╨░╨╜╨░╨╗╨╛╨│╨╕╤З╨╜╤Л╤Е ╤Ж╨╡╨╗╨╡╨╣
M003: JU LOOPEND
M001: OPN DB 101
L B [AR2,P#0.0]
T #REG0 # ╨Ч╨░╨┐╨╕╤Б╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П DB101[X] ╨▓ REG[0]
JU PRE_LOOPEND
M002: OPN DB 101
L B [AR2,P#0.0]
T #REG1 # ╨Ч╨░╨┐╨╕╤Б╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П DB101[X] ╨▓ REG[1]
JU PRE_LOOPEND
M004: OPN DB 101
L B [AR2,P#0.0]
T #REG2 # ╨Ч╨░╨┐╨╕╤Б╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П DB101[X] ╨▓ REG[2]
JU PRE_LOOPEND
# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 02: ╨╖╨░╨│╤А╤Г╨╖╨║╨░ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П X ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А Y
# OP02(X, Y): REG[Y] = X
OPCODE_2: +AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP3
+AR1 P#1.0
L B [AR1,P#0.0]
JL M009
JU M00b
JU M00a
JU M00c
M009: JU LOOPEND
M00b: L #TEMP3
T #REG0
JU PRE_LOOPEND
M00a: L #TEMP3
T #REG1
JU PRE_LOOPEND
M00c: L #TEMP3
T #REG2
JU PRE_LOOPEND
# ╨Ю╨┐╨║╨╛╨┤ 03 ╨╜╨╡ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╨▓ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╡, ╨┐╨╛╤Н╤В╨╛╨╝╤Г ╨┐╤А╨╛╨┐╤Г╤Б╤В╨╕╨╝ ╨╡╨│╨╛
...
# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 04: ╤Б╤А╨░╨▓╨╜╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ X ╨╕ Y
# OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
OPCODE_4: +AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7 # ╨┐╨╡╤А╨▓╤Л╨╣ ╨░╤А╨│╤Г╨╝╨╡╨╜╤В - X
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9 # REG[X]
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP8
L P#M 100.0
LAR2
L #TEMP8
L C#8
*I
+AR2
TAR2 #TEMP10 # REG[Y]
TAR1 #POINTER
LAR1 #TEMP9 # REG[X]
LAR2 #TEMP10 # REG[Y]
L B [AR1,P#0.0]
L B [AR2,P#0.0]
AW
INVI
T #TEMP12 # ~(REG[Y] & REG[X])
L B [AR1,P#0.0]
L B [AR2,P#0.0]
OW
L #TEMP12
AW # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - ╨░╨╜╨░╨╗╨╛╨│ ╨┐╤А╨╛╨▓╨╡╤А╨║╨╕ ╨╜╨░ ╤А╨░╨▓╨╡╨╜╤Б╤В╨▓╨╛
T B [AR1,P#0.0]
L DW#16#0
T #REG0
L MB 101
T #REG1
L MB 102
T #REG2
L #POINTER
LAR1
JU PRE_LOOPEND
# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 05: ╨▓╤Л╤З╨╕╤В╨░╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ Y ╨╕╨╖ X
# OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
OPCODE_5: +AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9 # REG[X]
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP8
L P#M 100.0
LAR2
L #TEMP8
L C#8
*I
+AR2
TAR2 #TEMP10 # REG[Y]
TAR1 #POINTER
LAR1 #TEMP9
LAR2 #TEMP10
L B [AR1,P#0.0]
L B [AR2,P#0.0]
-I # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
T B [AR1,P#0.0]
L DW#16#0
T #REG0
L MB 101
T #REG1
L MB 102
T #REG2
L #POINTER
LAR1
JU PRE_LOOPEND
# ╨Ю╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ ╨╛╨┐╨║╨╛╨┤╨░ 06: ╨╕╨╜╨║╤А╨╡╨╝╨╡╨╜╤В #CHECK_N ╨┐╤А╨╕ ╤А╨░╨▓╨╡╨╜╤Б╤В╨▓╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ X ╨╕ Y
# OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
OPCODE_6: L #COUNTER_N
INC 1
T #COUNTER_N
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP7 # REG[X]
L P#M 100.0
LAR2
L #TEMP7
L C#8
*I
+AR2
TAR2 #TEMP9 # REG[X]
+AR1 P#1.0
L B [AR1,P#0.0]
T #TEMP8
L P#M 100.0
LAR2
L #TEMP8
L C#8
*I
+AR2
TAR2 #TEMP10 # REG[Y]
TAR1 #POINTER
LAR1 #TEMP9 # REG[Y]
LAR2 #TEMP10 # REG[X]
L B [AR1,P#0.0]
L B [AR2,P#0.0]
==I
JCN M013
JU M014
M013: L P#DBX 0.0
LAR1
T #POINTER
L B#16#0
T #TEMP6
JU PRE_LOOPEND
M014: L #POINTER
LAR1
# ╨Ш╨╜╨║╤А╨╡╨╝╨╡╨╜╤В ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П #CHECK_N
L #CHECK_N
L L#1
+I
T #CHECK_N
JU PRE_LOOPEND
PRE_LOOPEND: L #REG0
T MB 100
L #REG1
T MB 101
L #REG2
T MB 102
+AR1 P#1.0
L #TEMP6
+ 1
T #TEMP6
JU LOOPEND
OPCODE_OTHER: L P#DBX 0.0
LAR1
L 0
T #TEMP6
TAR1 #POINTER
LOOPEND: TAR1 #POINTER
CLR
= #TEMP16
L #CHECK_N
L L#20
==I
S #TEMP16
L #COUNTER_N
==I
A #TEMP16
# ╨Т╤Б╨╡ ╨┐╤А╨╛╨▓╨╡╤А╨║╨╕ ╨┐╤А╨╛╨╣╨┤╨╡╨╜╤Л, ╨╡╤Б╨╗╨╕ #CHECK_N == #COUNTER_N == 20
JC GOOD
L #CHECK_N
L L#20
<I
S #TEMP16
L #COUNTER_N
==I
A #TEMP16
JC FAIL
JU M019
GOOD: SET
= #PRE_RET_VAL
JU FINISH
FAIL: CLR
= #PRE_RET_VAL
JU FINISH
M019: CLR
O #PRE_RET_VAL
= #RET_VAL
JU LOOP
FINISH: CLR
O #PRE_RET_VAL
= #RET_VAL
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП DB100 рдмреНрд▓реЙрдХ рдореЗрдВ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдбрд┐рд╕реНрд╕реЗрдмрд▓рд░ рд▓рд┐рдЦреЗрдВ:
import string
alph = string.ascii_letters + string.digits
with open('DB100.bin', 'rb') as f:
m = f.read()
pc = 0
while pc < len(m):
op = m[pc]
if op == 1:
print('R{} = DB101[{}]'.format(m[pc + 2], m[pc + 1]))
pc += 3
elif op == 2:
c = chr(m[pc + 1])
c = c if c in alph else '?'
print('R{} = {:02x} ({})'.format(m[pc + 2], m[pc + 1], c))
pc += 3
elif op == 4:
print('R0 = 0; R{} = (R{} == R{})'.format(
m[pc + 1], m[pc + 1], m[pc + 2]))
pc += 3
elif op == 5:
print('R0 = 0; R{} = R{} - R{}'.format(
m[pc + 1], m[pc + 1], m[pc + 2]))
pc += 3
elif op == 6:
print('CHECK (R{} == R{})n'.format(
m[pc + 1], m[pc + 2]))
pc += 3
else:
print('unk opcode {}'.format(op))
break
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ:
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛрдб
R1 = DB101[0]
R2 = 6e (n)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[1]
R2 = 10 (?)
R0 = 0; R1 = R1 - R2
R2 = 20 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[2]
R2 = 77 (w)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[3]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[4]
R2 = 75 (u)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[5]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[6]
R2 = 34 (4)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[7]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[8]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[9]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[10]
R2 = 37 (7)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[11]
R2 = 22 (?)
R0 = 0; R1 = R1 - R2
R2 = 46 (F)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[12]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[13]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[14]
R2 = 6d (m)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[15]
R2 = 11 (?)
R0 = 0; R1 = R1 - R2
R2 = 23 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[16]
R2 = 35 (5)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[17]
R2 = 12 (?)
R0 = 0; R1 = R1 - R2
R2 = 25 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
R1 = DB101[18]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)
R1 = DB101[19]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП DB101 рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдЪреЗрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╣реИ: n0w u 4r3 7h3 m4573rред рдпрджрд┐ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдмреНрд▓реЙрдХ DB101 рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рдкреАрдПрд▓рд╕реА рдирд┐рдпрдВрддреНрд░рдг рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧреБрдмреНрдмрд╛рд░реЗ рдХреЛ рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд░рдирд╛ рдпрд╛ рдкрд┐рдЪрдХрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛редтАи
рдмрд╕ рдЗрддрдирд╛ рд╣реА! рдПрд▓реЗрдХреНрд╕реА рдиреЗ рдПрдХ рдФрджреНрдпреЛрдЧрд┐рдХ рдирд┐рдВрдЬрд╛ рдХреЗ рдпреЛрдЧреНрдп рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ :) рд╣рдордиреЗ рд╡рд┐рдЬреЗрддрд╛ рдХреЛ рдпрд╛рджрдЧрд╛рд░ рдкреБрд░рд╕реНрдХрд╛рд░ рднреЗрдЬреЗред рд╕рднреА рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рд╕реНрд░реЛрдд: www.habr.com