به نام خداوند بخشنده و مهربان!

سلام عرض میکنم خدمت شما دوستان عزیز و هموطنان گرامی! امیدوارم حال همه تون خوب باشه!

این بار هم قسمت بعدی طراحی و ساخت سیستم عامل رو براتون آماده کردم. امیدوارم مفید باشه!

خوب ما توی جلسات قبل وارد مود محافظت شده شدیم! و در نهایت در جلسه پیش خط A20 رو فعال کردبم که یعنی به 4 گیگابایت حافظه دسترسی داریم! الان هرکاری میکنیم توی مود 32 بیتی انجام میشه و این مود با مورد 16 بیتی قبل بسیار تفاوت داره! دیگه خبری از وقفه های BIOS نیست و هر ارتباطی خواستیم انجام بدیم باید خودمون مستقیم با سخت افزار ارتباط برقرار کنیم! اینها سختی های مود 32 بیتی هست که البته معلمومه سیستم عامل کار پیچیده و سختیه!

الان توی مود 32 بیتی هستیم و برای نمایش متن و کاراکتر نمیتونیم از وقفه های BIOS استفاده کنیم! چازه اش چیه؟ باید خودمون مستقیم با صفحه نمایش ارتباط برقرار کنیم! البته ارتباط برقرار نمیکینم بلکه تنها کاری که باید بکنیم اینکه باید بریم و توی یه مکان مخصوص و تعیین شده ای از حافظه کاراکتر خودمون رو بنویسیم! به همین راحتی.

البته قبل از اینا باید با مفاهیمی درباره صفحه نمایش و VGA و... آشنا بشیم! بنابراین به سراغ این مفاهیم میریم!

 

خوب کلمه VGA مخفف سه کلمه  Video Graphics Array هست! یه استاندارد نمایش کامپیوتری هست که در سال 1987 توسط شرکت کامپیوتری IBM ابداع و خلق شد. 

ببینید راستش خودم بعضی وقتا از چیز هایی که توی سایت منبع نوشته سر در نمیارم بنابراین با کمال شرمندگی نمیتونم براتون چیز هایی که نفهمیدم رو توضیح بدم! ولی بد نیست شما هم مثل من برای اینکه بیشتر از قضیه سر در بیارید برید توی سایت منبع و اون قسمت هایی رو که من ارجاع دادم از اونجا مطالعه کنید که چیز غیر قابل فهمی براتون نمونه! الان وارد سایت زیر بشید و از قسمت VGA - Theory تا قسمت Video Modes رو مطالعه بفرمایید!

http://www.brokenthorn.com/Resources/OSDev10.html

خوب مثه اینکه VIDEO MODE یه شیوه نمایش هست! که دارای دو حالت هست که مشخص میکنه دیتا چطوری روی صفحه نمایش نشون داده بشه. همونطور که گفتم دارای دو مود هست که مود اول به نام APA Geraphics و مود دوم Text هست!

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

ببینید ما مود های مختلفی برای نمایش داریم. از جمله MDA, CGA , EGA که ساختار اینها برای درک بهتر VGA به ما کمک میکنه! بنابراین هرکدوم رو به طور مختصر توضیح میدم!

درسال 1981 شرکت IBM یه استانداردی رو برای کارت های نمایش توسعه داد که اسمش رو Monochrome Display Adapter (MDA) گذاشته بود! یعنی آداپتر نمایش تک رنگ، یعنی کلا صفحه نمایش با این استاندارد یه رنگ رو بیشتر پشتیبانی نمیکنه! و فقط از مود text پشتیبانی میکنه. علاوه بر این در این مود ما میتونیم 80 ستون در 25 سطر کاراکتر بنویسیم! که اگه اینها رو در هم ضرب کنیم تعداد کل کاراکتر هایی که توی صفحه نمایش جا میشه بدست میاد! s07

این رو هم بدونید که این شیوه نمایش یکی از استاندارد های رایج کامپیوتر های قدیمی بود! (شما یادتون نمیاد...! s14)

 

در همون سال IBM یه استاندراد نمایش دیگه ای رو هم توسعه داد که اسمش رو  Color Graphics Adapter گذاشته بودن یعنی آداپتر گرافیکی رنگی! که اولین استاندارد نمایش رنگی برای PC محسوب میشد! جالب اینجاست که این استاندارد تنها از 16 رنگ پشتیبانی میکرد

این استاندارد از دو مود گرافیک و دو مود تکست پشتیبانی میکرد! که شرح اونها به صورت زیر است

  • 40x25 characters (16 color) text mode
  • 18x25 characters (16 color) text mode
  • 320x200 pixels (4 colors) graphics modes
  • 640x200 pixels (Monochrome) graphics mode

 

و در آخر یه مود دیگه ای هم هست که IBM اونو در سال 1984 معرفی کرده Enhanced Graphics Adapter که رزولوشن این استاندارد از اونا بیشتره (اگه اشتباه نکنم)

نکته مهم: دقت کنید که BIOS با مود MDA شروه به کار میکنه بنابراین 80 ستون در 25 سطر کاراکتر قایل دسترسی هستن!

دقت کنید که کنترلر VGA از آدرس 0xA0000 تا 0xBFFFF مپ میشه. یعنی برای دسترسی به صفحه ی نمایش و VGA باید از این آدرس استفاده کنیم! که شکل اون هم به صورت زیر هست

  • 0xA0000 - 0xBFFFF Video Memory used for graphics modes
    • 0xB0000 - 0xB7777 Monochrome Text mode
    • 0xB8000 - 0xBFFFF Color text mode and CGA compatible graphics modes

خوب گفتیم که هر کاراکتر یک بایت هست همینطور گفتیم که IBM برای صفت هر کاراکتر مثلا رنگ اون و... یک بایت در نظر گرفته بنابراین هر کاراکتر ما میشه دو بایت که بایت اول کاراکتر رو نشون میده و بایت بعدی هم صفت اون رو نشون میده!

بزارید خیلی راحت بگم که کلا برای نوشتن کاراکتر باید در مقدار 0XB8000 بنویسیم. به همین راحتی

کد زیر رو نگاه کنید در مقدار مشخص شده کاراکتر A رو با صفت 0X7 قرار میده! بنابراین این کاراکتر در سطر اول و ستون اول از صفحه نمایش نشان داده خواهد شد!

%define	VIDMEM	0xB8000		; video memory
 
	mov	edi, VIDMEM		; get pointer to video memory
	mov	[edi], 'A'		; print character 'A'
	mov	[edi+1], 0x7		; character attribute

خوب دیدید که خیلی آسونه و فقط باید حواستون رو جمع کنید که جای کاراکتر و صفت رو بر عکس ننویسید!

احتمالا شما تا حالا فهمیده باشید که خوب برای نوشتن کاراکتر در موقعیت دلخواه باید چه کار کرد؟! کار سختی نیست احتمالا خودتون به نتیجه رسیده باشید!

ببینید کلا این صفحه نمایش با کل کاراکتر ها و صفت هاش در حافظه به صورت پشت سر هم اومده یعنی مثلا میتونیم بگیم که اگه ما سگمنت رو روی همون 0XB8000 یا در کد بالا روی VIDMEM قرار بدیم. آفست 0 میشه کاراکتر اول و همینطور آفست 1 میشه صفت کاراکتر اول! آفست 2 میشه کاراکتر دوم و آفست سوم میشه صفت کاراکتر دوم! بنابراین اگه ما بخوایم کاراکتر خودمون رو در ستون 9 قرار بدیم با توجه به اینکه ستون ما از 0 تا 79 است میتونیم بگیم 8*2 یا همون آفست 16 مکان کاراکتر 9 ام و آفست 17 صفت کاراکتر هست.

خوب برای سطر هم همین کار رو میکنیم! و مثلا اگه بخوایم در همون ستون 9 ولی در سطر بعدی یا همون سط 1 بنویسیم باید 16 رو با 80 جمع کنیم و این آدرس آفست برای سطر 1 ستون 9 صفحه نمایش است!

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

مکان کاراکتر = (تعداد کل ستون * Y) + مقدار X

در فرمول بالا Y برابر با سطر و X برابر با ستون هست! که البته در نهایت باید در یه دو ضرب بشه تا مقدار نهایی بدست بیاد!

طبق فرمول بالا اگه بخوایم مقدار سطر 2 و ستون 4 رو بدست بیاریم به صورت زیر میشه

164= (2*80) + 4

یعنی الان ما مقدار 164 رو در عدد 2 ضرب میکنیم تا مقدار نهایی محا کاراکتر در حافظه بدست بیاد که میشه 328 که اگه الان 328 رو با مقدار 0XB8000 جمع کنیم میشه محل حافظه ای که کاراکتر سطر 2 و ستون 4 در اون قرار میگیره!

 

خوب گفتیم بایت دوم هر کاراکتر صفت اون هست. ببینید صفت یعنی رنگ خود کاراکتر و رنگ پس زمینه اون کاراکتر که هر کدوم 4 بیت هست بنابراین ما میتونیم 16 رنگ مختلف برای پس زمینه و پیش زمینه داشته باشیم!

و بنابراین 4+4 میشه 8 یعنی ما با هشت بیت یا 1 بایت رنگ اون رو مشخص میکنیم! ترتیب رنگ ها هم به صورت زیر است

  • 0 - Black
  • 1 - Blue
  • 2 - Green
  • 3 - Cyan
  • 4 - Red
  • 5 - Magenta
  • 6 - Brown
  • 7 - Light Gray
  • 8 - Dark Gray
  • 9 - Light Blue
  • 10 - Light Green
  • 11 - Light Cyan
  • 12 - Light Red
  • 13 - Light Magenta
  • 14 - Light Brown
  • 15 - White

که این ترتیب رنگ هم برای رنگ متن و هم برای پس زمینه صادق هست! 

همچین 4 بیت رنگ متن و 4 بیت رنگ پس زمینه از فرمت زیر پیروی میکنه!

  • Bits 0 - 2: Foreground color
    • Bit 0: Red
    • Bit 1: Green
    • Bit 2: Blue
  • Bit 3: Foreground Intensity
  • Bits 4 - 6: Background color
    • Bit 4: Red
    • Bit 5: Green
    • Bit 6: Blue
  • Bit 7: Blinking or background intensity

دیگه کار من تموم شد

 

برید توی سایت منبع و از اینجا به بعدش رو خودتون مطالعه کنید! قطعا متوجه خواهید شد که چی میگه! (از قسمت SETTING UP به بعد رو مطالعه کنید)

اگه متوجه نشدید نظر بدید در خدمتتون هستم!

قسمت هایی که من نگفتم ساخت تابع نمایش استرینگ هست که با چیز هایی که من گفتم خودتون میتونید به راحتی بنویسید ولی اگه نتونستید مهم نیست برید توی سایت منبع آموزشش رو بخونید و یا از روی سورس پروژه ای که گذاشتم استفاده کنید!

دانلود سورس پروژه ی این قسمت

امیدوارم این قسمت هم برای شما عزیزان ایرانی مفید بوده باشه و تونسته باشم موجب این بشم که شما در حقم دعا بفرمایید

فعلا

یا علی مدد...!