Author |
Message |
MTK358
Joined: Tue Apr 20, 2010 9:08 am Posts: 20
|
Text output does not work
Somehow I can't get text output to work right.
I made functions that print a character set the color, set the position, but I just can't get printing strings and scrolling to work.
The OS is booted using GRUB, so it's in 32-bit Protected Mode.
|
Mon Apr 26, 2010 12:39 pm |
|
|
smeezekitty
Joined: Tue Apr 20, 2010 1:39 pm Posts: 17
|
Re: Text output does not work
Show code. You are writing to B800:0000, right?
|
Mon Apr 26, 2010 5:07 pm |
|
|
MTK358
Joined: Tue Apr 20, 2010 9:08 am Posts: 20
|
Re: Text output does not work
The scroll() function simply does not work, and when I position it to near the end of the screen and print a few characters it prints the first few characters in two places on the screen and does not scroll. kernel.cCode: #include "vga.h"
void kernel_main( void* mbd, unsigned int magic ) { if ( magic != 0x2BADB002 ) { // if the bootloader is not Multiboot-compatible }
// char* boot_loader_name = (char*) ((long*) mbd)[16]; set_color(COLOR_LTAQUA | (COLOR_AQUA << 4)); set_cur(78, 24); put_character('H'); put_character('e'); put_character('l'); put_character('l'); put_character('o'); }
vga.cCode: #include "vga.h"
int curx=0, cury=0; unsigned char curc = COLOR_GRAY | (COLOR_BLACK << 4); unsigned short* videoram = (unsigned short*) 0xB8000; #define videoram_get(x, y) videoram[x + (y * COLS)]
void scroll() { int x, y; for(y=1; y<LINES; y++) { for(x=0; x<COLS; x++) { videoram_get(x, y-1) = videoram_get(x, y); } } }
void set_color(unsigned char color) { curc = color; }
void set_cur(int x, int y) { curx = x; cury = y; }
void put_character(char c) { if(c == '\n') { curx = 0; cury++; } else { videoram_get(curx, cury) = c | (curc << 8); if(++curx == COLS) { curx = 0; if(cury+1 == LINES) scroll(); else cury++; } } }
void clear_screen() { int i; for(i=0; i<LINES*COLS; i++) { videoram[i] = ' ' | (curc << 8); } } The (improper) output is attached.
Attachments:
hello.jpg [ 37.41 KiB | Viewed 38855 times ]
|
Mon Apr 26, 2010 7:56 pm |
|
|
smeezekitty
Joined: Tue Apr 20, 2010 1:39 pm Posts: 17
|
Re: Text output does not work
Code: void put_character(char c) { if(c == '\n') { curx = 0; cury++; if(cury+1 == LINES || cury == LINES){scroll();} } else { videoram_get(curx, cury) = c | (curc << 8); if(++curx == COLS) { curx = 0; if(cury+1 == LINES || cury == LINES) scroll(); else cury++; } } }
Try that.
|
Mon Apr 26, 2010 9:45 pm |
|
|
MTK358
Joined: Tue Apr 20, 2010 9:08 am Posts: 20
|
Re: Text output does not work
smeezekitty wrote: Code: void put_character(char c) { if(c == '\n') { curx = 0; cury++; if(cury+1 == LINES || cury == LINES){scroll();} } else { videoram_get(curx, cury) = c | (curc << 8); if(++curx == COLS) { curx = 0; if(cury+1 == LINES || cury == LINES) scroll(); else cury++; } } }
Try that. What's the purpose of checking if cury AND cury+1 equals LINES? Why not >=, which will be simpler and more efficient?
|
Tue Apr 27, 2010 5:26 am |
|
|
Kieran
Site Admin
Joined: Sat Jul 25, 2009 7:44 am Posts: 274 Location: United Kingdom
|
Re: Text output does not work
Id go with >= too
_________________ Thank you for reading,
Kieran C G Foot
|
Tue Apr 27, 2010 5:41 am |
|
|
MTK358
Joined: Tue Apr 20, 2010 9:08 am Posts: 20
|
Re: Text output does not work
Code: void scroll() { int x, y; for(y=1; y<LINES; y++) { for(x=0; x<COLS; x++) { videoram_get(x, y-1) = videoram_get(x, y); } } cury--; }
void put_character(char c) { if (c == '\n') { curx = 0; if (++cury == LINES) scroll(); } else { videoram_get(curx, cury) = c | (curc << 8); if (++curx == COLS) { curx = 0; if (++cury == LINES) scroll(); } } } Newer version, but still the same result.
|
Tue Apr 27, 2010 5:52 am |
|
|
MTK358
Joined: Tue Apr 20, 2010 9:08 am Posts: 20
|
Re: Text output does not work
Anyone?
I would like to search it, but I just don't know what. I tried things like "vga characher output" and stuff but 99.9% of the results are completely irrelavent.
|
Tue Apr 27, 2010 7:23 pm |
|
|
Sharpner
Joined: Wed Feb 10, 2010 6:32 am Posts: 26
|
Re: Text output does not work
Code: int8u attrib = 0x0F;
void scroll(){ int32u blank = ' ' | (attrib << 8); if(csr_y >= 25){ int16u i; for (i = 0; i < 24*80; i++){ vga_ptr[i] = vga_ptr[i+80]; } for (i = 24*80; i < 25*80; i++){ vga_ptr[i] = blank; } csr_y = 24; } move_csr(); } I did it like that, maybe it helps you. bye Sharpner
|
Thu Apr 29, 2010 3:38 am |
|
|