рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрдкрд░ рдорд╛рд░рд┐рдпреЛ рдмреНрд░реЛрд╕ рд╕реЗ рд╕реНрддрд░реЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдкрд░рд┐рдЪрдп


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

рдмреЗрд╢рдХ, рдореИрдВ рдмрд╕ рдЦреЗрд▓ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЧреЛрдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ, рдорд╢реАрди рд╡рд┐рдЬрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдЖрдкрдХреЛ рдЙрди рд╕реНрддрд░ рддрддреНрд╡реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо 6502 рдХреЛрдбрд╛рдВрддрд░рдХ рднрд╛рд╖рд╛ рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд┐рдд рдПрдХ рдПрдореБрд▓реЗрдЯрд░ рд╕реАрдЦреЗрдВрдЧреЗред рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг


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

рдлрд╝рд╛рдЗрд▓ рдкрд░ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЙрд╕ рд╕реНрддрд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:

;level 1-1
L_GroundArea6:
.db $50, $21
.db $07, $81, $47, $24, $57, $00, $63, $01, $77, $01
.db $c9, $71, $68, $f2, $e7, $73, $97, $fb, $06, $83
.db $5c, $01, $d7, $22, $e7, $00, $03, $a7, $6c, $02
.db $b3, $22, $e3, $01, $e7, $07, $47, $a0, $57, $06
.db $a7, $01, $d3, $00, $d7, $01, $07, $81, $67, $20
.db $93, $22, $03, $a3, $1c, $61, $17, $21, $6f, $33
.db $c7, $63, $d8, $62, $e9, $61, $fa, $60, $4f, $b3
.db $87, $63, $9c, $01, $b7, $63, $c8, $62, $d9, $61
.db $ea, $60, $39, $f1, $87, $21, $a7, $01, $b7, $20
.db $39, $f1, $5f, $38, $6d, $c1, $af, $26
.db $fd


рдпрджрд┐ рдЖрдк рдЕрд╕реЗрдВрдмрд▓рд░ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБ: рдпрд╣ рд╕рдм рдмрд╕ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╕рдВрдХрд▓рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреЛ L_GroundArea6 рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ"ред рдЖрдк рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдПрдХ рдмрд╛рдЗрдЯ рд╣реИред

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


AreaParserCore рд▓рд┐рдП AreaParserCore рдХреЙрд▓ рдЧреНрд░рд╛рдлрд╝

рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ MetatileBuffer рдХреЛ MetatileBuffer : рдПрдХ 13-рдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА рдЕрдиреБрднрд╛рдЧ, рдЬреЛ рдПрдХ рд╕реНрддрд░ рдореЗрдВ рдмреНрд▓реЙрдХ рдХрд╛ рдПрдХ рдХреЙрд▓рдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдПрдХ рдЕрд▓рдЧ рдмреНрд▓реЙрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдореЗрдЯрд╛рд╕реНрдЯрд╛рдЗрд▓ рдПрдХ 16x16 рдмреНрд▓реЙрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ SMB рдЧреЗрдо рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ:


рдЖрдпрддреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрддрд░ рдореЗрдЯрд╛рдЯрд╛рдЗрд▓реНрд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИ

рдЙрдиреНрд╣реЗрдВ рдореЗрдЯрд╛-рдлрд╛рдЗрд▓реЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЪрд╛рд░ 8x8-рдкрд┐рдХреНрд╕реЗрд▓ рдЯрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдиреАрдЪреЗ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред

рдпрд╣ рддрдереНрдп рдХрд┐ рдбрд┐рдХреЛрдбрд░ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕реНрддрд░ рдХреЗ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ: рд╕реНрддрд░ рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдмрд┐рдВрджреБ рдкрд░ рдкрд╛рдЗрдк (20, 16), рдмрд┐рдВрджреБ рдкрд░ рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ (10, 5), ... "ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдЪреНрдЪреЗ рд╕реНрддрд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдореЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рдЧрддреЗ рд╣реИрдВред

рдЕрдкрдиреЗ рд╕реНрддрд░ рдХреЗ рдЕрдирдкреИрдХрд░ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдЗрд╕ рд░рд╛рд╢рд┐ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

py65emu


рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рдпрдерди рдФрд░ 6502 рдЕрд╕реЗрдВрдмрд▓рд░ рднрд╛рд╖рд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдерд╛, рддреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП AreaParserCore рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдмреНрд▓реЙрдХ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдЫрд╡рд┐ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддрдм py65emu рджреГрд╢реНрдп рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ - рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд 6502 рдПрдореБрд▓реЗрдЯрд░ред рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ NES рдХреЗ рдЕрдиреБрд╕рд╛рд░ py65emu рдореЗрдВ рд╕рдорд╛рди рдореЗрдореЛрд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  from py65emu.cpu import CPU from py65emu.mmu import MMU #  ROM  (..  ) with open("program.bin", "rb") as f: prg_rom = f.read() #   . mmu = MMU([ #  2K ,    0x0. (0x0, 2048, False, []), #  ROM   0x8000. (0x8000, len(prg_rom), True, list(prg_rom)) ]) #     ,       0x8000 cpu = CPU(mmu, 0x8000) 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо cpu.step() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, cpu.step() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░ cpu.ra , cpu.r.pc , cpu.r.pc , рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╢реАрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ cpu.ra ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо mmu.write() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╕реАрдкреАрдпреВ рдХреЛ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдкрд╛рд░реНрдЯрд┐рд╢рди рдХреЛ AreaParserCore рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЗрдирдкреБрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд░реЗрдВ, AreaParserCore рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдХреЙрд▓рдо рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдкрдврд╝реЗрдВред рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рддреИрдпрд╛рд░ рдЫрд╡рд┐ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

x816


рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдбрд╛рдВрддрд░рдХ x816 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред x816 рдПрдХ MS-DOS рдЕрд╕реЗрдВрдмрд▓рд░ 6502 рд╣реИ рдЬреЛ NES рдФрд░ ROM рд╣реИрдХрд░реНрд╕ рдХреЗ рд▓рд┐рдП homebrew рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбреЙрд╕рдмреЙрдХреНрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд░реЛрдо рдХреЗ рд╕рд╛рде, рдЬреЛ py65emu рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, x816 рдХреЛрдбрд╛рдВрддрд░рдХ рдПрдХ рдЪрд░рд┐рддреНрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдкреАрдпреВ рдХреЗ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

AREAPARSERCORE = $0093FC ; <> 37884, statement #3154
AREAPARSERTASKCONTROL = $0086E6 ; <> 34534, statement #1570
AREAPARSERTASKHANDLER = $0092B0 ; <> 37552, statement #3035
AREAPARSERTASKNUM = $00071F ; <> 1823, statement #141
AREAPARSERTASKS = $0092C8 ; <> 37576, statement #3048


рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ AreaParserCore рдлрд╝рдВрдХреНрд╢рди рдХреЛ 0x93fc рдкрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рддреАрдХ рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрд╛ рдЬреЛ рдкреНрд░рддреАрдХ рдирд╛рдореЛрдВ рдФрд░ рдкрддреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:

 sym_file = SymbolFile('SMBDIS.SYM') print("0x{:x}".format(sym_file['AREAPARSERCORE'])) #  0x93fc print(sym_file.lookup_address(0x93fc)) #  "AREAPARSERCORE" 

рд╕рдмрд░реВрдЯреАрди


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХреА рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдпрдерди рд╕реЗ AreaParserCore рдХреЛ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ AreaParserCore ред

рдПрдХ рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдЫреЛрдЯреА рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЙрд╕рдХреА рд╕рдВрдмрдВрдзрд┐рдд рдЪреБрдиреМрддреА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 WritePPUReg1: sta PPU_CTRL_REG1 ;  A   1 PPU sta Mirror_PPU_CTRL_REG1 ;    rts ... jsr WritePPUReg1 

jsr (рд╕рдмрд░реВрдЯреАрди рдкрд░ рдЬрд╛рдПрдВ, "рд╕рдмрд░реВрдЯреАрди рдкрд░ рдЬрд╛рдПрдВ") рдирд┐рд░реНрджреЗрд╢ рдкреАрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ jsr рдФрд░ рдЗрд╕реЗ рдкрддрд╛ рдорд╛рди WritePPUReg1 рдЬрд┐рд╕реЗ WritePPUReg1 рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ WritePPUReg1 ред рдкреАрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛ рдмрддрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ jsr рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрдЧрд▓рд╛ рдирд┐рд░реНрджреЗрд╢ jsr рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╣реЛред

рд╕рдмрд░реВрдЯреАрди рдХреЗ рдЕрдВрдд рдореЗрдВ, rts рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдмрд░реВрдЯреАрди рд╕реЗ рд╡рд╛рдкрд╕реА, "рд╕рдмрд░реВрдЯреАрди рд╕реЗ рд╡рд╛рдкрд╕реА")ред рдпрд╣ рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреАрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реАрдкреАрдпреВ рдХреЛ jsr рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

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

рдпрд╣рд╛рдБ рдкрд╛рдпрдерди рд╕реЗ рд╕рдмрд░реВрдЯрд┐рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдб рд╣реИ:

 def execute_subroutine(cpu, addr): s_before = cpu.rs cpu.JSR(addr) while cpu.rs != s_before: cpu.step() execute_subroutine(cpu, sym_file['AREAPARSERCORE']) 

рдХреЛрдб рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рд░рдЬрд┐рд╕реНрдЯрд░ ( s ) рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдПрдХ jsr рдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рддрдм рдирд┐рд░реНрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдЯреИрдХ рдЕрдкрдиреА рдореВрд▓ рдКрдВрдЪрд╛рдИ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рдмрд╛рдж рд╣реА рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рдпрдерди рд╕реЗ 6502 рд╕рдмрд░реВрдЯреАрдиреНрд╕ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдХреБрдЫ рднреВрд▓ рдЧрдП: рдЗрд╕ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдорд╛рди рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ? рд╣рдореЗрдВ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рд░реЗрдВрдбрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдХрд┐рд╕ рдХреЙрд▓рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реИред

рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛ 6502 рдХреЗ рдЙрдк-рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЗрдирдкреБрдЯ рдХреЛ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрдореЛрд░реА рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм рдЙрдкрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред AreaParserCore рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЖрд╡рд╢реНрдпрдХ рдЗрдирдкреБрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛрдЧрд╛ред

рдПрдирдИрдПрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп?


AreaParserCore рдХреЗ рдЗрдирдкреБрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ Valgrind рдХреЗ рд▓рд┐рдП рдореЗрдордЪреЗрдХ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореЗрдордЪреЗрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЫрд╛рдпрд╛ рд╕реНрдореГрддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред рдЫрд╛рдпрд╛ рд╕реНрдореГрддрд┐ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреА рд╣реИ рдХрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрд╕ рдкрддреЗ рдкрд░ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЙрд╕рдиреЗ рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрд╕рдВрдХреНрд░рдорд┐рдд рдореЗрдореЛрд░реА рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рд╣рдо рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде AreaParserCore рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЗрдирдкреБрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, py65emu рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдореЗрдордЪреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

 def format_addr(addr): try: symbol_name = sym_file.lookup_address(addr) s = "0x{:04x} ({}):".format(addr, symbol_name) except KeyError: s = "0x{:04x}:".format(addr) return s class MemCheckMMU(MMU): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._uninitialized = array.array('B', [1] * 2048) def read(self, addr): val = super().read(addr) if addr < 2048: if self._uninitialized[addr]: print("Uninitialized read! {}".format(format_addr(addr))) return val def write(self, addr, val): super().write(addr, val) if addr < 2048: self._uninitialized[addr] = 0 

рдпрд╣рд╛рдВ рд╣рдордиреЗ py65emu рдХреА рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдпреВрдирд┐рдЯ (MMU) рдХреЛ рд▓рдкреЗрдЯрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ _uninitialized рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рддрддреНрд╡ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрднреА рднреА рд╕рдВрдмрдВрдзрд┐рдд RAM рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрд╛рдЗрдЯ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЧреИрд░-рдкрдврд╝реЗ рдЬрд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдорд╛рдиреНрдп рд░реАрдб рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрддрд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдг рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

execute_subroutine(sym_file['AREAPARSERCORE']) :

Uninitialized read! 0x0728 (BACKLOADINGFLAG):
Uninitialized read! 0x0742 (BACKGROUNDSCENERY):
Uninitialized read! 0x0741 (FOREGROUNDSCENERY):
Uninitialized read! 0x074e (AREATYPE):
Uninitialized read! 0x075f (WORLDNUMBER):
Uninitialized read! 0x0743 (CLOUDTYPEOVERRIDE):
Uninitialized read! 0x0727 (TERRAINCONTROL):
Uninitialized read! 0x0743 (CLOUDTYPEOVERRIDE):
Uninitialized read! 0x074e (AREATYPE):
...


рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдорд╛рди InitializeArea рд╕рдмрдкреНрд░реЛрдбреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рд╣рдо рдХреЙрд▓ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдХреНрд╖реЗрддреНрд░ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

 mmu.write(sym_file['WORLDNUMBER'], 0) #    1 mmu.write(sym_file['AREANUMBER'], 0) #    1 execute_subroutine(sym_file['LOADAREAPOINTER']) execute_subroutine(sym_file['INITIALIZEAREA']) metatile_data = [] for column_pos in range(48): execute_subroutine(sym_file['AREAPARSERCORE']) metatile_data.append([mmu.read_no_debug(sym_file['METATILEBUFFER'] + i) for i in range(13)]) execute_subroutine(sym_file['INCREMENTCOLUMNPOS']) 

рдХреЛрдб рджреБрдирд┐рдпрд╛ рдХрд╛ рдкрд╣рд▓рд╛ 48 рдХреЙрд▓рдо 1-1 рд╕реНрддрд░ рдХреЛ metatile_data рдХреЛ metatile_data , рд╡рд░реНрддрдорд╛рди рдХреЙрд▓рдо рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП IncrementColumnPos metatile_data рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдпрд╣рд╛рдВ рдЦреЗрд▓ рд╕реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░ metatile_data рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ (0 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯреНрд╕ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ):


рдЬрд╛рд╣рд┐рд░ рд╣реИ, metatile_data рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рдореЗрдЯрд╛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕


(рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддреБрд░рдВрдд "рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ" рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред)

рдЕрдм рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдореЗрдЯрд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реИред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдЪрд░рдгреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рдФрд░ рдЕрджреНрднреБрдд рдиреЗрд╕рджреЗрд╡ рд╡рд┐рдХреА рдХреЗ рд╕рд╛рде рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдЯреИрд▓рд┐рдХ рдХреЛ рдХреИрд╕реЗ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ NES рдХрд▓рд░ рдкреИрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреА рд╣реЛрдЧреАред NES рдХрдВрд╕реЛрд▓ PPU рдЖрдо рддреМрд░ рдкрд░ 64 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд▓реЗ рдХреЛ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП Nesdev рджреЗрдЦреЗрдВ ):


рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд░рд┐рдпреЛ рд╕реНрддрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рдЗрди 64 рд░рдВрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 10 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, 4 рдЪрд╛рд░-рд░рдВрдЧ рдкрдЯреНрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд; рдкрд╣рд▓рд╛ рд░рдВрдЧ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ 1-1 рд╡рд┐рд╢реНрд╡ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдкреИрд▓реЗрдЯ рд╣реИрдВ:


рдЖрдЗрдП рдЕрдм рдореЗрдЯрд╛ рдлрд╛рдЗрд▓ рдирдВрдмрд░ рдХреЗ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣рд╛рдБ рдЦреБрд░рджрд╛рд░ рдкрддреНрдерд░ рдХреА рдЯрд╛рдЗрд▓ рдореЗрдЯреИрд▓рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд┐рд╢реНрд╡ 1-1 рд╕реНрддрд░ рдХреА рднреВрдорд┐ рд╣реИ:


рдкреИрд▓реЗрдЯ рдЗрдВрдбреЗрдХреНрд╕ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрдЯреИрд▓рд┐рдХ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреИрд▓реЗрдЯ 1) рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп рдХрд┐рд╕ рдкреИрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдкреИрд▓реЗрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рднреА рд╣реИ:

MetatileGraphics_Low:
.db <Palette0_MTiles, <Palette1_MTiles, <Palette2_MTiles, <Palette3_MTiles

MetatileGraphics_High:
.db >Palette0_MTiles, >Palette1_MTiles, >Palette2_MTiles, >Palette3_MTiles


рдЗрди рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рд╣рдореЗрдВ 16-рдмрд┐рдЯ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ Palette1_Mtiles рдУрд░ Palette1_Mtiles :

Palette1_MTiles:
.db $a2, $a2, $a3, $a3 ;vertical rope
.db $99, $24, $99, $24 ;horizontal rope
.db $24, $a2, $3e, $3f ;left pulley
.db $5b, $5c, $24, $a3 ;right pulley
.db $24, $24, $24, $24 ;blank used for balance rope
.db $9d, $47, $9e, $47 ;castle top
.db $47, $47, $27, $27 ;castle window left
.db $47, $47, $47, $47 ;castle brick wall
.db $27, $27, $47, $47 ;castle window right
.db $a9, $47, $aa, $47 ;castle top w/ brick
.db $9b, $27, $9c, $27 ;entrance top
.db $27, $27, $27, $27 ;entrance bottom
.db $52, $52, $52, $52 ;green ledge stump
.db $80, $a0, $81, $a1 ;fence
.db $be, $be, $bf, $bf ;tree trunk
.db $75, $ba, $76, $bb ;mushroom stump top
.db $ba, $ba, $bb, $bb ;mushroom stump bottom
.db $45, $47, $45, $47 ;breakable brick w/ line
.db $47, $47, $47, $47 ;breakable brick
.db $45, $47, $45, $47 ;breakable brick (not used)
.db $b4, $b6, $b5, $b7 ;cracked rock terrain <--- This is the 20th line
.db $45, $47, $45, $47 ;brick with line (power-up)
.db $45, $47, $45, $47 ;brick with line (vine)
.db $45, $47, $45, $47 ;brick with line (star)
.db $45, $47, $45, $47 ;brick with line (coins)
...


рдЬрдм рдЖрдк рдореЗрдЯрд╛рд╕реНрдЯрд╛рдЗрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ 4 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рдРрд░реЗ рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ 4 рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдЯрд┐рдЕрдиреЗрдЯ рдмреАрд╕рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ cracked rock terrain рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред

рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреА рдЪрд╛рд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрд▓ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рд╣реИрдВ: рдкреНрд░рддреНрдпреЗрдХ рдореЗрдЯрд╛рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рдЪрд╛рд░ 8x8-рдкрд┐рдХреНрд╕реЗрд▓ рдЯрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдирд┐рдореНрди рдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИрдВ - рдКрдкрд░реА рдмрд╛рдПрдБ, рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдБ, рдКрдкрд░реА рджрд╛рдПрдБ рдФрд░ рдирд┐рдЪрд▓реЗ рджрд╛рдПрдБред рдпреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реАрдзреЗ рдПрдирдИрдПрд╕ рдкреАрдкреАрдпреВ рдХрдВрд╕реЛрд▓ рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ CHR-ROM рдХрдВрд╕реЛрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб 0x1000 + 16 * < > рдкрддреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

0x1000 + 16 * 0xb4: 0b01111111 0x1000 + 16 * 0xb5: 0b11011110
0x1001 + 16 * 0xb4: 0b10000000 0x1001 + 16 * 0xb5: 0b01100001
0x1002 + 16 * 0xb4: 0b10000000 0x1002 + 16 * 0xb5: 0b01100001
0x1003 + 16 * 0xb4: 0b10000000 0x1003 + 16 * 0xb5: 0b01100001
0x1004 + 16 * 0xb4: 0b10000000 0x1004 + 16 * 0xb5: 0b01110001
0x1005 + 16 * 0xb4: 0b10000000 0x1005 + 16 * 0xb5: 0b01011110
0x1006 + 16 * 0xb4: 0b10000000 0x1006 + 16 * 0xb5: 0b01111111
0x1007 + 16 * 0xb4: 0b10000000 0x1007 + 16 * 0xb5: 0b01100001
0x1008 + 16 * 0xb4: 0b10000000 0x1008 + 16 * 0xb5: 0b01100001
0x1009 + 16 * 0xb4: 0b01111111 0x1009 + 16 * 0xb5: 0b11011111
0x100a + 16 * 0xb4: 0b01111111 0x100a + 16 * 0xb5: 0b11011111
0x100b + 16 * 0xb4: 0b01111111 0x100b + 16 * 0xb5: 0b11011111
0x100c + 16 * 0xb4: 0b01111111 0x100c + 16 * 0xb5: 0b11011111
0x100d + 16 * 0xb4: 0b01111111 0x100d + 16 * 0xb5: 0b11111111
0x100e + 16 * 0xb4: 0b01111111 0x100e + 16 * 0xb5: 0b11000001
0x100f + 16 * 0xb4: 0b01111111 0x100f + 16 * 0xb5: 0b11011111

0x1000 + 16 * 0xb6: 0b10000000 0x1000 + 16 * 0xb7: 0b01100001
0x1001 + 16 * 0xb6: 0b10000000 0x1001 + 16 * 0xb7: 0b01100001
0x1002 + 16 * 0xb6: 0b11000000 0x1002 + 16 * 0xb7: 0b11000001
0x1003 + 16 * 0xb6: 0b11110000 0x1003 + 16 * 0xb7: 0b11000001
0x1004 + 16 * 0xb6: 0b10111111 0x1004 + 16 * 0xb7: 0b10000001
0x1005 + 16 * 0xb6: 0b10001111 0x1005 + 16 * 0xb7: 0b10000001
0x1006 + 16 * 0xb6: 0b10000001 0x1006 + 16 * 0xb7: 0b10000011
0x1007 + 16 * 0xb6: 0b01111110 0x1007 + 16 * 0xb7: 0b11111110
0x1008 + 16 * 0xb6: 0b01111111 0x1008 + 16 * 0xb7: 0b11011111
0x1009 + 16 * 0xb6: 0b01111111 0x1009 + 16 * 0xb7: 0b11011111
0x100a + 16 * 0xb6: 0b11111111 0x100a + 16 * 0xb7: 0b10111111
0x100b + 16 * 0xb6: 0b00111111 0x100b + 16 * 0xb7: 0b10111111
0x100c + 16 * 0xb6: 0b01001111 0x100c + 16 * 0xb7: 0b01111111
0x100d + 16 * 0xb6: 0b01110001 0x100d + 16 * 0xb7: 0b01111111
0x100e + 16 * 0xb6: 0b01111111 0x100e + 16 * 0xb7: 0b01111111
0x100f + 16 * 0xb6: 0b11111111 0x100f + 16 * 0xb7: 0b01111111


CHR-ROM рдореЗрдореЛрд░реА рдХрд╛ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ PPU рд╣реА рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ PRG-ROM рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЧреЗрдо рдХреЗ рд░реЛрдо рдХреЗ рдбрдВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП 16 рдмрд╛рдЗрдЯреНрд╕ 2-рдмрд┐рдЯ 8x8 рдЯрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рдмрд┐рдЯ рдкрд╣рд▓реЗ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рджреВрд╕рд░рд╛ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ:

21111111 13211112
12222222 23122223
12222222 23122223
12222222 23122223
12222222 23132223
12222222 23233332
12222222 23111113
12222222 23122223

12222222 23122223
12222222 23122223
33222222 31222223
11332222 31222223
12113333 12222223
12221113 12222223
12222223 12222233
23333332 13333332


рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреИрд▓реЗрдЯ 1 рдореЗрдВ рдмрд╛рдБрдзреЗрдВ:


... рдФрд░ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ:


рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдЯрд╛рдЗрд▓ рдорд┐рд▓реАред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдкреНрд░рддреНрдпреЗрдХ рдореЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрддрд░ рдорд┐рд▓рддрд╛ рд╣реИред


рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд╕рдПрдордмреА рд╕реНрддрд░ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ!

Source: https://habr.com/ru/post/hi416241/


All Articles