aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-07 16:56:02 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-07 16:56:02 -0500
commit2be70c3b7c3cb806614318858090c039bdfd4fc5 (patch)
tree61faa241e572d3241718b868ef9b32c20312ffc9
parentc0df0ee6437aa2786b1a92bc6af1284958d104c7 (diff)
downloadkappa-2be70c3b7c3cb806614318858090c039bdfd4fc5.zip
kappa-2be70c3b7c3cb806614318858090c039bdfd4fc5.tar.gz
kappa-2be70c3b7c3cb806614318858090c039bdfd4fc5.tar.bz2
kappa-2be70c3b7c3cb806614318858090c039bdfd4fc5.tar.xz
fix RNG with zero seed, rename VGA->GFX
-rw-r--r--OBJ2
-rw-r--r--boot/head.S2
-rw-r--r--drivers/gfx.c (renamed from drivers/vga.c)14
-rw-r--r--drivers/include/gfx.h (renamed from drivers/include/vga.h)18
-rw-r--r--drivers/tty.c2
-rw-r--r--kernel/main.c20
-rw-r--r--libc/stdlib.c3
7 files changed, 33 insertions, 28 deletions
diff --git a/OBJ b/OBJ
index 06a3d33..fbceaf2 100644
--- a/OBJ
+++ b/OBJ
@@ -1,8 +1,8 @@
boot/head.o
+drivers/gfx.o
drivers/pcspkr.o
drivers/ps2.o
drivers/tty.o
-drivers/vga.o
kernel/gdt-as.o
kernel/gdt.o
kernel/idt-as.o
diff --git a/boot/head.S b/boot/head.S
index 6149665..8bd42f1 100644
--- a/boot/head.S
+++ b/boot/head.S
@@ -16,7 +16,7 @@ multiboot_header:
.long 0
.long 0
.long 0
- .long 0
+ .long 0 # 1=text mode
.long 0 # screen height (don't care)
.long 0 # screen width (don't care)
.long 32 # screen BPP: MUST be 32
diff --git a/drivers/vga.c b/drivers/gfx.c
index ccf0949..538dadb 100644
--- a/drivers/vga.c
+++ b/drivers/gfx.c
@@ -3,7 +3,7 @@
#include "log.h"
#include "multiboot.h"
#include "panic.h"
-#include "vga.h"
+#include "gfx.h"
static uint8_t *framebuffer = NULL;
static uint16_t fb_width;
@@ -11,15 +11,15 @@ static uint16_t fb_height;
/* this is BYTES per pixel */
static uint8_t fb_bpp;
-const uint16_t *vga_width = &fb_width;
-const uint16_t *vga_height = &fb_height;
+const uint16_t *gfx_width = &fb_width;
+const uint16_t *gfx_height = &fb_height;
-void vga_drawpixel(int x, int y, uint32_t col)
+void gfx_drawpixel(int x, int y, uint32_t col)
{
((uint32_t*)framebuffer)[y * fb_width + x] = col;
}
-void vga_clear(uint32_t col)
+void gfx_clear(uint32_t col)
{
uint8_t *p = framebuffer;
uint8_t *stop = framebuffer + fb_width * fb_height * fb_bpp;
@@ -30,7 +30,7 @@ void vga_clear(uint32_t col)
}
}
-void vga_init(struct vbe_info_t *vbe_mode_info)
+void gfx_init(struct vbe_info_t *vbe_mode_info)
{
framebuffer = (uint8_t*)vbe_mode_info->physbase;
fb_width = vbe_mode_info->Xres;
@@ -38,5 +38,5 @@ void vga_init(struct vbe_info_t *vbe_mode_info)
fb_bpp = vbe_mode_info->bpp / 8;
if(fb_bpp != 4)
panic("BPP *MUST* be 32!!!\n");
- vga_clear(VGA_RGBPACK(0, 0, 0));
+ gfx_clear(VGA_RGBPACK(0, 0, 0));
}
diff --git a/drivers/include/vga.h b/drivers/include/gfx.h
index 8ea478b..bafd7a3 100644
--- a/drivers/include/vga.h
+++ b/drivers/include/gfx.h
@@ -22,23 +22,19 @@ enum vga_color_t {
#define VGA_WIDTH 80
#define VGA_HEIGHT 25
-#define VGA_SEQ_INDEX 0x3C4
-#define VGA_SEQ_DATA 0x3C5
-#define VGA_GC_INDEX 0x3CE
-#define VGA_GC_DATA 0x3CF
-#define VGA_CRTC_INDEX 0x3D4
-#define VGA_CRTC_DATA 0x3D5
-
#define VGA_MAKE_COLOR(fg, bg) (fg | bg << 4)
#define VGA_MAKE_ENTRY(ch, col) (((uint16_t)ch)|((uint16_t)col<<8))
#define VGA_RGBPACK(r, g, b) ((r << 16)|(g << 8)|(b << 0))
+#define GFX_WHITE 0xFFFFFF
+#define GFX_BLACK 0x000000
+
struct vbe_info_t;
-void vga_init(struct vbe_info_t *vbe_mode_info);
+void gfx_init(struct vbe_info_t *vbe_mode_info);
-void vga_drawpixel(int x, int y, uint32_t color);
+void gfx_drawpixel(int x, int y, uint32_t color);
-void vga_clear(uint32_t color);
+void gfx_clear(uint32_t color);
-extern const uint16_t *vga_width, *vga_height;
+extern const uint16_t *gfx_width, *gfx_height;
diff --git a/drivers/tty.c b/drivers/tty.c
index 7bce7e7..ae15778 100644
--- a/drivers/tty.c
+++ b/drivers/tty.c
@@ -1,9 +1,9 @@
#include <stdint.h>
#include <stdio.h>
+#include "gfx.h"
#include "io.h"
#include "panic.h"
#include "tty.h"
-#include "vga.h"
static int term_x, term_y;
static uint8_t term_col;
diff --git a/kernel/main.c b/kernel/main.c
index d791da1..6cad670 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -2,6 +2,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "gdt.h"
+#include "gfx.h"
#include "idt.h"
#include "isr.h"
#include "irq.h"
@@ -12,23 +13,24 @@
#include "ps2.h"
#include "timer.h"
#include "tty.h"
-#include "vga.h"
void main(struct multiboot_info_t *hdr, uint32_t magic)
{
/* this should go to port e9, which is the Bochs debug port */
printf("Testing early I/O\n");
- /* initialize the TTY first, no real harm can be done */
- tty_init();
+ printf("GFX init\n");
+ int gfx_status = gfx_init((struct vbe_info_t*)hdr->vbe_mode_info);
+
+ /* if graphical initialization fails, fall back to text mode */
+ if(!gfx_status)
+ tty_init();
if(magic != 0x2BADB002)
{
panic("Multiboot magic invalid");
}
- vga_init((struct vbe_info_t*)hdr->vbe_mode_info);
-
/* then the descriptor tables so we can do more useful stuff */
gdt_init();
idt_init();
@@ -49,7 +51,13 @@ void main(struct multiboot_info_t *hdr, uint32_t magic)
srand(*current_tick);
for(int i=0;i>=0;++i)
- vga_drawpixel(rand() % *vga_width, rand() % *vga_height, rand() % 0xFFFFFF);
+ {
+ int rx = rand() % *gfx_width;
+ int ry = rand() % *gfx_height;
+
+ gfx_drawpixel(rx, ry, rand() % 0xFFFFFF);
+ }
+ gfx_clear(0xffffff);
printf("Testing keyboard LED's...\n");
diff --git a/libc/stdlib.c b/libc/stdlib.c
index 49f61f1..ca890b4 100644
--- a/libc/stdlib.c
+++ b/libc/stdlib.c
@@ -34,5 +34,6 @@ int rand(void)
void srand(unsigned int seed)
{
- rand_state = seed;
+ /* prevent a zero seed */
+ rand_state = (!seed?42:seed);
}