Tu Micro Commodore Mensual Nº14

Retomando el escaneo de revistas, es el turno del número 14 de la segunda época de la revista Española Tu Micro Commodore.

Contenido:

  • Review: Nemesis, the final challenge
  • Review: Deluxe Paint
  • Hardware: Impresora Citizen 120-D
  • Tecla a Tecla: El robot hortelano
  • Floppy (I)
  • Tecla a Tecla: La vida: el juego más antiguo el mundo
  • Rutinas Kernal (III)
  • ¿Pueden pensar las máquinas?
  • Tecla a Tecla: Turb Micro C-128 (II)

Descargar: TMC_2nda_14.cbz (80MB)

Tu Micro Commodore Montly #14

Just finished scanning the issue 14 of the Spanish magazine Tu Micro Commodore (monthly edition).

Contents:

  • Review: Nemesis, the final challenge
  • Review: Deluxe Paint
  • Hardware: Citizen 120-D Printer
  • Type-in: El robot hortelano
  • Floppy (I)
  • Type-in: Life: World’s oldest game
  • Kernal routines (III)
  • Can machines think?
  • Type-in: Turb Micro C-128 (II)

Download: TMC_2nda_14.cbz (80MB)

Flashback: Sprite BASIC

In Flashback I present selected posts recycled from the first iteration of SolidState blog.


Sprite BASIC is an expansion of 47 new commands for the C64 BASIC, written by Andreas Schulteiß and originally published as a type-in on the Spanish magazine Commodore World #33 of January 1987 (and possibly also in the RUN magazine in other places of Europe and the U.S.A.).
Sprite BASIC uses interrupts to handle sprites and their collisions, and also the sound, that way it’s posible to sprites moving on the screen and sound while the BASIC program continue execution.

Commands for customized sprites and characters

SHOW sprite number (1-8 ), multicolor flag (0-1), priority (0-1) Makes visible a sprite. Example:

SHOW1,1,0 shows sprite 1 in multicolor and without priority over the background

HIDE sprite number (1-8 ) Hides a sprite. Example:

HIDE 1 hides sprite 1.

SET sprite number (1-8 ), X position (0-511), Y position (0-255). Places a sprite in a determined position on the screen. Example:

SET3,160,130 places sprite 3 on the center of the screen

BLOCK sprite number (1-8 ), block number (0-63). Selects the data storage area for the sprite. Example:

BLOCK1,10 selects block 10 for sprite 1.

COLOR sprite number (1-8 ), color (0-15). Selects the color of the sprite. Example:

COLOR7,1 selects white color for sprite 1.

MULTI color1 (0-15), color2 (0-15). Defines the multi-colors for all sprites. Example:

MULTI6,2 selects the colors blue and red

SIZE sprite number (1-8 ), X expansion (0-1), Y expansion (0-1). Defines X and Y expansion of the sprite. Example:

SIZE4,1,0 sprite 4 expands in horizontal.

SPREDIT block number (0-63). Sets the block number or sprite data bank that is going to be edited with the PAT command(see below). Example:

SPREDIT12 selects block 12

CHREDIT character number (0-511). Sets the character that is going to be edited with PAT. Example:

CHREDIT1 the character "A" is going to be edited.
CHREDIT257 the "A" of the second character set is the one that is going to be edited.

PAT “definition string”. Used to define a sprite or character shape. If the string lenght is of 8 characters, a character is defined (see CHREDIT) and 8 definitions would be needed. If it is of 24, a sprite is created (see SPREDIT) and 24 definitions would be needed. A character “.” means pixel off, and any other character, pixel on. Example:

PAT "...***.."

MPAT “definition string” (12 characters). Used to define multicolor sprites: “.” is pixel off, “A” pixel in sprite’s color, “B” pixel in multicolor1 and “C” pixel in multicolor2. Example:

MPAT " AA...BB...CC "

OLD copies back the two character sets in the ROM of the C-64, thus the characters defined with CHREDIT and PAT are replaced by normal characters.
COPY bloque1 (0-63), bloque2 (0-63). Copies a block from one place to another. Example:

COPY1,2 copies block 1 over block 2.

Movement commands

MOVE sprite number (1-8 ), angle (0-360, counterclockwise according to the horizontal), steps size, speed (0-127, 1 the maximun), number of steps (0-65535, 0 is continuous movement), BASIC flag(0 continue program, 1 stop until sprite stops moving). Used to move sprites on the screen. Example:

MOVE1,90,1,1,10,1 sprite 1 moves upwards at maximum speed in 1 pixel steps. It takes ten steps in total and then the BASIC program continues.            

MOVE8,77,4,4,20,0,0 sprite 8 moves continuously in an angle of 77 degrees at speed 20, in 4 pixels steps. The BASIC program continues execution meanwhile.

NOMOVE sprite number (1-8 ). Stop the movement of a sprite. Example:

NOMOVE3 stops the movement of sprite 3.

TURN sprite number (1-8 ), angle (0-360), number of steps (0-65535), number of repetitions (0-255, being 0 uninterrupted). Indicates a sprite to change it’s direction of movement after a determined number of steps. Example:

TURN1,90,10,20 sprite 1 turns 90 degrees after taking 10 steps, repeating this 20 times.

NOTURN sprite number (1-8 ). Stops the change of direction of a sprite and it return to move normally. Example:

NOTURN2

ANIMATE sprite number (1-8 ), first block (0-63), number of blocks (0-63), number of steps. Sprite changes alternatively of shape. Example:

ANIMATE1,13,3,10 sprite 1 changes of shape (data bank) after each 10 steps, beginning in the block 13 and following in 14-15.

NOANIMATE sprite number (1-8 ). Stops the animation. Example:

NOANIMATE4 stops the animation of sprite 4

Collision handling commands

SPCOL sprite number (1-8 ), line number (0-63999). Make the program to branch to the specified line number when a sprite-sprite collision is detected. Example:

SPCOL1,1000 if sprite 1 collides with another sprite the program branchs to the line 1000.

NOSPCOL sprite number. Reverts the previous command. Example:

NOSPCOL1

CHCOL sprite number (1-8 ), line number (0-63999). As SPCOL but for character-sprite collisions.
NOCHCOL sprite number (1-8 ). Reverts CHCOL.
BACK After SPCOL or CHCOL, the program will jump back when finding this order, to the exact place from which it bracnh. The result is like GOSUB/RETURN.
POP Erases the direction for BACK. In this way it can return to any part of the program with GOTO instead of BACK.
CLFLAG The collision flag remains activated when CHCOL or SPCOL is executed, thus if another collision takes place it would not be detected, that’s why it’s recommendable to put this command at the end of the collision subroutine, or immediately after the collision condition has been solved.
(Note: The magazine recommends to place this command at the beginning of the subroutine, but that way, as the condition that produced the subroutine call has not been resolved yet, the result is that the subroutine is executed again and again, resulting in a stack overflow and the conclusion of the program.)

Sound commands

VOL volume (0-15). Sets the volume. Example:

VOL15

ADSR voice (1-3), attack (0-15), decay (0-15), sustain (0-15), release (0-15). Sets the sound envelope. Example:

ADSR1,1,9,0,0 produces piano sound.

WAVE voice (1-3), waveform (0-3). Sets the waveform. It can be: 0=triangle, 1=sawtooth, 2=square, 3=white noise. Example:

WAVE1,3 voice 1 produces noise

PULSE voice (1-3), pulse width (0-65535). Sets the pulse width for a square wave. Example:

PULSE2,2000 voice 2 has a relation of 1:2000.

PLAY voice (1-3), frequency in Hertz, duration in seconds, flag (0=the program continues. 1=the program stops until the sound finishes). Plays a note. Example:

PLAY1,400,1,0 Plays the A note for 1 second while the BASIC program is executed.

Other commands

CURSOR column (0-39), row (0-24). Sets the cursor on a defined screen position. Example:

CURSOR20,12 places the cursor on the center of the screen

PLOT column (0-39), row (0-24), code (0-255), color (0-15). Places a character on the screen including color. Example:

PLOT20,12,1,0 prints a black A on center of the screen.

BORDER color (0-15). Changes the screen border color.
PAPER color (0-15). Changes the screen background color.
INK color (0-15). Sets the character color for the following PRINT sentences.
NOBREAK Disables the STOP key
RENEW Recovers a BASIC program erased with NEW or reset.
KILL Disables Sprite BASIC.

Functions

SPX(S). Contain the X coordinate of sprite S. Example:

A=SPX(1)

SPY(S). Contains the Y coordinate of sprite S. Example:

PRINT SPY(7)

ANG(S) Indicates the angle the sprite S is moving.
SCOL(S) Indicates if sprite S has hit (1) or not (0) another sprite. Example:

IF SCOL(2) THEN PRINT"HIT"

CCOL(S) If sprite S has hit a character on the screen returns 1, if not, 0.
CHAR(X, Y) Returns the character that is on column X, row Y of the screen (in screen code).
FIRE(P) Returns the state of the fire button of the joystick in port P. Example:

X=FIRE(1)

JOY(N) This function allows the use of the joystick at any moment: N=1 “asks” joystick 2 in all directions. N=2 joystick 2 only in horizontal direction (180 and 360 degrees). N=3 only in vertical (90 and 270 degrees). N=4 horizontal and vertical without the diagonals. N=5 to 8 are the equivalents for port 1.

Download zipped D64 image: spritebasic

The image contians:

  • SBASICGEN: BASIC generator of Sprite BASIC, typed from the magazine.
  • SPRITE BASIC: The Sprite BASIC executable, load this to start using Sprite BASIC.
  • CARS: Small demo game written in Sprite BASIC, load this after initializing Sprite BASIC.

Flashback: Sprite BASIC

En Flashback les presento posts seleccionados reciclados desde la primer encarnación del blog SolidState.
Sprite BASIC es una expansión de 47 nuevos comandos para el BASIC de la C64, escrito por Andreas Schulteiß y originalmente publicado como un listado para tipear en la revista española Commodore World Nro 33 de Enero de 1987 (y posiblemente también en la revista RUN en otros lugares de Europa y EEUU).

Sprite BASIC usa interrupciones para manejar los sprites y sus colisiones, y también el sonido, de manera de poder tener sprites moviendose por la pantalla y sonido mientras el programa BASIC se sigue ejecutando.

Comandos para sprites y caracteres personalizados

SHOW número de sprite (1-8 ), indicador multicolor (0-1), prioridad (0-1) Sirve para hacer visible un sprite. Ejemplo:

SHOW1,1,0 conecta el sprite 1 en multicolor y sin  prioridad sobre el fondo

HIDE número de sprite (1-8 ) Desconecta un sprite. Ejemplo:

HIDE 1 desconecta el sprite 1.

SET número de sprite (1-8 ), coordenada X (0-511), coordenada Y (0-255). Coloca un sprite en una posición de la pantalla. Ejemplo:

SET3,160,130 coloca el sprite 3 en el centro de la pantalla

BLOCK número de sprite (1-8 ), número de bloque (0-63). Determina la zona de almacenamiento de datos para el sprite. Ejemplo:

BLOCK1,10 selecciona el bloque 10 para el sprite 1.

COLOR número de sprite (1-8 ), color (0-15). Selecciona el color del sprite. Ejemplo:

COLOR7,1 selecciona el color blanco para el sprite 1.

MULTI color1 (0-15), color2 (0-15). Define los multi-colores para todos los sprites. Ejemplo:

MULTI6,2 selecciona los colores azul y rojo

SIZE número de sprite (1-8 ), ampliación X (0-1), ampliación Y (0-1). Determina la expansión X e Y del sprite. Ejemplo:

SIZE4,1,0 hace que el sprite 4 se expanda en horizontal.

SPREDIT número de bloque (0-63). Determina el número de bloque o banco de datos del sprite que se va a editar con el comando PAT (ver más adelante). Ejemplo:

SPREDIT12 selecciona el bloque 12

CHREDIT número de carácter (0-511). Determina el carácter que va a ser editado con PAT. Ejemplo:

CHREDIT1 la "A" va a ser el cáracter editado.
CHREDIT257 la "A" del segundo juego de caracteres es la que se va a editar.

PAT“cadena de definición”. Sirve para definir un sprite o un carácter. Si la cadena es de 8 caracteres, se define un carácter (ver CHREDIT) y hacen falta 8 definiciones. Si es de 24, se crea un sprite (ver SPREDIT) y hacen falta 24 definiciones. Un carácter “.” significa pixel apagado, y cualquier otro carácter, pixel encendido. Ejemplo:

PAT"...***..."

MPAT“cadena de definición” (12 caracteres). Sirve para definir sprites multicolores: “.” es un pixel apagado, “A” pixel del color del sprite, “B” pixel con multicolor1 y “C” pixel con multicolor2. Ejemplo:

MPAT"AA...BB...CC"

OLD copia los dos juegos de caracteres ROM del C-64, con lo que los caracteres definidos con CHREDIT y PAT quedan sustituidos por caracteres normales.
COPY bloque1 (0-63), bloque2 (0-63). Copia un bloque de un lugar a otro. Ejemplo:

COPY1,2 copia el bloque 1 sobre el 2.

Comandos de movimiento

Move número de sprite (1-8 ), ángulo (0-360, sentido antihorario según la horizontal), extensión de los pasos, velocidad (0-127, 1 la máxima), número de pasos (0-65535, 0 es movimiento continuo), flag BASIC (0 seguir el programa, 1 esperar a que el sprite termine de moverse). Usado para mover un sprite por la pantalla. Ejemplo:

MOVE1,90,1,1,10,1 el sprite 1 se mueve en vertical hacia arriba con la maxima velocidad en pasos de 1 pixel. En total da diez pasos y luego sigue el programa BASIC.            

MOVE8,77,4,4,20,0,0 el sprite 8 se mueve de forma continua en un angulo de 77 grados a velocidad 20, con pasos de 4 pixeles. El programa BASIC continua por su cuenta.

NOMOVE número de sprite (1-8 ). Detener un sprite. Ejemplo:

NOMOVE3 detiene el movimiento del sprite 3.

TURN número de sprite (1-8 ), ángulo (0-360), número de pasos (0-65535), número de repeticiones (0-255, siendo 0 ininterrumpido). Indica a un sprite que cambie su direccián de movimiento tras un número determinado de pasos. Ejemplo:

TURN1,90,10,20 el sprite 1 girara 90 grados tras dar 10 pasos, repitiendose esto 20 veces.

NOTURN número de sprite (1-8 ). Detiene el cambio de dirección y el sprite vuelve a moverse normalente. Ejemplo:

NOTURN2

ANIMATE número de sprite (1-8 ), primer bloque (0-63), número de bloques (0-63), número de pasos. Un sprite cambia de forma alternativamente. Ejemplo:

ANIMATE1,13,3,10 el sprite 1 cambia de forma (banco de lectura de datos) cada 10 pasos, comenzando en el  13 y siguiendo en 14-15.

NOANIMATE número de sprite (1-8 ). Detiene la animación. Ejemplo:

NOANIMATE4 detiene la animación del sprite 4

Comandos de manejo de colisiones

SPCOL número de sprite (1-8 ), número de linea (0-63999). Hace que el programa se ramifique a la línea especificada cuando se detecta una colisión del sprite con otro sprite. Ejemplo:

SPCOL1,1000 hace que si el sprite 1 colisiona con otro sprite el programa se ramifique a la linea 1000.

NOSPCOL número de sprite. Anula la orden anterior. Ejemplo:

 NOSPCOL1

CHCOL número de sprite (1-8 ), número de linea (0-63999). Es como SPCOL pero para colisiones entre el sprite y los caracteres.
NOCHCOL número de sprite (1-8 ). Anula CHCOL.
BACK Después de SPCOL o CHCOL, el programa dará un salto atrás al encontrar esta orden, exactamente al lugar del que partió. El resultado es como GOSUB/RETURN.
POP Hace desaparecer la dirección para BACK. De este modo puede volver a cualquier parte del programa con GOTO en vez de con BACK.
CLFLAG El flag de colisión se queda activado cuando se ejecuta CHCOL o SPCOL por lo que si se produce otra colisión no podra ser detectada, por lo que es recomendable poner este comando al final de la subrutina de colisión, o inmediatamente despues de haber resuelto la condición que produjo la colisión en primer lugar.
(Nota: La revista recomienda colocar este comando al principio de la subrutina, pero de esa manera, al no haberse resuelto la condición que produjo la llamada a la subrutina, solo se logra que se llame a la subrutina una y otra vez, produciendo al final un desbordamiento de pila y la finalización del programa.)

Comandos de sonido

VOL intensidad (0-15). Regula el volumen. Ejemplo:

VOL15

ADSR voz (1-3), ataque (0-15), decaimiento (0-15), sostenimiento (0-15), relajación (0-15). Determina la envolvente del sonido. Ejemplo:

ADSR1,1,9,0,0 produce sonido de piano.

WAVE voz (1-3), tipo de onda (0-3). Fija la forma de onda. Puede ser: 0=triangular, 1=diente de sierra, 2=cuadrada, 3=ruido blanco. Ejemplo:

WAVE1,3 la voz 1 produce ruido

PULSE voz (1-3), ancho del pulso (0-65535). Determina la relación en una oscilación cuadrada. Ejemplo:

PULSE2,2000 la voz 2 tiene una relación de 1:2000.

PLAY voz (1-3), frecuencia en Hz, duración en segundos, flag (0=el programa continúa. 1=el programa se detiene hasta que termina el sonido). Sirve para tocar una nota. Ejemplo:

PLAY1,400,1,0 toca el diapason A durante 1 segundo mientras el programa BASIC se ejecuta. 


Otros comandos

CURSOR columna (0-39), línea (0-24). Pone el cursor en una posición de la pantalla. Ejemplo:

CURSOR20,12 coloca el cursor en el centro de la pantalla

PLOTcolumna (0-39), línea (0-24), código (0-255), color (0-15). Coloca un carácter en la pantalla con color incluido. Ejemplo:

PLOT20,12,1,0 pone una A en negro en el centro de la pantalla.

BORDER color (0-15). Cambia el color del borde de la pantalla.
PAPER color (0-15). Cambia el color del fondo de la pantalla.
INK color (0-15). Cambia el color de los caracteres para las sentencias PRINT que sigan.
NOBREAK Desconecta la tecla STOP
RENEW Recupera un programa BASIC borrado con NEW o con reset.
KILL Desconecta Sprite BASIC.

Funciones

SPX(S). Contiene la coordenada X del sprite S. Ejemplo:

A=SPX(1)

SPY(S). Contiene la coordenada Y del sprite S. Ejemplo:

PRINT SPY(7)

ANG(S) Indica el ángulo con que se mueve el sprite S.
SCOL(S) Indica si el sprite S ha chocado (1) o no (0) con otro sprite. Ejemplo:

IF SCOL(2) THEN PRINT"CHOCASTE"

CCOL(S) Si el sprite S ha chocado con un carácter de la pantalla indica 1, si no, 0.
CHAR(X,Y) Indica el carácter que esta en la columna X, línea Y de la pantalla (en codigo de pantalla).
FIRE(P) Indica el estado del botón de disparo del joystick en el puerto P. Ejemplo:

X=FIRE(1)

JOY(N) Esta función permite la utilización en todo momento del joystick: N=1 “pregunta” al joystick 2 en todas las direcciones. N=2 joystick 2 solo en sentido horizontal (180 y 360 grados). N=3 solo en sentido vertical (90 y 270 grados). N=4 solo vertical y horizontal sin las diagonales. N=5 a 8 son los equivalentes para el puerto 1.

Descargar imagen D64 comprimida: spritebasic.zip
La imagen contiene:

  • SBASICGEN: El generador BASIC del Sprite BASIC tecleado desde la revista.
  • SPRITE BASIC: El ejecutable del Sprite BASIC, carga este programa para empezar a usarlo.
  • CARS: Pequeño juego de demostracion del Sprite BASIC, cargarlo despues de inicializar el Sprite BASIC.