
نوشته شده توسط
prpe26
1. بله
2. چیزی که کاربر تایپ میکنه رو به صورت همزمان نشون بدم (دقیقا یه Prompt).
در مورد چاپ کاراکتر برروی صفحه نمایش : برخی از دستگاه های ورودی / خروجی مثل صفحه نمایش به آدرس های خاصی از حافظه ی اصلی نگاشت میشوند یعنی به محض اینکه شما در آن آدرس ها داده وارد کنید تغییرات روی این دستگاه ها اعمال می شود. برای صفحه نمایش شما میتوانید از آدرس 0xB8000 برای نوشتن مستقیم برروی صفحه نمایش استفاده کنید. هر سلول در صفحه نمایش در این نگاشت شامل دو بایت کاراکتر و مشخصه ی رنگ کاراکتر میباشد. بایت اول کد کاراکتر و بایت دوم مشخصه ی رنگ.
اگر کتاب های زبان اسمبلی را مطالعه کرده باشید قالب رنگ B RGB I RGB هشت بیتی که سه بیت کم ارزش آن یعنی RGB اول رنگ کاراکتر یا ForeColor و بیت چهارم (I) غلظت این رنگ و سه بیت RGB بعدی مشخص کننده رنگ پس زمینه یا Background Color آن سلول می باشد. بیت آخر هم اگر یک شود نمایش کاراکتر بصورت چشمک زن خواهد شد. من تو شبیه ساز ها این چشمک زدن کاراکترها را مشاهده نکردم ولی وقتی روی سخت افزار واقعی بوت شدم تاثیر آن کاملا مشهود بود.
پس شد بایت اول کد کاراکتر و بایت دوم مشخصه ی رنگ کاراکتر. البته در مد فعلی صفحه نمایش ما 80 ستون و 25 سطر داریم و با در نظر داشتن اینکه آدرس 0xB8000 آدرس شروع است و این آدرس خطی است برای رفتن به سطر i ام و ستون j ام باید از فرمول (0xB8000 + 2 * (i*80+j استفاده کنیم.
پس برای شروع :
char *VideoMemory = (char *) 0xB8000;
*(VideoMemory++) = 'H';
*(VideoMemory++) = 15; // White on Black
اگر بخواهید از نوع داده ای Short int یا متداول تر آن برای توسعه دهندگان uint16_t که از روی همین نوع داده ای تعریف شده برای کار با صفحه نمایش استفاده کنید باید بدانید که در کامپیوترهای ما نحوه ی ذخیره ی مقادیر بصورت little endian میباشد یعنی در ذخیره ی یک عدد دوبایتی ابتدا بایت کم ارزش ذخیره میشود و سپس بایت پر ارزش پس در این مواقع باید شماره ی کاراکتر 8 بیت کم ارزش باشد و مشخصه ی رنگ 8 بیت با ارزش.
مثلا : uint16_t *VideoMemory = (uint16_t *)0xB8000;
*(VideoMemory++) = 'H' | (15<<8);
در مورد n\ : شما باید تابع printf خودتان را بنویسید (: . در انجام این کار کاملا مختار هستید میتواند هر طور که خواستید طراحی کنید.
تابع printf یک تابع با تعداد ورودی نا مشخص است و پیاده سازی آن برای شما در شروع کار کمی مشکل است. فعلا میتوانید یک تابع معمولی داشته باشید که یک رشته را چاپ کند.
پس از نوشتن شما می توانید تابعی بنویسید که بطور خودکار شما را به سطر بعدی ببرد. اگر احساس میکنید الان وقت نوشتن printf جدیدتان است شروع کنیم ؟
البته در هنگام نوشتن برروی صفحه نمایش مشاهده میکنید که اشاره گر سر جای خود ثابت مانده. این امر طبیعی است شما برای حرکت دادن این اشاره گر باید در پورت صفحه نمایش مکان جدید اشاره گر را بنویسید.
هر موقع علاقمند بودید وارد اون مبحث هم میشویم.
موفق باشید