
рдФрд░ рдлрд┐рд░ рд╕реЗ рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛! рдореИрдВрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╡реЙрд▓реНрдпреВрдо рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛, рдФрд░ рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЬреАрд╡рди рдореЗрдВ рдЖрдПрдЧрд╛, рдФрд░ рдХрд╛рдлреА рдЧрдВрднреАрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛, рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдФрд░ рд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред (рд╡реИрд╕реЗ, рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ:
рдПрдХ ,
рджреЛ ,
рддреАрди )ред
рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реИрдмреЗ рдореЗрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рдареАрдХ рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд▓реЗрдЦ 2, 3 рдмрд▓реНрдХрд┐ рд╕реВрдЦрд╛, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб, рдереЛрдбрд╝рд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд▓рд╛ред рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЦреБрдж рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╡рд░реНрдгрди рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ред рдЦреИрд░, рдХреЛрдб ... рдХреЛрдб, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╣реЛрдЧрд╛! рдХреМрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВ рдХреЛрдб рдХреЛ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд░рдЦреВрдВрдЧрд╛ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рд╣рдореЗрд╢рд╛ рдЧреАрдереВрдм рдкрд░ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдХрд▓рдХ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХрд┐рд▓реЗ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрд╣ рдмреИрд░рди рдореБрдирдЪреМрд╕реЗрди рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рджрд▓рджрд▓ рд╕реЗ рдЦреБрдж рдХреЛ рдмрд╛рд▓реЛрдВ рд╕реЗ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд▓реЗ рдкрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдХрд┐рд▓реЗ рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╣реИред рдкрд╣рд▓реЗ рдореБрдлреНрдд рдмрд╛рдЗрдЯ рдХреЛ рдЪрд░ h рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЕрдХреНрд╕рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╢рдмреНрдж рднреА рд╣реИ, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдкрд╣рд▓реЗ рдирд┐рд╢реБрд▓реНрдХ рдмрд╛рдЗрдЯ рдХреЗ рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
: here h @ ;

рдпрд╣ рдЕрд▓реЙрдЯ рд╢рдмреНрдж рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ рдкреЙрдЗрдВрдЯрд░ рдПрдЪ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрд▓реЙрдЯ рд╢рдмреНрдж рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
: allot h +! ;
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЛрдб рдФрд░ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рддреЛ, рдПрдХ рд╡рд╛рдХреНрдп рдХреЗ рд╕рд╛рде, рдЖрдк рдХрд┐рд▓реЗ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкреВрд░реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХрд┐рд╕ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд░рд╛рдЬреНрдп рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рд╕реЗрдЯ рд╣реИ, рдЕрдиреНрдпрдерд╛ - рд╕рдВрдХрд▓рди рдореЛрдбред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдмрдлрд░ рд╕реЗ рд╢рдмреНрдж рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрдЪрдХ рдПрдЪ рджреНрд╡рд╛рд░рд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕реВрдЪрдХ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд┐рд▓реЗ рдореЗрдВ, рд╢рдмреНрдж "," рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрдгрд╛рдВрдХ рдореВрд▓реНрдп рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рдмреНрдж "рд╕реА," рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдЯ рдбреЗрдкреНрде (8, 16, 32, 64) рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ "w," рдФрд░ "i" рд╢рдмреНрдж рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо "рд╕реНрдЯреНрд░" рд╢рдмреНрдж рднреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рджреЛ рдорд╛рди рд▓реЗрддреЗ рд╣реБрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ - рдкрддрд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИред
рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╢рдмреНрдж рд╣реИрдВ рдпрджрд┐, рдлрд┐рд░, рдХрд░рддреЗ рд╣реИрдВ, рд▓реВрдк, рдФрд░ рдЕрдиреНрдпред рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж рдЕрдЧрд░ рдПрдХ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб (? Nbranch) рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рддрд╛рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рдХрд┐рди рд╢рдмреНрджреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрддреНрдХрд╛рд▓ рдзреНрд╡рдЬ (рд╕рдВрдХреЗрдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдзреНрд╡рдЬ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рдЗрд╕реЗ f_immediate рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрддреНрдХрд╛рд▓ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рдХреЛрдИ рдорд╛рдкрджрдгреНрдб рдирд╣реАрдВ рд╣реИ, рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдЭрдВрдбреЗ рдХреЛ рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдм рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ!
рдЯреНрд░реЗрдирд┐рдВрдЧ
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рд╕рд░рд▓ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рд╡реЗ рд╣реИрдВ: рдЪрд╛рд▓ (рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рдирдХрд▓), рднрд░рдиреЗ (рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рднрд░рдирд╛), рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди (рдФрд░, рдпрд╛, рдПрдХреНрд╕реЛрд░, рдЗрдирд╡рд░реНрдЯ), рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ рдХрдорд╛рдВрдб (rshift, lshift)ред рдЪрд▓реЛ рдПрдХ рд╣реА rpick рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдкрд┐рдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рдирд╣реАрдВ)ред
рдпреЗ рдХрдорд╛рдВрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ, рдпрд╣рд╛рдВ рдЙрдирдХрд╛ рдХреЛрдб рд╣реИ b_move = 0x66 bcmd_move: pop rcx pop rdi pop rsi repz movsb jmp _next b_fill = 0x67 bcmd_fill: pop rax pop rcx pop rdi repz stosb jmp _next b_rpick = 0x63 bcmd_rpick: pop rcx push [rbp + rcx * 8] jmp _next b_and = 0x58 bcmd_and: pop rax and [rsp], rax jmp _next b_or = 0x59 bcmd_or: pop rax or [rsp], rax jmp _next b_xor = 0x5A bcmd_xor: pop rax xor [rsp], rax jmp _next b_invert = 0x5B bcmd_invert: notq [rsp] jmp _next b_rshift = 0x5C bcmd_rshift: pop rcx or rcx, rcx jz _next 1: shrq [rsp] dec rcx jnz 1b jmp _next b_lshift = 0x5D bcmd_lshift: pop rcx or rcx, rcx jz _next 1: shlq [rsp] dec rcx jnz 1b jmp _next
рдЕрднреА рднреА рд╢рдмреНрдж рдХреЛ рд╢рдмреНрдж рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣ рдмреНрд▓реЛрд░реНрдб рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реАрдорд╛рдВрдХрдХ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛, рдпрд╣ рд╕реНрд░реЛрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдмреНрд▓рд░рд╡рд░реНрд▓реНрдб рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдФрд░ рддреБрд▓рдирд╛ рдХрдорд╛рдВрдбреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдо рд╢рдмреНрдж syscall рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде, рд▓рд╛рдкрддрд╛ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред рдпрджрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рдгрд╛рд▓реА рдЕрдм рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рд░рд╣рдиреЗ рджреЗрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред Syscall рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдФрд░ рд╕реНрдЯреИрдХ рд╕реЗ рдХреЙрд▓ рдирдВрдмрд░ рдХреЗ рд▓рд┐рдП 6 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
b_syscall = 0xFF bcmd_syscall: sub rbp, 8 mov [rbp], r8 pop rax pop r9 pop r8 pop r10 pop rdx pop rsi pop rdi syscall push rax mov r8, [rbp] add rbp, 8 jmp _next
рдФрд░ рдЕрдм рд╕реАрдзреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рд╕рдВрдХрд▓рдХ
рдЪрд▓реЛ рдЪрд░ рдПрдЪ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред
item h h: .byte b_var0 .quad 0
рд╣рдо рдЗрд╕рдХреА рдЖрд░рдВрднрд┐рдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ:
# forth last_item context @ ! h dup 8 + swap ! quit start: .byte b_call16 .word forth - . - 2 .byte b_call16 .word last_item - . - 2 .byte b_call16 .word context - . - 2 .byte b_get .byte b_set .byte b_call16 .word h - . - 2 .byte b_dup, b_num8, b_add, b_swap, b_set .byte b_quit
рдЖрдЗрдП рдпрд╣рд╛рдБ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВ:
item here .byte b_call8, h - . - 1 .byte b_get .byte b_exit
рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╢рдмреНрдж: "рдЕрд▓реЙрдЯ" рдФрд░ "рд╕реА,", "рдбрдмреНрд▓реНрдпреВ,", "рдЖрдИ,", ",", "рд╕реНрдЯреНрд░," # : allot h +! ; item allot allot: .byte b_call8, h - . - 1, b_setp, b_exit # : , here ! 8 allot ; item "," .byte b_call8, here - . - 1, b_set, b_num8, b_call8, allot - . - 1, b_exit # : i, here i! 4 allot ; item "i," .byte b_call8, here - . - 1, b_set32, b_num4, b_call8, allot - . - 1, b_exit # : w, here w! 2 allot ; item "w," .byte b_call8, here - . - 1, b_set16, b_num2, b_call8, allot - . - 1, b_exit # : c, here c! 1 allot ; item "c," .byte b_call8, here - . - 1, b_set8, b_num1, b_call8, allot - . - 1, b_exit # : str, dup -rot dup c, here swap move 1+ h +!; item "str," c_str: .byte b_dup, b_mrot, b_dup callb c_8 callb here .byte b_swap, b_move callb h .byte b_setp .byte b_exit
рдЕрдм рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рдФрд░ рджреЛ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВ: "[" рдФрд░ "]"ред рдЖрдорддреМрд░ рдкрд░ рдЗрди рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, "[" рд╢рдмреНрдж рд╕рдВрдХрд▓рди рдореЛрдб рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╢рдмреНрдж "]" рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдЬрдм рд╕рдВрдХрд▓рди рдореЛрдб рдХреЛ рдЪрд╛рд▓реВ рдпрд╛ рдмрдВрдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рд╢рдмреНрдж "[" рддрддреНрдХрд╛рд▓ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рд╢рдмреНрдж рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдпрд╣ рд╕рдВрдХрд▓рди рдореЛрдб рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
item state .byte b_var0 .quad 0 item "]" .byte b_num1 callb state .byte b_set, b_exit item "[", f_immediate .byte b_num0 callb state .byte b_set, b_exit
$ рд╕рдВрдХрд▓рди рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдмрд╛рд░реА рдЖрдИред рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓реЗрдЧрд╛ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢рдмреНрдж рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕рд╛рдзрд╛рд░рдг рдлреЛрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╢рдмреНрдж "," рдирд┐рд╖реНрдкрд╛рджрди рдкрддреЗ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рдмреНрдж рд╣реИрдВ - рдмрд╛рдЗрдЯрдХреЛрдб рдФрд░ рдорд╢реАрди рдХреЛрдбред рдкреВрд░реНрд╡ рдХреЛ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЗ рдЪрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ: call8, call16, call32 рдФрд░ call64ред рдЪрд╛рд░? рдирд╣реАрдВ! рдЬрдм рдореИрдВрдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрд╛, рдореИрдВрдиреЗ рдЗрди рдЪрд╛рд░ рдореЗрдВ 16 рдФрд░ рдЬреЛрдбрд╝реЗ! :)
рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ? рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХреЙрд▓ рдХрдорд╛рдВрдб рдореЗрдВ рд╕реБрдзрд╛рд░
рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВ) рдХреЙрд▓ 8 рдХрдорд╛рдВрдб рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ рддрдм рд╣реИ рдЬрдм рдмреБрд▓рд╛рдпрд╛ рд╢рдмреНрдж 128 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рднреАрддрд░ рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ - рдФрд░ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ? рдПрдХ рдмрд╛рдЗрдЯ рдореЗрдВ 256 рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рди рдХреИрд╕реЗ рдбрд╛рд▓реЗрдВ?
рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдерд╛ рдХрд┐ рдХрд┐рд▓реЗ рдореЗрдВ рдХреЙрд▓ рд╣рдореЗрд╢рд╛ рдХрдо рдкрддреЗ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдЪрд▓реЗ рдкрддреЗ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 256 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, 128 рдирд╣реАрдВред рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХреБрдЫ рдмрд┐рдЯ рдбрд╛рд▓рддреЗ рд╣реИрдВ ... рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХрд╣рд╛рдБ рд╣реИ! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ: рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реИ, рджреВрд╕рд░рд╛ рдСрдлрд╕реЗрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдХрдорд╛рдВрдб рдХреЗ рдирд┐рдЪрд▓реЗ рдмрд┐рдЯреНрд╕ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ (рдСрдлрд╕реЗрдЯ) рдХреЗ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдХреЛ рд░рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдПрдХ рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЗ рдмрдЬрд╛рдп, рдХрдИ рд╣реИрдВред рд╣рд╛рдВ, рдЗрд╕ рддрд░рд╣ рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯ-рдХрдорд╛рдВрдб рдХреЛрдб рдЯреЗрдмрд▓ рдХреА рдХрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдХреЙрд▓ рдХрдорд╛рдВрдб рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрдорд╛рдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдорд╛рдВрдб рдореЗрдВ 4 рдСрдлрд╕реЗрдЯ рдмрд┐рдЯреНрд╕ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк 4095 рдмрд╛рдЗрдЯреНрд╕ рдХреА рджреВрд░реА рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢реЙрд░реНрдЯ рдХреЙрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рдЗрди рдХрдорд╛рдВрдбреЛрдВ рдХреЛ рдХреЛрдб 0xA0 рдХреЗ рд╕рд╛рде рд░рдЦрд╛ рдерд╛ рдФрд░ рдХрдорд╛рдВрдб рдЯреЗрдмрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрдиреЗрдВ рджрд┐рдЦрд╛рдИ рджреАрдВ:
.quad bcmd_call8b0, bcmd_call8b1, bcmd_call8b2, bcmd_call8b3, bcmd_call8b4, bcmd_call8b5, bcmd_call8b6, bcmd_call8b7 # 0xA0 .quad bcmd_call8b8, bcmd_call8b9, bcmd_call8b10, bcmd_call8b11, bcmd_call8b12, bcmd_call8b13, bcmd_call8b14, bcmd_call8b15
рдЗрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдлрд╕реЗрдЯ (255 рддрдХ) рдкрд░ рдирд┐рдЪрд▓реЗ рдкрддреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдмрд╛рдХреА рд╕рдВрдмрдВрдзрд┐рдд рдСрдлрд╕реЗрдЯ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред bcmd_call8b1 256 рдЬреЛрдбрд╝рддрд╛ рд╣реИ, bcmd_call8b2 512 рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореИрдВрдиреЗ рдкрд╣рд▓рд╛ рдХреЙрд▓ рдХрдорд╛рдВрдб рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдпрд╛, рдмрд╛рдХреА рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рдеред
рдкрд╣рд▓рд╛ рдЖрджреЗрд╢:
b_call8b0 = 0xA0 bcmd_call8b0: movzx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 sub r8, rax jmp _next
рдореИрдХреНрд░реЛ рдФрд░ рдмрд╛рдХреА рдХреЙрд▓ рдХрдорд╛рдВрдб рдмрдирд╛рдирд╛:
.macro call8b N b_call8b\N = 0xA\N bcmd_call8b\N: movzx rax, byte ptr [r8] sub rbp, 8 inc r8 add rax, \N * 256 mov [rbp], r8 sub r8, rax jmp _next .endm call8b 1 call8b 2 call8b 3 call8b 4 call8b 5 call8b 6 call8b 7 call8b 8 call8b 9 call8b 10 call8b 11 call8b 12 call8b 13 call8b 14 call8b 15
рдЦреИрд░, рдореИрдВ рдкреБрд░рд╛рдиреЗ рдХреЙрд▓ 8 рдХрдорд╛рдВрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 16 рдЯреАрдореЗрдВ рдХреЙрд▓ рдмреИрдХ рдХрд░ рд░рд╣реА рд╣реИрдВред рдЬреЛ рднреА рднреНрд░рдо рд╣реИ, рдореИрдВрдиреЗ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ b_call8f рдХрд░ рджрд┐рдпрд╛:
b_call8f = 0x0C bcmd_call8f: movzx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 add r8, rax jmp _next
рд╡реИрд╕реЗ, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛рдпрд╛, рдЬреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ 4095 рдХреЗ рднреАрддрд░ рдХреЙрд▓ рдмреИрдХ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдХрднреА рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ :)
.macro callb adr .if \adr > . .error "callb do not for forward!" .endif .byte b_call8b0 + (. - \adr + 1) >> 8 .byte (. - \adr + 1) & 255 .endm
рдФрд░ рдЕрдм ...
рдЯреАрдо рд╕рдВрдХрд▓рди
рддреЛ, рд╣рдо рдПрдХ рдЬрдЯрд┐рд▓ рдЬрдЯрд┐рд▓ рд╕рдВрдХрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реИ, рддреЛ рдмрд╕ рдПрдХ рдмрд╛рдЗрдЯ (рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЛрдб) рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╢рдмреНрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА bytecode рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдХреЙрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмреАрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЪреБрдирдирд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ 19, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдХреЙрд▓ рдлреЙрд░рд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЙрд▓ 8 рдПрдл рдХрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ рдЪреБрдирд╛рд╡ рдпрд╣ рд╣реИред рдпрджрд┐ рдСрдлрд╝рд╕реЗрдЯ 0 ...- 4095 рдХреЗ рднреАрддрд░ рд╣реИ, рддреЛ рдХреЛрдб 0xA0 рдХреЗ рд╕рд╛рде bcmd_call8b рдХрдорд╛рдВрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдХрдорд╛рдВрдб рдХреЗ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЪрд╛рд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдСрдлрд╝рд╕реЗрдЯ рдмрд┐рдЯреНрд╕ рдХреЛ рд░рдЦреЗрдВред рдЗрд╕реА рд╕рдордп, рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЗ рд▓рд┐рдП, bcmd_call8b0 рдХрдорд╛рдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб bcmd_call8b15 рд╣реИред
рдпрджрд┐ рдмреИрдХрд╡рд░реНрдб рдСрдлрд╕реЗрдЯ 4095 рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдСрдлрд╕реЗрдЯ рдХреЛ рдХрд┐рд╕ рдЖрдпрд╛рдо рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЙрд▓ 16 / 32/64 рд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрди рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡реЗ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рджреЛрдиреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, call16 рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ 32767 рдХреА рджреВрд░реА рдХрд╣ рд╕рдХрддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
$ рд╕рдВрдХрд▓рдирдПрдХ рд╢рдмреНрдж рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдВрдХрд▓рд┐рдд рд╢рдмреНрдж рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓реЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ f_code рдзреНрд╡рдЬ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдкрддрд╛ (cfa) рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ compile_b рдпрд╛ compile_c (рдпрджрд┐ рдзреНрд╡рдЬ рд╕реЗрдЯ рд╣реИ) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
compile_cрдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╢рдмреНрдж рдХрд┐рд▓реЗ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╡рд░реНрдгрд┐рдд рд╣реИ:
: compile_c c@ c, ;
compile_bрдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдмрд╛рдЗрдЯрдХреЛрдб рдкрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХреЙрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
test_bvрдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рдПрдХ рдСрдлрд╕реЗрдЯ рд▓реЗрддрд╛ рд╣реИ (рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде) рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (1, 2, 4, рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕)ред рдорд╛рди 0, 1, 2 рдпрд╛ 3 рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрд▓ 16 / 32/64 рдХрдорд╛рдВрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп (lit8 / 16/32/64 рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк) рдпрд╣ рд╢рдмреНрдж рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ред
рд╡реИрд╕реЗ, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдФрд░ рдЗрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдХрд┐рд▓реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ "рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреЗрд▓" рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
$ ./forth ( 0 ): > 222 test_bv ( 2 ): 222 1 > drop drop ( 0 ): > 1000000 test_bv ( 2 ): 1000000 2 > drop drop ( 0 ): > -33 test_bv ( 2 ): -33 0 >
test_bvcрдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рдПрдХ рдСрдлрд╕реЗрдЯ (рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде) рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдлрд╝рд╕реЗрдЯ 0 ... -4095 рдХреА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред 0. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдХреЛрдИ рд╣рд┐рдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ test_bv рдХрд╣рд▓рд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред # : test_bvc dup 0 >= over FFF <= and if 0 exit else ... item test_bvc test_bvc: .byte b_dup, b_neg .byte b_num0 .byte b_gteq .byte b_over, b_neg .byte b_lit16 .word 0xFFF .byte b_lteq .byte b_and .byte b_qnbranch8, 1f - . .byte b_num0 .byte b_exit item test_bv test_bv: .byte b_dup, b_lit8, 0x80, b_gteq, b_over, b_lit8, 0x7f, b_lteq, b_and, b_qnbranch8, 1f - ., b_num0 .byte b_exit 1: .byte b_dup .byte b_lit16 .word 0x8001 .byte b_gteq .byte b_over .byte b_lit16 .word 0x7ffe .byte b_lteq, b_and, b_qnbranch8, 2f - ., b_num1, b_exit 2: .byte b_dup .byte b_lit32 .int 0x80000002 .byte b_gteq .byte b_over .byte b_lit32 .int 0x7ffffffd .byte b_lteq, b_and, b_qnbranch8, 3f - ., b_num2, b_exit 3: .byte b_num3 .byte b_exit # - item compile_c compile_c: .byte b_get8 callb c_8 .byte b_exit # - item compile_b compile_b: callb here .byte b_num2, b_add .byte b_sub callb test_bvc .byte b_dup .byte b_zeq .byte b_qnbranch8, 1f - . .byte b_drop .byte b_neg .byte b_dup .byte b_lit8, 8 .byte b_rshift .byte b_lit8, b_call8b0 .byte b_or callb c_8 callb c_8 .byte b_exit 1: .byte b_dup, b_num1, b_eq, b_qnbranch8, 2f - ., b_drop, b_lit8, b_call16 callb c_8 .byte b_wm callb c_16 .byte b_exit 2: .byte b_num2, b_eq, b_qnbranch8, 3f - ., b_lit8, b_call32 callb c_8 .byte b_num3, b_sub callb c_32 .byte b_exit 3: .byte b_lit8, b_call64 callb c_8 .byte b_lit8, 7, b_sub callb c_64 .byte b_exit #: $compile dup c@ 0x80 and if cfa compile_c else cfa compile_b then ; item "$compile" _compile: .byte b_dup, b_get8, b_lit8, 0x80, b_and, b_qnbranch8, 1f - ., b_cfa callb compile_c .byte b_exit 1: .byte b_cfa callb compile_b .byte b_exit
рдЕрдм рд╣рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ (рд╢рд╛рдмреНрджрд┐рдХ)
рдПрдХ рдкреВрд░рд╛ рдЙрдкрд╢реАрд░реНрд╖рдХ рд▓рд┐рдЦрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢рд╛рдмреНрджрд┐рдХ рд╕рдВрдХрд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ :)
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА test_bv рд╢рдмреНрдж рдореЗрдВ рдЖрдзрд╛ рдХрд╛рдо рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ test_bv рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдФрд░, рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, lit8 / 16/32/64 рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдХрд╛рд░ рдореЗрдВ 1, 2, 4 рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореВрд▓реНрдпред
рд╣рдо рдпрд╣ рд╕рдВрдХрд▓рди compn_n рд╢рдмреНрдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдХрд░рддреЗ рд╣реИрдВ # item compile_n compile_n: callb test_bv .byte b_dup .byte b_zeq .byte b_qnbranch8, 1f - . .byte b_drop, b_lit8, b_lit8 callb c_8 callb c_8 .byte b_exit 1: .byte b_dup, b_num1, b_eq, b_qnbranch8, 2f - ., b_drop, b_lit8, b_lit16 callb c_8 callb c_16 .byte b_exit 2: .byte b_num2, b_eq, b_qnbranch8, 3f - ., b_lit8, b_lit32 callb c_8 callb c_32 .byte b_exit 3: .byte b_lit8, b_lit64 callb c_8 callb c_64 .byte b_exit
рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
рдХрдорд╛рдВрдб рдФрд░ рд╢рд╛рдмреНрджрд┐рдХ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдЕрдм рдЗрд╕реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣ рд╕рдВрд╢реЛрдзрди рд╕рд░рд▓ рд╣реИред рдЬрд╣рд╛рдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд░рд╛рдЬреНрдп рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рд░рд╛рдЬреНрдп рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рд╢рдмреНрдж рдореЗрдВ рддрддреНрдХрд╛рд▓ рдзреНрд╡рдЬ рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ $ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЙрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдирдВрдмрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд░рд╛рдЬреНрдп рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдмрд╕ рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЦреНрдпрд╛ рдЫреЛрдбрд╝ рджреЗрдВ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ compile_n рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред
рдпрд╣рд╛рдБ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИ item interpret interpret: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_over .byte b_over .byte b_find .byte b_dup .byte b_qnbranch8 .byte 1f - . .byte b_mrot .byte b_drop .byte b_drop callb state .byte b_get .byte b_qnbranch8, irpt_execute - . # 0, .byte b_dup, b_get8, b_lit8, f_immediate, b_and # immediate .byte b_qbranch8, irpt_execute - . # - # ! callb _compile .byte b_branch8, 2f - . irpt_execute: .byte b_cfa # , (state = 0 immediate ) .byte b_execute .byte b_branch8, 2f - . 1: .byte b_drop .byte b_over, b_over .byte b_numberq # , .byte b_qbranch8, 3f - . # 0, , 3 .byte b_type # .byte b_strp # .byte 19 # .ascii " : word not found!\n" .byte b_quit # 3: .byte b_nip, b_nip # , ( b_over, b_over) # - callb state # , .byte b_get .byte b_qnbranch8, 2f - . # - ; - # callb compile_n 2: # .byte b_depth # .byte b_zlt # , 0 ( 0<) .byte b_qnbranch8, interpret_ok - . # , , .byte b_strp # .byte 14 .ascii "\nstack fault!\n" .byte b_quit # interpret_ok: .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit
рдЕрдм рд╣рдо рд╕рдВрдХрд▓рдХ рд╕реЗ рдПрдХ рдХрджрдо рджреВрд░ рд╣реИрдВ ...
рдирдП рд╢рдмреНрджреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ (рд╢рдмреНрдж ":")
рдЕрдм, рдпрджрд┐ рд╣рдо рд░рд╛рдЬреНрдп рдЪрд░ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛, рд╣рдо рдЗрд╕реЗ рди рддреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рд╣реА рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рдмреНрджрдХреЛрд╢ рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рди рдореЛрдб рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣реЗрдбрд░ рдореЗрдВ рдЭрдВрдбреЗ, рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдХрд╣рд╛рдиреА рд╣реИ - рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ 1, 2, 4 рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╢рдмреНрдж compile_1248 рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рджреЛ рдирдВрдмрд░ рд▓реЗрдЧрд╛ - рдСрдлрд╕реЗрдЯ рдФрд░ test_bv рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдореВрд▓реНрдпред
compile_1248 # , , # , test_dv item compile_1248 compile_1248: .byte b_dup .byte b_zeq .byte b_qnbranch8, 1f - . .byte b_drop callb c_8 .byte b_exit 1: .byte b_dup, b_num1, b_eq, b_qnbranch8, 2f - . .byte b_drop callb c_16 .byte b_exit 2: .byte b_num2, b_eq, b_qnbranch8, 3f - . callb c_32 .byte b_exit 3: callb c_64 .byte b_exit
рдЕрдм $ $ рд╢рдмреНрдж рдмрдирд╛рдПрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЬрдм рднреА рдЖрдкрдХреЛ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рджреЛ рдорд╛рди рд▓реЗрдЧрд╛ - рдирд┐рд░реНрдорд┐рдд рд╢рдмреНрдж рдХреЗ рдирд╛рдо рдХрд╛ рдкрддрд╛ рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИред рдЗрд╕ рд╢рдмреНрдж рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рд░реНрдорд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
$ рдмрдирд╛ # : $create here current @ @ here - test_bv dup c, compile_1248 -rot str, current @ ! ' var0 here c!; item "$create" create: callb here callb current .byte b_get, b_get callb here .byte b_sub callb test_bv .byte b_dup callb c_8 callb compile_1248 .byte b_mrot callb c_str # callb current .byte b_get, b_set # - var0, here # , - , # , # 1 allot , .byte b_lit8, b_var0 callb here .byte b_set8 .byte b_exit
рдЕрдЧрд▓рд╛ рд╢рдмреНрдж рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдирдП рд╢рдмреНрдж рдХреЗ рдирд╛рдо рдХреЛ рдЙрдард╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдб рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ $ create рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдмрдирд╛рдПрдЧрд╛ред
create_in item "create_in" create_in: .byte b_blword .byte b_dup .byte b_qbranch8 .byte 1f - . .byte b_strp # ( ) .byte 3f - 2f # 2: .ascii "\ncreate_in - name not found!\n" 3: .byte b_quit 1: callb create .byte b_exit
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╢рдмреНрдж ":" рдмрдирд╛рдПрдВред рдпрд╣ create_in рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдмрдирд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрдХрд▓рди рдореЛрдб рд╕реЗрдЯ рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрджрд┐ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рд╢рдмреНрдж ":" рдкрд░ рддрддреНрдХрд╛рд▓ рд╕рдВрдХреЗрдд рд╣реЛрдЧрд╛ред
рд╢рдмреНрдж: # : : create_in 1 state dup @ if ." : - no execute state!" then ! 110 ; immediate item ":", f_immediate colon: callb create_in .byte b_num1 callb state .byte b_dup .byte b_get .byte b_qnbranch8, 2f - . .byte b_strp # ( ) .byte 4f - 3f # 3: .ascii "\n: - no execute state!\n" 4: .byte b_quit 2: .byte b_set .byte b_lit8, 110 .byte b_exit
рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдХреЛрдб рдореЗрдВ рджреЗрдЦрд╛, рддреЛ рдЙрд╕рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╢рдмреНрдж рдХреБрдЫ рдФрд░ рд╣реИ :)
рдФрд░ рдпрд╣рд╛рдБ 110 рд╣реИ ???
рд╣рд╛рдВ, рдпрд╣ рд╢рдмреНрдж рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЦреНрдпрд╛ 110 рдХреЛ рднреА рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реАрд▓рд┐рдПред рдЬрдм рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рдг рдПрдХ рдкреВрд░реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдмрд╛рдж рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ ":" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ";" рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрдж рд╕реНрдЯреИрдХ рдкрд░ рдХреБрдЫ рдорд╛рди рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж ":" рдореВрд▓реНрдп 110 рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рд╢рдмреНрдж ";" рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ 110 рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ред
рд╕рдВрдХрд▓рдХ рдХреЗ рдРрд╕реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрдж рдмрдирд╛рдпреЗрдВрдЧреЗ - "рдЬреЛрдбрд╝реЗ"ред рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рджреЛ рдорд╛рди рд▓реЗрдЧрд╛, рдФрд░ рдпрджрд┐ рд╡реЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдВрдЧреЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрдХрд▓рди рдореЛрдб рд╕реЗрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП "рд░рд╛рдЬреНрдп" рд╢рдмреНрдж рдмрдирд╛рдПрдВред
рдЬреЛрдбрд╝реЗ? рд░рд╛рдЬреНрдп #: ?pairs = ifnot exit then ." \nerror: no pairs operators" quit then ; item "?pairs" .byte b_eq, b_qbranch8, 1f - . .byte b_strp .byte 3f - 2f 2: .ascii "\nerror: no pairs operators" 3: .byte b_quit 1: .byte b_exit #: ?state state @ 0= if abort" error: no compile state" then ; item "?state" callb state .byte b_get, b_zeq, b_qnbranch8, 1f - . .byte b_strp .byte 3f - 2f 2: .ascii "\nerror: no compile state" 3: .byte b_quit 1: .byte b_exit
рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдордиреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ :)
рд▓реЗрдХрд┐рди рдЕрдВрдд рддрдХ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрднреА рддрдХ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ...
рддреИрдпрд╛рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдУ
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╢рдмреНрдж ":" рдХреБрдЫ рд╕рд░рд▓ рд╕рдВрдХрд▓рди рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВ:
: ^2 dup * ;
рдпрд╣ рд╢рдмреНрдж рдЪреБрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ "?" рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рд╣рдо рд╢рдмреНрдж рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ "[" рд╢рдмреНрдж рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдореЛрдб рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдореВрд▓реНрдп 110 рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ: $ ./forth ( 0 ): > : ^2 dup * exit [ drop ( 0 ): > 4 ^2 ( 1 ): 16 >
рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЪрд▓реЛрдЬрд╛рд░реА рд░рдЦреЗрдВ ...рдЪреВрдВрдХрд┐ рд╣рдо рдХрд┐рд▓реЗ рдкрд░ рдХрд┐рд▓реЗ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ, рд╣рдореЗрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХрд┐рд▓реЗ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛, рдФрд░ рдХрдм рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд▓реЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рддреЗ рд╣реИрдВред рдХрд┐рд▓реЗ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдХреЛрдб рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдВ рдХреЗ рдкрддреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдореБрдлреНрдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░рдЦ рджреЗрдВрдЧреЗред рдмреЗрд╢рдХ, рд╣рдореЗрдВ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА "рднрдЧреЛрдбрд╝рд╛" рдХреА рдЧрддрд┐ рдирдИ рд╕реНрдореГрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдХрд┐рд▓реЗ рдкрд░ рд╕реНрд░реЛрдд рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред fcode: .ascii " 2 2 + . quit"
рд▓реЗрдХрд┐рди, рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рдПрдХ рджрд░реНрдЬрди рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИредрдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯрд╛рд░реНрдЯ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЯрд┐рдм, # рдЯреАрдм рдЗрд╕ рд▓рд╛рдЗрди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдмрд╛рдпреЛрдЯреЗрдХ рд╢реБрд░реВ рдХрд░рдирд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛ рдЧрдпрд╛ рд╣реИ start: .byte b_call16 .word forth - . - 2 .byte b_call16 .word last_item - . - 2 .byte b_call16 .word context - . - 2 .byte b_get .byte b_set .byte b_call16 .word vhere - . - 2 .byte b_dup .byte b_call16 .word h - . - 2 .byte b_set .byte b_call16 .word definitions - . - 2 .byte b_call16 .word tib - . - 2 .byte b_set .byte b_lit16 .word fcode_end - fcode .byte b_call16 .word ntib - . - 2 .byte b_set .byte b_call16 .word interpret - . - 2 .byte b_quit
рднрд╛рдЧреЛ! $ ./forth 4 ( 0 ): >
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛!
рдФрд░ рдЕрдм ...рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдХрдВрдкреЗрдпрд░ рдХрд░реЗрдВ
рдЕрдЧрд▓рд╛, рд╣рдо рдХреЛрдб рдХреЛ fcode рд▓рд╛рдЗрди рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдмрд╛рдд, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╢рдмреНрдж рд╣реИ ";"ред : ; ?state 110 ?pairs lit8 [ blword exit find cfa c@ c, ] c, 0 state ! exit [ current @ @ dup c@ 96 or swap c! drop
рдореИрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХрд░реВрдВрдЧрд╛ред ?state 110 ?pairs
рдпрд╣рд╛рдВ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рди рд╕реНрдерд┐рддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрдЯ рд╣реИ, рдФрд░ 110 рд╕реНрдЯреИрдХ рдкрд░ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЧрд▓рддреА рд╕реЗ рдПрдХ рд░реБрдХрд╛рд╡рдЯ рд╣реЛрдЧреАред lit8 [ blword exit find cfa c@ c, ]
рдпрд╣ рд╣рдо рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдЖрджреЗрд╢ рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд╕рд╛рде рд▓рд┐рдЯ рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдЬрд╛рдирд╛ рдерд╛, рд╢рдмреНрдж рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛, рдирд┐рд╖реНрдкрд╛рджрди рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдХрдорд╛рдВрдб рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рд╢рдмреНрдж рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдм рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдХреЗрд╡рд▓ "рд╕рдВрдХрд▓рд┐рдд рдирд┐рдХрд╛рд╕" рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ :) c, 0 state !
рдпрд╣ рдПрдХреНрдЬрд┐рдЯ рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрдм рд╢рдмреНрдж ";" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЛрдб рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ "[" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╕рдВрдХреЗрдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдРрд╕реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╢рдмреНрдж рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ "" рддрд╛рдХрд┐ рд╡реЗ рд╕рдВрдХрд▓рди рдореЛрдб рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВред exit [
рдЗрд╕рдХрд╛ рдЕрдиреБрднрд╡ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд╢рдмреНрдж рд╕рдВрдХрд▓рд┐рдд рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдореЛрдб рдмрдВрдж рд╣реИред рд╕рдм рдХреБрдЫ, рд╢рдмреНрдж "" рд╕рдВрдХрд▓рд┐рддред рдФрд░ рдЖрдЧреЗ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ? current @ @ dup c@ 96 or swap c! drop
рдЖрдкрдХреЛ рдирдП рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рддрддреНрдХрд╛рд▓ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрдХреЗрддрд┐рдд рдХреНрд░рдо рд╢рдмреНрдж рдбреНрд░реЙрдк рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд░рддрд╛ рд╣реИред рд╢рдмреНрдж рдбреНрд░реЙрдк, рднреВрд▓реЗ рд╣реБрдП 110 рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╢рдмреНрдж ":" рдХреЛ рд╕реГрдЬрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рдЦрд╛ рдерд╛редрдЕрдм рдпрд╣ рд╕рдм рд╣реИ!рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред $ ./forth ( 0 ): > : ^3 dup dup * * ; ( 0 ): > 6 ^3 . 216 ( 0 ): >
рд╡рд╣рд╛рдБ рд╣реИ!
рдпрд╣ рдкрд╣рд▓рд╛ рд╢рдмреНрдж рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рдВрдХрд▓рдХ рдиреЗ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рд▓рд┐рдП" рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИредрд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рд▓реВрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ ... рдЪрд▓реЛ рдПрдХ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХ рд╢рдмреНрдж рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рддрддреНрдХрд╛рд▓ред рдпрд╣ рдмрдирд╛рдП рдЧрдП рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдкрд░ рддрддреНрдХрд╛рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ: : immediate current @ @ dup c@ 96 or swap c! ;
рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо :) рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАредрдЖрдЗрдП рдЕрдм рдХреБрдЫ рдЫреЛрдЯреЗ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВ: : hex 16 base ! ; : decimal 10 base ! ; : bl 32 ; : tab 9 ; : lf 10 ;
рд╣реЗрдХреНрд╕ рдФрд░ рджрд╢рдорд▓рд╡ рдЗрд╕реА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕реЗрдЯ рдХрд░реЗрдВред рдмрд╛рдХреА рд▓реЛрдЧ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдг рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рд╣реИрдВредрд╣рдо рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрдж рднреА рдмрдирд╛рддреЗ рд╣реИрдВ:: c @ 1+ рдореВрд╡ рдХреЗ рдКрдкрд░ cmove;рдФрд░ рдЕрдм рд╣рдо рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдХреЛрдИ рд╢рдмреНрдж рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: : if ?state compile ?nbranch8 here 0 c, 111 ; immediate : then ?state 111 ?pairs dup here swap - swap c! ; immediate
рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпреЗ рд╕рднреА рд╢рдмреНрдж рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рди рдореЛрдб рд╕реЗрдЯ рд╣реИ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИредрдпрджрд┐ рд╢рдмреНрдж рдПрдХ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдЯ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЙрд╕ рдмрд╛рдЗрдЯ рдХреЗ рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп 111 рдХреЛ рдзрдХреЗрд▓рддрд╛ рд╣реИредрд╢рдмреНрдж рддрдм рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп 111 рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реНрдЯреИрдХ рдкрд░ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИредрдФрд░ рддреБрд░рдВрдд рд╢рдмреНрдж рдмрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдХрдорд╛рдВрдб рдХреЛ рджреВрд╕рд░реА рд╢рд╛рдЦрд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐, рд╕рдВрдХреНрд░рдордг рдСрдлрд╕реЗрдЯ рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╕ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрддреЗ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХреИрдЪ рд╕рдВрдХреНрд░рдордг рдХрд╛ рдкрддрд╛ рджреВрд╕рд░реА рд╢рд╛рдЦрд╛ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ :) рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдзрд┐рдХрддрдо рд╕рд░рд▓реАрдХреГрдд рдХреЛрдб рдХреЗ рдХрд╛рдо рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: : if compile ?nbranch8 here 0 c, ; immediate : then dup here swap - swap c! ; immediate
рдЦреИрд░, рдЕрдм рд╣рдо рдЕрд╕рд▓реА рдХреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢рдмреНрдж рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИ, рд╣рдо рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╕рдордп рдЙрд╕реА рдЪрд╛рд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ";"; : if ?state lit8 [ blword ?nbranch8 find cfa c@ c, ] c, here 0 c, 111 ; immediate : then ?state 111 ?pairs dup here swap - swap c! ; immediate : else ?state 111 ?pairs lit8 [ blword branch8 find cfa c@ c, ] c, here 0 c, swap dup here swap - swap c! 111 ; immediate
рдЕрдм рдЖрдк рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢рдмреНрдж рдЬреЛ 1000 рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ 5 рд╣реИрдВ, рдФрд░ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ 0: $ ./forth ( 0 ): > : test 5 = if 1000 . else 0 . then ; ( 0 ): > 22 test 0 ( 0 ): > 3 test 0 ( 0 ): > 5 test 1000 ( 0 ): >
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдиреЗ рддреБрд░рдВрдд рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереАрдВ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдереАред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рд╢рд░реНрддреЛрдВ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛!рд╕рдВрдХреНрд░рдордг рдЖрджреЗрд╢реЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░, , 127 . . , , . , , . 8 , 40 127 . , ?
. тАФ 16 .
. 16 тАФ . , , call, . , 11 ( 1023 ). 300 1000 . , . 3 , 8 . : (?nbranch), (?branch) (branch). тАФ 24 .
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреАрд╡рди рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ :)рдЪрд▓реЛ рдПрдХ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВред "(рдбреЙрдЯ-рдЙрджреНрдзрд░рдг) рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ." "
рдЖрдк рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╢рдмреНрдж рдХреЗ рдЙрдкрдХрд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛: : ." ?state 34 word dup if lit8 [ blword (.") find cfa c@ c, ] c, str, else drop then ; immediate
рдЗрд╕ рд╢рдмреНрдж рдХреЛ рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ (34 рд╢рдмреНрдж) рддрдХ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рддреЛ рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рдПрдХ рдирд┐рджрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╢рдмреНрдж рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ :) рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЗрд╕ рд╢рдмреНрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рджрд╛рди рдХреЗ рд╕рд╛рдередрдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб (ред ") рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб (рдХреЛрд╖реНрдардХ рдореЗрдВ рдЙрджреНрдзреГрдд рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди), рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдХрдорд╛рдВрдб рдХреЗ рдкреАрдЫреЗ рд╕рдВрдХрд▓рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред $ ./forth ( 0 ): > : test ." " ; ( 0 ): > test ( 0 ): >
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рд╢рдмреНрдж рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВредрдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдореЛрдб рдореЗрдВ рдЗрд╕ рд╢рдмреНрдж рдХреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЕрдЧрд▓реЗ рд╢рдмреНрдж рдХрд╛ рдирд╛рдо рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдвреВрдВрдвреЗрдВред рдФрд░ рдлрд┐рд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗ: рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдмрд╛рдЗрдЯ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╢рдмреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЛ рд╕рд╣рд╛рдпрдХ рд╢рдмреНрдж рдмрдирд╛рдПрдВрдЧреЗ: "(compile_b)" рдФрд░ "(compile_c)"ред(compile_b) рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ 64-рдмрд┐рдЯ рд╢рдмреНрдж рд╣реЛрдЧрд╛ - рдЬрд┐рд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХрд╛ рдкрддрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред(compile_c) рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдмрд╛рдЗрдЯ рд╣реЛрдЧрд╛ - рдХрдорд╛рдВрдб рдХреЛрдбредрдареАрдХ рд╣реИ, рд╢рдмреНрдж рдЦреБрдж рдХреЛ рдпрд╛ рддреЛ (compile_b) рдпрд╛ (compile_c) рд╕рдВрдЧрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛редрдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ (рд╕рдВрдХрд▓рди_рд╕реА),рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде: : (compile_c) r> dup c@ swap 1+ >rc, ;
рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдПрдХ рд╢рдмреНрдж рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ред (Compile_c) рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╛рдкрд╕реА рдкрддрд╛ рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреНрд░рд╛рдЗрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ рдХрд╛ рдкрддрд╛ рд╣реИред рдХреЙрд▓ рдХреЗ рд╕рдордп рдХреА рд╕реНрдерд┐рддрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИред A0 - рдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЛрдб, XX - рдХреЙрд▓ рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░ - рд╢рдмреНрдж рдХреЗ рдмрд╛рдЗрдЯ рдХреЛрдб рдХреЗ рдХреЙрд▓ рдПрдбреНрд░реЗрд╕ (рдСрдлрд╕реЗрдЯ) (compile_c)ред
рд╡рд╛рдкрд╕реА рдХрд╛ рдкрддрд╛ рдмрд╛рдЗрдЯ рдПрдирдПрди рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдХрдорд╛рдВрдб рдХреЗ рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╢рдмреНрдж рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП NN рд╢рдмреНрдж "compile_c" рдХрд╛ рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╕рдВрдХрд▓рд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдмрд╛рдЗрдЯ рдХреЛрдбред рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдЗрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдХрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрдХреНрд░рдо "r> рдбреБрдкреН рд╕реА @ рд╕реНрд╡реИрдк 1+> рдЖрд░" рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреНрд░рдо рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рд╕реЗ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдирд┐рдпрдорд┐рдд рд╕реНрдЯреИрдХ рддрдХ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕), рдФрд░ рдЗрд╕реЗ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╢реЗрд╖ рдХрдорд╛рдВрдб "c", рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред(compile_b) рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ: : (compile_b) r> dup @ swap 8 + >r compile_b ;
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ 64-рдмрд┐рдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢рдмреНрдж рд╕рдВрдХрд▓рди рд╕рдВрдХрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрдж рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИредрдФрд░ рдЕрдм рд╢рдмреНрдж рд╕рдВрдХрд▓рд┐рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд░реНрдЪрд╛ рд╣реИ, рдпрд╣ рд╢рдмреНрдж рдХрд╛ рдирд╛рдо рдкрдврд╝рддрд╛ рд╣реИ, рдЗрд╕реЗ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реЗ рджреЛ рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдФрд░ рд╡рд┐рдЪреНрдЫреЗрджрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИредрд╢рдмреНрдж рд╕рдВрдХрд▓рди : compile blword over over find dup if dup c@ 128 and if cfa c@ (compile_b) [ blword (compile_c) find cfa , ] c, else cfa (compile_b) [ blword (compile_b) find cfa , ] , then drop drop else drop ." compile: " type ." - not found" then ; immediate
рдмрдирд╛рдП рдЧрдП рд╢рдмреНрдж рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреА рдорджрдж рд╕реЗ, ifnot рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВред : ifnot ?state compile ?branch8 here 0 c, 111 ; immediate
рдЗрд╕реЗ рджреЗрдЦреЗрдВ! $ ./forth ( 0 ): > : test 5 = ifnot 1000 . else 0 . then ; ( 0 ): > 22 test 1000 ( 0 ): > 3 test 1000 ( 0 ): > 5 test 0 ( 0 ): >
рд╕рдм рдареАрдХ рд╣реИ! рдФрд░ рдпрд╣ рдЪрдХреНрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ ...рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдПрдХ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рдмрдирд╛рдПрдВрдЧреЗред рдХрд┐рд▓реЗ рдореЗрдВ рдПрдХ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдПрдХ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВредрдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ ... рдЬрдм рддрдХред рдЬрдм рддрдХ рд╢рдмреНрдж рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рди рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИредрджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ ... рдЬрдмрдХрд┐ ... рджреЛрд╣рд░рд╛рдПрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЪреЗрдХ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╢рдмреНрдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдорд╛рди рд╢реВрдиреНрдп рд╣реИ, рддреЛ рд▓реВрдк рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИредрдХрд┐рд▓реЗ рдкрд░ рдЪрдХреНрд░реЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕реЗ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ - рд╕рд╢рд░реНрдд рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рдкрд░ред рдореИрдВ рдХреЛрдб рд▓рд╛рддрд╛ рд╣реВрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред : begin ?state here 112 ; immediate : until ?state 112 ?pairs compile ?nbranch8 here - c, ; immediate : while ?state 112 ?pairs compile ?nbranch8 here 0 c, 113 ; immediate : repeat ?state 113 ?pairs swap compile branch8 here - c, dup here swap - swap c! ; immediate
рдЖрдЬ рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмрд╣реБрдд рдХрдо рдмрдЪрд╛ рд╣реИред рдЬрд┐рди рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рд╣реИрдВред рдФрд░ рдпрд╣ рдирд┐рдХрд╛рд╕ рд▓реВрдк рдХрдорд╛рдВрдб рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рднреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реА рдмрд╛рд░ рдХрд░реЗрдВрдЧреЗредрд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рд╛рдЗрдХрд┐рд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдерд╛!рд╣рдо рдпрд╣ рдорд╛рдирдХ рд╢рдмреНрдж рд╢рдмреНрдж рд▓рд┐рдЦрдХрд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрдВрддрддрдГ рдЕрдкрдирд╛ рд╢рдмреНрджрдХреЛрд╢ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рд╢рдмреНрдж рд▓рд┐рдВрдХ @ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдбрд┐рдХреНрд╢рдирд░реА рдПрдВрдЯреНрд░реА (рдкрд┐рдЫрд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдСрдлрд╝рд╕реЗрдЯ) рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЖрдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: 1, 2, 4 рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕ред рдпрд╣ рд╢рдмреНрдж рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдкрддреЗ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреЛ рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛: рдирд╛рдо рдлрд╝реАрд▓реНрдб рдХрд╛ рдкрддрд╛ рдФрд░ рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдорд╛рдиред : link@ dup c@ 3 and swap 1+ swap dup 0= if drop dup 1+ swap c@ else dup 1 = if drop dup 2 + swap w@ else 2 = if drop dup 4 + swap i@ else drop dup 8 + swap @ then then then ;
рдФрд░ рдЕрдм рдЖрдк рд╢рдмреНрдж рд╢рдмреНрдж рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: : words context @ @ 0 begin + dup link@ swap count type tab emit dup 0= until drop drop ;
рд▓реЙрдиреНрдЪ рд╣реЛ рд░рд╣рд╛ рд╣реИ ... $ ./forth ( 0 ): > words words link@ repeat while until begin ifnot compile (compile_b) (compile_c) ." else then if cmove tab bl decimal hex immediate ; bye ?state ?pairs : str, interpret $compile compile_b compile_n compile_1248 compile_c c, w, i, , allot here h test_bv test_bvc [ ] state .s >in #tib tib . #> #s 60 # hold span holdpoint holdbuf base quit execute cfa find word blword var16 var8 (.") (") count emit expect type lshift rshift invert xor or and >= <= > < = 0> 0< 0= bfind compare syscall fill move rpick r@ r> >r -! +! i! i@ w! w@ c! c@ ! @ depth roll pick over -rot rot swap drop dup abs /mod mod / * - + 1+ 1- exit ?nbranch16 ?nbranch8 ?branch16 ?branch8 branch16 branch8 call8b0 call64 call32 call16 call8f lit64 lit32 lit16 lit8 8 4 3 2 1 0 context definitions current forth ( 0 ): >
рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рд╣рдорд╛рд░реА рд╕рдВрдкрддреНрддрд┐ :)рдореИрдВ рд╕рдм рдХреБрдЫ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ ... рдирд╣реАрдВ, рдЪрд▓реЛ рдлрд┐рд░ рднреА рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рди рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд┐рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИредрд╣рдо рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ, рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП syscall рдХрдорд╛рдВрдб рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред : file_open 0 0 0 2 syscall ; : file_close 0 0 0 0 0 3 syscall ; : file_read 0 0 0 0 syscall ; : file_O_RDONLY 0 ; : file_O_WRONLY 1 ; : file_O_RDWR 3 ;
рдЕрдм рдЖрдк рд╢реБрд░реБрдЖрдд рд╢рдмреНрдж _start рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: : _start 0 pick 1 > if 2 pick file_O_RDONLY 0 file_open dup 0< if .\" error: \" . quit then dup here 32 + 32768 file_read dup 0< if .\" error: \" . quit then swap file_close drop #tib ! here 32 + tib ! 0 >in ! interpret then ;
рдпрд╣ рд╢рдмреНрдж рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рд╣реЛрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдлреЛрд░реНрдЯ-рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рдм рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдЧрд╛ред рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рд╢рдмреНрджреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдФрд░ рдЙрдирдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдиред рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд▓реЙрдиреНрдЪ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред _Start рд╢рдмреНрдж рдЙрдирдХреЗ рдкрд╛рд╕ рдХрдорд╛рдВрдб реж рдкрд┐рдХ (рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) рдФрд░ реи рдкрд┐рдХ (рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░) рдХреЗ рд╕рд╛рде рдкрд╣реБрдВрдЪреЗрдЧрд╛ред рдПрдХ рдХрд┐рд▓реЗ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП, рдпреЗ рдореВрд▓реНрдп рдвреЗрд░ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрд┐рдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 32 рдХреЗрдмреА рддрдХ рд╕реАрдорд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рд╣реИредрдЕрдм рдпрд╣ рдЕрдВрдд рдореЗрдВ fcode рд▓рд╛рдЗрди рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ: _start quit
рдПрдХ рдлрд╝рд╛рдЗрд▓ test.f рдмрдирд╛рдПрдВ рдФрд░ рдХрд┐рд▓реЗ рдкрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рд▓рд┐рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо: : NOD begin over over <> while over over > if swap over - swap else over - then repeat drop ; 23101 44425 NOD . bye
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
$ ./forth test.f 1777 Bye! $
рдЙрддреНрддрд░ рд╕рд╣реА рд╣реИред рд╢рдмреНрдж рд╕рдВрдХрд▓рд┐рдд рдерд╛, рдлрд┐рд░ рдкреВрд░рд╛ рд╣реБрдЖред рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдк-рдХрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЧрдИ рдереАред рдпрджрд┐ рдЖрдк рдЕрдВрддрд┐рдо рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ NOD рд╢рдмреНрдж рдХреЛ рд╢рдмреНрджрдХреЛрд╖ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕рдХреЗ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ :-)рд╡рд╣ рд╕рдм рд╣реИред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдЖрдк G86ub рд╕реЗ x86-64 рдкрд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдпрд╛ рд░реЗрдбреАрдореЗрдб рдмрд╛рдЗрдирд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/hal9000cc/forth64рд╕реНрд░реЛрдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ GNU GPL v2 DCH v1 - рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ :-)