/* tohle je snad uz taky ok */ /*===========================================================================* * Terminal Task * *===========================================================================* * Written by : Vit Condak =P * * Last update: 27-05-1997 * *===========================================================================*/ /*===========================================================================* * out_char * *===========================================================================*/ /* outchar dostane od console znak a musi rozhodnout, co s nim udela: * musi detekovat Escape sekvence (zmena atributu, posun kurzoru, ...) * specialni znaky (Enter, BackSpace, ...) * nebo dokonce zaradit znak do vystupniho bufferu (outqueue) a ve vhodnych chvilich vola flush(), aby se obsah outqueue prekopiroval do videopameti */ void add_char(struct tty_struct* tp, char c) //tohle jenom prida znak c do outqueue (proste jen pomocna funkce) { if (tp->tty_outcount >= (TTY_OUT_BYTES-1)) //je to kam dat? { //co ted? nemam to kam dat! zeby message? //NE! v klidu staci jenom udelat flush! (aspon doufam =) flush(tp); } //ted uz by nemel byt zadny problem - jdeme na to //proste prida pismenko do outqueue (jo! i s atributem!) *(tp->tty_outhead)=char_att(c,tp->tty_attribute); tp->tty_outhead++; if (tp->tty_outhead==tp->tty_outqueue+TTY_OUT_BYTES) //pokud je treba zacit zase od zacatku buferu tp->tty_outhead=tp->tty_outqueue; tp->tty_outcount++; //zvednu pocitadlo } PRIVATE void out_char(struct tty_struct* tp, char c) //tohle je hlavni vetviste pro specialni znaky { /* Vystup znaku na konzolu. Sleduje escape sekvence ESC 32+x,32+y - move cursor to (x,y) ESC '~' '0' - cls from cursor ??? ESC '~' '1' - reverse scroll 1 line ??? ESC 'z' x - set attribute to x ...pokud dostavam Esc, musim flushnout buffer... (uz pri detekci znaku ESC) ...to same, pokud se hybe s kurzorem (nize) */ if (tp->tty_out_escaped) { tp->tty_out_escaped--; if (tp->tty_out_escaped) tp->tty_esc_char=c; else { //a tady ty esc akce... switch (tp->tty_esc_char) { //nastaveni atributu case 'z': { tp->tty_attribute=c; //tak tohle vypada dost jiste. aspon neco. break; } //vetev =) case '~': { if (c=='0') //mazani od kurzoru { //cls from cursor (takze do konce obrazovky) write_block(tp->tty_column,tp->tty_row, char_att(' ',tp->tty_attribute), MAXY-tp->tty_column+MAXX*(tp->tty_row-1)); } else { if (c=='1') //reverse scroll (takze pry scroll s obrazovkou) { scroll_up(); move_to(tp->tty_column, tp->tty_row); } } break; } default: { if (tp->tty_esc_char>32 && c>32) //pro jistotu //nikdo o to nemel zajem, takze to je pohyb kurzorem { tp->tty_column= (tp->tty_esc_char)-32; tp->tty_row = c - 32; move_to(tp->tty_column, tp->tty_row); } } } } } /* Obsluha znaku bell obsluha Ctrl-K (013): posun o radek dolu //tohle je snad LF, ne? obsluha Ctrl-L (014): posun o sloupec doprava // a tohle tab obsluha backspace, linefeed (s ohledem na CRMOD), cr + odscrollovani obrazovky, je-li treba obsluha tab - rekurzivni volani nekolikrat ' ' ulozeni znaku do tty_outqueue, tty_column++ */ else /** switch (c) { case 27: { //takze nastavuju priznak, ze byl ESC tp->tty_out_escaped=2; flush(tp); //aby sedela pozice kurzoru add_char(tp,c); //aby na to reagoval i terminal pres RS232 break; } /* case 13: { //Enter(cr+lf) ... nepujde to spis cele pryc? flush(tp); tp->tty_column=1; //kurzor ma asi jit na zacatek radku if (tp->tty_row>1) tp->tty_row--; //staci posunout kurzor else new_line(tp->tty_attrib); //musi se dole pridat radek move_to(tp->tty_column, tp->tty_row); break; } */ /** case 13: { //carriage return flush(tp); tp->tty_column=1; //kurzor na zacatek radku move_to(tp->tty_column, tp->tty_row); // add_char(tp,c); //aby na to reagoval i terminal pres RS232 break; } case 10: { //Line feed flush(tp); if (tp->tty_row>1) tp->tty_row--; //staci posunout kurzor else new_line(tp->tty_attribute); //musi se dole pridat radek //P.G: tp->tty_column=1; // kurzor na zacatek radku move_to(tp->tty_column, tp->tty_row); // add_char(tp,c); //aby na to reagoval i terminal pres RS232 break; } case 9: { //tab char xx; flush(tp); //aby zaktualizoval pozici kurzoru add_char(tp,' '); xx = ++tp->tty_column; while (xx%TAB_SIZE) { add_char(tp,' '); xx++; } // add_char(tp,c); //aby na to reagoval i terminal pres RS232 break; } case 8: { //BackSpace flush(tp); //aby zaktualizoval pozici kurzoru tp->tty_column--; //couvnu na radku if (tp->tty_column==0) //je treba se vratit o radek { if (tp->tty_rowtty_column=MAXX; //na konec predchoziho radku tp->tty_row++; } else tp->tty_column=1; //byl to levy horni roh, neni co mazat } write_char(tp->tty_column,tp->tty_row, char_att(' ',tp->tty_attribute)); // add_char(tp,c); //aby na to reagoval i terminal pres RS232 break; } case '\a': { //Bell beep(); // add_char(tp,c); //aby na to reagoval i terminal pres RS232 break; } default:*/ //cirou nahodou to je normalni pismenko, huraaa! jen ho vypsat... add_char(tp,c); /// } }