Reglas generales
- La participación en el concurso es libre, asumiendo los participantes el cumplimiento de todas sus reglas.
- Los participantes pueden en cualquier momento del concurso solicitar su renuncia a permanecer en el concurso.
- No hay límite en el número de entradas a presentar, aunque éstas solamente pueden ser juegos.
- Los juegos presentados tienen que ser inéditos. Los plagios o copias de otros ya existentes bien en su totalidad o en parte (música, gráficos, rutinas, etc.) serán descalificados.
- Es recomendable incluir información extra sobre juego, como por ejemplo: historia, instrucciones, comentarios sobre el código, etc.
- Todos los juegos presentados se podrán descargar de manera gratuita y serán de dominio público, sin excepciones.
- Cualquier juego presentado fuera de plazo no será admitido a concurso.
Categorías
De nuevo repetimos las mismas categorías que en ediciones pasadas por ser estas lo suficientemente diferenciadas y restrictivas para poder garantizar que los juegos están escritos en MSX-BASIC o BASIC compilado. Ambas categorías serán valoradas por separado debido a la notable diferencia de posibilidades entre las dos.
- Categoría A – Juegos en MSX-BASIC: los juegos presentados en esta categoría usarán código MSX-BASIC puro y no podrán usar ninguna instrucción ampliada (llamadas CALL). Sí se permitirá para casos concretos invocar una rutina de código máquina muy específica pero que haya sido definida mediante instrucciones MSX-BASIC (POKE, etc.).
- Categoría B – Juegos que hagan uso de NestorBASIC o MSX-Basic Kun: En este caso se podrán usar los comandos CALL que sean inherentes a la herramienta utilizada (CALL TURBO ON, etc.). El uso de rutinas en código máquina estará sometido a las mismas restricciones que la categoría A – Juegos en MSX-BASIC.
Plazos
- Presentación de juegos a concurso: Del 7 de abril de 2019 hasta el 7 de julio de 2019.
- Valoraciones del jurado y preparación de los resultados finales: : Del 10 de julio al 10 de agosto de 2019.
- Publicación de valoraciones del jurado y resultados finales: 12 de agosto de 2019.
Cómo participar
- La presentación de las entradas a concurso se realizará enviando un correo electrónico a admin@msxblog.es con los siguientes datos (obligatorios:
- Nombre del juego.
- Nombre o nick del autor/autores (tal y vayan a ser publicados en MSXBlog).
- Correo electrónico de contacto (no será publicado).
- Archivo adjunto con el juego en formato .ROM, .DSK, .CAS, o .TSX comprimido en ZIP.
- Código fuente original en un archivo de texto.
- Instrucciones del juego en un archivo de texto.
- Categoría en la que participa: A ó B.
- No se admitirán a concurso actualizaciones y correcciones de fallos después del plazo de presentación de entradas (7 de julio de 2019). Sin embargo, se podrán publicar después de esa fecha para que el juego permanezca actualizado a la última versión según su autor.
- Se creará una entrada en MSXBlog para cada uno de los juegos presentados y a través de los comentarios al pie de la entrada el autor podrá mantener comunicación con los visitantes si así lo desea.
Jurado
- El jurado estará formado por todos los participantes en el concurso.
- Es obligatorio que cada uno de los participantes valore al resto de entradas de su categoría. Si no lo hace automáticamente será descalificado.
- El fallo del jurado es inapelable.
- Se valorarán los juegos conforme al siguiente criterio:
- El miembro del jurado valorará por separado cuatro aspectos del juego (entre 1 y 95), a saber: jugabilidad, originalidad, gráficos y sonido. Se calcula la nota media de estos cuatro valores.
- Hay 5 puntos de bonificación que el miembro del jurado repartirá como desee entre los cuatro aspectos mencionados en párrafo anterior. A la nota media calculada anteriormente se le suma el valor más alto de bonificación otorgado (que será de 5 puntos máximo si van todos a la misma característica y de 2 puntos mínimo si se reparten entre las cuatro características a valorar). El número obtenido será la nota final del miembro del jurado para ese juego que llamaremos resultado parcial.
- Se repite la operación descrita en los párrafos anteriores con cada uno de los miembros del jurado y finalmente se calcula la nota media de los resultados parciales que será la nota final.
- Es obligatorio que cada uno de los miembros del jurado otorgue los puntos de bonificación y justifique con un comentario breve su aplicación en cada aspecto concreto. En caso contrario, el miembro del jurado y sus entradas serán descalificados del concurso.
- Los juegos que hagan uso de la carga de datos desde disco serán valorados de una manera diferente. Si el jurado considera que el uso del disco es arbitrario y no imprescindible entonces el juego perderá TODOS los puntos de bonificación. En tal caso, el jurado tiene que hacerlo constar expresamente en los comentarios de su valoración.
Premios
En cada categoría del concurso se premiará al juego que obtenga la mejor puntuación general.
El premio para los ganadores en ambas categorías consistirá en un juego de MSX en formato cartucho con la condición de que se presenten al menos tres juegos en su categoría. En caso contrario, la organización se reserva el derecho de cambiar el premio por otro que considere conveniente.
Agradecimientos
A todos los participantes en las pasadas ediciones del concurso por su esfuerzo y colaboración en la divulgación del MSX-BASIC a través de sus juegos.
A SapphiRe, theNestruo y YMN por compartir sus conocimientos y elaborar las rutinas de ayuda.
A José Ángel Morente por su apoyo técnico en la nueva redacción de las reglas del concurso para la edición 2015.
Uso del MSX-BASIC
Existirán una serie de restricciones y normas que deben respetarse en ambas categorías y que se definen a continuación:
- Se permite el uso de MSX-BASIC en sus versiones para MSX de primera generación y MSX2, quedando excluido el MSX-BASIC usado en MSX2+ y MSX turbo R (en este también queda excluido por supuesto el uso del procesador R800)
- Los juegos tienen que estar programados completamente en MSX-BASIC, no estando permitido el uso de lenguaje ensamblador en general, ni de ningún compilador de BASIC u otro lenguaje; se considera una excepción a esta regla el uso de la herramienta NestorBASIC o MSX BASIC Kun para las entradas de la categoría B.
- Se permitirá solamente una rutina en ensamblador, que ha de ser idéntica para todos los participantes. Dicha rutina, cuya longitud es de 12 bytes, será la siguiente:
LD HL,ORIGEN ; Origen en RAM
LD DE,DESTINO ; Destino en VRAM
LD BC,LONGITUD ; Longitud del bloque a copiar
JP LDIRVM ; Salto a la rutina de copia
- Con esta rutina se pueden cargar gráficos en VRAM de una manera más rápida. La forma de cargar esta rutina en memoria será a través de POKEs, para ser posteriormente llamada mediante el uso de las instrucciones DEFUSR y USR. Podrá localizarse en cualquier parte de la RAM accesible desde BASIC y se podrán cambiar los valores de los tres parámetros tantas veces como sea necesario.
- El juego podrá ser presentado en formato .CAS, .ROM o .DSK.
- El juego puede estar compuesto por uno o varios bloques grabados con las instrucciones SAVE”CAS:” o BSAVE”CAS:”. Se permite que el juego pueda realizar cargas desde cinta, abriéndose, por tanto, la oportunidad de presentar juegos multicarga.
- Si el juego lo requiere, podrá solicitar al jugador que rebobine la cinta.
- En caso de presentarse en formato DSK, se permite la carga de datos y gráficos desde disco. Para ello se pueden usar las instrucciones LOAD y BLOAD. Opcionalmente el juego podrá grabar datos en disco (utilizando BSAVE) para guardar datos que puedan ser recuperados en otra ejecución del juego (tales como records, progreso, etc.). El uso arbitrario del disco para la creación de juegos puede penalizarse de la manera que se detalla en el apartado Jurado (ver más abajo).
- En el caso de bloques binarios, éstos solamente podrán contener datos, debiendo ser cargados con la instrucción BLOAD”CAS:” (sin autoejecución).
- En el caso de bloques con código en BASIC, cada listado debe cumplir todas y cada una de las restricciones que se listan a continuación, sin excepción:
- Prohibido el uso de la instrucción CALL.
- DEFUSR y USR: Se pueden definir llamadas a la rutina en ensamblador anteriormente citada, así como a aquellas rutinas de BIOS que no requieran el paso específico de parámetros (p.e. CHGET, DISSCR, ENASCR, etc.).
- OUT: Por compatibilidad sólo se permitirán instrucciones OUT a las direcciones del PSG y del VDP, si se accede a este último mediante OUT se deberá garantizar una total compatibilidad con el estándar (leyendo los valores adecuados de la BIOS con la instrucción PEEK).
- POKE: Se puede usar en cualquier dirección de la memoria desde el final del programa hasta &HFFFE, es decir, no se permite modificar el programa con POKE (prohibido código automodificable). La dirección &HFFFF no deberá ser escrita al tratarse del registro de selección de slots expandidos.
- Se permite el uso de las instrucciones LOAD (con y sin autoejecución) y RUN para la carga de bloques de programa en BASIC, tanto desde CAS como desde DSK. La carga de bloques de datos se realizará única y exclusivamente con la instrucción BLOAD (sin autoejecución), desde disco podrá utilizarse el parámetro S para cargar datos directamente a VRAM. Si se desea se podrán incluir los nombres de los ficheros a ser cargados.
- Prohibidas las instrucciones relacionadas con la impresora.
- Prohibidas las instrucciones añadidas por alguna extensión al MSX-BASIC (cartuchos con ampliaciones, etc.) excepto las mencionadas de MSX-Disk BASIC.
- No hay limitación en el número de líneas a usar.
Ayudas a los participantes
Gracias a la ayuda de SapphiRe (por la programación) y a la posterior de TheNestruo (por la modificación), está a disposición de los participantes un listado MSX-BASIC con el que se puede cargar la rutina en ensamblador descrita en el epígrafe Uso del MSX-BASIC.
10 DEFFNUB(N) = (((N AND &HFF00)256) AND 255) 20 DEFFNLB(N) = (N AND 255) 30 SCREEN 1 40 RO=&HC000 50 VD=&H1800 60 NB=&H300 70 AD=&HBFF0 80 GOSUB 100 90 END 100 POKE AD,1:POKE AD+1,FNLB(NB):POKE AD+2,FNUB(NB) 110 POKE AD+3,17:POKE AD+4,FNLB(VD):POKE AD+5,FNUB(VD) 120 POKE AD+6,33:POKE AD+7,FNLB(RO):POKE AD+8,FNUB(RO) 130 POKE AD+9,195:POKE AD+10,92:POKE AD+11,0 140 DEFUSR=AD:AD=USR(0):RETURN
Explicación del código:
- Las líneas 10 y 20 definen dos funciones para obtener el byte alto (Upper Byte) y el bajo (Lower Byte) de una dirección de 16 bits.
- En la línea 30 ponemos SCREEN 1
- La línea 40 define el origen en RAM de los gráficos a volcar (Ram Origin).
- La línea 50 define el destino en VRAM de los gráficos a volcar (Vram Destination).
- La línea 60 define el número de bytes a copiar (Number of Bytes).
- La línea 70 define la posición de memoria donde queremos que se ejecute la rutina (siempre que esté libre, cualquiera).
- La línea 80 llama al cargador de la rutina.
- La línea 90 termina el programa.
- La línea 100 carga el número de bytes.
- La línea 110 carga el destino.
- La línea 120 carga el origen.
- La línea 130 carga la llamada a la BIOS.
- La línea 140 crea el defusr, llama con usr y vuelve.
El resultado es que se vuelcan 768 bytes en la tabla de nombres de la VRAM, es decir, toda la pantalla de SCREEN 1.
También YMN ha querido colaborar con la siguiente explicación:
Además de lo anterior, la solución de codificación de la rutina assembler es implementar una aplicación de producción adaptable, o sea, un programa que hace programas.
La aplicación solicita los mismo datos que el listado que aparece más arriba y genera el código fuente del cargador, implementado para ser llamado con GOSUB.
Para procesar el código generado:
- Posicionar el cursor en la línea 10 y pulsar 2 veces RETURN.
- Teclear GOSUB 10 + RETURN.
1 DEFFNT(N)=(-(N0)):DEFFNH(N)=INT(FNT(N)/256):DEFFNH$(N)=HEX$(FNH(N)):DEFFNL$(N)=HEX$(FNT(N)-FNH(N)*256) 2 DEFFNS$(A$)=STRING$(2-LEN(A$),”0″)+A$:DEFFNX(N)=VAL(“&H”+HEX$(N)) 3 INPUT “DIRECCION DATOS ORIGEN EN RAM: “;RO:RO=FNX(RO) 4 INPUT “DIRECCION DATOS DESTINO EN VRAM: “;VD:VD=FNX(VD) 5 INPUT “NUMERO DE BYTES A COPIAR: “;NB:NB=FNX(NB) 6 INPUT “DIRECCION RAM DEL CARGADOR ASSEMBLER: “;AD:AD=FNX(AD) 7 PRINT “10 FOR I=&H”+HEX$(AD)+” TO &H”+HEX$(AD+11)+”:READ A$:POKE I,VAL(“+CHR$(34)+”&H”+CHR$(34)+”+A$):NEXT:DEFUSR=&H”+HEX$(AD)+”:RETURN” 8 PRINT “20 DATA 21,”+FNS$(FNL$(RO))+”,”+FNS$(FNH$(RO))+”,11,”+FNS$(FNL$(VD))+”,”+FNS$(FNH(VD)); 9 PRINT “,01,”+FNS$(FNL$(NB))+”,”+FNS$(FNH$(NB))+”,C3,5C,00″
Explicación del código:
- Líneas 1-2: Define funciones para obtener el byte alto y bajo en formato alfanumérico, establece el valor hexadecimal con dos dígitos y obtiene el valor de un número en formato decimal complementado.
- Líneas 3-6: Define en formato complementado el origen en RAM de los gráficos a volcar (Ram Origin), el destino en VRAM de los gráficos a volcar (Vram Destination), el número de bytes a copiar (Number of Bytes), y la posición de memoria donde queremos que se ejecute la rutina.
- Líneas 7-9: Genera el código fuente del cargador de la rutina, para ser llamado con GOSUB.