د لینوس تورالډز تقلید کول: له خپل سکریچ سیسټم له سکریچ څخه جوړ کړئ (II)

بل پوسټ ته ښه راغلاست وایو چې څنګه زموږ خپل عملیاتي سیسټم رامینځته کړئ ، پدې حالت کې NextDivel.

که موږ بیرته د کوډ ته لاړ شو لومړی پوسټ د هرڅه په پای کې ، موږ باید د دې په څیر یو څه ترلاسه کړو:

NextDivel-1

که دا سم وي نو موږ دوام ورکولی شو. زه هغه سیسټم او جوړښت کاروم چې زه یې په GitHub کې لرم (http://github.com/AdrianArroyoCalle/next-divel) ځکه چې دا زما او ستاسو لپاره ډیر آرام دی. لکه څنګه چې تاسو لیدلی شئ متن یو اساسي متن دی ، دا زړه راښکونکی ندي. دا ممکن د عادي څه شی په څیر بریښي. مګر لکه څنګه چې ویل کیږي ، د رنګونو خوند لپاره ، او زموږ په عملیاتي سیسټم کې به رنګونه وي. لومړی رنګونه چې موږ به یې وکولی شو هغه به وي چې د VGA کارتونه تعریفوي او دوی 0 دي:

  1. Negro
  2. Azul
  3. شنه
  4. Cyan
  5. تکتيکي
  6. Magenta
  7. مارین
  8. لږ خړ
  9. تور خړ
  10. لږ نیلي
  11. لږ شین
  12. سینان روښانه
  13. لږ سور
  14. ر maا میجنټا
  15. روښان نسواري رنګ
  16. سپينه

موږ دا رنګونه په سر کې تشریح کوو ترڅو دا ډیر لاسي وي او شاید په راتلونکي کې د سیسټم API برخه شي. نو موږ په NextDivel کې ND_box.hpp فایل رامینځته کوو.

#ifndef ND_COLOR_HPP
#define ND_COLOR_HPP
typedef enum ND_Color{
ND_COLOR_BLACK = 0,
ND_COLOR_BLUE = 1,
ND_COLOR_GREEN = 2,
ND_COLOR_CYAN = 3,
ND_COLOR_RED = 4,
ND_COLOR_MAGENTA = 5,
ND_COLOR_BROWN = 6,
ND_COLOR_LIGHT_GREY = 7,
ND_COLOR_DARK_GREY = 8,
ND_COLOR_LIGHT_BLUE = 9,
ND_COLOR_LIGHT_GREEN = 10,
ND_COLOR_LIGHT_CYAN = 11,
ND_COLOR_LIGHT_RED = 12,
ND_COLOR_LIGHT_MAGENTA = 13,
ND_COLOR_LIGHT_BROWN = 14,
ND_COLOR_WHITE = 15
} ND_Color;
#endif

په ورته وخت کې موږ په سکرین کې په آرامۍ لیکلو لپاره نوي افعال تعریف کوو (نه ، موږ لاهم د چاپ چاپ پلي نه کوو ، زه پوهیږم چې تاسو یې غواړئ). موږ به د سکرین پورې اړوند دندې (ND_Screen.cpp او ND_Screen.hpp) سیټ لپاره فایل او د هغې سرلیک جوړ کړو. په دوی کې به موږ دندې ترسره کړو: د تورو او شاليد رنګ بدل کړئ ، جملې او لیکونه ولیکئ ، پرده پاک کړئ او د سکرین شاوخوا ته حرکت ورکړئ. موږ د VGA پردې کارولو ته دوام ورکوو مګر اوس به موږ یو څو بایټونه وکاروو چې رنګ به ورکړي. ND_Screen.cpp به داسې ښکاري:

/**
* @file ND_Screen.cpp
* @author Adrián Arroyo Calle
* @brief Implements four easy functions for write strings directly
*/
#include <ND_Types.hpp>
#include <ND_Color.hpp>
#include <ND_Screen.hpp>
uint16_t *vidmem= (uint16_t *)0xB8000;
ND_Color backColour = ND_COLOR_BLACK;
ND_Color foreColour = ND_COLOR_WHITE;
uint8_t cursor_x = 0;
uint8_t cursor_y = 0;
/**
* @brief Gets the current color
* @param side The side to get the color
* */
ND_Color ND::Screen::GetColor(ND_SIDE side)
{
if(side==ND_SIDE_BACKGROUND){
return backColour;
}else{
return foreColour;
}
}
/**
* @brief Sets the color to a screen side
* @param side The side to set colour
* @param colour The new colour
* @see GetColor
* */
void ND::Screen::SetColor(ND_SIDE side, ND_Color colour)
{
if(side==ND_SIDE_BACKGROUND)
{
backColour=colour;
}else{
foreColour=colour;
}
}
/**
* @brief Puts the char on screen
* @param c The character to write
* */
void ND::Screen::PutChar(char c)
{
uint8_t attributeByte = (backColour << 4) | (foreColour & 0x0F);
uint16_t attribute = attributeByte << 8; uint16_t *location; if (c == 0x08 && cursor_x) { cursor_x--; }else if(c == '\r') { cursor_x=0; }else if(c == '\n') { cursor_x=0; cursor_y=1; } if(c >= ' ') /* Printable character */
{
location = vidmem + (cursor_y*80 + cursor_x);
*location = c | attribute;
cursor_x++;
}
if(cursor_x >= 80) /* New line, please*/
{
cursor_x = 0;
cursor_y++;
}
/* Scroll if needed*/
uint8_t attributeByte2 = (0 /*black*/ << 4) | (15 /*white*/ & 0x0F);
uint16_t blank = 0x20 /* space */ | (attributeByte2 << 8); if(cursor_y >= 25)
{
int i;
for (i = 0*80; i < 24*80; i++)
{
vidmem[i] = vidmem[i+80];
}
// The last line should now be blank. Do this by writing
// 80 spaces to it.
for (i = 24*80; i < 25*80; i++)
{
vidmem[i] = blank;
}
// The cursor should now be on the last line.
cursor_y = 24;
}
}
/**
* @brief Puts a complete string to screen
* @param str The string to write
* */
void ND::Screen::PutString(const char* str)
{
int i=0;
while(str[i])
{
ND::Screen::PutChar(str[i++]);
}
}
/**
* @brief Cleans the screen with a color
* @param colour The colour to fill the screen
* */
void ND::Screen::Clear(ND_Color colour)
{
uint8_t attributeByte = (colour /*background*/ << 4) | (15 /*white - foreground*/ & 0x0F);
uint16_t blank = 0x20 /* space */ | (attributeByte << 8);
int i;
for (i = 0; i < 80*25; i++)
{
vidmem[i] = blank;
}
cursor_x = 0;
cursor_y = 0;
}
/**
* @brief Sets the cursor via software
* @param x The position of X
* @param y The position of y
* */
void ND::Screen::SetCursor(uint8_t x, uint8_t y)
{
cursor_x=x;
cursor_y=y;
}

سرلیک به خورا بنسټیز وي نو زه یې دلته نه شاملوم ، مګر د ND_SIDE ډول تعریف روښانه کړئ

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

همدارنګه یادونه وکړئ چې موږ د ND_Types.hpp سرلیک کاروو ، دا سرلیک د uint8_t ، uint16_t ، وغیرہ لپاره ځینې لومړني ډولونه د چار او INT پراساس تعریف کوي. په حقیقت کې دا سرلیک د C99 په معیار کې یو دی او په حقیقت کې زما ND_Types.hpp د لینکس څخه د فایل کاپي / پیسټ دی ، نو تاسو کولی شئ دوی تبادله کړئ او هیڅ شی به واقع نشي (دلته یوازې تعریفونه شتون لري ، هیڅ دندې نلري).

د ازموینې لپاره که چیرې دا کوډ کار وکړي موږ به د دانو د C ننوتلو ځای ته تغیر ورکړو:

ND::Screen::Clear(ND_COLOR_WHITE);
ND::Screen::SetColor(ND_SIDE_BACKGROUND,ND_COLOR_WHITE);
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_GREEN);
ND::Screen::PutString("NextDivel\n");
ND::Screen::SetColor(ND_SIDE_FOREGROUND,ND_COLOR_BLACK);
ND::Screen::PutString("Licensed under GNU GPL v2");

او که موږ دا ګامونه تعقیب کړو موږ به دا پایله ترلاسه کړو

NextDivel-3

د دې دندو څخه مننه چې موږ یې رامینځته کړي ، موږ کولی شو کوچني GUIs رامینځته کړو ، لکه د داني ډبره چې موږ به یې هر ځل وښیو چې دلته د نه ترلاسه کیدونکي خطا شتون لري. دغسې یو شی:

NextDivel-4

او دا کوچني GUI موږ دا یوازې د دې دندو سره جوړ کړی:

void ND::Panic::Show(const char* error)
{
ND::Screen::Clear(ND_COLOR_RED);
ND::Screen::SetColor(ND_SIDE_BACKGROUND, ND_COLOR_WHITE);
ND::Screen::SetColor(ND_SIDE_FOREGROUND, ND_COLOR_RED);
ND::Screen::SetCursor(29,10); //(80-22)/2
ND::Screen::PutString("NextDivel Kernel Error\n");
ND::Screen::SetCursor(15,12);
ND::Screen::PutString(error);
}

او دلته پوسټ. زه تاسو ته د 0 څخه سیسټم تالیف کولو لارښوونو یادونه کوم:

git clone http://github.com/AdrianArroyoCalle/next-divel
cd next-divel
mkdir build && cd build
cmake ..
make
make DESTDIR=next install
chmod +x iso.sh
./iso.sh
qemu-system-i386 nextdivel.iso

او زه دا فرصت په لاره اچوم ترڅو د عالي استقبال لپاره مننه وکړم چې لومړی پوسټ یې درلود.


د مقالې مینځپانګه زموږ د اصولو سره سمون لري ایډیټیک اخلاق. د غلطۍ راپور ورکولو لپاره کلیک وکړئ دلته.

5 نظرونه ، خپل پریږدئ

خپله نظر پرېږدئ

ستاسو د بریښنا لیک پته به خپره نه شي.

*

*

  1. د معلوماتو لپاره مسؤل: میګیوانجل ګاتین
  2. د معلوماتو هدف: د سپیم کنټرول ، د نظر مدیریت.
  3. قانونیت: ستاسو رضایت
  4. د معلوماتو راټولول: معلومات به د قانوني مکلفیت پرته دریمې ډلې ته نه لیږدول کیږي.
  5. د معلوماتو ذخیره: ډیټابیس د Occentus شبکې (EU) لخوا کوربه شوی
  6. حقونه: په هر وخت کې تاسو کولی شئ خپل معلومات محدود ، له سره تنظیم او حذف کړئ.

  1.   F3niX dijo

    عالي ملګری ، حتی زه په c ++ کې د کوډ باندې پوهیدل خپل هیلمټ وژنم.

    مننه.

  2.   پانډاکرېس dijo

    دا توکي عالي دي دوی یو ځل بیا د پروسس کونکو د ټیټې کچې فعالیت په اړه زما تجسس روښانه کړ.
    شاید که زه وخت ولرم زه به د بل ډیویل سره لوبه پیل کړم.
    ما د اوږدې مودې لپاره مقاله نه ده لیږلې. دمخه اړتیا وه

  3.   جون بروز dijo

    سمه ده ، دا لاره ده.

  4.   Miguel dijo

    زه له اوږدې مودې څخه پوهیدم چې د عملیاتي سیسټم رامینځته کولو څرنګوالی.

    ستاسو راتلونکي پوسټ ته انتظار کول. هڅول

  5.   Giuliano dijo

    لوی ملګریه!
    زه یوازې یوه ستونزه لرم ، ایا یو څوک ماته د دې مثال C فایل راولیږي؟
    دا تل په ټرمینل کې ما ته غلطي لیږي