Import backup from 2003-12-20

This commit is contained in:
Josh Holtrop 2003-12-20 22:00:00 -05:00
parent 5ccfd0fc74
commit 3bb1e5fffc
8 changed files with 74 additions and 213 deletions

View File

@ -40,84 +40,6 @@ _read_cr3:
ret ret
;copies 32bpp video buffer memory to LFB
;extern dword video_copyBuffer32(dword src, dword dest, dword pixelcount);
[global _video_copyBuffer32]
_video_copyBuffer32:
push ebp
mov ebp, esp
push esi
push edi
push ecx
mov esi, [ebp+8]
mov edi, [ebp+12]
mov ecx, [ebp+16]
rep movsd
pop ecx
pop edi
pop esi
pop ebp
ret
;copies 24bpp video buffer memory to LFB
;extern dword video_copyBuffer24(dword src, dword dest, dword pixelcount);
[global _video_copyBuffer24]
_video_copyBuffer24:
push ebp
mov ebp, esp
push esi
push edi
push ecx
mov esi, [ebp+8]
mov edi, [ebp+12]
mov ecx, [ebp+16]
_video_copyBuffer24_loop:
movsd
dec edi
loop _video_copyBuffer24_loop
pop ecx
pop edi
pop esi
pop ebp
ret
;copies 16bpp video buffer memory to LFB
;extern dword video_copyBuffer16(dword src, dword dest, dword pixelcount);
[global _video_copyBuffer16]
_video_copyBuffer16:
push ebp
mov ebp, esp
push esi
push edi
push ecx
push ebx
mov esi, [ebp+8]
mov edi, [ebp+12]
mov ecx, [ebp+16]
_video_copyBuffer16_loop:
lodsd ;eax = 32bpp color
shr eax, 3
mov ebx, eax
and ebx, 0x1F
shr eax, 2
and eax, 0xFFFFFFE0
or ebx, eax
and ebx, 0x7FF
shr eax, 3
and eax, 0xF800
or ebx, eax
mov eax, ebx
stosw ;store ax
loop _video_copyBuffer16_loop
pop ebx
pop ecx
pop edi
pop esi
pop ebp
ret

View File

@ -1,5 +1,5 @@
%define VERSION "0.1.2" ;HOS version %define VERSION "0.12" ;HOS version
%define BOOT_FAT_SEG 0x07E0 ;right after boot sector %define BOOT_FAT_SEG 0x07E0 ;right after boot sector
%define BOOT_ROOT_SEG 0x0900 ;right after FAT %define BOOT_ROOT_SEG 0x0900 ;right after FAT

View File

@ -58,29 +58,13 @@ void k_init()
printf("HOS 0.12 - Kernel Size: %d kb\n", kernel_size()/1024); printf("HOS 0.12 - Kernel Size: %d kb\n", kernel_size()/1024);
printf("Memory available to OS: %d MB (Bytes: %d)\n", mm_totalmem/0x100000, mm_totalmem); printf("Memory available to OS: %d MB (Bytes: %d)\n", mm_totalmem/0x100000, mm_totalmem);
printf("Freem memory: %d bytes\n", mm_freemem()); printf("Free memory: %d bytes\n", mm_freemem());
/* int fx;
int fy = 30;
int fc;
int fr;
word *vidmem = (word *)0xB8000;
for (fr = 0; fr < 25; fr++)
{
fx = 300;
for (fc = 0; fc < 80; fc++)
{
video_renderChar(fx, fy, (char)vidmem[fr*80+fc], 0xFFFFFF);
fx += 8;
}
fy += 10;
} */
dword key = 0; dword key = 0;
for (;;) for (;;)
{ {
key = kbdWaitKey(); key = kbdWaitKey();
if (((key & 0xFF00) >> 8) != 2) //key is not a control key // if (((key & 0xFF00) >> 8) != 2) //key is not a control key
putc(key); putc(key);
} }
} }

27
mm.c
View File

@ -4,10 +4,15 @@
// 0x368000 is first available byte (this is right after the kernel @ 1mb and the initrd @ 2mb, 1440kb. // 0x368000 is first available byte (this is right after the kernel @ 1mb and the initrd @ 2mb, 1440kb.
//Pointer to the first pageblock in the linked list
pageblock *first_pageblock = (pageblock *) 0; pageblock *first_pageblock = (pageblock *) 0;
//The total amount of physical memory available (bytes)
dword mm_totalmem = 0x100000; //start counting from 1mb dword mm_totalmem = 0x100000; //start counting from 1mb
//The highest physical address
dword mm_highestAddress = 0; dword mm_highestAddress = 0;
//This function initializes the memory manager's linked list, filling it with the
// memory areas returned by bios interrupt 0x8E20
void mm_init() void mm_init()
{ {
dword *memmap_entries = (dword *) 0x9040A; dword *memmap_entries = (dword *) 0x9040A;
@ -66,7 +71,7 @@ void mm_init()
//This function initializes a pageblock to be full of empty pointers
void mm_init_pageblockpage(pageblock *pbp) void mm_init_pageblockpage(pageblock *pbp)
{ {
int a; int a;
@ -83,6 +88,10 @@ void mm_init_pageblockpage(pageblock *pbp)
} }
//This function allocates a certain number of physical pages for a particular process
//Returns:
// 0 - no free mem, invalied PID
// void* - physical address of allocated pages
void *mm_palloc(dword numpages, dword proc_pid) void *mm_palloc(dword numpages, dword proc_pid)
{ {
if (proc_pid < PID_KERNEL) if (proc_pid < PID_KERNEL)
@ -119,6 +128,7 @@ void *mm_palloc(dword numpages, dword proc_pid)
} }
//This method returns the number of free pageblock entries at the end of the linked list
dword mm_freeentries() dword mm_freeentries()
{ {
pageblock *pb = first_pageblock; pageblock *pb = first_pageblock;
@ -134,6 +144,10 @@ dword mm_freeentries()
} }
//This method creates a new page used to hold more pageblock entries at the end of the linked list
//Returns:
// 0 - no free pages
// pageblock* - address of pageblock page
pageblock *mm_new_pageblock_page() //as of 09/26/03 this method leaks 4kb main memory per call, unrecoverable pageblock *mm_new_pageblock_page() //as of 09/26/03 this method leaks 4kb main memory per call, unrecoverable
{ {
pageblock *pb = first_pageblock; pageblock *pb = first_pageblock;
@ -155,6 +169,11 @@ pageblock *mm_new_pageblock_page() //as of 09/26/03 this method leaks 4kb main
} }
//This method frees a physical page
//Returns:
// 2 - pointer to free was a null pointer
// 1 - address not found
// 0 - all went well
int mm_pfree(void *ptr) int mm_pfree(void *ptr)
{ {
if (ptr == 0) if (ptr == 0)
@ -176,6 +195,7 @@ int mm_pfree(void *ptr)
} }
//This method returns a pointer to the last pageblock in the linked list
pageblock *mm_lastpageblockentry() pageblock *mm_lastpageblockentry()
{ {
pageblock *pb = first_pageblock; pageblock *pb = first_pageblock;
@ -188,6 +208,8 @@ pageblock *mm_lastpageblockentry()
} }
//This method returns the next available-for-use pageblock entry
// or 0, if they are all used
pageblock *mm_nextpageblockentry() pageblock *mm_nextpageblockentry()
{ {
pageblock *pb = first_pageblock; pageblock *pb = first_pageblock;
@ -202,6 +224,7 @@ pageblock *mm_nextpageblockentry()
} }
//This method returns the amount of free physical RAM
dword mm_freemem() dword mm_freemem()
{ {
dword amount = 0; dword amount = 0;
@ -217,6 +240,8 @@ dword mm_freemem()
} }
//This method "walks" through the linked list of pageblock entries and
// combines any two entries that are adjacent and of the same type
void mm_coalesce(pageblock *pb) void mm_coalesce(pageblock *pb)
{ {
pageblock *pbc = first_pageblock; pageblock *pbc = first_pageblock;

View File

@ -3,6 +3,7 @@
// Author: Josh Holtrop // Author: Josh Holtrop
//This method initializes the ps/2 mouse
void mouse_init() void mouse_init()
{ {
outportb(0x64, 0x20); //tell keyboard controller we are going to read keyboard controller command byte outportb(0x64, 0x20); //tell keyboard controller we are going to read keyboard controller command byte
@ -23,7 +24,7 @@ void mouse_init()
} }
//This method is called when a mouse interrupt occurs
void isr_mouse() void isr_mouse()
{ {
byte inb = inportb(0x60); //read mouse byte byte inb = inportb(0x60); //read mouse byte
@ -50,15 +51,14 @@ void isr_mouse()
mouse_y = video_mode.YResolution - 1; mouse_y = video_mode.YResolution - 1;
if (mouse_inbuffer[0] & 0x01) //left button if (mouse_inbuffer[0] & 0x01) //left button
{ {
video_pset(mouse_x, mouse_y, 0x00FFFFFF); video_pset(mouse_x, mouse_y, 0x00FF8800);
printf("X: %d, Y: %d\n", mouse_x, mouse_y); printf("X: %d, Y: %d\n", mouse_x, mouse_y);
} }
else else
{ {
video_pset(mouse_x, mouse_y, 0x00000000); video_pset(mouse_x, mouse_y, 0x00FFFFFF);
printf("X: %d, Y: %d\n", mouse_x, mouse_y); printf("X: %d, Y: %d\n", mouse_x, mouse_y);
} }
video_copyBuffer();
} }
} }

View File

@ -33,7 +33,7 @@ brFSID DB 'FAT12 ' ; 0036h - File System ID
;------------------------------------------------------------------------ ;------------------------------------------------------------------------
start: start:
jmp 0:jmphere ;ensure that cs=0 and ip=0x7c... jmp 0:jmphere ;ensure that cs=0 and ip=0x7c00...
jmphere: jmphere:
;dl=drive number, save it! ;dl=drive number, save it!
xor ax, ax xor ax, ax
@ -88,7 +88,7 @@ unreal:
pop es ;segments back, with 4gb limits! pop es ;segments back, with 4gb limits!
sti sti
;now lets read in the FAT and root directory so we can search for the kernel file... ;now lets read in the FAT and root directory so we can search for the stage2 file...
mov ax, 0x0209 ;FAT1 mov ax, 0x0209 ;FAT1
mov cx, 0x0002 mov cx, 0x0002
xor dh, dh xor dh, dh

134
video.c
View File

@ -8,70 +8,20 @@ void video_init(ModeInfoBlock *mib)
{ {
video_mode = *mib; video_mode = *mib;
//Get a buffer region in memory for double-buffering video memory in 32bpp switch(video_mode.BitsPerPixel)
vid_Buffer = mm_palloc((4*video_mode.XResolution*video_mode.YResolution)/4096+1, PID_KERNEL);
if ((dword)vid_Buffer == 0)
{ {
printf("ERROR - COULD NOT ALLOCATE MEMORY FOR VIDEO DOUBLE-BUFFER!!\n"); case 16:
halt(); vid_ptr16 = (word *) video_mode.PhysBasePtr;
video_psetp = &video_psetp16;
break;
case 24:
vid_ptr24 = (byte *) video_mode.PhysBasePtr;
video_psetp = &video_psetp24;
break;
case 32:
video_psetp = &video_psetp32;
vid_ptr32 = (dword *) video_mode.PhysBasePtr;
} }
dword tot = ((video_mode.XResolution) * (video_mode.YResolution));
int a;
for (a = 0; a < tot; a++)
{
if (a < (tot / 4))
vid_Buffer[a] = 0x00FF0000;
else if (a < (tot / 2))
vid_Buffer[a] = 0x0000FF00;
else if (a < ((tot * 3) / 4))
vid_Buffer[a] = 0x000000FF;
else
vid_Buffer[a] = 0x00FFFFFF;
}
int VXR = video_mode.XResolution;
int VYR = video_mode.YResolution;
video_rectf(VXR*3/11, 0, VXR*4/11, VYR-1, 0x00000088); //test rectangles, draws "HOS"
video_rectf(VXR*7/11, 0, VXR*8/11, VYR-1, 0x00000088);
video_rectf(VXR/11, 0, VXR*2/11, VYR*2/5, 0x00000088);
video_rectf(VXR/11, VYR*3/5, VXR*2/11, VYR-1, 0x00000088);
video_rectf(VXR*5/11, VYR/5, VXR*6/11, VYR*4/5, 0x00000088);
video_rectf(VXR*9/11, VYR/5, VXR-1, VYR*2/5, 0x00000088);
video_rectf(VXR*8/11, VYR*3/5, VXR*10/11, VYR*4/5, 0x00000088);
int b;
for (a = 0; a < 256; a++)
{
for (b = 0; b < 256; b++)
{
video_pset(a+5, b+30, (a<<16)|(b<<8));
video_pset(a+270, b+30, (a<<8)|(b));
video_pset(a+535, b+30, (a<<16)|(b));
video_pset(a+5, b+290, (a<<16)|(b<<8)|0x000000ff);
video_pset(a+270, b+290, (a<<8)|(b)|0x00ff0000);
video_pset(a+535, b+290, (a<<16)|(b)|0x0000ff00);
}
}
int fx;
int fy = 25;
int fc;
int fr;
for (fr = 0; fr < 16; fr++)
{
fx = 15;
for (fc = 0; fc < 16; fc++)
{
video_renderChar(fx, fy, fr*16+fc, 0xFFFFFF);
fx += 8;
}
fy += 10;
}
video_copyBuffer();
} }
//Renders a character using stdfont[] as a bitmask //Renders a character using stdfont[] as a bitmask
@ -110,7 +60,7 @@ void video_horiz(int y, int x1, int x2, dword color)
int pixel = y*video_mode.XResolution+x1; int pixel = y*video_mode.XResolution+x1;
for (; x1 <= x2; x1++) for (; x1 <= x2; x1++)
{ {
vid_Buffer[pixel++] = color; video_psetp(pixel++, color);
} }
} }
@ -134,7 +84,7 @@ void video_vert(int x, int y1, int y2, dword color)
int pixel = y1*video_mode.XResolution+x; int pixel = y1*video_mode.XResolution+x;
for (; y1 <= y2; y1++) for (; y1 <= y2; y1++)
{ {
vid_Buffer[pixel] = color; video_psetp(pixel, color);
pixel+=video_mode.XResolution; pixel+=video_mode.XResolution;
} }
} }
@ -166,48 +116,28 @@ inline void video_pset(int x, int y, dword color)
{ {
if ((x < 0) || (x > video_mode.XResolution) || (y < 0) || (y > video_mode.YResolution)) if ((x < 0) || (x > video_mode.XResolution) || (y < 0) || (y > video_mode.YResolution))
return; return;
vid_Buffer[y*video_mode.XResolution+x] = color; video_psetp(y*video_mode.XResolution+x, color);
} }
//Copies double-buffer to VESA Linear Frame Buffer //Draws a pixel at the specified pixel position
void video_copyBuffer() void video_psetp16(int pixel, dword color)
{ {
switch (video_mode.BitsPerPixel) vid_ptr16[pixel] = ((color&0xFF)>>3) | ((((color>>8)&0xFF)>>2)<<5) | ((((color>>16)&0xFF)>>3)<<11);
{ }
case 32:
video_copyBuffer32((dword)vid_Buffer, video_mode.PhysBasePtr, video_mode.XResolution*video_mode.YResolution); //Draws a pixel at the specified pixel position
break; void video_psetp24(int pixel, dword color)
case 24: {
video_copyBuffer24((dword)vid_Buffer, video_mode.PhysBasePtr, video_mode.XResolution*video_mode.YResolution); vid_ptr24[pixel*3] = color & 0xFF;
break; vid_ptr24[pixel*3+1] = (color>>8) & 0xFF;
case 16: vid_ptr24[pixel*3+2] = (color>>16) & 0xFF;
video_copyBuffer16((dword)vid_Buffer, video_mode.PhysBasePtr, video_mode.XResolution*video_mode.YResolution); }
break;
} //Draws a pixel at the specified pixel position
/*int pixel; void video_psetp32(int pixel, dword color)
dword color; {
for (pixel = 0; pixel < video_mode.XResolution*video_mode.YResolution; pixel++) vid_ptr32[pixel] = color;
{
switch(video_mode.BitsPerPixel)
{
case 16:
color = vid_Buffer[pixel];
((word *)video_mode.PhysBasePtr)[pixel] = ((color&0xFF)>>3) | ((((color>>8)&0xFF)>>2)<<5) | ((((color>>16)&0xFF)>>3)<<11);
//vid_ptr16[pixel] = ((color&0xFF)>>3) | ((((color>>8)&0xFF)>>3)<<5) | ((((color>>16)&0xFF)>>3)<<10); //15 bit mode?
break;
case 24:
color = vid_Buffer[pixel];
((byte *)video_mode.PhysBasePtr)[pixel*3] = color & 0xFF;
((byte *)video_mode.PhysBasePtr)[pixel*3+1] = (color>>8) & 0xFF;
((byte *)video_mode.PhysBasePtr)[pixel*3+2] = (color>>16) & 0xFF;
break;
case 32:
color = vid_Buffer[pixel];
((dword *)video_mode.PhysBasePtr)[pixel] = color;
}
} */
} }

14
video.h
View File

@ -8,14 +8,11 @@ void video_vert(int x, int y1, int y2, dword color);
void video_rect(int x1, int y1, int x2, int y2, dword color); void video_rect(int x1, int y1, int x2, int y2, dword color);
void video_rectf(int x1, int y1, int x2, int y2, dword color); void video_rectf(int x1, int y1, int x2, int y2, dword color);
inline void video_pset(int x, int y, dword color); inline void video_pset(int x, int y, dword color);
void video_psetp(int pixel, dword color); void video_psetp16(int pixel, dword color);
void video_copyBuffer(); void video_psetp24(int pixel, dword color);
void video_psetp32(int pixel, dword color);
void video_renderChar(int x, int y, int character, dword color); void video_renderChar(int x, int y, int character, dword color);
extern dword video_copyBuffer16(dword src, dword dest, dword pixelcount);
extern dword video_copyBuffer24(dword src, dword dest, dword pixelcount);
extern dword video_copyBuffer32(dword src, dword dest, dword pixelcount);
typedef struct{ typedef struct{
word ModeAttributes; word ModeAttributes;
byte WinAAttributes; byte WinAAttributes;
@ -56,7 +53,10 @@ typedef struct{
} ModeInfoBlock; } ModeInfoBlock;
ModeInfoBlock video_mode; ModeInfoBlock video_mode;
dword *vid_Buffer; byte *vid_ptr24;
word *vid_ptr16;
dword *vid_ptr32;
void (*video_psetp)(int, dword); //function pointer to set a pixel