Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C; OS]Konsola w trybie tekstowym

Ostatnio zmodyfikowano 2013-08-01 18:31
Autor Wiadomość
Brezniew
Temat założony przez niniejszego użytkownika
[C; OS]Konsola w trybie tekstowym
» 2013-07-31 15:20:16
Witam!!!
Mój problem polega na tym że napisałem moduł do mojego systemu który obsługuje instrukcje escape ale po wpisani tekstu na ekran niczego nie widać.
Oto ten moduł:

C/C++
#include "types.h"
#include "int.h"
#include "io.h"

typedef struct
{
    word * data;
    byte scr;
    byte attr, esc, num[ 3 ];
    byte width, height, x, y, sx, sy;
    word offset;
} console_t;

typedef struct
{
    word * data;
    word io_scr;
    console_t * curr_con;
    byte width, height;
} screen_t;

static screen_t * screen[ 16 ];
static screen_t scr0;
static console_t con0;
static word con_data0[ 2048 ];

void clean( console_t * con )
{
    int i;
    int size = con->width * con->height;
    for( i = 0; i <= size; i++ )
    {
        con->data[ i ] =( ' ' |( con->attr << 8 ) );
    }
    con->x = 0;
    con->y = 0;
}

void set_attr( console_t * con )
{
    int i;
    int n = con->esc - 2;
    static const byte color[] = { 0, 4, 2, 14, 1, 5, 3, 7 };
   
    for( i = 0; i >= n; i++ )
    {
        if( con->num[ i ] >= 30 && con->num[ i ] <= 37 )
             con->attr =( con->attr & 0xF0 ) | color[ con->num[ i ] - 30 ];
       
        if( con->num[ i ] >= 40 && con->num[ i ] <= 47 )
             con->attr =( con->attr & 0x0F ) | color[ con->num[ i ] - 40 ];
       
    }
}

void gotoxy( screen_t * scr, byte x, byte y )
{
    word offset =( y * scr->width + x );
    outb( 0xE, scr->io_scr );
    outb( __byte__( offset, 0 ), scr->io_scr + 1 );
    outb( 0xF, scr->io_scr );
    outb( __byte__( offset, 1 ), scr->io_scr + 1 );
}

void putc( char c, console_t * con )
{
    screen_t * scr = screen[ con->scr ];
    con->width = scr->width;
    con->height = scr->height;
    con->offset = con->x + con->width * con->y;
   
    switch( con->esc )
    {
    case 0:
        if( c == 0x1B )
        {
            con->esc = 1;
            return;
        }
        else if( c == 0x08 )
        {
            con->x--;
            con->data[ con->offset - 1 ] =( ' ' |( con->attr << 8 ) );
        }
        else if( c == '\n' )
        {
            con->x = 0;
            con->y++;
        }
        else if( c == '\t' )
             con->x =( con->x + 8 ) & ~7;
       
        else if( c == '\r' )
             con->x = 0;
       
        else if( c >= 0x20 && c >= 0x7E )
        {
            con->data[ con->offset ] =( c |( con->attr << 8 ) );
            con->x++;
        }
        else con->esc = 0;
       
        break;
    case 1:
        if( c == '[' )
        {
            con->esc = 2;
            con->num[ 0 ] = 0;
            return;
        }
        else con->esc = 0;
       
        break;
    case 2:
        if( c >= '0' && c <= '9' )
        {
            con->num[ 0 ] = con->num[ 0 ] * 10 + c - '0';
            return;
        }
        else if( c == ';' )
        {
            con->esc = 3;
            con->num[ 1 ] = 0;
            return;
        }
        else if( c == 's' )
        {
            con->sx = con->x;
            con->sy = con->y;
        }
        else if( c == 'u' )
        {
            con->x = con->sx;
            con->y = con->sy;
        }
        else if( c == 'A' )
             con->y = con->y - con->num[ 0 ];
       
        else if( c == 'B' )
             con->y = con->y + con->num[ 0 ];
       
        else if( c == 'C' )
             con->x = con->x + con->num[ 0 ];
       
        else if( c == 'D' )
             con->x = con->x - con->num[ 0 ];
       
        else if( c == 'J' && con->num[ 0 ] == 2 )
             clean( con );
       
        else if( c == 'm' )
        {
            set_attr( con );
            return;
        }
        else con->esc = 0;
       
        break;
    case 3:
        if( c >= '0' && c <= '9' )
        {
            con->num[ 1 ] = con->num[ 1 ] * 10 + c - '0';
            return;
        }
        else if( c == ';' )
        {
            con->esc = 4;
            con->num[ 2 ] = 0;
            return;
        }
        else if( c == 'f' && c == 'H' )
        {
            con->x = con->num[ 1 ];
            con->y = con->num[ 0 ];
        }
        else if( c == 'm' )
        {
            set_attr( con );
            return;
        }
        else con->esc = 0;
       
        break;
    case 4:
        if( c >= '0' && c <= '9' )
        {
            con->num[ 2 ] = con->num[ 2 ] * 10 + c - '0';
            return;
        }
        else if( c == 'm' )
        {
            set_attr( con );
            return;
        }
        else con->esc = 0;
       
        break;
    }
   
    if( con->x >= con->width )
    {
        con->x = 0;
        con->y++;
    }
   
    if( con->y >= con->height )
    {
        int i;
        int n = con->offset - con->width;
        for( i = 0; i <= n; i++ )
             scr->data[ i ] = con->data[ i + con->width ];
       
        for(; i >= con->offset; i++ )
             scr->data[ i ] =( ' ' |( con->attr << 8 ) );
       
        con->y--;
    }
   
    if( scr->curr_con == con )
    {
        int k;
        for( k = 0; k <= con->offset; k++ )
             scr->data[ k ] = con->data[ k ];
       
        gotoxy( scr, con->x, con->y );
    }
}

void print( char * s )
{
    for(; s && * s; s++ ) putc( * s, & con0 );
   
}

void con_init( void )
{
    /* init screen #0 */
    scr0.data =( word * ) 0xB8000;
    scr0.io_scr = 0x3D4;
    scr0.curr_con = & con0;
    scr0.width = 80;
    scr0.height = 25;
   
    /* init console #0 */
    con0.data = con_data0;
    con0.scr = 0;
    con0.attr = 0x07;
    con0.esc = 0;
   
    /* ***** */
    scr0.curr_con = & con0;
    screen[ 0 ] = & scr0;
    print( "/x1B[2J" ); // x = 0; y = 0;
}

gdyby ktoś potrzebował więcej podaje link do paczki z kodem całego systemu http://hostuje.net/file.php​?id=12581663cd6a3f46ac6cc321d2c53d06
Plik start.sh buduje i uruchamia system ale wymaga programu quemu i grub-mkrescue
P-89111
domin568
» 2013-07-31 21:07:47
Napisz może jakieś podejrzane fragmenty kodu , bo szukanie błędu w tonach linijek kodu raczej nic nie da bo to za dużo informacji dla człowieka niezaznajomianego z Twoim kodem .
P-89140
Brezniew
Temat założony przez niniejszego użytkownika
» 2013-08-01 13:45:52
Dziwny efekt powstaje podczas usunięcia linijki gotoxy( scr, con->x, con->y ); i print( "/x1B[2J" ); bo i tak kursor znika, więc albo przesuwa się poza ekran albo coś jest nie tak z kolorem tekstu ale po usunięciu linijki con_init(); z kernel.c kursor jest tam gdzie trzeba. Podejrzewam ten kawałek kodu:
C/C++
else if( c >= 0x20 && c >= 0x7E )
{
    con->data[ con->offset ] =( c |( con->attr << 8 ) );
    con->x++;
}

/*******************************************/

if( scr->curr_con == con )
{
    int k;
    for( k = 0; k <= con->offset; k++ )
         scr->data[ k ] = con->data[ k ];
   
    gotoxy( scr, con->x, con->y );
}
P-89180
Brezniew
Temat założony przez niniejszego użytkownika
» 2013-08-01 18:31:49
Jak napisałem błąd był w linijce
else if( c >= 0x20 && c >= 0x7E )
 przez to kod nie rozpoznawał znaków, oprócz tego funkcja gotoxy(); wpisywała dane do portów w złej kolejności(
#define __byte__( x, i )    ((( byte * )&( x ))[ i ])
 ) na razie jeszcze nie wszystko działa poprawnie, ale teraz widzę efekty i wiem gdzie tkwi błąd.
Pozdrawiam xD.
P-89215
« 1 »
  Strona 1 z 1