Ejemplo n.º 1
0
void exception_handler(int n, DWORD code, DWORD eip, DWORD cs, DWORD ef)
{
  WORD ctx;

  ctx = context_save();
  if (ctx == X_VM86_TSS) {
    /* HACK!!! Makes bochs bios happier... */
    return;
  }

#ifdef __EXC_DEBUG__
  fd32_log_printf("Exception %d occurred\n", n);
  fd32_log_printf("    Error Code: %ld\n", code);
  fd32_log_printf("    EIP: %ld (0x%lx)\n", eip, eip);
  fd32_log_printf("    CS: %ld (0x%lx)\n", cs, cs);
  fd32_log_printf("    EFlags: %ld (0x%lx)\n", ef, ef);
#endif

  if (exc_table[n].cs == 0) {
    message("Unhandled exception... %d (%x)\n", n, n);
  } else {
#ifdef __EXC_DEBUG
    fd32_log_printf("I have to call 0x%x:0x%lx\n", exc_table[n].cs, exc_table[n].eip);
#endif
    farcall(exc_table[n].cs, exc_table[n].eip);
  }
  /* For the moment, let's abort anyway... */
  fd32_abort();
}
Ejemplo n.º 2
0
//一个小应用程序
void cmd_hlt(CONSOLE *console, int *fat)
{
	MEMMANAGE *memmanage = (MEMMANAGE *)MEMMANAGE_ADDR;
	FILEINFO *finfo = file_search("HLT.HRB", (FILEINFO *)(ADR_DISKIMG + 0x002600), 224);
	SEGMENT_DESCRIPTOR *gdt = (SEGMENT_DESCRIPTOR *)ADR_GDT;
	char *img_adr;
	/*找到这个应用程序的情况*/
	if(0 != finfo)
	{
		//文件内容开始的地址赋值给img_adr
		img_adr = (char *)memmanage_alloc_4K(memmanage, finfo->size);
		//把可能有间断的文件内容复制到一块儿连续的内存中去,这样就可以直接到这块儿内存进行连续的读取了
		file_loadfile(finfo->clusterno, finfo->size, img_adr, fat, (char *)(0x003e00 + ADR_DISKIMG));
		//为这个任务分配一个内存段
		set_segmdesc(gdt + 1003, finfo->size - 1, (int)img_adr, AR_CODE32_ER);
		//跳转到这个hlt任务所在的内存开始执行
		farcall(0, 1003 * 8);
		memmanage_free_4K(memmanage, (int)img_adr, finfo->size);
	}
	/*无法找到这个应用程序的情况*/
	else
	{
		displayStrings_atLayer(console->layer, 8, console->cursor_y, COL8_FFFFFF, COL8_000000, "File not found!");
		console_newline(console);
	}
	console_newline(console);
}
Ejemplo n.º 3
0
int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
{
	struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
	struct FILEINFO *finfo;
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
	char name[18], *p;
	int i;

	/* コマンドラインからファイル名を生成 */
	for (i = 0; i < 13; i++) {
		if (cmdline[i] <= ' ') {
			break;
		}
		name[i] = cmdline[i];
	}
	name[i] = 0; /* とりあえずファイル名の後ろを0にする */

	/* ファイルを探す */
	finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	if (finfo == 0 && name[i - 1] != '.') {
		/* 見つからなかったので後ろに".HRB"をつけてもう一度探してみる */
		name[i    ] = '.';
		name[i + 1] = 'H';
		name[i + 2] = 'R';
		name[i + 3] = 'B';
		name[i + 4] = 0;
		finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	}

	if (finfo != 0) {
		/* ファイルが見つかった場合 */
		p = (char *) memman_alloc_4k(memman, finfo->size);
		*((int *) 0xfe8) = (int) p;
		file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
		set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
		if (finfo->size >= 8 && strncmp(p + 4, "Hari", 4) == 0) {
			p[0] = 0xe8;
			p[1] = 0x16;
			p[2] = 0x00;
			p[3] = 0x00;
			p[4] = 0x00;
			p[5] = 0xcb;
		}
		farcall(0, 1003 * 8);
		memman_free_4k(memman, (int) p, finfo->size);
		cons_newline(cons);
		return 1;
	}
	/* ファイルが見つからなかった場合 */
	return 0;
}
Ejemplo n.º 4
0
int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
{
	struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
	struct FILEINFO *finfo;
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
	char name[18], *p;
	int i;

	/* 根据命令行生成文件名 */
	for (i = 0; i < 13; i++) {
		if (cmdline[i] <= ' ') {
			break;
		}
		name[i] = cmdline[i];
	}
	name[i] = 0;                                                /* 暂且将文件名的后面置位0 */
	
	/* 寻找文件 */
	finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	if (finfo == 0 && name[i - 1] != '.') {
		/* 由于找不到文件,故在文件名后面加上“.hrb”后重新寻找 */
		name[i    ] = '.';
		name[i + 1] = 'F';
		name[i + 2] = 'E';
		name[i + 3] = 'X';
		name[i + 4] = 0;
		finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	}

	if (finfo != 0) {
		/* 找到文件的情况 */
		p = (char *) memman_alloc_4k(memman, finfo->size);
		*((int *) 0xfe8) = (int) p;
		file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
		set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER); // *.fex成功读入内存之后,将其注册为GDT的1003号。1-2号有dsctbl.c使用,3-1002号由mtask.c使用。
		if (finfo->size >= 8 && strncmp(p + 4, "Hari", 4) == 0) {
			p[0] = 0xe8;
			p[1] = 0x16;
			p[2] = 0x00;
			p[3] = 0x00;
			p[4] = 0x00;
			p[5] = 0xcb;
		}
		farcall(0, 1003 * 8);
		memman_free_4k(memman, (int) p, finfo->size);
		cons_newline(cons);
		return 1;
	}
	/* 没有找到文件的情况 */
	return 0;
}
Ejemplo n.º 5
0
int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) {
    struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
    struct FILEINFO *finfo;
    struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
    char name[18], *p;
    int i;

    for (i = 0; i < 13; i++) {
        if (cmdline[i] <= ' ') {
            break;
        }
        name[i] = cmdline[i];
    }
    name[i] = 0;

    finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
    if (finfo == 0 && name[i-1] != '.') {
        /* 
         * If the file cannot be found
         * Search <filename>.hrb instead
         */
        name[i] = '.';
        name[i + 1] = 'H';
        name[i + 2] = 'R';
        name[i + 3] = 'B';
        name[i + 4] = 0;
        finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
    }

    if (finfo != 0) {
        /* File is found */
        p = (char *) memman_alloc_4k(memman, finfo->size);
        file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
        /* Assign 1003 Segment */
        set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
        farcall(0, 1003 * 8);
        memman_free_4k(memman, (int) p, finfo->size);
        cons_newline(cons);
        return 1;
    }
    return 0;
}
Ejemplo n.º 6
0
void cmd_hlt (struct CONSOLE *cons, int *fat)
{
  struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
  struct FILEINFO *finfo = file_search ("HLT.HRB", (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
  struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *)ADR_GDT;

  if (finfo != 0) {
    // Find file
    char *p = (char *)memman_alloc_4k (memman, finfo->size);
    file_loadfile (finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
    set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
    farcall (0, 1003 * 8);
    memman_free_4k (memman, (int) p, finfo->size);
  } else {
    // When no file found
    putfonts8_asc_sht (cons->sht, 8, cons->cur_y, COL8_FFFFFF, COL8_000000, "File not found.", 15);
    cons_newline (cons);
  }
  cons_newline (cons);
  return;
}
Ejemplo n.º 7
0
int cmd_app(struct CONSOLE *cons, int *fat,char *cmdline)
{
	struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
	struct FILEINFO *finfo = file_search("HLT.HRB", (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
	char *p,name[18];
	int i;
	for(i=0;i <13; i++)
	{
		if(cmdline[i] <= ' ')
			break;
		name[i] = cmdline[i];
		
	}
	name[i] = 0;
	finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	if (finfo == 0 && name[i - 1] != '.')
	{
		name[i] = '.';
		name[i+1] = 'H';
		name[i+2] = 'R';
		name[i+3] = 'B';
		name[i+4] = 0;
		// search the file again
		finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
	}
	
	if (finfo != 0) { // found file
		p = (char *) memman_alloc_4k(memman, finfo->size);
		*((int *) 0xfe8) = (int) p;
		file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
		set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
		farcall(0, 1003 * 8); // call
		memman_free_4k(memman, (int) p, finfo->size);
		cons_newline(cons);
		return 1;
	} 
	return 0;
}
Ejemplo n.º 8
0
void _advg_reset_action(advg_game_t *p_game)
{
  farcall(p_game, _ADVG_RESET_ACTION, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 9
0
void advg_draw_objects(advg_game_t *p_game)
{
  farcall(p_game, ADVG_DRAW_OBJECTS, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 10
0
/* Functions in libadvg */
void advg_display_message(advg_game_t *p_game, sint16_t i_nr, uint8_t i_n)
{
  farcall(p_game, i_nr, i_n, ADVG_DISPLAY_MESSAGE, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 11
0
void adv_get_surroundings(adv_scene_t *p_scene, unsigned char *p_dst,
			  sint16_t i_x, sint16_t i_y, uint8_t i_w, uint8_t i_h)
{
  farcall(p_scene, p_dst, i_x, i_y, i_w, i_h, ADV_GET_SURROUNDINGS, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 12
0
void adv_draw_scene(adv_scene_t *p_scene)
{
  farcall(p_scene, ADV_DRAW_SCENE, FARCALL_OFFSET, p_scene);
}
Ejemplo n.º 13
0
void adv_mask_background(adv_scene_t *p_scene, uint8_t *p_dst, sint16_t i_x, sint16_t i_y,
			 uint8_t i_w, uint8_t i_h)
{
  farcall(p_scene, p_dst, i_x, i_y, i_w, i_h, ADV_MASK_BACKGROUND, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 14
0
void adv_mask_object(adv_scene_t *p_scene, uint8_t *p_dst, uint8_t *p_mask, uint8_t *p_obj,
		     sint16_t i_x, sint16_t i_y)
{
  farcall(p_scene, p_dst, p_mask, p_obj, i_x, i_y, ADV_MASK_OBJECT, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 15
0
void adv_load_scene(adv_scene_t *p_scene, char *p_filename, uint8_t i_scene)
{
  farcall(p_scene, p_filename, i_scene, ADV_LOAD_SCENE, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 16
0
/* Functions in libadv */
void adv_init_scene(adv_scene_t *p_scene, uint8_t *p_buf, sint16_t i_w, sint16_t i_h,
		    uint8_t i_nr_tiles, uint8_t *p_tile_buf)
{
  setup_lib();
  farcall(p_scene, p_buf, i_w, i_h, i_nr_tiles, p_tile_buf, ADV_INIT_SCENE, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 17
0
advg_event_t _advg_handle_press(advg_game_t *p_game, fe_point_t *p_point)
{
  return farcall(p_game, p_point, _ADVG_HANDLE_PRESS, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 18
0
/* Non-public libadvg functions */
advg_event_t _advg_handle_move(advg_game_t *p_game)
{
  return farcall(p_game, _ADVG_HANDLE_MOVE, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 19
0
void advg_draw_screen(void)
{
  farcall(ADVG_DRAW_SCREEN, FARCALL_OFFSET, advg_page);
}
Ejemplo n.º 20
0
void advg_goto_scene(advg_game_t *p_game, sint8_t i_scene, sint16_t i_x, sint16_t i_y)
{
  farcall(p_game, i_scene, i_x, i_y, ADVG_GOTO_SCENE, FARCALL_OFFSET, advg_page);
  advg_handle_event(p_game, ADVG_EVENT_ENTER_SCENE);
}