14/11/2000
- Implementé una lista de archivos usados recientemente (MRU).
- Solucionado un problema que tenía (el destructor de los displays nunca era llamado) por el cual si cambiaba muchas veces de modo gráfico, se comía la memoria de la tarjeta de video.
12/11/2000
- Implementé una barra de status donde pongo el modelo que está corriendo, el tiempo que demora en dibujar la pantalla y los cuadros por segundo (FPS) que se están logrando. Salvo el segundo parámetro, que pronto va a volar (porque solo me resulta útil a mi), los otros dos permiten dar una idea de cómo está corriendo la emulación.
- También, en la barra de status, parpadea un cartel de "TAPE" cuando se está leyendo una cinta.
- Corregí el código del timer. Parece que ahora, la sincronización es un poco mejor (aparte que puedo contar cuantos FPS estoy alcanzando).
- No tengo idea de porqué (parece que lo hizo solo) pero está andando mejor. Suerte, porque hoy casi mando todo al diablo...
10/11/2000
- Nuevamente, una sugerencia de Santiago Romero aceleró la velocidad de las rutinas gráficas. Me sugirió usar buffers más chicos para las tablas con el mapeo de la memoria de video. Ahora, esas tablas son de 800 bytes en vez de 200K, y pueden entrar en la caché de la CPU, con lo que en algunos procesadores, la ganancia de memoria es notoria.
8/11/2000
- Gracias a la ayuda de Santiago Romero, aceleré un poco más las rutinas de dibujo con scanlines, usando Assembler.
- Modificadas las rutinas de gráficos para que en modo 128K dibujen la cantidad correcta de líneas. Ahora los efectos de borde en 128K se ven mejor, pero falta la emulación de memoria contendida aún.
- El modo de gráficos en 32 bits se sigue arrastrando. Creo que voy a tener que usar una paleta de menos colores (me da la sensación que mi algoritmo es el que me da los problemas de velocidad...)
3/11/2000
- Mandé la emulación de AY-8910 a una clase. Las cosas se hacen prolijas o no se hacen.
29/10/2000
- Implementé Drag and Drop de archivos sobre el emulador ejecutándose y antes de abrirse (puede recibir un archivo como parámetro en la línea de comandos).
- Implementé seteo de la prioridad del emulador. Ahora puede ejecutar con una de 4 prioridades (Idle, Normal, High y Realtime).
- El borde del juego Vectron ahora está correcto!
22/10/2000
- Intenté nuevamente usar un thread para el display. Los resultados no fueron malos en el notebook, pero en mi PC anda mal. Lo dejo de lado por un tiempo hasta que entienda todo este asunto de los threads.
- Implementé emulación del joystick Kempston, utilizando las flechas del teclado y los CTRL para disparar.
- Implementé emulación del joystick Fuller (de la Fuller box, solo el joystick, el audio aún no lo hice). Utiliza las mismas teclas que el joystick Kempston (cursores y CTRL).
21/10/2000
- Solucionado un problema en que si se arrastraba sobre el emulador dos veces el mismo .TAP, se colgaba.
- Aceleré ligeramente las rutinas de dibujo de scanlines GDI.
- Solucionado un problema en que los .Z80 grabados con el SamRam paginado no funcionaban.
- Implementada la instrucción OUT (C),0. Ahora, la demo "Hercules", entre otras, funciona.
- Corregido timing de las instrucciones LD IXh, IXl, IYh e IYl. La música de algunos juegos de Dinamic (Phantis, Nonamed, Phantomas) ahora suena mejor gracias a ello.
- Solucionado el problema de que al cambiar de modo de sonido se perdía el beeper. En realidad, el volumen se bajaba automáticamente y no me daba cuenta.
- Aceleré ligeramente las rutinas de DirectX en 8 bits, usando memset para dibujar los bordes, en lugar de un while (lento). Hasta que no escriba mi propio memset en assembler para WORDs y DWORDs, no voy a poder hacer lo mismo con las rutinas de 16, 24 y 32 bits.
- Los cambios de modo gráfico desde el panel de opciones ahora setean correctamente el tamaño de la ventana.
20/10/2000
- Implementada carga y grabación de opciones. Hay un archivo "setup.ini" donde se almacena la configuración del emulador. Por ahora, las opciones que se graban son las de Gráficos, Sonido y el modelo que se está emulando.
- Implementado Drag'n'Drop de archivos!! (Era más fácil de lo que pensé). Ahora si se "tira" un snapshot en el emulador se ejecuta enseguida, salvo los archivos de cinta, que aún hay que escribir LOAD "" o lo que corresponda.
19/10/2000
- Ahora funciona la emulación del +2A y el +3. Aparte de paginar mal la memoria, no emulaba el puerto 2FFD. Ahora devuelvo un valor por defecto. Esto me sirve para salir del paso. No están emulados los modos especiales de paginación. Ya me daré cuenta cuándo es que estos se precisan.
- Vil intento de meter el display en un thread aparte. Salió tan mal que andaba más lento que antes...
- Implementada la carga y grabación de archivos .SP
- Arreglada la grabación de archivos .SNA
- Implementada la carga de archivos .BLK
- Ahora el Spctrum 16K tiene SOLO 16K.
- Corregida emulación del TR-DOS. Ahora se pagina correctamente, pero no funcionan los archivos .trd (no emulo la unidad de disco).
- Por eso, y otros detalles más, ahora funciona la emulación del Pentagon 128K y del Scorpion 256K. El Pentagon parece andar bien, pero el Scorpion, en modo Basic 128, se resetea al ingresar una linea o ejecutar un comando directo. Es que el código de la paginación es una mugre.
11/10/2000
- Corregí los flags de varias instrucciones. No alteró mucho la ejecución de los programas que probé hasta ahora, pero es un paso adelante hacia tener una emulación perfecta de los flags.
- Parcialmente solucionado el tema de cambiar de modo de audio (WaveMapper, PC Speaker y DirectSound). Ahora no se cuelga al cambiar de un modo a otro, pero no sé por qué, luego de cambiar, el WaveMapper deja de generar el audio del beeper (pero sigue funcionando el audio del chip AY).
- Mejorada la estructura de clases del programa. Me debería dar la posibilidad de tener un código más modular y mantenible.
- Ahora, cada modelo maneja su esquema de memoria, los accesos a la misma y los puertos E/S. Esto me permite evitar montones de IFs y acelerar un poco esas partes de código.
- Lo anterior, mejoró un poco la paginación en modo 128K. Aún no funciona la de +2A y +3, pero algo es algo.
21/9/2000
- La instrucción DJNZ estaba seteando mal sus TEstados. Como efecto lateral, la música en el Knightlore suena a la velocidad correcta y ahora, las barras al grabar con SAVE tienen el ancho correcto.
- Solucionado parcialmente el problema del Sidewize. Tiene que ver con la lectura de los puertos inválidos (0xFF por ejemplo). Debería devolver datos de la pantalla y atributos mezclados. En lugar de eso, por ahora, devuelvo valores al azar, con ciertas restricciones, porque sinó no funciona el Arkanoid.
- Necesito hacer un thread aparte para los gráficos. Si uso scanlines, el sincronismo del audio se me va al carajo.
- Solucionado un bug estúpido que no me dejaba grabar archivos .SNA ni archivos .SCR (estaba usando la variable de archivo incorrecta!)
- Solucionado otro bug idiota que hacía que en el debugger no funcionara el ejecutar paso a paso (al hacer click en el botón estaba llamando a la función equivocada...)
- Otro bug idiota más! El display GDI con scanlines no actualizaba el atributo de FLASH. Ahora está pronto.
20/9/2000
- Solucionado el audio en modo 128K. Funcionan los tres canales del chip AY-8912 más el canal del beeper juntos. Implementé una rutinita para mezclar el audio (aunque es bastante rudimentaria: sumo los canales y evito pasarme del máximo audible 0x7fff).
- El audio por WaveMapper funciona a 44100, 16 bits, Stereo. Tendré que dar opciones para regular eso en el caso de máquinas más lentas o tarjetas de audio poco compatibles.
- El Sidewize anda muy mal. Tengo que investigar cuál es el problema.
- La música del Knightlore va muy rápido.
- La voz digitalizada del Robocop no se escucha. Creo que ya sé por qué.
- La mayoría de los TAPs en 128K no funcionan. Ni idea.
10/9/2000
- Implementada emulación de los modelos 128K, +2, +2A y +3. Los dos ultimos no andan, porque no hago bien los cambios de bancos de las ROMs, y los dos primeros tienen problemas tambien, supongo que de los timings de las instrucciones y la paginación de memoria.
- Implementada emulación del chip AY-8912 utilizando parte de las rutinas de MAME, adaptándolas para funcionar en stereo.
- Implementado el sonido por WaveMapper. En algunas máquinas funciona mejor que DirectSound, dependiendo del hardware.
- Mejorado el modo gráfico GDI. Ahora la pantalla se dibuja en un bitmap en memoria antes de volcarla, al contrario de lo que hacía antes (usar SetPixel, que es muy lento para lo que preciso).
- A causa de eso, el preview de archivos funciona muchísimo más rápido ahora.
- El modo GDI ahora soporta también scanlines.
- Mejorado el sonido DirectSound (sin emulación de AY-8912), utilizando una técnica de buffers similar a la que uso para WaveMapper (mejoró el rendimiento en mi notebook, que es más quejoso en cuanto al audio).
6/9/2000
- Implementé el sonido por PC Speaker como una clase más. Aún no se puede elegir desde la ventana de Opciones.
- Funciona el display en 256 colores. Tenía un problema con la paleta. Voy a tener que probarlo en distintas máquinas a ver como anda.
5/9/2000
- Arreglé los BEEPs de la ROM. Ahora suena el chasquido de las teclas y la música del "Abu Simbel Profanation" por ejemplo.
- Agregué display por DirectX con 8 bits (256 colores). La paleta a veces se vé horrenda. Ni idea de cómo solucionar esto por ahora...
- Optimicé a mano las rutinas de DirectX de 16 bits. Queda por propagar el cambio a las de 8, 24 y 32 bits y quizá en un futuro, pasarlas a Assembler.
- Ahora sé como hacer el sonido por PC-Speaker. Suena horrendo, pero es una opción más si no hay tarjeta de audio.
27/8/2000
- Carga y grabación de archivos .SCR (pantallas)
- Grabación de archivos .SNA
- La carga de archivos se hace desde una misma ventana en lugar de una distinta para cada tipo.
- El display ahora funciona con 16, 24 y 32 bits de color (24, supongo, aún no lo probé)
- Las rutinas de carga buscan en la cinta los bloques pedidos antes de dar error. Mejora el uso de los programas que cargan sus niveles desde la cinta.
- Ahora, LOAD "cualquier cosa" puede ser interrumpido. Antes no había forma de salir del loop de la cinta.
- Introducción de pokes. Se pueden aplicar y luego, volver al estado anterior. Permite cargar archivos .POK.
24/8/2000
- Corregida la rutina de carga de la ROM. Ahora funcionan los juegos multicarga (y a grandes rasgos, todo juego que use encabezados extraños en los bloques de cinta, pero lea los datos usando la ROM). O sea, los juegos grabados con Speedlock no van a andar por ahora.
23/8/2000
- Ahora, al cambiar de modo gráfico, la ventana no cambia de posición. Sólo de tamaño.
- La carga de archivos .TAP está más complicada de lo que pensé. Los programas que no usan las rutinas de la ROM, sino solo partes de ella, no funcionan. Ni hablar de las protecciones por SpeedLock.
- La ventana del Debugger dejó de ser MFC. Ahora anda mucho más rápida, y además, ahora anda.
22/8/2000
- Arreglé los cambios de modos (ahora se respetan los tamaños según si dibujo con scanlines o no). Cambiar una opción de gráficos respeta los seteos de las demás opciones.
- Ahora, al resetear, no se pierde el .TAP que se había elegido.
21/8/2000
- Arreglé la ventana de carga de snapshots. Ahora anda bien y además tiene un preview de archivos .TAP, .SNA y .Z80.
- Primer intento de ajustar la velocidad de la emulación. ¡Bastante bien! La música suena a la velocidad correcta aunque se corta a veces (creo que es culpa del DirectSound). Voy a ver que hago.
- Le estoy agarrando la mano a las APIs y ya me deshice de bastante código MFC, lo cual es algo bueno en términos de performance. El tamaño del ejecutable se redujo ya que saqué un montón de basura que andaba dando vueltas por ahí.
20/7/2000
- Pasaron casi dos meses desde la última actualización. En ese tiempo, corregí la gran mayoría de los problemas de las versiones anteriores.
- Se chequearon todas las instrucciones y casi puedo asegurar que estan 100% correctas.
- Emulo correctamente el registro R, así que los programas de Jonathan Smith (Hypersports, Firefly, Hysteria, Batman: The Caped Crusader) funcionan correctamente.
- Agregué una rutina de sonido muy rudimentaria. Como la velocidad no se sincroniza con nada, hay veces que pierdo samples.
- Aceleré algo las rutinas de video (GDI y DirectDraw). GDI es muy lenta aún.
- Carga archivos .TAP
- Queda por resolver el tema de la memoria lenta, sincronizar el barrido de pantalla con las interrupciones, ajustar el sonido, tirar al diablo todo lo que sea MFC y me esté enlenteciendo la emulación, etc.
22/5/2000
- Arreglé las instrucciones RL, RR, RLCA y RRCA. Antes, no tomaba en cuenta el acarreo anterior (o sea, el byte no rotaba, sinó que se desplazaba hacia un lado y el bit saliente se perdía). Esto significa que ahora funciona el scroll del Jet Set Willy II y Willy aparece en la posición correcta (no se cae varias pantallas al empezar).
- PRINT 10 ahora da 0.01010101E8, lo cual es un gran avance desde el 0 que obtenía anteriormente. Los responsables: RL C no andaba.
- Funciona el Jet Set Willy II, el Fairlight sin teclado y parece que puedo ejecutar programas en BASIC (funciona el High Noon).
21/5/2000
- Arreglé los cambios que las instrucciones le hacen al PC. Antes, habían opcodes que le sumaban más de lo necesario, perdiendome cada tanto algunas instrucciones.
- Ahora andan los programas en BASIC, pero no puedo hacer cálculos numéricos.
11/5/2000