PDA

View Full Version : نمایش 512 کاراکتر بطور همزمان در محیط داس



PalizeSoftware
سه شنبه 15 آذر 1384, 18:37 عصر
سلام دوستان
خب این هم تاپیکی که قولش را داده بودم.
قصد داریم در محیط متن و در داس 512 کاراکتر را بطور همزمان فعال کنیم.
می‌دونید که در حالت عادی قادر به مشاهده فقط 256 کاراکتر هستیم، اما این امکان رو داریم که در لحظه لود فونت‌ها مشخص کنیم که در چه بلوکی فونت‌ها لود بشن. در حالت عادی و در اغلب برنامه‌ها (فارسی‌سازها) بلوک صفر در نظر گرفته می‌شه.
در میان توابع وقفه 10h، تابع 11h قابلیت لود فونت‌ها رو به ما میده. ضمن اینکه زیر تابع 10h امکان لود رو توسط یوزر فراهم می‌کنه.
پارامترهای این تابع به قرار زیرند:


AX=1110h
Bh=تعداد بایت در هر کاراکتر
Bl=شماره بلوک
CX=تعداد کاراکترها
DX=کد اولین کاراکتر
ES:BP=آدرس داده‌های فونت

با این تفاسیر ما نیاز به دو مجموعه فونت داریم که بتونیم 512 (2×256) کاراکتر رو نشون بدیم. پس مجموعه اول رو داخل بلوک صفر(0)، و مجموعه دوم رو داخل بلوک یک(1) لود می‌کنیم.
خب بعد از اینکه ما این کار رو انجام دادیم، چطوری باید به سیستم حالی کنیم که مثلا کاراکتر x رو از مجموعه اول نمایش بده یا مجموعه دوم؟
راه‌حل اینکار اینه که از این به بعد رنگها رو محدود کنیم. یعنی از بین 16 رنگ قابل انتخاب در محیط متن، 8 رنگ اول (رنگهای 0 تا 7) رو به مجموعه اول و 8 رنگ بعدی (رنگهای 8 تا 15) رو به مجموعه دوم اختصاص بدیم تا بدین طریق بتونیم بین تو مجموعه انتخاب داشته باشیم.
یعنی اگر خواستیم کاراکتر x‌ رو از مجموعه دوم نمایش بدیم، باید رنگ‌اش یکی از رنگها 8 الی 15 باشه و الا از مجموعه اول نمایش داده میشه.
اگر تا اینجا کارها رو انجام داده باشید متوجه میشید که همه کاراکترها از مجموعه اول انتخاب شدند. آیا جایی اشتباه کردیم؟
نه، هنوز یک قدم دیگه باقی مونده و اون اینه که کنترلر گرافیک باید این موضوع رو بفهمه.
این کنترلر رجیستری داره به شماره 3 که این وضعیت رو مشخص می‌کنه. مقدار دهی این رجیستر از طریق پورت‌های 3C4h و 3C5h قابل دسترس است. رجیستر 3 بیت‌های مشخصی داره منتها برای اینکه شما بی‌دردسر بتونید وضعیت بلوک‌های فونت رو مشخص بسازید شما رو با پیچیدگی اون روبرو نمی‌کنم.
بنابراین برای فعال کردن هر دو مجموعه فونت باید به پورت 3C4h مقدار 3 رو بفرستید و به پورت 3C5h مقدار 4 رو بفرستید. دستورات نظیر اینگونه هستند



Cli
Mov Dx,03C4h
Mov AX,0403h
Out Dx,Ax
Sti




و برای غیرفعال کردن و بازگشت به حالت اول این دستورات رو بکار می‌بریم:




Cli
Mov Dx,03C4h
Mov AX,0003h
Out Dx,Ax
Sti

برای اینکه با کار عملی در این رابطه آشنا بشید، سورس برنامه زیر رو دانلود کنید تا به شما 512 کاراکتر رو بطور همزمان نمایش بده.
یک ابزار اضافی دیگه هم برای طراحی فونت‌ها در محیط داس برای شما تدارک دیده‌ام که امکان تهیه داده‌ها رو برای زبانها سی، پاسکال و اسمبلی فراهم می‌کنه.

و اما نکته‌ای که در ارتباط با برنامه LoadMess که در تاپیک زیر
http://www.barnamenevis.org/forum/showthread.php?t=23375
مشاهده کردید باید اشاره کنم و این مطلب هست که برای سرعت بخشیدن به عملکرد برنامه، قبلا برنامه‌ای نوشته بودم که فریم، فریم از حالات سینوسی متنی در محیط گرافیک فونت تهیه می‌کرد و در یک حلقه آنرا بدرون بلوک یک (1) لود می‌کردم و این باعث میشد که حالت سینوسی نرمی احساس بشه.
انشاالله که مطالب کافی باشه. (خودم رو کشتم تا بعد از 4-5 سال دوری از اسمبلی اینها رو نوشتم)
سوالی بود بفرمائید.

aakh1361
سه شنبه 15 آذر 1384, 20:05 عصر
پالیز جان ممنون خیلی جالب و مفید بود http://asefsoft.com/qsimages/18.gif
میرم روش کار می کنم اگر کار نکرد میام سراغت http://asefsoft.com/qsimages/167.gif http://asefsoft.com/qsimages/167.gif

aakh1361
جمعه 18 آذر 1384, 02:59 صبح
آقا پالیز مقاله تون رو با اجازه شما به صورت PDF در آوردم و بزودی بر روی سایت اپلد می کنم

یک سوال هم داشتم


بنابراین برای فعال کردن هر دو مجموعه فونت باید به پورت 3C4h مقدار 3 رو بفرستید و به پورت 3C5h مقدار 4 رو بفرستید. دستورات نظیر اینگونه هستند


Cli
Mov Dx,03C4h
Mov AX,0403h
Out Dx,Ax
Sti

ولی شما فقط 0403hرو به پورت 03C4hفرستادید ولی به پورت 3C5h هیچ مقداری نفرستادید میشه در این مورد توضیح کاملتر بدید http://asefsoft.com/qsimages/120.gif http://asefsoft.com/qsimages/120.gif

PalizeSoftware
جمعه 18 آذر 1384, 03:08 صبح
اون دستورات رو باید اینطوری می‌نوشتم:


Mov Dx,03C4h
Mov Al,03
Out Dx,Al
Mov Dx,03C5
Mov Al,04
Out Dx,Al

چون این دو پورت، یعنی 3C4 و 3C5‌ پشت سر هم هستند و از نوعی هستند که در پورت 3C4 آدرس رو مشخص می‌کنیم و از پورت 3C5‌ داده رو دریافت یا می‌نویسیم پس می‌شه بصورت Word به اونها داده فرستاد که در اینصورت بایت کم ارزش در پورت 3C4 و بایت پرارزش در پورت 3C4+1 ریخته میشه.

aakh1361
جمعه 18 آذر 1384, 03:51 صبح
http://asefsoft.com/qsimages/64.gif
از جواب شما سوال برام پیش اومد که یعنی به هر پورت نمیشه بیشتر از یک بایت فرستاد ؟
اگر WORD باشه قسمت بالای اون به پورت بعدی فرستاده میشه ؟ http://asefsoft.com/qsimages/77.gif

PalizeSoftware
جمعه 18 آذر 1384, 04:07 صبح
به هر پورت نمیشه هر داده‌ای فرستاد. در پشت هر پورت سخت‌افزاری، کنترلی قرار داره که حکم می‌کنه داده‌ها باید به چه نحوه براش ارسال یا ازش دریافت بشن. این پورتها که در برنامه از اونها استفاده شده، 8 بیتی هستند و روش آدرس‌دهی اونها دقیقا باید رعایت بشه . خیلی محتاتانه. چه بسا که یه آدرس‌دهی اشتباه ممکنه وسیله صدمه ببینه. مخصوصا اگه پای کنترلر گرافیک مطرح باشه.
اینکه بایت بعدی به پورت بالاتر ارسال میشه، باید بگم همیشه اینطور نیست. معماری خود پورت‌ها این رو مشخص می‌کنه. به این پورت‌ها، پورتهای Sequencer می‌گن.

aakh1361
جمعه 18 آذر 1384, 04:16 صبح
ممنون از پاسخ شما
اینطور که شما گفتید پس بعضی از پورتها 8 و بعضی 16 بیتی هستند
درسته ؟

PalizeSoftware
شنبه 19 آذر 1384, 18:20 عصر
اینطور که شما گفتید پس بعضی از پورتها 8 و بعضی 16 بیتی هستند
درسته ؟
ببین دوست عزیز، ریزپردازنده‌ها علاوه بر دسترسی به حافظه، قادرند از طریق پورت‌ها به وسایل I/O نیز دسترسی داشته باشند. داده‌ای از پورت به داخل پردازنده و از پردازنده به داخل پورت منتقل میشه.
نحوه انتقال داده است که می‌تواند 8 بیتی یا 16 بیتی باشد. معماری باس مشخص می‌کند که چند بیتی است و قابلیت رد و بدل داده‌های 8 و 16 بیتی بر عهده باس میباشد. در معماری 8 بیتی، آدرس هر پورت بین 0 تا 255 می‌تواند باشد و در معماری 16بیتی تا 65535. تا اونجا که من می‌دونم هر پورت پذیرای فقط 8 بیت داده است (اگه اشتباه می‌گم دوستان و اساتید بفرمایند).
در انتقال 8 بیتی، 8 بیت مستقیما به همان آدرس پورت فرستاده می‌شود که در 8086 آدرس پورت در رجیستر DX و داده باید در رجیستر AL‌ قرار گیرد. بدین صورت:


Mov dx,Port Address
Mov al,Data
Out dx,al

و در حالت انتقال 16 بیتی، شما از رجیستر AX استفاده می‌کنید بدین شکل



Mov dx,Port Address
Mov ax,Data
Out dx,ax

منتها این قابلیت رو باس فراهم می‌کنه و رفتار بدینگونه هست که 8 بیت کم‌ارزش به آدرس پورت موجود در رجیستر DX‌ و 8 بیت باارزش به آدرس بعدی یعنی DX+1 ارسال می‌شود.
لذا در برنامه‌ریزی ثبات‌های کنترلر، ابتدا شماره رجیستر رو به پورتی ارسال می‌کنیم و در آدرس بعدی پورت، داده را دریافت یا ارسال می‌کنیم. لازم به ذکر هست که برخی از رجیسترها فقط خواندنی یا فقط نوشتی یا هر دو قابلیت رو دارند.