Concurso MSX-BASIC 2018: Reglas

Condiciones

  • La participación en el concurso está abierta a cualquier persona o grupo.
  • No hay límite en el número de entradas a presentar.
  • En el concurso solamente participarán 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.
  • Se recomienda incluir información (historia, instrucciones, comentarios sobre el código, etc.).
  • Los participantes en el concurso asumen implícitamente las reglas y el criterio de la organización. En caso de no hacerlo, los que lo deseen pueden solicitar la baja del concurso.
  • Todos los juegos presentados estarán disponibles para su descarga de manera gratuita y serán de dominio público.
  • Cualquier juego presentado fuera de plazo no será admitido a concurso pero podrá ser publicado si así lo desea su autor.

Categorías

El concurso se divide en dos categorías bien diferenciadas:

  • 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.

Ambas categorías serán valoradas por separado debido a la notable diferencia de posibilidades entre las dos.

Plazos

  • PRESENTACIÓN DE ENTRADAS A CONCURSO: Del 25 de noviembre de 2017 hasta el 14 de enero de 2018.
  • VALORACIÓN DE LAS ENTRADAS A CONCURSO: Del 15 de enero al 4 de febrero de 2018.
  • PUBLICACIÓN DE LOS RESULTADOS FINALES: 7 de febrero de 2018.

Cómo participar

  • La presentación de las entradas a concurso se realizará enviando un correo electrónico a concursomsxbasic@msxblog.es con los siguientes datos y elementos obligatorios:
    • Nombre del juego.
    • Nombre o nick del autor/autores (tal y como se desea que salga publicado).
    • Correo electrónico de contacto (no será publicado).
    • Archivo adjunto con el juego, usando alguno de los formatos más conocidos: .ROM, .DSK. .CAS.
    • Código fuente original en un archivo de texto (TXT).
  • Se admitirán revisiones mientras esté vigente el plazo de presentación de entradas. Pero a efectos de concurso se tendrá en cuenta siempre solamente la última versión.
  • La organización creará una entrada en MSXBlog para cada uno de los juegos presentados y a través de los comentarios, el autor podrá comunicarse con los visitantes del sitio, así como también añadir información, aclarar dudas, etc.

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. En caso contrario todas sus entradas serán descalificadas.
  • 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.
    • 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. Pero solamente si se cumple la condición de que se presenten al menos dos juegos en su categoría. En caso contrario, la organización se reserva el derecho de cambiar el premio por otro elemento.

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.

SapphiRetheNestruo y YMN por compartir sus conocimientos y elaborar las rutinas de ayuda.

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:
  1. Prohibido el uso de la instrucción CALL.
  2. 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.).
  3. 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).
  4. 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.
  5. 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.
  6. Prohibidas las instrucciones relacionadas con la impresora.
  7. 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)6) 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.