📄 kernel.c,v
字号:
unsigned int i = 0X0cFFFFFF; while (i > 0) { i--;d790 1a790 1 int cnt1 = 0;d799 1d808 3a810 1 VGAPrintStr_8x16(25, 60, rotation[cnt1 % 4], 1); /* rotation on 25,60 */d816 1a816 1 int cnt1 = 0;d825 1d835 3a837 1 VGAPrintStr_8x16(25, 62, rotation[cnt1 % 4], 1); /* rotation on 25,62 */d858 4a861 3 if (videoMode == VIDTEXT_80X25) { memcpy((char *) 0xb8000, scrtime, strlen(scrtime)); } else {d867 3a874 1d879 4d892 3a894 2 x = rand() % 25; cmosDelay(5);a895 2 if (x == 0) x++;d901 45a950 1#define TASKSTACK 0X9FF00d953 1d964 1a964 1 taskP->sp = TASKSTACK - (taskcnt - 1) * 0x1000; /* 0x1000 bytes/stack/task */a997 1a1001 1a1004 1a1016 1a1020 1a1023 1a1037 7void delay2(int initval){ unsigned int i = initval; while (i > 0) i--;}d1042 32a1073 32 char *buf; int i, j, k; buf = (char *) malloc(sizeof(char) * SIZE); buf[0] = 0; printf("insert sorting for the following\n"); /* produce random data whose value <100 */ for (i = 1; i < SIZE; i++) { buf[i] = rand() % 100; delay2(0xcfffff); printf("%2d ", buf[i]); } printf("\nsorting in progress ..."); for (i = 2; i < SIZE; i++) { if (buf[i] < buf[i - 1]) { buf[0] = buf[i]; for (j = i - 1; buf[j] > buf[0]; j--) { buf[j + 1] = buf[j]; } buf[j + 1] = buf[0]; } printf("\n"); for (k = 0; k < SIZE; k++) { printf("%s%2d%s ", k == 0 ? "(" : "", buf[k], k == 0 ? ")" : ""); } } printf("\nsorting done\n"); for (i = 1; i < SIZE; i++) { printf("%2d ", buf[i]); } printf("\n"); free(buf);d1079 50a1128 50 char *buf; int i, j, k, low, high, mid, pos; buf = (char *) malloc(sizeof(char) * SIZE); buf[0] = 0; printf("binary insert sorting for the following\n"); /* produce random data which value <100 */ for (i = 1; i < SIZE; i++) { buf[i] = rand() % 100; delay2(0xcfffff); printf("%2d ", buf[i]); } printf("\nsorting in progress ..."); for (i = 2; i < SIZE; i++) { if (buf[i] < buf[i - 1]) { buf[0] = buf[i]; low = 1; high = i - 1; mid = (low + high) / 2; while (low <= high && buf[mid] != buf[0]) { if (buf[mid] < buf[0]) low = mid + 1; else high = mid - 1; mid = (low + high) / 2; } if (buf[mid] == buf[0]) pos = mid; else pos = high + 1; printf("[%2d] ", pos); for (j = i - 1; j >= pos; j--) { buf[j + 1] = buf[j]; } buf[j + 1] = buf[0]; } printf("\n"); for (k = 0; k < SIZE; k++) { printf("%s%2d%s ", k == 0 ? "(" : "", buf[k], k == 0 ? ")" : ""); } } printf("\nsorting done\n"); for (i = 1; i < SIZE; i++) { printf("%2d ", buf[i]); } free(buf); printf("\n");a1150 31void banner(){#define WHITE_TXT 0x07 /* white on black text */#define FORWARD 1#define BACKWARD -1 static int row = 1; static int i = 31 * 2; static char chs = 'A'; static char *vidmem = (char *) 0xb8000; static int lr = FORWARD; while (1) { if (i < 160 * row && lr == FORWARD) { if (i == 49 * 2 * row) lr = BACKWARD; vidmem[i] = '>'; /* chs; */ vidmem[i + 1] = WHITE_TXT; delay2(0x4fffff); /* delay(); */ vidmem[i + 1] = 00; i += 2; } else if (i >= 160 * (row - 1) && lr == BACKWARD) { if (i == 31 * 2 * row) lr = FORWARD; i -= 2; vidmem[i] = '<'; /* chs; */ vidmem[i + 1] = WHITE_TXT; delay2(0x4fffff); /* delay(); */ vidmem[i + 1] = 00; } }}d1193 38a1230 6void exceptionHandle(int handleID){ printf("\nException Int %02x: %s\n", (char) handleID, exceptionMesg[handleID]); shreg(); __asm__("hlt\n" "iret\n");d1315 1a1315 2 beep(100); beep(100);d1327 1d1329 1d1333 7@1.7log@remove the console switch function for the unstable reason while in running , console is all directed to the ktask(pid=1)'s task structure, console switch will be made later some day .@text@d1 1a1 1/*d4 1a4 1 (C) Copyright 2003-2004 Snallie Jockeyson <Snallie@@tom.com>d8 10d21 3a23 3 $Id: kernel.c,v 1.6 2004/03/01 12:46:13 oracle Exp oracle $ built : $Date: 2004/03/01 12:46:13 $ $Revision: 1.6 $d26 1a26 1/*d28 2a29 1call function: void newTask(unsigned int taskEntrance, unsigned int stackAddr, char *taskname, int id);a31 4///////////////////////////// f1~fn scancode: 59~..//////////////////////////d41 1d44 1a44 1static char rcsDate[] = "Built: $Date: 2004/03/01 12:46:13 $";d46 5a50 145#define task1Stackbottom 0x9ff00 // each task's stack has 0x1000 bytes#define task2Stackbottom 0x9ef00#define task3Stackbottom 0x9df00#define task4Stackbottom 0x9cf00extern int eax_reg, ebx_reg, ecx_reg, edx_reg;extern int esi_reg, edi_reg;extern int esp_reg, ebp_reg;extern int eflag_reg, cs_reg, eip_reg;extern int ds_reg, es_reg, ss_reg, fs_reg, gs_reg;extern void initInterrupts();extern void shreg();extern long tickcount;extern void setPITspeed(int hz);extern void setKbdLed(int OnOff);/* keytail keyhead keybuf defined in keyboard.c for keybd interrupt */extern int *keyTail;extern int *keyHead;extern char *keyBuf;#define MAX_TASKS 5#define PROMPT "Snixos# "/* Definition of task table */typedef struct taskItem { int ax, bx, cx, dx; int si, di; int bp, sp; int flag, ip; short int cs, ds, es, ss, fs, gs; unsigned char state; int ksts; int cpuTicks; unsigned int pid; char taskName[10]; //char stack[0x1000]; char keyBufs[KBSIZE]; int keyHeads; int keyTails; int console; struct taskItem *nextTaskLink;} taskData;static taskData *task, *taskTail;taskData *curTask;int ledOnOff = 0;#define KNLKEYBFLEN 128 // kernel keyboard buffer lengthchar kb[KNLKEYBFLEN];int kp = 0;typedef enum command { PS, VER, HELP, CLEAR, SHOWREG, CHART, BEEP, STOP, START, INSORT, BINSORT, FACTOR, HANOI, MDP, DIR, WRFILE, RDFILE, TYPE, DEL, COPY, D0, REBOOT, BOOT, DATE, UNKNOWN, // token type ID, NUM} commands;typedef struct cmdItem { char *cmdstr; commands cmdType; char *desc;} cmdTab;#define MAXCMDS 4*6+5cmdTab cmdTabs[MAXCMDS] = { {"ps", PS, "process status"}, {"ver", VER, "snixos version and release"}, {"help", HELP, "this help page"}, {"clear", CLEAR, "clear screen"}, {"reg", SHOWREG, "show cpu register's value"}, {"chart", CHART, "output ascii table "}, {"beep", BEEP, "make speaker beep for 10ms"}, {"stop", STOP, "stop task n"}, {"start", START, "start task n"}, {"insort", INSORT, "insert sorting "}, {"binsort", BINSORT, "binary insert sorting "}, {"factor", FACTOR, "evaluation for n! , factor n "}, {"hanoi", HANOI, "hanoi recursive prog demo, hanoi n"}, {"dir", DIR, "list directory of FAT file system"}, {"wrfile", WRFILE, "Write a file to FAT file system"}, {"rdfile", RDFILE, "read a file from FAT file system"}, {"type", TYPE, "alias of rdfile"}, {"del", DEL, "delete a feile from RAM disk, syntax: del filename"}, {"copy", COPY, "file copying in RAM disk, syntax: copy src dest"}, {"d0", D0, "ignite exception: divide by zero"}, {"reboot", REBOOT, "reboot computer"}, {"boot", BOOT, "boot snixos"}, {"date", DATE, "cmos date"}, {"mdp", MDP, "memory dumping"}, {"u/a", UNKNOWN, ""} // must reserved as the last item here};typedef struct tokenRec { commands tokenType; struct { char stringVal[64]; int numVal; } attribute;} tokenRecord;tokenRecord cmdsRecd;tokenRecord *pcmdsRecd = &cmdsRecd;int cmdIdx = 0; // command buffer kb[] index for cmdLexcommands cmdLex(tokenRecord * pcmdsRecd);void task1();void task2();void ktask();void initTask();void newTask(unsigned int taskEntrance, unsigned int stackAddr, char *taskname, int id, int console);void insertSort();void binsort();long int factors(int);void ver();void hanoi(int n, char from, char via, char to);void banner();extern void dump_heap();void time(int *tm);void mkDemoFile();void doInitInts();static void reboot(void);void timeTask();void motion();void keyDeal(int pid, char *taskName);Date dt;Time tm;int holdConsole;/* data defined in fatfs.hchar *diskspace;int *fat_tab;direntry *dir_tab;*/d52 1a52 1/* kernel start here */d55 7a61 3 screen_init(); ver(); printf("\ntype help for available commands\n\n%s", PROMPT);d65 51a115 20 initMem(); // init heap memory initfs(); mkDemoFile(); // create sample files in file system initTask(); // init task structure, fill header element of task link with dummy data newTask((unsigned) &ktask, task3Stackbottom, "ktask", 1, 1); newTask((unsigned) &task1, task1Stackbottom, "task1", 2, 0); newTask((unsigned) &task2, task2Stackbottom, "task2", 3, 0); newTask((unsigned) &banner, task4Stackbottom, "banner", 4, 0); newTask((unsigned) &timeTask, task4Stackbottom - 0x1000, "timetask", 5, 0); newTask((unsigned) &motion, task4Stackbottom - 0x1000 * 2, "motion", 6, 0); getDate(&dt); getTime(&tm); printf("%d-%d-%d %d:%d:%d\n", dt.year + 2000, dt.month, dt.day, tm.hour, tm.min, tm.sec); asm("sti"); // interrupt enabled while (1); // waiting for clock interruptd123 7d134 18d186 1d189 12a202 2 long a, temp; int i, j, memcnt;d204 1a204 1 // display tickcount at top lined209 1a209 1 *((char *) (0xb8000 + 144 + i * 2 + 1)) = 0x1f;d212 1d215 1a215 1 while (holdConsole == 1 && *keyHead % 254 != *keyTail) {a217 5 keyAscii = *(keyBuf + *keyHead + 1); keyScan = *(keyBuf + *keyHead + 0); *keyHead = (*keyHead + 2) % 254; /* if (keyScan >= 59 && keyScan <= 61) { // f1~f8 for console switchd219 2a220 3 holdConsole = keyScan - 58; // process fn hold console } */d222 6a227 6#ifdef DEBUG //output scancode while keyboard strokes printf("%c(%d)", keyAscii, keyScan);#endif printf("%c", keyAscii); kb[(kp++) % KNLKEYBFLEN] = keyAscii;d229 33a261 5 //set keyboard led lit if (keyScan == 69 || keyScan == 58 || keyScan == 70) { //69 numLock, 70 ScrollLock, 58 CapsLock ledOnOff = (ledOnOff++) % 2; setKbdLed(ledOnOff);d263 3a265 1 }d267 2d270 6a275 3 if (keyAscii == 0x0a) { kb[(kp++) % KNLKEYBFLEN] = '\0'; /* fill EOF to keyboard buffer */ kp = 0; /* reset keyboard buffer pointer */a277 2 //printf("?%d %d %s? ",cmds,pcmdsRecd->tokenType,pcmdsRecd->attribute.stringVal); //printf("?%d %s?",cmds,cmdTabs[cmds].cmdstr);d301 20a320 6 ver(); printf("snixos help routine:\n"); for (j = 0; j < MAXCMDS && strlen(cmdTabs[j].desc) > 0; j++) { printf("%s: %s\n", cmdTabs[j].cmdstr, cmdTabs[j].desc);d324 4a327 1 screen_init();d330 1a330 1 asm("pushl $100\t\n" "call beep\t\n"); // beep(100);d346 1a346 1 commands a = cmds; // save the previous command tokend396 2d425 21a445 1 rdfile(pcmdsRecd->attribute.stringVal);d447 1d460 16a475 1 printf("Not implemented yet\n");a483 2 //cli(); //kernelEntrance();d488 26a513 3 printf("%d-%d-%d %d:%d:%d\n", dt.year + 2000, dt.month, dt.day, tm.hour, tm.min, tm.sec);d521 1a521 1 } // switch end a524 1d536 20a555 1//cmdLex: get token from command buffer ,return token string, token type, token attributed558 1a558 1#define WDLEN 30 // local token buffer length for lexingd565 2a566 2 i++; // skip any space if (isalpha(kb[i])) { // command or an identifier, {letter}{letter|digit}*d569 2a570 1 } while (kb[i] != EOL && isalnum(kb[i])); // command or identifier d580 1a580 2 || ((kb[i] == '-' || kb[i] == '+') && isdigit(kb[i + 1]))) {d592 1a592 1 pcmdsRecd->attribute.numVal = pcmdsRecd->attribute.numVal * 10 + kb[i - 1] - 0x30; // ascii to integerd604 1a604 1 return -1; // nothing elsed617 6a622 4 static int cnt1 = 0; static long a, temp; static int i;d634 1a634 20 // printf("A"); while (i < 0X2FFFFF) { i++; } // keyDeal(2, "task1"); }}void keyDeal(int pid, char *taskName){ while (holdConsole == pid && *keyHead % 254 != *keyTail) { char keyAscii, keyScan; keyAscii = *(keyBuf + *keyHead + 1); keyScan = *(keyBuf + *keyHead + 0); *keyHead = (*keyHead + 2) % 254; if (keyScan >= 59 && keyScan <= 61) { // f1~f8 for console switch holdConsole = keyScan - 58; // process fn hold console
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -