void cls(){ if(ProcessConsole->buffering==NO_BUFFER){ _memsetw(ProcessConsole->video_memory,(ProcessConsole->color<<8)|' ',ProcessConsole->size/2+1); }else{ _memsetw(ProcessConsole->buffer,(ProcessConsole->color<<8)|' ',ProcessConsole->size/2+1); //use 'space' so the color is printed if(ProcessConsole==CurrentConsole && ProcessConsole->buffering==BUFFER_REFRESH){ RefreshConsole(); } } }
void scrolldowna(unsigned int lines){ //this is improperly named memcpy(ProcessConsole->buffer, ProcessConsole->buffer+((ProcessConsole->width*2)*lines), ProcessConsole->size); if(ProcessConsole->buffering!=BUFFER_REFRESH){ _memsetw(ProcessConsole->buffer+((ProcessConsole->width*2)*(ProcessConsole->height-1)),(ProcessConsole->color<<8)+' ',ProcessConsole->width*2); }else{ _memsetw(ProcessConsole->buffer+((ProcessConsole->width*2)*(ProcessConsole->height-1)),(ProcessConsole->color<<8)+' ',ProcessConsole->width*2); // _memsetw(ProcessConsole->video_memory+((ProcessConsole->width*2)*(ProcessConsole->height-1)),(ProcessConsole->color<<8)+' ',ProcessConsole->width*2); } // memset(ProcessConsole->buffer+ProcessConsole->size-(ProcessConsole->width*2*2),(ProcessConsole->color<<8)|' ',ProcessConsole->width*2*2); //sets ProcessConsole->curx=0; ProcessConsole->cury-=lines; // RefreshConsole(); }
void putc(unsigned char c) { u_short vid_mem_spot; //lock_mutex_block(&putc_mutex); switch(c) { case '\n': // new line _csr_y++; _csr_x = 0; break; case '\r': // carrige return _csr_y++; _csr_x = 0; break; case '\b': _csr_x--; break; default: // normal charactor vid_mem_spot = ((_csr_y * 80) + _csr_x); vid_mem_spot = vid_mem_spot << 1; // multiply by 2 vidmem2[vid_mem_spot] = c; vidmem2[vid_mem_spot + 1] = 0x07; // white on black text _csr_x++; break; }; if(_csr_x > 79) // last charactor was at the end of the line { _csr_y++; // next line down _csr_x = 0; }; if(_csr_y > 24) // we are at the bottom visable line { _memcpy(0xB8000, 0xB8000+(80*2), 24*80*2); // scroll the video memory up a line _memsetw(0xB8000+(24*80*2), 0x0720, 80); // clear the bottom line _csr_y=24; }; update_cursor(_csr_y, _csr_x); //unlock_mutex(&putc_mutex); };
CONSOLE *CreateConsole(unsigned char type,unsigned int owner, char *name,unsigned char video_mode){ CONSOLE *new_console; __asm("cli"); //disable ints so no drawing crap going on new_console=malloc(sizeof(CONSOLE)); if(new_console==0){return 0;} LastConsole->next=new_console; new_console->prev=LastConsole; LastConsole=new_console; new_console->next=FirstConsole; //copy the name new_console->name=malloc(strlen(name)); memcpy(new_console->name,name,strlen(name)); //set video mode info new_console->video_mode=video_mode; new_console->vga_registers=video_modes[video_mode]; memset(&new_console->ConsoleEvents,0,sizeof(CONSOLE_EVENTS)); //zero the events //must resolve the font for each video mode switch(video_mode){ //set appropriate fonts, and sizes case 0: new_console->font=g_8x8_font; new_console->text_height=8; new_console->width=90; new_console->height=60; new_console->size=90*60*2; break; case 1: new_console->font=g_8x16_font; new_console->text_height=16; new_console->width=80; new_console->height=25; new_console->size=80*25*2; break; case 2: new_console->font=g_8x16_font; new_console->text_height=16; new_console->width=90; new_console->height=30; new_console->size=90*30*2; break; case 3: new_console->font=g_8x8_font; new_console->text_height=8; new_console->width=80; new_console->height=50; new_console->size=80*50*2; break; case 4: new_console->font=g_8x8_font; new_console->text_height=8; new_console->width=40; new_console->height=50; new_console->size=40*50*2; break; case 5: new_console->font=g_8x16_font; new_console->text_height=16; new_console->width=40; new_console->height=25; new_console->size=40*25*2; break; } //allocate buffer, even if buffering is disabled new_console->buffer=malloc(new_console->size+(new_console->width*2*2)); //provides room for 2 extra lines to avoid memory overwriting new_console->video_memory=0xB8000; //set owner process //only the owner process can kill a console(anyone can request..) //unless of course it is a system process(ring0 drivers or kernel services) new_console->owner_process=owner; switch(type){ case SYSTEM_CONSOLE: //same as virtual console new_console->buffering=NO_BUFFER; break; case USER_CONSOLE: default: //also the default new_console->buffering=NORMAL_BUFFER; break; case REALTIME_CONSOLE: new_console->buffering=BUFFER_REFRESH; //puets instantly refreshed break; } //zero out the cursor new_console->curx=0; new_console->cury=0; //set color to white on black new_console->color=0x0F; new_console->text=TRUE; CurrentConsole=new_console; //replace this with SwitchConsole.. ProcessConsole=new_console; SwitchConsole(CurrentConsole); _memsetw(ProcessConsole->buffer,(ProcessConsole->color<<8)|' ',ProcessConsole->size/2+1); //cls... _memsetw(ProcessConsole->video_memory,(ProcessConsole->color<<8)|' ',ProcessConsole->size/2+1); //and the actual video memory __asm("sti"); //renabled interrupts return new_console; }