Clear Screen

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
pskyboy

Clear Screen

Post by pskyboy »

Hey Guys

I have a clear screen function that used to work fine. I then changed my code to be linked at 3GB and load at 1Mb using the GDT trick. Now my clear screen function won't work and just sits there clearing the first character on the screen Any Ideas? Here is the code im using

Code: Select all

void clear_screen() // clear the entire text screen
{
   char *vidmem = (char *) 0xC00b8000;
   unsigned int i=0;
   while(i < (80*25*2))
   {
      vidmem[i]=' ';
      i++;
      vidmem[i]=WHITE_TXT;
      i++;
   };
}
slacker

Re:Clear Screen

Post by slacker »

try this declaration for vidmem:

char *vidmem = (char *) 0xb8000;

-i dont know what that C00 is for...
Curufir

Re:Clear Screen

Post by Curufir »

Hmm, you mention a GDT trick.

Have you changed the base address on the selector? If so your pointer to video memory will be translated from logical->physical by adding that base address to the pointer, and end up pointing to the wrong place.

Just something I thought of when I read the message, could be completely wrong of course ;D.
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:Clear Screen

Post by Pype.Clicker »

i think we can't find out what's wrong until you give us the base and limit for your data segment as well as the page mapping you use ...
pskyboy

Re:Clear Screen

Post by pskyboy »

Sorry, I ment to post that completly slipped my mind.

I have a base of 0x40000000 and a limit of 0xFFFF (4Gb as granuality bit is high) for my code and data segment. Then i have a selector of 0x0 and a limit of 0xFF for my Stack.

The C00 is to make it so that it translates to 0xB8000 when added to teh selector. This seems to work as i can write to the screen but i can't get a loop to go through and access each byte one after the other. I am wondering if this is a problem between with the way an index for an array is added to the base to calculae the address and the GDT?

Peter
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:Clear Screen

Post by Pype.Clicker »

the GDT content is only used when the segment is loaded. The translation is applied only once the effective address has been computed (so it's independent from the actual addressing mode: based, indexed, indirect, direct, whatever ...)

what do the disassembled code look like ?
pskyboy

Re:Clear Screen

Post by pskyboy »

Is there anyway to get ndisasmw.exe to output to a file. I don't really fancy typing it out. Also how do you know how much is data of the COFF files that are output and how much is code?

Peter
pskyboy

Re:Clear Screen

Post by pskyboy »

Hey Guys

This code works and clears the first 3 Characters on the screen.

Code: Select all

   char *vidmem = (char *) 0xC00b8000;
   unsigned int i=0;

   *(char*)0xC00b8000 = ' ';
   *(char*)0xC00b8001 = WHITE_TXT;
   *(char*)0xC00b8002 = ' ';
   *(char*)0xC00b8003 = WHITE_TXT;
   *(char*)0xC00b8004 = ' ';
   *(char*)0xC00b8005 = WHITE_TXT;
This code however doesn't work, So its seems as though array indexing is causing problems.

Code: Select all

   char *vidmem = (char *) 0xC00b8000;
   unsigned int i=0;
   
   vidmem[i] = ' ';
   i++;
   vidmem[i] = WHITE_TXT;
   i++;
   vidmem[i] = ' ';
   i++;
   vidmem[i] = WHITE_TXT;
   i++;
   vidmem[i] = ' ';
   i++;
   vidmem[i] = WHITE_TXT;
   i++;
Tim

Re:Clear Screen

Post by Tim »

You should definitely get a disassembly, and a register dump from Bochs -- it would be useful to find the value of ESP, and all the segment base addresses, limits and flags.

If you're disassembling COFF or other files, objdump is better, as long as you don't mind reading AT&T syntax. ndisasm gets confused by the file headers.
_mark

Re:Clear Screen

Post by _mark »

You - now that you put it that way, I had the same problem when I did array indexing for the video memory. As in your case, this also worked fine:
char *vidmem = (char *)0XB8000;

for ( i=0; i <= 25*80*2; i++ )
{
*vidmem++= somechar;
*vidmem++= someattr;
}
Just like you, when indexing by array vidmem, yeilded unpredictable results. But just incrementing the pointer worked fine. Until now, I never gave a second thought about it. This was quite awhile ago when I was still getting used to realmode addressing, and I chalked my error up as a "realmode addressing quirk" I did not understand. Now looking back, I guess I understand realmode addressing pretty well, but I still do not understand why the array indexing did not work.

Tim is right, the asm results should yield some answers, but I do not have time to look right now. If noone else comes up with the answer I'll try and look this weekend.


_mark()
shad

Re:Clear Screen

Post by shad »

Declare your video memory as an unsigned short *.
_mark

Re:Clear Screen

Post by _mark »

short vs. char does not explain the issue here. A short would just index you through the array in character+attribute pairs instead of indexing each one indavidually (char, attr, char, attr...etc.). They are each 8 bit values.

_mark()
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:Clear Screen

Post by Pype.Clicker »

probably your code is damaging something as it advances or maybe your timer interrupt is damaging some of your register ...
_mark

Re:Clear Screen

Post by _mark »

Now that I re-read the post, I think my problem was different. My problem had to be real-mode addressing related. That does not explain anything about the problem this post is about. Sorry for screwing up the conversation flow there.

_mark()
pskyboy

Re:Clear Screen

Post by pskyboy »

hey Guys

I finally figured out how to get it to output to a file. I knew there was a way to redirect output i just couldn't remeber how to do it but sorted that now.

anyway this code

Code: Select all

void clear_screen() // clear the entire text screen
{   
   char *pVidmem = (char *)0xC00b8000;
   unsigned int i=0;

   while(i < (80*25*2))
   {
      pVidmem[i]=' ';
      i++;
      pVidmem[i]=WHITE_TXT;
      i++;
   };
}
dissasembles to

Code: Select all

00000000 <__Z12clear_screenv>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 08                sub    $0x8,%esp
   6:   c7 45 fc 00 80 0b c0    movl   $0xc00b8000,0xfffffffc(%ebp)
   d:   c7 45 f8 00 00 00 00    movl   $0x0,0xfffffff8(%ebp)
  14:   81 7d f8 9f 0f 00 00    cmpl   $0xf9f,0xfffffff8(%ebp)
  1b:   76 02                   jbe    1f <__Z12clear_screenv+0x1f>
  1d:   eb 1e                   jmp    3d <__Z12clear_screenv+0x3d>
  1f:   8b 45 f8                mov    0xfffffff8(%ebp),%eax
  22:   03 45 fc                add    0xfffffffc(%ebp),%eax
  25:   c6 00 20                movb   $0x20,(%eax)
  28:   8d 45 f8                lea    0xfffffff8(%ebp),%eax
  2b:   ff 00                   incl   (%eax)
  2d:   8b 45 f8                mov    0xfffffff8(%ebp),%eax
  30:   03 45 fc                add    0xfffffffc(%ebp),%eax
  33:   c6 00 07                movb   $0x7,(%eax)
  36:   8d 45 f8                lea    0xfffffff8(%ebp),%eax
  39:   ff 00                   incl   (%eax)
  3b:   eb d7                   jmp    14 <__Z12clear_screenv+0x14>
  3d:   c9                      leave  
  3e:   c3                      ret    
  3f:   90                      nop    
Post Reply