/// <summary>Imprime una zona de memoria en un formato presentable</summary> /// <param name="memoria">Memoria</param> /// <param name="direccion">Direccion de memoria de inicio</param> /// <param name="longitud">Cantidad de bytes que se quieren imprimir a partir de la direccion de inicio (minimo 10)</param> private static void hexDump(kernel.Memoria memoria, int direccion, int longitud) { int start = direccion & 0xFFF0; int lines = longitud / 16; if (lines == 0) lines = 1; for (int l = 0; l < lines; l++) { Write(hexWord(start + (l * 16)) + " "); for (int r = start + (l * 16); r < start + (l * 16) + 16; r++) Write(hexByte(memoria.leer(r)) + " "); Write(" "); for (int r = start + (l * 16); r < start + (l * 16) + 16; r++) { char c = (char)memoria.leer(r); if ((c >= 32) && (c <= 128)) Write(c); else Write("."); } WriteLine(); } }
/// <summary>Imprime el estado de las interrupciones y del IME (Interrupt Master Enable)</summary> /// <param name="registros">Registros</param> /// <param name="memoria">Memoria</param> private static void imprimirInterrupciones(kernel.Registros registros, kernel.Memoria memoria) { WriteLine("IME = " + registros.flagIME); Write("VBLANK = " + ((memoria.leer(kernel.Constantes.INT_FLAG) & kernel.Constantes.INT_VBLANK) > 0)); Write("\tLCDC = " + ((memoria.leer(kernel.Constantes.INT_FLAG) & kernel.Constantes.INT_LCDC) > 0)); Write("\tTIMER = " + ((memoria.leer(kernel.Constantes.INT_FLAG) & kernel.Constantes.INT_TIMER) > 0)); Write("\tSERIALTX = " + ((memoria.leer(kernel.Constantes.INT_FLAG) & kernel.Constantes.INT_SERIALTX) > 0)); WriteLine("\tKEY = " + ((memoria.leer(kernel.Constantes.INT_FLAG) & kernel.Constantes.INT_KEY) > 0)); }
/// <summary>Activa o desactiva una interrupcion</summary> /// <param name="memoria">Memoria</param> /// <param name="interrupcion">Nombre de la interrupcion a modificar (VBLANK, LCDC, TIMER, SERIALTX o KEY)</param> /// <param name="valor">Nuevo valor para la interrupcion. 1 o 0</param> private static void asignarInterrupcion(kernel.Memoria memoria, string interrupcion, string valor) { bool error = false; int val = 0; interrupcion = interrupcion.ToUpper(); switch(interrupcion){ case "VBLANK": val = kernel.Constantes.INT_VBLANK; break; case "LCDC": val = kernel.Constantes.INT_LCDC; break; case "TIMER": val = kernel.Constantes.INT_TIMER; break; case "SERIALTX": val = kernel.Constantes.INT_SERIALTX; break; case "KEY": val = kernel.Constantes.INT_KEY; break; default: error = true; break; } switch(valor){ case "1": break; case "0": val = ~val; break; default: error = true; break; } if (!error) memoria.escribir(memoria.leer(kernel.Constantes.INT_FLAG) | val, kernel.Constantes.INT_FLAG); }