diff --git a/30_day/haribote/console.c b/30_day/haribote/console.c index e8c5c69..dddeba3 100644 --- a/30_day/haribote/console.c +++ b/30_day/haribote/console.c @@ -9,8 +9,8 @@ void console_task(struct SHEET *sheet, int memtotal) struct TASK *task = task_now(); struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; int i, *fat = (int *) memman_alloc_4k(memman, 4 * 2880); - struct CONSOLE cons; struct FILEHANDLE fhandle[8]; + struct CONSOLE cons; char cmdline[30]; unsigned char *nihongo = (char *) *((int *) 0x0fe8); @@ -133,19 +133,19 @@ void cons_putchar(struct CONSOLE *cons, int chr, char move) cons_newline(cons); } if (((cons->cur_x - 8) & 0x1f) == 0) { - break; /* 32�Ŋ���؂ꂽ��break */ + break; /*被32整除则break*/ } } - } else if (s[0] == 0x0a) { /* ���s */ + } else if (s[0] == 0x0a) { /*换行*/ cons_newline(cons); - } else if (s[0] == 0x0d) { /* ���A */ - /* �Ƃ肠�����Ȃɂ����Ȃ� */ - } else { /* ���ʂ̕��� */ + } else if (s[0] == 0x0d) { /*回车*/ + /*先不做任何操作*/ + } else { /*一般字符*/ if (cons->sht != 0) { putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, s, 1); } if (move != 0) { - /* move��0�̂Ƃ��̓J�[�\����i�߂Ȃ� */ + /* move为0时光标不后移*/ cons->cur_x += 8; if (cons->cur_x == 8 + 240) { cons_newline(cons); @@ -161,9 +161,9 @@ void cons_newline(struct CONSOLE *cons) struct SHEET *sheet = cons->sht; struct TASK *task = task_now(); if (cons->cur_y < 28 + 112) { - cons->cur_y += 16; /* ���̍s�� */ + cons->cur_y += 16; /*到下一行*/ } else { - /* �X�N���[�� */ + /*滚动*/ if (sheet != 0) { for (y = 28; y < 28 + 112; y++) { for (x = 8; x < 8 + 240; x++) { @@ -180,7 +180,7 @@ void cons_newline(struct CONSOLE *cons) } cons->cur_x = 8; if (task->langmode == 1 && task->langbyte1 != 0) { - cons->cur_x = 16; + cons->cur_x += 8; } return; } @@ -208,7 +208,7 @@ void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal) cmd_mem(cons, memtotal); } else if (strcmp(cmdline, "cls") == 0 && cons->sht != 0) { cmd_cls(cons); - } else if (strcmp(cmdline, "dir") == 0 && cons->sht != 0) { + } else if ((strcmp(cmdline, "dir") == 0 || strcmp(cmdline, "ls") == 0) && cons->sht != 0) { cmd_dir(cons); } else if (strcmp(cmdline, "exit") == 0) { cmd_exit(cons, fat); @@ -218,9 +218,9 @@ void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal) cmd_ncst(cons, cmdline, memtotal); } else if (strncmp(cmdline, "langmode ", 9) == 0) { cmd_langmode(cons, cmdline); - } else if (cmdline[0] != 0) { + }else if (cmdline[0] != 0) { if (cmd_app(cons, fat, cmdline) == 0) { - /* �R�}���h�ł͂Ȃ��A�A�v���ł��Ȃ��A����ɋ�s�ł��Ȃ� */ + /*不是命令,不是应用程序,也不是空行*/ cons_putstr0(cons, "Bad command.\n\n"); } } @@ -288,9 +288,9 @@ void cmd_exit(struct CONSOLE *cons, int *fat) memman_free_4k(memman, (int) fat, 4 * 2880); io_cli(); if (cons->sht != 0) { - fifo32_put(fifo, cons->sht - shtctl->sheets0 + 768); /* 768�`1023 */ + fifo32_put(fifo, cons->sht - shtctl->sheets0 + 768); /* 768〜1023 */ } else { - fifo32_put(fifo, task - taskctl->tasks0 + 1024); /* 1024�`2023 */ + fifo32_put(fifo, task - taskctl->tasks0 + 1024); /*1024~2023*/ } io_sti(); for (;;) { @@ -306,11 +306,11 @@ void cmd_start(struct CONSOLE *cons, char *cmdline, int memtotal) int i; sheet_slide(sht, 32, 4); sheet_updown(sht, shtctl->top); - /* �R�}���h���C���ɓ��͂��ꂽ��������A�ꕶ�����V�����R���\�[���ɓ��� */ + /*将命令行输入的字符串逐字复制到新的命令行窗口中*/ for (i = 6; cmdline[i] != 0; i++) { fifo32_put(fifo, cmdline[i] + 256); } - fifo32_put(fifo, 10 + 256); /* Enter */ + fifo32_put(fifo, 10 + 256); /*回车键*/ cons_newline(cons); return; } @@ -320,11 +320,12 @@ void cmd_ncst(struct CONSOLE *cons, char *cmdline, int memtotal) struct TASK *task = open_constask(0, memtotal); struct FIFO32 *fifo = &task->fifo; int i; - /* �R�}���h���C���ɓ��͂��ꂽ��������A�ꕶ�����V�����R���\�[���ɓ��� */ + + /*将命令行输入的字符串逐字复制到新的命令行窗口中*/ for (i = 5; cmdline[i] != 0; i++) { fifo32_put(fifo, cmdline[i] + 256); } - fifo32_put(fifo, 10 + 256); /* Enter */ + fifo32_put(fifo, 10 + 256); /*回车键*/ cons_newline(cons); return; } @@ -352,19 +353,19 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) struct SHTCTL *shtctl; struct SHEET *sht; - /* �R�}���h���C������t�@�C�����𐶐� */ + /*根据命令行生成文件名*/ for (i = 0; i < 13; i++) { if (cmdline[i] <= ' ') { break; } name[i] = cmdline[i]; } - name[i] = 0; /* �Ƃ肠�����t�@�C�����̌���0�ɂ��� */ + name[i] = 0; /*暂且将文件名的后面置为0*/ - /* �t�@�C����T�� */ + /*寻找文件 */ finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224); if (finfo == 0 && name[i - 1] != '.') { - /* ���‚���Ȃ������̂Ō���".HRB"���‚��Ă�����x�T���Ă݂� */ + /*由于找不到文件,故在文件名后面加上“.hrb”后重新寻找*/ name[i ] = '.'; name[i + 1] = 'H'; name[i + 2] = 'R'; @@ -374,7 +375,7 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) } if (finfo != 0) { - /* �t�@�C�������‚������ꍇ */ + /*如果找到文件*/ appsiz = finfo->size; p = file_loadfile2(finfo->clustno, &appsiz, fat); if (appsiz >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00) { @@ -384,8 +385,8 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) dathrb = *((int *) (p + 0x0014)); q = (char *) memman_alloc_4k(memman, segsiz); task->ds_base = (int) q; - set_segmdesc(task->ldt + 0, appsiz - 1, (int) p, AR_CODE32_ER + 0x60); - set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); + set_segmdesc(task->ldt + 0, finfo->size - 1, (int) p, AR_CODE32_ER + 0x60); + set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); for (i = 0; i < datsiz; i++) { q[esp + i] = p[dathrb + i]; } @@ -394,11 +395,11 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) for (i = 0; i < MAX_SHEETS; i++) { sht = &(shtctl->sheets0[i]); if ((sht->flags & 0x11) == 0x11 && sht->task == task) { - /* �A�v�����J�����ςȂ��ɂ����������𔭌� */ - sheet_free(sht); /* �‚��� */ + /*找到被应用程序遗留的窗口*/ + sheet_free(sht); /*关闭*/ } } - for (i = 0; i < 8; i++) { /* �N���[�Y���ĂȂ��t�@�C�����N���[�Y */ + for (i = 0; i < 8; i++) { /*将未关闭的文件关闭*/ if (task->fhandle[i].buf != 0) { memman_free_4k(memman, (int) task->fhandle[i].buf, task->fhandle[i].size); task->fhandle[i].buf = 0; @@ -414,7 +415,7 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) cons_newline(cons); return 1; } - /* �t�@�C�������‚���Ȃ������ꍇ */ + /*没有找到文件的情况*/ return 0; } @@ -426,8 +427,8 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4); struct SHEET *sht; struct FIFO32 *sys_fifo = (struct FIFO32 *) *((int *) 0x0fec); - int *reg = &eax + 1; /* eax�̎��̔Ԓn */ - /* �ۑ��̂��߂�PUSHAD�������ɏ��������� */ + int *reg = &eax + 1; /* eax后面的地址*/ + /*强行改写通过PUSHAD保存的值*/ /* reg[0] : EDI, reg[1] : ESI, reg[2] : EBP, reg[3] : ESP */ /* reg[4] : EBX, reg[5] : EDX, reg[6] : ECX, reg[7] : EAX */ int i; @@ -450,7 +451,7 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int sheet_setbuf(sht, (char *) ebx + ds_base, esi, edi, eax); make_window8((char *) ebx + ds_base, esi, edi, (char *) ecx + ds_base, 0); sheet_slide(sht, ((shtctl->xsize - esi) / 2) & ~3, (shtctl->ysize - edi) / 2); - sheet_updown(sht, shtctl->top); /* ���̃}�E�X�Ɠ��������ɂȂ�悤�Ɏw��F �}�E�X�͂��̏�ɂȂ� */ + sheet_updown(sht, shtctl->top); /*将窗口图层高度指定为当前鼠标所在图层的高度,鼠标移到上层*/ reg[7] = (int) sht; } else if (edx == 6) { sht = (struct SHEET *) (ebx & 0xfffffffe); @@ -466,13 +467,13 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int } } else if (edx == 8) { memman_init((struct MEMMAN *) (ebx + ds_base)); - ecx &= 0xfffffff0; /* 16�o�C�g�P�ʂ� */ + ecx &= 0xfffffff0; /*以16字节为单位*/ memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx); } else if (edx == 9) { - ecx = (ecx + 0x0f) & 0xfffffff0; /* 16�o�C�g�P�ʂɐ؂�グ */ + ecx = (ecx + 0x0f) & 0xfffffff0; /*以16字节为单位进位取整*/ reg[7] = memman_alloc((struct MEMMAN *) (ebx + ds_base), ecx); } else if (edx == 10) { - ecx = (ecx + 0x0f) & 0xfffffff0; /* 16�o�C�g�P�ʂɐ؂�グ */ + ecx = (ecx + 0x0f) & 0xfffffff0; /*以16字节为单位进位取整*/ memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx); } else if (edx == 11) { sht = (struct SHEET *) (ebx & 0xfffffffe); @@ -506,7 +507,7 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int io_cli(); if (fifo32_status(&task->fifo) == 0) { if (eax != 0) { - task_sleep(task); /* FIFO����Ȃ̂ŐQ�đ҂� */ + task_sleep(task); /* FIFO为空,休眠并等待*/ } else { io_sti(); reg[7] = -1; @@ -515,32 +516,32 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int } i = fifo32_get(&task->fifo); io_sti(); - if (i <= 1 && cons->sht != 0) { /* �J�[�\���p�^�C�} */ - /* �A�v�����s���̓J�[�\�����o�Ȃ��̂ŁA���‚����͕\���p��1�𒍕����Ă��� */ - timer_init(cons->timer, &task->fifo, 1); /* ����1�� */ + if (i <= 1) { /*光标用定时器*/ + /*应用程序运行时不需要显示光标,因此总是将下次显示用的值置为1*/ + timer_init(cons->timer, &task->fifo, 1); /*下次置为1*/ timer_settime(cons->timer, 50); } - if (i == 2) { /* �J�[�\��ON */ + if (i == 2) { /*光标ON */ cons->cur_c = COL8_FFFFFF; } - if (i == 3) { /* �J�[�\��OFF */ + if (i == 3) { /*光标OFF */ cons->cur_c = -1; } - if (i == 4) { /* �R���\�[��������‚��� */ + if (i == 4) { /*只关闭命令行窗口*/ timer_cancel(cons->timer); io_cli(); - fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /* 2024�`2279 */ + fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /*2024~2279*/ cons->sht = 0; io_sti(); } - if (i >= 256) { /* �L�[�{�[�h�f�[�^�i�^�X�NA�o�R�j�Ȃ� */ + if (i >= 256) { /*键盘数据(通过任务A)等*/ reg[7] = i - 256; return 0; } } } else if (edx == 16) { reg[7] = (int) timer_alloc(); - ((struct TIMER *) reg[7])->flags2 = 1; /* �����L�����Z���L�� */ + ((struct TIMER *) reg[7])->flags2 = 1; /*允许自动取消*/ } else if (edx == 17) { timer_init((struct TIMER *) ebx, &task->fifo, eax + 256); } else if (edx == 18) { @@ -642,7 +643,7 @@ int *inthandler0c(int *esp) cons_putstr0(cons, "\nINT 0C :\n Stack Exception.\n"); sprintf(s, "EIP = %08X\n", esp[11]); cons_putstr0(cons, s); - return &(task->tss.esp0); /* �ُ�I�������� */ + return &(task->tss.esp0); /*强制结束程序*/ } int *inthandler0d(int *esp) @@ -653,7 +654,7 @@ int *inthandler0d(int *esp) cons_putstr0(cons, "\nINT 0D :\n General Protected Exception.\n"); sprintf(s, "EIP = %08X\n", esp[11]); cons_putstr0(cons, s); - return &(task->tss.esp0); /* �ُ�I�������� */ + return &(task->tss.esp0); /*强制结束程序*/ } void hrb_api_linewin(struct SHEET *sht, int x0, int y0, int x1, int y1, int col) diff --git a/30_day/haribote/mtask.c b/30_day/haribote/mtask.c index 14bb46e..f67b935 100644 --- a/30_day/haribote/mtask.c +++ b/30_day/haribote/mtask.c @@ -1,4 +1,4 @@ -/* �}���`�^�X�N�֌W */ +/* 多任务管理 */ #include "bootpack.h" @@ -16,7 +16,7 @@ void task_add(struct TASK *task) struct TASKLEVEL *tl = &taskctl->level[task->level]; tl->tasks[tl->running] = task; tl->running++; - task->flags = 2; /* ���쒆 */ + task->flags = 2; /*活动中*/ return; } @@ -25,39 +25,38 @@ void task_remove(struct TASK *task) int i; struct TASKLEVEL *tl = &taskctl->level[task->level]; - /* task���ǂ��ɂ��邩��T�� */ + /*寻找task所在的位置*/ for (i = 0; i < tl->running; i++) { if (tl->tasks[i] == task) { - /* �����ɂ��� */ + /*在这里 */ break; } } tl->running--; if (i < tl->now) { - tl->now--; /* �����̂ŁA��������킹�Ă��� */ + tl->now--; /*需要移动成员,要相应地处理 */ } if (tl->now >= tl->running) { - /* now���������Ȓl�ɂȂ��Ă�����A�C������ */ + /*如果now的值出现异常,则进行修正*/ tl->now = 0; } - task->flags = 1; /* �X���[�v�� */ + task->flags = 1; /* 休眠中 */ - /* ���炵 */ + /* 移动 */ for (; i < tl->running; i++) { tl->tasks[i] = tl->tasks[i + 1]; } - return; } void task_switchsub(void) { int i; - /* ��ԏ�̃��x����T�� */ + /*寻找最上层的LEVEL */ for (i = 0; i < MAX_TASKLEVELS; i++) { if (taskctl->level[i].running > 0) { - break; /* ���‚����� */ + break; /*找到了*/ } } taskctl->now_lv = i; @@ -78,6 +77,7 @@ struct TASK *task_init(struct MEMMAN *memman) struct TASK *task, *idle; struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; + taskctl = (struct TASKCTL *) memman_alloc_4k(memman, sizeof (struct TASKCTL)); for (i = 0; i < MAX_TASKS; i++) { taskctl->tasks0[i].flags = 0; @@ -92,11 +92,11 @@ struct TASK *task_init(struct MEMMAN *memman) } task = task_alloc(); - task->flags = 2; /* ���쒆�}�[�N */ - task->priority = 2; /* 0.02�b */ - task->level = 0; /* �ō����x�� */ + task->flags = 2; /*活动中标志*/ + task->priority = 2; /* 0.02秒*/ + task->level = 0; /*最高LEVEL */ task_add(task); - task_switchsub(); /* ���x���ݒ� */ + task_switchsub(); /* LEVEL 设置*/ load_tr(task->sel); task_timer = timer_alloc(); timer_settime(task_timer, task->priority); @@ -151,8 +151,7 @@ void task_run(struct TASK *task, int level, int priority) if (priority > 0) { task->priority = priority; } - - if (task->flags == 2 && task->level != level) { + if (task->flags == 2 && task->level != level) { /*改变活动中的LEVEL */ task_remove(task); /*这里执行之后flag的值会变为1,于是下面的if语句块也会被执行*/ } @@ -161,7 +160,6 @@ void task_run(struct TASK *task, int level, int priority) task->level = level; task_add(task); } - taskctl->lv_change = 1; /*下次任务切换时检查LEVEL */ return; } @@ -183,6 +181,7 @@ void task_sleep(struct TASK *task) return; } + void task_switch(void) { struct TASKLEVEL *tl = &taskctl->level[taskctl->now_lv];