آیا راهی برای ترکیب حالت متنی و گرافیکی هست؟
یعنی زمانی که داریم یک تکس رو نشون میدیم بتونیم کار گرافیکی هم بکنیم.
Printable View
آیا راهی برای ترکیب حالت متنی و گرافیکی هست؟
یعنی زمانی که داریم یک تکس رو نشون میدیم بتونیم کار گرافیکی هم بکنیم.
میتونی یک برنامهء کنسول ایجاد کنی و هدر مربوط به ویندوز رو اضافه کنی و هر وقت خواستی پیام یا پنجره های دلخواهت رو بسازی و نمایش بدی
ضمن تشکر از شما دوست عریز
ولی منظور من در داس و سی تحت داس بود.
در واقع هدف ساخت سیستمی است که بتواند در یک لحضه هر دو مد را نمایش دهد.
امکان این کار باید باشه یکی از دوستان استفاده از CRC Control را پیشنهاد کرد.
ممکنه در این مورد توضح بدید؟
یعنی این سوال جوابی نداره؟!
پس چطوی تو بانکها این کار رو کردن و یا مثلا در زرنگار رمانی که دارید فوت رو عوض میکنید!!!
سلام
CRC Check چه ربطی به گرافیک دارد؟ ضمنا در مود گرافیک میشه متن نشون داد ولی برعکسش نمیشه. چون در مود متن به پیکسلهای صفحه دسترسی ندارید و فقط کاراکتر رو متوجه میشه. ولیکن یه راه کلکی هست. در کارتهای VGA به بالا در واقع توانایی نمایش ۵۱۲ کاراکتر (به جای ۲۵۶) کاراکتر همزمان وجود داره. خیلی از برنامه های قدیمی از این موضوع استفاده میکردند و در ۲۵۶ کاراکتر اول فونتهای متنی و در ۲۵۶ کاراکتر دوم جدول فونتش رو خودشون تعریف میکردند تا بشه یک سری شکلهای گرافیکی رو هم نمایش داد. برای اینکار باید بیت مپ مورد نظر رو اول به یک سری مربع ۱۶*۸ تبدیل کنید بعد هر کدوم از این مربعها رو به عنوان یک فونت به سیستم بدین. اوونوقت با در واقع نوشتن این کاراکترها، بیت مپ اولیه روی صفحه ظاهر میشه.
ممنون علی
راستش ربطش رو نمیدونم!!!نقل قول:
نوشته شده توسط seyedof
اون یه توصیه از طرف دوستی بود که حالا بهش دسترسی ندارم.
اما اگر اشتباه نکنم چیزی که گفتید در مورد ساخت فونت در داس بود، درسته؟
اما من از ترکیب این دو مد حرف میزنم.
میدونم که در کارت گرافیک حافطه این دو مد فرق میکنه ولی میشه بگید مثلا در نرم افزارهای بانک زمانی که فیلد امضا نشون داشده میشه اونها چز کار کردن، چون من خودم صبح ها در بانک هستم میبینم که این کار شده!!!
ما کاملا در مد متنی هستیم ولی زمانی که امضا مشتری دیده میشه در همون حالت متنی قسمتی از صفحه گرافیکی میشه و امضا به نمایش در میاد در حالی که ما بقی قسمتها به شکل متنی هستن!!!!!
چطور چنین چیزی امکان داره؟
یا واقعا مد مد گرافیکی هست یا ترکیبی از این دو مد هست.
این کار چطور امکان پذیر شده؟!
سلام
اگر دقت کنید چیزی که من توضیح دادم دقیقا ترفندی بود برای نمایش گرافیک در مود متن نه در مورد ساخت فونت در داس.
در واقع اوون گرافیکها هم با یک سری فونت ساخته میشن چون نمایش گرافیک در مود متن غیر ممکن است.
نمونه اش لوگویی است که بایوس سیستم موقع روشن شدن کامپیوتر نشون میده.
ممنون علی
تشکر :flower:نقل قول:
نوشته شده توسط seyedof
سلام
از کجا مطمئنید که در مد متن هستید؟
ضمن تشکر از همه دوستانی که به این موضوع توجه کردن میخوام خواهش کنم که اگر ممکن هست برنامه ای رو که فرستام رو کنترل کنید و نتیجه آنالیز خودتون رو بگید ، که آیا این برنامه در مد تکست هست یا گرافیک و چطور چنین کاری کرده.
لطفا برنامه را در داس(Command or CMD) اجرا کنیدو قبل از اجرا دستوی را اجرا کنید که صفحه پر از کاراکتر شود مثلا Dir یا چیزی شبیح این.
خواهش میکنم نتیجه برسیتون رو به من هم بگید.
سلام
اگه می خوای توی مد گرافیک بنویسی settext و settextxy()
و برای خواندن هم می تونی کلید بخونی
سعی میکنم چند عکس از این برنامه رو اینجا بزارم تا شما هم پیرامون آن نظر بدید.نقل قول:
نوشته شده توسط rezaTavak
سلام
تونستید این مساله رو حل کنید؟
البته شما فایلی نگذاشتید.
اما من خودم برنامه ای رو دیدم که تو محیط تکست گرافیک نمایش میداد.
چطوری رو نمیدونم.
لطفا نتیجه تحقیقتونو بگید.
احتمالا صبحت دوست شما پیرامون CRT Controller بوده.
برنامه زیر رو در مد داس اجرا کنید تا ببینید که مد متن با همه محدودیتها کارهای جالبی میشه در اون انجام داد. دقیقا از 256 مجموعه دوم کاراکترها استفاده شده.
بی انصاف لاقل سورس رو هم میزاشتی:گریه: :گریه:نقل قول:
نوشته شده توسط PalizeSoftware
فقط می خواستی ما رو بزاری تو کف :گیج: :kaf: :kaf: :گیج:
باور کنید که سورس از بین رفته والا حتما میذاشتم. برمیگرده به 4-5 سال پیش که با اسمبلی حال میکردم.
جالب بدونید که این برنامه با QBasic 7+Assembly نوشته شده بود.
برنامههای دیگهای هم در این زمینه داشتم که اون ها هم منهدم شدند.
نمونهاش دیکشنری خط فرمان که قابلیت نمایش عکس رو هم داشت.
باز میگردم تا ببینم اگه چیزی دیگه پیدا کردم حتما براتون بذارم.
این هم یه نمونه دیگه (قصد حال گیری ندارم)
میخوام دوستان با نمونههایی در این زمینه آشنا بشن.
خیلی جالبه.
اولیه خیلی باحال بود.
چطوری اینجوریش کرده بودی؟
ولی اونی که من دیده بودم گرافیک تو داس بود.
متونی که تو صفحه بود سر جاشون بود فقط بک گراندش به رنگ قرمز بصورت طیفی بالا و پایین میرفت.
یعنی تو هر سطح کاراکتر 5 - 6 رنگ مختلف بود در صورتی که تو محیط تکست بصورت عادی یک رنگ بکگراند داریم و یک رنگ فورگراند.
یادمه تو فاکسپرو هم یه همچین چیزی رو ساپورت میکرد.
یعنی اگه وی جی ای جواب میداد تصاویر بیتمپ رو هم نمایش میداد.
البته من ندیدم چنین کاری بکنه ولی دستورش بود (میگردم دستور فاکس پروش رو پیدا میکنم).
نمیدونم چطوری فقط میدونم میشه.
راستی یه سوال
چطوری میشه تو داس گرافیک 16 ملیون رنگ رو ساپورت کرد؟
اینم میدونم میشه اونم با سرعت خیلی بالا ولی چطوریش رو نمیدونم.
یه برنامه بود تو داس به اسم See که همه فرمت عکسی رو ساپورت میکرد (16 ملیون رنگ) اونم با سرعت و رزولوشن بالا
کسی میدونه چطور میشه که ایطور میشه؟
دوست عزیز در محیط داس هم براحتی میشه تعداد رنگ 16 میلیونی داشت.
اما کارت شما باید استاندارد (Super VGA(SVGA رو ساپورت کنه (که امروزه همه کارتها این رو پشتیبانی میکنند)
در کارتهای SVGA شما قابلیت فعال سازی مدهای VESA رو دارید که مثلا میتونید مد 1024×768 رو با 16 میلیون رنگ داشته باشید. ضمن اینکه روتینهای گزافیکی رو خودتون دیگه باید پیاده کنید و دسترسی مستقیم به حافظه کارت گرافیک رو داشته باشید.
برنامه زیر هم با QBasic 7 نوشته شده که البته اسمبلی مثل همیشه استفاده شده.
در محیط داس اجرا کنید(ممکنه در داس-ویندوز پرش داشته باشه)
اگه سورس این چند برنامه اخیر رو پیدا کردم حتما تقدیم علاقهمندان خواهم کرد
آفرین.
خود خودشه
همین برنامس
خوب حالا میشه بگی چطوری ساخته شده؟
چطوری مود vesa رو فعال کنم؟
یا چطور باهاش کار کنم؟
اگر پیدا نکردی کمی در مورد کاری که انجام دادی توضیح بده که از چه روشی استفاده کردید
چشم توضیح میدم ولی بهتر هست که در بخش اسمبلی مطرح بشه. اینطور نیست؟
اول بپردازیم به چگونگی لود فونتها در جدول دوم، یعنی فعال ساختن 512 کاراکتر در یک زمان.
منتظر باشید
من تو قسمت اسمبلی منتظرم ..... http://asefsoft.com/qsimages/181.gif http://asefsoft.com/qsimages/181.gifنقل قول:
چشم توضیح میدم ولی بهتر هست که در بخش اسمبلی مطرح بشه. اینطور نیست؟
اول بپردازیم به چگونگی لود فونتها در جدول دوم، یعنی فعال ساختن 512 کاراکتر در یک زمان.
منتظر باشید
راتسی همون طور که ایران پی سی گفت یک توضیح هم در مورد دسترسی به مود های بالاتر رو هم بده
چون تو مد 1024*768 و 24 بیتی مقدار حافظه ای که رو باید به تمام صحفه برای دسترسی داشت 2359296 بایت میشه در حالی که داس بیشتر 65535 بایت رو نمی تونه دسترسی داشته باشه یک روش بود که با سویچ کردن بانک میشد به کل صحفه نمایش دسترسی داشت در این مورد هم یک توضیحی بده
چشم به محض آماده کردن مطلب حتما میذارم.
در این مدها شما با بلوکها سر رو کار دارید که امکان آدرس دهی رو فراهم میکنه.نقل قول:
چون تو مد 1024*768 و 24 بیتی مقدار حافظه ای که رو باید به تمام صحفه برای دسترسی داشت 2359296 بایت میشه در حالی که داس بیشتر 65535 بایت رو نمی تونه دسترسی داشته باشه یک روش بود که با سویچ کردن بانک میشد به کل صحفه نمایش دسترسی داشت در این مورد هم یک توضیحی بده
راستی ابزار زیر رو هم ببینید تا با مدهای VESA که لیست میکنه و کارت گرافیک شما پشتیبانی میکنه آشنا بشید.
سلام
این هم یک مثال دیگه البته با سورس کامل :چشمک:
سلام به همگی.
خیلی عالیه.
یعنی میخواید بفرمایید که اون سی پ1 که فایلش رو گذاشتید گرافیکی نبوده؟
من با 512 کاراکتر کار کردم ولی این مدلیش رو ندیده بودم.
تا جایی که یادمه رنگ فور کالر بالای 7 میشد 256 کاراکتر بعدی.
اسم تاپیک اسمبلیتونو هم اینجا بگید.
در ضمن اون قضیه فول کالر رو هم فراموش نکنید.
خیلی از آشنایی با شما و این سایت خوشحالم.
آخ که من میمیرم واسه سورس http://asefsoft.com/qsimages/84.gif http://asefsoft.com/qsimages/84.gif http://asefsoft.com/qsimages/84.gifنقل قول:
این هم یک مثال دیگه البته با سورس کامل
سلام.
هر دوتا برنامه رو دیدم.
خیلی جالب بود.
تو اون برنامه وسا اینفو مدهای وسا رو دیدم.
شماره همشون بزرگتر از 255 بود و با وقفه معمولی نمیشد بهش دسترسی داشت.
میشه بگید چطور میشه به مودهای وسا سوئیچ کرد؟
ممنون
منو نا امید نکنید لطفا.
اینجا هر شب چند تا جواب خوب توش بود
اما امشب ؟؟؟؟؟؟
:گریه:
اینم از فردای دیشب.
یکی بیاد جواب ما رو بده دیگه.
جناب پالیز و آقا ساسان :
خیلی ممنون خیلی توجه کردید.
آخه یکی بیاد جواب بده دیگه.
آقا خودمفهمیدم چطور باید سوییچ کرد.
حالا بگید چطور میشه اطلاعات رو بلوک بلوک توش نوشت یا ازش خوند.؟
امان از بی سوادی.
پی سی اینترن دارم اما سواد خوندنشو ندارم.
شماها هم که اصلا تحویل نمیگیرید یه جواب خشک و خالی بدید
سلام
من قبلا اینکارها رو زیاد کردم ولی مال زمان داس بود و خیلیهاش رو فراموش کردم اما به هر حال چیزهایی که یادم مونده توضیح میدم.
اول در مورد نمایش گرافیک در مود متن :
در کارتهای 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 که توضیحات مقدماتی رو آوردند.
بالاخره تاپیک مربوطه به نمایش 512 کاراکتر بطور همزمان در بخش اسمبلی ایجاد شد
ملاحظه بفرمائید:
http://www.barnamenevis.org/sh...ad.php?t=33929
آقای seyedof خیلی ممنون واقعا آموزنده بود
علی جان سلام.نقل قول:
نوشته شده توسط seyedof
خیلی خیلی لطف کردید.
ممنون.
اینی که توصیه کردید اسم کتابه؟
همین راهنمای استاندارد وسا رو میگم.
من میخوام خودم اینکار رو انجام بدم.
بهش نیازی ندارم اما کنجکاویش اذیتم میکنه.
اگه همین روش پنجره پنجره ایش رو هم یادم بدید خودش خیلی عالی میشه.
ممنون از همه
سلام
PC Intern و PC Underground دو کتاب هستند البته در اوونها در مورد VESA چیزی نداره. برای استفاده از قابلیتهای VESA کارت گرافیک شما باید BIOS اوون رو داشته باشه که البته فکر کنم کارتهای جدید همه دارند اگر نداشت باید یک برنامه به اسم UNIVBE رو اجرا کنید تا به صورت نرم افزاری VESA BIOS را شبیه سازی میکنه.
VESA 2.0 یک راهنما داره که توی اینترنت جستجو کنید حتما پیدا میشه. کتاب نیست یک فایل text است که توش توابع VESA رو توضیح داده.
راستی یکی از برنامه های قدیمیم رو پیدا کردم ولی باید کمپایلش کنم با Turbo Pascal که متاسفانه رو ویندوز 2000 انگار بورلند پاسکال اجرا نمیشه. اگر کسی راهش رو میدونه بگه تا من ردیفش کنم و بفرستم.
ممنون علی
سلام.
پی سی اینترن رو دارم.
کمی در مورد وسا نوشته.
اما چون انگلیسیه و من هم تو این قضیه ضعیف پس ...
من وقتی تو مد وسا سوییچ مشم یه صفحه میاد که تمیز نیست یعنی توش پیکسلهایی هست که من رسم نکردم.
البته رزولوشنش احتمالا درسته ولی تعداد رنگ ساپورتیش و طریقه خوندن و نوشتن توش رو نمیدونم.
میشه این فایلتون رو بدید و کمی توضیح بدید راجع به وسا؟
یعنی طریقه رسم پیکسلها از روی حافظه.
و اون ال اف بی رو هم اگه توضیح بدی که دیگه خیلی لطف کردی در حق ما.
قربانت.
محمدرضا
علی جان همون پاسکالشو بده.
من پاسکالم از سیم بهتره.
دقیق یادم نیست ولی اون زمان که کار میکردم اگه اشتباه نکنم باید شماره مد رو با عددی جمع میکردیم تا بافر گرافیکی رو پاک کنه. چون در زمان سوییچ به VESA بافر پاک نمیشه محتویاتش اینجوری دیده میشه.نقل قول:
من وقتی تو مد وسا سوییچ مشم یه صفحه میاد که تمیز نیست یعنی توش پیکسلهایی هست که من رسم نکردم.
اگه پیدا کردم برات میذارم.
پیدا کردم، اگه بیت 15 از شماره مد رو ست کنید بافر پاک نمیشه.
این دو فایل رو هم ببینید تا بیشتر راجع به VESA بدونید.
سلام
به این لینک هم یه سر بزنید.
من زبانم بده.
http://www.faqs.org/faqs/pc-hardware...a-programming/
#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();
}
سلام
اینو ببینید.
یکی از دوستان همینجا فرستاده بود من کمی تغیرش دادم.
یعنی از حالت سر فایل به فایل نه چیز دیگه.
اما باز هم جواب نمیده.
میشه کمک کنید؟
Iran-Pc
بهتره که از
برای نشون دادن برنامه ات استفاده کنی اینجوری چیزی معلوم نیست !!نقل قول:
CODE
/CODE
سلامنقل قول:
نوشته شده توسط Iran-PC
مشکل اول که همون دلیلش پاک نشدن 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 که من هم با اوون کار میکردم.
ممنون علی
سلام و خیلی ممنون.
یه سوال.
با استفاده از پورتها نمیشه به صورت سریع پیکسلها رو نمایش داد؟
اینو ببینید (نمونه مثال کتاب پی سی اینترن البته 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
میشه ببینید و کمک کنید.
دیگه داره کفریم میکنه.
اون مثالی که داشتید و گفتید به زبان پاسکال هست رو هم لطفا بفرستید.:بوس:
شما فقط فایل سی رو کامپایل کردی
باید فایل اسمبلی هم کامپایل کنی بعدش هم فایل ابجکت سی و هم ابجکت اسمبلی رو باهم لینک کنی
LINK SVGA.OBJ + ASM.OBJ
اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟
فرضا اگه با MASM کار میکنید اینطوری:نقل قول:
اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟
Masm myprog.asm;
اما توجه داشته باشید که مدل حافظه هر دو کد (سی و اسمبلی) باید یکسان باشه.
پالیز جان خیلی ممنون.
یه سوال دیگه.
من با مسم هم تست کردم
نمیدونم چرا نشد
میپرسه اسم فایل و آبجکت و یه سری دیگه رو اما آخر سر میبینم چیزی نساخته
مسم که سی رو ساپورت کنه با مسم معمولی فرقی میکنه؟