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

рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрдирдИрдПрд╕ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░реНрд╡рд░ред



рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


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

рдЕрдм рдПрдирдИрдПрд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╢рдХреНрддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХреНрдпреЛрдВ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдкрд╛рдпрдерди рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЛрдХрдкреНрд░рд┐рдп рдПрдирдИрдПрд╕ рдПрдореБрд▓реЗрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рдЗрди рдпрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЬреНрдЮрд╛рдд Nintaco рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Fceux рдХрд░реНрдиреЗрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдлрд┐рд░ рдореИрдВрдиреЗ рдкрд╛рдпрдирд┐рдпрд░ рдХреЛ рдЦреБрдж рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

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

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдПрдореБрд▓реЗрдЯрд░ рдХреА рддрд░рдл


Fceux рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ Lua рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ LuaSocket ред рдпрд╣ рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ Xkeeper0 рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмреАрдЪ рдХрд╛рдо рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдорд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рджрд░рдЕрд╕рд▓, tcp рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИ:

function connect(address, port, laddress, lport) local sock, err = socket.tcp() if not sock then return nil, err end if laddress then local res, err = sock:bind(laddress, lport, -1) if not res then return nil, err end end local res, err = sock:connect(address, port) if not res then return nil, err end return sock end sock2, err2 = connect("127.0.0.1", 81) sock2:settimeout(0) --it's our socket object print("Connected", sock2, err2) 

рдпрд╣ рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕реЙрдХреЗрдЯ рд╣реИ рдЬреЛ 1 рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рднреЗрдЬрддрд╛ рд╣реИред

Fceux рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ, рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдореБрдЦреНрдп рд▓реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 function main() while true do --  passiveUpdate() --,        emu.frameadvance() --       end end 

рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ:

 function passiveUpdate() local message, err, part = sock2:receive("*all") if not message then message = part end if message and string.len(message)>0 then --print(message) local recCommand = json.decode(message) table.insert(commandsQueue, recCommand) coroutine.resume(parseCommandCoroutine) end end 

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

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

 gui.register(passiveUpdate) --undocumented. this function will call even if emulator paused 

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

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХрдорд╛рдВрдб


рдореИрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ JSON рдЖрдзрд╛рд░рд┐рдд RPC рдкрд╛рда рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╕рд░реНрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ JSON рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рддрдм рддрдХ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдПрдореБрд▓реЗрдЯрд░ рдХрдорд╛рдВрдб рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб " FUNCTIONNAME_finished " рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред

рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ SyncCall рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 class syncCall: @classmethod def waitUntil(cls, messageName): """cycle for reading data from socket until needed message was read from it. All other messages will added in message queue""" while True: cmd = messages.parseMessages(asyncCall.waitAnswer(), [messageName]) #print(cmd) if cmd != None: if len(cmd)>1: return cmd[1] return @classmethod def call(cls, *params): """wrapper for sending [functionName, [param1, param2, ...]] to socket and wait until client return [functionName_finished, [result1,...]] answer""" sender.send(*params) funcName = params[0] return syncCall.waitUntil(funcName + "_finished") 

рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде, рдкрд╛рдпрд╕ рдПрдореБрд▓реЗрдЯрд░ рд▓реБрдЖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд╛рдпрдерди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 class emu: @classmethod def poweron(cls): return syncCall.call("emu.poweron") @classmethod def pause(cls): return syncCall.call("emu.pause") @classmethod def unpause(cls): return syncCall.call("emu.unpause") @classmethod def message(cls, str): return syncCall.call("emu.message", str) @classmethod def softreset(cls): return syncCall.call("emu.softreset") @classmethod def speedmode(cls, str): return syncCall.call("emu.speedmode", str) 

рдФрд░ рдлрд┐рд░ рд▓реБрдЖ рд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╡рд░реНрдмреЗрдЯрд┐рдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 # : emu.poweron() 

рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ


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

 class callbacks: functions = {} callbackList = [ "emu.registerbefore_callback", "emu.registerafter_callback", "memory.registerexecute_callback", "memory.registerwrite_callback", ] @classmethod def registerfunction(cls, func): if func == None: return 0 hfunc = hash(func) callbacks.functions[hfunc] = func return hfunc @classmethod def error(cls, e): emu.message("Python error: " + str(e)) @classmethod def checkAllCallbacks(cls, cmd): #print("check:", cmd) for callbackName in callbacks.callbackList: if cmd[0] == callbackName: hfunc = cmd[1] #print("hfunc:", hfunc) func = callbacks.functions.get(hfunc) #print("func:", func) if func: try: func(*cmd[2:]) #skip function name and function hash and save others arguments except Exception as e: callbacks.error(e) pass #TODO: thread locking sender.send(callbackName + "_finished") 

рд▓реБрдЖ-рдХреЛрдб рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рднреА рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реБрдЖ-рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рдпрдерди-рдХреЛрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЕрдЧрд▓рд╛, рдкрд╛рдпрдерди рдХреЛрдб рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рдВрддрд┐рдд рд╣реИ рдХрд┐ рд▓реБрдЖ рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХрдорд╛рдВрдб рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 def callbacksThread(): cycle = 0 while True: cycle += 1 try: cmd = messages.parseMessages(asyncCall.waitAnswer(), callbacks.callbackList) if cmd: #print("Callback received:", cmd) callbacks.checkAllCallbacks(cmd) pass except socket.timeout: pass time.sleep(0.001) 

рдЕрдВрддрд┐рдо рдЪрд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдХреЙрд▓рдмреИрдХ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП " CALLBACKNAME_finished " рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Lua рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ


  • рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ Python 3 рдФрд░ Jupyter рдиреЛрдЯрдмреБрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЛ рдЬреБрдкрд┐рдЯрд░ рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛

     jupyter notebook 

  • FceuxPythonServer.py.ipynb рд▓реИрдкрдЯреЙрдк рдЦреЛрд▓реЗрдВ рдФрд░ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЪрд▓рд╛рдПрдБ

  • рдЕрдм рдЖрдкрдХреЛ рдлрд╝реЗрд╕рдХреНрд╕ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЗрд╕рдореЗрдВ рд░реЛрдо рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ (рдореИрдВ рдЧреЗрдо рдХрд┐рд▓реНрд╡реЗрдирд┐рдпрд╛ (рдпреВ) (PRG0) [!] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ ред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ ред ) рдФрд░ рд▓реБрдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ fceux -listener.lua рдирд╛рдо рд╕реЗ рдЪрд▓рд╛рдПрдВ ред рдпрд╣ рдЬреБрдкрд┐рдЯрд░ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

    рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ:

     fceux.exe -lua fceux_listener.lua "Castlevania (U) (PRG0) [!].nes" 

  • рдЕрдм рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЖрдкрдХреЛ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд╕рдлрд▓ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:



рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдЖрдк рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬреБрдкрд╛рдЗрдЯрд░ рд▓реИрдкрдЯреЙрдк рд╕реЗ тАЛтАЛFceux emulator рдкрд░ рдХрдорд╛рдВрдб рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг:
https://github.com/spiiin/fceux_luaserver/blob/master/FceuxPythonServer.py.ipynb

рдЗрд╕рдореЗрдВ рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдЬреИрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:



рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЙрд▓рдмреИрдХ рдЙрджрд╛рд╣рд░рдг:



рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреЗрдо рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдЖрдкрдХреЛ рд╕реБрдкрд░ рдорд╛рд░рд┐рдпреЛ рдмреНрд░рджрд░реНрд╕ рд╕реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ ред рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде:



рд▓реИрдкрдЯреЙрдк рд░рди рд╡реАрдбрд┐рдпреЛ:


рд╕реАрдорд╛рдПрдВ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореВрд░реНрдЦ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ - рдПрдХ рдкрд╛рда рдПрдХ рдФрд░ рд╕рдореВрд╣ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдмрд╛рдЗрдирд░реА рдЖрд░рдкреАрд╕реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкрдЯрдХрдерд╛ рд▓реБрдЖ рд╕реЗ рдкрд╛рдпрдерди рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 500-1000 рдмрд╛рд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреА рд╣реИред рд╡реАрдбрд┐рдпреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓-рдмрд╛рдп-рдкрд┐рдХреНрд╕реЗрд▓ рдпрд╛ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди Fceux рдЕрднреА рднреА Lua рд╕реЗ рдРрд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдЪрд╛рд░:

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

рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдвреЗрд░


рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

Fceux - www.fceux.com/web/home.html
рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдирдИрдПрд╕ рдПрдореБрд▓реЗрдЯрд░ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдИ рд░реЛрдорд╣реИрдХрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдореБрд▓реЗрдЯрд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рд▓реБрдХрд╛ рд╕реЙрдХреЗрдЯ рд╕рдорд░реНрдерди рдЗрд╕рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

Json.lua - github.com/spiiin/json.lua
рдпрд╣ рд╢реБрджреНрдз Lua рдореЗрдВ JSON рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рд╕рдВрдХрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХрд╛рдВрдЯрд╛ рдЬрд╛рдирд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ Fceux рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдФрд░ рдХреНрд░рдордмрджреНрдзрддрд╛ рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ (рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЕрд╕реНрд╡реАрдХреГрдд рдкреВрд▓ рдЕрдиреБрд░реЛрдз )ред

рдкрд╛рдпрдерди 3 - www.python.org
Fceux Lua рд╕рд░реНрд╡рд░ tcp рд╕реЙрдХреЗрдЯ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИред рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ "рдмреИрдЯрд░реА рд╢рд╛рдорд┐рд▓" рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХреЛ рдЪреБрдирд╛ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЙрдбреНрдпреВрд▓ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рд╕реЙрдХреЗрдЯ рдФрд░ рдЬреЗрдПрд╕рдПрди рдХреЗ рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкрд╛рдпрдерди рднреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдирдИрдПрд╕ рдЧреЗрдо рдореЗрдВ рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рдбреЗрдХреНрд╕рдкреЙрдЯ - www.dexpot.de
рдореИрдВрдиреЗ рдЗрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдбреЗрд╕реНрдХрдЯреЙрдк рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░реЛрдВ рдХреЗ рдКрдкрд░ рдПрдореБрд▓реЗрдЯрд░ рд╡рд┐рдВрдбреЛ рдХреЛ рдбреЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИред рдПрдореБрд▓реЗрдЯрд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рддреНрд╡рд░рд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЗрдВ рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдорд╛рдирдХ рд╡рд┐рдВрдбреЛрдЬ рдЯреВрд▓ рдЖрдкрдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдбреЙрдХрд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рд╕рдВрджрд░реНрдн


рджрд░рдЕрд╕рд▓, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ ред

Nintaco - рджреВрд░рд╕реНрде рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ NES рдПрдореБрд▓реЗрдЯрд░
Xkeeper0 emu-lua рд╕рдВрдЧреНрд░рд╣ - рд╡рд┐рднрд┐рдиреНрди Lua рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣
рдореЗрд╕рди C # рдореЗрдВ рдПрдХ рдЖрдзреБрдирд┐рдХ NES рдПрдореБрд▓реЗрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА Lua рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВред рдЕрдм рддрдХ рд╕реЙрдХреЗрдЯ рд╕рдорд░реНрдерди рдФрд░ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рдмрд┐рдирд╛ред
CadEditor рдПрдирдИрдПрд╕ рдФрд░ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрддрд░ рдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЦреЗрд▓реЛрдВ рдкрд░ рд╢реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рдХреА рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдореИрдВ рдЦреЗрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдВрдЧрд╛ред

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


All Articles