PDA

View Full Version : حرفه ای: ساخت گام به گام برنامه Paint توسط زبان اسمبلی



مرتضی تقدمی
جمعه 22 مهر 1390, 22:43 عصر
با سلام
دوستان قراره تو این تاپیک ساخت یک برنامه شبیه paint ویندوز رو از ابتدا شروع کنیم. چون این برنامه, موضوع پروژه درس برنامه نویسی سیستم این ترم منه, لذا قراره بصورت پایه ای شروع به برنامه نویسی و ساخت paint کنیم. در ابتدا برنامه بصورت ساده و ابتدایی شروع به ساخت میشه و کم کم امکانات بسیاری به اون اضافه خواهد شد. فقط چون من توی اسمبلی professional نیستم به کمک تک تک شما دوستان نیاز دارم. مطمئنا در پایان این تاپیک, یک برنامه خوب و زیبایی از paint طراحی شده توسط خودمون خواهیم داشت.
سعی و تلاش من توی این زمینه بسیار زیاد خواهد بود و سعی می کنم که کدهای برنامه بصورت حرفه ای و همچنین ماکرو و تایع نوشته بشن تا در پایان یک مرجع مناسب برای رفع مشکلات کاربران دیگه باشه.

من یک برنامه که مربوط به پروژه ترم پیشمه با عنوان مربع جادویی توی این تاپیک گذاشتم (http://barnamenevis.org/showthread.php?309099-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%85%D8%B1%D8%A8%D8%B9-%D8%AC%D8%A7%D8%AF%D9%88%DB%8C%DB%8C)که می تونیم برای ساخت این برنامه paint از اون ایده هایی بگیریم.

از پست بعد انشاءا... کار رو شروع می کنیم. در این راه به کمک و راهنمایی تمامی دوستان نیاز دارم.
امیدوارم که به نتیجه مطلوب برسیم.
موفق باشید. :چشمک:

برنامه گام اول آماده شد.
برنامه گام دوم آماده شد.
برنامه گام سوم آماده شد.

مرتضی تقدمی
جمعه 22 مهر 1390, 22:57 عصر
سلام
خب توی گام اول قراره که برنامه ما توسط کلیدهای جهت دار, خطوطی رو رسم کنه. با این قابلیت که با زدن دکمه space بتونیم موقتا رسم خط رو متوقف کنیم تا توسط کلیدهای جهت دار به مکان مورد نظر بریم و کار رو ادامه بدیم.

یک سوالی از دوستان دارم اینکه من الان توسط کدهای زیر به مد گرافیک رفتم.


MOV AH,00H
MOV AL,12H
INT 10H

حالا می خوام که به مکان مورد نظرم توی صفحه پرش کنم. اما چون من توی مد تکست با این کار کردم, توی مد گرافیک نمی تونم جواب بگیرم.
دوستان در این مورد راهنمایی کنن که من ادامه کاراش رو خودم انجام بدم. روی همین گیر کردم.
راستی از برنامه ای که توی پست بالا گفتم می تونین کمک بگیرین.
ممنون
موفق باشید

unknown.unforgiven
جمعه 22 مهر 1390, 23:15 عصر
سلام

حالا می خوام که به مکان مورد نظرم توی صفحه پرش کنم. اما چون من توی مد تکست با این کار کردم, توی مد گرافیک نمی تونم جواب بگیرم.
منظورتون رو نفهمیدم، اگر بیشتر توضیح بدید شاید بتونم کمکتون کنم. آیا میخواید یه پیکسل رو set کنید؟

مرتضی تقدمی
جمعه 22 مهر 1390, 23:23 عصر
سلام

منظورتون رو نفهمیدم، اگر بیشتر توضیح بدید شاید بتونم کمکتون کنم. آیا میخواید یه پیکسل رو set کنید؟

سلام
فرض کنید توی نقطه 0,0 هستم. می خوام به نقطه 100,50 پرش کنم. اما توی مد گرافیک.
ممنون

unknown.unforgiven
جمعه 22 مهر 1390, 23:34 عصر
منظورتون از پرش رو هنوزم متوجه نشدم. توی مد گرافیکی چیزی مثل cursor نداریم که بخوایم اون رو به جایی منتقل بکنیم، مگر اینکه منظورتون نقطه ای باشه که قراره توش یه رنگی رسم بشه. اگر منظورتون همینه فقط لازمه که مختصات رو توی دو تا متغیر قرار بدید و البته یه زیربرنامه برای رسم پیکسل داشته باشید. برای جا به جا کردن نقطه هم میتونید از مقداردهی به همون دو تا متغیر استفاده کنید

مرتضی تقدمی
جمعه 22 مهر 1390, 23:41 عصر
ممنون. ببینید من توی مد تکست می تونستم از یک نقطه به نقطه دیگه صفحه پرش کنم و متن مورد نظرم رو اونجا چاپ کنم. اما حالا توی مد گرافیک مثل اینکه اوضاع فرق کرده. من هدفم اینه که با کلید جهت نما, مکان نما رو به یه جای دیگه منتقل کنم. برای این کار باید مقدار های x و y رو اضافه یا کم کنیم و بعد مکان نما رو به همون نقطه منتقلش کنیم. همین جوریه دیگه ؟ حالا اگه میشه راهنمایی کنید.
ممنون

xman_1365_x
شنبه 23 مهر 1390, 05:42 صبح
حالا می خوام که به مکان مورد نظرم توی صفحه پرش کنم. اما چون من توی مد تکست با این کار کردم, توی مد گرافیک نمی تونم جواب بگیرم.
قبلا این برنامه رو توی تالار دیده بودم،جستجو کنید.
در این ارتباط شما درمد گرافیک با پیکسل ها سرو کار دارین که میتونیدبه گرافیک مستقیم دسترسی داشته باشین(سرعت بیشتر و سخت تر) یا با وقفه بایوس (آسون تر و کندتر)
int10 (http://www.skynet.ie/~darkstar/assembler/intlist.html)
graphics mode and example src (http://www.skynet.ie/~darkstar/assembler/tut6.html)
Graphics with Direct Memory Access. (http://www.skynet.ie/~darkstar/assembler/tut7.html)
شما اول با پیکسل ها ظاهر برنامه رو درست کن،بعد یک پیکسل سیاه یا به رنگ زمینه(خنثی) در وسط صفحه رسم کنید و بعد در صورت فشرده شدن کلید خاص کار مورد نظر رو انجام بدین
فقط باید چک کنید از بازه مشخص خارج نشید و یا شدین چه کاری انجام بشه
صفحه هم 2 بعدی هست و بر اساس ایکس و ایگرگ مشخص میکنید در لینک هایی که گذاشتم نمونه هست کارتون راه میوفته
موفق باشی

xman_1365_x
شنبه 23 مهر 1390, 05:45 صبح
اینم ببنید بد نیست
Graphical programming in Assembly (DOS) (http://www.wagemakers.be/english/doc/vga)

مرتضی تقدمی
شنبه 23 مهر 1390, 10:43 صبح
سلام
دوستان من با این کدها تونستم به نقطه x,y برم. اما مشکل اینه که من حتما باید رنگ پیکسل رو مشخص کنم! یعنی اگر مثلا رنگ زمینه سفید باشه و من رنگ مشکی رو انتخاب کرده باشم, اینجوری اون پیکسل روشن میشه و برعکس, که من نمی خوام این اتفاق بیافته. لطفا راه حل ؟



mov ah,0ch
mov bh,0
mov al,02
mov cx,y
mov dx,x
int 10h


موفق باشید

xman_1365_x
شنبه 23 مهر 1390, 14:11 عصر
با این کدها تونستم به نقطه x,y برم. اما مشکل اینه که من حتما باید رنگ پیکسل رو مشخص کنم! یعنی اگر مثلا رنگ زمینه سفید باشه و من رنگ مشکی رو انتخاب کرده باشم, اینجوری اون پیکسل روشن میشه و برعکس, که من نمی خوام این اتفاق بیافته. لطفا راه حل ؟
در پست قبل گفتم همه کارتون با با ارتباط مستقیم یا وقفه قابل انجام هست شما داری با وقفه کار میکنی پس از وقفه زیر برای گرفتن رنگ اون پیکسل استفاده کنید بعد al هرچی بود نسبتش بدین به پیکسل گذاری بعد(همون پیکسل خنثی که گفتم)
INT 10h / AH = 0Dh - get color of a single pixel.

input:
CX = column.
DX = row.
output:
AL = pixel color

مرتضی تقدمی
چهارشنبه 27 مهر 1390, 09:58 صبح
سلام
برنامه مرحله اول آماده شد.
در این برنامه ساده توسط کلیدهای جهت دار می تونیم خطوطی رو روی صفحه رسم کنیم. توسط کلید space هم می تونیم تعیین کنیم که خط رسم شود یا خیر.
موفق باشید

مرتضی تقدمی
پنج شنبه 05 آبان 1390, 23:47 عصر
سلام
برنامه مرحله دوم آماده شد.
در این برنامه علاوه بر قابلیت های برنامه مرحله اول, می تونیم رنگ خطوط رسم شده رو هم انتخاب کنیم. همچنین مشکلی که در رسم خطوط روی هم در مرحله قبل وجود داشت رفع گردید.
موفق باشید

مرتضی تقدمی
پنج شنبه 03 آذر 1390, 01:28 صبح
سلام
مثل اینکه کسی ازین تاپیک خوشش نیومده!!
بهرحال...
برنامه پینت ما فعلا تا اینجا زسیده که این امکانات به اون اضافه شده :
مد گرافیکی
نمایش ماوس
تنظیم محدوده رسم
جعبه رنگ
رسم مستطیل
و پاک کن.
تا اینجا فعلا دست و پا شکسته آماده شده! منتها دوتا مشکل دارم. یکی برای رسم خط و یکی هم برای قابلیت fill. برای رسم خط من از الگوریتم برزنهام می خواستم حل کنم که نشد. چون توی اسمبلی چیزی به نام اعشار نداریم به خاطر همین خط دقیق رسم نمیشه و با مشکلاتی مواجه است. در مورد قابلیت fill هم اینکه من هیچ چیزی در موردش نمی دونم!
اگه کسی در خصوص این دو مشکل می تونه راهنمایی کنه ممنون میشم.
موفق باشید

xman_1365_x
پنج شنبه 03 آذر 1390, 22:45 عصر
تا اینجا فعلا دست و پا شکسته آماده شده! منتها دوتا مشکل دارم. یکی برای رسم خط و یکی هم برای قابلیت fill. برای رسم خط من از الگوریتم برزنهام می خواستم حل کنم که نشد. چون توی اسمبلی چیزی به نام اعشار نداریم به خاطر همین خط دقیق رسم نمیشه و با مشکلاتی مواجه است. در مورد قابلیت fill هم اینکه من هیچ چیزی در موردش نمی دونم!
کتاب زیر و فصل مربوطه برای حل مشکل اول
Graphics Programming Black Book by Michael Abrash
Chapter 35: Bresenham Is Fast, and Fast Is Good
در اسمبلی اعشار نداریم؟ بخش fpu کارش چیه پس ؟ البته در سطح وقفه ها و کار با اعداد صحیح همون کتاب بالا مشکلتون رو حل میکنه
در ارتباط با fill کردن برنامه paint در ویندوز سون رو اجرا کنید چند نمونه ساده از این قابلیت رو اعمال کنید، متوجه میشین

مرتضی تقدمی
پنج شنبه 24 آذر 1390, 23:40 عصر
سلام

بعد از چند هفته کار کردن روی برنامه پینت, این امکانات رو بهش اضافه کردم:
مد گرافیکی
نمایش ماوس
تنظیم محدوده رسم
جعبه رنگ
رسم مستطیل
ابزار Fill
و پاک کن

فایل سورس برنامه رو ضمیمه پست کردم که دوستان استفاده کنن.

مرتضی تقدمی
پنج شنبه 24 آذر 1390, 23:42 عصر
سلام
برنامه مرحله سوم آماده شد.
بعد از چند هفته کار کردن روی برنامه پینت, این امکانات رو بهش اضافه کردم:
مد گرافیکی
نمایش ماوس
تنظیم محدوده رسم
جعبه رنگ
رسم مستطیل
ابزار Fill
و پاک کن

فایل سورس برنامه رو ضمیمه پست کردم که دوستان استفاده کنن.
موفق باشید.

مرتضی تقدمی
پنج شنبه 24 آذر 1390, 23:56 عصر
برنامه مرحله سوم رو برای دانلود گذاشتم, اما هنوز مشکل رسم خط توی اون حل نشده. کتابی که آقای xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x) معرفی کردند رو در حد چند دقیقه مطالعه کردم دیدم راه حلش خیلی طولانیه بی خیال خط شدم!!
یه قابلیت دیگه استادمون گفته به این برنامه اضافه کنیم. قابلیت ذخیره تصویر رسم شده در فایل و بعد لود کردن اون. به نظر آسون میاد. اما دوستان اگه فکری به نظرشون میرسه و یا قطعه کد آماده ای دارن, اینجا بزارن تا کار برنامه زودتر تموم شه.
در ضمن اگه کسی هم نظری در مورد برنامه داره بده.
ممنون
موفق باشید

xman_1365_x
جمعه 25 آذر 1390, 18:50 عصر
برنامه مرحله سوم رو برای دانلود گذاشتم, اما هنوز مشکل رسم خط توی اون حل نشده. کتابی که آقای xman_1365_x معرفی کردند رو در حد چند دقیقه مطالعه کردم دیدم راه حلش خیلی طولانیه بی خیال خط شدم!!
خوب دوست عزیز، اون کتاب برای کارهای گرافیکی واقعا خوب و و مرجعی کامل با 70 فصل هست که برای رسم خط ،دایره و اشکال دیگه الگوریتم های مختلف رو گفته،روش ساده تر که نیاز شما رو برطرف میکنه فصل 12 از کتاب سید رضی هست.

یه قابلیت دیگه استادمون گفته به این برنامه اضافه کنیم. قابلیت ذخیره تصویر رسم شده در فایل و بعد لود کردن اون. به نظر آسون میاد. اما دوستان اگه فکری به نظرشون میرسه و یا قطعه کد آماده ای دارن, اینجا بزارن تا کار برنامه زودتر تموم شه.
باید یک ساختاری رو تعریف کنید که وضعیت هر پیکسل رو بخونید و به طریقی که بتونید بازیابی کنید در فایل ذخیره کنید.

در ضمن اگه کسی هم نظری در مورد برنامه داره بده.
متاسفانه هنوز برنامتون رو ندیدم ، در اولین فرصت که دیدم نظر میدم
موفق باشی

n3gkid
شنبه 07 اردیبهشت 1392, 10:42 صبح
عزیز کجا ضمیمه کردین فقط تا قسمت دوم هست که باقیش نیست !! ؟
میشه لطفا کل پروژه رو بزارید
خیلی ممنون اولین سایت ایرانی بود که دیدم توش اینجوری توضیح داده ممنون
راستی داخل برنامه خط ها رو هم کنارش توضیح دادین ؟


سلام

بعد از چند هفته کار کردن روی برنامه پینت, این امکانات رو بهش اضافه کردم:
مد گرافیکی
نمایش ماوس
تنظیم محدوده رسم
جعبه رنگ
رسم مستطیل
ابزار Fill
و پاک کن

فایل سورس برنامه رو ضمیمه پست کردم که دوستان استفاده کنن.

n3gkid
شنبه 07 اردیبهشت 1392, 10:57 صبح
سلام
برنامه مرحله دوم آماده شد.
در این برنامه علاوه بر قابلیت های برنامه مرحله اول, می تونیم رنگ خطوط رسم شده رو هم انتخاب کنیم. همچنین مشکلی که در رسم خطوط روی هم در مرحله قبل وجود داشت رفع گردید.
موفق باشید

چجوری اجرا میشه دوست عزیز ؟
فایل exe ؤو باز میکنم اما اجرا نمیشه

سارا ایمانی
دوشنبه 17 تیر 1392, 08:28 صبح
سلام
ببخشید گفتید که فایل مرحله سوم رو ضمیمه کردید اما نیست فقط دو فایل مرحله اول و دوم هستش میشه خواهشا یه بررسی کنید واقعا بهش احتیاج دارم
ممنون میشم

aliphp1
سه شنبه 03 دی 1392, 16:00 عصر
منم قصد دارم همچین برنامه ای بنویسم لطفا آخرین کد هایی که نوشتید رو قرار بدید تا ببینم می تونم کمکی بکنم و شاید هم کد های شما کمکی به من بکنه
ممنون