kmain - PabloVillagran/SO1Nino GitHub Wiki
kmain
Es el nombre del menú del proyecto, el cual ejecutara una serie de comando que permitirán la escritura y lectura del sistema operativo, por lo que tiene una variedad de funciones que se utilizaran para realizar la acción de calculadora, reiniciado y apagado del sistema operativo. Por lo que primero se declaro en el assembler para que inicial la determinada función del menú por el cual se tuvo que referencia por linken.id. entre ellas se encuentra la declaración de limpiar, dibujar, lectura del teclado, la declaración de opciones a realizar en un determinada acción.
Realiza un ciclo infinito que escucha el teclado e interpreta las instrucciones por comando hasta que se le indica lo contrario con el comando die.
;declaración y llamada del menú principal de boot.c en el assembler
start:
;función principal
cli ;cambia una bandera interna para el bloqueo de interrupciones
mov esp, stack_space ;asigna puntero para pila de instrucciones
call kmain ;llama al kernel
je shutdown_success
Por lo que después se menciono el el archivo de boot.c con la estructura de:
void kmain(void){//declaración de una función que retorna null llamada kmain
/*declaración de las acciones*/
}
Declaración del menú Kmain
int kmain(void)
{
vm = (char*)0xb8000; // array de caracteres en pantalla
clear();//iniciarlizacion de la funcion llamada limpieza de la pantalla del monitor
debug = 0;
n = 1;
output = "Wooffer >";
//position = strlen(output);
draw();
initPos = position;
input = " ";
while(1){
if(inb(0x64) & 0x01){
scancode = inb(0x60); //puerto de recepcion de datos en teclado
char cbCode = charByCode(scancode);
if(cbCode!='\0')
{
if(cbCode==8){
`backSpace();//declaracion de la funcion espaciadora`
`cursor();`
}else if(cbCode == '\n'){
`//limpia cursor`
`vm[position*2] = ' ';//realiza un enter en la pantalla`
`vm[position*2+1] = 0x01;`
`//captura y logica`
`int len = position - initPos;`
`position = initPos;`
`char in[len];`
`int k;`
`for(k = 0; k < len; k++){`
`in[k] = vm[position*2];`
`position++;`
`}`
`in[k] = '\0';`
`input = in;`
`if(n>24){`
`clear();`
`n=1;`
`position = 0;`
`}`
`position = (80*n);`
`++n;`
`print(input);`
`position = (80*n);`
`++n;`
`char * inp = funBegins(input);`
`print(inp);//declaración de la función escritura en la pantalla del monitor`
`if(equals(inp, "REBOOT"))`
`reboot();//llama la scrip llamado reboot() declarado en la parte superior y en assembler`
`if(equals(inp, "APAGAR"))`
`break;//salto`
`//reset`
`vm[position*2] = ' ';`
`vm[position*2+1] = 0x01;`
`position = (80*n);`
`++n;`
`draw();`
`initPos = position;`
}else{
`printc(cbCode, position);`
`position++;`
`cursor();`
}
}
}
}
position++;
print("*DEAD*");
clear();
//INSERTAR LLAMADA PARA EL APAGADO DEL SISTEMA
//reboot();
return 0;
}