PDA

View Full Version : ترکیب Text Mode و Graphic Mode



سار
چهارشنبه 01 تیر 1384, 17:09 عصر
آیا راهی برای ترکیب حالت متنی و گرافیکی هست؟
یعنی زمانی که داریم یک تکس رو نشون میدیم بتونیم کار گرافیکی هم بکنیم.

Inprise
جمعه 03 تیر 1384, 03:44 صبح
میتونی یک برنامهء کنسول ایجاد کنی و هدر مربوط به ویندوز رو اضافه کنی و هر وقت خواستی پیام یا پنجره های دلخواهت رو بسازی و نمایش بدی

سار
شنبه 04 تیر 1384, 21:01 عصر
ضمن تشکر از شما دوست عریز
ولی منظور من در داس و سی تحت داس بود.
در واقع هدف ساخت سیستمی است که بتواند در یک لحضه هر دو مد را نمایش دهد.
امکان این کار باید باشه یکی از دوستان استفاده از CRC Control را پیشنهاد کرد.

ممکنه در این مورد توضح بدید؟

سار
دوشنبه 06 تیر 1384, 20:22 عصر
یعنی این سوال جوابی نداره؟!
پس چطوی تو بانکها این کار رو کردن و یا مثلا در زرنگار رمانی که دارید فوت رو عوض میکنید!!!

seyedof
سه شنبه 07 تیر 1384, 10:42 صبح
سلام
CRC Check چه ربطی به گرافیک دارد؟ ضمنا در مود گرافیک میشه متن نشون داد ولی برعکسش نمیشه. چون در مود متن به پیکسلهای صفحه دسترسی ندارید و فقط کاراکتر رو متوجه میشه. ولیکن یه راه کلکی هست. در کارتهای VGA به بالا در واقع توانایی نمایش ۵۱۲ کاراکتر (به جای ۲۵۶) کاراکتر همزمان وجود داره. خیلی از برنامه های قدیمی از این موضوع استفاده میکردند و در ۲۵۶ کاراکتر اول فونتهای متنی و در ۲۵۶ کاراکتر دوم جدول فونتش رو خودشون تعریف میکردند تا بشه یک سری شکلهای گرافیکی رو هم نمایش داد. برای اینکار باید بیت مپ مورد نظر رو اول به یک سری مربع ۱۶*۸ تبدیل کنید بعد هر کدوم از این مربعها رو به عنوان یک فونت به سیستم بدین. اوونوقت با در واقع نوشتن این کاراکترها، بیت مپ اولیه روی صفحه ظاهر میشه.
ممنون علی

سار
سه شنبه 07 تیر 1384, 21:07 عصر
سلام
CRC Check چه ربطی به گرافیک دارد؟ ضمنا در مود گرافیک میشه متن نشون داد ولی برعکسش نمیشه. چون در مود متن به پیکسلهای صفحه دسترسی ندارید و فقط کاراکتر رو متوجه میشه. ولیکن یه راه کلکی هست. در کارتهای VGA به بالا در واقع توانایی نمایش ۵۱۲ کاراکتر (به جای ۲۵۶) کاراکتر همزمان وجود داره. خیلی از برنامه های قدیمی از این موضوع استفاده میکردند و در ۲۵۶ کاراکتر اول فونتهای متنی و در ۲۵۶ کاراکتر دوم جدول فونتش رو خودشون تعریف میکردند تا بشه یک سری شکلهای گرافیکی رو هم نمایش داد. برای اینکار باید بیت مپ مورد نظر رو اول به یک سری مربع ۱۶*۸ تبدیل کنید بعد هر کدوم از این مربعها رو به عنوان یک فونت به سیستم بدین. اوونوقت با در واقع نوشتن این کاراکترها، بیت مپ اولیه روی صفحه ظاهر میشه.
ممنون علی

راستش ربطش رو نمیدونم!!!
اون یه توصیه از طرف دوستی بود که حالا بهش دسترسی ندارم.


اما اگر اشتباه نکنم چیزی که گفتید در مورد ساخت فونت در داس بود، درسته؟
اما من از ترکیب این دو مد حرف میزنم.
میدونم که در کارت گرافیک حافطه این دو مد فرق میکنه ولی میشه بگید مثلا در نرم افزارهای بانک زمانی که فیلد امضا نشون داشده میشه اونها چز کار کردن، چون من خودم صبح ها در بانک هستم میبینم که این کار شده!!!
ما کاملا در مد متنی هستیم ولی زمانی که امضا مشتری دیده میشه در همون حالت متنی قسمتی از صفحه گرافیکی میشه و امضا به نمایش در میاد در حالی که ما بقی قسمتها به شکل متنی هستن!!!!!
چطور چنین چیزی امکان داره؟
یا واقعا مد مد گرافیکی هست یا ترکیبی از این دو مد هست.
این کار چطور امکان پذیر شده؟!

seyedof
سه شنبه 07 تیر 1384, 22:09 عصر
سلام
اگر دقت کنید چیزی که من توضیح دادم دقیقا ترفندی بود برای نمایش گرافیک در مود متن نه در مورد ساخت فونت در داس.
در واقع اوون گرافیکها هم با یک سری فونت ساخته میشن چون نمایش گرافیک در مود متن غیر ممکن است.
نمونه اش لوگویی است که بایوس سیستم موقع روشن شدن کامپیوتر نشون میده.

ممنون علی

سار
چهارشنبه 08 تیر 1384, 18:24 عصر
سلام
اگر دقت کنید چیزی که من توضیح دادم دقیقا ترفندی بود برای نمایش گرافیک در مود متن نه در مورد ساخت فونت در داس.
در واقع اوون گرافیکها هم با یک سری فونت ساخته میشن چون نمایش گرافیک در مود متن غیر ممکن است.
نمونه اش لوگویی است که بایوس سیستم موقع روشن شدن کامپیوتر نشون میده.

ممنون علی

تشکر :flower:

rezaTavak
پنج شنبه 09 تیر 1384, 08:12 صبح
سلام

از کجا مطمئنید که در مد متن هستید؟

سار
جمعه 10 تیر 1384, 18:46 عصر
ضمن تشکر از همه دوستانی که به این موضوع توجه کردن میخوام خواهش کنم که اگر ممکن هست برنامه ای رو که فرستام رو کنترل کنید و نتیجه آنالیز خودتون رو بگید ، که آیا این برنامه در مد تکست هست یا گرافیک و چطور چنین کاری کرده.

لطفا برنامه را در داس(Command or CMD) اجرا کنیدو قبل از اجرا دستوی را اجرا کنید که صفحه پر از کاراکتر شود مثلا Dir یا چیزی شبیح این.

خواهش میکنم نتیجه برسیتون رو به من هم بگید.

quack
جمعه 10 تیر 1384, 21:46 عصر
سلام
اگه می خوای توی مد گرافیک بنویسی settext و settextxy()

و برای خواندن هم می تونی کلید بخونی

سار
شنبه 11 تیر 1384, 16:26 عصر
سلام

از کجا مطمئنید که در مد متن هستید؟

سعی میکنم چند عکس از این برنامه رو اینجا بزارم تا شما هم پیرامون آن نظر بدید.

Iran-PC
جمعه 11 آذر 1384, 15:59 عصر
سلام
تونستید این مساله رو حل کنید؟

البته شما فایلی نگذاشتید.
اما من خودم برنامه ای رو دیدم که تو محیط تکست گرافیک نمایش میداد.
چطوری رو نمیدونم.
لطفا نتیجه تحقیقتونو بگید.

PalizeSoftware
جمعه 11 آذر 1384, 16:18 عصر
احتمالا صبحت دوست شما پیرامون CRT Controller بوده.
برنامه زیر رو در مد داس اجرا کنید تا ببینید که مد متن با همه محدودیت‌ها کارهای جالبی می‌شه در اون انجام داد. دقیقا از 256 مجموعه دوم کاراکترها استفاده شده.

aakh1361
جمعه 11 آذر 1384, 18:19 عصر
احتمالا صبحت دوست شما پیرامون CRT Controller بوده.
برنامه زیر رو در مد داس اجرا کنید تا ببینید که مد متن با همه محدودیت‌ها کارهای جالبی می‌شه در اون انجام داد. دقیقا از 256 مجموعه دوم کاراکترها استفاده شده.
بی انصاف لاقل سورس رو هم میزاشتی:گریه: :گریه:
فقط می خواستی ما رو بزاری تو کف :گیج: :kaf: :kaf: :گیج:

PalizeSoftware
جمعه 11 آذر 1384, 18:40 عصر
باور کنید که سورس از بین رفته والا حتما می‌ذاشتم. برمی‌گرده به 4-5 سال پیش که با اسمبلی حال می‌کردم.
جالب بدونید که این برنامه با QBasic 7+Assembly‌ نوشته شده بود.
برنامه‌های دیگه‌ای هم در این زمینه داشتم که اون ها هم منهدم شدند.
نمونه‌اش دیکشنری خط فرمان که قابلیت نمایش عکس رو هم داشت.
باز می‌گردم تا ببینم اگه چیزی دیگه پیدا کردم حتما براتون بذارم.

PalizeSoftware
جمعه 11 آذر 1384, 18:49 عصر
این هم یه نمونه دیگه (قصد حال گیری ندارم)
می‌خوام دوستان با نمونه‌هایی در این زمینه آشنا بشن.

Iran-PC
جمعه 11 آذر 1384, 20:58 عصر
خیلی جالبه.
اولیه خیلی باحال بود.
چطوری اینجوریش کرده بودی؟

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

یعنی تو هر سطح کاراکتر 5 - 6 رنگ مختلف بود در صورتی که تو محیط تکست بصورت عادی یک رنگ بکگراند داریم و یک رنگ فورگراند.


یادمه تو فاکسپرو هم یه همچین چیزی رو ساپورت میکرد.
یعنی اگه وی جی ای جواب میداد تصاویر بیتمپ رو هم نمایش میداد.
البته من ندیدم چنین کاری بکنه ولی دستورش بود (میگردم دستور فاکس پروش رو پیدا میکنم).
نمیدونم چطوری فقط میدونم میشه.
راستی یه سوال
چطوری میشه تو داس گرافیک 16 ملیون رنگ رو ساپورت کرد؟
اینم میدونم میشه اونم با سرعت خیلی بالا ولی چطوریش رو نمیدونم.

یه برنامه بود تو داس به اسم See که همه فرمت عکسی رو ساپورت میکرد (16 ملیون رنگ) اونم با سرعت و رزولوشن بالا

کسی میدونه چطور میشه که ایطور میشه؟

PalizeSoftware
جمعه 11 آذر 1384, 21:51 عصر
دوست عزیز در محیط داس هم براحتی می‌شه تعداد رنگ 16 میلیونی داشت.
اما کارت شما باید استاندارد (Super VGA(SVGA رو ساپورت کنه (که امروزه همه کارتها این رو پشتیبانی می‌کنند)
در کارت‌های SVGA‌ شما قابلیت فعال سازی مد‌های VESA رو دارید که مثلا می‌تونید مد 1024×768 رو با 16 میلیون رنگ داشته باشید. ضمن اینکه روتین‌های گزافیکی رو خودتون دیگه باید پیاده کنید و دسترسی مستقیم به حافظه کارت گرافیک رو داشته باشید.

PalizeSoftware
جمعه 11 آذر 1384, 22:02 عصر
برنامه زیر هم با QBasic 7 نوشته شده که البته اسمبلی مثل همیشه استفاده شده.
در محیط داس اجرا کنید(ممکنه در داس-ویندوز پرش داشته باشه)
اگه سورس این چند برنامه اخیر رو پیدا کردم حتما تقدیم علاقه‌مندان خواهم کرد

Iran-PC
جمعه 11 آذر 1384, 23:49 عصر
آفرین.
خود خودشه
همین برنامس
خوب حالا میشه بگی چطوری ساخته شده؟
چطوری مود vesa رو فعال کنم؟
یا چطور باهاش کار کنم؟

aakh1361
شنبه 12 آذر 1384, 00:59 صبح
اگر پیدا نکردی کمی در مورد کاری که انجام دادی توضیح بده که از چه روشی استفاده کردید

PalizeSoftware
شنبه 12 آذر 1384, 01:31 صبح
چشم توضیح می‌دم ولی بهتر هست که در بخش اسمبلی مطرح بشه. اینطور نیست؟
اول بپردازیم به چگونگی لود فونت‌ها در جدول دوم، یعنی فعال ساختن 512 کاراکتر در یک زمان.
منتظر باشید

aakh1361
شنبه 12 آذر 1384, 17:58 عصر
چشم توضیح می‌دم ولی بهتر هست که در بخش اسمبلی مطرح بشه. اینطور نیست؟
اول بپردازیم به چگونگی لود فونت‌ها در جدول دوم، یعنی فعال ساختن 512 کاراکتر در یک زمان.
منتظر باشید

من تو قسمت اسمبلی منتظرم ..... http://asefsoft.com/qsimages/181.gif http://asefsoft.com/qsimages/181.gif

راتسی همون طور که ایران پی سی گفت یک توضیح هم در مورد دسترسی به مود های بالاتر رو هم بده
چون تو مد 1024*768 و 24 بیتی مقدار حافظه ای که رو باید به تمام صحفه برای دسترسی داشت 2359296 بایت میشه در حالی که داس بیشتر 65535 بایت رو نمی تونه دسترسی داشته باشه یک روش بود که با سویچ کردن بانک میشد به کل صحفه نمایش دسترسی داشت در این مورد هم یک توضیحی بده

PalizeSoftware
شنبه 12 آذر 1384, 20:12 عصر
چشم به محض آماده کردن مطلب حتما می‌ذارم.


چون تو مد 1024*768 و 24 بیتی مقدار حافظه ای که رو باید به تمام صحفه برای دسترسی داشت 2359296 بایت میشه در حالی که داس بیشتر 65535 بایت رو نمی تونه دسترسی داشته باشه یک روش بود که با سویچ کردن بانک میشد به کل صحفه نمایش دسترسی داشت در این مورد هم یک توضیحی بده

در این مدها شما با بلوک‌ها سر رو کار دارید که امکان آدرس دهی رو فراهم می‌کنه.
راستی ابزار زیر رو هم ببینید تا با مدهای VESA که لیست می‌کنه و کارت گرافیک شما پشتیبانی می‌کنه آشنا بشید.

sasan_vm
شنبه 12 آذر 1384, 20:35 عصر
سلام
این هم یک مثال دیگه البته با سورس کامل :چشمک:

Iran-PC
شنبه 12 آذر 1384, 23:20 عصر
سلام به همگی.
خیلی عالیه.
یعنی میخواید بفرمایید که اون سی پ1 که فایلش رو گذاشتید گرافیکی نبوده؟
من با 512 کاراکتر کار کردم ولی این مدلیش رو ندیده بودم.
تا جایی که یادمه رنگ فور کالر بالای 7 میشد 256 کاراکتر بعدی.
اسم تاپیک اسمبلیتونو هم اینجا بگید.
در ضمن اون قضیه فول کالر رو هم فراموش نکنید.
خیلی از آشنایی با شما و این سایت خوشحالم.

aakh1361
یک شنبه 13 آذر 1384, 00:23 صبح
این هم یک مثال دیگه البته با سورس کامل

آخ که من میمیرم واسه سورس http://asefsoft.com/qsimages/84.gif http://asefsoft.com/qsimages/84.gif http://asefsoft.com/qsimages/84.gif (http://taghia.com)

Iran-PC
یک شنبه 13 آذر 1384, 00:40 صبح
سلام.
هر دوتا برنامه رو دیدم.
خیلی جالب بود.

تو اون برنامه وسا اینفو مدهای وسا رو دیدم.
شماره همشون بزرگتر از 255 بود و با وقفه معمولی نمیشد بهش دسترسی داشت.
میشه بگید چطور میشه به مودهای وسا سوئیچ کرد؟

ممنون

Iran-PC
دوشنبه 14 آذر 1384, 00:30 صبح
منو نا امید نکنید لطفا.
اینجا هر شب چند تا جواب خوب توش بود
اما امشب ؟؟؟؟؟؟


:گریه:


اینم از فردای دیشب.


یکی بیاد جواب ما رو بده دیگه.

Iran-PC
سه شنبه 15 آذر 1384, 00:40 صبح
جناب پالیز و آقا ساسان :

خیلی ممنون خیلی توجه کردید.
آخه یکی بیاد جواب بده دیگه.

Iran-PC
سه شنبه 15 آذر 1384, 03:15 صبح
آقا خودمفهمیدم چطور باید سوییچ کرد.
حالا بگید چطور میشه اطلاعات رو بلوک بلوک توش نوشت یا ازش خوند.؟
امان از بی سوادی.
پی سی اینترن دارم اما سواد خوندنشو ندارم.
شماها هم که اصلا تحویل نمیگیرید یه جواب خشک و خالی بدید

seyedof
سه شنبه 15 آذر 1384, 19:07 عصر
سلام
من قبلا اینکارها رو زیاد کردم ولی مال زمان داس بود و خیلیهاش رو فراموش کردم اما به هر حال چیزهایی که یادم مونده توضیح میدم.
اول در مورد نمایش گرافیک در مود متن :

در کارتهای VGA به بالا قابلیت نمایش 512 کاراکتر به جای 256 عدد وجود دارد. ترفند به این صورت است. شما یک بلوک روی صفحه نمایش در نظر میگیرید به نحوی که اندازه اش بر حسب کاراکتر از 256 کاراکتر بیشتر نشه. مثلا 16 در 16 کاراکتر یا 8 در 32 کاراکتر. این از این.در مود متنی عادی ابعاد صفحه بر حسب کاراکتر 80 در 25 است.
حالا میریم سراغ پیکسل. هر کاراکتر در مود عادی متن دارای 16 پیکسل ارتفاع و 8 پیکسل عرض است. در واقع حرف A انگلیسی مانند تمام کاراکترهای دیگر یک ماتریس از نقاط تعریف شده است که مثلا فارسی سازها هم با تعریف این آرایه میتوانند در مود متن شکل حروف فارسی را تعریف کنند. پس تا اینجا معلوم شد که میتونیم برای هر کاراکتر هر شکلی که بر حسب پیکسل ابعادش 8 در 16 پیکسل است قرار دهیم.
خب وقتی بشود اینکار رو کرد چون این شکل میتونه هر چیزی باشه پس میتونیم از این قابلیت برای نمایش گرافیک در مود متن استفاده کنیم. به این صورت که اوون بلوکی که در مرحله اول گفته شد اندازه اش از 256 کاراکتر بیشتر نباشه (مثلا 16 در 16 کاراکتر) میتونه به عنوان یک بلوک گرافیکی در نظر گرفته بشه. به اینصورت که توی این 256 کاراکتر شما کاراکترهای 0 تا 255 رو نمایش میدهید. در حالت عادی یک جدول نمایش داده میشه که توش همه حروف و علائم اسکی قراردارند. حالا به صورت پیکسلی اگر فکر کنید در واقع روی صفحه یک بلوکی دارید که 8x16 پیکسل عرض و 16x16 پیکسل ارتفاع داره. فقط روشن و خاموش کردن پیکسلها روی این صفحه گرافیکی مجازی با مودهای گرافیکی فرق میکنه. اینکار به اینصورت است که شما وقتی میخواهید یک پیکسل به مختصات x , y رو روشن کنید باید اول بفهمید که توی اوون بلوک شما این پیکسل روی کدوم کاراکتر میفته. بعد برید و شکل ماتریسی اوون کاراکتر رو به نحوی تغییر بدید که توش اوون پیکسل روشن شده باشه. بلافاصله پس از تغییر شکل اوون کاراکتر پیکسل مربوطه روی صفحه روشن خواهد شد.

حالا چرا توی مود 512 کاراکتری. اینکار رو توی مود 256 کاراکتری هم میشه انجام داد و هیچ مشکلی نداره. فقط مسپله اینه که چون با اینکار جدول ماتریس شکل کاراکترها رو تغییر میدهید دیگه شکل حروف و علایم هم عوض میشه و دیگه نمیتونید متنی رو همزمان نمایش بدهید. ولیکن در حالت 512 کاراکتری شما میتونید 256 کاراکتر اول رو به نمایش متون و جدول استاندارد فونت اختصاص بدید و این بازیهای تغییر شکل و گرافیکی رو توی 256 کاراکتر دوم انجام بدین.

سوییچ کردن بین جدول کاراکتر اول و دوم و همچنین تغییر شکل ماتریس حروف بعضا توسط وقفه های مربوط به گرافیک که فکر کنم وقفه شماره 10 بود امکانپذیره اما بعضی از کارها رو نمیشه با این وقفه انجام داد و براش باید شما مستقیما به پورتهای کارت گرافیک دستورات مربوطه رو بفرستید. توضیح دقیق اینکه چه اعدادی باید نوشته بشه و چگونگی تمام کارهایی که گفتم در کتاب PC Intern و به صورت بهتر در کتابی به نام PC Underground توضیح داده شده.
همونطور که توی جوابهای قبلیم در این تاپیک نوشته بودم لوگوی بایوس هم در ابتدای روشن شدن سیستم نمایش داده میشه از همین تکنیک برای نمایش گرافیک در مود متن استفاده میکنه. البته ناگفته نماند که از نظر تعداد رنگ و یک سری مسائل دیگه محدودیتهایی داره.


و اما در مورد VESA
کارتهای گرافیک تا استاندارد EGA فقط قابلیت نمایش 16 رنگ رو داشتند. از VGA به بعد مودی با وضوح 320x200 با 256 رنگ اضافه شد. بایوس فقط از همین مود پشتیبانی میکنه در حالیکه کارتهای VGA قابلیت نمایش یک سری مودهای غیر استاندارد دیگه رو هم داشتند که اینکار از طریق برنامه نویسی مستقیم پورتها امکان پذیر بود. بعد از اوومدن SVGA وضوح های بالاتر مثل 1024 در 768 و همچنین تعداد رنگ بالاتر هم ایجاد شد. متاسفانه هر سازنده کارت گرافیک ساز خودش رو میزد و یک استاندارد واحد برای نمایش گرافیک در این مودهای جدید وجود نداشت. برای همین خیلی از بازیهای اوون موقع همراهشون کلی فایل درایور مختلف بود که بسته به نوع و مدل کارت گرافیک از توابع مناسب اوون کارت استفاده میکردند! بعد از یک مدت با اجماع سازندگان کارتهای گرافیکی و جلوگیری از هرج و مرج و پیچیدگی یک استاندارد وضع کردند به اسم VESA که فکر کنم آخرین ورژنش VESA 2.0 اینا بود. در این استاندارد نحوه رفتن به مودهای گرافیکی جدید و با وضوح و رنگ بالا و همچنین نحوه خواندن و نوشتن روی رم کارت گرافیک و ارتباط با ناحیه مختص گرافیک در رم سیستم که یک نوع Mapping است تعیین شده بود. چون ناحیه 64 کیلوبایتی در حافظه که در آدرس 0xa000 قراردارد جهت خیلی از مودهای گرافیکی VESA کافی نیست و باید انتقال اطلاعات بین این ناحیه و رم کارت گرافیک از طریق یک سری بلوک و پنجره صورت میگرفت. این عملیات تا حدودی کند و پر دردسر هم بود.
در این استاندارد برخی کارتها قابلیت داشتند به اسم LFB یا Linear Frame Buffer که برای گیم نویسان و کسانی که مایل به عملیات سریع گرافیکی در مودهای وسا بودند بسیار مفید بود. چون به جای عملیاتی مانند Windowing و غیره به وسیله LFB شما میتوانستید درست مانند مودهای قدیمی اطلاعات مربوط به تصویر رو در یک آدرس به صورت کاملا خطی و پشت سرهم بنویسید یا بخونید. سرعتش هم بالا بود.
برای دوستانی که در داس مایل به استفاده از این مودها هستند هم یک سری کتابخانه برای اینکار هست هم یک تعدادی راه انداز bgi (مال توربوسی و توربو پاسکال) هست که برای کار با این مودها تولید شده اند. اگر مایل هستید خودتون اینکارها رو بکنید مطالعه راهنمای استاندارد VESA 2.0 توصیه میشه که توش همه این موارد رو توضیح داده و میتونید نحوه استفاده از این مودها رو یاد بگیرید.
اگر بتونم یک سری از برنامه های قدیمی که تحت داس نوشته بودم بودم رو پیدا کنم برای شما میفرستم. در زمان داس این کارهای گرافیکی برای خودش جذابیتهای زیادی داشت.
ممنون علی

PalizeSoftware
سه شنبه 15 آذر 1384, 19:46 عصر
با تشکر از جناب seyedof‌ که توضیحات مقدماتی رو آوردند.
بالاخره تاپیک مربوطه به نمایش 512 کاراکتر بطور همزمان در بخش اسمبلی ایجاد شد
ملاحظه بفرمائید:
http://www.barnamenevis.org/forum/showthread.php?t=33929

aakh1361
سه شنبه 15 آذر 1384, 21:30 عصر
آقای seyedof‌ خیلی ممنون واقعا آموزنده بود

Iran-PC
چهارشنبه 16 آذر 1384, 20:01 عصر
سلام
من قبلا اینکارها رو زیاد کردم ولی مال زمان داس بود و خیلیهاش رو فراموش کردم اما به هر حال چیزهایی که یادم مونده توضیح میدم.
اول در مورد نمایش گرافیک در مود متن :

در کارتهای VGA به بالا قابلیت نمایش 512 کاراکتر به جای 256 عدد وجود دارد. ترفند به این صورت است. شما یک بلوک روی صفحه نمایش در نظر میگیرید به نحوی که اندازه اش بر حسب کاراکتر از 256 کاراکتر بیشتر نشه. مثلا 16 در 16 کاراکتر یا 8 در 32 کاراکتر. این از این.در مود متنی عادی ابعاد صفحه بر حسب کاراکتر 80 در 25 است.
حالا میریم سراغ پیکسل. هر کاراکتر در مود عادی متن دارای 16 پیکسل ارتفاع و 8 پیکسل عرض است. در واقع حرف A انگلیسی مانند تمام کاراکترهای دیگر یک ماتریس از نقاط تعریف شده است که مثلا فارسی سازها هم با تعریف این آرایه میتوانند در مود متن شکل حروف فارسی را تعریف کنند. پس تا اینجا معلوم شد که میتونیم برای هر کاراکتر هر شکلی که بر حسب پیکسل ابعادش 8 در 16 پیکسل است قرار دهیم.
خب وقتی بشود اینکار رو کرد چون این شکل میتونه هر چیزی باشه پس میتونیم از این قابلیت برای نمایش گرافیک در مود متن استفاده کنیم. به این صورت که اوون بلوکی که در مرحله اول گفته شد اندازه اش از 256 کاراکتر بیشتر نباشه (مثلا 16 در 16 کاراکتر) میتونه به عنوان یک بلوک گرافیکی در نظر گرفته بشه. به اینصورت که توی این 256 کاراکتر شما کاراکترهای 0 تا 255 رو نمایش میدهید. در حالت عادی یک جدول نمایش داده میشه که توش همه حروف و علائم اسکی قراردارند. حالا به صورت پیکسلی اگر فکر کنید در واقع روی صفحه یک بلوکی دارید که 8x16 پیکسل عرض و 16x16 پیکسل ارتفاع داره. فقط روشن و خاموش کردن پیکسلها روی این صفحه گرافیکی مجازی با مودهای گرافیکی فرق میکنه. اینکار به اینصورت است که شما وقتی میخواهید یک پیکسل به مختصات x , y رو روشن کنید باید اول بفهمید که توی اوون بلوک شما این پیکسل روی کدوم کاراکتر میفته. بعد برید و شکل ماتریسی اوون کاراکتر رو به نحوی تغییر بدید که توش اوون پیکسل روشن شده باشه. بلافاصله پس از تغییر شکل اوون کاراکتر پیکسل مربوطه روی صفحه روشن خواهد شد.

حالا چرا توی مود 512 کاراکتری. اینکار رو توی مود 256 کاراکتری هم میشه انجام داد و هیچ مشکلی نداره. فقط مسپله اینه که چون با اینکار جدول ماتریس شکل کاراکترها رو تغییر میدهید دیگه شکل حروف و علایم هم عوض میشه و دیگه نمیتونید متنی رو همزمان نمایش بدهید. ولیکن در حالت 512 کاراکتری شما میتونید 256 کاراکتر اول رو به نمایش متون و جدول استاندارد فونت اختصاص بدید و این بازیهای تغییر شکل و گرافیکی رو توی 256 کاراکتر دوم انجام بدین.

سوییچ کردن بین جدول کاراکتر اول و دوم و همچنین تغییر شکل ماتریس حروف بعضا توسط وقفه های مربوط به گرافیک که فکر کنم وقفه شماره 10 بود امکانپذیره اما بعضی از کارها رو نمیشه با این وقفه انجام داد و براش باید شما مستقیما به پورتهای کارت گرافیک دستورات مربوطه رو بفرستید. توضیح دقیق اینکه چه اعدادی باید نوشته بشه و چگونگی تمام کارهایی که گفتم در کتاب PC Intern و به صورت بهتر در کتابی به نام PC Underground توضیح داده شده.
همونطور که توی جوابهای قبلیم در این تاپیک نوشته بودم لوگوی بایوس هم در ابتدای روشن شدن سیستم نمایش داده میشه از همین تکنیک برای نمایش گرافیک در مود متن استفاده میکنه. البته ناگفته نماند که از نظر تعداد رنگ و یک سری مسائل دیگه محدودیتهایی داره.


و اما در مورد VESA
کارتهای گرافیک تا استاندارد EGA فقط قابلیت نمایش 16 رنگ رو داشتند. از VGA به بعد مودی با وضوح 320x200 با 256 رنگ اضافه شد. بایوس فقط از همین مود پشتیبانی میکنه در حالیکه کارتهای VGA قابلیت نمایش یک سری مودهای غیر استاندارد دیگه رو هم داشتند که اینکار از طریق برنامه نویسی مستقیم پورتها امکان پذیر بود. بعد از اوومدن SVGA وضوح های بالاتر مثل 1024 در 768 و همچنین تعداد رنگ بالاتر هم ایجاد شد. متاسفانه هر سازنده کارت گرافیک ساز خودش رو میزد و یک استاندارد واحد برای نمایش گرافیک در این مودهای جدید وجود نداشت. برای همین خیلی از بازیهای اوون موقع همراهشون کلی فایل درایور مختلف بود که بسته به نوع و مدل کارت گرافیک از توابع مناسب اوون کارت استفاده میکردند! بعد از یک مدت با اجماع سازندگان کارتهای گرافیکی و جلوگیری از هرج و مرج و پیچیدگی یک استاندارد وضع کردند به اسم VESA که فکر کنم آخرین ورژنش VESA 2.0 اینا بود. در این استاندارد نحوه رفتن به مودهای گرافیکی جدید و با وضوح و رنگ بالا و همچنین نحوه خواندن و نوشتن روی رم کارت گرافیک و ارتباط با ناحیه مختص گرافیک در رم سیستم که یک نوع Mapping است تعیین شده بود. چون ناحیه 64 کیلوبایتی در حافظه که در آدرس 0xa000 قراردارد جهت خیلی از مودهای گرافیکی VESA کافی نیست و باید انتقال اطلاعات بین این ناحیه و رم کارت گرافیک از طریق یک سری بلوک و پنجره صورت میگرفت. این عملیات تا حدودی کند و پر دردسر هم بود.
در این استاندارد برخی کارتها قابلیت داشتند به اسم LFB یا Linear Frame Buffer که برای گیم نویسان و کسانی که مایل به عملیات سریع گرافیکی در مودهای وسا بودند بسیار مفید بود. چون به جای عملیاتی مانند Windowing و غیره به وسیله LFB شما میتوانستید درست مانند مودهای قدیمی اطلاعات مربوط به تصویر رو در یک آدرس به صورت کاملا خطی و پشت سرهم بنویسید یا بخونید. سرعتش هم بالا بود.
برای دوستانی که در داس مایل به استفاده از این مودها هستند هم یک سری کتابخانه برای اینکار هست هم یک تعدادی راه انداز bgi (مال توربوسی و توربو پاسکال) هست که برای کار با این مودها تولید شده اند. اگر مایل هستید خودتون اینکارها رو بکنید مطالعه راهنمای استاندارد VESA 2.0 توصیه میشه که توش همه این موارد رو توضیح داده و میتونید نحوه استفاده از این مودها رو یاد بگیرید.
اگر بتونم یک سری از برنامه های قدیمی که تحت داس نوشته بودم بودم رو پیدا کنم برای شما میفرستم. در زمان داس این کارهای گرافیکی برای خودش جذابیتهای زیادی داشت.
ممنون علی

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

seyedof
چهارشنبه 16 آذر 1384, 20:31 عصر
سلام
PC Intern و PC Underground دو کتاب هستند البته در اوونها در مورد VESA چیزی نداره. برای استفاده از قابلیتهای VESA کارت گرافیک شما باید BIOS اوون رو داشته باشه که البته فکر کنم کارتهای جدید همه دارند اگر نداشت باید یک برنامه به اسم UNIVBE رو اجرا کنید تا به صورت نرم افزاری VESA BIOS را شبیه سازی میکنه.
VESA 2.0 یک راهنما داره که توی اینترنت جستجو کنید حتما پیدا میشه. کتاب نیست یک فایل text است که توش توابع VESA رو توضیح داده.
راستی یکی از برنامه های قدیمیم رو پیدا کردم ولی باید کمپایلش کنم با Turbo Pascal که متاسفانه رو ویندوز 2000 انگار بورلند پاسکال اجرا نمیشه. اگر کسی راهش رو میدونه بگه تا من ردیفش کنم و بفرستم.
ممنون علی

Iran-PC
چهارشنبه 16 آذر 1384, 21:50 عصر
سلام.
پی سی اینترن رو دارم.
کمی در مورد وسا نوشته.
اما چون انگلیسیه و من هم تو این قضیه ضعیف پس ...
من وقتی تو مد وسا سوییچ مشم یه صفحه میاد که تمیز نیست یعنی توش پیکسلهایی هست که من رسم نکردم.
البته رزولوشنش احتمالا درسته ولی تعداد رنگ ساپورتیش و طریقه خوندن و نوشتن توش رو نمیدونم.
میشه این فایلتون رو بدید و کمی توضیح بدید راجع به وسا؟
یعنی طریقه رسم پیکسلها از روی حافظه.
و اون ال اف بی رو هم اگه توضیح بدی که دیگه خیلی لطف کردی در حق ما.
قربانت.
محمدرضا
علی جان همون پاسکالشو بده.

من پاسکالم از سیم بهتره.

PalizeSoftware
چهارشنبه 16 آذر 1384, 22:00 عصر
من وقتی تو مد وسا سوییچ مشم یه صفحه میاد که تمیز نیست یعنی توش پیکسلهایی هست که من رسم نکردم.

دقیق یادم نیست ولی اون زمان که کار می‌کردم اگه اشتباه نکنم باید شماره مد رو با عددی جمع می‌کردیم تا بافر گرافیکی رو پاک کنه. چون در زمان سوییچ به VESA بافر پاک نمیشه محتویاتش اینجوری دیده می‌شه.
اگه پیدا کردم برات می‌ذارم.

PalizeSoftware
چهارشنبه 16 آذر 1384, 22:14 عصر
پیدا کردم، اگه بیت 15 از شماره مد رو ست کنید بافر پاک نمیشه.
این دو فایل رو هم ببینید تا بیشتر راجع به VESA‌ بدونید.

Iran-PC
چهارشنبه 16 آذر 1384, 22:54 عصر
سلام
به این لینک هم یه سر بزنید.
من زبانم بده.

http://www.faqs.org/faqs/pc-hardware-faq/supervga-programming/

Iran-PC
پنج شنبه 17 آذر 1384, 01:36 صبح
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

void setsvga(int);
void setpixel( int, int, unsigned char ) ;
void initgraph();
void closegraph();
void line(int,int,int,int,int);


void initgraph()
{
setsvga ( 0x101 ) ;
}

void closegraph()
{
setsvga ( 0x003 ) ;
}

void setsvga ( int m )
{
asm{
mov ax,0x4f02
mov bx,m
int 16
}
}

void set_vesa_seg ( int bank_number )
{
asm{
mov ax,0x4F05
mov bx,0
mov dx,bank_number
int 16;
}
}

unsigned short sp_curr_vesa_seg = 0xffff ;
const unsigned long sp_seg_size = 0xffff + 1L ;
unsigned short sp_vesa_seg,sp_vesa_offset ;
unsigned long sp_offset ;

void inline setpixel(int x, int y, unsigned char color )
{
if(color!=255&&!(x<0||y<0||x>=640||y>=480))
{
sp_offset = ( ( unsigned long ) y * ( unsigned long ) 640 + ( unsigned long ) x ) ;
sp_vesa_seg = (unsigned short) (sp_offset / sp_seg_size) ;
sp_vesa_offset = (unsigned short) (sp_offset % sp_seg_size) ;
if ( sp_vesa_seg != sp_curr_vesa_seg )
{
set_vesa_seg ( sp_vesa_seg ) ;
sp_curr_vesa_seg = sp_vesa_seg ;
}
pokeb ( 0xA000, ( unsigned ) sp_vesa_offset, color ) ;
}
}

int getpixel( int x, int y)
{
if(x<0||y<0||x>=640||y>=480)
return 0;
sp_offset = ( ( unsigned long ) y * ( unsigned long ) 640 + ( unsigned long ) x ) ;
sp_vesa_seg = (unsigned short) (sp_offset / sp_seg_size) ;
sp_vesa_offset = (unsigned short) (sp_offset % sp_seg_size) ;
if ( sp_vesa_seg != sp_curr_vesa_seg )
{
set_vesa_seg ( sp_vesa_seg ) ;
sp_curr_vesa_seg = sp_vesa_seg ;
}
return peekb ( 0xA000, ( unsigned ) sp_vesa_offset) ;
}
void line(int x1,int y1,int x2,int y2,int color)
{
register int t,dis;
int xe=0,ye=0,dx,dy;
int ix,iy;
dx=x2-x1;
dy=y2-y1;
if(dx>0)
ix=1;
else if(!dx)
ix=0;
else
ix=-1;
if(dy>0)
iy=1;
else if(!dy)
iy=0;
else
iy=-1;
dx=abs(dx);
dy=abs(dy);
if(dx>dy)
dis=dx;
else
dis=dy;
for(t=0;t<dis+1;t++)
{
setpixel(x1,y1,color);
xe+=dx;
ye+=dy;
if(xe>dis)
{
xe-=dis;
x1+=ix;
}
if(ye>dis)
{
ye-=dis;
y1+=iy;
}
}// end for
setpixel(x2,y2,color);
}
void box(int x1,int y1,int x2,int y2,int color)
{
line(x1,y1,x1,y2,color);
line(x1,y2,x2,y2,color);
line(x2,y2,x2,y1,color);
line(x2,y1,x1,y1,color);
}
void main()
{
initgraph();
box(50, 50, 100, 100, 15);
getch();
closegraph();
}



سلام
اینو ببینید.
یکی از دوستان همینجا فرستاده بود من کمی تغیرش دادم.
یعنی از حالت سر فایل به فایل نه چیز دیگه.
اما باز هم جواب نمیده.
میشه کمک کنید؟

aakh1361
پنج شنبه 17 آذر 1384, 03:28 صبح
Iran-Pc
بهتره که از


CODE
/CODE

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

seyedof
جمعه 18 آذر 1384, 13:31 عصر
سلام.
پی سی اینترن رو دارم.
کمی در مورد وسا نوشته.
اما چون انگلیسیه و من هم تو این قضیه ضعیف پس ...
من وقتی تو مد وسا سوییچ مشم یه صفحه میاد که تمیز نیست یعنی توش پیکسلهایی هست که من رسم نکردم.
البته رزولوشنش احتمالا درسته ولی تعداد رنگ ساپورتیش و طریقه خوندن و نوشتن توش رو نمیدونم.
میشه این فایلتون رو بدید و کمی توضیح بدید راجع به وسا؟
یعنی طریقه رسم پیکسلها از روی حافظه.
و اون ال اف بی رو هم اگه توضیح بدی که دیگه خیلی لطف کردی در حق ما.
قربانت.
محمدرضا
علی جان همون پاسکالشو بده.

من پاسکالم از سیم بهتره.

سلام
مشکل اول که همون دلیلش پاک نشدن vram است و آقای Palize راهش رو گفتند. قالب ذخیره سازی پیکسلها در مودها معمولی (256 به پایین) فرقی با مدهای قدیمی نداره. مدهای HiColor=16 bits و TrueColor=24 bit هم داده هاشون به صورت خام ذخیره میشه یعنی برای حالت 24 بیت R , G , B پشت سر هم. در حالت 16 بیت هم چند روش مختلف وجود داره که متداولترینش 565 است یعنی 5 بیت از 16 بیت برای رنگ قرمز 6 بیت بعدی برای رنگ سبز و 5 بیت آخر برای رنگ آبی. اوون فایل رو حتما بخونید چون نمیشه همه مطلب رو توضیح داد. ضمنا از آخرین باری که اینکارا رو من کردم 4-5 سال میگذره به نظر میرسه آقای Palize بهتر به خاطر داشته باشند.
همونطور که توضیح داده شد مدهای Block برای انجام عملیات گرافیکی سریع مناسب نیستند مخصوصا برای کارهایی مثل نمایش اسپرایت (عملیات Bit Blitting). تغییر بلوک جاری کاری کند است. در حالت LFB که فکر کنم در VESA 2.0 باشه شما مثل مدهای قدیمی یک منطقه خطی در حافظه دارید که کل اطلاعات پیکسلهای گرافیکی به صورت پشت سر هم در اوون نوشته میشن. یعنی برای نوشتن یا خوندن پیکسلها فقط کافیه در آدرس مورد نظر در حافظه بنویسید یا ازش بخونید. فقط تا جایی که یادمه فکر کنم این حالت فقط در حالت Protected Mode قابل دسترسی است و در حالت عادی Real Mode که داس در اوون اجرا میشه نمیشه از این قابلیت استفاده کرد. یعنی اگر میخواهید از LFB استفاده کنید باید از کمپایلرهایی تحت داس استفاده کنید که Dos Extender دارن و کد 32 بیتی در حالت Protected Mode ایجاد میکنند. مانند Watcom C که من هم با اوون کار میکردم.
ممنون علی

Iran-PC
جمعه 18 آذر 1384, 14:00 عصر
سلام و خیلی ممنون.
یه سوال.
با استفاده از پورتها نمیشه به صورت سریع پیکسلها رو نمایش داد؟
اینو ببینید (نمونه مثال کتاب پی سی اینترن البته 256 رنگ)

فایل اسمبلیش



IGROUP group _text
DGROUP group const, _bss, _data
assume CS : IGROUP, DS : DGROUP, ES : DGROUP, SS : DGROUP

CONST segment word public 'CONST'
CONST ends

_BSS segment word public 'BSS'
_BSS ends

_DATA segment word public 'DATA'
_DATA ends

GC_INDEX = 3ceh
GC_READ_MAP = 4
GC_BIT_MASK = 8
GC_GRAPH_MODE = 5

_DATA segment word public 'DATA'

modeno db 6Ah, 58h, 29h, 54h, 16h, 79h
modenoend equ this byte
_DATA ends

_TEXT segment byte public 'CODE'
public _init800600
public _setpix

;---------------------------

_init800600 proc near
mov si, offset modeno
it1: xor ah, ah
mov al, [si]
int 10h
mov ah, 0fh
int 10h
cmp al, [si]
je it2


inc si
cmp si, offset modeno
jne it1
xor ax, ax
ret

it2:
mov ax, 1
ret
_init800600 endp

;--------------------------------

_setpix proc near

sframe struct
bp0 dw ?
ret_adr0 dw ?
x0 dw ?
y0 dw ?
pcolor dw ?
sframe ends

frame equ [bp - bp0]

push bp
mov bp, sp

mov ax, frame.y0
mov dx, 800/8
mul dx
mov bx, frame.x0
mov cl, bl

shr bx, 1
shr bx, 1
shr bx, 1
add bx, ax
and cl, 7
xor cl, 7
mov ah, 1
shl ah, cl

mov dx, GC_INDEX
mov al, GC_BIT_MASK
out dx, ax

mov ax, (02h shl 8) + GC_GRAPH_MODE
out dx, ax
mov ax, 0A000h
mov es, ax

mov al, es:[bx]
mov al, byte ptr frame.pcolor
mov es:[bx], al

mov ax, (0FFh shl 8) + GC_BIT_MASK
out dx, ax

mov ax, (00h shl 8) + GC_GRAPH_MODE
out dx, ax

pop bp
ret

_setpix endp

_TEXT ends
end




و فایل سی



#include <dos.h>
#include <stdarg.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
#include <stdio.h>


#ifndef __TURBOC__
#define random(x) ( rand () % (x+1) )
#endif

#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned char BYTE;
extern int init800600(void);
extern void setpix(int x, int y , unsigned char pcolor);

void main()
{
int i, j;
init800600();
for (i = 0; i <= 599; i++)
for (j = 0; j <= 799; j++)
setpix(j, i, random(255));

}
#ifdef __cplusplus
}
#endif




البته من تو این مثال با مشکل رو برو شدم.

کامپایلرم این ارور رو میده



Compiling SVGA.C:
Linking SVGA.EXE:
Linker Error: Undefined symbol _setpix in module SVGA.C
Linker Error: Undefined symbol _init800600 in module SVGA.C



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

aakh1361
جمعه 18 آذر 1384, 18:00 عصر
شما فقط فایل سی رو کامپایل کردی
باید فایل اسمبلی هم کامپایل کنی بعدش هم فایل ابجکت سی و هم ابجکت اسمبلی رو باهم لینک کنی



LINK SVGA.OBJ + ASM.OBJ

Iran-PC
جمعه 18 آذر 1384, 20:15 عصر
اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟

PalizeSoftware
جمعه 18 آذر 1384, 20:56 عصر
اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟
فرضا اگه با MASM کار می‌کنید اینطوری:


Masm myprog.asm;

اما توجه داشته باشید که مدل حافظه هر دو کد (سی و اسمبلی) باید یکسان باشه.

Iran-PC
شنبه 19 آذر 1384, 22:38 عصر
پالیز جان خیلی ممنون.
یه سوال دیگه.
من با مسم هم تست کردم
نمیدونم چرا نشد
میپرسه اسم فایل و آبجکت و یه سری دیگه رو اما آخر سر میبینم چیزی نساخته
مسم که سی رو ساپورت کنه با مسم معمولی فرقی میکنه؟