我已經規范了系統代碼風格,類似於按照linux分包,把各部分功能區分開了
Antz系統更新地址
Linux內核源碼分析地址
Github項目地址
在之前的工作中,AntzOS已經從單調的界面,變得逐漸擁有自己的功能了。
真機運行情況 :
這個系統在我最初的目的中就是實現一個半圖形半終端的輕巧OS。
完成了當前的工作后,Antz接下來需要實現的則是關於任務調度相關的。
目前實現的是在Terminal中對命令的響應,還有一個簡易的vim,可以用於右邊界面的文本編輯。
對於按鍵中斷,對全鍵盤的響應改良之后不會出現之前說的bug,但是在shift按下時的按鍵模式卻是有很大問題,雖然我已經想到了解決方案,不外乎給shift的按下一個flag,彈起一個flag,但這部分感覺現在實現與否都是不怎么重要,所以就先忽略這里了。
最近同時也在讀Linux內核源碼。發現其中的注釋也是很有意思,甚至Linus自己寫的,他也不知道這部分為什么這樣寫,不斷嘗試之后發現可以實現,他就這樣用了。
仔細看看關於按鍵響應命令的實現,現在只能說很懵,又臭又長,估計隨便改改我就會不知道怎么繼續下一步了。(不過好在我每添加一個功能都會把整個項目備份一份)
void key(Binfo binfo,char s[40]){
if((strcmp(s,"1C")==0)){ // enter
if(x_move!=0){
// 右邊
write_x = 58 ;
write_y += 19 ;
}else {
// 左邊
action_command(binfo);
write_x = 58 ;
write_y += 19 ;
if (x_move==0)
printasc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>");
}
}else if((strcmp(s,"0F")==0)){
// 關於tab 0F 8F
printasc(binfo->vram, binfo->scrnx, x_move+write_x, write_y, COL8_FFFFFF, " ");
write_x += 8 ;
border(binfo);
printasc(binfo->vram, binfo->scrnx, x_move+write_x, write_y, COL8_FFFFFF, " ");
write_x += 8 ;
border(binfo);
printasc(binfo->vram, binfo->scrnx, x_move+write_x, write_y, COL8_FFFFFF, " ");
write_x += 8 ;
border(binfo);
}else if((strcmp(s,"3B")==0)){ //關於F1的響應中斷
sprintf(command,"%s","");
// flag = 0
x_move = 0 ;
new_pe(binfo);
printasc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>");
}else if(strcmp(s,"0E")==0){
// 回退
int len = strlen(command);
command[len - 1] = '\0';
write_x -= 8 ;
flash(binfo->vram, binfo->scrnx , COL8_000000, x_move + write_x, write_y, x_move+write_x+19, write_y+19);
if(x_move!=0){
// 正在右邊界
if(write_x<=60) {
write_x = 202 ;
write_y -= 19 ;
}
}else if(x_move==0){
// 正在左邊界
if(write_x<=4) {
write_x = 146 ;
write_y -= 19 ;
}
}
}else {
char *in = replace_char(s) ;
if(strcmp(in,"")==0){
}else {
printasc(binfo->vram, binfo->scrnx, x_move + write_x, write_y, COL8_FFFFFF, in);
add_command(in);
write_x += 8 ;
}
// 添加響應區
//清除
//打印字符 Only use debug
}
border(binfo);
}
// 邊界處理
void border(struct BOOTINFO *binfo){
if (x_move==0){
// 左邊
if(write_x>148){
write_x = 4 ;
write_y += 19 ;
}
if(write_y>180){
new_pe(binfo);
printasc(binfo->vram, binfo->scrnx, 4, write_y, COL8_FFFFFF, "AntzOS>");
}
}else if(x_move!=0){
// vim模式
if(write_x>310-x_move){
write_x = 58 ;
write_y += 19 ;
}
if(write_y>180){
write_y = 15 ;
write_x = 58 ;
flash(binfo->vram,binfo->scrnx,COL8_000000, 160,0,320-3,260-3);
printasc(binfo->vram,binfo->scrnx,162,2,COL8_00FF00,"Vim :");
}
}
}
目前的項目目錄,請忽略掉md文件,這個鏡像文件可以直接使用工具寫入u盤啟動,或者在虛擬機打開。thun.c是今天(2018年10月18日)新增的,目的是為了抽離其他c文件中的工具化函數,不然以后只是一個源碼文件都會讓人頭疼。
▒▒ antz.img
▒▒ Makefile
▒▒ README.md
▒▒
▒▒▒▒asmfunc
▒▒ naskfunc.nas
▒▒
▒▒▒▒assic
▒▒ char.set
▒▒
▒▒▒▒boot
▒▒ asmhead.asm
▒▒ mbr.asm
▒▒
▒▒▒▒include
▒▒ errno.h
▒▒ float.h
▒▒ limits.h
▒▒ math.h
▒▒ stdio.h
▒▒ string.h
▒▒ todo.h
▒▒
▒▒▒▒interrupt
▒▒ int.c
▒▒
▒▒▒▒io
▒▒ fifo.c
▒▒
▒▒▒▒lgdt
▒▒ set_lgdt.c
▒▒
▒▒▒▒log
▒▒ build.log
▒▒ delete.log
▒▒
▒▒▒▒main
▒▒ bootpack.c
▒▒ README..md
▒▒ shell_1.md
▒▒ shell_2.md
▒▒
▒▒▒▒thun
▒▒ thun.c
▒▒
▒▒▒▒windows
graphic.c
Makefile非常關鍵,如果沒有這個,怕是我只是編譯鏈接就得花費很長時間,而且中間估計會錯誤頻出。
Antz_kernel = main/bootpack.obj asmfunc/naskfunc.obj assic/char.set windows/graphic.obj lgdt/set_lgdt.obj interrupt/int.obj io/fifo.obj thun/thun.obj