//tohle je skoro hotove (zda se =) /*===========================================================================* * Terminal Task * *===========================================================================* * Written by : Vit Condak =P * * Last update: 28-05-1997 * *===========================================================================*/ /*===========================================================================* * console * *===========================================================================*/ PRIVATE void console(struct tty_struct * tp) { char c; /* // na tuto rutinu je inicializovan pointer tty_devstart() polozky // tty_struct[] odpovidajici klavesnici - resi tedy vystup znaku na monitor // --- // VC: console dostane pointer (v promennych v *tp) na // data nekde v pameti a ma za ukol je vsechny vyOUT_CHARovat, // a tak to pekne po jednom znaku kopiruje z pameti do bufferu // (totiz posila to do funkce out_char() ) */ /* movnu to do do_write.inc char khar; //pracovni promenna pro kopirovani z pameti do bufferu // Dokud tty_outleft>0 and tty_inhibited=RUNNING while (tp->tty_outleft>0 && tp->tty_inhibited==FALSE) { // vezmi bajt z adresy tty_struct[].tty_outphys (tty_outphys++) //do_copy!!! neco jako: khar=*(tp->tty_out_vir); sys_copy(tp->tty_outproc, D, tp->tty_out_vir, TTY, D, (vir_bytes) &khar, 1); tp->tty_out_vir++; // posle to dal do vystupni fronty out_char(tp,khar); tp->tty_outleft--; tp->tty_outcum++; } //protoze se tty_dev prubezne vola, nemelo by se pri zakazu vypisu // uz nic dalsiho delat (proste to odtud vypadne ven) if (tp->tty_inhibited) return; */ /// flush(tp); // vyflaka vystupni frontu na obrazovku //VC: zrejme by se tady nekde melo shodit tty_waiting /// tp->tty_waiting=FALSE; // Odpovez zpravou s poctem prenesenych byte /// task_reply(OK,tp->tty_outcum, tp->tty_outcaller, tp->tty_outproc); /// tom presunuto z flush -> vypis znaku na obr. while (tp->tty_outcount) //t.j. dokud outtail nedozene outhead { // obsluha ENTER, BACKSPACE, .... pro CONSOLI c = *tp->tty_outtail; switch (c) { case 27: { //takze nastavuju priznak, ze byl ESC tp->tty_out_escaped=2; // flush(tp); //aby sedela pozice kurzoru tp->tty_outtail++; tp->tty_outcount--; break; } case 13: { //carriage return // flush(tp); tp->tty_column=1; //kurzor na zacatek radku move_to(tp->tty_column, tp->tty_row); tp->tty_outtail++; tp->tty_outcount--; 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); tp->tty_outtail++; tp->tty_outcount--; 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++; } 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)); tp->tty_outtail++; tp->tty_outcount--; break; } case '\a': { //Bell beep(); tp->tty_outtail++; tp->tty_outcount--; break; } default: { //vypis pismenka i s atributem do videopameti write_char(tp->tty_column,tp->tty_row,*tp->tty_outtail); tp->tty_outtail++; //posune ptr na konec dat v bufferu if (tp->tty_outtail==tp->tty_outqueue+TTY_OUT_BYTES) //pokud je treba zacit zase od zacatku 'outqueue' tp->tty_outtail=tp->tty_outqueue; // tu bylo neco blbe tp->tty_outcount--; //pozice kurzoru tp->tty_column++; if (tp->tty_column>MAXX) //presel na novy radek? { tp->tty_column=1; if (tp->tty_row>1) //je to jeste na obrazovce? ... { tp->tty_row--; //staci posunout kurzor } else //...nebo je uz treba scrollovat? (newline!) { //pozice kurzoru uz je spravne nastavena na x=1, y=1 // asi ne scroll_screen(); ale new_line(tp->tty_attribute); } } } //default } //switch } //while //aktualizovat pozici kurzoru (vykresleni) move_to(tp->tty_column, tp->tty_row); }