Exemple #1
0
// toma un perro ya existente libre y lo recicla seteando x e y a la cucha.
// luego inicializa su mapeo de memoria, tss, lo agrega al sched y pinta la pantalla
void game_perro_reciclar_y_lanzar(perro_t *perro, uint tipo)
{
	jugador_t *j = perro->jugador;

	perro->x = j->x_cucha;
	perro->y = j->y_cucha;
	perro->tipo = tipo;
	perro->libre = FALSE;

	// ahora debo llamar a rutinas que inicialicen un nuevo mapa de
	// memoria para el nuevo perro, que carguen su tss correspondiente,
	// lo scheduleen y finalmente lo pinten en pantalla

	//inicializa memoria
	int cr3 = mmu_inicializar_memoria_perro(perro, j->index, tipo);
	perro->cr3 = cr3;
	//pinta al perro
	screen_pintar_perro(perro);
	//agrega la tarea al scheduler
	sched_agregar_tarea(perro);
	//TODO: que onda la TSS, hay que cambiar la direccion de la tarea   ???



	// ~~~ completar ~~~

}
Exemple #2
0
void tss_inicializar_perro(tss* tss_perro, perro_t* perro) {
	tss_perro->cs     = SEG_CODE_USER;
	tss_perro->ds     = SEG_DATA_USER;
	tss_perro->ss     = SEG_DATA_USER;
	tss_perro->eip    = CODIGO_BASE;     
	tss_perro->ebp    = TASK_PILA_BASE;
	tss_perro->esp    = TASK_PILA_BASE;
	tss_perro->cr3    = mmu_inicializar_memoria_perro(perro, perro->jugador->index, perro->tipo);
	tss_perro->eflags = 0x202;
	tss_perro->esp0   = mmu_proxima_pagina_fisica_libre() + PAGE_SIZE - 1;
	tss_perro->ss0    = SEG_DATA_KERNEL;
	tss_perro->iomap  = 0xFFFF;
}