[C; OS]Konsola w trybie tekstowym
Ostatnio zmodyfikowano 2013-08-01 18:31
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ł: #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 ) { scr0.data =( word * ) 0xB8000; scr0.io_scr = 0x3D4; scr0.curr_con = & con0; scr0.width = 80; scr0.height = 25; con0.data = con_data0; con0.scr = 0; con0.attr = 0x07; con0.esc = 0; scr0.curr_con = & con0; screen[ 0 ] = & scr0; print( "/x1B[2J" ); }
gdyby ktoś potrzebował więcej podaje link do paczki z kodem całego systemu http://hostuje.net/file.php?id=12581663cd6a3f46ac6cc321d2c53d06Plik start.sh buduje i uruchamia system ale wymaga programu quemu i grub-mkrescue |
|
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 . |
|
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: 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 ); } |
|
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. |
|
« 1 » |