Ku soo dhowow qoraal kale oo ku saabsan sida loo abuuro nidaam hawlgal u gaar ah, kiiskan NextDivel.
Haddii aan dib ugu noqono koodhka boostada kowaad dhamaadka wax walba waxay ahayd inaan la nimaadno wax sidan oo kale ah:
Haddii tani sax tahay waan sii wadi karnaa. Waxaan isticmaali doonaa nidaamka iyo qaabdhismeedka aan ku haysto GitHub (http://github.com/AdrianArroyoCalle/next-divel) maadaama ay aniga iyo idinkaba raaxo badan tahay. Sida aad u aragto qoraalka waa qoraal aasaasi ah, ma ahan wax soo jiidasho leh. Waxay umuuqataa wax aan caadi aheyn. Laakiin sida loo yiri, dhadhanka midabada, iyo nidaamkayaga qalliinka waxaa ku jiri doona midabbo. Midabada ugu horeysa ee aan awoodno inaan dhigno waxay noqon doonaan kuwa qeexaya kaararka VGA waana 0:
- negro
- Azul
- Verde
- Cyan
- Rojo
- Magenta
- Marrón
- Cawl khafiif ah
- Cawl madow
- Buluug khafiif ah
- Cagaar khafiif ah
- Cyan cade
- Casaan khafiif ah
- Iftiin magenta
- Midab khafiif ah
- White
Waxaan ku qeexi doonnaa midabadan madax si loo helo waxtar badan oo laga yaabo in mustaqbalka qayb ka noqdo nidaamka API. Sidaas awgeed waxaan u abuureynaa faylka ND_Colors.hpp ee NextDivel ku dar.
#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
Isla mar ahaantaana waxaan qeexi doonnaa shaqooyin cusub si aan ugu qorno shaashadda qaab raaxo leh (maya, ma fulinayno daabacaadda wali, waan ogahay inaad rabto). Waxaan u abuuri doonnaa feyl iyo cinwaankiisaba howlo laxiriira shaashada (ND_Screen.cpp iyo ND_Screen.hpp). Dhexdooda waxaan ku abuureynaa shaqooyin: badal midabka xarfaha iyo asalka, ku qoro jumlado iyo xarfaha, nadiifi shaashadda kuna wareego shaashadda. Waxaan sii wadeynaa adeegsiga shaashadaha VGA laakiin hadda waxaan isticmaali doonaa xoogaa bytes ah oo midabka siin doona. ND_Screen.cpp wuxuu u ekaan lahaa:
/**
* @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;
}
Madaxa wuxuu noqon doonaa mid aad u aasaasi ah sidaa darteed anigu kuma soo daro halkan, laakiin muuji qeexitaanka nooca ND_SIDE
typedef enum ND_SIDE{
ND_SIDE_BACKGROUND,
ND_SIDE_FOREGROUND
} ND_SIDE;
Sidoo kale sheeg in aan isticmaalno madaxa ND_Types.hpp, madaxan ayaa qeexaya qaar ka mid ah noocyada aasaasiga ah ee uint8_t, uint16_t, iwm. oo ku salaysan char iyo int. Dhab ahaantii madaxan waa kan ku jira halbeegga C99, xaqiiqdiina ND_Types.hpp-gayga waa koobi/koji faylka desde Linux, si aad u beddelato iyaga oo waxba ma dhici doonaan (waxaa jira qeexitaanno kaliya, hawlo ma jiraan).
Si loo tijaabiyo haddii koodhkani shaqeynayo waxaan wax ka beddeleynaa barta laga soo galo C ee kernel:
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");
Hadana haddii aan raacno talaabooyinkan waxaan heli doonnaa natiijadan
Thanks to shaqooyinkan aan abuurnay, waxaan bilaabi karnaa inaan sameysano GUI yar yar, sida argagax yar yar oo aan soo bandhigi doono markasta oo uu jiro qalad aan lagaran karin. Wax sidan oo kale ah:
Iyo GUI-daan yar waxaan ku sameynay kaliya shaqooyinkan:
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);
}
Iyo ilaa halkan boostada. Waxaan ku xasuusinayaa tilmaamaha lagu ururinayo nidaamka 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
Anigana waxaan uga faa'iideysanayaa fursaddan inaan kaaga mahadceliyo soo dhaweynta wanaagsan ee uu sameeyay qoraalkii ugu horreeyay.
Saaxiib aad u fiican, xitaa sidaas darteed waxaan dilayaa koofiyadeyda fahamka koodhka ku jira c ++.
Thanks.
waxyaabahaani waa kuwo fiican. Waxay iga garteen xiisaha aan u qabo waxqabadka heerka hoose ee processor-rada mar labaad.
laga yaabee hadaan waqti haysto inaan bilaabi doono la ciyaarista ciyaarta xigta.
Maqaal dheer maan dirin. horeyba loogu baahnaa
Waa hagaag, taasi waa jidka.
Waxaan muddo dheer doonayay inaan ogaado sida loo dhiso nidaamka hawlgalka.
Sugitaanka boostadaada xigta. Farxad
Saaxiib weyn!
Kaliya hal dhibaato ayaan qabaa, qof ma ii soo gudbin karaa faylka C ee tusaalahan?
Had iyo jeer waxay ii soo dirtaa khaladaadka ku jira xarunta