diff --git a/lib/video.c b/lib/video.c index 54fd7e9..4fa6130 100644 --- a/lib/video.c +++ b/lib/video.c @@ -1,6 +1,268 @@ #include "vga.h" #include "video.h" +u8 attrib=0x07; +u16 cursX,cursY; /* position du curseur */ +extern u16 resX,resY; /* resolution x,y en caractères*/ +u8 ansi,param1,param2,param3; + + +/*******************************************************************************/ + +/* Fixe l'attribut courant */ + +void setattrib(u8 att) +{ + static const u8 ansitovga[] = + { + 0, 4, 2, 6, 1, 5, 3, 7 + }; + u8 tempattr; + + tempattr = attrib; + if(att == 0) + tempattr &= ~0x08; /* Faible intensité */ + else if(att == 1) + tempattr |= 0x08; /* Forte intensité */ + else if(att >= 30 && att <= 37) + { + att = ansitovga[att - 30]; + tempattr = (tempattr & ~0x07) | att;/* couleur de premier plan */ + } + else if(att >= 40 && att <= 47) + { + att = ansitovga[att - 40] << 4; + tempattr = (tempattr & ~0x70) | att;/* couleur de fond */ + } + attrib = tempattr; +} + +/*******************************************************************************/ + +/* gere l'ansi */ + +bool makeansi(u8 c) +{ +/* state machine to handle the escape sequences */ + switch(ansi) + { + case 0: +/* ESC -- next state */ + if(c == 0x1B) + { + ansi++; + return 1; /* "I handled it" */ + } + break; +/* ESC */ + case 1: + if(c == '[') + { + ansi++; + param1 = 0; + return 1; + } + break; +/* ESC[ */ + case 2: + if(isdigit(c)) + { + param1 = param1 * 10 + c - '0'; + return 1; + } + else if(c == ';') + { + ansi++; + param2 = 0; + return 1; + } +/* ESC[2J -- efface l'ecran */ + else if(c == 'J') + { + if(param1 == 2) + { + fill(attrib); + ansi = 0; + return 1; + } + } +/* ESC[num1m -- met l'attribut num1 */ + else if(c == 'm') + { + setattrib(param1); + ansi = 0; + return 1; + } +/* ESC[num1A -- bouge le curseur de num1 vers le haut */ + else if(c == 'A') + { + cursY-=param1; + ansi = 0; + gotoscr(cursX,cursY); + return 1; + } +/* ESC[num1B -- bouge le curseur de num1 vers le bas */ + else if(c == 'B') + { + cursY+=param1; + ansi = 0; + gotoscr(cursX,cursY); + return 1; + } +/* ESC[num1C -- bouge le curseur de num1 vers la gauche */ + else if(c == 'C') + { + cursX-=param1; + ansi = 0; + gotoscr(cursX,cursY); + return 1; + } +/* ESC[num1D -- bouge le curseur de num1 vers la droite */ + else if(c == 'D') + { + cursX+=param1; + ansi = 0; + gotoscr(cursX,cursY); + return 1; + } + break; +/* ESC[num1; */ + case 3: + if(isdigit(c)) + { + param2 = param2 * 10 + c - '0'; + return 1; + } + else if(c == ';') + { + ansi++; + param3 = 0; + return 1; + } +/* ESC[num1;num2H ou ESC[num1;num2f-- bouge le curseur en num1,num2 */ + else if((c == 'H')||(c == 'f')) + { + /* Remet la position du curseur matériel a num1,num2 */ + gotoscr(param2,param1); + /* Remet la position du curseur logiciel a num1,num2 */ + cursX=param2; + cursY=param1; + ansi = 0; + return 1; + } +/* ESC[num1;num2m -- met les attributs num1,num2 */ + else if(c == 'm') + { + setattrib(param1); + setattrib(param2); + ansi = 0; + return 1; + } + break; +/* ESC[num1;num2;num3 */ + case 4: + if(isdigit(c)) + { + param3 = param3 * 10 + c - '0'; + return 1; + } +/* ESC[num1;num2;num3m -- met les attributs num1,num2,num3 */ + else if(c == 'm') + { + setattrib(param1); + setattrib(param2); + setattrib(param3); + ansi = 0; + return 1; + } + break; +/* Mauvais etat >> reset */ + default: + ansi = 0; + break; + } + ansi = 0; + return 0; /* Ansi fini ;)*/ +} + +/*******************************************************************************/ + +/* affiche un caractère a l'écran */ + +void putchar(u8 thechar) +{ +if(makeansi(thechar)) return; +switch (thechar) +{ +case 0x11: +if (cursY>0) cursY--; +break; +case 0x12: +if (cursY0) cursX--; +break; +case 0x14: +if (cursX0) +{ +cursX=resX-1; +cursY--; +} +} +else +{ +cursX--; +} +showchar(cursX,cursY,' ',attrib); +break; +case '\t': +cursX=(cursX + 8) & ~(8 - 1); +break; +case '\n': +cursX=0; +break; +case '\r': +cursX=0; +cursY++; +break; +default: +if (thechar>=' ') +{ +showchar(cursX,cursY,thechar,attrib); +cursX++; +} +break; +} +if (cursX>=resX) + { + cursX=0; + cursY++; + } +if (cursY>=resY) + { + scroll(1,attrib); + cursY=resY-1; + } + gotoscr(cursX,cursY); +} + /*******************************************************************************/ /* affiche une chaine de caractère a l'écran */ @@ -11,7 +273,7 @@ void print(u8* string) source = string; while(*source!=0x00) { - showchar(*source++); + putchar(*source++); } } @@ -22,8 +284,9 @@ void print(u8* string) void showhex(u8 src) { static u8 hexadigit[16] = "0123456789ABCDEF"; - showchar(hexadigit[(src&0xF0)>>4]); - showchar(hexadigit[src&0x0F]); + putchar(hexadigit[(src&0xF0)>>4]); + putchar(hexadigit[src&0x0F]); } /*******************************************************************************/ +