PalizeSoftware
سه شنبه 15 آذر 1384, 19: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 سال دوری از اسمبلی اینها رو نوشتم)
سوالی بود بفرمائید.
خب این هم تاپیکی که قولش را داده بودم.
قصد داریم در محیط متن و در داس 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 سال دوری از اسمبلی اینها رو نوشتم)
سوالی بود بفرمائید.