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(); }
//一个小应用程序 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); }
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; }
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; }
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; }
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; }
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; }
void _advg_reset_action(advg_game_t *p_game) { farcall(p_game, _ADVG_RESET_ACTION, FARCALL_OFFSET, advg_page); }
void advg_draw_objects(advg_game_t *p_game) { farcall(p_game, ADVG_DRAW_OBJECTS, FARCALL_OFFSET, advg_page); }
/* 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); }
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); }
void adv_draw_scene(adv_scene_t *p_scene) { farcall(p_scene, ADV_DRAW_SCENE, FARCALL_OFFSET, p_scene); }
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); }
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); }
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); }
/* 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); }
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); }
/* 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); }
void advg_draw_screen(void) { farcall(ADVG_DRAW_SCREEN, FARCALL_OFFSET, advg_page); }
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); }