Retro Invaders

Blogs de retro informática
  • 25/07/2010

    Program : Bytes : 48k : RetroEuskal, lo que dio de sí [fuente]


    Otra de las ferias imprescindibles del año, además de la RetroMadrid, tuvo lugar ayer en el Bilbao Exhibition Center, como ya viene siendo habitual al amparo de las celebraciones de la Euskal Encounter. La presente edición de RetroEuskal ha estado plagada de diversas actividades y su ya constituida retropartida gigante (este año le ha correspondido [...]
  • 03/07/2010

    El blog de Miguel : Z88dk, programa en C para equipos con un Z80 [fuente]


    Z88dk, es un compilador cruzado de C que permite crear binarios para ordenadores que usen con CPU un Z80 como los son el Sinclair ZX Spectrum, el Amstrad CPC, el estándar MSX, el Sam Cupé y un largo etcétera. Z88dk es libre y disponible para multitud de plataformas incluyendo Linux, Windows, MacOS X y BSD. Para [...]
  • 13/06/2010

    Program : Bytes : 48k : Twitteando desde un ZX Spectrum [fuente]


    No hace falta mayores comentarios. Hay una manera de estar en una red social tan conocida como Twitter usando un ZX Spectrum y una tarjeta SpectraNet. El autor de esta proeza es un usuario internacionalmente conocido entre nosotros, Winston, y no ha perdido el tiempo en ofrecernos una muestra de su más que indiscutible talento [...]
  • 03/06/2010

    Program : Bytes : 48k : Conversores musicales ZX Spectrum [fuente]


    Karl McNeil y Matt Westcott acaban de publicar dos utilidades con los cuales podemos convertir música en varios formatos. El primero de ellos es el MID-2-ASM, un conversor de archivos MIDI a formato assembler y TAP para emuladores. Esto permite que podamos comprobar después con cualquier emulador el resultado de la conversión. El programa es [...]
  • 31/05/2010

    QBlog : Sonido y melodías con en el Sinclair QL [fuente]


    En este post hablaré un poco de las funcionalidades de sonido que posee el Sinclair QL, tema con en el que he estado “jugando” últimamente. Mis pretensiones no van más allá de la mera producción de melodías sencillas con SuperBASIC y la simple curiosidad por el uso de las (limitadas) capacidades sonoras del QL. Sin [...]
  • 30/05/2010

    Proyecto PSGed (MSX) : Sincronizando! [fuente]


    Un punto importante un cualquier programa donde se reproduzca música, es que esta se escuche siguiendo sus tiempos, si no el resultado podría ser algo desagradable... :P

    Para conseguir esto, necesitamos sincronizar la ejecución de nuestro programa y en MSX se utilizan las interrupciones del Z80.

    He investigado un poco el tema, y he encontrado unas funciones en la web de Avelino (interrupt.s), pensadas para cuando se trabaja en MSX-DOS. Estas se puede adaptar para el caso de trabajar en formato ROM, con la solución dada por SapphiRe (FD9APATCH.ASM), en los foros de desarrollo de Karoshi. Todavía no lo he probado, ya que he dado con una solución más propicia para la forma en la que esta programado el PSGed.

    Al principio utilicé una función de Andrear llamada wait_retrace:
       di
    $3:
       in a,(0x99)
       and #0x80
       cp #0x00
       jr z, $3
       eiEsta espera a que finalice el redibujado de la pantalla, para dejar continuar el flujo de ejecución. Haciendo pruebas, vi que en los emuladores y en el onechip, funcionaba perfectamente, pero al probarlo en un MSX real, al reproducir una secuencia, no se escuchaba correctamente.

    Estudiando el articulo de SapphiRe, descubrí una instrucción del z80 (no se mucho de assembler), que podía servirme en sustitución de la función wait_retrace, me refiero a la instrucción "halt". Esta pone en espera la ejecución hasta que se dispara una interrupción. Así que me puse manos a la obra. Primero definí una función en assembler con esta instrucción:
    #define HALT __asm halt __endasmy luego lo coloqué en el inicio del bucle que controla el play y la interfaz gráfica de la pantalla principal.
    while(1)
    {
       HALT;

       //resto del codigo
    }Lo he probado en un MSX y ha funcionado perfectamente! :)
  • 28/05/2010

    Proyecto PSGed (MSX) : Acceso a funciones Asm desde C [fuente]



    Además del "assembler in line" que permite añadir directamente código ensamblador de Z80 en nuestras funciones en C, podemos acceder a funciones incluidas en fuentes totalmente en assembler. Si este código esta creado para compiladores como el asMSX, antes tendremos que adaptarlo para que lo acepte el compilador de SDCC. Algunos de estos cambios son:
    Los valores deberán de preceder del caracter almohadilla.
    0ffh --> #0xFF
    Los corchetes de las instrucciones que apuntan a direcciones de memoria, habrá que cambiarlo por paréntesis.
    ld a,[#FAFE] --> ld a,(#0xFAFE)
    Las variables con la instrucción "equ" por un igual.
    initmem equ 0E000h --> initmem = #0xE000
    En mi caso, lo he necesitado para utilizar las rutinas de Ramones para el control de ratón.

    Una vez adaptado el código, el siguiente paso, sera marcar de alguna forma, que funciones son a las que queremos acceder desde C. Para ello tendremos que poner al inicio de la etiqueta usada, un subrayado y al final dos veces el caracter de dos puntos.
    _checkmouse::
    Una vez hecho todo esto compilaremos el fuente, obteniendo un fichero object (".rel"):
    sdasz80 -o mouse.asm
    Luego desde nuestro editor, crearemos un fichero "header" donde definiremos las funciones que acceden a las de assembler. Utilizaremos la instrucción "extern" y pondremos el nombre de la etiqueta sin los caracteres añadidos (el tema parámetros, en estos momentos desconozco como funciona).
    extern void checkmouse(void);
    Incluiremos el include en nuestro fuente y llamaremos a la función utilizando el nombre dado en la definición.
    checkmouse();
    Para finalizar, compilaremos nuestro proyecto incluyendo el objet:
    sdcc -mz80 -o --no-std-crt0 --code-loc 0x4010 --data-loc 0xC000 mouse.rel PSGed_v06a.c
    Para conseguir este "item", quiero agradecer la ayuda de Andrear, Ramones y Avelino.
  • 26/05/2010

    Konamito.com : Iniciación a la programación en ensamblador (I) [fuente]


    José Vila Cuadrillero, más conodido como Pepe Vila, programador de New Frontier y redactor de la revista Input MSX a quien tuve la oportunidad de entrevistar hace un tiempo, ha tenido a bien crear un tutorial de iniciación a la programación en ensamblador  dirigido a los más novatos en estos menesteres. Seguramente alguna vez hemos [...]
  • 23/05/2010

    Proyecto PSGed (MSX) : Utilizar datos en assembler [fuente]


    Este caso específico, lo comento, ya que me encontré con un problema con la forma de trabajar con las etiquetas en el "assembler in line", que no estaba descrito (o no lo localicé) , en la documentación del SDCC (manual + ASxxxx Cross Assembler Documentation).

    En mi caso, para mostrar el texto de ayuda, necesito que se aloje en un área de la memoria, que luego voy copiando a la VRAM, creando un efecto de scroll. Lo que estaba haciendo, hasta el momento, era utilizar un array de char, que luego volcaba en la RAM. Mi intención es situarlo en la ROM y acceder directamente a la dirección donde se aloje. Para ello he utilizado el "assembler in line", añadiendo los datos con la instrucción "db".

    Nota: Esta técnica nos sirve para añadir cualquier tipo de dato, como por ejemplo gráficos, con lo que conseguiríamos mucha más velocidad al volcarlos a la VRAM, utilizando directamente una rutina en ensamblador.
    Para conseguir esto, necesitaríamos averiguar en que dirección apuntan nuestros datos. En assembler utilizaremos una etiqueta, pero nos encontramos con el problema de que en C no podemos acceder a esta. Para solucionarlo, tendremos que usar un puente: escribiremos la dirección en la RAM. Para ello, ejecutaremos un programita en ensamblador. Fijaos que al hacer el "load" de la etiqueta al registro HL, hay que añadirle el caracter de la almohadilla "#" (este es el problema que comentaba al inicio).

    void setData()
    {
    __asm

    ld hl,#ALABEL
    ld (#0xE007),hl
    ret

    ALABEL:
    .db 0x50,0x53,0x47,0x65,0x64,0x20,0x56,0x30
    .db 0x2E,0x34,0x42,0x20,0x20,0x20,0x20,0x20
    .db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
    .db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
    __endasm;
    }
    Nota: En el ejemplo se puede observar que los datos utilizan el formato típico de SDCC ("0xFF"), ya que no acepta el común en algunos compiladores de asm ("0FFh").
  • 20/05/2010

    Program : Bytes : 48k : ¿Y si…? [fuente]


    ¿…el ZX Spectrum hubiese aparecido con una tarjeta de sonido de 4 canales compatible AY-3-8910 con su propia CPU y una frecuencia de sampleo de 37,5 KHz, ejecutándose a 12 MHz y con 128kb de memoria (16Kb de ROM and 112Kb de RAM)? Hubiese sido la leche con mayúsculas… Y es que lo que no [...]
  • 17/05/2010

    Program : Bytes : 48k : Nuevo emulador de ZX Spectrum: Ziggy de Arjun Nair [fuente]


    Un nuevo emulador de ZX Spectrum viene a sumarse a la larga lista de programas similares existentes desde sus orígenes durante los años 90 y posteriores. Entre sus características, su autor señala las siguientes: * Emulación modos 48 y 128k real casi perfecta, rozando el 100%. * Soporte de los modos de sonido “beeper” y [...]
  • 03/05/2010

    QBlog : Jugando con números en SuperBASIC [fuente]


    Para divertirnos con nuestro QL no solo tenemos los videojuegos del tipo “matamarcianos” y demás engendros, sino que también podemos emplear, a modo de diversión, nuestro querido SuperBASIC y un poco de ¡matemáticas!. (Si, ya lo sé, suena un poco friki, …). Pues eso, proponemos en este post un simple ejercicio, convertir números decimales (en [...]
  • 03/05/2010

    Program : Bytes : 48k : DivIDEo, sistema de video por “streaming” [fuente]


    El ZX Spectrum parece no tener límites y lo que vemos a continuación es una muestra de lo que se puede conseguir a fuerza de ingenio y conocimientos. Gasman nos lo presenta en forma de un espectacular video, con el que nos presenta su utilidad “DivIDEO Streaming Video System“, tanto desde la propia web como [...]
  • 02/05/2010

    Proyecto PSGed (MSX) : Pantalla de ayuda [fuente]


    Ya he terminado la pantalla de ayuda!

    Para mostrarla antes guardo la pantalla anterior (tabla de nombre de patrones), en un buffer de memoria para luego recuperarla al salir. Utilizo dos funciones de la BIOS (LDIRVM y LDIRMV), para copiar de VRAM a RAM y viceversa. Se nota la velocidad, comparado cuando utilizo un bucle y vpoke desde C.

    Luego muestro el texto que lo he alojado en una zona de la memoria y que se desplaza pulsando en los botones correspondientes. He programado la funcionalidad para mostrar la posición de la barra de scroll. Se ajusta automáticamente, por lo que es totalmente reutilizable. Lo que no tiene es la función de arrastrarla con el puntero.

    He modificado el diseño de la barra de scroll original, haciéndola más fina (2 columnas en vez de 3). He utilizado dos sprites para las flechas para que se muestren con el color azul, utilizado en todos los botones de las pantallas.

    He tenido que cambiar el tileset, y también le he añadido más caracteres que faltaban en la fuente de color negro, necesario para que se mostrará correctamente los textos.

    Si os fijáis en la imagen, vereis que no hay minúsculas. Estas se corresponden a la fuente de color magenta, y la utilizo para poder resaltar títulos y otras palabras. Pensé en cambiar el tileset en esta pantalla y añadirle las minúsculas y una fuente completa en otro color para resaltar las teclas, pero no he querido complicarlo hasta ver si tendré suficiente memoria (se trata de una ROM de 32k).
  • 25/04/2010

    Proyecto PSGed (MSX) : Mostrar números en Screen 2 [fuente]


    Para resolver esta tarea, tendremos que convertir el valor de nuestra variable a una cadena de caracteres y luego mostrarlo en la pantalla de forma similar a como lo hicimos con la función vprint del post anterior. Para la conversión he adaptado una función en assembler de baze (Z80bits Collection of Z80 routines). La he llamado Num2Dec16 y como parámetros se le pasa un valor de tipo entero y la cadena donde se ha de escribir el resultado.

    /*
    16-bit Integer to ASCII (decimal)
    by baze
    Input: HL = number to convert, DE = location of ASCII string
    Output: ASCII string at (DE)
    */
    void Num2Dec16(unsigned int aNumber, char *address)
    {
    aNumber;
    address;
    __asm
    ld l,4(ix)
    ld h,5(ix)

    ld e,6(ix)
    ld d,7(ix)

    ld bc,#-10000
    call $Num1
    ld bc,#-1000
    call $Num1
    ld bc,#-100
    call $Num1
    ld c,#-10
    call $Num1
    ld c,b
    call $Num1
    jr $Num3
    $Num1:
    ld a,#47
    $Num2:
    inc a
    add hl,bc
    jr c,$Num2
    sbc hl,bc
    ld (de),a
    inc de
    ret
    $Num3:

    __endasm;
    }
    La función que tenemos que utilizar se llama vprintNumber y le pasaremos como parámetros la posición de la pantalla, el valor y el número de cifras a mostrar (máximo 5). Para desempeñar su tarea, llama a la función de conversión y luego utiliza getAddress para obtener la dirección VRAM correspondiente a la posición que le hemos dado. Seguidamente, realizará un bucle para mostrar con vpoke la cadena que contiene el valor.

    // vprintNumber: muestra un numero en la pantalla
    // column = numero de columna (0 a 31)
    // line = numero de fila (0 a 23)
    // aNumber = valor a mostrar
    // aLength = numero de cifras a mostrar
    void vprintNumber(char column, char line, unsigned int aNumber, char aLength)
    {
    char pos=5;
    unsigned int tiladdre=0;
    char strBuff[5];

    Num2Dec16(aNumber, strBuff);

    // proporciona la direccion de la VRAM a partir de una posicion
    tiladdre = getAddress(column, line);

    //coloca el contador en la posicion donde se ha de empezar a mostrar
    pos = 5-aLength;

    // muestra el numero en la pantalla
    while (aLength-->0){ vpoke(tiladdre++,strBuff[pos++]);}
    }
    Ejemplo de uso:
    unsigned int valor=1024;
    vprintNumber(9, 14, valor, 4);
  • 23/04/2010

    Proyecto PSGed (MSX) : Mostrar textos en Screen 2 [fuente]


    Para facilitar la tarea de mostrar textos en el modo gráfico Screen 2, he programado una serie de funciones. Si quieres conocer como se programa el VDP de los MSX (TMS9918), podéis encontrar el datasheet en EmuDocs.

    La primera función necesaria, es una que nos permita escribir en la VRAM (igual que la instrucción de basic VPOKE). Está programada en assembler y es muy sencilla, ya que utiliza la función WRTVRM de la BIOS. En el registro HL se le pasa la dirección, y en el registro A el valor a escribir.

    // address = direccion de memoria VRAM
    // value = valor a escribir
    void vpoke(unsigned int address, unsigned char value)
    {
      address;
      value;
    __asm
      ld l,4(ix)
      ld h,5(ix)
      ld a,6(ix)
      call 0x004d
    __endasm;
    }
    La siguiente función es la que nos mostrará el texto en la pantalla.

    // posx = numero de columna (0 a 31)
    // posy = numero de fila (0 a 23)
    // text = cadena de caracteres
    void vprint(unsigned char posx, unsigned char posy, char* text)
    {
      int longi = strLength(text); // tamaño de la cadena
      unsigned int address = 6144 + (posy * 32) + posx; // calcula la posicion en la VRAM
      while (longi-->0)
      {
       vpoke(address++,*(text++)); // escribe en la VRAM
      }
    }
    Veréis que lo primero que se hace, es identificar el tamaño de la cadena. En vez de utilizar la función de la librería del SDCC, he creado una que la he llamado strLength:

    int strLength(char *str)
    {
        int i = 0;
        while(*(str++))  i++;
        return i;
    }
    Luego se calcula la posición en la memoria de vídeo donde se ha de escribir la cadena, en base a la posición dada. El valor 6144 se refiere a la posición de la tabla de nombre de patrones, en la VRAM. Por último se hace un bucle que escribe los caracteres utilizando la función vpoke.

    Para finalizar un ejemplo de uso:
    vprint(9, 14, "VERSION 0.21B");
  • 21/04/2010

    Program : Bytes : 48k : Imágenes del remake de Livingstone Supongo por RetroWorks [fuente]


    Uno de los inminentes lanzamientos de RetroWorks está siendo pulido en estos dias y ya podemos contemplar las primeras imágenes de lo que creo va a ser uno de los bombazos del año; el remake de un clásico de Opera Soft: “Livingstone Supongo”. Como podéis ver, pocas palabras basta. Impresiona el actual resultado, pero esto no [...]
  • 17/04/2010

    Program : Bytes : 48k : Nuevo juego: “Heart Stealer”, para ZX Spectrum [fuente]


    Timmy, junto con la ayuda musical de Mr. Beep, son dos de los muchos usuarios que se mueven por el foro de World Of Spectrum,. Pues ambos acaban de publicar un nuevo juego de plataformas, basado en el motor gráfico del videojuego de los Mojon Twins, “UWOL, Quest for Money”, hecho posible gracias a su [...]
  • 13/04/2010

    Proyecto PSGed (MSX) : Hello World [fuente]



    Para mi primer programa con SDCC, me he propuesto hacer el clásico "Hello World" en una ROM. Primeramente he de agradecer el tutorial de Nerlaska para la creación de ROMs y la información de Andrear. En el código podéis encontrar funciones de acceso al VDP, de ambos. También he usado el nMSXtiles de Pentacour, para crear el tileset de la fuente. Para su conversión a código C, me he apoyado de una utilidad que he creado. Para simplificar la compilación y del proceso de creación de la ROM, también he desarrollado una utilidad con una interfaz gráfica. Cuando estén más estables las compartiré con vosotros.

    En el desarrollo me encontré con problemas al insertar los datos de la fuente utilizando muchos arrays de chars. El fichero resultante era muy grande y además al ejecutarlo daba errores. He aprendido que cuando se trabaja con bloques muy grandes de datos, como es el caso de los gráficos, es mejor añadirlo en un único array de char (uno para los patrones, otro para los colores y otro para los nombres de patrones). Además para mi sorpresa, el compilador SDCC comprime los datos repetidos, que para este caso se aprovecha bastante. Es un sistema similar al RLE, pero que afecta únicamente a series de valores repetidos.

    El programa es muy simple. Primero llena la pantalla del tile 32, para que no se vea como se escriben los gráficos en la VRAM, que aunque es rápido no es instantáneo como en assembler. Luego lleno la tabla de colores con el color que uso para la fuente (blanco con fondo azul). Para estas dos tareas utilizo una sencilla función en assembler de Nerlaska que es muy rápida. Después copio los datos gráficos (el tileset), a los tres bancos de la pantalla. En el siguiente paso pongo los textos en la pantalla con una función a la cual indico la posición de la pantalla y el texto. Para finalizar espero la pulsación de una tecla y después reinicio el ordenador.

  • 13/04/2010

    Program : Bytes : 48k : “How to be a complete Gentleman”, un proyecto de videojuego en marcha [fuente]


    Apenao es el principal artífice de un nuevo juego que se halla actualmente en desarrollo y cuyas interioridades y progresos va publicando en el foro de Speccy.org, y que tiene por título “How to Be a Complete Gentleman”, que enseguida nos retrotrae a un antiguo videojuego de Virgin Games, de similar título: “How to Be [...]