Programación del Amstrad CPC usando la libreria 8BP ("8 bits de poder") desde BASIC
"Las limitaciones no son un problema, sino una fuente de inspiración"
Jose Javier Garcia Aranda
If you like 8BP, your help is welcome. Help me supporting this initiative (from 1€, whatever you want). Donations will be used for materials and 8BP disemination:
ya tenéis disponible la versión V40 de la libreria 8BP, descargable en github https://github.com/jjaranda13/8BP . Esta nueva versión incorpora las siguientes mejoras:
libreria: ahora se incluye 8bitsdepoder_v40_00.asm con las siguientes mejoras:
compatible con C
en el subdirectorio "C" se incluye un wrapper de 8bp (8BP.h)
en el subdirectorio "C" se incluye un minibasic (minibasic.h)
en el subdirectorio "C" se incluye la herramienta de compilación "compila.bat" que te simplifica el proceso de compilar y crear un .dsk
manual: he actualizado el manual e incluido un capitulo que te enseña a traducir tu ciclo de juego a C
Demos: todas las demos se recopilan en un menú y están hechas con la v40. ahora hay una demo nueva que demuestra ciclo de juego en C
games: se incluye el nuevo "Zampa Manzana" creado por Riper y música de Xeno
En el manual de 8BP encontraras un capitulo dedicado a la forma en la que 8BP se ha hecho compatible con C.
Con esta nueva funcionalidad tienes 3 opciones:
1)Hacer tu programa 100% en BASIC ( es decir, no
usar la funcionalidad). Esta opción simplifica mucho la tarea de programar pero
tienes menos velocidad.
2)Hacer tu programa 100% en C. Esta opción es
compleja pues programar, compilar, buscar y corregir errores, se hace una tarea
mucho mas lenta que programando en BASIC
3)Hacer tu programa en BASIC y al final traducir tan
solo el ciclo de juego a C. Esta opción tan fácil como la primera salvo por
la ultima fase de traducción a C.
Puedes programar directamente en C pero también puedes hacer tu juego 100% en BASIC y solo al final traducir fácilmente (mediante un minibasic que viene con 8BP) el ciclo de juego a C. Prácticamente te llevará unos minutos y conseguirás la máxima velocidad. ¿que no te lo crees? pruébalo. Ya nada será igual
Un ejemplo comercial de la opción 3 es el famoso y mítico
juego “plaga galáctica”, una producción de Indescomp creado por el excelente
programador Paco Suárez en 1984. Le debemos muchas horas de entretenimiento al
gran Paco Suárez.
Para esta nueva funcionalidad, 8BP v40 te proporciona dos librerías de C:
el wrapper de 8BP, llamado 8BP.h
un minibasic ("minibasic.h") con 18 comandos similares al BASIC pra ayudarte a traducir tu ciclo de juego desde BASIC a C
La librería 8BP trae un par de ejemplos ( dos minijuegos) para que aprendas a llevar a cabo este sencillo proceso. Y el capítulo del manual es muy detallado y te guiará paso a paso Ya puedes hacer juegos de AMSTRAD como nunca imaginaste. Con 8BP v40 ya nada será igual en los juegos por computadora hasta pronto!
ya tenéis disponible la versión V38 de la libreria 8BP, descargable en github https://github.com/jjaranda13/8BP . Esta nueva versión incorpora las siguientes mejoras:
- detección de colisiones perfeccionada, sin limitaciones por coordenadas negativas
- comando MUSIC mejorado: ahora puedes decidir entra hacer sonar una musica en bucle o hacerla sonar una sola vez.
- el comando MUSICOFF ha sido reemplazado por MUSIC invocado sin parametros
- manual mejorado con capitulo de primeros pasos y diversas pequeñas mejoras
- la librería ocupa exactamente igual que antes (8KB) , dejándote 24 KB para tu lógica BASIC, 8.5 KB para gráficos y 1.4 KB para música
Estos son los primeros pasos con la librería 8BP. Te dejo con un vídeo explicativo y los mismos pasos por escrito, que ademas los tienes en el manual de 8BP que viene con la librería.
Lo primero que debes hacer es instalarte la última versión
de Winape, que es un emulador y a la
vez editor y ensamblador de Amstrad. Lo puedes descargar desde www.winape.net
Una vez instalado el Winape, familiarízate un poco con el,
probando algun juego de Amstrad y probando a cambiar la configuración. Trata de
abrir el assembler que lleva incorporado en el menú y edita un “hola mundo” en
la ventana de ensamblador. A continuación, copia y pega el texto en la ventana
de emulación. Veras como se pega carácter a caracter
Si haces un programa mas largo, para copiarlo en la ventana
de emulación es muy interesante la opción settings->high speed. Verás como
se copia rapidísimo.
Ahora vamos a hacer una primera toma de contacto con 8BP
viendo algunas demos. Entra en el directorio Demos. En el encontraras una serie
de subcarpetas : ASM, BASIC, DSK, MUSIC
Entra en DSK . Alli veras un fichero .dsk con las demos. Desde
winape ve al menú File->drive A-> insert Disc image y selecciona el
archivo de las demos
Una vez seleccionado, desde la ventana de emulación del
Amstrad escribe CAT para ver los archivos
Cada fichero .BAS es una demo donde podrás ver alguna de las
características de 8BP (no todas sus posibilidades se pueden ver con las demos
pero hay algunas representativas).
Ejecuta el comando RUN “LOADER.BAS”. Obtendrás el siguiente
menú:
Ya puedes elegir una demo y probarla. A disfrutar. En el
siguiente y ultimo paso empezaremos la creación de un juego
Hemos probado un fichero .dsk que contiene muchas demos, con
graficos y música. En el directorio Demos/ASM y en el Demos/MUSIC se encuentran
los graficos y la música de las demos que has probado. Sin embargo, si quieres
hacer tu propio juego o demo, es mejor que empieces con unos ficheros “limpios”
sin todos los graficos que requieren las demos que has probado.
Nos vamos al directorio raíz. Alli encontraras una carpeta
llamada 8BP_V38. Yo te recomiendo que hagas una copia de esta carpeta y la
renombres como “mi_juego”. De ese modo preservarás la carpeta 8BP_V38 original
aunque empieces a cambiar cosas
Dentro de la carpeta 8BP_V38 encontraras las carpetas ASM,
BASIC, DSK, MUSIC, TAPE, y output_spedit
Desde la ventana de ensamblador de winape abre el archivo
“ASM/make_all_mygame.asm” y
ejecútalo (simplemente en el menú de winape z80 assembler seleccionas Assemble
o pulsas Ctrl+F9). Esto comenzara a ensamblar (copiar en memoria) la librería y
los graficos en la memoria del Amstrad. En este caso vamos a ensamblar muy
pocos graficos, tan solo los indispensables para un pequeño juego. Los gráficos
se encuentran en images_mygame.asm
Tras ensamblar todo, obtendrás un mensaje como el que se
muestra a continuación:
Pulsas “ok” y desde la ventana de ensamblador vamos a abrir
otro archivo. En este caso vamos a abrir un fichero BASIC, concretamente
“tu_primer_juego.bas” que se encuentra en la carpeta BASIC. Tras abrirlo veras
el siguiente listado en pantalla, que contiene 32 lineas:
Selecciona todo y cópialo. Luego ve a la ventana de
emulación del CPC y pégalo usando el menú FILE->paste
Como el listado es algo mas largo que el “hola mundo”, usa settings->high speed para copiarlo y
luego vuelve al “normal speed”
Como ya esta ensamblada la librería y los gráficos, puedes
hacer RUN y el juego se ejecutará. Debes esquivar unas bolas que caen del cielo
para no morir, moviéndote a derecha e izquierda
Puedes probar a modificar el programa y ver sus efectos.
Poco a poco iras aprendiendo 8BP y podrás hacer modificaciones interesantes
tales como cambiar la frecuencia con la que salen bolas enemigas o su velocidad,
o reemplazar al soldado por una nave espacial y a las bolas por naves enemigas
con diversas trayectorias.
Por último, vamos a crear un disco con tu juego. Para ello,
tras tener el juego funcionanod debes dar estos pasos
·Crea un disco nuevo mediante winape: FILE->
drive A-> new Blanc Disc
·Formatealo:
FILE->drive A->Format Disc Image
·Tras haber creado tu fichero dsk , desde la
ventana de emulación ejecuta los siguientes comandos:
SAVE
“8BP.bin”, b, 24000,18620
SAVE
“juego.bas”
Ya casi hemos terminado. Ahora debes seleccionar otro disco
desde el menú de winape o salir de winape para que el .dsk que has creado se
haga realidad en el sistema de ficheros de windows.
Aunque aun no he liberado la v33, ya esta terminada y suficientemente probada. Solo me queda actualizar el manual, lo cual haré en los próximos días.
Os cuento sus características y lo que incorpora:
Ocupa exactamente lo mismo que la v32
En modo pseudo-3D, ahora tiene capacidad de imprimir segmentos con sobreescritura. Esto es algo que se podía hacer en v32 con todo tipo de sprites menos con los segmentos
Rotación de tintas (comando RINK) sin limitaciones. Hasta ahora se podían hacer patrones de 4 y 8 tintas rotando. Ahora puedes rotar cualquier numero de tintas
Sobreescritura de sprites con posibilidad de elegir el número de bits de fondo: esto te va a permitir si lo deseas usar 4 colores de fondo en tus juegos
sprite flipping horizontal: ahora puedes definir imágenes "virtuales", que en realidad se definen como el "flip" horizontal de una imagen real. Esto te permite ahorrar mucha memoria RAM destinada a gráficos. He hecho el horizontal y no el vertical porque el horizontal es el más útil. Normalmente un personaje que camina a la izquierda es la imagen especular del mismo caminando hacia la derecha, mientras que cuando sube hacia arriba muestra la espalda y al bajar muestra el pecho y la cara.
ejemplo de sprite flipping
Aparte del manual, voy a preparar un par de demos que incorporaré en la v33 de serie y de momento os dejo con una preview del nuevo juego "space phantom" inspirado en el mítico space harrier.
Os prometo publicar la 8BP v33 con su manual en breve
Ya esta disponible la versión v27 de 8BP, en https://github.com/jjaranda13/8BP la cual sigue ocupando lo mismo, 6KB y trae dos nuevas funcionalidades (ambas están documentadas en el nuevo manual disponible en github):
Cambios de estado de un sprite forzados desde una ruta: esto nos va a permitir definir entre medias de los segmentos de una ruta, un cambio de estado. Muy útil para dar saltitos y para que por ejemplo desactivemos un disparo que ya esta fuera de la pantalla sin necesidad de controlar su posición desde BASIC
Nuevo comando RINK ("rotate Ink"): permite hacer animación por tintas
cambios de estado en rutas:
se definen con un 255 en la posición que ocuparía el numero de pasos del segmento. En lugar de interpretarse como un segmento, ROUTEALL lo interpretará como un cambio de estado. lo mejor es ver un ejemplo, que podemos usar para un lanzamiento de misil.
ROUTE3; disparo_dere
;-----------------
db 40,0,2 ; esto son 40 pasos hacia la derecha con vy=0, vx=2
db 255,0 ; esto es un cambio de estado, quedando el sprite desactivado (status=0)
db 1,0,0 ; esto es un paso sin movimiento
db 0
Tras ejecutar un cambio de estado hay que ejecutar algún paso porque los cambios de estado no son movimientos, por eso he puesto un paso sin movimiento. Este mecanismo permite que por ejemplo hagamos una ruta de salto y se la asociemos a nuestro personaje, el cual al comienzo del salto le asignaremos el flag de ruta y movimiento automático. Al terminal el salto, se fuerza un cambio de estado para desactivar el movimiento automático y continuamos andando normalmente.
animación por tintas
Existen juegos que requieren mover grandes bloques de memoria de pantalla para dar sensación de movimiento, como es el caso de las franjas laterales de los juegos de carreras o bloques grandes de ladrillos o tierra. El comando MAP2SP permite hacer todo eso pero la velocidad no es trepidante porque gasta mucha CPU moviendo sprites. La animación por tintas es el complemento perfecto en estos casos.
En ordenadores como el AMSTRAD con su potente paleta de 16 colores simultáneos, muchos juegos hacen uso de la animación por tintas. Un claro ejemplo son algunos juegos de coches cuyas franjas laterales de carretera se prestan a este tipo de animación.
animación de franjas laterales por tintas
La animación por tintas consiste en definir un conjunto de tintas sobre las que se va a hacer rotar un conjunto de colores. Vamos a ver un ejemplo con unas franjas blancas/grises:
concepto animación por tintas
Básicamente para dar sensación de movimiento lo que hay que hacer primeramente es asignar los colores a las tintas que van a rotar. En este caso los colores blanco (26) y gris (13) se asignan a las tintas t1..t8. vamos a suponer que la tinta t1 es la 8, de modo que la tinta t8 será la 15. El resto de tintas (0 a 7) las usaremos para los sprites. En cada instante de tiempo habrá que reasignar los valores de las 8 tintas para dar la sensación de rotación. Es precisamente lo que hace el comando RINK (abreviatura de rótate ink).
RINK te permite definir un patrón de colores a rotar sobre un conjunto de tintas. Una tinta no es un color. Una tinta es un identificador en el rango [0..15] que identifica a un color del rango [0..26]. Para definir el patrón de colores a rotar, usaremos el comando RINK del siguiente modo:
Esto indica que van a rotar 8 tintas comenzando por la tinta_inicial usando el patrón de colores que se indica.
Si queremos rotar solo un patrón de 4 colores (y asi gastar solo 4 tintas y dejar las demás para los sprites) basta con que indiquemos solo 4 colores en el patrón.
RINK,tinta_inicial, color1,color2, color3, color4
RINK te permite de este modo rotar un patrón de 4 colores (gastando 4 tintas) o de 8 colores (gastando 8 tintas).
Una vez establecido el patrón, podemos rotar las tintas mas o menos deprisa con
RINK,step
Encontrarás demos del nuevo comando RINK en la carpeta de demos, directorio DemoExamples/scroll_rink. verás un juego de coches de carreras y otro de un muñeco que avanza en un escenario con ladrillos, un castillo, un árbol y un pájaro que vuela. El ejemplo del castillo combina el uso de scroll basado en MAP2SP y la animación por tintas usando RINK
animación por tintas de ladrillos
os dejo con un vídeo con ejemplos de lo que puedes hacer en BASIC de amstrad usando 8BP v27
Ya esta disponible la versión v18 de la libreria 8BP, totalmente retrocompatible
He actualizado el repositorio de github https://github.com/jjaranda13/8BP con los siguientes cambios (coherentes entre la documentación y la librería).
Librería: ahora se incluye 8bitsdepoder_v18.asm con mejoras en COLSP y aumento de velocidad en STARS, mediante una optimización de cálculos. en total se pueden ahorrar más de 2 ms en el comando STARS
Documentación: disponible el manual v18, que incluye:
explicación adicional de la diferencia entre 8BP y un motor de juegos
nuevo uso del comando COLSP, especificando el sprite 32 se puede acelerar (el sprite 32 no existe y por eso se va a interpretar como un indicador de que estamos pasando información de control)
explicaciones adicionales sobre el uso del flag de colisión en tu personaje y disparos. No debes usarlo en esos casos pues la detección de colisión detectaría que colisionas contigo mismo.
nuevos ejemplos en la tabla de velocidad de los comandos BASIC, con mas consejos y tiempos de ejecución en milisegundos
Por aclarar las diferencias, y con todos los respetos a los motores de juegos (y además, que 8BP pretende ser otra cosa):
con un motor de juegos como AGD, tu juego usa el AGD y esta limitado por los condicionantes (como el uso de un lenguaje propio de script) y posibilidades impuestos por AGD pues tu juego corre "dentro" de AGD
Con 8BP tu juego usa el 8BP y la maquina directamente. plena libertad, plena potencia, sin limites (salvo los de la máquina)
Aunque en el diagrama he puesto una conexión "directa" entre tu juego y la máquina si programas alguna rutina en ensamblador, lo cierto es que SIEMPRE hay que atravesar la capa sintáctica del intérprete BASIC, pues al para invocar una rutina en codigo máquina debemos invocarla desde BASIC usando algo como:
CALL <dirección de memoria>, param1, param2, ...paramN
y el intérprete BASIC va a procesar los parámetros e interpretar las variables que aparezcan antes de transmitir los datos a la rutina máquina. De hecho la libreria 8BP son rutinas hechas en ensamblador, y se las invoca como comandos RSX. Esto significa que aparecen comandos nuevos en el BASIC, que están precedidos de la barra vertical, algo como "|PRINTSP". Atravesar la capa sintáctica lleva un tiempo, aunque la ejecución sea endiabladamente rápida.
Además de las mejoras de velocidad, en la nueva versión v18 se incluye la preview del juego annunaki, algo mas avanzado, y algo más veloz gracias a las mejoras de la librería.El listado es 100% BASIC, como debe ser. El objetivo de incluirlo no es otro que el de incluir un ejemplo que pueda orientar a programadores que se inicien en 8BP.
Ahora la velocidad de juego es mayor y la nave muestra sus cohetes de propulsión, hechos mediante una secuencia de animación que se activa al moverla hacia arriba.
Pronto prepararé un videotutorial de como utilizar el SPEDIT para realizar sprites y como probarlos y hacer secuencias de animación. Todo esto se encuentra descrito en el manual pero siempre viene bien material audiovisual para aclarar dudas.
También haré mejoras en SPEDIT, algunas han sido sugeridas por participantes del foro de Amstrad ESP http://www.amstrad.es/forum