⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stage1.c

📁 newos is new operation system
💻 C
字号:
/*** Copyright 2001-2004, Travis Geiselbrecht. All rights reserved.** Distributed under the terms of the NewOS License.*/#include <string.h>#include <stdarg.h>#include <stdio.h>#include <boot/stage2.h>#include <boot/bootdir.h>#include "stage1.h"#include "inflate.h"// needed for console stuffstatic unsigned short *kScreenBase = (unsigned short*) 0xb8000;static unsigned screenOffset = 0;static unsigned int line = 0;#define SCREEN_WIDTH 80#define SCREEN_HEIGHT 25#define PAGE_SIZE 4096static unsigned char *heap_ptr = (unsigned char *)0x1000000;extern void *_end;#define TARGET ((void *)0x400000)void _start(unsigned int mem, void *ext_mem_block, int ext_mem_count, int in_vesa, unsigned int vesa_ptr){	unsigned long len;	boot_dir *bootdir = TARGET;	void (*stage2_entry)(unsigned int mem, void *ext_mem_block, int ext_mem_count, int in_vesa, unsigned int vesa_ptr, int console_ptr);	clearscreen();	dprintf("stage1 boot, decompressing system");	len = gunzip((unsigned char const *)&_end, TARGET, kmalloc(32*1024));	dprintf("done, len %d\n", len);	dprintf("finding stage2...");	stage2_entry = (void*)((char *)bootdir + bootdir->bd_entry[1].be_offset * PAGE_SIZE + bootdir->bd_entry[1].be_code_ventr);	dprintf("entry at %p\n", stage2_entry);	// jump into stage2	stage2_entry(mem, ext_mem_block, ext_mem_count, in_vesa, vesa_ptr, screenOffset);}void *kmalloc(unsigned int size){//	dprintf("kmalloc: size %d, ptr %p\n", size, heap_ptr - size);	return (heap_ptr -= size);}void kfree(void *ptr){}void clearscreen(){	int i;	for(i=0; i< SCREEN_WIDTH*SCREEN_HEIGHT*2; i++) {		kScreenBase[i] = 0xf20;	}}static void scrup(){	int i;	memcpy(kScreenBase, kScreenBase + SCREEN_WIDTH,		SCREEN_WIDTH * SCREEN_HEIGHT * 2 - SCREEN_WIDTH * 2);	screenOffset = (SCREEN_HEIGHT - 1) * SCREEN_WIDTH;	for(i=0; i<SCREEN_WIDTH; i++)		kScreenBase[screenOffset + i] = 0x0720;	line = SCREEN_HEIGHT - 1;}int puts(const char *str){	while (*str) {		if (*str == '\n') {			line++;			if(line > SCREEN_HEIGHT - 1)				scrup();			else				screenOffset += SCREEN_WIDTH - (screenOffset % 80);		} else {			kScreenBase[screenOffset++] = 0xf00 | *str;		}		if (screenOffset >= SCREEN_WIDTH * SCREEN_HEIGHT)			scrup();		str++;	}	return 0;}int dprintf(const char *fmt, ...){	int ret;	va_list args;	char temp[256];	va_start(args, fmt);	ret = vsprintf(temp,fmt,args);	va_end(args);	puts(temp);	return ret;}int panic(const char *fmt, ...){	int ret;	va_list args;	char temp[256];	va_start(args, fmt);	ret = vsprintf(temp,fmt,args);	va_end(args);	puts("STAGE1 PANIC: ");	puts(temp);	puts("\n");	puts("spinning forever...");	for(;;);	return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -