ERROR: Se ha detectado que su navegador es más antiguo que lo requerido por este programa, y este no tiene soporte para todas las características necesarias.

Para poder ejecutarlo, necesita Mozilla Firefox versión 15, Google Chrome 21, o versiones más recientes de estos navegadores.

Una buena alternativa es usar versiones portables de estos navegadores, que no requieren reinstalar su navegador actual:

>> Mozilla Firefox 15+ Portable <<
>> Google Chrome 21+ Portable <<

























Elija un Arte ASCII a desplegar del Combo Box; o escriba una cadena de texto compuesta de un carácter y un atributo, y una posición entre 0-3998:
Cadena de Texto:
Posición de Memoria (0-3998):

Posición de Cursor (0-1999):
Color de Overscan (0-15):






Modelando una VGA Estándar con HTML5 (Historia Informativa 6)

Inicio de la Implementación del CPU


Instrucciones Estáticas de 1 Byte (16 y 32 Bits)

Para poder comprender la codificación de las instrucciones del CPU x86, necesitamos descargar los manuales de programación del procesador, tanto de Intel como de AMD.

En esta parte del emulador, hemos comenzado con instrucciones relativamente simples de 16 bits, y llevamos a cabo una emulación de muy, muy baja velocidad (específicamente, una instrucción individual cada 10 milisegundos, cuando lo mínimamente aceptable sería unas 256 instrucciones cada milisegundo, multiplicado por 4 hilos de emulación por CPU, no reentrantes).

Esto es para hacer una demostración clara de un programa en Ensamblador x86 de 16 bits que simplemente aumenta el primer byte de la memoria de video/texto.

Si hacemos que esta emulación vaya demasiado rápido, el resultado casi no es visible en pantalla. La solución tendrá que ser agregar un hilo de ejecución más, que se encargue de actualizar la pantalla solo 60 a 75 veces por segundo (como sería realmente), para deshacerse de cuadros que van demasiado rápido en la emulación del CPU como para ser visibles, e incluso que podrían dar problemas de bloqueo del navegador. Aunque compatibilizar eso con el parpadeo de los caracteres, la actualización de paleta, etc., puede ser un poco complicado.

Es posible que este hilo también nos sea útil para implementar el Retrazo Vertical (Vertical Retrace) y así tener un tiempo calibrado y un emulador inteligente que no se sobrecargue, y de esta forma poder emular de forma estable actualizaciones pesadas a la pantalla de la VGA emulada, sin saturarse ni actualizar más de lo que sea prudente.


Ahora que hemos creado nuestro primer programa emulado que corre dentro del navegador, debemos agregar más instrucciones variadas x86, y una vez que tengamos suficiente variedad, limpiar el código del emulador de CPU, para que soporte todas las combinaciones de codificación para cada instrucción.

También debemos empezar a manejar palabras y dobles palabras, el registro EFLAGS, y otras cosas similares. Debemos también tener en cuenta que el más grande reto será emular las distintas partes de ejecución de la máquina de una forma eficiente y rápida, de una manera que sea utilizable y fluida. Para esto tendremos que centrarnos en ser capaces de mantener un equilibrio entre la efectividad de la ejecución de la emulación y el resultado aparente que solo sirve para que el usuario perciba que tiene una máquina real, evitando excederse en mostrar más apariencia de la que es perceptible o sostenible.

Otro aspecto desafiante será atender las interrupciones de forma realmente asíncrona (repentina), aunque esto puede lograrse muy bien si antes de ejecutar la siguiente instrucción, verificamos si hubo una interrupción en el emulador, y si es así, ejecutar la interrupción, teniendo en cuenta las reglas de reentrancia de las mismas.

El código del programa en Ensamblador que el emulador está corriendo actualmente es el siguiente:

INICIO:
bits 16
org 0x500



mov ax,0xB800     ;Apuntar a memoria de pantalla
mov ds,ax         ;Poner este valor en el segmento
xor si,si         ;Poner el desplazamiento del segmento a 0

.bucle:

 ;Aumentamos el primer byte de la memoria
 ;de video. En modo de texto, esto causará
 ;que se cambie secuencialmente el carácter
 ;mostrado:
 ;;
  inc byte[si]

jmp .bucle



Obviamente, todavía falta programar varios cientos de instrucciones y combinaciones de instrucciones, para tener un CPU x86 capaz de correr cualquier binario del mundo real que sea útil.

Empezaremos implementando las instrucciones que necesitemos más inmediatamente, y esa funcionalidad la usaremos para retroalimentar la implementación del resto de carcterísticas del emulador de la VGA, y de los demás periféricos de sistema.

Como vemos, poco a poco estamos creando un emulador capaz, y que a medida que completemos, será un importante recurso en muchos aspectos de desarrollo, aprendizaje y resolución de problemas a un nivel más avanzado, unificado a través de plataformas y unificando lenguajes, e interesante.