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

📄 haishell.c

📁 HaiBIOS 是为我的S3C2410开发板写的一个启动程序。 C盘是RAMDISK
💻 C
字号:
/*
;---------------------------------------------------------------------------------
; Copyright (c) Haisoft 2008-10-27
; Author:				Kingsea
; Email:				jinhailiao@163.com
;-------------------------------------------------------------
; Project:				HaiBios
; File:					haishell.c
; Description:
;-------------------------------------------------------------
; Reversion Histroy:
;-------------------------------------------------------------
; Version		date		operations				by who
; 1.0.0		2008-10-27		Create					Kingsea
;
;---------------------------------------------------------------------------------
*/
#include "haitype.h"
#include "hfileapi.h"
#include "haiclib.h"
#include "haibios.h"
#include "uart2410.h"

#ifdef HAIBIOSSIM
#include "stdio.h"
#define hai_printf printf
#define hai_scanf  scanf
#endif

#define TEST_LOAD_FILE

int listdir(void)
{
	int err;
	long handle;
	struct finddata fd;

	handle = hai_findfirst("", &fd);
	if (!handle)
	{
		hai_printf("not find!\n");
		return -1;
	}

	do {
		if (fd.attrib&0x10)
			hai_printf("d     ");
		else
			hai_printf("f     ");
		hai_printf(fd.name); hai_printf("\n");
		err = hai_findnext(handle, &fd);
	}while (!err);
	
	hai_findclose(handle);
	
	return 0;
}

char *cmdset[] =
{
	"exit",
	"format",
	"chdir",
	"mkdir",
	"rmdir",
	"flush",
	"create",
	"open",
	"read",
	"write",
	"close",
	"dir",
	"rm",
	"copy",
	"help",
	"loadfile",
	""
};

const S_BYTE title1[] = "Copyright (c) Haisoft 2007-9-1\n";
const S_BYTE title2[] = "Author: Kingsea\n";
const S_BYTE title3[] = "Email:  jinhailiao@163.com\n";
const S_BYTE prjver[] = "HaiBIOS ver 1.0\n";


int hai_LoadFileFromUART(void)
{
	int i;
	long filesize;
	HFILE hfile;
	char ch, Buf[528], *p = Buf;
	const char *pSavefile = "C:\\TEMPFILE.BIN";
	
	hai_printf("Please input file size:");
	hai_scanf("%s", Buf);
	filesize = hai_atol(Buf);
	hai_printf("File size is: %d\n", filesize);
	hfile = hai_fopen(pSavefile, "wb");
	if (hfile == S_NULL)
	{
		hai_printf("File open failed!\n");
		return -1;
	}
	hai_printf("Please start transmit:");
	p = Buf;
	for (i = 0; i < filesize; i++)
	{
		*p++ = hai_UartGetChar();
		if (p-Buf == 512)
		{
			hai_fwrite(Buf, (size_t)(p-Buf), 1, hfile);
			p = Buf;
			hai_printf(".");
		}
	}
	hai_fwrite(Buf, (size_t)(p-Buf), 1, hfile);
	hai_fclose(hfile);

	hai_printf("\n");	
	hai_printf("Run this file(y/n)");
	ch = hai_UartGetChar();
	hai_UartPutChar(ch);
	hai_printf("\n");
	if (ch == 'y' || ch == 'Y')
		hai_LoadMain(pSavefile);

#ifdef TEST_LOAD_FILE
	hfile = hai_fopen(pSavefile, "rb");
	if (hfile)
	{
		while (filesize = hai_fread(Buf, 1, 512, hfile))
		{
			Buf[filesize] = 0;
			hai_printf(Buf);
		}
		hai_fclose(hfile);
	}
#endif

	return 0;
}

S_VOID hai_Shell(S_VOID)
{
	int loop = 1;
	int i, err;
	long size;
	char cwd[260];
	char cmd[260], arg[260];
	HFILE hfile = 0;
	HFILE hfile2 = 0;

	hai_printf(prjver);
	hai_printf(title1);
	hai_printf(title2);
	hai_printf(title3);

	while (loop)
	{
		hai_getcwd(cwd, 260);
		hai_printf(cwd);hai_printf("\\>:");
		hai_scanf("%s", cmd);
		for (i = 0; i < sizeof(cmdset)/sizeof(cmdset[0]); i++)
		{
			if (!hai_strcmp(cmd, cmdset[i]))
				break;
		}

		switch (i)
		{
		case 0:
			{
				HFILE hftemp = hai_fopen(RUNMAINFILE, "rb");
				if (hftemp)
				{
					hai_fclose(hftemp);
					if (hfile)
						hai_fclose(hfile);
					if (hfile2)
						hai_fclose(hfile2);
					loop = 0;
				}
			}
			break;
		case 1:
			hai_scanf("%s", arg);
			err = hai_format(arg, 0);
			break;
		case 2:
			hai_scanf("%s", arg);
			err = hai_chdir(arg);
			break;
		case 3:
			hai_scanf("%s", arg);
			err = hai_mkdir(arg);
			break;
		case 4:
			hai_scanf("%s", arg);
			err = hai_rmdir(arg);
			break;
		case 5:
			err = hai_flushall();
			break;
		case 6:
			hai_scanf("%s", arg);
			hfile2 = hai_fopen(arg, "w");
			if (hfile2)
				err = hai_fclose(hfile2);
			else
				err = -1;
			break;
		case 7:
			hai_scanf("%s", arg);
			if (hfile)
				hai_fclose(hfile);
			hfile = hai_fopen(arg, "r+");
			err = hfile?0:-1;
			break;
		case 8:
			err = hai_fseek(hfile, 0, SEEK_END);
			if (!err)
			{
				size = hai_ftell(hfile);
				hai_memset(arg, 0x00, sizeof(arg));
				hai_fseek(hfile, 0, SEEK_SET);
				if (size > 250)
					size = 250;
				if (hai_fread(arg, size, 1, hfile) == 1)
				{
					err = 0;
					hai_printf(arg);
					hai_printf("\n");
				}
				else
					err = -1;
			}
			break;
		case 9:
			hai_scanf("%s", arg);
			if (hai_fwrite(arg, hai_strlen(arg), 1, hfile) == 1)
				err = 0;
			else
				err = -1;
			break;
		case 10:
			if (hfile)
			{
				err = hai_fclose(hfile);
				if (!err)
					hfile = 0;
			}
			else
				err = -1;
			break;
		case 11:
			listdir();
			err = 0;
			break;
		case 12:
			hai_scanf("%s", arg);
			err = hai_remove(arg);
			break;
		case 13:
			hai_scanf("%s", cmd);
			hai_scanf("%s", arg);
			{
				int num;
				S_BYTE buf[512];
				HFILE hfrom = hai_fopen(arg, "rb");
				HFILE hto = hai_fopen(cmd, "wb");
				if (!hfrom || !hto)
				{
					if (!hfrom) hai_printf("%s can't open!\n", cmd);
					if (!hto) hai_printf("%s can't open!\n", arg);
					err = -1;
				}
				else
				{
					while (num = hai_fread(buf, 1, 512, hfrom))
						hai_fwrite(buf, num, 1, hto);
					err = 0;
				}
				if (hfrom) hai_fclose(hfrom);
				if (hto) hai_fclose(hto);
			}
			break;
		case 14:
			for (i = 0; i < sizeof(cmdset)/sizeof(cmdset[0]); i++)
			{
				hai_printf(cmdset[i]);
				hai_printf("\n");
			}
			err = 0;
			break;
		case 15:
			err = hai_LoadFileFromUART();
			break;
		default:
			err = -1;
			break;
		}
		if (err)
			hai_printf("bad command or argument!\n");
		else
			hai_printf("OK!\n");
	}
	hai_flushall();
}

S_VOID hai_LoadMain(S_BYTE *pFile)
{
	size_t num;
	HFILE hfile;
	S_BYTE *p = MainRunAddr;
	MainProc *pfnMain = (MainProc*)MainRunAddr;

	hfile = hai_fopen(pFile, "rb");
	if (!hfile)
	{
		hai_printf("%s can't open!\n", pFile);
		while (1);
	}

	while (num = hai_fread(p, 1, 512,  hfile))
		p += num;
	hai_fclose(hfile);

#ifdef HAIBIOSSIM
	hai_printf("Load Main program OK!\n");
#else
	//Add yourself code here if need
	pfnMain(0, 0);
#endif
	while (1)
		;
}


⌨️ 快捷键说明

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