mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-02-04 10:33:18 +08:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9aa36a0f96 | ||
|
|
9bb71ea5ce | ||
|
|
f8b2930281 | ||
|
|
c462063e0b | ||
|
|
dade193e1f | ||
|
|
670d454b4e | ||
|
|
6ee187a190 | ||
|
|
7d59920a37 | ||
|
|
b308a9e295 | ||
|
|
a28136d3de | ||
|
|
438eeb5135 | ||
|
|
d9d034cf43 | ||
|
|
c8be7ff36f |
@@ -12,15 +12,15 @@
|
||||
DW 224 ; 根目录大小(一般为224项)
|
||||
DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512)
|
||||
DB 0xf0 ; 磁盘类型(必须为0xf0)
|
||||
DW 9 ; FAT的长度(必??9扇区)
|
||||
DW 9 ; FAT的长度(必须是9扇区)
|
||||
DW 18 ; 一个磁道(track)有几个扇区(必须为18)
|
||||
DW 2 ; 磁头数(必??2)
|
||||
DW 2 ; 磁头数(必须是2)
|
||||
DD 0 ; 不使用分区,必须是0
|
||||
DD 2880 ; 重写一次磁盘大小
|
||||
DB 0,0,0x29 ; 意义不明(固定)
|
||||
DD 0xffffffff ; (可能是)卷标号码
|
||||
DB "HELLO-OS " ; 磁盘的名称(必须为11字?,不足填空格)
|
||||
DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格)
|
||||
DB "HELLO-OS " ; 磁盘的名称(必须为11字节,不足填空格)
|
||||
DB "FAT12 " ; 磁盘格式名称(必须是8字节,不足填空格)
|
||||
RESB 18 ; 先空出18字节
|
||||
|
||||
; 程序主体
|
||||
@@ -47,4 +47,4 @@
|
||||
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
RESB 4600
|
||||
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
RESB 1469432
|
||||
RESB 1469432
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code
|
||||
|
||||
JMP entry
|
||||
DB 0xeb, 0x4e, 0x90
|
||||
DB 0x90
|
||||
DB "HELLOIPL" ; 启动扇区名称(8字节)
|
||||
DW 512 ; 每个扇区(sector)大小(必须512字节)
|
||||
DB 1 ; 簇(cluster)大小(必须为1个扇区)
|
||||
|
||||
@@ -53,7 +53,7 @@ retry:
|
||||
MOV BX,0
|
||||
MOV DL,0x00 ; A驱动器
|
||||
INT 0x13 ; 调用磁盘BIOS
|
||||
JNC next ; 没出错则跳转到fin
|
||||
JNC next ; 没出错则跳转到next
|
||||
ADD SI,1 ; 往SI加1
|
||||
CMP SI,5 ; 比较SI与5
|
||||
JAE error ; SI >= 5 跳转到error
|
||||
|
||||
@@ -15,7 +15,7 @@ VRAM EQU 0x0ff8 ; 图像缓冲区的起始地址
|
||||
|
||||
ORG 0xc200 ; 这个的程序要被装载的内存地址
|
||||
|
||||
; 画面モードを設定
|
||||
; 设置画面模式
|
||||
|
||||
MOV AL,0x13 ; VGA显卡,320x200x8bit
|
||||
MOV AH,0x00
|
||||
|
||||
@@ -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<EFBFBD>Ŋ<EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD><EFBFBD>break */
|
||||
break; /*被32整除则break*/
|
||||
}
|
||||
}
|
||||
} else if (s[0] == 0x0a) { /* <20><><EFBFBD>s */
|
||||
} else if (s[0] == 0x0a) { /*换行*/
|
||||
cons_newline(cons);
|
||||
} else if (s[0] == 0x0d) { /* <20><><EFBFBD>A */
|
||||
/* <20>Ƃ肠<C682><E882A0><EFBFBD><EFBFBD><EFBFBD>Ȃɂ<C882><C982><EFBFBD><EFBFBD>Ȃ<EFBFBD> */
|
||||
} else { /* <20><><EFBFBD>ʂ̕<CA82><CC95><EFBFBD> */
|
||||
} 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<EFBFBD><EFBFBD>0<EFBFBD>̂Ƃ<EFBFBD><EFBFBD>̓J<EFBFBD>[<5B>\<5C><><EFBFBD><EFBFBD>i<EFBFBD>߂Ȃ<DF82> */
|
||||
/* 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; /* <20><><EFBFBD>̍s<CC8D><73> */
|
||||
cons->cur_y += 16; /*到下一行*/
|
||||
} else {
|
||||
/* <20>X<EFBFBD>N<EFBFBD><4E><EFBFBD>[<5B><> */
|
||||
/*滚动*/
|
||||
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) {
|
||||
/* <20>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>ł͂Ȃ<CD82><C882>A<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD>ł<EFBFBD><C582>Ȃ<EFBFBD><C882>A<EFBFBD><41><EFBFBD><EFBFBD>ɋ<EFBFBD>s<EFBFBD>ł<EFBFBD><C582>Ȃ<EFBFBD> */
|
||||
/*不是命令,不是应用程序,也不是空行*/
|
||||
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<EFBFBD>`1023 */
|
||||
fifo32_put(fifo, cons->sht - shtctl->sheets0 + 768); /* 768〜1023 */
|
||||
} else {
|
||||
fifo32_put(fifo, task - taskctl->tasks0 + 1024); /* 1024<EFBFBD>`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);
|
||||
/* <20>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>C<EFBFBD><43><EFBFBD>ɓ<EFBFBD><C993>͂<EFBFBD><CD82>ꂽ<EFBFBD><EA82BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ꕶ<EFBFBD><EA95B6><EFBFBD><EFBFBD><EFBFBD>V<C290><56><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD>\<5C>[<5B><><EFBFBD>ɓ<EFBFBD><C993><EFBFBD> */
|
||||
/*将命令行输入的字符串逐字复制到新的命令行窗口中*/
|
||||
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;
|
||||
/* <20>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>C<EFBFBD><43><EFBFBD>ɓ<EFBFBD><C993>͂<EFBFBD><CD82>ꂽ<EFBFBD><EA82BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ꕶ<EFBFBD><EA95B6><EFBFBD><EFBFBD><EFBFBD>V<C290><56><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD>\<5C>[<5B><><EFBFBD>ɓ<EFBFBD><C993><EFBFBD> */
|
||||
|
||||
/*将命令行输入的字符串逐字复制到新的命令行窗口中*/
|
||||
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;
|
||||
|
||||
/* <20>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
/*根据命令行生成文件名*/
|
||||
for (i = 0; i < 13; i++) {
|
||||
if (cmdline[i] <= ' ') {
|
||||
break;
|
||||
}
|
||||
name[i] = cmdline[i];
|
||||
}
|
||||
name[i] = 0; /* <20>Ƃ肠<C682><E882A0><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>̌<EFBFBD><CC8C><EFBFBD>0<EFBFBD>ɂ<EFBFBD><C982><EFBFBD> */
|
||||
name[i] = 0; /*暂且将文件名的后面置为0*/
|
||||
|
||||
/* <20>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD>T<EFBFBD><54> */
|
||||
/*寻找文件 */
|
||||
finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
|
||||
if (finfo == 0 && name[i - 1] != '.') {
|
||||
/* <20><><EFBFBD><EFBFBD><C282><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ō<CC82><C58C><EFBFBD>".HRB"<22><><EFBFBD><EFBFBD><C282>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>T<EFBFBD><54><EFBFBD>Ă݂<C482> */
|
||||
/*由于找不到文件,故在文件名后面加上“.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) {
|
||||
/* <20>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C282><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ */
|
||||
/*如果找到文件*/
|
||||
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) {
|
||||
/* <20>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>ςȂ<CF82><C882>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
sheet_free(sht); /* <20><EFBFBD><C282><EFBFBD> */
|
||||
/*找到被应用程序遗留的窗口*/
|
||||
sheet_free(sht); /*关闭*/
|
||||
}
|
||||
}
|
||||
for (i = 0; i < 8; i++) { /* <20>N<EFBFBD><4E><EFBFBD>[<5B>Y<EFBFBD><59><EFBFBD>ĂȂ<C482><C882>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>[<5B>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;
|
||||
}
|
||||
/* <20>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C282><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꍇ */
|
||||
/*没有找到文件的情况*/
|
||||
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<EFBFBD>̎<EFBFBD><EFBFBD>̔Ԓn */
|
||||
/* <20>ۑ<EFBFBD><DB91>̂<EFBFBD><CC82>߂<EFBFBD>PUSHAD<41><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɏ<EFBFBD><C98F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
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); /* <20><><EFBFBD>̃}<7D>E<EFBFBD>X<EFBFBD>Ɠ<EFBFBD><C693><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂȂ<C982>悤<EFBFBD>Ɏw<C98E><77>F <20>}<7D>E<EFBFBD>X<EFBFBD>͂<EFBFBD><CD82>̏<EFBFBD>ɂȂ<C982> */
|
||||
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<EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD>P<EFBFBD>ʂ<EFBFBD> */
|
||||
ecx &= 0xfffffff0; /*以16字节为单位*/
|
||||
memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx);
|
||||
} else if (edx == 9) {
|
||||
ecx = (ecx + 0x0f) & 0xfffffff0; /* 16<EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD>P<EFBFBD>ʂɐ<EFBFBD>グ */
|
||||
ecx = (ecx + 0x0f) & 0xfffffff0; /*以16字节为单位进位取整*/
|
||||
reg[7] = memman_alloc((struct MEMMAN *) (ebx + ds_base), ecx);
|
||||
} else if (edx == 10) {
|
||||
ecx = (ecx + 0x0f) & 0xfffffff0; /* 16<EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD>P<EFBFBD>ʂɐ<EFBFBD>グ */
|
||||
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<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ̂ŐQ<EFBFBD>đ҂<EFBFBD> */
|
||||
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) { /* <20>J<EFBFBD>[<5B>\<5C><><EFBFBD>p<EFBFBD>^<5E>C<EFBFBD>} */
|
||||
/* <20>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD>̓J<CD83>[<5B>\<5C><><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>Ȃ<EFBFBD><C882>̂ŁA<C581><41><EFBFBD><EFBFBD><C282><EFBFBD><EFBFBD>͕\<5C><><EFBFBD>p<EFBFBD><70>1<EFBFBD>𒍕<EFBFBD><F0928D95><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD> */
|
||||
timer_init(cons->timer, &task->fifo, 1); /* <20><><EFBFBD><EFBFBD>1<EFBFBD><31> */
|
||||
if (i <= 1) { /*光标用定时器*/
|
||||
/*应用程序运行时不需要显示光标,因此总是将下次显示用的值置为1*/
|
||||
timer_init(cons->timer, &task->fifo, 1); /*下次置为1*/
|
||||
timer_settime(cons->timer, 50);
|
||||
}
|
||||
if (i == 2) { /* <20>J<EFBFBD>[<5B>\<5C><>ON */
|
||||
if (i == 2) { /*光标ON */
|
||||
cons->cur_c = COL8_FFFFFF;
|
||||
}
|
||||
if (i == 3) { /* <20>J<EFBFBD>[<5B>\<5C><>OFF */
|
||||
if (i == 3) { /*光标OFF */
|
||||
cons->cur_c = -1;
|
||||
}
|
||||
if (i == 4) { /* <20>R<EFBFBD><52><EFBFBD>\<5C>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C282><EFBFBD> */
|
||||
if (i == 4) { /*只关闭命令行窗口*/
|
||||
timer_cancel(cons->timer);
|
||||
io_cli();
|
||||
fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /* 2024<EFBFBD>`2279 */
|
||||
fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /*2024~2279*/
|
||||
cons->sht = 0;
|
||||
io_sti();
|
||||
}
|
||||
if (i >= 256) { /* <20>L<EFBFBD>[<5B>{<7B>[<5B>h<EFBFBD>f<EFBFBD>[<5B>^<5E>i<EFBFBD>^<5E>X<EFBFBD>NA<4E>o<EFBFBD>R<EFBFBD>j<EFBFBD>Ȃ<EFBFBD> */
|
||||
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; /* <20><><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD><5A><EFBFBD>L<EFBFBD><4C> */
|
||||
((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); /* <20>ُ<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
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); /* <20>ُ<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
return &(task->tss.esp0); /*强制结束程序*/
|
||||
}
|
||||
|
||||
void hrb_api_linewin(struct SHEET *sht, int x0, int y0, int x1, int y1, int col)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* <EFBFBD>}<7D><><EFBFBD>`<60>^<5E>X<EFBFBD>N<EFBFBD>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; /* <20><><EFBFBD>쒆 */
|
||||
task->flags = 2; /*活动中*/
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -25,39 +25,38 @@ void task_remove(struct TASK *task)
|
||||
int i;
|
||||
struct TASKLEVEL *tl = &taskctl->level[task->level];
|
||||
|
||||
/* task<EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><EFBFBD>ɂ<EFBFBD><EFBFBD>邩<EFBFBD><EFBFBD>T<EFBFBD><EFBFBD> */
|
||||
/*寻找task所在的位置*/
|
||||
for (i = 0; i < tl->running; i++) {
|
||||
if (tl->tasks[i] == task) {
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD> */
|
||||
/*在这里 */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tl->running--;
|
||||
if (i < tl->now) {
|
||||
tl->now--; /* <20><><EFBFBD><EFBFBD><EFBFBD>̂ŁA<C581><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>킹<EFBFBD>Ă<EFBFBD><C482><EFBFBD> */
|
||||
tl->now--; /*需要移动成员,要相应地处理 */
|
||||
}
|
||||
if (tl->now >= tl->running) {
|
||||
/* now<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȓl<EFBFBD>ɂȂ<EFBFBD><EFBFBD>Ă<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
/*如果now的值出现异常,则进行修正*/
|
||||
tl->now = 0;
|
||||
}
|
||||
task->flags = 1; /* <EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>[<5B>v<EFBFBD><76> */
|
||||
task->flags = 1; /* 休眠中 */
|
||||
|
||||
/* <EFBFBD><EFBFBD><EFBFBD>炵 */
|
||||
/* 移动 */
|
||||
for (; i < tl->running; i++) {
|
||||
tl->tasks[i] = tl->tasks[i + 1];
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void task_switchsub(void)
|
||||
{
|
||||
int i;
|
||||
/* <20><>ԏ<EFBFBD>̃<EFBFBD><CC83>x<EFBFBD><78><EFBFBD><EFBFBD>T<EFBFBD><54> */
|
||||
/*寻找最上层的LEVEL */
|
||||
for (i = 0; i < MAX_TASKLEVELS; i++) {
|
||||
if (taskctl->level[i].running > 0) {
|
||||
break; /* <20><><EFBFBD><EFBFBD><C282><EFBFBD><EFBFBD><EFBFBD> */
|
||||
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; /* <20><><EFBFBD>쒆<EFBFBD>}<7D>[<5B>N */
|
||||
task->priority = 2; /* 0.02<EFBFBD>b */
|
||||
task->level = 0; /* <20>ō<EFBFBD><C58D><EFBFBD><EFBFBD>x<EFBFBD><78> */
|
||||
task->flags = 2; /*活动中标志*/
|
||||
task->priority = 2; /* 0.02秒*/
|
||||
task->level = 0; /*最高LEVEL */
|
||||
task_add(task);
|
||||
task_switchsub(); /* <EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD> */
|
||||
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];
|
||||
|
||||
62
README.md
62
README.md
@@ -1,13 +1,11 @@
|
||||
30dayMakeOS —— OSASK
|
||||
===========
|
||||
# 《30天自制操作系统》中文源码 —— OSASK
|
||||
|
||||
《30天自制操作系统》源码中文版。自己制作一个操作系统的过程
|
||||
|
||||
阅读过程会一边汉化源码,一边执行还有根据一些相关的内容进行代码的书写,欢迎大家交流。
|
||||
自己制作一个操作系统的过程,阅读过程会一边汉化源码,一边执行还有根据一些相关的内容进行代码的书写,欢迎大家交流。
|
||||
|
||||
运行方法,在 `tolset` 中新建一个 `run` 文件夹,把代码拷贝进去,然后根据系统版本运行 `!cons_**.bat`。
|
||||
|
||||
一般都是使用 `make run` 运行代码,27天开始使用 `make run_full`。可以直接看书。
|
||||
又或者,把tolset里的`z_tools目录` 复制到 本项目目录`30dayMakeOS`下。
|
||||
|
||||
## 完成效果
|
||||
|
||||
@@ -27,6 +25,14 @@
|
||||
|
||||
渡过这个痛苦的时期,第一周就该结束了。
|
||||
|
||||
- [第1天:从计算机结构到汇编程序入门](https://github.com/yourtion/30dayMakeOS/releases/tag/Day01)
|
||||
- [第2天:汇编语言学习与Makefile入门](https://github.com/yourtion/30dayMakeOS/releases/tag/Day02)
|
||||
- [第3天:进入32位模式并导入C语言](https://github.com/yourtion/30dayMakeOS/releases/tag/Day03)
|
||||
- [第4天:C语言与画面显示的练习](https://github.com/yourtion/30dayMakeOS/releases/tag/Day04)
|
||||
- [第5天:结构体、文字显示与GDT/IDT初始化](https://github.com/yourtion/30dayMakeOS/releases/tag/Day05)
|
||||
- [第6天:分割编译与中断处理](https://github.com/yourtion/30dayMakeOS/releases/tag/Day06)
|
||||
- [第7天:FIFO与鼠标控制](https://github.com/yourtion/30dayMakeOS/releases/tag/Day07)
|
||||
|
||||
### 第二周(第8天~第14天)
|
||||
|
||||
一周的苦战还是很有意义的,回头一看,我们就会发现自己还是斩获颇丰的。这时我们已经基本掌握了C语言的语法,连汇编语言的水平也能达到本书的要求了。
|
||||
@@ -35,12 +41,28 @@
|
||||
|
||||
所以这一周我们就边学习算法边慢慢地开发操作系统。不过到了这一阶段,我们就能感觉到基本上不会再受技术问题限制了。
|
||||
|
||||
- [第8天:鼠标控制与32位模式切换](https://github.com/yourtion/30dayMakeOS/releases/tag/Day08)
|
||||
- [第9天:内存管理](https://github.com/yourtion/30dayMakeOS/releases/tag/Day09)
|
||||
- [第10天:叠加处理](https://github.com/yourtion/30dayMakeOS/releases/tag/Day10)
|
||||
- [第11天:制作窗口](https://github.com/yourtion/30dayMakeOS/releases/tag/Day11)
|
||||
- [第12天:定时器(1)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day12)
|
||||
- [第13天:定时器(2)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day13)
|
||||
- [第14天:高分辨率及键盘输入](https://github.com/yourtion/30dayMakeOS/releases/tag/Day14)
|
||||
|
||||
### 第三周(第15天~第21天)
|
||||
|
||||
现在我们的技术已经相当厉害了,可以随心所欲地开发自己的操作系统了。首先是要支持多任务,然后是开发命令行窗口,之后就可以着手开发应用程序了。
|
||||
|
||||
到本周结束时,就算还不够完备,我们也能拿出一个可以称之为操作系统的软件了。
|
||||
|
||||
- [第15天:多任务(1)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day15)
|
||||
- [第16天:多任务(2)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day16)
|
||||
- [第17天:命令行窗口](https://github.com/yourtion/30dayMakeOS/releases/tag/Day17)
|
||||
- [第18天:dir命令](https://github.com/yourtion/30dayMakeOS/releases/tag/Day18)
|
||||
- [第19天:应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day19)
|
||||
- [第20天:API](https://github.com/yourtion/30dayMakeOS/releases/tag/Day20)
|
||||
- [第21天:保护操作系统](https://github.com/yourtion/30dayMakeOS/releases/tag/Day21)
|
||||
|
||||
### 第四周(第22天~第28天)
|
||||
|
||||
在这个阶段,我们可以尽情地给操作系统增加各种各样的功能,同时还可以开发出大量像模像样的应用程序来。
|
||||
@@ -49,26 +71,18 @@
|
||||
|
||||
对了,说起文字才想起来,正好在这个时期可以让我们的操作系统显示文字了。
|
||||
|
||||
- [第22天:用C语言编写应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day22)
|
||||
- [第23天:图形处理相关](https://github.com/yourtion/30dayMakeOS/releases/tag/Day23)
|
||||
- [第24天:窗口操作](https://github.com/yourtion/30dayMakeOS/releases/tag/Day24)
|
||||
- [第25天:增加命令行窗口](https://github.com/yourtion/30dayMakeOS/releases/tag/Day25)
|
||||
- [第26天:为窗口移动提速](https://github.com/yourtion/30dayMakeOS/releases/tag/Day26)
|
||||
- [第27天:LDT与库](https://github.com/yourtion/30dayMakeOS/releases/tag/Day27)
|
||||
- [第28天:文件操作与文字显示](https://github.com/yourtion/30dayMakeOS/releases/tag/Day28)
|
||||
|
||||
|
||||
### 免费赠送两天(第29天~第30天)
|
||||
|
||||
剩下的两天用来润色加工。这两天我们来做一些之前没来得及做,但做起来既简单又有趣的内容。
|
||||
|
||||
### Links
|
||||
|
||||
[川合堂](http://www.imasy.org/~mone/kawaido/)
|
||||
|
||||
[kawai](http://www.imasy.org/~kawai/)
|
||||
|
||||
[豆瓣图书链接](http://book.douban.com/subject/11530329/)
|
||||
|
||||
[OSASK计划](http://http://osask.net/)
|
||||
|
||||
[OSASK wiki](http://ja.wikipedia.org/wiki/OSASK)
|
||||
|
||||
[source code at sourceforge](http://zh.sourceforge.jp/projects/osask/releases/?package_id=10517)
|
||||
|
||||
### 工具软件使用
|
||||
|
||||
[GNU GPL协议](http://www.gnu.org/licenses/gpl-3.0.html)
|
||||
|
||||
[GNU LGPL协议](http://www.gnu.org/licenses/lgpl-3.0.html)
|
||||
- [第29天:压缩与简单的应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day29)
|
||||
- [第30天:高级的应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day30)
|
||||
|
||||
Reference in New Issue
Block a user