امروز میخواهیم با مطالبی که خوانده ایم یک برنامه تمرینی بنویسیم . برنامه ای
برای تعریف رنگهای جدید!
اگر دارای کارت ویدئوی VGA و طبعا VGA BIOS باشید ، میتوانید از تابع ۱۰H مربوط
به اینتراپت ۱۰h (که مربوط به سرویسهای تصویری است ) برای تعریف پالت های جدید
استفاده کنید . تعداد رنگهائی که میتوان آنها را تغییر داد به نوع کارت گرافیک
و VGA BIOS مربوط است و در حالت عادی رنگهای شماره ۰تا ۷ا قابل تعریف هستند .
پالت رنگ را به این صورت باید تعریف کنیم : AH=10H
AL=10H
شماره رنگ از ۰تا BX= 7ا
عدد رنگ سبز CH=
عدد رنگ آبی CL=
عددرنگ قرمز DH=
رنگهائی که دیده میشود ، ترکیبی از سه رنگ اصلی قرمز،سبز و آبی (RGB) هستند .
برای تعریف یک رنگ جدید نیز باید مقدار هر رنگ اصلی در پالت مورد نظر را در
نیم ثباتهای CH/CLو DHوC قرار دهیم . این مقادیر ۶ بیتی و در محدوده ۱ تا ۶۳
هستند .
پس از مقداردهی ثباتها اینتراپت ۱۰h را فراخوانی میکنیم . در مثال زیر ما رنگ
شماره ۱ که آبی میباشد را تغییر داده ایم .
تمرین : برنامه را برای رنگهای شماره ۲تا ۷ا نیز با مقادیر دلخواه تکمیل کنید
. MODEL SMALL
. CODE
ORG 100H
START :
MOV AH/010H
MOV AL/010H
MOV BX/1 ; COLOR NUMBER
MOV CH/12 ; GREEN VALUE
MOV CL/24 ; BLUE VALUE – THE 16-BIT NUMBER
MOV DH/14 ; RED VALUE
INT 10H ; VIDEO BIOS INT .
INT 20H ; TERMINATE PROGRAM
END START
ما در اینجا وجود VGA BIOS را تست نکرده ایم و اگر این برنامه روی کامپیوتری
با کارت گرافیک EGA و … اجراشود نتایج غیرقابل پیش بینی بدست خواهد آمد.
یک راه ساده برای تست وجود کارت VGA وجود دارد . به اینصورت که مقدار ثباتهای AH
و ALو را به ترتیب برابر ۱Ah و ۰۰h قرار داده و اینتراپت ۱۰h را اجرا میکنیم
اگر بعد از فراخوانی وقفه ، AL برابر ۱Ah بود یعنی کارت VGA فعال است .
پس در برنامه ای که نوشتیم میتوانیم با یک دستور CMP ساده از بوجود آمدن خطای
نبود VGA BIOS جلوگیری کنیم .
بنا براین برنامه را به این صورت تکمیل میکنیم :
. MODEL SMALL
. CODE
ORG 100H ; BEGINING OFFSET : 100H
START :
MOV AH/1AH
این قسمت را | MOV AL/00
اضافه کرده ایم | INT 10H CMP AL/1AH ; VGA BIOS EXIST? |
; NO UJUMP TO THE END JNZ NOVGA
MOV AH/010H
MOV AL/010H
MOV BX/1 ; COLOR NUMBER
MOV CH/12 ; GREEN VALUE
MOV CL/24 ; BLUE VALUE – THE 16-BIT NUMBER
MOV DH/14 ; RED VALUE
INT 10H ; VIDEO BIOS INT.
NOVGA:
INT 20H ; TERMINATE PROGRAM
END START
در برنامه بالا اگر بعد از اجرای وقفه ۱۰h مقدار AL برابر ۱Ah نباشد، نمیتوانیم
از سرویس تعریف رنگ استفاده کرده و مجبوریم برنامه را با پرش به NOVGA خاتمه
دهیم .
در این قسمت با نوشتن یک برنامه ، دو تابع مفید از وقفه ۱۰h را یاد گرفتیم و
دیدیم که نوشتن یک برنامه اسمبلی برخلاف آنچه تا بحال تصور میکردیم چقدر ساده
و جالب است .
پیروز باشید
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن