miércoles, 21 de marzo de 2012

El Sonido en 8 bits

Artículo publicado en el número 2 de RetroWiki Magazine

El sonido

Para nosotros el sonido consiste en ondas que producen oscilaciones de la presión del aire, que son convertidas en oscilaciones mecánicas en el oído humano y percibidas por el cerebro.

Como cualquier onda, el sonido tiene varios parámetros que lo definen, los dos principales son la longitud de onda (ancho de un ciclo completo) y la amplitud (altura de la onda), estos parámetros se aprecian bien en la imagen adjunta. Normalmente en lugar de hablar de longitud de onda, se habla de frecuencia, que es el número de ciclos por segundo, lo que depende directamente de la longitud de onda. La frecuencia indica el tono del sonido (agudo, bajo, medio), mientras que la amplitud indica el nivel sonoro (susurro, suave, fuerte). Además de estos parámetros, consideraremos la Potencia acústica, que es la cantidad de energía radiada, y es la que nos da sensación de volumen.

Un sonido complejo es la mezcla de varios sonidos simples, y aquí interviene la fase que es la posición de una onda con respecto a otra, dos ondas están en fase cuando comienzan y acaban en el mismo punto, y están desfasadas cuando una está en el valle y la otra en la cresta. Cada una de las ondas se mezcla en el oído, sumándose su efecto, por lo que un sonido complejo tiene una forma de onda muy desigual, lo que posibilita su reproducción por un generador, que puede reproducir un sonido complejo.


Música y armónicos

La música es una forma de escribir en un papel los sonidos, para lo que cada frecuencia se asocia a una nota musical. Esto se fijó a finales de la edad media, para poder fijar las voces del canto gregoriano principalmente, e inicialmente se definieron 7 notas, lo que produce 8 intervalos de frecuencia desde el DO-RE-MI-FA-SOL-LA-SI hasta el siguiente DO. Esto se denomina octava. La distancia entre dos notas era suficientemente amplia para que el oído las aprecie como sonidos diferentes (y no sean difíciles de cantar), pero posteriormente se añadieron notas intermedias (los sostenidos y bemoles), para mejorar el sonido con la evolución de los instrumentos.

Como el oído humano tiene un rango más amplio de apreciación sonora que una sola escala, hay 11 octavas posibles, no todos pueden oír las primeras y últimas, especialmente los de más edad, por lo que se usan normalmente solo 8 octavas. La octava central se suele nombrar como la tercera octava, o la cuarta para los anglosajones.

La nota base del sistema musical moderno es el LA3, el LA de la tercera octava, para la que se fijó una frecuencia de 440Hz. El LA4 tiene el doble de frecuencia, y el LA2 tiene la mitad, y así en todas las notas y todas las octavas. La frecuencia del DO3 es de 261’626Hz, y el SI3 es de 493’883Hz.
Cuando en un instrumento musical genera una nota, sea cual sea esta, genera siempre la misma frecuencia, por lo que no se distinguiría el sonido de uno a otro intrumento. Pero cuando se genera el sonido, a su vez se generan una serie de ondas complementarias, con frecuencias mitad, cuarto, octavo, etc. Estas ondas complementarias se denominan armónicos. Cada instrumento musical genera diferentes armónicos, cada uno con una intensidad, que se suman a la nota generada, y eso es lo que diferencia realmente el sonido de un instrumento de otro.

El sonido en la música tiene 4 parámetros que lo definen, altura (frecuencia o tono), intensidad (amplitud o intensidad), duración (tiempo que permanece la nota en el aire), timbre (instrumento con que se toca, relacionado con sus armónicos). A esto se añade una quinta que se denomina textura, que solo una apreciación de la calidez del sonido (aterciopelado, áspero, metálico, etc.).

Generadores de sonido

Un generador de sonido puede funcionar de tres maneras principalmente, digital, analógica o sampler.
Un generador digital es el más sencillo de todos, calcula la frecuencia que desea emitir, y mediante un conversor analógico a digital, genera una señal. Esta señal no puede ser fiel al 100% a la que desea generarse, ya que la conversión solo puede generar ciertos valores escalonados, pero si los escalones son muy pequeños, la calidad sonora es muy buena, comparable a la de los otros medios de generación. La ventaja es que la conversión es muy rápida, instantáneamente se puede adaptar a cualquier nivel.
El generador analógico es el más usado, mediante un transistor se puede generar una frecuencia cualquiera, con la ventaja de que puede ser variada por una señal externa. Esto permite generar una señal sonora de igual frecuencia que la que desea reproducir. El problema de los generadores es que tienen un rango limitado de frecuencias que pueden variar, antes de empezar a distorsionar, por lo que se suelen montar varios generadores de frecuencias juntos, cada uno encargado de un rango. El otro problema es que tienen algo de inercia en el cambio, no es instantáneo, pero esto realmente no es un problema, ya que los instrumentos musicales también tienen dicha inercia.
El tercer sistema más usado es del de los sampler. Lo que hacen es almacenar el sonido que desea reproducir, cuantos más mejor, y se limitan a reproducir el sonido grabado. La gran ventaja es que producen el sonido más realista del instrumento que desean reproducir, el inconveniente es que el rango de sonidos queda limitado a los que puede almacenar.

Voces y ruido blanco

Los generadores de sonido pueden producir un solo sonido, o generar varios simultáneamente, cada canal de generación de sonido se denomina una voz. Cuantas más voces o canales tengan, mejor será el resultado del sonido generado. Los generadores de los ordenadores de 8 bits más habituales generan 3 voces simultáneas.
El ruido blanco es una señal completamente aleatoria, se puede aplicar a un sonido completamente aleatorio, o a la distorsión que se genera en una imagen visual al aplicar ciertos filtros. Los generadores suelen incluir un generador de ruido blanco, ya que con ellos se sintetizan muy bien los sonidos de percusión.
Otros componentes habituales en los generadores son los filtros, que permiten eliminar partes del sonido generado, y también son necesarios los amplificadores de la señal, que permiten aumentar el volumen sonoro, los mejores usan amplificadores separados para cada canal, lo que permite un control preciso del sonido generado.

MIDI

El MIDI (Musical Instruments Digital Interface, o Interfaz Digital de Instrumentos Musicales), no es un generador real de sonido, sino un sistema que permite a los ordenadores y los dispositivos musicales electrónicos comunicarse y compartir información, para controlar la generación de sonidos. Generalmente el ordenador envía a los periféricos la nota que desea que generen, y estos la producen. La ventaja del sistema es que la información que se intercambia es muy liviana, e independiente de la fuente y el destino. Un sistema puede controlar hasta 16 canales MIDI, cada uno generando uno o varios sonidos, por lo que un ordenador con interface MIDI puede llegar a general muchos canales de sonido.

Evolución del sonido

Los primeros ordenadores personales como el Altair o el Imsai (y las primeras consolas como la Odisey) no tenían posibilidad de generar sonido, aunque mediante el bus S-100 se les podría dotar. El Apple II aportó la novedad de incorporar un altavoz interno, y como estaba conectado al procesador, este podía generar algunas señales sonoras, lo que se conoce habitualmente como pitidos.
Pero el sonido donde más se necesitaba era en las consolas, un juego sin sonidos pierde mucho, los primeros usaban el mismo sistema de conectar el altavoz al procesador, hasta que Atari incluyó en su exitosa consola 2600 un chip específico, la TIA, que controlaba la generación de video y de sonido, con dos canales mono de salida. De este desarrollo surgió el que está considerado el primer chip de sonido, el POKEY de Atari.

Posteriormente surgieron el General Instrument AY-3-8910, y desarrollados por Commodore y MOS el VIC (nombre usado en el famoso VIC-20), el SID y el TED. Otros chips muy difundidos fueron el 2A03 de Nintendo, el Philips SAA1099, los de Texas Intruments de la serie SN764, y los Yamaha de la serie YM.

Los primeros basados en Sampler fueron el "Paula" de MOS, usado en los Amiga, el Sony SPC700, o el National LMC 1992.

Pequeña cronología




1972
  • Magnavox Odyssey, imagen en blanco y negro y sin sonido.

1973
  • Atari Pong, con efectos de sonido en forma de pitidos del altavoz

1977
  • Apple II. Solo pitidos del altavoz, aunque apareció una tarjeta de sonido.


  • Tandy Radio Shack TRS-80. Solo pitidos del altavoz, pero como curiosidad, el modelo III emitía tanta interferencia radioeléctrica, que algunos juegos se diseñaron para aprovecharla y sacaban sonido en una radio que estuviera cerca del aparato.


  • Atari VCS 2600, primer chip específico para gráficos y sonido, la TIA.

1979
  • Mattel Intellivision, con un GI AY-3-8914 Años 80


  • Atari 400/800. Esta gama incluía el POKEY.




1980
  • Commodore VIC-20, el  "VIC" (Video Interface Chip) también generaba el sonido.


  • CoCo (TRS-80 Color) el hardware de sonido era un DAC bajo control del procesador. Algunos cartuchos incorporaban un procesador de sonido.

1981
  • TI-99/4A, primero ordenador con sprites gráficos, incorporaba el TI TMS9919,


  • PC de IBM, solo pitidos por el altavoz interno, pero surgieron muchas tarjetas de sonido.


  • BBC Micro, incorporaba el chip de sonido Texas Instruments SN76489

1982
  • Sinclair ZX Spectrum, sonido por el altavoz interno controlado por la CPU a través de la ULA. Timex incluyó en el 1984 el chip de sonido AY-3-8912 en algunos modelos, el mismo chip que se incluyó de serie en 1985 en el Spectrum-128 lanzado por Investrónica, y en los modelos lanzados por Amstrad posteriormente +3 y +2.


  • Commodore 64 - El modelo más vendido de todos los tiempos, con el MOS SID


  • Vectrex con gráficos vectoriales, usaba un General Instruments AY-3-8912


  • Colecovision, con un Texas Instruments SN76489A

1983
  • Coleco Adam, con un chip TI SN76489AN de 3 voces y ruido blanco


  • MSX con un General Instrument AY-3-8910. El MSX-2 usó el Yamaha YM2149. El MSX 2+ usaba el  Yamaha YM2149 y el  YM2413 (MSX-Music). El MSX Turbo-R usaba el  Yamaha YM2149 (PSG), el Yamaha YM2413 (OPLL) (MSX-Music) y un chip PCM. Algún modelo incluyó MIDI.


  • Acorn Electron, aunque internamente dispone de 3 canales virtuales independientes, están mapeados por el único canal físico de sonido y otro de ruido blanco mediante la ULA, para mantener la compatibilidad con el BBC B.

1984
  • Apple Macintosh, sonido de un solo bit usando un PWM.


  • Amstrad CPC usando un General Instrument AY-3-8912, podían generar sonido estéreo usando los canales de sonido por separado.


  • Oric Atmos, usando un General Instrument AY-3-8912

1985
  • Atari ST, los primeros solo el YM2149F pero incorporaban dos conectores MIDI con posibilidad de manejar 16 canales. Posteriormente usaron un National LMC 1992.


  • Commodore Amiga, con el chip Paula.


  • La NES con el chip de sonido de Nintendo 2A03, un gran generador de sonido

1986
  • Sega Master System, con un  Yamaha YM2413.

1988
  • Sega Mega Drive, Yamaha YM2612 y Texas Instruments SN76489
En la segunda entrega repasaré las características de los principales chips generadores de sonido.
Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en javu61@gmail.com o ver más cosas en old8bits.blogspot.com













Introducción a la programación usando BASIC (II): Variables, INPUT y PRINT

Artículo publicado en el número 2 de RetroWiki Magazine

Entrada/Salida. Variables. Primer programa: Calculadora


NOTA DE SINTAXIS: Lo que sea propio de la programación estará en negrita, y las palabras propias del BASIC estarán siempre en mayúsculas y negrita. Todo lo que esté en azul dentro del texto hay que escribirlo literalmente (en el Spectrum gomas ya sabéis que no se escribe así, en otro artículo hablaré del por qué). Los listados de los programas estarán en recuadros. La respuesta del ordenador dentro del texto estará en verde, a no ser que sean imágenes de la pantalla que aparecerán en cuadros. Las pulsaciones de teclas aparecerán en rojo.

En el primer artículo puse una referencia del lenguaje, y un pequeño ejemplo para abrir boca, en los cursos ahora se empieza con teoría, seudocódigo, y cosas más académicas como el lenguaje de definición de la sintaxis, pero como la única forma de aprender a programar es programando, vamos a aprender a programar programando, y para nuestro primer programa elegiré hacer una calculadora, lo que nos ayudará con los conceptos básicos sobre variables y el control del programa, e iré poco a poco ampliando la funcionalidad.

El BASIC es interpretado, eso significa que cuando escribimos algo, el sistema responde a todo lo que se escribe. Si es una sentencia la ejecuta inmediatamente, si comienza por un número añade esa línea al programa, si es un comando lo ejecuta. Usaremos esto para nuestras primeras operaciones, por ejemplo si escribimos PRINT 25*3 y pulsamos el INTRO o ENTER, se ejecuta, y vemos en la pantalla el resultado 75 mientras que si escribimos PRINT 25/3 aparece 8,3333333 (el número de ceros puede variar dependiendo de la máquina).

Así podemos jugar un poco con nuestra primera instrucción PRINT, que lo único que hace es mostrar en la pantalla los resultados de lo que le digamos. Vemos que el sistema puede trabajar con los 4 operadores matemáticos básicos (+ suma, - resta, * multiplica, / divide), luego añadiremos alguno.
Si vamos a empezar un programa, primero pensemos lo que queremos, vamos a hacer que el sistema nos solicite dos números, una operación, y nos muestre el resultado en la pantalla. Los números que introducimos los debemos guardar en un sitio, pues si no los tenemos almacenados no podemos usarlos. Los almacenes de valores se denominan variables. Una variable tiene un nombre propio, y este nombre estará compuesto por hasta 8 caracteres, números o letras, pero siempre debe empezar por una letra. A ese nombre se le puede añadir el carácter $ para indicar que su contenido será alfabético, si no será un valor numérico. RESTRICCION: En el BASIC del Spectrum las variables de tipo cadenas solo pueden tener en su nombre una letra, o una letra seguida de un número, mientras que si alguno es el afortunado poseedor de una máquina mucho más antigua, todas las variables serán solo de una letra, o una letra seguida de un número.

Para introducir valores en el sistema por el teclado usaremos la instrucción INPUT, que es un poco lo contrario del PRINT, cuya sintaxis es INPUT nombre_variable. El sistema se para, pone un indicador en la pantalla (generalmente un interrogante aunque en el Spectrum no saca nada), y se queda esperando que introduzcamos un valor. Así si escribimos INPUT prueba y pulsamos ENTER, aparece un interrogante, si escribimos 3.5 le estamos introduciendo el valor tres coma cinco (recordar que el sistema inglés usa el punto como nosotros la coma decimal, y usa la coma como separador de millares como usamos nosotros el punto). No veremos nada en pantalla, o recibimos un mensaje de OK, pero ya ha guardado ese valor en una variable, que se llama nro. Si ahora escribimos PRINT prueba aparece en pantalla el valor de la variable, por tanto aparece en pantalla 3.5  

Punto importante, los valores de las variables no se pierden hasta que les demos otro valor, o reseteemos el aparato, lo apaguemos, o si escribimos el comando NEW y damos ENTER (hacerlo), que limpia la memoria y elimina el programa que tengamos en ese momento. Si tras esta limpieza escribimos PRINT prueba aparece un mensaje de error, indicando que no hay ninguna variable que se denomine prueba en el sistema, o cero en algunos sistemas como el Amstrad.

Ahora ya podemos poner la sintaxis completa de la instrucción de impresión que es PRINT valores en donde valores puede ser:
  • Una variable (se presenta tu contenido)
  • Una contante, que a su vez puede ser o bien un número que escribimos tal cual, o una cadena de caracteres alfabética, cuyas letras deben ponerse entre las comillas dobles, para que el sistema sepa lo que es, por ejemplo “hola”
  • El resultado de una expresión, como hemos usado antes al poner 25/3, se presenta su evaluación.
  • O una combinación de varios valores, que debemos separar o bien por un punto y coma, o bien por una coma simple. Si usamos el punto y coma se imprimen uno tras otro, si usamos la coma, el resultado se presenta en la próxima parada de tabulación (una tabulación cada 8 caracteres de la pantalla generalmente, pero depende del sistema en que programemos).
Veremos esto, si escribimos PRINT 1,2;3 aparece en la pantalla 1                 23 vemos que presenta el valor 1, una serie de espacios, el valor 2, y unido el valor 3. Si escribimos PRINT “hola”,”hola”;”hola” aparece en la pantalla hola                holahola

Vamos con el primer programa, pediremos dos números, y presentamos el resultado de su suma, resta, producto y división. Si lo tecleamos, veremos que con esto tan sencillo hemos empezado a recibir datos, y cada vez que pulsamos RUN nos pide los dos números y presenta el resultado. Solo que es un poco lio lo que se presenta en la pantalla, por tanto lo mejoraremos un poco.

10 INPUT valor1
20 INPUT valor2
30 PRINT valor1+valor2
40 PRINT valor1-valor2
50 PRINT valor1*valor2
60 PRINT valor1/valor2



Lo primero es comentar que vamos a hacer, para lo que usaremos la sentencia REM, que lo que hace es introducir un comentario en el listado del programa. Luego lo que haremos es presentar cosas en pantalla, solicitar dos números, dando mensajes que le permitan saber al usuario qué hacer, y luego pondremos el resultado de las cuatro operaciones con ambos números. No es mucho mejor, pero creo que si es mucho más claro para el usuario, y los programas los ejecutan usuarios, no siempre los propios programadores.

Este es nuestro nuevo programa, primero hay que teclear NEW, y a continuacion introducimos este programa:

100 REM --------------------------------
110 REM - Calculadora. J.A. Vaque 2011 -
120 REM --------------------------------
130 PRINT "Calculadora simple. Versión 1.0"
140 PRINT "*******************************"
150 PRINT
160 PRINT "Introduzca el primer valor: ";
170 INPUT valor1
180 PRINT
190 PRINT "Introduzca el segundo valor: ";
200 INPUT valor2
210 PRINT
220 PRINT
230 PRINT "Suma....: "; valor1+valor2
240 PRINT "Resta...: "; valor1-valor2
250 PRINT "Producto: "; valor1*valor2
260 PRINT "cociente: "; valor1/valor2

Las líneas 100 a 120 son comentarios, las 130 a 150 ponen lo que hace el programa. De la 160 a la 200 introducimos valores, ojo que la 160 y la 190 deben acabar en punto y coma, para que el input salga en la misma línea (salvo en el Spectrum que los input van en la última línea siempre). La 210 separa el input de los resultados, y la 220 separa un poco más, dejando una línea en blanco. Y por último las 230 a 260 presentan el resultado. Cada vez que la ejecutamos vemos cómo se va ejecutando, pero no queda una pantalla muy elegante, añadiremos la línea 125 CLS y vemos que se limpia la pantalla antes de cada ejecución, por lo que queda un poco mejor. 


Animaros a ir probando cosas, meter más INPUTS y PRINT, poner y quitar comas y puntos y coma, jugar un poco con los valores. Por ejemplo, os propongo algo sencillo, podéis poner también los resultados inversos, en lugar de primero mas segundo, segundo más primero, y ver que operaciones son conmutativas y cuáles no.
Saliendo del BASIC estándar, hay una forma de alterar la posición donde imprime o lee en la pantalla, con la sintaxis PRINT TAB (columna, línea); valores esto posiciona el cursor en el punto indicado mediante columna y línea, y luego imprime en la pantalla a partir de ese punto. Hay una variante que es usar la sentencia AT columna, línea lo que posiciona el cursor, y luego podemos ya usar el PRINT normalmente.
En la entrada muchas versiones del BASIC permiten añadir en el INPUT una cadena de caracteres, que se imprime como si hubiésemos usado un PRINT previo, y nos permiten ahorrar instrucciones, por ejemplo podemos poner INPUT “Introduce un número”; n

En el próximo capítulo veremos las sentencias de control, y seguiremos ampliando esta sencilla calculadora en el próximo número, pero es importante ir poco a poco y asentar conceptos. Si tenéis cualquier duda, en los foros de RetroWiki o en mi mail os las solucionaré.

Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en
javu61@gmail.com o ver más cosas en old8bits.blogspot.com

Alcancé las 25.000 visitas

Ayer, 20 de marzo del 2012, alcancé las 25.000 visitas al blog, nunca lo hubiese pensado. Gracias a los que lo siguen, espero que a alguno de los que entran les haya ayudado a resolver algún problema.

martes, 20 de marzo de 2012

Introducción a la programación usando BASIC (I): Hola mundo

Artículo publicado en el número 1 de RetroWiki Magazine

Una característica común a casi todos nuestros sistemas retro es que cuando arrancan disponen de una versión del BASIC con la que podemos trabajar. En estos artículos partiremos de cero, aprendiendo como se programa usando el más querido, uno de los más usados, y a la vez el más denostado lenguaje de la historia.

Pequeña historia del BASIC

Los primeros lenguajes ampliamente difundidos fueron el FORTAN (1957) y el COBOL (1960). El primer lenguaje diseñado académicamente fue el ALGOL (1959) padre de todos los lenguajes estructurados, mientras que el primer lenguaje funcional fue LISP (1958). Todos estos adolecían del problema de que necesitaban bastantes recursos de máquina para el desarrollo, compilación y ejecución del programa.

En 1964 John Kemeny y Thomas Kurtz en la prestigiosa universidad de Dartmouth de Estados Unidos idearon un lenguaje más sencillo el Beginner's All-purpose Symbolic Instruction Code (Principiantes - Propósito general – Código de Instrucciones Simbólicas), lo que le permitía ejecutarse en una terminal de ordenador de forma interactiva con el usuario, sin necesidad de grandes requerimientos de hardware. Inicialmente el BASIC también era un lenguaje compilado, pero rápidamente se convirtió en uno interpretado, aumentando su manejabilidad.El lenguaje se inspiró en la sintaxis del FORTAN, aunque con alguna característica del ALGOL. No fue un lenguaje popular en sus inicios, aunque por su sencillez fue portado a muchas máquinas, hasta que en 1975 se incluyó en el primer ordenador popular de la historia, el Altair 8080. Esta versión fue llamada Altair Basic, y fue el primer producto de Microsoft, cuyos inicios fueron desarrollar versiones del Basic que estaban incluidas en las ROM de máquinas como el Apple II, los primeros IBM PC, o posteriormente el MSX Basic.

Características básicas

El BASIC de nuestros aparatos es muy similar en cuanto a sintaxis, pero hay diferencias en cuanto a las funciones que incluye cada uno. En este artículo usaré características del BASIC original, el más simple, que son comunes a todas las versiones, aunque los ejemplos los he escrito en GWBASIC por comodidad, la primera versión de Microsoft para MSDOS.

Variables

Una variable es un contenedor de información, que tiene dos propiedades, un nombre y un tipo de contenido, y almacena cierta información. Solo existen dos tipos de variables en BASIC, los números (ya sean enteros o reales) y las cadenas de caracteres. Hay versiones en que se diferencia entre variables enteras y reales, ya que las operaciones con enteros son mucho más rápidas que las operaciones con reales, pero ordenadores como el Spectrum no lo hacen, y por eso su BASIC es uno de los más lentos. Los nombres de las variables solo podían tener una letra, o una letra seguida de un número, y las variables de tipo cadena de caracteres deben añadir a su nombre el símbolo $ para distinguirlas. Esta característica fue pronto ampliada, y normalmente los nombres de las variables pueden tener hasta 8 caracteres de largo, pero en versiones “profesionales” como las de NIXDORF se mantiene una sola letra, y en los Spectrum las variables de cadena de caracteres solo pueden tener una letra en su nombre.

Sentencias

El BASIC tiene muy pocas sentencias, por lo que es muy sencillo de aprender a manejar, esta es la lista de las clásicas, luego se han ido añadiendo, pero no usaremos más que estas.


REM Comentarios

DEF Definir funciones de una sola línea

DIM Tamaño de los arreglos

END / STOP Final del programa

LET / = Asignación de datos a variables

INPUT / PRINT Entrada y salida por pantalla y teclado

IF / THEN / ELSE Condicionales

FOR / NEXT Bucles

GOTO Salto incondicional

GOSUB / RETURN Salto a una subrutina

DATA Manejo de datos estáticos
En todos los sistemas existe también CLS (CLear Screen) este es un comando que no estaba entre los originales, permite borrar la pantalla completamente. En algunos sistemas se usa CLEAR en su lugar.

Operadores

Tampoco cuenta con una lista muy amplia de operadores, que podemos agrupar entre cinco operadores aritméticos (realizan operaciones aritméticas entre variables numéricas) que son:


+ para sumar

- para restar o invertir el signo

* para multiplicar

/ para dividir (puede ser división entera en ciertas versiones)

^ o ** para la exponenciación (el símbolo depende de la versión del Basic)

También existen otros seis operadores lógicos (se usan en los condicionales) que son

= para idicar igual

<> para indicar no igual (diferente)

< para indicar menor

<= para indicar menor o igual

> para indicar mayor

>= para indicar mayor o igual
Los operadores se evalúan normalmente de izquierda a derecha, pero se puede alterar ese orden usando paréntesis. Aunque no estaba inicialmente definido, se utiliza el + para concatenar cadenas de caracteres.

Funciones

Cada versión de BASIC aporta un conjunto propio de funciones, y es lo que más diferencia unas versiones de otras. Esta es una lista de las definidas en el BASIC original:

SQR Raíz cuadrada

ABS Valor absoluto de un número (el número sin su signo)

INT Parte entera de un número

RND Devuelve un número real al azar entre 0 y 1

SIN / COS / TAN / ATN Seno, Coseno, Tangente y Arco tangente (en radianes)

EXP, LOG Exponencial (ex) y Logaritmo natural

A esto añadiremos la función LEN$ que nos da la longitud de una cadena de caracteres.

Comandos

El intérprete reconoce las líneas que comienzan por un número, asumiendo que son líneas del programa. Si se escribe un número y una sentencia que no exista, se añade al programa, si ya existe se reemplaza. Si solo se indica el número se borra la línea. Además, hay una serie de comandos que nos ayudan a la edición y ejecución del programa. Esta parte también cambia de uno a otro equipo, pero en general encontramos estos comandos:

RUN Ejecuta el programa

LIST Lista todas las líneas del programa, se puede añadir desde y hasta línea

LIST n Lista las líneas del programa desde la linea n en adelante

LIST n,m Lista las líneas del programa desde la linea n hasta la m

EDIT n Edita la línea n

NEW Borra todo el programa de la memoria

DELETE n Borra la línea n del programa

DELETE n,m Borra las líneas de la n a la m incluidas

RENUM Renumera las líneas del programa

Primer programa

Nuestro primer programa será el típico Hello World, la primera vez que oí hablar de él fue relacionado con la primera vez que pusieron en marcha el primer prototipo de MAC, tras un día de arreglos por fin consiguieron ese texto en la pantalla.Como BASIC es un sistema interpretado, cualquier cosa que escribamos la interpreta como un comando y la ejecuta. Es muy útil si queremos hacer cosas que no son del BASIC, sino del intérprete de comandos, como limpiar la pantalla, para lo que usaremos CLS o CLEAR según la versión del BASIC. Si escribimos PRINT “Hola mundo”, en la siguiente línea aparecerá Hola mundo. Si lo que queremos es escribir un programa, solo debemos comenzar con un número entero, ese será el número de la línea, y nos servirá para referirnos a ella durante la edición o ejecución del programa. Si escribimos 10 PRINT “Hola mundo”, no sale nada en la pantalla, o en algunos equipos, como el Spectrum, se ve esta línea al principio de la pantalla. Pero si hacemos un LIST, veremos la lista de sentencias que tenemos introducidas. Si introducimos el comando RUN se ejecuta el programa y aparece el mensaje.

Mejorando el programa

Una buena práctica es poner comentarios a los programas, para luego mejorar su lectura, y borrar la pantalla antes de empezar, para que se vea mejor lo que presentamos. El programa termina cuando no hay más líneas, pero es conveniente añadir un final. Vamos a ello, añadiremos las siguientes sentencias, primero haremos un CLS para borrar la pantalla y un NEW para borrar todo. Si hacemos un LIST veremos que no hay nada. Introducimos este programa:

10 REM Este es un ejemplo de Hola Mundo en BASIC
20 CLS
30 PRINT “Hola mundo”
40 END

Si hacemos un LIST vemos las líneas. Si hacemos un RUN vemos el resultado.


Mejoremos el programa, en lugar de saludar a todo el mundo, haremos que nos salude a nosotros. Para ello pediremos que nos introduzcan nuestro nombre, y saludaremos con él. También informaremos de que se ha acabado el programa. Para ello añadiremos estas líneas:

25 PRINT “Introduzca du nombre: “
26 INPUT N$
35 PRINT “Hola “;N$
36 PRINT “Hola “,N$
37 PRINT
38 PRINT “FIN DEL PROGRAMA”
39 PRINT

Hemos añadido unas líneas entre las existentes, por eso se numeran las líneas de 10 en 10, para poder añadir nuevas líneas intermedias. Si ejecutamos, obtenemos este resultado:

Vemos la diferencia entre las líneas 35 y 36, al separar los elementos del PRINT por un punto y coma, se imprimen juntos, si separamos por una coma, se va a la próxima parada de tabulación. Vemos que cada PRINT va en una línea, y que el INPUT muestra un interrogante. Añadamos un punto y coma al final de la línea 25, en este caso el INPUTse ejecuta en la misma línea.Estos ejemplos deben funcionar en cualquier BASIC, seguiré en próximos artículos con esta introducción a la programación usando nuestro querido BASIC, siempre usando pequeños programas de ejemplo. 


Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en

Proyecto de MOD para la Game Gear

Entradas relacionadas:


Tras primer paso de traducir la página del inglés, el segundo es plantearse como quedará el aparato, por lo que he dibujado un boceto NO A ESCALA del modelo que tengo en la cabeza:




La idea es que en la parte trasera estén el conector de alimentación y la salida del Euroconector, en la parte superior lo mas atrás posible, pero sin que choquen con los conectores traseros, estarán las dos entrada de cartuchos, una para los de la Game Gear, y otra para los de Master Systems, así me ahorro andar con conversores. Pegado al borde delantero, a la izquierda un botón de encendido y junto a el un led, y a la derecha el botón de Start, ya que el mando a usar será uno de la Master, que solo usa dos botones, y como el Start no se usa durante el juego, no es problema tenerlo aparte, y así no hay que modificar los mandos. En el frontal estará el conector del mando de la Master Systems.

Dentro habrán dos placas, debajo la placa diseñada para el MOD, y encima la de la Game Gear, ambas conectadas por hilos. Para que sea cómodo el manipularlas, quiero que la del MOD sea mas ancha, en  una lateral irán las entradas, el otro las salidas, y así es sencillo soldar los hilos sin quitar las placas.

Para los conectores de los cartuchos, quiero que ambos estén sobre mi placa, de esta forma es mas sencillo el cableado de ambas, y la conexión de las dos placas en esa zona he pensado que sea enchufada, con conectores como estos, dos tiras y no una doble, ya que en la placa de la Game Gear están desalienadas, y así no hay que soldar muchos hilos.

También quiero montar este tipo de conectores para el resto del cableado, y así se pueden separar las placas de forma sencilla, y al ser polarizados no se pueden introducir al contrario:




En la placa estarán el circuito de conversión a TV, en la que entran los cables de las señales desde la placa original, y luego tendrá otro conectores para la salida de televisión por el euroconector. Además estará la entrada del mando, y la conexión de los dos botones y el Led.

También quiero poner en esta placa un regulador para la alimentación, y así no necesito usar la placa original de alimentación de la Game Gear, ya que solo necesita los 5Voltios para funcionar, al haber eliminado el tubo de la retroalimentación, y entre 6 y 12 voltios sin regular para conmutar la tele a modo RGB. Un alimentador pequeño de 9V y 1A como entrada, y un regulador 7805 con un buen disipador para regular los +5V, y ya lo tengo todo.

Encima de esta placa estará la de la Game Gear, al que le habré quitado los componentes no necesarios por haber quitado la retroiluminación.

Esto es la idea, ahora falta empezar a darle forma, medir las placas, buscar la posición de los slots de los cartuchos, y a partir de eso el tamaño de la caja, que no quiero que sea mucho mas grande que la propia Game Gear. Una vez tenga la caja, acabar de buscar la forma de montar los componentes de la placa

sábado, 17 de marzo de 2012

Como conectar la Game Gear a la tele por el Euroconector

Entradas relacionadas:

17/07/24 Se han recuperado las imágenes desde el caché de internet, algunos los enlaces no funcionan ya que la web de Tim y otras del final de esta entrada parece caída, use Archive si quiere verlas. Todas las imágenes son de la mencionada página, publicadas con permiso del autor.



Estoy preparando un proyecto para conectar la GameGear a la TV, y la fuente de información principal es la página How to Connect a Sega Game Gear to a TV via RGB SCART, para la que su autor, Tim Worthington, me ha dado permiso para traducir y publicar en castellano, lo que le agradezco. Ya publicaré en otras entradas el desarrollo del proyecto. Vamos con la traducción.


Como conectar una Sega Game Gear a la TV via RGB SCART

 

Este diseño se basa libremente en el trabajo de Xavier en los foros de SMSPower, que creo que era continuación del trabajo de Víctor Kemp. Salté al final de esta entrada del foro y use la información proporcionada por los colaboradores para llegar a este diseño.


Operación

La Sega Game Gear es muy similar en hardware a la consola que le precedió, la Master System. Por ese motivo internamente la pantalla LCD se maneja con temporizaciones compatibles con la TV. Esto, y la disponibilidad de una señal de sincronismo compuesto en la placa base (que parece estar allí por esta sola razón, ¡no se utiliza por ninguno de los componentes internos!) hace posible la generación de vídeo. El único problema es que los datos RGB se envía en forma serie por cuatro líneas digitales, un color a la vez. Lo que mi circuito hace es separar los datos de los colores rojo, verde y azul usando las señales proporcionadas por la placa. Estoy bastante seguro de que funciona de la misma manera en la unidad desarrollada por la propia Sega.

Tres flip-flops D se usan para dividir el reloj maestro de 32MHz en tres relojes de pixel de 5.3MHz, usando una contador en configuración Johnson MOD-6. Tras cada línea de vídeo se pone a cero el contador por algún impulso de borrado horizontal que va a la pantalla LCD. No estoy exactamente seguro de para que es, pero es un buen lugar para sincronizar el contador (una vez invertida la señal). Lo he llamado /HLATCH en el circuito. El flanco de subida de cada reloj de píxel se utiliza para almacenar los datos del color asociado en uno de los tres flip-flops D octales (aunque sólo se usa la la mitad de cada uno) y se convierten en analógico con una escalera de resistencias ponderadas binaria. El vídeo analógico a continuación, se mantiene en una etapa de 75 ohmios antes de llevarla a la televisión. /CSYNC se lleva a través de una resistencia para acomodarla al nivel de voltaje correcto para una entrada de vídeo SCART, y tanto el RGB como la línea de estado CVBS se llevan al televisor de destino en el modo de vídeo RGB.

Descargue el diagrama del circuito y también el diagrama de tiempos para entender mejor como se obtienen los relojes de pixel.
 
Diagrama del circuito

Diagrama de tiempos


Construcción

Descargue el esquema de disposición de los componentes y el diagrama de cableado e imprímalo (es buena idea repasar el cableado con lápices de colores si no tiene una impresora en color). Todos los componentes para montar este circuito están disponibles en Jaycar Electronics (esta web es Australiana). No son componentes especiales, por lo que espero que serán fáciles de conseguir en su proveedor local.

 Esquema de disposición de los componentes y el diagrama de cableado
 
Conozco internamente dos versiones diferentes de la Game Gear. La versión mas moderna y común de ellas usa un solo ASIC (chip de Sega). Las primeras versiones contenían dos ASICs y mas chips de Ram. Aquí pongo unas fotos de donde obtener varias señales en la placa (aunque el circuito debe bastar para los que lo saben leer). Las líneas de alimentación (+5v y masa) pueden tomarse de un condensador de filtro cercano.

Señales en placa con 1 ASIC

Señales en placa con 2 ASIC


El circuito lo monté en un trozo de placa de prototipos de estilo topos (no la de líneas, a pesar de que se puede montar en ella también). Es una placa fenólica con una rejilla de agujeros perforados de 0.1 pulgadas, y un circulo de cobre alrededor de cada agujero en el lado de la soldadura. Para ajustar todos los integrados en la placa vamos a aprovechar el hecho de que algunos de los circuitos integrados tienen muchos pines conectados en paralelo, y apilarlos uno encima de otro. Este método ahorra mucho espacio y un montón de cables. Esto es importante porque no sólo nos ahorra muchos céntimos, que de otro modo se habrían perdidos en placa y el cable, sino que también así podemos ubicar la placa del circuito en el  pequeño hueco vacío debajo del conector para cartuchos de la Game Gear.

Procedimiento

Este es la guia de paso a paso (ok, mas bien saldo a salto) fotográfica de la construcción e instalación de la placa DAC/Amplificadora de vídeo. No pretende ser un proyecto para "mi primer circuito", requiere buena mano para la soldadura.

Es mas sencillo montar y soldar los chips antes de montarlos en la placa. Corte las salidas que no hacen falta, una las entradas requeridas y levante los pines de los 74HC374 del primer y segundo piso para las resistencias. Está claro en esta foto que me he olvidado doblar el pin 11 entrada de reloj. A la izquierda está la pila doble de HC74s. Nótese que he conectado las entradas no usadas del chip superior a las del chip inferior, no a los +5 V, como se ve en el circuito. Me parece que es más fácil de esta manera, no importa donde se conecten, siempre y cuando no se dejen flotando.

Corte la placa de prototipos en una pieza de 11 agujeros de profundidad por 30 de ancho. Suelde las resistencias a la torre de HC374, coloque el resto de chips y los condensadores de filtro y tendremos algo como...

Ahora es el momento para conectar las líneas de alimentación de cada chip. Una vez hecho todo el cableado de la lógica entre los CI, revíselo. Mantenga los cables cortos y arreglados.


La parte final, el amplificador de video, se añade en el centro. Se conectan los pad aislados como se ve en la foto inferior. Cada entrada/salida necesita una pista soldada a ella  y a un agujero adyacente.

Use cutter y una lima para cortar un trozo de la caja por encima de la pantalla para montar e conector sub-D de 9 pines. Yo recomiendo la versión hembra, porque si se utiliza un conector macho puede que un día conectes un Joystick y se puede estropear algo. Cuando se taladra/lima el agujero, recomiendo colocar un poco de cinta adhesiva alrededor de los bordes de la pantalla, para evitar que el polvo y los restos queden atrapados detrás del plástico. Asigne un pin del conector sub-D como "masa" y suelde un cable entre él y la carcasa metálica exterior (o simplemente envuelvalo sobre la rosca del tornillo).

Luego, monte un cable DB9 a EUROCONECTOR. Si tiene un monitor RGB es posible que desee sustituir el euroconector por el que use el monitor. Yo construí el mio cortando el final de un cable serie RS-232 de tres metros de largo (macho en un extremo, hembra en el otro) y conectando un conector SCART macho. Creo que funciona bien, pero tengo un pequeño zumbido de 60 Hz en el audio cuando pongo la señal de vídeo en la entrar. La única manera de eliminar esto sería llevar el audio a través de un cable blindado separado. Una disposición de las patillas SCART se puede encontrar aquí, decida su propia disposición de las patillas para el conector DB9, ¡y anótela! Conectar la línea de estado CVBS (pin 8 del SCART) es opcional, pero puede ser necesaria en algunos televisores para que se active el modo A/V.




Limpie el polvo, ponga de nuevo las tripas y suelde cables a los pines del conector Sub-D de 9 pines y a los diferentes lugares en la placa principal. Cuando todo está soldado en su lugar (y todos los cables verificados dos veces) enchúfelo todo, póngalo en marcha, y a ver qué pasa. Esperemos que el juego (le ha puesto un juego, ¿verdad?) se reproduce en el televisor. 

La Game Gear tiene un montón de ruido sobre las líneas de suministro de energía. En mi Game Gear este ruido se metió en los amplificadores de vídeo y apareció como una interferencia en la imagen. Para eliminar esta recomiendo poner un inductor en serie con la línea de +5V que alimenta nuestra placa. Este inductor debe tener 10uH o mas de inductancia, y no más de un ohmio o menos de la resistencia. He utilizado un choque de RF de 22uH.


Ubicación de la placa en la consola



Vista general

 

Cuando todo esté probado y funcionando, coloque una tira de cinta aislante a lo largo de la Placa bajo la ranura del cartucho. A continuación, coloque nuestra placa con la modificación encima y fíjelo en su lugar con cola caliente por ambos lados. Si algo sale mal después, la junta puede ser fácilmente removida cortando la cola.

Lista de Materiales

  • Varios
    • Placa de prototipos
    • Cable fino
    • Soldador y estaño
    • Conector hembra sub-D miniatura, junto con dos tornillos/tuercas para montarlo
    • Bobina de 10uH (ver texto en azul un poco mas arriba)
  • Resistencias (Cantidad - Valor - Tolerancia) todas de 1/4 de Watio
    • 3   75Ω   1%
    • 2   220Ω 5%
    • 1   560Ω 5%
    • 3   820Ω 1%
    • 3   1k      5%
    • 3   1k2    1%
    • 3   2k7    1%
    • 3   5k6    1%
    • 3   6k8    1%
    • 3   11k    1%
    • 3   22k    1%
  • Condensadores (Cantidad - Capacidad - Tipo)
    • 2   100nF    (0.1uF) cerámico (lenteja)
    • 1   100uF    electrolítico
  • Circuitos Integrados (Cantidad - Tipo - Función)
    • 1   74HC04     Sextuple inversor
    • 2   74HC74     Doble flip-flop D
    • 3   74HC374   Octuple flip-flop D
  • Transistores (Cantidad - Tipo - Equivalentes)
    • 3   BC548    (BC547, BC549)
    • 3   BC558    (BC557, BC559)

Recursos


SMS Power! - El mejor recurso en Internet con información de consolas Sega de 8 bits.
Sega Game Gear and Master System Technical Information -  Página Web de Victor Kemp (caida)
RGB Video Output from the Game Gear (!) - Página de Chris Covell sobre el tema, basada en el diseño de Xavier (caida).
Jaycar Electronics - Buen proveedor de componentes para este proyecto, ubicado en Australia.

domingo, 11 de marzo de 2012

Reparación Teclado MSX, correa dataset y cartucho NES

He abordado tres reparaciones sencillas este fin de semana, una ha sido la "reparación" de un teclado MSX, no ha sido completa porque sigue fallando, pero se ha solucionado lo que interesaba.

Este modelo usa pulsadores para las teclas del cursor, que por haberse usado mucho fallaban, como no tenía pulsadores del tamaño adecuado, he usado el viejo truco de cambiar la tecla que falla por una que no se use tanto, y así salimos del paso. En los PC, cuando las teclas eran mecánicas, se usaba mucho el reemplazar el ESC por F12. En este caso he cambiado F4 y F5 por los cursores izquierda y derecha, y cuando consiga interruptores adecuados ya las reemplazaré.

Estos son los que fallaban

 Los he cambiado por estos
 Y puestos ya en su sitio
Aquí estoy escribiendo en un log de reparaciones que estoy llevando, para tener referencia de lo que hago, que mi memoria es cada día mas corta.
Esta reparación la hice en casa de mi amigo David, y de paso le cambié la goma de un dataset de commodore, es una operación muy sencilla, lo único es que al montarla puse un poco torcido el contador de vueltas, y al rozar no funcionaba bien la carga, al enderezarlo ya funcionó bien.
Hoy he bajado un rato a ordenar un poco el taller, y de paso he probado un aparato que compré en el rastro, un Famiclon, con forma de SNES, junto a un juego de 4 en 1, y un cartucho de SNES del SuperMario Word, por 6 Euros todo, eso lo piden solo por el Mario.

El Mario funcionó tras la limpieza de rigor, el Famiclon también funciona al poner un cartucho de NES, pero el cartucho de la NES de 4en1 no funcionaba, a pesar de una limpieza a fondo. Lo abrí por si se veía algo mal por dentro, estos cartuchos se abren haciendo fuerza, no usan tornillos sino que tienen 4 pestañas internas. Al abrirlo apareció esto:

Otra vista mas de cerca, en la que se aprecia que una pista está oxidada, el cobre oxidado es verde, no marrón como el hierro. Al probar con el tester no hace contacto, por tanto el circuito se ha cortado en esa zona.
La solución ha sido limpiar bien la zona de óxido, con un poco de algodón mágico, un limpia metales, se frota en la zona para quitar todo el óxido posible, de paso lo pasé por todos los contactos para limpiarlos a fondo. Luego se eliminan los restos con alcohol, y he soldado un cablecito para reemplazar la pista rota.
 Con esta ha funcionado perfectamente, no es ninguna maravilla de cartucho, pero para probar máquinas me viene muy bien tener estos cartuchos.