এটি (আংশিকভাবে) বিআইওএসের ভূমিকা।
কম্পিউটারের বেসিক ইনপুট আউটপুট সিস্টেমটি প্রকৃত কম্পিউটারের মধ্যে এ জাতীয় পার্থক্য থাকা সত্ত্বেও অপারেটিং সিস্টেমগুলিতে একটি সাধারণ ইন্টারফেস সরবরাহ করার জন্য দায়বদ্ধ।
এটি বলেছিল, গ্রাফিক্সের জন্য বিশেষভাবে, স্ক্রিনে আঁকার বিভিন্ন উপায় রয়েছে। এখানে টিটিওয়াই কমান্ড রয়েছে যা আপনি বিআইওএসে প্রেরণ করতে পারেন, তবে এটি কেবল আসল মোডে। আপনি যদি সুরক্ষিত মোডে কিছু আঁকতে চান তবে জিনিসগুলি আঁকতে আপনার ভিজিএ ব্যবহার করতে হবে। আমি ওএসডিভের চেয়ে এটি আরও ভাল ব্যাখ্যা করতে পারি না, সুতরাং আরও তথ্যের জন্য এখানে দেখুন - তবে মূলত, আপনি 0xB8000
পর্দায় জিনিসগুলি আঁকতে ঠিকানায় শুরু করে মেমোরিতে (ভিডিও মেমরি মেমরি-ম্যাপযুক্ত) লিখতে পারেন ।
আপনার যদি ভিজিএর তুলনায় উচ্চতর রেজোলিউশন প্রয়োজন হয় তবে আপনার ভেসা বায়োস এক্সটেনশনগুলি ব্যবহার করতে হবে; আমি এটির সাথে পরিচিত নই, তবে আরও তথ্যের জন্য GRUB উত্স কোডটি দেখার চেষ্টা করুন।
কিছু দরকারী তথ্যসূত্র:
আপনি যদি ডি এর সাথে পরিচিত হন - আমি কিছুক্ষণ আগে একটি ছোট বুট লোডার লিখেছিলাম যা স্ক্রিনে লিখতে সক্ষম হয়েছিল (কেবল পাঠ্য)। আপনি যদি আগ্রহী হন তবে কোডটি এখানে:
align(2) struct Cell { char ch; ubyte flags = 0x07; }
@property Cell[] vram()
{ return (cast(Cell*)0xB8000)[0 .. CONSOLE_WIDTH * CONSOLE_HEIGHT]; }
void putc(char c)
{
if (isBochs) { _outp(0xE9, c); } // Output to the Bochs terminal!
bool isNewline = c == '\n';
while (cursorPos + (isNewline ? 0 : 1) > vram.length)
{
for (short column = CONSOLE_WIDTH - 1; column >= 0; column--)
{
foreach (row; 0 .. CONSOLE_HEIGHT - 1)
{
uint cell = column + cast(uint)row * CONSOLE_WIDTH;
vram[cell] = vram[cell + CONSOLE_WIDTH];
}
vram[column + (CONSOLE_HEIGHT - 1) * CONSOLE_WIDTH].ch = ' ';
}
cursorPos = cast(ushort)(cursorPos - CONSOLE_WIDTH);
}
if (isNewline)
cursorPos = cast(ushort)
((1 + cursorPos / CONSOLE_WIDTH) * CONSOLE_WIDTH);
else vram[cursorPos++].ch = c;
}
void putc(char c, ubyte attrib) { vram[cursorPos] = Cell(c, attrib); }
void memdump(void* pMem, size_t length)
{
foreach (i; 0 .. length)
putc((cast(char*)pMem)[i]);
}
void clear(char clear_to = '\0', ubyte attrib = DEFAULT_ATTRIBUTES)
{
foreach (pos; 0 .. vram.length)
vram[pos] = Cell(clear_to, attrib);
cursorPos = 0;
}
@property ushort cursorPos()
{
ushort result = 0;
_outp(0x3D4, 14);
result += _inp(0x3D5) << 8;
_outp(0x3D4, 15);
result += _inp(0x3D5);
return result;
}
@property void cursorPos(ushort position)
{
_outp(0x3D4, 14);
_outp(0x3D5, (position >> 8) & 0xFF);
_outp(0x3D4, 15);
_outp(0x3D5, position & 0xFF);
}