Kwaikwayon Linus Torvalds: Createirƙiri tsarin aikinku daga karce (II)

Barka da zuwa wani matsayi akan yadda zamu ƙirƙiri namu tsarin aiki, a wannan yanayin NextDivel.

Idan muka koma ga lambar farko post a karshen komai ya kamata mu zo da wani abu kamar haka:

Kusa-1

Idan wannan daidai ne zamu iya ci gaba. Zan yi amfani da tsarin da tsarin da nake dashi akan GitHub (http://github.com/AdrianArroyoCalle/next-divel) tunda yafi dacewa da ni da ku. Kamar yadda kake gani rubutu rubutu ne na asali, ba abin birgewa bane. Yana iya zama kamar wani abu ne na yau da kullun. Amma kamar yadda ake faɗa, don ɗanɗana launuka, kuma a cikin tsarin aikinmu za a sami launuka. Launuka na farko da zamu iya sanyawa sune waɗanda ke bayyana katunan VGA kuma sune 0:

  1. Black
  2. Azul
  3. Verde
  4. Cyan
  5. Rojo
  6. Magenta
  7. Marrón
  8. Haske launin toka
  9. Launin toka mai duhu
  10. Haske mai shuɗi
  11. Haske kore
  12. Cyan bayyanannu
  13. Haske ja
  14. Haske magenta
  15. Haske launin ruwan kasa
  16. White

Za mu ayyana waɗannan launuka a cikin taken don samun saukakke kuma mai yiwuwa a nan gaba zama ɓangare na tsarin API. Don haka mun ƙirƙiri fayil ɗin ND_Colors.hpp a cikin NextDivel sun haɗa.

#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

A lokaci guda zamu bayyana mahimman ayyuka don yin rubutu akan allo ta hanyar da ta fi dacewa (a'a, ba za mu aiwatar da bugawa ba tukuna, na san kuna so). Za mu ƙirƙiri fayil da taken kansa don saitin ayyukan da suka shafi allo (ND_Screen.cpp da ND_Screen.hpp). A cikinsu zamu kirkiro ayyuka zuwa: canza launin haruffa da bango, rubuta jimloli da haruffa, tsabtace allon kuma matsawa kan allo. Muna ci gaba da amfani da fuskokin VGA amma yanzu zamuyi amfani da byan baiti waɗanda zasu ba da launi. ND_Screen.cpp zai yi kama:

/**
* @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;
}

Rubutun kai yana da mahimmanci don haka ban sanya shi a nan ba, amma nuna ma'anar nau'in ND_SIDE

typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;

También mencionar que hacemos uso del header ND_Types.hpp, este header nos define unos tipos básicos para uint8_t, uint16_t, etc basado en los char y los int. Realmente este header es el en el estándar C99 y de hecho mi ND_Types.hpp es un copia/pega del archivo desde Linux, así que podeis intercambiarlos y no pasaría nada (solo hay definiciones, ninguna función).

Don gwada idan wannan lambar tayi aiki zamu canza wurin shigar C na kwaya:

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");

Kuma idan muka bi wadannan matakan zamu sami wannan sakamakon

Kusa-3

Godiya ga waɗannan ayyukan da muka ƙirƙira, zamu iya fara yin ƙananan GUI, kamar firgitar kwaya da za mu nuna a duk lokacin da aka sami kuskuren da ba za a iya ganowa ba. Wani abu kamar haka:

Kusa-4

Kuma wannan ɗan GUI mun sanya shi kawai tare da waɗannan ayyukan:

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);
}

Kuma har zuwa nan gidan. Ina tunatar da ku umarnin don tattara tsarin daga 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

Kuma ina amfani da wannan damar in gode muku da irin kyakkyawar tarbar da mukamin farko yayi.


Bar tsokaci

Your email address ba za a buga. Bukata filayen suna alama da *

*

*

  1. Wanda ke da alhakin bayanan: Miguel Ángel Gatón
  2. Manufar bayanan: Sarrafa SPAM, sarrafa sharhi.
  3. Halacci: Yarda da yarda
  4. Sadarwar bayanan: Ba za a sanar da wasu bayanan ga wasu kamfanoni ba sai ta hanyar wajibcin doka.
  5. Ajiye bayanai: Bayanin yanar gizo wanda Occentus Networks (EU) suka dauki nauyi
  6. Hakkoki: A kowane lokaci zaka iyakance, dawo da share bayanan ka.

  1.   f3niX m

    Madalla da aboki, duk da haka nima na kashe hular kaina fahimtar lambar a c ++.

    Na gode.

  2.   pandacriss m

    wadannan abubuwan suna da kyau. Sun sake jan hankalina game da ƙaramin matakin sarrafawa.
    watakila idan ina da lokaci zan fara wasa da-divel na gaba.
    Ban dade da aika wani labari ba. an riga an buƙata

  3.   Jon burrows m

    Yayi daidai, wannan ita ce hanya.

  4.   Miguel m

    Na dade ina son sanin yadda ake gina tsarin aiki.

    Ana jiran rubutunku na gaba. Murna

  5.   Giuliano m

    Babban aboki!
    Ina da matsala guda ɗaya, wani zai iya wuce min fayil ɗin C na wannan misalin?
    Yana koyaushe aika mani kuskure a cikin tashar