рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 3: рдЧреНрд░рд╛рдлрд┐рдХреНрд╕



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

рдЖрдзреБрдирд┐рдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реНрдг-рд╢рдХреНрддрд┐ рд╡рд╛рд▓реЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИрдВ рдЬреЛ рдореБрдЦреНрдп рд▓реЛрдЧреЛрдВ рд╕реЗ рдиреАрдЪ рдирд╣реАрдВ рд╣реИрдВ: рдпрд╣рд╛рдВ рд╡реЗ рдПрдордкреАрдИрдЬреА 2 рдХреЛ 1080p рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, 3 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рд╢реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди, рд╕реАрдпреВрдбреАрдПрдП рдЬреИрд╕реА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рд╕рдм рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдПрдХ рдФрд░ рдкреАрд╕реАрдЖрдИ рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЬреЛ рдмрд╛рдХреА рдХреЗ рд╕рдорд╛рди рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреНрд▓рд╛рд╕ рдирдВрдмрд░ 0x03 (рдХреНрд▓рд╛рд╕_рдирд╛рдо = рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдбреЗрдкреНрдЯрд░) рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ "рдкрд╛рдпрд╛"ред рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдХреА рддрд░рд╣, рдЖрдк I / O рдкреЛрд░реНрдЯ рдпрд╛ MMIO рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рд╕реНрд╡рдпрдВ DMA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рдХреА рд╕реАрдорд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 50 рд╕реЗ рдХрдо рдмрд╛рдЗрдЯреНрд╕ рдЗрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдЗрддрдиреА рд╡рд┐рд╢рд╛рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдирд╣реАрдВ рдХрд┐ рдЖрдзреБрдирд┐рдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рдкрд╛рд╕ рд╣реИред



рд╡реАрдЬреАрдП рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдЙрдЯрдкреБрдЯ рдХрд╛рд░реНрдб рдкреЛрд░реНрдЯ рдХреА рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: 0x03B0-0x03BB рдФрд░ 0x3C0-0x3DF ред рдЗрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА ( 0xA0000-0xBFFFF ) рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рднреА рд╣реИред


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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдмрд╛рдд рд╣реИ: рд╡реАрдЬреАрдП рдПрдХ рдкреБрд░рд╛рдирд╛ рдорд╛рдирдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдзреБрдирд┐рдХ рдорд╛рдирдХреЛрдВ, рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд░рд▓ рдЧреНрд░рд╛рдлрд┐рдХ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдорд╛рдирдХ рджрд░реНрдЬрдиреЛрдВ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рдлрд┐рдХ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдореЛрдб (рдЖрдк рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ "рд╢рд╛рдВрдд" рд╣реИрдВ: 256 рд░рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП 320x200 рдФрд░ 16 рд░рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП 640x480ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдХ рдореЗрдВ рдкреИрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдореЛрдб рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХрд╣рд╛рдВ рд╣реИрдВ: 1920x1080 24 рдмрд┐рдЯреНрд╕, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо 800x600 24 рдмрд┐рдЯреНрд╕? MPEG2 рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд╣рд╛рдВ рд╣реИ? 3 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╣рд╛рдВ рд╣реИ? рд╡реАрдЬреАрдП рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИред рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдЕрднреА рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ SVGA рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде BIOS VBE рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдФрд░ 3 рдбреА, MPEG2, CUDA рдФрд░ рдЕрдиреНрдп рдлреИрд╢рдиреЗрдмрд▓ рдЪрд┐рдкреНрд╕ рдкреНрд░рддреНрдпреЗрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред VGA рдорд╛рдирдХ рдореЗрдВ 640x480 рдХрд╛ рдЕрдзрд┐рдХрддрдо рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдкреБрд░рд╛рдиреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреА рдЧрдгрдирд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рд╣реИ: рдХреЗрд╡рд▓ 128 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ (рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: 1920x1080 24bit - рдпрд╣ 6Mb рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ)ред рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрдзреБрдирд┐рдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдВ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИ:


рдЙрдкрд░реЛрдХреНрдд рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реИрдЦрд┐рдХ рдлреНрд░реЗрдо рдмрдлрд░ (LFB) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рднреАред рдкрддреЗ рдХреА рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реИрдХрдбрд╝реЛрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдФрд░ рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рд╕реЗрдЯ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рди рдХреЗрд╡рд▓ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ - рд╡реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдФрд░ рд╕рдорд╛рди рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рджреЛрдиреЛрдВ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм CUDA, MPEG2, 3D, ... рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ ... рд╕рднреА рдЧреНрд░рд╛рдлрд╝рд┐рдХ рдХреЗ рд╕реНрд░реЛрдд рд▓рд┐рдирдХреНрд╕ рдбреНрд░рд╛рдЗрд╡рд░ 8 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ:


рдФрд░ рдпрд╣рд╛рдБ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:



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

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдПрдХ рд╕рднреНрдп рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЛрдб рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдХреБрдЫ рд╕реБрдВрджрд░ рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рднрдЧреНрдиред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреНрдп рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЛрдб SVGA рдорд╛рдирдХ рд╣реИрдВ рдФрд░ VBE BIOS рдПрдХреНрд╕рдЯреЗрдВрд╢рди (VESA BIOS рдПрдХреНрд╕рдЯреЗрдВрд╢рди) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред VBE рдПрдХ BIOS рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рд╕реНрд╡рдпрдВ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред VBE рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдорд╛рдирдХ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
1. рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред VESA рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдЖрджрд┐ред
2. рдореЛрдб рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛: рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдПрд▓рдПрдлрдмреА рдХреЛ рд╕реВрдЪрдХ рдФрд░ рдмрд┐рдЯред
3. рдЗрд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдореЛрдб рдЪрд╛рд▓реВ рдХрд░реЗрдВред
4. рдмреИрдВрдХ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рд╡реАрдбрд┐рдпреЛ рдореЛрдб рдХреЗ рд▓рд┐рдП рдмреИрдВрдХ рдЪрд╛рд▓реВ рдХрд░рдирд╛, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗред
5. рдкреИрд▓реЗрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╕рд╣рд┐рдд рдЕрдиреНрдп рдХрд╛рд░реНрдп, рдЬреЛ 8-рдмрд┐рдЯ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдкреВрд░реНрдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рднреА рдореЛрдб 0x000 рд╕реЗ 0x1FF рддрдХ рдХреНрд░рдордмрджреНрдз рд╣реИрдВред рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ 0x100 рдХреЗ рдмрд╛рдж рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рдорд╛рдирдХ рдореЗрдВ рд╕рдЯреАрдХ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ: рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рджреНрд╡рд╛рд░рд╛, рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрднреА рднреА рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред 0x100 рддрдХ рдХреЗ рдореЛрдб рдирдВрдмрд░ VGA рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред LFB - рд░реИрдЦрд┐рдХ рдлреНрд░реЗрдо рдмрдлрд░, рдпрд╣ рдмрдбрд╝реА рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд░реИрдо рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди 4 рдЬреАрдмреА рддрдХ)ред

LFB рдХреЗ рдмрд┐рдирд╛, рдорд╛рдирдХ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ 0xA0000 рд╕реЗ 0xC0000 рддрдХ рд╕рднреА рдЧреНрд░рд╛рдлрд┐рдХ рдореЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, "рдмреИрдВрдХреЛрдВ" рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдХреЛ рдЧрд┐рдиреЗ рд╣рд┐рд╕реНрд╕реЛрдВ (рдмреИрдВрдХреЛрдВ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖рдг рдореЗрдВ, рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдРрд╕реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдбреНрд░рд╛ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдмреИрдВрдХ рдирдВрдмрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдбреНрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



LFB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд░рд▓ рдФрд░ рддреЗрдЬ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдкреВрд░реЗ LFB рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред LFB рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреЛ рд░реИрдЦрд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЧрд┐рдирддреА рд╕реНрдХреНрд░реАрди рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рд╕реЗ рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЛрдб рдХреА рдмрд┐рдЯрдиреЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ, рджреЛ, рддреАрди рдпрд╛ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдХреЛ рдЗрдирдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рднреНрдп рдореЛрдб 32-рдмрд┐рдЯ рдФрд░ 24-рдмрд┐рдЯ (рддреАрди рдФрд░ рдЪрд╛рд░ рдмрд╛рдЗрдЯ) рд╣реИрдВред рдЗрди рдореЛрдбреНрд╕ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд▓рд░ рдЪреИрдирд▓ (рд░реЗрдб, рдЧреНрд░реАрди, рдмреНрд▓реВ) рдХреЛ 1 рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред 32-рдмрд┐рдЯ рдореЛрдб рдореЗрдВ, рдПрдХ рдФрд░ рдмрд╛рдЗрдЯ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред LFB рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛: рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореЛрдб рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ LFB рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: mode_number | 0x4000ред



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдирдВрдмрд░ 2 (рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк LFB рдХреЗ рд╕рд╛рде рдореЛрдб рдирдВрдмрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдирдВрдмрд░ 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк LFB рдмрдлрд░ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдСрдлрд╕реЗрдЯ рдкрд░ RGB рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрдХрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди VBE рдПрдХ BIOS рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ BIOS рдлрд╝рдВрдХреНрд╢рди (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 10h) рдореЗрдВ рд░рд┐рдпрд▓-рдореЛрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП 16-рдмрд┐рдЯ рдХреЛрдб рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд 32-рдмрд┐рдЯ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рд╕реЗ VBE (16 рдмрд┐рдЯ рд░рд┐рдпрд▓ рдореЛрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЗ рд╣реИрдВ:
1. рд░рд┐рдпрд▓ рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ, рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдб рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХреЛ рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
2. рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рд╕реЗ 16-рдмрд┐рдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ VBE рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ, рдХреЙрд▓ рдЧреЗрдЯ рдмрдирд╛рдиреЗ, 16-рдмрд┐рдЯ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ VBE рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
3. 16-рдмрд┐рдЯ рд░рд┐рдпрд▓ рдореЛрдб рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдПрдореБрд▓реЗрдЯрд░ рдХреА рдПрдХрдорд╛рддреНрд░ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рд╣реА рдмрд╛рдзрд┐рдд рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ VBE рдХреЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рддреАрд╕рд░реА рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд▓рдЧрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддреИрдпрд╛рд░ x86emu рдПрдореБрд▓реЗрдЯрд░ (рд╕рд░рд▓ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреЛрд░реНрдЯреЗрдмрд▓) рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ VBE рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рднреА рдЖрдзреБрдирд┐рдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ , рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЛрдб рдХреЛ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рднрдЧреНрди рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рддрдХ рдмрд┐рдирд╛ рд╢реЗрдбреНрд╕ рдФрд░ 3 рдбреА рд▓реЗрдХрд┐рди, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ред

! рдорд╣рддреНрд╡рдкреВрд░реНрдг! : рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рд╕рднреА 6 рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ"

рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛:

1. рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╣рдореЗрдВ x86emu рдФрд░ рднрдЧреНрди рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
2. рдкреЛрд░реНрдЯ x86emuред
3. VBE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗрдВред
4. рдПрдХ рдлреНрд░реИрдХреНрдЯрд▓ рдбреНрд░рд╛рдЗрдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВред
5. рд╕рднреА рдЧрдардмрдВрдзрди рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд░рдг 1. рд╣рдо рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкреВрд░рдХ рд╣реИрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреАрд╕реАрд╕реА рдХреЛ рдЙрдиреНрд╣реЗрдВ x86emu рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

1. рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ: udivdi3.c , umoddi3.c , moddi3.c , qdivrem.c , divdi3.c ред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

2. рдЖрдЧреЗ рдЖрдкрдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ quad.h рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/quad рд╕реЗ рднреА рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

#include <sys/types.h> #if !defined(_KERNEL) && !defined(_STANDALONE) #include <limits.h> #else #include <sys/limits.h> #endif 


рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
 #include тАЬtypes.hтАЭ 


3. рдЕрдм, newlib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдЗрд╕реЗ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ newlib-2.0.0 \ newlib \ libm \ math \ s_floor.c рдХреЛ рдЖрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рд╣рдо рд▓рд╛рдЗрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 #include "fdlibm.h" 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
 #include "types.h" 

4. рдЕрднреА рднреА setjmp / longjmp рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ X86emu рдПрдореБрд▓реЗрдЯрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ newlib рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реА ++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдореИрдиреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИред рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ setjmp.s рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ (рд╕рд╛рдзрд╛рд░рдг рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рд╛рде) рдореЗрдВ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛:
  .globl setjmp setjmp: movl 4(%esp),%ecx movl 4(%ebp), %edx movl %edx, 0(%ecx) movl %ebx, 4(%ecx) addl $4,%ebp movl %ebp, 8(%ecx) subl $4,%ebp movl (%ebp),%edx movl %edx,12(%ecx) movl %esi,16(%ecx) movl %edi,20(%ecx) movl %eax,24(%ecx) xorl %eax,%eax ret .globl longjmp longjmp: movl 4(%esp),%edx movl 8(%esp),%eax movl 0(%edx),%ecx movl 4(%edx),%ebx movl 8(%edx),%esp movl 12(%edx),%ebp movl 16(%edx),%esi movl 20(%edx),%edi testl %eax,%eax jnz 1f incl %eax 1: movl %ecx,0(%esp) ret 


рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░рдо рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
5. рдЕрдм рдЖрдкрдХреЛ рд╕реАред рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setjmp.h рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ:
 #ifndef _SETJMP_H_ #define _SETJMP_H_ #define _JBLEN 10 typedef long jmp_buf[_JBLEN]; #ifdef __cplusplus extern "C" { #endif int setjmp (jmp_buf); void longjmp (jmp_buf, int); #ifdef __cplusplus } #endif #endif 


6. рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдореЗрдореЛрд░реА (рдореЗрдорд╕реЗрдЯ, рд╕реНрдЯреНрд░рд▓реЗрди, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд┐рдЯреНрд╡рд┐рд╕рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рд╣рд╛рдЗрдкрд░рд╡рд┐рдЬрд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдпрд╕реНрдХ \ string.s рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рд╣рдо рд▓рд╛рдЗрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 .include "longmode.h" 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
рдПрд▓
 ongmode = 0 


7. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ bitvisor рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП \ core \ string.h рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ, рд▓рд╛рдЗрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
 #include <core/types.h> 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
 #include "types.h" 

8. рдЖрдкрдХреЛ рдЬреЛ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдорд┐рд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ io.h рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╣реА рдмрд┐рдЯреНрд╡рд┐рд╕рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ \ io.h рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ)ред
9. рдХреЙрдкреА рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ :
 #ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; typedef unsigned long ulong; typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; typedef unsigned long long uint64_t; typedef unsigned long long u_int64_t; typedef unsigned long uint32_t; typedef unsigned long u_int32_t; typedef unsigned short uint16_t; typedef unsigned short u_int16_t; typedef unsigned char uint8_t; typedef unsigned char u_int8_t; typedef long __int32_t; typedef unsigned long __uint32_t; typedef unsigned long long u_quad_t; /* quads */ typedef long long quad_t; typedef quad_t * qaddr_t; typedef unsigned long u_int; typedef unsigned long uint; typedef long long int64_t; typedef long int32_t; typedef short int16_t; typedef char int8_t; #define _QUAD_HIGHWORD 1 #define _QUAD_LOWWORD 0 #define __BEGIN_DECLS #define __END_DECLS #define __dead #define __far #define __HI(x) *(1+(int*)&x) #define __LO(x) *(int*)&x #define __P(a) a #define CHAR_BIT 8 /* max # of bits in a "char" */ #define EXTRACT_WORDS(i0, i1, x) \ i0 = __HI(x); \ i1 = __LO(x); #define INSERT_WORDS(x, i0, i1) \ __HI(x) = i0; \ __LO(x) = i1; #define _BEGIN_STD_C #define _END_STD_C #define _EXFUN(a,b) ab #endif 

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

рдЪрд░рдг 2. рдкреЛрд░реНрдЯрд┐рдВрдЧ x86emu


X86emu FreeBSD рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реВрдЯ рдореЗрдВ x86emu рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ http://svnweb.freebsd.org/base/vendor-sys/x86emu/dist/ рд╕реЗ, рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ: x86emu.c, x86emu.h, x86emu_regs.h, x86emu_utilред рд╕реА ред

рдЕрдм, рдЖрдкрдХреЛ рдЗрди рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
1. x86emu \ x86emu.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ:
 #include <dev/x86emu/x86emu.h> #include <dev/x86emu/x86emu_regs.h> 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
 #include "x86emu.h" #include "x86emu_regs.h" 

2. x86emu \ x86emu.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ:
 #include <sys/types.h> #include <sys/endian.h> #ifdef _KERNEL #include <sys/systm.h> #else #include <setjmp.h> #endif 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐
 #include "types.h" #include "setjmp.h" 


3. x86emu \ x86emu_util.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ:
 #include <sys/param.h> #include <sys/endian.h> #include <dev/x86emu/x86emu.h> #include <dev/x86emu/x86emu_regs.h> 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
 #include "x86emu.h" #include "x86emu_regs.h" #include "Io.h" #define htole16(x) ((uint16_t)(x)) #define htole32(x) ((uint32_t)(x)) #define letoh16(x) ((uint16_t)(x)) #define letoh32(x) ((uint32_t)(x)) 


4. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ x86emu_init_default рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ x86emu \ x86emu_util.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 static uint8_t x86emu_inb(struct x86emu *emu, uint16_t port) { uint8_t val = 0; in8(port, &val); return val; } static void x86emu_outb(struct x86emu *emu, uint16_t port, uint8_t data) { out8(port, data); } static uint16_t x86emu_inw(struct x86emu *emu, uint16_t port) { uint16_t val = 0; in16(port, &val); return val; } static void x86emu_outw(struct x86emu *emu, uint16_t port, uint16_t data) { out16(port, data); } static uint32_t x86emu_inl(struct x86emu *emu, uint16_t port) { uint32_t val = 0; in32(port, &val); return val; } static void x86emu_outl(struct x86emu *emu, uint16_t port, uint32_t data) { out32(port, data); } 

рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЖрд╡рд░рдг рд╣реЛрддреЗ рд╣реИрдВред

5. x86emu_init_default рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реА, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:
 emu->emu_inb = x86emu_inb; emu->emu_inw = x86emu_inw; emu->emu_inl = x86emu_inl; emu->emu_outb = x86emu_outb; emu->emu_outw = x86emu_outw; emu->emu_outl = x86emu_outl; 

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

рдЪрд░рдг 3. BIOS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред


рдЕрдм рдЖрдк V86 BIOS рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ x86emu рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдЬреЛ рд╕реАрдзреЗ BIOS рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ bios.c рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:

 #include "types.h" #include "bios.h" #include "x86emu.h" struct x86emu emulator; void VBE_BiosInit(void) { memset(&emulator, 0, sizeof(emulator)); x86emu_init_default(&emulator); emulator.mem_base = (char *)0; emulator.mem_size = BIOS_SIZE; } void VBE_BiosInterrupt( BIOS_REGS *p_regs, u8 num ) { memcpy(&(emulator.x86), p_regs, sizeof(BIOS_REGS)); x86emu_exec_intr(&emulator, num); memcpy(p_regs, &(emulator.x86), sizeof(BIOS_REGS)); } 


рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде bios.h рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:
 #ifndef _BIOS_H #define _BIOS_H #define BIOS_SIZE 0x100000 #define BIOS_HIGH_BASE 0xC0000 #define BIOS_HIGH_SIZE (0x100000 - 0xC0000) #define BIOS_BDA_BASE 0x9fc00 #define BIOS_BDA_SIZE 0x400 #define VBE_BIOS_INFO_OFFSET 0x70000 #define VBE_BIOS_MODE_INFO_OFFSET 0x80000 typedef struct _BIOS_REGS { u16 CS; u16 DS; u16 ES; u16 FS; u16 GS; u16 SS; u32 EFLAGS; u32 EAX; u32 EBX; u32 ECX; u32 EDX; u32 ESP; u32 EBP; u32 ESI; u32 EDI; u32 EIP; } BIOS_REGS; void VBE_BiosInit(void); void VBE_BiosInterrupt( BIOS_REGS *p_regs, u8 num ); #endif 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ bios (VBE_BiosInit) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ bios (VBE_BiosInterrupt) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рдирд╛рдо рдЗрд╕ рддрдереНрдп рд╕реЗ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯ (рд╡реНрдпрд╡рдзрд╛рди) рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ рдХрд┐ BIOS рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░рд┐рдпрд▓-рдореЛрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ VBE рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рдзрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдореБрд▓реЗрдЯрд░ рдЖрдИрд╡реАрдЯреА рдЯреЗрдмрд▓ рдФрд░ BIOS рдХреЛрдб рд╕реЗ рд╣реА рдХреЛрдб рдХреЛ рдбрд┐рдХреЛрдб рдФрд░ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдкреНрд░рд╢рд┐рдХреНрд╖рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢, рдПрдореБрд▓реЗрдЯрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ int 10h рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдореБрд▓реЗрдЯрд░ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЪрд░рдг 2 рдореЗрдВ рдкрд╣рд▓реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдерд╛ред

рдЪрд░рдг 4. VBE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛрдбрд╝рдирд╛ред


рдЕрдм рд╕рдм рдХреБрдЫ VBE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, vbe.h рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реЛрдВрдЧреАред рдЗрд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓рдмреЙрдХреНрд╕ рдХреЛрдб (http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Devices/Graphics/BIOS/vbe.h) рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рдмрджрд▓реЗрдВ:
 #include "vgabios.h" #include <VBox/Hardware/VBoxVideoVBE.h> 

рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
 #include "types.h" 


рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЖрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ vbe.c рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
 #include "types.h" #include "printf.h" #include "string.h" #include "bios.h" #include "vbe.h" ulong vbe_lfb_addr = 0; ulong vbe_selected_mode = 0; ulong vbe_bytes = 0; VbeInfoBlock *VBE_GetGeneralInfo() { BIOS_REGS regs; memset(┬оs, 0, sizeof(BIOS_REGS)); regs.ECX = 0; regs.EAX = 0x4f00; regs.ES = VBE_BIOS_INFO_OFFSET >> 4; regs.EDI = 0x0; VBE_BiosInterrupt(┬оs, 0x10); if (regs.EAX != 0x4f) return NULL; return (VbeInfoBlock *)(VBE_BIOS_INFO_OFFSET); } ModeInfoBlock *VBE_GetModeInfo( ulong mode ) { BIOS_REGS regs; memset(┬оs, 0, sizeof(BIOS_REGS)); regs.ECX = mode; regs.EAX = 0x4f01; regs.ES = VBE_BIOS_MODE_INFO_OFFSET >> 4; regs.EDI = 0x0; VBE_BiosInterrupt(┬оs, 0x10); if (regs.EAX != 0x4f) return NULL; return (ModeInfoBlock *)(VBE_BIOS_MODE_INFO_OFFSET); } int VBE_SetMode( ulong mode ) { BIOS_REGS regs; memset(┬оs, 0, sizeof(BIOS_REGS)); if (mode >= 0x100) { regs.EBX = mode; regs.EAX = 0x4f02; } else { regs.EAX = mode; } VBE_BiosInterrupt(┬оs, 0x10); return (regs.EAX == 0x4f); } int VBE_Setup(int w, int h) { uint32_t m = 0; printf("\nVBE: test started"); VBE_BiosInit(); memset((char *)VBE_BIOS_INFO_OFFSET, 0, sizeof(VbeInfoBlock)); memset((char *)VBE_BIOS_MODE_INFO_OFFSET, 0, sizeof(ModeInfoBlock)); VbeInfoBlock *p_info = VBE_GetGeneralInfo(); int vbe_support = (p_info != NULL); if (vbe_support == 0) { printf("\nVBE: not supported"); return 0; } vbe_support = (p_info->VbeVersion >= 0x200); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[0] == 'V'); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[1] == 'E'); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[2] == 'S'); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[3] == 'A'); if (vbe_support == 0) { printf("\nVBE: not supported"); return 0; } //Try to find mode int found = 0; for (m = 0x0; m < 0x200; m++) { ModeInfoBlock *p_m_info = VBE_GetModeInfo(m); if (p_m_info != NULL) { printf("\nVBE: %x %dx%dx%d at %x", m, p_m_info->XResolution, p_m_info->YResolution, p_m_info->BitsPerPixel, p_m_info->PhysBasePtr); if (p_m_info->PhysBasePtr != 0 && p_m_info->XResolution == w && p_m_info->YResolution == h && (p_m_info->BitsPerPixel == 24 || p_m_info->BitsPerPixel == 32)) { found = 1; vbe_selected_mode = m; vbe_lfb_addr = p_m_info->PhysBasePtr; vbe_bytes = p_m_info->BitsPerPixel / 8; printf("\nVBE: FOUND GOOD %dx%dx%d -> %x at %x", w, h, vbe_bytes, vbe_selected_mode, vbe_lfb_addr); } } } return found; } 


рдЖрдЗрдП рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
тАв VBE_GetGeneralInfo ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ VBE рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрд╣ BIOS рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред
тАв VBE_GetModeInfo ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЛ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рдореЛрдб рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред VBE_BiosInterrupt рдореЗрдВ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ VBE рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
тАв VBE_SetMode ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╕ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдВрдЫрд┐рдд рдореЛрдб рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред VBE_BiosInterrupt рдореЗрдВ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ VBE рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
тАв VBE_Setup ред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп: рдпрд╣ рд╕рднреА рдореЛрдбреНрд╕ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ 24-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рдФрд░ LFB рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдореЛрдб рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдЦреЛрдЬреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд╣ рддреАрди рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рднрд░ рджреЗрддреА рд╣реИ:
o vbe_lfb_addr - LFB рдкрддрд╛ред рд╕реНрдХреНрд░реАрди рдкрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
o vbe_selected_mode - рдЪрдпрдирд┐рдд рдореЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
o vbe_bytes - рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ (3 рдпрд╛ 4)ред

рд╕рдм рдХреБрдЫ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдЪрд░рдг 5. рдПрдХ рднрдЧреНрди рдбреНрд░рд╛рдЗрдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛ред

рдордЬрд╝рд╛ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣реА рд╣реИ: рдПрдХ рднрдЧреНрди рдбреНрд░рд╛ред рд╣рдо рдЬреВрд▓рд┐рдпрд╛ рд╕реЗрдЯ рдкрд░ рдПрдХ рднрдЧреНрди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЕрджреНрднреБрдд рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдПрдХ рднрдЧреНрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рднрдЧреНрди рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕реВрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ fractal.c рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 #include "types.h" #include "printf.h" #include "string.h" int VBE_SetMode( ulong mode ); int VBE_Setup(int w, int h); double floor(double x); extern ulong vbe_lfb_addr; extern ulong vbe_selected_mode; extern ulong vbe_bytes; int HSVtoRGB(int _h, int _s, int _v) { double h = (double)_h / 255.0, s = (double)_s / 255.0, v = (double)_v / 255.0; double r = 0; double g = 0; double b = 0; if (s == 0) { r = v; g = v; b = v; } else { double varH = h * 6; double varI = floor(varH); double var1 = v * (1 - s); double var2 = v * (1 - (s * (varH - varI))); double var3 = v * (1 - (s * (1 - (varH - varI)))); if (varI == 0) { r = v; g = var3; b = var1; } else if (varI == 1) { r = var2; g = v; b = var1; } else if (varI == 2) { r = var1; g = v; b = var3; } else if (varI == 3) { r = var1; g = var2; b = v; } else if (varI == 4) { r = var3; g = var1; b = v; } else { r = v; g = var1; b = var2; } } return ((int)(r * 255) << 16) | ((int)(g * 255) << 8) | (int)(b * 255); } void DrawFractal(void) { int x = 0, y = 0, w= 800, h = 600; if (!VBE_Setup(w, h)) return; if (!VBE_SetMode(vbe_selected_mode | 0x4000)) return; double cRe, cIm; double newRe, newIm, oldRe, oldIm; double zoom = 1, moveX = 0, moveY = 0; int color; int maxIterations = 300; cRe = -0.7; cIm = 0.27015; for(x = 0; x < w; x++) for(y = 0; y < h; y++) { newRe = 1.5 * (x - w / 2) / (0.5 * zoom * w) + moveX; newIm = (y - h / 2) / (0.5 * zoom * h) + moveY; int i; for(i = 0; i < maxIterations; i++) { oldRe = newRe; oldIm = newIm; newRe = oldRe * oldRe - oldIm * oldIm + cRe; newIm = 2 * oldRe * oldIm + cIm; if((newRe * newRe + newIm * newIm) > 4) break; } color = HSVtoRGB(i % 256, 255, 255 * (i < maxIterations)); // Draw pixel *(int *)((char *)vbe_lfb_addr + y * w * vbe_bytes + x * vbe_bytes + 0) = color & 0xFFFFFF; } } 

рдЖрдЗрдП рдЗрд╕ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ:

 int VBE_SetMode( ulong mode ); int VBE_Setup(int w, int h); double floor(double x); extern ulong vbe_lfb_addr; extern ulong vbe_selected_mode; extern ulong vbe_bytes; 


рджреВрд╕рд░реЗ, HSVtoRGB рд░рдВрдЧ рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд╡рд╣ рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред

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

1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реНрдХреНрд░реАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдореЛрдб рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
int x = 0, y = 0, w = 800, h = 600;
рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

2. рдлрд┐рд░ VBE рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:
  if (!VBE_Setup(w, h)) return; 


3. рдлрд┐рд░ рдкрд╛рдпрд╛ рдЧреНрд░рд╛рдлрд┐рдХ рдореЛрдб рдЪрд╛рд▓реВ рд╣реИ:
  if (!VBE_SetMode(vbe_selected_mode | 0x4000)) return; 


4. рдЕрдЧрд▓рд╛, рдПрдХ рднрдЧреНрди рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╣реА рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд░рд┐рдХреЙрд░реНрдб рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 *(int *)((char *)vbe_lfb_addr + y * w * vbe_bytes + x * vbe_bytes + 0) = color & 0xFFFFFF; 


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

 #include "printf.h" #include "screen.h" #include "types.h" void DrawFractal(void); void main() { clear_screen(); printf("\n>>> Hello World!\n"); DrawFractal(); } 

рдЪрд░рдг 6. рдореЗрдХрдлрд╛рдЗрд▓ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ


рдпрд╣ рдХреЗрд╡рд▓ рдореЗрдХрдлрд╛рдЗрд▓ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
1. рдЕрджреНрдпрддрди OBJFILES:

 OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ common/bios.o \ common/vbe.o \ common/qdivrem.o \ common/udivdi3.o \ common/umoddi3.o \ common/divdi3.o \ common/moddi3.o \ common/setjmp.o \ common/string.o \ common/s_floor.o \ x86emu/x86emu.o \ x86emu/x86emu_util.o \ fractal.o \ kernel.o 


2. рдПрдХ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ:
 $(CC) -Ix86emu -Iinclude $(CFLAGS) -o $@ -c $< 

3. рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝реЗрдВ:
 .so: as -o $@ $< 

4. рдЕрдм рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 make rebuild sudo make image 


5. рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 sudo qemu-system-i386 -hda hdd.img 

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рд╕реБрдВрджрд░рддрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ, dd рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк hdd.img рдЫрд╡рд┐ рдХреЛ USB рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдВрдХ:
" рдХреИрд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП: рднрд╛рдЧ 4. рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ "
" рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 5. рдУрдПрд╕ рд╕реЗ BIOS рддрдХ рдкрд╣реБрдВрдЪрдирд╛
" рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 6. FAT рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди "

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


All Articles