Newer
Older
ubixos / src / sys / drivers / video.c
@reddawg reddawg on 5 May 2002 2 KB Looking Good
/**************************************************************************************
 Copyright (c) 2002
      The UbixOS Project

 $Id$
**************************************************************************************/

#include <ubixos/io.h>
#include <drivers/video.h>

unsigned char *videoBuffer = (char *)0xB8000;
int printColor = defaultColor;

void kprint(char *string) {
  unsigned int bufferOffset = 0,character = 0,i = 0;
  /* We Need To Get The Y Position */
  outportByte(0x3d4, 0x0e);
  bufferOffset = inportByte(0x3d5);
  bufferOffset <<= 8; /* Shift Address Left 8 Bits */
  /* Then We Need To Add The X Position */
  outportByte(0x3d4, 0x0f);
  bufferOffset += inportByte(0x3d5);
  bufferOffset <<= 1; /* Shift Address Left 1 Bits */
  while ((character=*string++)) {
    switch(character) {
      case '\n':
        bufferOffset = (bufferOffset/160)*160 + 160;
        break;
      default:
        videoBuffer[bufferOffset++] = character;
        videoBuffer[bufferOffset++] = printColor;
        break;
      }
    /* Check To See If We Are Out Of Bounds */
    if (bufferOffset >= 160*25) {
      for (i = 0; i < 160*24; i++) {
        videoBuffer[i] = videoBuffer[i+160];
        }
      for (i = 0; i < 80; i++) {
        videoBuffer[(160*24)+(i*2)] = 0x20;
        videoBuffer[(160*24)+(i*2)+1] = 0x07;
        }
      bufferOffset -= 160;
      }
    }
  bufferOffset >>= 1;                     /* Set the new cursor position  */
  outportByte(0x3d4, 0x0f);
  outportByte(0x3d5, bufferOffset & 0x0ff);
  outportWord(0x3d4, 0x0e);
  outportByte(0x3d5, bufferOffset >> 8);
  }

/* Clears The Screen */
void clearScreen() {
  unsigned int i;
  for (i = 0; i < (80*25); i++) {         /* Fill the screen with         */
                                        /* background Color             */
    videoBuffer[i*2] = 0x20;
    videoBuffer[i*2+1] = defaultColor;
    }

  outportByte(0x3d4, 0x0f);                /* Set the cursor to the        */
  outportByte(0x3d5, 0);                   /* upper-left corner of the     */
  outportWord(0x3d4, 0x0e);                /* screen                       */
  outportByte(0x3d5, 0);
  }