domingo, 23 de diciembre de 2012

26 años ya...

Pues eso, justo a estas horas hace 26 años que mis padres me regalaron mi primer ordenador. Se que toooodos los años pongo lo mismo (salvo que año tras año aumento en uno el número de años), pero es lo mínimo que puedo hacer.

Echando la vista atrás, a lo largo de estos años he adquirido muchísimos conocimientos sobre la informática y gracias a ella hoy me gano la vida. Gracias a la informática he conocido a muchísima gente y he cultivado muy buenas amistades que han trascendido más allá de una relación entre personas que comparten una misma afición. También he conseguido publicar un juego para MSX en cartucho, cosa que me resultaba impensable en los comienzos y tengo otros muchos proyectos en mente

Sin embargo, a pesar de que los conocimientos y las herramientas de las que dispongo me dan la oportunidad de llevar a término todos esos proyectos, la vida, el universo y todo lo demás hacen que el tiempo libre tienda rápidamente a cero (o a menos infinito, según se mire). La familia, el trabajo, la falta de motivación... han hecho que este año haya sido muy flojo tanto en producciones para MSX (que no hay ninguna) como en posts en el blog (que dudo que lleguen a los 35 en total, lo que supone menos de uno cada 10 días

Navidades... estas fechas siempre han tenido sabor a MSX. Sabor a esos juegos esperados durante todo el año, sabor a tiempo libre que apetece aprovechar en la oscuridad, sólo con la luz de la pantalla del ordenador mientras algún clásico nos obliga a dar el 120% de nuestra habilidad, mientras fuera nieva. Espero tener algo de tiempo para, al menos, echarme un par de partidas a algo, porque hace muchísimo que ni siquiera abro un emulador (y no hablemos ya de encender el MSX).

Ya que el año que viene se celebrará el trigésimo aniversario del MSX, por mi parte intentaré encontrar algo de tiempo para poder terminar alguna cosilla que está a medio hacer, pero no prometo nada porque no depende al 100% de mi.

Ganas no faltan, pero tiempo no sobra...

lunes, 10 de diciembre de 2012

197 aniversario del nacimiento de Ada Byron

¿Quién fue Ada Byron? Pues nada menos que la primera persona en describir un lenguaje de programación de carácter genérico allá por la primera mitad del siglo XIX. Se la considera la madre de la programación informática.

El lenguaje de programación ADA, creado más de un siglo después de su muerte, le debe su nombre, siendo la única mujer que ostenta dicho honor.

jueves, 29 de noviembre de 2012

RetroMadrid 2013

¡Vuelve RetroMadrid! En 2013 repetimos ubicación en la Nave 16 del espacio cultural Matadero, durante los días 8, 9 y 10 de marzo.

Una gran aventura en la que se hará homenaje a uno de los videojuegos que hicieron historia: "La Aventura Original", coincidiendo con la publicación de la novela (que esperamos finalmente salga que ha salido adelante gracias al crowdfunding) sobre el mismo.

También se celebrará el trigésimo aniversario del MSX, por lo que, al igual que en la pasada edición se dedicó un espacio al Spectrum, habrá un área dedicada al estándar nipón llamada MadriSX. ¡Vuelve a vivir el encuentro de usuarios de MSX en Madrid que sentó las bases de lo que actualmente es RetroMadrid!

Y más y más novedades que se irán anunciando en la web oficial. ¡No olvidéis visitarla! ¡Allí nos veremos!

jueves, 25 de octubre de 2012

XLII RU de Barcelona

El próximo 15 de Diciembre tendrá lugar la cuadragésimo segunda reunión de MSX en Barcelona. Esta es, sin duda alguna, la RU definitiva sobre el MSX, el Universo y todo lo demás ;)

En esta ocasión se vuelve al Centro Cívico Cotxeres de Sants, un lugar conocido por todos los habituales de estas reuniones. ¡Tenéis que ir! Habrá interesantes novedades para nuestros queridos MSX.

A mí me resulta imposible asistir ya que mi hija de apenas seis días de vida me tiene casi totalmente absorbido (y totalmente encandilado). En otra ocasión será. Pero que sepáis que estoy perjeñando algunas maldades interesantes, espero que el año que viene sean visibles si el tiempo libre me lo permite.

Como siempre, para más información acudid a la web de la AAMSX, ¡vamos!

sábado, 13 de octubre de 2012

Adaptando imágenes SC5

Al trabajar con imágenes en Screen 5, podemos bien crearlas directamente en el MSX con algún programa o bien trabajar en un ordenador más potente y luego convertir dicha imagen para su uso en nuestros MSX.

Esta última opción es la más adecuada y, además, existen multitud de conversores que nos facilitan mucho ese trabajo, incluso adaptan la paleta de forma adecuada a los colores del MSX, haciendo más fácil nuestra labor.

Uno de esos conversores que, para mi gusto, funciona bastante bien es el MSX Screen Conversor de Janonne, que puede encontrarse aquí. Es bastante sencillo de usar y permite convertir a varios screens, incluso Screen 2.

Sin embargo, un pequeño defecto que le veo a este conversor es que la paleta de colores puede salir completamente desordenada, algo que en muchas ocasiones no nos conviene porque queremos que los colores estén en un orden determinado (por ejemplo para los sprites en modo 2 o similar). Esto es lo que me ha estado pasando estos días que he trabajado con imágenes en SC5 y este conversor y al final me he tenido que hacer un programita (en perl) que adapte la paleta.

Para ejecutar el programa lo primero que necesitamos es meterle la paleta que queremos usar en el MSX en el array @destPal y la paleta que obtenemos en el conversor online en el array @janoPal. Las paletas están almacenadas mediante sus componentes RGB para los colores 0 a 15.

Luego, desde una consola ejecutamos

adaptSC5.pl < input.sc5 > output.sc5 start size

donde
  • input.sc5 es la imagen obtenida en el conversor online
  • output.sc5 es la imagen que queremos usar en el MSX
  • start es el byte a partir del cual queremos trabajar
  • size es el número de bytes que queremos convertir
Et voilà! Si todos los colores de la paleta de la imagen convertida se corresponden con algún color de la paleta del MSX, entonces obtendremos un fichero para ser volcado directamente a SC5 con la paleta con la que estemos trabajando. Si hubiera algún error, el programa avisaría del mismo para así poderlo subsanar.

Espero que os sea útil el script. ¡SC5 power!

domingo, 30 de septiembre de 2012

MSX2: arranque a 60hz

Pep Alacant, un apasionado a lo retro (MSX incluido) de Alicante, me comentó que le fastidiaba que su 8235 arrancase por defecto a 50hz, ya que le encanta jugar a 60hz, para lo cual tenía que usar una flashrom y no podía jugar con sus originales.

El caso es que dispone de las herramientas necesarias para volcar el contenido de los chips que almacenan la BIOS, así que me envió los archivos de las ROMS de su propio ordenador y me puse a ver qué modificaciones había que hacer para que el ordenador arranque por defecto a 60hz.

Si tenéis un lector/grabador de eproms, podéis hacerlo vosotros mismos volcando la MainRom y la ExtRom, haciendo las modificaciones que os indico y grabando los ficheros en los chips necesarios. Pep ha utilizado un 27256 para la MAINROM (32Kbytes) y un 27128 para la EXTROM (16Kbytes), aunque eso puede variar según el MSX que tengáis.

De todas formas, mi consejo es que probéis primero en un emulador para comprobar que todo sigue funcionando como es debido antes de volcar los ficheros a los chips y probar en el MSX real. Haced esto bajo vuestro propio riesgo, ya que si ponéis unos chips que no sean adecuados podéis cargaros el MSX.

Otra advertencia más: las direcciones de memoria que voy a indicar (salvo la primera, que es fija para todos los MSX) pueden variar entre una BIOS y otra, aunque supongo que no habrá muchísimas diferencias.

Cambios en la MAIN ROM


En primer lugar, hay que poner a 0 el bit de mayor peso del byte situado en $002B. Esto ya lo comenté hace algún tiempo cuando hablé del PT3 a 60hz. Ese es el IDBYTE1 de la BIOS y es donde los programas deben mirar para saber la frecuencia por defecto de la BIOS.

Tras esto, hay que buscar tres puntos en los que la BIOS escribe (de diferente forma en cada uno de ellos) un valor en el registro R#9 del VDP, que es el que controla la frecuencia. Una BIOS PAL por defecto escribe $02 en ese registro, activando el bit 1 le dice al VDP que debe funcionar a 50hz. Lo que hay que hacer es que escriba $00, con el bit 1 desactivado y diciéndole así al VDP que se ponga a 60hz.

El primer punto donde la BIOS escribe en el R#9 es la dirección $7BD6 en la que podemos encontrar el siguiente código:

$7BD6: ld a,$02
       out [$99],a
       ld a,$89
       out [$99],a

Literalmente este código escribe $02 en el R#9. Así pues basta con cambiar el $02 situado en $7BD7 por un $00 y ya habremos hecho todos los cambios en la MAIN ROM.

Cambios en la EXT ROM


La EXT ROM escribe en el R#9 en dos sitios: uno justo antes de presentar el logo y otro justo antes de saltar al BASIC o al programa que tenga el cartucho. Así que vamos a ver qué hace en esos puntos.

El primero de los puntos es $2B40, que es donde la BIOS nos muestra el consabido logo MSX subiendo. El código de esta parte es el siguiente:

$2B40: ld b,8
       ld hl,$2B4F
$2B45: ld d,[hl]
       inc hl
       ld e,[hl]
       inc hl
       call $2AC2
       djnz $2B45
       ret
$2B4F: .db $00,$80,$01,$20,$08,$2A,$09,$02,$02,$1F,$05,$F7,$0B,$00,$06,$0E

Y el código en $2AC2 es:

$2AC2: push bc
       push af
       di
       ld c,$99
       out [c],e
       ld a,d
       or $80
       ex [sp],hl
       ex [sp],hl
       out [c],a
       ei
       pop af
       pop bc
       ret

Es decir, en $2AC2 está volcando al registro del VDP contenido en d el dato contenido en e. Si miramos el código situado en $2B40, vemos que en $2B4F hay una tabla de 8 pares de bytes: registro-valor. Miramos cual es el valor que se escribe en el registro 9 y comprobamos que es $02. Lo cambiamos por $00 y el logo de MSX ya aparecerá a 60hz.

El último punto donde se escribe en R#9 es el momento en el que la BIOS cede el control al BASIC o al cartucho que tengamos pinchado. En este caso lo hace en la dirección $06CA cuyo código vemos a continuación:

$06CA: push af
       push bc
       push de
       push hl
       di
       xor a
       out [$99],a
       ld a,$91
       out [$99],a
       call $1034
       ld hl,$f3df
       ld b,$08
$06DE: ld a,[hl]
       inc hl
       out [$9b],a
       djnz $06de
$06E4: ld hl,$FFE7
       ld b,$10
$06E9: ld a,[hl]
       inc hl
       out [$9b],a
       djnz $06e9
       ei
       pop hl
       pop de
       pop bc
       pop af
       ret

A la vista del código, vemos que lo primero que hace es inicializar a 0 el registro R#17 ($11 en hexadecimal) del VDP. Este registro es un registro índice, que apunta al registro del VDP donde se va a volcar los datos que pasemos mediante OUT al puerto $9B. Además, con cada OUT se incrementa permitiendo realizar un volcado masivo de datos a los registros del VDP mediante OUTs sucesivos al puerto $9B.

La llamada a $1034 realiza una espera activa hasta que se produzca un nuevo blanqueo vertical, comprobando el flag de retrazado vertical presente en el registro de estado 2 del VDP, pero como se sale del propósito de este post, no hablaré más de ella.

Bien, para que el parcheo funcione, lo que hay que hacer es modificar la tabla de datos de la que la BIOS toma los valores a volcar y así poner un $00 en R#9. Si nos fijamos, vemos que la BIOS está leyendo los datos desde RAM, concretamente desde la copia de los registros del VDP que se guarda en RAM ($F3DF para los registros MSX1 y $FFE7 para los de MSX2 y superiores). Así pues aquí no podemos hacer nada, tendremos que buscar la rutina que vuelca la tabla de ROM a RAM para modificarla adecuadamente.

Dicha rutina se encuentra en $0336 y el código es el siguiente:

$0336: ld hl,$29F6
       ld de,$F3DF
       ld bc,$0008
       ldir
       ld de,$FFE7
       ld bc,$0010
       ldir
$0349: xor a
       ld [$FAF5],a
       ld [$FAF6],a
...

Con lo cual la tabla está en $29F6 vamos a esa dirección y substituimos el byte de la dirección $29FF (el décimo byte, correspondiente al valor que se va a volcar en R#9) que resulta ser un $02 por un $00. Probamos esta BIOS modificada y veremos que hemos conseguido que nuestro MSX arranque a 60hz tanto el BASIC como los cartuchos. ¡Prueba superada!

¿Y si ahora quiero que arranque a 50hz?


Vale, si ahora quisiéramos arrancar a 50hz podemos volver a deshacer todos los cambios o trabajar un poco más.

La idea que se me ocurrió fue mantener pulsada una tecla para que la BIOS cambiase a 50hz justo antes de saltar al BASIC o al cartucho. Para facilitar el trabajo busqué una tecla que se sitúe en el bit 1 de las filas de la matriz de teclado. Podía ser "1", "9", "F5", "CTRL"... y elegí "1".

A continuación parcheé la rutina que copia la tabla a RAM (la última que hemos visto) justo tras el segundo LDIR:

$0349: nop
$034A: call $3F00
       ld [$FAF6],a
...

Es decir, substituyo el XOR A y el LD [$FAF5],A por dos instrucciones que van a saltar a $3F00, que es un hueco que encontré en la parte superior de la EXT ROM. Allí metí el siguiente código:

$3F00: in a,[$AA]
       and $F0
       out [$AA],a
       in a,[$A9]
       cpl
       and $02
       ld [$FFE8],a
       xor a
       ld [$FAF5],a
       ret

El propósito del código es seleccionar la fila 0 de la matriz de teclado, leeerla, complementarla para que si hay alguna tecla pulsada se quede a 1 el bit correspondiente y quedarme con el bit 1 (el correspondiente a la tecla "1").

Si esa tecla se pulsa, el contenido del registro A en este punto será $02 y si no se pulsa será $00. Justo el valor que queremos (50hz y 60hz respectivamente) si se pulsa "1" o no se pulsa, así que lo copiamos en $FFE8 que es de donde se va a leer.

Luego ejecutamos las dos instrucciones que habíamos sobreescrito y devolvemos el control a la BIOS.

De esta forma tenemos un MSX2 que arranca nativamente a 60hz y si pulsamos "1" durante el arranque (antes de que salga el logo de MSX), cuando la BIOS ceda el control al BASIC o al cartucho que haya insertado, cambiará a 50hz.

Para finalizar (que ya iba siendo hora) aquí tenéis un vídeo que ha grabado Pep mostrando el resultado en su 8235.

lunes, 17 de septiembre de 2012

Detrás de los muros de la Abadía del Crimen

Vamos con otro vídeo, en esta ocasión de RetroMadrid FEST 2011: la charla "Detrás de los muros de la Abadía del Crimen" a cargo de Antonio Giner y Manuel Pazos.

En el vídeo nos desvelarán muchos secretos del que hoy en día se sigue considerando el mejor videojuego de 8 bits de la época dorada del soft español.

martes, 28 de agosto de 2012

Sinfonía Pixelada: The Legend of Zelda

La orquesta Camerata Musicalis bajo la dirección de Edgar Martín nos traslada al mundo de The Legend of Zelda, gracias a los arreglos de Miguel Prida sobre la música original de Koji Kondo.

¡Adelante Link!

Y con este vídeo completamos el concierto inaugural de RetroMadrid 2012. A continuación os pongo una lista ordenada de los cinco vídeos que conformaron el concierto:

domingo, 26 de agosto de 2012

Bit Managers: Mi paso por la compañía

En este vídeo, podemos ver la charla que Toni Gálvez dió en la pasada RetroMadrid 2012 sobre su paso por la compañía Bit Managers.

sábado, 23 de junio de 2012

Game 40: Los tiempos dorados del videojuego en la radio

Otro vídeo oficial de RetroMadrid 2012: la conferencia de Game 40 que tuvo lugar el sábado 5 de Mayo.

En ella, podemos ver y escuchar a Guillem Caballé y a Manuel Martín-Vivaldi, dos de los presentadores del programa Game 40, el programa de radio sobre videojuegos que pudimos disfrutar desde 1992 a 1998.

Un siglo de Alan Turing

Hoy hace un siglo nacía el matemático, lógico, criptógrafo e incluso hasta biólogo Alan Turing, que puede ser considerado padre de la computación tal y como la conocemos hoy en día.

Gracias a su trabajo, los aliados pudieron descifrar el comportamiento de la Máquina Enigma, permitiendo así descifrar los mensajes de los alemanes y ayudando así a ganar la Segunda Guerra Mundial.

¿Cómo se lo agradecieron? Criminalizándole por homosexual y condenándole a una humillante y destructiva castración química. Turing sobrevivió dos años a esta pesadilla y murió debido a un envenenamiento por cianuro que oficialmente consta como suicidio pero no está del todo claro qué sucedió.

Imaginad qué podríamos saber hoy en día sobre computación si Alan Turing hubiese seguido investigando.

lunes, 18 de junio de 2012

RetroCoruña 2012

Ya tenemos fecha para RetroCoruña 2012. Será el próximo sábado 8 de septiembre, de 11h a 21h en el Pabellón de Deportes de Sada (A Coruña). Ya se encuentra abierta la inscripción de expositores, a ver con qué nos sorprenden esta vez :D

Más información aquí.

miércoles, 13 de junio de 2012

Rompe Ralph

Aunque con unos días de retraso, no quiero dejar pasar la oportunidad de recomendar la película que Disney nos prepara (de la mano de Pixar) para el próximo otoño. Rompe Ralph, una película que todo fan de los videojuegos clásicos va a querer ver.

Y por si esto no bastase, en la página oficial de la película podemos echarnos unas partidas al Fix-it Felix Jr, el videojuego ficticio en el que se basa la película.

¿Qué más se puede pedir? ¡Una versión del juego para MAME! :D

martes, 12 de junio de 2012

Sinfonía Pixelada: Titanic

En este vídeo del concierto inaugural de RetroMadrid 2012, la orquesta Camerata Musicalis interpreta una versión del tema principal del videojuego Titanic compuesto originalmente por César Astudillo (Gominolas).

lunes, 28 de mayo de 2012

Ocho Quilates: Una historia de la Edad de Oro del SW español

Otro vídeo oficial de RetroMadrid 2012: la conferencia Ocho Quilates que tuvo lugar el domingo 6 de Mayo.

En ella, Jaume Esteve (autor del libro que da nombre a la conferencia) analiza con diferentes invitados el contexto de la industria en los años 80. Bajo la moderación de Adonías (Mondo Píxel) participan Victor Ruiz de Dinamic, Rafael Gómez de Topo, Paco Suarez de Indescomp y Ópera y Fernando Rada, de Zigurat y Made in Spain.

miércoles, 23 de mayo de 2012

Sinfonía Pixelada: Super Mario Bros medley

Siguiendo con los vídeos oficiales de RetroMadrid 2012, aquí tenemos la primera canción del concierto Sinfonía Pixelada con el que el pasado 4 de Mayo se inauguró la feria.

La orquesta Camerata Musicalis interpreta un medley de Super Mario Bros bajo la dirección de Edgar Martín. Música original de Koji Kondo, con arreglos de Miguel Prida.

¡Disfrutadlo!

martes, 22 de mayo de 2012

Primer vídeo oficial de RetroMadrid 2012

Aquí está el primer vídeo oficial de RetroMadrid 2012: la canción inaugural del concierto compuesta y cantada por César Astudillo (Gominolas).

jueves, 17 de mayo de 2012

Recuperado el editor de puzzles del QBIQS

Rebuscando por el disco duro he recuperado el editor de puzzles en JavaScript que se utilizó para crear los puzzles del QBIQS. Lo he retocado un poco quitándole lo que no es necesario (como la carga de puzzles previamente editados) y lo he linkado desde la propia página del juego para que veáis cómo se crearon los puzzles y qué aspecto tienen como datos dentro del juego.

jueves, 3 de mayo de 2012

Remodelaciones

Durante estos días puede que algunos links no funcionen correctamente, porque estoy remodelando las interioridades del blog. El cambio más importante es que ha desaparecido el molesto "blog.php?page=" que aparecía siempre en las direcciones, aunque el script sigue estando para que los enlaces externos antiguos sigan funcionando de manera correcta.

Seguiré trabajando en esto a ratos, a ver si para la semana que viene está todo el blog ya adaptado.

miércoles, 25 de abril de 2012

XLI RU de Barcelona

El próximo 16 de Junio tendrá lugar la cuadragésimo primera reunión de MSX en Barcelona. Al igual que la anterior RU, la reunión tendrá lugar en la sala de actos del Centre la Fontana, en la calle Gran de Gracia número 190, Barcelona.

¡No os podéis perder esta reunión si estáis por Barcelona! Por mi parte, me va a resultar prácticamente imposible asistir, así que ya nos veremos en otra ocasión.

Para más información acudid a la web de la AAMSX, ¡insensatos!

martes, 10 de abril de 2012

Survivors

Survivors es un juego de habilidad similar al Boulderdash realizado en 1987 (no en 1986 como indica la ficha de Generation MSX) por Atlantis Software.

En él controlamos a tres robots con diferentes habilidades: uno puede abrir camino en el laberinto, otro puede mover las rocas y otro (con forma de perforadora) puede rescatar a los supervivientes de un holocausto nuclear que están hibernando.

Estos supervivientes cumplen el papel de los diamantes que recogíamos en el Boulderdash. Para lograr terminar una fase deberemos rescatarlos a todos, antes de que se acabe el tiempo (afortunadamente tenemos de sobra) y antes de que alguno de nuestros robots se quede sin energía bien porque le caigan rocas encima o bien le ataquen los droides de seguridad.

No estamos ante un juego sencillo, porque los niveles son bastante grandes. De hecho, de pequeño sólo conseguí a duras penas terminarme el primer nivel. Aquí os dejo un vídeo en el que se puede ver el funcionamiento del juego.

El caso es que estos días me acordé de este juego, pero la cinta no es un formato adecuado para estos tiempos. Aunque el juego está preservado en formato CAS, dicho formato no es muy adecuado para su uso en un MSX real, así que lo he convertido a un fichero BIN que se puede cargar desde BASIC con un simple BLOAD.

En lugar de distribuir el juego convertido, os dejo un parche en MSX-BASIC que adjunta al juego un pequeño loader en código máquina (también incluyo el código fuente) y genera de forma automática un fichero BIN.

Para aplicar el parche es necesario usar un emulador o un MSX con lector de cintas y disco. Si alguien tiene la cinta original y me puede confirmar que funciona se lo agradecería, porque no lo he podido probar pues ya no tengo lector de cintas (aunque espero que la cinta siga por casa de mis padres).

¡Disfrutad del juego!

Editado 11-04-2012: en Mobygames hay una ficha del juego que incluye los escaneos de la portada y las instrucciones. Gracias a esa ficha he comprobado que el juego es de 1987 y no de 1986 :P

miércoles, 28 de marzo de 2012

RetroClasificados

No podía dejar pasar esta breve noticia: ha nacido RetroClasificados, una web de compra/venta/intercambio de material relacionado con la informática clásica.

Su éxito depende de que le demos uso, así que ¡ya estáis tardando en visitarla!

viernes, 23 de marzo de 2012

ayFX replayer v1.3

No me desdigo de lo que dije (necesito un descanso), pero hace tiempo que tengo por aquí una versión más actualizada del replayer de ayFX, así que era una pena que se quedase mucho tiempo por el disco duro cuando puede ser aprovechado por alguien, por lo que me he tomado un breve descanso del descanso y aquí está el resultado.

En esta nueva versión (que se puede descargar desde la página de código del blog) hay dos novedades principales:
  1. Las versiones de volumen fijo y volumen relativo se pueden compilar a partir de los mismos ficheros, simplemente definiendo la variable AYFXRELATIVE como 0 o 1 respectivamente.
  2. Por defecto el replayer se configura para reproducir todos los frames de los samples en el mismo canal, en lugar de hacer el cambio de canales que hacía originalmente. Para activar el cambio de canales hay que poner a 1 el bit 0 de la variable ayFX_MODE.
Quizá los más avispados piensen que esa variable está ahí preparada para futuras ampliaciones... es posible ;)

Me vuelvo al descanso no sin antes advertiros de que lo único de lo que me he asegurado es de que los ficheros compilen correctamente, pero no los he probado a fondo. Son el resultado de mezclar tres versiones diferentes del replayer (v1.2f, v1.2r y la nueva versión con la variable ayFX_MODE) en una sola.

Si alguien al probarlo encuentra algún bug, que no dude en decírmelo. Tan pronto como me sea posible lo miraré e intentaré corregirlo.

martes, 20 de marzo de 2012

Un descanso

Supongo que habréis notado que últimamente no abundan los posts por aquí y que participo menos en los foros... Lo cierto es que necesito tomarme un descanso y distanciarme un tiempo.

Supongo que volveré, ahora bien, no se cuando.

¡Saludos a todos!

miércoles, 14 de marzo de 2012

Curso MSX-Basic en YouTube

Hace algo más de dos años compartí (aquí y aquí) las primeras lecciones de un curso de MSX-Basic en vídeo. Debido a los reciente acontecimientos que todos conocemos, los enlaces de descarga directa ya no son válidos...

Sin embargo, el curso no se ha perdido (ni mucho menos). Konamito nos lo ha subido a YouTube para que podamos verlo de una forma sencilla.

Aquí os dejo el enlace a la playlist.

Relanzo el llamamiento para ver si alguien tiene el resto de las cintas del curso o de otros cursos en vídeo que existieron en su día. Sería muy interesante preservarlos digitalmente.

miércoles, 29 de febrero de 2012

Dividiendo que es gerundio

Una de las pegas que nos encontramos a la hora de trabajar con nuestros MSX (o en general cualquier trasto gobernado por un Z80) es que el Z80 no ofrece instrucciones de división, salvo que queramos dividir por potencias de dos en cuyo caso echaremos mano de las instrucciones de rotación y desplazamiento de bits. En el caso de que necesitemos dividir por un número que no sea potencia de 2, necesitaremos echar mano de una rutina que realice el trabajo.

Una primera aproximación (bastante grosera) es comenzar a restar el divisor del dividendo y parar cuando el dividendo sea menor que el divisor. El número de veces que hayamos podido hacerlo será el cociente y el dividendo que nos queda será el resto. Esto funciona bastante bien siempre que podamos prever que el cociente no será muy grande.

Sin embargo, cuando estamos ante dos números cualesquiera y pretendemos dividir uno por otro, la anterior aproximación puede eternizarse. Imaginad que queremos dividir 65535 entre 1 o, lo que sería peor, ¡65535 entre 0! En este último caso la rutina anterior jamás se detendría.

Así pues, deberemos pensar en una rutina de división algo más inteligente, que nos permita reducir el coste temporal de la operación a algo que podamos asumir.

¡De vuelta al cole!

Volvamos con la imaginación al cole un momento para recordar cómo nos enseñaron a dividir. Poníamos el dividendo y el divisor e íbamos mirando a ver a cuanto cabía, para ir restando del dividendo y bajando cifras. ¿Os acordáis? Veamos un ejemplo con esta operación: 750 dividido entre 225.

750|225
 75  3


Vale, todos nos acordamos de cómo se hacía esto. Ahora vamos a hacer lo mismo, pero en lugar de en base 10, en base 2. Para ello pondremos los números en binario y a dividir.

1011101110|11100001

Podéis intentar hacer la división vosotros mismos, teniendo en cuenta que ahora sólo hay dos posibles cifras en el cociente 0 y 1. Si no tenéis ganas, aquí tenéis la divisón hecha:

1011101110|11100001
 100101101  11
   1001011


¡Vale! Nos da exactamente lo mismo: cociente 3 y resto 75. Así que el algoritmo de la división que nos enseñaron en el cole es perfectamente utilizable en binario. Ahora vamos a ver cómo lo podemos programar.

Seleccionando cifras...

El ejemplo que hemos visto, el dividendo es un número de 10 bits representable mediante un número de 16 bits, mientras que el divisor es un número de 8 bits. Así que intentaremos obtener una rutina que nos permita dividir un número de 16 bits entre uno de 8 bits y nos devuelva tanto el cociente como el resto de la división entera por defecto. Establezcamos primero cómo recibimos los parámetros. Algo lógico sería el dividendo en HL y el divisor en A, pero vamos a utilizar el registro C para el divisor, ya que A lo vamos a reservar para realizar las operaciones.

Lo primero que tenemos que ver es que vamos a ir cogiendo las cifras del dividendo comenzando por la mayor y siguiendo a partir de ahí. Podemos desplazar hl hacia la izquierda e ir mirando el flag c, por el que van a pasar todas las cifras del dividendo. Aprovechamos que la instrucción add hl,hl hace eso precisamente.

Ahora tenemos en el flag c la cifra más significativa del dividendo, nos toca comprobar si "cabe" o no. Es decir, tenemos que comprobar si el número formado por las cifras que hemos ido cogiendo del dividendo es mayor o igual que el divisor. Para esto nos vendría muy bien que ese número estuviera en A (ya os dije que mejor reservarlo), así que tras la instrucción anterior podríamos meter la cifra más significativa que acabamos de sacar del dividendo como cifra menos significativa de A. ¡Perfecto! Utilicemos rla, que nos soluciona la papeleta.

¡Ojo! Esto nos obliga a que al comienzo del algoritmo A valga cero. Así que en la inicialización necesitaremos un xor a para asegurar que no utilizamos valores que pudieran existir antes.

Cero al cociente...

Ahora tenemos la siguiente situación:
  • En HL tenemos las cifras del dividendo que aún no hemos utilizado.
  • En A tenemos el número formado por las cifras más significativas del dividendo.
  • En C tenemos el divisor.
Así que lo primero que tenemos que comprobar es si el número que tenemos en A (la parte más significativa del dividendo) es mayor o igual que C (el divisor). Esto lo solucionamos con un cp c. Si el flag c se activa tras esa comparación, significará que que C es mayor que A. Eso indica que el divisor es más grande, es decir "no cabe". Así que diremos aquello de "cero al cociente y cogemos la cifra siguiente", metemos un cero en el cociente y volvemos a la instrucción add hl,hl para comenzar a coger la siguiente cifra.

Pensemos ahora qué pasa cuando A es mayor o igual que C. Significa que "cabe" y al trabajar en binario siempre "cabe" a uno. Con lo cual deberemos realizar lo siguiente:
  • Añadir un 1 al cociente.
  • Substraer el divisor al número en A.
Comenzando por el final, con un simple sub c ya hemos substraído el divisor de A y lo tenemos preparado para seguir.

Nos queda decidir dónde y cómo vamos a almacenar el cociente. Una primera idea puede ser utilizar el registro DE (que de momento no lo estábamos utilizando). A cada cifra analizada vamos a meter un 0 o un 1 y además empezamos a meter por la cifra más significativa. Podemos hacer algo parecido a lo que estamos haciendo con A: meter las cifras por la derecha e ir desplazando hacia la izquierda... entonces... ¿para qué utilizar DE si podemos aprovechar HL?

En HL tenemos las cifras del dividendo, pero cada vez menos. Cada vez que hacemos un add hl,hl estaremos desplazando las cifras hacia la izquierda y metiendo ceros por la derecha. Así que podemos aprovechar este desplazamiento para ir metiendo por la derecha las cifras del cociente.

Por lo tanto, cuando haya que meter un cero en el cociente no habrá que hacer nada, porque add hl,hl ya lo ha hecho por nosotros. Cuando haya que meter un 1, simplemente necesitaremos hacer un inc l para solucionarlo (recordemos que el bit menos significativo será 0 tras el add hl,hl).

Juntémoslo todo

Si has llegado hasta aquí después de leer todo el rollo anterior, seguramente habrás visto que faltan algunos pequeños detalles para completar la rutina. En primer lugar deberemos repetir el proceso anterior para las 16 cifras que tiene el dividendo. Podemos utilizar el registro B y la instrucción djnz.

Pongamos ahora en limpio todo lo que hemos ido apuntando y añadamos las etiquetas para los saltos:

div16by8:
xor a
ld b,16
.bucle:
add hl,hl
rla
cp c
jr c,.cero
sub c
inc l
.cero:
djnz .bucle
ret


¡Y ya está! ¿A que ha quedado bonita? A la salida en HL tendremos el cociente y en A el resto de la división.

Fue MSX-Kun quien me habló de esta rutina, la cual encontró en un par de sitios (aquí y aquí) sobre Z80. Pero resulta que... ¡no funciona correctamente en todos los casos! ¡Probadla! ¿Por qué no funciona si todo parece correcto?

El problema es que el divisor es un número de 8 bits y este número puede ser todo lo grande que queramos (siempre que no nos pasemos de 8 bits). Pero la comparación la estamos haciendo con otro número de 8 bits y eso es lo que nos está dando problemas.

La solución pasa por trabajar no con un número de 8 bits, sino con un número de 9 bits. Para ello no debemos olvidarnos del flag c tras meter una nueva cifra en A. Si tras el rla se activa el flag c, significará que al meter la cifra en A tenemos un número con 9 bits significativos. Como el divisor es de 8 bits, SEGURO que A es mayor que C, por lo que deberíamos saltar a la parte donde metemos un uno en el divisor.

La rutina corregida es la siguiente:

div16by8:
xor a
ld b,16
.bucle:
add hl,hl
rla
jr c,.uno
cp c
jr c,.cero
.uno:
sub c
inc l
.cero:
djnz .bucle
ret


Simplemente con esa nueva instrucción tendremos en cuenta el noveno bit de A y podremos realizar la división sin ningún problema.

Espero que os sirva la rutinita. Como siempre todo comentario será bienvenido.

viernes, 3 de febrero de 2012

Cuarto aniversario del blog

¡Ya llevo cuatro años dando la lata por aquí! Y espero seguir mucho tiempo. Gracias a todos los que leéis el blog y participáis con comentarios.

sábado, 28 de enero de 2012

Montando un cartucho del QBIQS

Hace tiempo que tenía este vídeo, pero se me olvidó subirlo por aquí...

¿Como se fabrican los sueños?

sábado, 21 de enero de 2012

KNT participa en #msxdev

El anuncio oficial ha tenido lugar hoy mismo en la feria de Nijmegen: KNT va a participar en el nuevo concurso #msxdev.


Eso significa que, según las reglas del concurso, la ROM no se podrá liberar hasta que el concurso termine, aunque posiblemente se pueda jugar en alguna RetroMadrid o RU antes de final de año... ¡y quién sabe si algo más! :D

No dejéis de visitar el sitio web del concurso (pinchando en el banner) para estar al tanto de los proyectos que se presenten.

viernes, 13 de enero de 2012

Sigamos con la detección de FM en MSX

El verano pasado hablé sobre la detección de diferentes tarjetas de sonido FM en el MSX. Si bien todo lo allí indicado era correcto, merece la pena volver sobre el tema para corregir algunos puntos.

FM-PAC y MSX-Audio Bios

La MSX-Audio Bios es, como su propio nombre indica, una Bios para Music-Module, Moonsound y OPL3, que se encarga de simular la presencia de un FM-Pac y redirigir por software el uso del FM-Pac al correspondiente cartucho.

Si utilizamos cualquiera de estos cartuchos con esta Bios, estaremos detectando un FM-Pac cuando en realidad no es así, de forma que hay que volver a la rutina de detección para mejorarla un poco.

Echándole un vistazo a la entrada anterior, primero buscábamos un FM interno con la cadena "APRLOPLL" en $4018 y si no lo encontrábamos, buscábamos simplemente la presencia de la cadena "OPLL" en la dirección $401C. Esto es lo que puede traernos problemas, ya que la MSX-Audio Bios también presenta esta cadena en dicha dirección, pero es posible detectar que se trata de otra tarjeta en lugar de un FM-Pac, pues la cadena identificativa será:
  • AUD1OPLL para un Music-Module
  • AUD3OPLL para un cartucho OPL3
  • AUD4OPLL para una Moonsound
Por lo tanto, si en un slot detectamos la cadena OPLL pero se trata de una de estas tres cadenas identificativas, significa que hemos encontrado una MSX-Audio Bios y, por lo tanto, no un FM-Pac, con lo que habrá que seguir buscando.

OPL1 secundario

Al parecer es posible situar un segundo chip OPL1 en los puertos $C2 y $C3, de forma que tengamos dos chips OPL1 y podamos usarlos al mismo tiempo. Así que una buena idea a la hora de buscar los chips FM disponibles es comprobar si este segundo OPL1 está presente leyendo el puerto $C2 y comprobando si el resultado es 6. En mi caso, lo busco únicamente si el primero no está presente.

El emulador Open MSX permite simular este segundo OPL1, por si lo queréis probar.

Cartucho OPL3: Moonsound de pobres

Este cartucho realizado en Brasil también se llama "Moonsound de pobres" y está basado en un chip OPL3, que contiene la parte FM de una Moonsound. Es decir, se trata de una Moonsound que no tiene Wave Table. Pero a nosotros nos interesa sólo la parte FM, así que habrá que tenerlo en cuenta.

Detectar este cartucho es muy sencillo, ya que se hace igual que la Moonsound, sólo que buscando un 0 en el puerto $C0. Al igual que con el OPL1 secundario, yo lo que hago es buscar el OPL4 en $C4 y si no lo encuentro, entonces miro en $C0 y lo trato como si fuera un OPL4, pero con diferente puerto.

Si queréis probar este chip, hoy por hoy, el único emulador que permite utilizar este cartucho es el Open MSX.


martes, 10 de enero de 2012

Programando para COLECOVISION (II)

Hace unas semanas, comentaba por aquí los puntos básicos a la hora de programar para la consola ColecoVision, una consola muy muy similar a nuestros MSX1.

En aquel post hablé de la cabecera de las roms para ColecoVision y de la disposición de la memoria, así como lo mínimo que hay que saber sobre la forma en la que la CPU de la consola (un Z80 a la misma velocidad de reloj que el MSX) gestiona las interrupciones generadas por el VDP (que es el mismo que el de un MSX1).

En esta ocasión vamos a ver cómo leer los mandos de la ColecoVision. Pero primero vamos a ver cómo son estos mandos.


Típico mando de ColecoVision
(imagen original de museodelvideojuego.com)

Como podemos ver, el mando consiste en una rueda/joystick situada en la parte superior, con dos botones grises (uno a cada lado del mando, en la zona media) y un teclado numérico de 12 botones.

Para obtener el estado completo de cada mando hay que leer dos bytes, aunque con uno puede bastar, dependiendo de qué necesitemos leer. Lo primero que hay que tener en cuenta es que los valores que vamos a leer utilizan lógica inversa, es decir: un 1 significa NO pulsado. Así que tras leer, una buena idea es utilizar la instrucción CPL y asumir que un 1 significa pulsado.

Lectura del primer byte: Joystick, rueda y botón izquierdo

Este primer byte nos informa sobre el estado del joystick, de la rueda y del botón izquierdo. Para poder leer este byte tenemos que hacer un OUT al puerto $C0, ¿con qué valor? Pues lo divertido es que da exactamente igual, sólo tenemos que hacer un OUT a ese puerto para seleccionar el primer byte devuelto por los mandos.

Una vez seleccionado este primer byte, podremos leer el estado del primer mando a través del puerto $FC y el del segundo a través del puerto $FF.

Por último, interpretar el contenido de este byte es muy sencillo, ya que cada bit tiene un significado preciso:
  • Bit 0: Arriba
  • Bit 1: Derecha
  • Bit 2: Abajo
  • Bit 3: Izquierda
  • Bit 4: Rueda girando
  • Bit 5: Dirección de giro
  • Bit 6: Botón Izquierdo
  • Bit 7: -- No usado --
Como veis, es sencillo. Lo más complicado es entender el funcionamiento de la rueda. El bit 4 (en la documentación de la Coleco se le denomina INT) se activa cuando la rueda está girando, en cuyo caso el bit 5 tendrá 0 ó 1 dependiendo del sentido de giro.

Lectura del segundo byte: Botón derecho y teclado numérico

Este segundo byte nos dirá el estado del botón derecho y qué tecla se ha pulsado en el teclado numérico. Para seleccionar que queremos leer este byte, debemos realizar un OUT al puerto $80 y al igual que con el primer byte, nos da igual el valor que mandemos.

Una vez seleccionado el segundo byte, lo mismo que antes: el puerto $FC nos devuelve el valor del primer mando y $FF el del segundo.

Sin embargo, interpretar este segundo byte es algo más complejo, ya que sólo el bit 6 tiene un significado concreto: el estado del botón derecho. Para leer el estado del teclado numérico, hay que utilizar la siguiente tabla cuya entrada es el valor de los 4 bits de menor peso de este segundo byte y la salida representa la tecla pulsada:

ValorTecla pulsada
0-- Inválido --
16
21
33
49
50
6*
7-- Inválido --
82
9#
107
11-- Inválido --
125
134
148
15-- Inválido --

Es una tabla a la que aún no le he encontrado un sentido lógico, pero es la que utiliza la propia BIOS de la Coleco a la hora de decodificar el teclado numérico.

De momento eso es todo. En este punto estamos en condiciones de hacer algo funcional para Colecovision, aunque no suene por ahora. En un futuro post veremos cómo aprovechar lo que ya sabemos del PSG de MSX para utilizarlo en la Colecovision.

domingo, 1 de enero de 2012

Resultados de la encuesta sobre desbloquear el final del QBIQS

Terminó 2011 y con el año terminó el plazo para responder a la encuesta que os planteaba.

Los resultados sobre 16 votos han sido los siguientes:
  • 5 personas consideraron que se debería poder desbloquear el final sólo si se había llegado al último nivel
  • 3 personas consideraron que se debería poder desbloquear el final con independencia del nivel al que se hubiera llegado.
  • 8 personas consideraron que eso de desbloquear el final por otros medios que no fueran el juego puro y duro... es cosa de nenazas.
Por lo tanto, ya que una de cada dos personas lo ha decidido así, no haré el programa para que se pueda liberar el final del juego.

Nuevo año, nuevo concurso

¿Cansado de que sólo se hagan juegos para MSX1? ¿Quieres hacer una demo para MSX2 o un procesador de textos con soporte para GFX9000?

¡Entonces #msxdev compo 2012 es tu concurso!

Un concurso de programación para MSX que no se restringe a los juegos ni al MSX1. Habrá juegos, demos, utilidades, msx-music, scc, moonsound, discos, cintas, roms... ¡todo vale! MSX-DOS, BASIC, C, ASM... ¡Escoge tu lenguaje y tu proyecto y comienza a desarrollar! ¡Tienes toooodo un año!

¡Feliz 2012!