Está en la página 1de 0

Emulacin del hardware

de audio del
Commodore Amiga.
Digitalizador y reproductor
estreo de sonido
digitalizado.
Anlisis e implementacin del
emulador.
Miguel Angel Rodrguez Jdar
Departamento de lgebra, computacin, geometra y topologa
Facultad de Informtica y Estadstica
Universidad de Sevilla, 1995
Emulacin del hardware
de audio del
Commodore Amiga.
Digitalizador y reproductor
estreo de sonido
digitalizado.
Anlisis e implementacin del
emulador.
Miguel Angel Rodrguez Jdar
Director de proyecto: Prof. Gabriel Jimnez Moreno
INDICE GENERAL
1.- Introduccin al registro digital.
1.1.- Registro analgico y registro digital. Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1
1.2.- Descripcin del proceso de digitalizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6
1.2.1.- El proceso de discretizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6
1.2.2.- El proceso de cuantizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.10
1.3.- Tecnologa de la digitalizacin del sonido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.13
1.4.- Manipulacin de seales digitalizadas: efectos de sonido . . . . . . . . . . . . . . . . . . . . . . . . . 1.16
1.5.- Compresin del sonido digitalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.21
1.6.- Almacenamiento del sonido digitalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.23
2.- Introduccin al hardware de audio del Commodore Amiga.
2.1.- El circuito integrado 8364 o PAULA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1
2.2.- Descripcin del funcionamiento del sistema de audio en el Amiga . . . . . . . . . . . . . . . . . . . 2.3
3.- Introduccin al secuenciamiento musical.
3.1.- El secuenciamiento como instrumento de composicin musical . . . . . . . . . . . . . . . . . . . . . 3.1
3.2.- El lenguaje de composicin musical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3
3.3.- Los secuenciadores en el Amiga. El formato MOD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7
4.- Estudio de la viabilidad de la emulacin en un PC AT 386.
4.1.- El temporizador programable 8254 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1
4.2.- El controlador programable de interrupciones 8259A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4
4.3.- El puerto paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6
4.4.- Ejecucin en background. Degradacin del rendimiento del sistema . . . . . . . . . . . . . . . . . 4.9
4.5.- Prueba de emulacin de un canal digital por el puerto paralelo . . . . . . . . . . . . . . . . . . . . . 4.11
4.6.- Reproduccin de varios canales digitales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.14
5.- El modo 32-bit flat pointer en modo real o REALMEM.
5.1.- El modo real y protegido en un i80386 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1
5.2.- El modo REALMEM 32 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4
5.3.- El gestor de memoria extendida XMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6
6.- Descripcin del hardware de audio a implantar en el PC.
6.1.- Esquema funcional y elctrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1
6.2.- Programacin de la tarjeta de sonido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.14
7.- La rutina de ejecucin del intrprete MOD.
7.1.- Descripcin del funcionamiento del intrprete MOD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1
7.2.- Listado fuente de la biblioteca de rutinas para cargar y ejecutar MODs . . . . . . . . . . . . . . 7.22
A.- Anexos
1.- Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.1
2.- Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.3
3.- El altavoz interno. Reproduccin de msica digital usando la modulacin PWM . . . . . . . . A.4
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.1
1. INTRODUCCION AL
REGISTRO DIGITAL.
1.1.- Registro analgico y registro digital. Historia.
A principios de siglo con el fongrafo de Edison se establecieron las bases de lo que deba ser el
registro analgico del sonido. Este consiste a grandes rasgos en convertir las variaciones de presin del
aire producida por los instrumentos musicales, que llamamos sonido, a otro tipo de variaciones
susceptibles de poder ser almacenadas en un medio, y de volver a ser convertidas de nuevo en sonido.
En los primeros tiempos del registro analgico se haca incidir las variaciones de presin del aire sobre
una membrana adosada a un estilete grabador. Este estilete se mova sobre un cilindro recubierto de cera
o parafina. El cilindro giraba sobre su eje mientras avanzaba lentamente, con lo que el estilete nunca
pasaba dos veces por el mismo sitio en cada vuelta sino que dibujaba una espiral a todo lo largo de la
superficie lateral del cilindro. El sonido al incidir sobre el mecanismo membrana-estilete haca que
vibrase ste con la misma intensidad y frecuencia que lo haca el aire de su alrededor, y esa vibracin se
reflejaba en la cera formando surcos que dibujaban el aspecto de la onda sonora captada.
Una vez seca la cera, se volva a pasar el estilete por los surcos de la misma manera y a la misma
velocidad con lo que el estilete se mova siguiendo el dibujo antes creado. El movimiento se amplificaba
mecnicamente mediante una bocina para que fuese audible.
Este mecanismo que en esencia se sigue usando en los giradiscos de los equipos HIFI
usa el mtodo ms simple de codificacin del sonido, a base de grabar las vibraciones mecnicas que
produce. Realmente no hay una transduccin, es decir, una conversin de una variacin de energa en una
variacin de otro tipo de energa ya que slo se usa las ondas mecnicas que transmiten las vibraciones
a travs de medios elsticos como el aire o el metal del mecanismo del fongrafo.
Obsrvese que no era posible una posterior manipulacin del sonido, salvo modificar la velocidad de
reproduccin o reproducir la grabacin hacia atrs.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.2
Con el auge de la electricidad surgieron los primeros transductores elctricos: el micrfono en su
concepcin primitiva consista en dos electrodos separados por una capa de carbn granulado que haca
variar su resistencia al variar la presin sonora que incida sobre l. Una corriente continua que atravesase
dicho micrfono experimentara variaciones de intensidad proporcionales a aqullas. Dichas variaciones
podan ser amplificadas mediante vlvulas electrnicas y dirigidas hacia un altavoz. Este es el transductor
opuesto al micrfono y convierte las variaciones de tensin e intensidad elctricas en variaciones de la
presin sonora.
La tecnologa de los altavoces ha variado poco desde su concepcin. Este dispositivo consta de una
bobina elctrica mvil adjunta a un cono de cartn al que hace vibrar. La bobina se mueve dentro del
campo magntico creado por un imn permanente. La seal amplificada se hace pasar por esta bobina que
crea un campo magntico que repele en mayor o menor medida al campo magntico del imn permanente
movindose, junto con la membrana.
La utilizacin de seales elctricas para conducir el sonido trajo muchas ventajas en el diseo de
aparatos reproductores de discos que empezaron a formar parte del mobiliario domstico. A su vez, la
circuitera de estos dispositivos iba complicndose aadiendo mandos de volumen, tono, ecualizadores,
etc...
Paralela a la evolucin de la grabacin en disco mediante aguja grabadora, surgi y evolucion la
grabacin magntica. En sta, el sonido una vez convertido a electricidad modula el campo magntico
de una bobina por la que pasa una cinta de plstico recubierta en su superficie de un material con alta
remanencia magntica a una velocidad constante. Las variaciones del flujo magntico magnetizan de
forma variable la seccin de cinta magntica situada en el entrehierro de la bobina. En la reproduccin
se hace pasar la cinta magnetizada por la bobina. Las variaciones del flujo magntico inducen una
pequea corriente en la bobina que, una vez amplificada, puede ser escuchada por el altavoz.
En todos los sistemas de grabacin de sonido vistos hasta ahora hay algo en comn: existe un medio
susceptible de ser impresionado por una energa que vara de la misma forma que lo hace el sonido que
se quiere almacenar. Esta impresin se realiza de manera continua, a lo largo de dicho medio,
almacenando desde sutiles cambios de volumen, hasta sonidos muy altos, existiendo una gama infinita
de volmenes intermedios, gama limitada slo, en principio, por las imperfecciones que pueda tener el
medio usado para la grabacin y a la precisin de los transductores usados en el proceso. Esta forma de
grabar sonido se denomina registro analgico.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.3
Cuando se ha explicado el proceso de grabacin en disco o cinta no se ha tenido en cuenta un factor
importante: el ruido. En efecto, todo proceso que conlleve la utilizacin de electricidad debe contar con
que los componentes electrnicos generan ruido en mayor o menor medida. Adems, la precisin de los
transductores no es ilimitada, por lo que el sonido escuchado no ser el mismo en una reproduccin que
en la siguiente. De hecho, la interaccin transductor-medio degrada este ltimo, de modo que cada vez
el sonido grabado se escucha un poco peor.
Para paliar en alguna medida este efecto se han diseado algunos sistemas tanto de reduccin de ruido
como para evitar producirlo. Entre los primeros se encuentra el sistema Dolby, que en su versin B (la
ms extendida en el mbito domstico) se usa en la grabacin y reproduccin de cintas magnticas. El
problema que intenta paliar este sistema es el llamado ruido de modulacin que se produce durante la
grabacin de la cinta. Este ruido existe durante todo el pasaje musical aunque normalmente se ve ahogado
por la diferencia de volumen del sonido grabado respecto a l; pero en pasajes musicales ms sosegados
s que se nota como un siseo o ruido blanco. Realmente no es un ruido blanco ya que su espectro de
frecuencias se sita en la parte alta del rango auditivo, a partir de los 7 Khz.
La manera en que funciona es la siguiente: se sabe experimentalmente cul es el nivel sonoro de este
ruido respecto a la seal grabada, y el rango de frecuencias en las que acta, as que en grabacin, se hace
pasar el sonido a grabar por un filtro activo de bajo ruido que sube el nivel sonoro tantos dB como los
que se sabe que posee el ruido de modulacin pero slo para frecuencias por encima de los 7 Khz. La
seal as obtenida se graba en la cinta, junto con el ruido de modulacin.
En la reproduccin la seal captada por la cabeza lectora lleva tanto la seal sonora como el ruido de
modulacin. Esta se hace pasar por otro filtro que acta de manera contraria al usado en la grabacin, esto
es, atena en un cierto nivel todas las frecuencias superiores a 7 Khz. Con esta atenuacin el ruido de
modulacin desaparece y la seal de sonido que antes se grab con dichas frecuencias amplificadas
recupera su nivel original.
En el terreno de la reproduccin de discos el problema al que haba que enfrentarse fue la diferencia
de nivel de seal entregada por la aguja del giradiscos es menor cuanto ms alta era la frecuencia a
reproducir. Esto es debido a que el vstago porta-aguja es relativamente largo lo que hace que su
frecuencia de resonancia sea menor, y por tanto, presente una inercia mecnica mayor en frecuencias
altas.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.4
La solucin adoptada se conoce como norma de ecualizacin RIAA. El sonido grabado en un disco
tiene atenuadas las bajas frecuencias y realzadas las altas frecuencias de manera que la aguja siempre
ofrece una inercia mecnica constante en todo el espectro de frecuencias audibles. La seal entregada al
amplificador pasa antes por el corrector RIAA que linealiza la seal de audio a la vez que la amplifica
para poder manejarla con el menor ruido posible.
Adems del problema del ruido, existe otro muy importante, debido a la mecnica encargada de mover
el medio de almacenamiento ante el transductor. Este movimiento que debera ser constante no lo es por
razones de precisin, y esto origina fluctuaciones en la frecuencia de la seal captada.
A principios de la dcada de los 80 los laboratorios de Philips crearon el disco compacto (compact
disc o CD). Este medio ofreca caractersticas revolucionarias respecto a sus predecesores, y todo ello
basndose en el registro digital.
Se ha indicado anteriormente que la informacin guardada mediante el registro analgico poda tomar
cualquier valor entre unos lmites, que por la imprecisin de los transductores, dicha informacin se
recuperaba de forma ms o menos ambigua, y que en el proceso de reproduccin era degenerativo, o sea,
que en cada reproduccin empeoraba la calidad del sonido.
Todo ello es debido a que el registro analgico traduce las variaciones de presin sonora en
variaciones de algn tipo de energa susceptible de ser almacenada, pero no nos ofrece ninguna garanta
de que estas variaciones almacenadas reflejen fielmente el sonido que las caus. Simplemente se limitan
a estar ah.
En el registro digital se intercala una operacin ms con la seal antes de ser grabada: la digitalizacin.
Esta operacin, a groso modo, asigna una serie de nmeros a una seal sonora, y son stos los que se
graban en el medio. Las ventajas de codificar seales mediante nmeros son mltiples: en principio, y
dado que son nmeros, se puede operar con ellos normalmente, y segn la operacin se modificar de una
forma u otra la seal a la que van asociados. Esto se denomina procesamiento digital.
Adems de esto, su grabacin es ms sencilla y fiable. Ya no hay que tratar con variaciones sutiles de
la informacin porque un nmero se puede almacenar en formato binario con lo que slo necesitamos
discernir entre dos niveles de informacin, que se pueden escoger de manera que el error producido al
confundir uno con otro sea muy pequeo.
Si a esto aadimos que se pueden aprovechar todos los mecanismos de deteccin y correccin de
errores, compresin de datos, etc... podemos asegurar que el registro digital es mucho ms fiable que el
analgico, aunque no est exento del todo del problema del ruido.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.5
El primer soporte digital fue, como ya se apunt, el CD. Este emplea para almacenar la informacin
binaria tiras de agujeros y no-agujeros formando una espiral desde el borde del disco hasta su centro.
Cada pequeo agujero llamado depresin representa un 0, mientras que la no existencia de agujero en una
zona representa un 1.
El CD se lee mediante un rayo lser hacindolo incidir en dichos agujeros, y reflejndose hacia una
parte u otra segn lo haya o no. De esta manera se recuperan los datos numricos grabados en el disco
y se tratan por el sistema reproductor digital.
Con la llegada de los ordenadores electrnicos, que funcionan bajo el mismo principio de unos y ceros,
el registro digital se lig de manera permanente a ellos, aprovechndose de su potencia de clculo. De
esta manera, la informacin musical no solo se guarda en discos CD sino tambin en la memoria de un
ordenador, o en un simple fichero en el disco duro. Slo vara el mecanismo para leer dichos datos
numricos.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.6
1.2.- Descripcin del proceso de digitalizacin
La digitalizacin de un sonido es el proceso por el cual se representa una seal sonora mediante una
serie de dgitos que merced a un proceso contrario devuelve la seal original.
Se ha comentado el hecho de que los sistemas de registro analgico tienen una precisin terica
infinita. Esto es, pueden almacenar cualquier nivel de seal que est dentro de los lmites aceptados por
el sistema de registro. Esto no se cumple en el registro digital, en el cual se graban "instantes" de la seal
sonora. Se demostrar intuitivamente que, para el caso del sonido, estos instantes grabados nos permiten
reconstruir la seal entera sin prdidas.
Antes de pasar a la seccin siguiente, conviene recordar que estamos manejando seales con
frecuencias comprendidas entre 20 y 20.000 Hz que corresponde al rango de percepcin del odo humano.
Este tipo de seal, por tener un mnimo y un mximo de frecuencia se denomina seal limitada en
banda. Esta limitacin ser la que permita al sistema de registro digital poder trabajar perfectamente.
Las etapas de la digitalizacin del sonido son dos: discretizacin y cuantizacin.
1.2.1.- El proceso de discretizacin.
Se ha introducido la cuestin de que para digitalizar un sonido hay que tomar muestras del
volumen del mismo. Ahora bien, cuntas muestras hay que tomar para poder decir que se ha
guardado toda la informacin que contiene esa seal?. Para dar respuesta a esta pregunta es
necesario analizar el tipo de informacin que contiene una seal de audio. [GRE89]
A partir de ahora la consideraremos como una funcin en el tiempo que toma un valor
determinado de volumen V comprendido ente un mximo y un mnimo, en cada instante de
tiempo t.
Esta funcin es continua en el tiempo, como lo son prcticamente todas las funciones que
reflejan sucesos de la Naturaleza, y adems el estar limitada en banda, el volumen no puede variar
muy rpidamente en un intervalo de tiempo muy pequeo.
Teniendo en cuenta estas premisas vamos a estudiar la seal de audio desde el punto de vista
de la frecuencia.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.7
Figura 1.2.1.1: Seal analgica de audio.
1 2
Sea S(t) definida en [t ,t ] una funcin que representa a una seal de audio limitada en banda
como ya se ha descrito, en un intervalo de tiempo (Fig. 1.2.1.1). Entonces dicha funcin se puede
escribir de la forma siguiente:
n n
S(t)=E a cos(nT)+b sen(nT)
Lo cual nos dice que cualquier seal de audio puede ser generada a partir se seales
sinusoidales de frecuencias 1/T, 1/2T, 1/3T, etc...
Estas seales son los armnicos de la seal original. Al estar la seal limitada en banda la
suma de armnicos anterior ser finita, siendo el ltimo trmino de la suma el correspondiente
al armnico de frecuencia igual a la frecuencia mxima que genera la seal que son 20.000 Hz.
n n
Los a y b son los coeficientes de Fourier de la seal y expresan el volumen que la seal posee
para cada frecuencia en particular.
La idea entonces consiste en averiguar cunta informacin hace falta para poder reproducir sin
problemas el armnico de frecuencia ms alta. Si nos fijamos en la componente de 20.000 Hz,
vemos que consiste en una seal sinusoidal que parte del cero, alcanza un valor mximo, vuelve
a pasar por cero, alcanza un valor mnimo, y vuelve otra vez a 0.
Por ser una seal sinusoidal sabemos cmo generarla. Tambin sabemos cul es su frecuencia;
lo nico que nos deben dar son los valores mximo y mnimo que toma, lo que nos da:
f(t)=MAXIMO*sen(2*B*20000t) si 0#t<B
f(t)=MINIMO*sen(2*B*20000t) si B#t#2B
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.8
Figura 1.2.1.2: Seal de audio discretizada en el tiempo.
Esto nos dice que bastan dos muestras por perodo para reconstruir la componente de mxima
frecuencia de la seal de audio. El mismo razonamiento sigue para frecuencias inferiores a sta,
slo que la funcin f(t) resultante tendr ms de dos ramas, pero se reconstruir con ms facilidad
que si fueran slo dos. Ello nos conduce a la conclusin de que para digitalizar una seal de audio
limitada en banda y con una frecuencia mxima de 20.000 Hz hay que tomar como mnimo,
muestras a una frecuencia de 40.000 Hz.
Esta frecuencia de muestreo mnima, hallada aqu de forma intuitiva, es el resultado de aplicar
el teorema fundamental del muestreo, y la frecuencia obtenida se suele llamar frecuencia de
Nyquist [ANG90]. En la figura 1.2.1.2 se puede observar la toma de muestras a la seal original
en determinados instantes.
Cada instante de sonido muestreado se traducir en una posicin en la memoria de
almacenamiento digital de nuestro sistema de registro digital. Se ve que cuanto ms alta es la
frecuencia mxima mayor debe ser la frecuencia de muestreo, y por tanto mayor ser el espacio
ocupado por la grabacin digital.
En la prctica no se emplea la frecuencia mnima de muestreo de 40.000 Hz para registrar un
sonido, sino que se usan 44.100 Hz. Esto se debe a lo siguiente: [CHR93] [GRE89]
Durante la reproduccin del sonido digital se generan tres seales: una es la seal que se est
s
oyendo en ese momento y tiene una frecuencia f ; las otras dos tiene como frecuencias la suma
m s
y la diferencia de la frecuencia de muestreo f con la frecuencia de la seal f . Para la
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.9
Figura 1.2.1.3: Comportamiento del filtro pasabajos
reconstruccin de la seal de audio se usa un filtro paso-bajo con una frecuencia de corte de
20.000 Hz, pero este filtro no tiene una pendiente de atenuacin infinita, sino que el nivel de seal
que pasa por l desciende a un determinado ritmo. As, si el filtro es de primer orden atenuar 20
dB/octava y si es de segundo orden, 40 dB/octava. Se pueden construir filtros de mayor orden,
pero resultan ms costosos y ms sensibles a perturbaciones, autooscilaciones, etc...
Por tanto el filtro que se emplea tiene una determinada pendiente de atenuacin para seales
mayores que 20.000 Hz, asegurando una atenuacin muy fuerte al llegar a los 40.000 Hz.
m s
Obviamente la componente generada f +f no llegar al sistema amplificador, pero la componente
m s
f -f puede caer dentro del lmite superior de la banda de audio y cruzar sin problemas el filtro
pasa-bajos aadindose a la seal de audio y distorsionarla.
s m s
Dado que f como mucho valdr 20.000 Hz, y queremos que f -f sea lo suficientemente alta
m
para que no cruce el filtro, se sube f hasta 44.100 Hz, con lo que la primera componente residual
m s
f -f valdr 24.100 Hz, ms de 4 Khz respecto a la frecuencia de corte de 20.000 Hz, con lo que
nos aseguramos de que dicha componente ser rechazada por el filtro, aunque ste no tenga una
pendiente de atenuacin fuerte (Figura 1.2.1.3).
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.10
Figura 1.2.2.1: Seal de audio discretizada y cuantizada.
1.2.2.- El proceso de cuantizacin.
Es el proceso en el cual se aproxima el valor real de cada muestra a un valor definido y con
un formato manejable por el ordenador. Al contrario que en la discretizacin en la que no se
produca ninguna prdida de informacin si se trabaja con la frecuencia adecuada, en este caso
se va a producir un error inherente al proceso, que en el caso de una seal de audio puede ser
tolerable con una cierta facilidad. [GRE89]
Grficamente hablando, se puede ver la cuantizacin de la siguiente manera: si tenemos la
seal de audio ya muestreada y la representamos en los ejes de tiempo y volumen como se hizo
con la seal original, la grfica resultante ser un conjunto de puntos con una distancia horizontal
entre cada uno de ellos igual al perodo de muestreo (el inverso de la frecuencia de muestreo).
Cada punto corresponde a un valor en el eje de los tiempos correspondiente al instante en que se
tom esa muestra, y otro valor en el eje de volmenes que corresponde al volumen de la seal en
ese instante.
Si ahora trazamos lneas horizontales paralelas al eje de tiempos y asignamos un nmero a
cada una de ellas, se observar que los puntos que componen nuestra grfica caen en la gran
mayora entre dos de estas lneas (que llamaremos niveles de cuantizacin o niveles de
decisin). La cuantizacin consistir entonces en sustituir el valor real de volumen de cada
muestra por el nmero correspondiente a la lnea horizontal que tengan ms cerca. Ese nmero
ahora tendr un valor definido y dentro de un rango conocido, por lo cual se puede almacenar de
manera convencional en la memoria (figura 1.2.2.1).
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.11
El error cometido en el proceso de cuantizacin de cada muestra ser igual (de forma grfica)
a la distancia entre el punto que representa a la muestra y la lnea que se ha elegido como
aproximacin. Se intuye que cuantas ms lneas se utilicen, menor ser el error cometido y por
tanto mayor ser la calidad del sonido digitalizado; pero esto tiene un inconveniente y es la
cantidad de memoria que se necesita para almacenar el valor de cada muestra. Si usamos 16
niveles de cuantizacin podemos almacenar dos muestras por byte, con una calidad de sonido
bastante regular a no ser que se trate de seales simples o voz humana. Si se usan 256 niveles,
tendremos una muestra por byte con una calidad de sonido muy buena para propsitos generales,
y si se usan 65536 niveles de cuantizacin el sonido resultante no podr distinguirse del original
pero cada muestra ocupar dos bytes.
Una medida de la calidad del sonido en un sistema de audio es la relacin seal/ruido (SNR)
que se define como:
Entonces se demuestra que una seal digitalizada con n bits (lo que significa 2 niveles de
n
cuantizacin) tiene una SNR igual a:
SNR=4,6+6n
Para fijar ideas, tener en cuenta que la SNR que da un plato giradiscos es mayor de 40 dB, y
que un lector de CD puede alcanzar sin problemas los 90 dB.
Pero el problema fundamental con que se tiene que enfrentar los sistemas de audio digitales
consiste en un tipo de distorsin que se deriva del proceso de cuantizacin y que se denomina en
algunos textos como distorsin de cruce cero.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.12
Cuando se escucha en un sistema de audio convencional una pieza musical que contiene
pasajes a bajo volumen, nuestro odo capta los sutiles matices de volumen que se producen
durante ste. Estos cambios tenues de volumen se producen a nivel elctrico muy cercanos al
punto de 0 voltios que corresponde al punto esttico de trabajo del circuito amplificador del
sistema. Al variar muy poco el punto de trabajo dinmico del punto esttico la fidelidad con la
que se reproducen esos sonidos es mayor que si el volumen fuera mayor. En este ltimo caso el
punto de trabajo dinmico se aleja del punto esttico y se corre el peligro de saturar la etapa de
amplificacin dando lugar a lo que se conoce como distorsin de corte.
En cambio, si se escucha el mismo pasaje en un sistema digital ocurre lo contrario. En este
caso, al digitalizar la parte a bajo volumen, las muestras quedan casi todas contenidas entre dos
nicos niveles de cuantizacin perdiendo todos los pequeos cambios de volumen por no haber
niveles intermedios. Un fenmeno acusado de este tipo causa un ruido como un crujido
acompaando al pasaje de bajo volumen. Este crujido es causado por las transiciones bruscas de
un nivel de cuantizacin al inmediato superior o inferior en lugar de hacer una transicin suave
como estaba previsto en la seal original.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.13
1.3.- Tecnologa de la digitalizacin del sonido.
En el tratamiento digital del sonido existen dos dispositivos fundamentales: el ADC o conversor
analgico-digital, y el DAC o conversor digital-analgico.
Alrededor de estos dos dispositivos existen otros auxiliares que potencian y ayudan en el diseo de
un sistema digital. Como ejemplo se pueden citar los circuitos de muestreo y retencin, los circuitos de
retardo analgico, los filtros digitales, los circuitos de compresin ADPCM y los DSP (procesadores
digitales de seal) que combinan muchos de stos ltimos. [TRA87]
El conversor analgico-digital.
Muestrea la seal de audio existente en su entrada y la codifica entregando su valor binario en un bus
de salida. La seal entra a un circuito de muestreo y retencin que funciona como una memoria analgica
reteniendo el valor de tensin que aparece en la entrada cuando el circuito recibe un pulso activo. Este
pulso se repite con una cadencia igual a la frecuencia de muestreo que se aplica a la seal.
La tensin almacenada sirve de entrada al conversor propiamente dicho. Este necesita una tensin
constante en su entrada para poder cuantizarla sin errores, y por eso se hace pasar antes por el circuito de
muestreo y retencin.
Hay varias tcnicas para realizar la cuantizacin. La ms sencilla y a la vez la ms rpida, pero
tambin la ms cara es la usada por los llamados ADC flash-converter. Estos disponen de una batera de
2 comparadores analgicos dnde n es el nmero de bits de resolucin del conversor. Cada comparador
n
compara la seal de entrada con una fraccin de la seal mxima que soporta el ADC y entrega un valor
binario como resultado. Los 2 resultados se aplican a un codificador que proporciona la salida en
n
notacin binaria convencional, o en complemento a 2.
Este tipo de ADC no precisa de una seal de reloj para su funcionamiento ya que todos los elementos que
intervienen son combinacionales. Con frecuencia ni siquiera necesitan de un circuito S&H (muestreo y
retencin) ya que son muy rpidos. El coste de este tipo de ADC viene dado por la necesidad de integrar
en el CI los 2 comparadores. Para una resolucin de 8 bits se necesitan 256 comparadores, y para 16 bits
n
se necesitaran 65.536.
Otro tipo de ADC es el de cuenta y comparacin o ADC rampa (Figura 1.3.1). Es de un diseo muy
sencillo pero resulta demasiado lento para algunas aplicaciones. La seal de audio muestreada por el S&H
es enviada a un comparador analgico. La otra entrada del comparador viene de la salida de un DAC que
controla un contador. Inicialmente este contador est a 0, y cuando se inicia la conversin, el
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.14
Figura 1.3.1: Cronograma de una conversin con un ADC rampa.
contador empieza a incrementar su cuenta, con lo que la tensin aplicada al comparador empieza a
acercarse a la de la seal. En el momento en que la rebasa, el comparador conmuta su salida lo que hace
parar al contador. El valor presente en ese momento en el contador es el valor binario de la seal que
queremos digitalizar.
De concepcin parecida al anterior pero ms rpido es el ADC de aproximaciones sucesivas. En ste
se cambia el contador por un SAR (registro de aproximaciones sucesivas). Con este mtodo se emplean
n ciclos de reloj para realizar la conversin. El SAR se carga inicialmente con el valor 1000.....0 y se
realiza la primera comparacin. Si la seal de entrada es mayor que la del SAR se deja el bit ms
significativo como est; si no, se pone a 0. En el siguiente ciclo de reloj se repite el proceso para el bit
n-1 ponindose en principio a 1 y conmutando a 0 segn la comparacin. Al cabo de los n ciclos el valor
contenido en el SAR es el valor digital que ms se aproxima a la seal de entrada (Figura 1.3.1).
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.15
Figura 1.3.2: Cronograma de una conversin con un ADC de aproximaciones sucesivas.
El conversor digital-analgico.
Toma en su bus de entrada los datos digitales ms una seal de validacin, si fuera necesaria, y genera
una tensin analgica proporcional a dicho dato. Son dispositivos ms sencillos en cuanto a su
concepcin, pero deben ser muy precisos.
En su concepcin ms simple se compone de una red de resistencias ms unos interruptores analgicos
controlados por cada uno de los bits del dato a convertir. Cuando un bit est a 1 cierra un interruptor y
deja pasar una cierta cantidad de intensidad a travs de la red. Las diferentes combinaciones de 1's y 0's
hacen variar la intensidad total en la red, y gracias al diseo de sta, se produce en al salida del conversor
una intensidad o una tensin proporcional al valor binario del dato de entrada.
La seal que proporcionan a la salida debe ser filtrada para linealizar la seal de salida. Si no se filtra,
sta aparece en el osciloscopio como una seal analgica discontinua, tal y como la entrega el S&H.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.16
1.4.- Manipulacin de seales digitalizadas: efectos de sonido.
Con la posibilidad de poder convertir seales de audio a nmeros se ampliaron las posibilidades de
post-produccin del sonido. Esto es, alterarlo una vez grabado.
Con el registro analgico convencional, a pesar de sus limitaciones, se haban diseado algunos
efectos: se poda cambiar la velocidad y el sentido de la reproduccin, se poda distorsionar el sonido,
modularlo en frecuencia y/o amplitud para conseguir efectos de vibrato y trmolo, e incluso se haban
diseado generadores de eco analgicos, que usaban un muelle fijado por uno de sus extremos a un
altavoz, y por otro a un micrfono. El sonido emitido por el altavoz haca vibrar el muelle provocando
un sin fin de rebotes en el mismo, que eran captados por el micrfono y vueltos a amplificar.
Todo esto hizo posible la aparicin de la llamada msica concreta en Francia, precursora de la actual
msica electrnica. En aquella el sonido era sometido a estos efectos, haciendo montajes sobre cinta con
las nuevas grabaciones alteradas.
El registro digital no slo permite la realizacin de todos estos efectos, sino que adems permite otros
no posibles con el registro analgico, y adems sin coste alguno de dispositivos, ya que todos los efectos
se pueden realizar mediante clculos matemticos con los datos digitales dentro de la memoria de un
ordenador. Existen, no obstante, circuitos que proporcionan de manera directa y en tiempo real estos
clculos de efectos sonoros: son los DSP o procesadores digitales de seal.
A continuacin se escribirn algunos de estos efectos y su forma de calcularlo. [BIN88]
Distorsin: consiste en multiplicar cada dato digital por una constante positiva lo suficientemente grande
para que alguno de los resultados excedan del rango de los datos digitales. Esto es, supongamos que
trabajamos con 8 bits, y nuestro rango va desde el -128 hasta el 127, entonces, al multiplicar la secuencia
-100, -45, -18, 0, 26, 50, 80, 125 por 3 nos da la siguiente: -128, -128, -54, 0, 78, 127, 127, 127. Los
valores que al ser multiplicados exceden del rango son truncados al valor mximo dentro del rango. Esto
se traduce grficamente en que la seal sufre un corte tanto en el lado positivo como en el negativo. La
distorsin producida se llama distorsin de corte.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.17
Procedimiento Distorsion (A[1..n], factor)
para i:=1 hasta n hacer
temp:=A[i]*factor
si temp>MAXIMO
temp:=MAXIMO
sino
si temp<MINIMO
temp:=MINIMO
finsi
finsi
A[i]:=temp
finpara
Fin
Eco y reverberacin: el eco consiste en una repeticin del la seal a causa de una reflexin de la onda
en una pared, con una cierta prdida de potencia.
Para que se pueda hablar de eco, la distancia entre el foco emisor de sonido y la pared debe ser mayor que
17 metros. Estos porque para que el odo humano perciba dos sonidos como sonidos diferentes deben
estar distanciados 0.1 segundos uno respecto al otro como mnimo.
Si no se cumple este requisito, el efecto se denomina reverberacin.
El efecto se puede crear mezclando la seal de audio consigo misma, retrasada en el tiempo. Para
retrasarla se puede emplear una memoria gestionada como una cola FIFO, de cuya longitud depender
el retraso obtenido (Figura 1.4.1).
Procedimiento Eco (A[1..n], retardo, atenuacion)
para i:=1 hasta n-retardo hacer
A[i+retardo]:=(A[i+retardo]+A[i]*atenuacion)/2
finpara
Fin
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.18
Figura 1.4.1: Diagrama de bloques de una unidad de ECO digital.
Phasing: es un tipo de reverberacin en el que la seal slo es retrasada unas cuantas muestras. En este
caso se percibe un slo sonido, al estar mezclado dicho sonido con otro casi igual que l, se producen
mltiples reforzamientos y cancelaciones de fase que originan una falsa sensacin de variacin del "pitch"
o afinacin de dicho sonido.
Sliding: efecto parecido al que hacen los guitarristas al deslizar los dedos por una de las cuerdas para
alterar suavemente su tono. Se crea variando la frecuencia de muestreo en reproduccin suavemente.
Filtraje digital: consiste en someter los datos digitales a una transformada de Fourier, para despus
eliminar sencillamente las componentes de frecuencia no deseadas. Al resultado se le aplica una
transformada inversa. La seal de salida es la versin filtrada de la entrada. Una versin de este
procedimiento aplicable en tiempo real usa la transformada inversa de Euler.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.19
Procedimiento Filtrar_Bajos (A[1..n], frecuencia)
B[1..n]=(0,0,0,......,0)
Transformada_Fourier (A[1..n],B[1..n])
para i:=frecuencia hasta n hacer
A[i]:=0
B[i]:=0
finpara
Transformada_inversa (A[1..n],B[1..n])
Fin
Otra implementacin de este efecto se consigue usando la transformada Z de la seal de entrada y la del
filtro a construir. Esta opcin resulta en un algoritmo al que se le dan los valores de entrada de la seal
y va produciendo los valores de salida ya filtrados. La sencillez del mtodo posibilita su uso en tiempo
real.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.20
Donde w es la frecuencia de corte del filtro, y T es el perodo de muestreo de la seal a filtrar.
Falso estreo: usa la sensacin de profundidad que crea el efecto reverberacin, pero esta vez no mezcla
las dos seales sino que enva cada una a un altavoz distinto.
Procedimiento Estereo (A[1..n], profundidad)
para i:=1 hasta n-profundidad hacer
DAC_Izquierdo (A[i])
DAC_Derecho (A[i+profundidad])
finpara
Fin
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.21
1.5.- Compresin del sonido digitalizado.
La digitalizacin de un sonido supone una lista bastante extensa de nmeros que deben almacenarse
en la memoria de un ordenador o el dispositivo de almacenamiento que precise (CD, cinta digital, etc...).
Cada uno de estos dgitos ocupa un espacio fsico en dicho medio, por lo que cuanto ms largo sea el
sonido a digitalizar ms ocupar en memoria.
Sin embargo, la lista de dgitos resultante del proceso de digitalizacin tiene una caracterstica que
permite "adivinar" hasta cierto punto cul es el siguiente dato de la lista: al ser dicha sucesin las
imgenes de una funcin continua cuyos puntos estn muy prximos unos de otros y a una distancia
constante, las imgenes tambin estarn muy cerca. Por otra parte almacenar cada punto de la imagen
cuesta un nmero determinado de bits, dependiendo de la resolucin del muestreo. Ahora bien, al ser los
elementos de esta sucesin muy prximos en valor unos de otros, podemos almacenar la diferencia de
valor que hay de un elemento al siguiente. Esta diferencia ser un nmero muy sencillo que puede ser
almacenado con menos bits que el elemento original.
Ejemplo: sea la sucesin 0,2,2,4,5,7,10,9,8,8. Si la resolucin a la que fueron tomadas estas muestras
fue de 16 bits, la sucesin completa ocupar 20 bytes (160 bits). Si en lugar de eso almacenamos sus
diferencias obtenemos la sucesin:
0,2,0,2,1,2,3,-1,-1,0. El primer valor no es una diferencia, sino el primer elemento de la sucesin de
partida; se puede reconstruir la sucesin original a partir de esta sumando todos los elementos desde el
primero hasta aqul cuya posicin es la del elemento que queremos hallar.
Ahora cada elemento puede guardarse en complemento a 2 en un espacio de 3 bits, lo que da para este
ejemplo una ocupacin total de 30 bits. 5 veces menos que la sucesin original.
Al formato usado en la sucesin de partida, en dnde los datos estn sin comprimir se le llama PCM
(Pulse Code Modulation) o modulacin por pulsos codificados. La sucesin con los elementos
comprimidos est en formato DPCM (Delta PCM).
El inconveniente de este sistema de compresin aparece cuando la diferencia entre un elemento y el
siguiente es tan alta que sobrepasa la capacidad del formato de bits elegido para los elementos
comprimidos. En ese caso se almacena la mxima diferencia admisible por el formato y se continan los
clculos con el valor modificado.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.22
Ejemplo: si en la sucesin anterior, con el formato comprimido de 3 bits contina de esta forma.
..,9,8,8,2,0,3,... la versin comprimida sera ..,-1,-1,0,-4 (porque -6 no cabe en 3 bits), -4 (en lugar de -2,
ya que ahora la sucesin ha cambiado a 9,8,8,4,0,3), 3,...
Con la aparicin del mini-disc de Sony con un menor tamao y con la capacidad de poder ser grabado
por el usuario, se hizo necesaria la introduccin de nuevas tecnologas de compresin del sonido. La
usada por Sony se aprovecha de las "deficiencias del odo humano que es incapaz de percibir
determinados matices de la msica que aunque se registran en el CD normal, no son percibidos por el
oyente.
El sistema mini-disc emplea una doble tcnica de compresin durante la grabacin: una vez
digitalizada la seal sta es enviada en grupos de 1 Mbit hacia una memoria intermedia que sirve a la
unidad de control para la calibracin de la velocidad de giro del disco. Cada grupo de seal se hace pasar
por un DSP que realiza una transformada de Fourier de los datos, y a partir de aqu empieza la
compresin.
No todos los datos resultantes de la transformacin se graban: siguiendo la curva de respuesta en
frecuencia del odo humano se descartan aquellas frecuencias cuya potencia no alcanza el umbral mnimo
para ser percibidas, por otra parte todas aquellas componentes en frecuencia cuya potencia sea muy
pequea en comparacin con las componentes inmediatas en valor tambin son descartadas ya que la
componente de mayor potencia "ahoga" a la de menor potencia con lo que tampoco es percibida por el
odo.
Las componentes de frecuencia que han pasado esta doble seleccin son las que se realmente se
graban, en formato de 16 bits junto con las marcas de inicio y fin de bloque, y las seales que indican que
falta una determinada componente frecuencial. En la reproduccin se van leyendo bloques de seal a una
gran velocidad y son transformadas de nuevo a sucesiones de datos temporales que pasan por un
conversor D/A de 16 bits para ser escuchadas.
Gracias a esta tcnica de compresin se pueden grabar hasta 70 minutos en un disco de 3,5 pulgadas.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.23
1.6.- Almacenamiento del sonido digitalizado.
A continuacin, y como ejemplo de las tcnicas discutidas anteriormente, describiremos la tecnologa
de codificacin del sonido en un Compact Disc [RIF91]
El sistema de almacenamiento y reproduccin del CD fue diseado, conjuntamente por Philips y Sony
en junio de 1980.
La seal analgica que transmite el sonido es muestreada 44.100 veces por segundo y, a cada muestra,
se le asigna un valor numrico (amplitud de la seal) ente 0 y 2 -1. Este valor da un vector binario de
16
16 componentes, que escribiremos como dos elementos de GF(2 ). Teniendo en cuenta que
8
transmitiremos seal estreo, cada muestra estar formada por cuatro elementos de GF(2 ), dos para el
8
canal derecho y dos para el canal izquierdo.
La informacin es grabada despus de haberla codificado concatenando dos cdigos RS sobre GF(2 ),
8
con interleaving. La longitud de estos cdigos es n=2 -1=255, su dimensin es k=n-d+1=251 y su
8
distancia mnima es d=5.
En el canal interno de la concatenacin no se usa el cdigo RS(255,d=5), sino el cdigo recortado
hasta una longitud de n=28. Por abuso de lenguaje diremos que utilizamos un cdigo RS(28,d=5), sobre
GF(2 ). En el canal externo de la concatenacin se usa el mismo cdigo RS, recortado hasta longitud
8
n=32; hablaremos del cdigo RS(32,d=5).
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.24
En el esquema siguiente se recogen los rasgos ms caractersticos del proceso de concatenacin.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.25
La grabacin en disco se hace en una pista espiral marcando, fsicamente, reas planas y hundidas.
Cada vez que ocurre una transicin de un rea plana a una rea hundida, o viceversa, se lee un 1 y en caso
contrario se lee un 0, segn la longitud de la zona recorrida sin cambiar de rea. Por ejemplo, en la figura
1.6.1 observamos la secuencia 00 1 000 1 000000 1 00 1 0000 1 000, grabada en el disco.
La transicin entre reas viene dada por los cambios de intensidad de la luz reflejada por el disco,
proveniente de una fuente lser.
Por razones tcnicas, en cada rea debe haber un mnimo de dos ceros y un mximo de diez. En
principio, los bits que salen de la ltima matriz de interleaving no cumplen la propiedad anterior y, por
tanto, antes de proceder a la grabacin definitiva hay que arreglar la situacin. Esto se consigue con la
tcnica EFM, que transforma cada smbolo de GF(2 ) en una secuencia de 17 bits con las propiedades
8
requeridas. Adems, a cada trama de 544 bits se le aaden 27 bits de sincronizacin y de
direccionamiento, que permitirn la bsqueda rpida de la informacin.
En total, cada 6 muestras iniciales (24 elementos de GF(2 ) = 192 bits) se transforman en 571 bits
8
571 3
grabados en el CD. La tasa de transmisin de la informacin es de / / . La tasa de transmisin de
192 1
32 28 32
la informacin, considerando nicamente los cdigos, vendra dada por k = ( / ) ( / ) = / = 3/4.
28 24 24
Cada segundo de msica necesita 44.100 muestras, y cada una 571/6 bits. En definitiva, 4,2
Mb/segundo. Cada disco tiene una capacidad de unos 20.000 Mb que, traducido a tiempo, representa unos
80 minutos de audicin.
MULTIMDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 1.26
Funcionamiento de los dos cdigos concatenados. Proceso CIRC (Cross Interleaved Reed-Solomon
Code). El cdigo RS(32,28) tiene una distancia mnima d=5, puede corregir 2 errores o bien se puede
utilizar para corregir un error y detectar 3. En nuestro caso lo utilizaremos para corregir un nico error.
Si en el decodificador encontramos un error lo corregimos. En caso contrario, daremos como borrones
los 28 smbolos que salen del decodificador y entran en el canal externo.
El decodificador externo RS(28,24) tiene distancia mnima d=5 y lo utilizaremos para corregir 4
borrones. Tal como est montada la matriz de interleaving, es posible que este cdigo corrija hasta un
mximo de 112x4=448 borrones de GF(2 ), es decir 3584 bits de datos, que quedan en 3072 bits de
8
informacin real, equivalentes a unos 3 mm en una pista del CD.
Adems, en el caso de que un vector a decodificar en el cdigo externo tenga ms borrones que los
que se pueden corregir, se dara como nulo y, en su lugar, se hara la interpolacin de las palabras anterior
y posterior.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
2. INTRODUCCION AL HARDWARE DE
AUDIO DEL COMMODORE AMIGA.
2.1.- El circuito integrado 8364 o PAULA.
Paula es uno de los circuitos de propsito especfico diseados exclusivamente para el
Commodore Amiga. Las tareas de Paula conciernen principalmente en el rea de E/S, esto es, el sistema
de disquetes, el puerto serie, el sonido y la lectura de datos analgicos desde el joystick. Adems Paula
se encarga de todo el control de las interrupciones del sistema. Todas las interrupciones que ocurren en
el Amiga pasan a travs de este integrado. A partir de las 14 posibles fuentes de interrupciones Paula crea
las seales de interrupcin para el 68000. Las interrupciones en los niveles 1-6 se generan por las lneas
IPL del 68000. Paula ofrece al programador la posibilidad de permitir o prohibir cada una de las 14
fuentes de interrupciones. [CHR93]
Las transferencias de datos desde disco y la generacin de sonido se realizan usando DMA. A
causa de que el controlador general de DMA del Amiga, Agnus, no sabe cundo est disponible el
prximo dato para la transferencia DMA, Paula tiene una lnea de peticin de DMA, DMAL.
A continuacin se describen las funciones de cada pin.
Bus de datos: D0-D15
Conectado al bus de datos del sistema.
Bus de direcciones de registro: RGA 1-8
Conectado al bus de direcciones. Direcciona los registros internos del chip.
Seales de reloj CCK, CCQ, y pin de rset RES
Peticin de DMA: DMAL
Por esta lnea, Paula indica al controlador DMA que se necesita una transferencia DMA..
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Salidas de audio: AUDL y AUDR
Las salidas AUDL y AUDR (audio izquierdo y audio derecho) son salidas analgicas en dnde Paula
sita las seales de audio generadas. AUDL lleva los canales 0 y 3, y AUDR los canales 1 y 2.
Las lneas del interfaz serie: TXD y RXD.
Las entradas analgicas POT0X, POT0Y, POT1X, POT1Y.
Las lneas de manejo del disco: DKRD, DRWD, DKWE.
Las lneas de interrupcin: INT2, INT3, INT 6 y IPL0, IPL1 e IPL2.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
2.2.- Descripcin del funcionamiento del sistema de audio en el
Amiga
Centrndonos en el tema de la generacin de sonido, PAULA est dotada de 4 generadores de
sonido digital que no son ms que 4 conversores D/A que muestrean datos desde la memoria a travs de
otros tantos contadores de DMA. Los canales 0 y 3 se mezclan analgicamente y salen por el canal
izquierdo; los canales 1 y 2 lo hacen por la salida derecha.
Cada canal de audio tiene su propio canal de DMA. Dado que la lgica de DMA en el Amiga
opera con palabras de 16 bits se combinan dos muestras en una sola palabra, por esta razn, se necesita
un nmero par de muestras por cada canal. El byte ms significativo se enva siempre antes que el byte
menos significativo.
El conversor D/A requiere que las muestras se almacenen como nmeros de 8 bits en
complemento a 2. A continuacin se ofrece un ejemplo de cmo se almacenan dichas muestras. En ste
y en los dems ejemplos de programacin del 8364 se asumir que estamos en el entorno hardware y
software de un Amiga 500.
Start:
dc.b 0, 49, 90, 117, 127, 117, 90, 49, 0, -49, -90, -117, -128, -117, -90, -49
End:
Ahora se debe seleccionar uno de los 4 canales sobre el cual se ejecutar la muestra. El canal de
DMA correspondiente se debe inicializar. Para inicializar los parmetros usaremos 5 registros por cada
canal. Los dos primeros forma un par de registros de direcciones: son AUDxLCH y AUDxLCL, o juntos,
AUDxLC dnde x es el nmero de canal de DMA correspondiente.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Registro Nombre Funcin Contenido
$0A0 AUD0LCH Puntero a los datos de audio
para el canal 0
Bits 16-20
$0A2 AUD0LCL Bits 0-15
$0B0 AUD1LCH Puntero a los datos de audio
para el canal 1
Bits 16-20
$0B2 AUD1LCL Bits 0-15
$0C0 AUD2LCH Puntero a los datos de audio
para el canal 2
Bits 16-20
$0C2 AUD2LCL Bits 0-15
$0D0 AUD3LCH Puntero a los datos de audio
para el canal 3
Bits 16-20
$0D2 AUD3LCL Bits 0-15
Para la inicializacin de estos punteros podemos usar (en el Amiga) la instruccin MOVE.L del
68000:
LEA $DFF000,A5 ; Colocar direccin base de los registros del Amiga.
MOVE.L #Start,AUD0LCH(A5)) ; Inicializar AUD0LC al principio de la tabla de muestras.
De manera anloga se debe indicar la longitud de la muestra (en palabras de 16 bits) en el registro
AUDxLEN apropiado.
Reg. Nombre Funcin
$0A4 AUD0LEN Longitud de la muestra en palabras para el canal 0
$0B4 AUD1LEN Longitud de la muestra en palabras para el canal 1
$0C4 AUD2LEN Longitud de la muestra en palabras para el canal 2
$0D4 AUD3LEN Longitud de la muestra en palabras para el canal 3
Para inicializar el valor de la longitud se usar la siguiente instruccin MOVE.W:
MOVE.W #(End-Start)/2, AUD0LEN (A5)
Ntese que hemos usado el valor de las etiquetas Start y End definidas en el trozo de cdigo que
corresponde a la tabla de muestras para el canal 0. La diferencia de End-Start es la longitud en bytes de
la muestra. Como necesitamos un valor en palabras, dividimos el resultado entre 2.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Ahora programaremos al 8364 para que "toque" la muestra a un determinado volmen. El valor
del volmen ser un nmero entre 0 y 64, dnde 64 representa un nivel de 0 dB, 1 corresponde a un nivel
de -36.1 dB y 0 corresponde a un nivel de -4 dB. De esta manera el valor de la muestra queda
multiplicado por la fraccin VOLUMEN/64.
Realmente, en el 8364 (a diferencia de lo que despus veremos en el PC) cada muestra NO se
multiplica por la fraccin anterior de manera digital, ya que esto hara que, a volmenes bajos, la calidad
de la muestra empeorara, como se explic en el apartado sobre los problemas de la cuantizacin.
Lo que se hace con el valor del volmen es dar como entrada la parte menos significativa (bits
0-5) a un conversor D/A de 6 bits cuyo valor analgico de salida es el valor Vref de referencia para el
conversor D/A principal de cada canal. El bit 6, que slo ser 1 cuando el valor del volmen sea 64
servir de seal de control a un multiplexor analgico situado antes de la entrada Vref del conversor D/A
de sonido. Si el bit 6 vale 0, el multiplexor conectar Vref a la salida del conversor D/A de volmen. Si
es 1, Vref se conectar directamente a la tensin Vref del conversor D/A de volumen.
A continuacin se muestra la tabla dnde se recogen los nombres y direcciones de los registros
de volumen de cada canal:
Registro Nombre Funcin
$0A8 AUD0VOL Volumen del canal 0
$0B8 AUD1VOL Volumen del canal 1
$0C8 AUD2VOL Volumen del canal 2
$0D8 AUD3VOL Volumen del canal 3
Para inicializar el volmen usaremos una instruccin MOVE.W anloga a la anterior:
MOVE.W #40, AUD0VOL (A5) ; Canal 0 a volmen mximo.
El ltimo parmetro que debemos programar en el 8364 es la frecuencia de muestreo.. Este valor
no podemos programarlo directamente en herzios; en lugar de eso, debemos programar al controlador de
DMA que es quien va a hacer el muesteo sobre la memoria, con el nmero de ciclos de bus que ocurrirn
entre cada salida de dos muestras. Un ciclo de bus tarda 279.365 ns en el Amiga.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Para calcular el nmero de ciclos de bus a partir de la frecuencia de muesteo se usar la siguiente
frmula:
El valor asignado al ciclo de bus puede estar tericamente entre 0 y 65535. Sin embargo el rango
real tiene un lmite superior. Como se puede observar (figura 2.2.1) cada canal de audio tiene asignada
una ranura de DMA en cada barrido horizontal de video. Esto significa que se pueden leer dos muestras
en cada retrazo horizontal. Esto hace que el valor mnimo posible para AUDxPER sea 124. La frecuencia
de muestreo mxima es por tanto de 28867 Hz. Si se usa un valor menor que ste, el controlador de DMA
no tendr tiempo de leer las siguientes muestras, y por tanto, las dos que se leyeron por ltima vez y que
estn en el 8364 se volvern a volcar sobre los conversores D/A..
Registro Nombre Funcin
$0A6 AUD0PER Ciclos de bus para el canal 0
$0B6 AUD1PER Ciclos de bus para el canal 1
$0C6 AUD2PER Ciclos de bus para el canal 2
$0D6 AUD3PER Ciclos de bus para el canal 3
Para asignar a un canal la frecuencia de muestreo podemos hacer:
MOVE.W #508, AUD0PER (A5) ; Asigna frecuencia de muestreo de 7040 Hz.
Una vez que se ha inicializado un canal debemos activar al controlador de DMA para que empieze
el muestreo. Esto ya no depende del 8364 sino que corre a cargo del circuito controlador del DMA. En
el caso del Amiga se activa con:
MOVE.W #$8201, DMACON (A5) ; Pone a 1 AUD0EN y DMAEN
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 2.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
A partir de ahora el DMA realiza el muestreo de los datos en memoria de la manera en que lo
hemos programado. Una vez que ha terminado de leer todas las muestras pulsa una lnea de interrupcin
que comunica al 68000 este hecho, y vuelve a empezar desde el principio de la muestra.
El 8364 dispone tambin de otras caractersticas que sealaremos slo de manera indicativa, dado
que no van a formar parte de la simulacin. Ente ellas est la posibilidad de usar las muestras de un canal
para modular en frecuencia y/o en amplitud a otro canal.
De esta manera se pueden sintetizar efectos de vibrato y trmolo con un instrumento sin la necesidad de
remuestrear el instrumento.
Como antes se indic, la frecuencia de muestreo est limitada a unos 28 kHz a causa de la
asignacin de tiempos por el controlador de DMA. Si se supera esta frecuencia no se leen nuevas
muestras de memoria sino que se envan al DAC las dos ltimas muestras guardadas dentro de los
registros del 8364. Este puede an enviar las dos muestras al lmite de la frecuencia de muestreo que
admite el 8364, que es de unos 3,5 Mhz (corresponde a un valor de 1 en AUDxPER). Si hacemos que una
de las muestras sea 128 y la otra -127, el 8364 generar una seal cuadrada de 1,7 Mhz. Esta seal no
pasar el filtro paso baja instalado en el Amiga, pero existen tomas exteriores en el puerto serie
conectadas directamente a los pines AUDR y AUDL del 8364. Dado que la seal generada de esta manera
se puede modular en amplitud y/o frecuencia es posible tericamente hacer funcionar a Paula como un
mdem o un modulador de audio.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
3. INTRODUCCION AL
SECUENCIAMIENTO MUSICAL.
3.1. El secuenciamiento como instrumento de composicin
musical.
El secuenciamiento consiste en la transcripcin de un pasaje musical en una secuencia de
smbolos que representan las evoluciones (cambios de tonalidad y volmen) de los distintos instrumentos
a travs del tiempo. Al sistema que interpreta dichos smbolos y reproduce el pasaje musical se le
denomina secuenciador.
Esta transcripcin, proceso mucho ms antiguo que el tratamiento electrnico del sonido, hizo
posible el transmitir pasajes musicales a travs del tiempo sin deterioro de su contenido.
El secuenciamiento es, en s mismo, una forma de digitalizar la msica ya que se basa en la
discretizacin y la cuantizacin. En la discretizacin se divide el tiempo en partes iguales asignando
determinadas propiedades a cada parte. Dichas propiedades determinan el ritmo de la composicin. La
cuantizacin en este contexto consiste en identificar cada una de las notas de la composicin y asignar
a cada una una altura tonal (frecuencia).
Pero a diferencia de la digitalizacin estndar que define una sucesin numrica en el tiempo a
muy alta resolucin, el secuenciamiento define las caractersticas de la composicin a intervalos de
tiempo mucho ms amplios., lo que significa una mayor libertad en la ejecucin. De aqu que el lenguaje
musical definido por el secuenciamiento sea ambiguo, y cada ejecucin no tiene por qu ser igual a la
anterior; algo que no ocurre en la reproduccin de msica digitalizada.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
A travs del tiempo este lenguaje musical se ha ido enriqueciendo con nuevos smbolos que
completan, matizan o aaden significado a cada instante de tiempo dentro de la meloda. Esto ha definido
un lenguaje de composicin e interpretacin musical apto para la interpretacin de msica por parte de
un msico humano, pero no por parte de un secuenciador electrnico.
A partir de este lenguaje, que se definir en los prrafos siguientes, se han definido otros que son
una simplificacin del primero: unos para interpretar determinados tipos de msica, o para tocar
determinados instrumentos, y otros aptos para su interpretacin a salvo de ambigedades, por parte de
un ordenador.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 3.2.1: Escala musical en el pentagrama.
3.2. El lenguaje de composicin musical. La partitura.
Es un lenguaje simblico, independiente del idioma del compositor, que permite representar la
evolucin tonal de uno o ms instrumentos a travs del tiempo.
Su representacin escrita es el pentagrama. El conjunto de pentagramas que representa a la
totalidad de la meloda se le denomina partitura.
Un pentagrama se representa con cinco lneas horizontales paralelas. El tiempo transcurre a todo
lo largo de esas cinco lneas. Las alturas tonales de los instrumentos se representan con figuras musicales
emplazadas a diversas alturas utilizando como referencia las lneas del pentagrama y sobre todo una de
ellas: la lnea dnde se situa la clave del pentagrama; un smbolo que determina la altura tonal de la figura
ubicada en dicha lnea. Los dems valores de tono se determinan por la distancia
relativa de cada figura a la lnea base o de clave. (Figura 3.2.1)
Adems de especificar la altura tonal, se necesita saber durante cunto tiempo se va a mantener.
Esto se resuelve asignando una figura distinta segn la duracin. (Figura 3.2.2).
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 3.2.2: Figuras musicales y su duracin relativa.
Estas duraciones son relativas a la duracin total de una redonda. Para obtener duraciones mayores
se usa un smbolo llamado ligadura que une a dos o ms figuras y hace que el sonido de cada una de ellas
sea contnuo a lo largo de la ligadura; en cambio, no hay un smbolo que permita establecer una duracin
menor que la semifusa.
Adems de la ligadura existen ms smbolos que modifican la duracin de una nota. Estas son el
puntillo y el caldern.
El puntillo es un pequeo punto que colocado a la derecha de una nota aumenta en media vez la duracin
original de sta.
El caldern es un smbolo que se coloca encima de la nota, fuera del pentagrama y modifica la duracin
de la nota en un valor a libre juicio del intrprete.
Los tiempos se marcan en el pentagrama mediante compases. Son marcas en el pentagrama que
lo dividen en porciones de tiempo de igual duracin cada una. La duracin de cada comps (medida en
figuras musicales) viene dada por una fraccin escrita al lado de la clave. El numerador indica cuntas
figuras entran en el comps y el denominador la figura que es. (Figura 3.2.3).
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 3.2.3: Ejemplo de pentagrama con dos compases. Uso del puntillo y el caldern.
Para establecer la duracin de referencia se suele indicar de la manera: figura = valor dnde
figura es el smbolo de la figura sobre la cual se va a aplicar la duracin de referencia (puede ser
cualquiera ya que las duraciones de todas las figuras estn relacionadas), y valor es el nmero de figuras
que van a entrar en un minuto de ejecucin.
Otras veces, en lugar de utilizar esta nomenclatura se usa otra ms ambigua que establece no la
duracin individual de las figuras sino el ritmo o "tempo" de la pieza musical. Para describir este ritmo
se usan trminos italianos como Presto, Allegro, Andante, Adagio, etc...
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 3.2.4. Ejemplo de partitura real.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
3.3.- Los secuenciadores. El formato .MOD
Ya que el lenguaje musical es demasiado ambiguo para poder ser interpretado con un ordenador,
es necesaria una formalizacin del mismo aunque sea a costa de perder naturalidad en la interpretacin.
Un lenguaje de composicin musical apto para ser usado en un sistema informtico debe tener
las caractersticas que se le piden a un lenguaje de programacin: exacto, flexible y falto de ambigeda-
des.
Los elementos de este lenguaje sern instrumentos, notas, tiempos, as como los parmetros que
pueden variarlos.
Pero este lenguaje no debe ser muy distinto del lenguaje de la partitura, que sigue siendo el
lenguaje universal de composicin, y an hoy tiene ms potencia creativa que los lenguajes adaptados
a la informtica.
Una vez definido, se llama secuenciador al sistema que es capaz de interpretar ese lenguaje. La
interpretacin no tiene por qu significar una ejecucin de la pieza en tiempo real. Puede ser una
traduccin de ste a otro lenguaje, una representacin del lenguaje en forma grfica usando los smbolos
de la partitura, o un editor que permite la composicin musical.
Adems, el lenguaje de composicin usado en un secuenciador puede ser invisible al usuario, que
puede seguir manejando los smbolos tradicionales, teniendo en cuenta las limitaciones que imponga el
lenguaje subyacente. De este modo, se pueden usar partituras en sistemas informticos como archivos
de intercambio de datos entre distintos lenguajes de composicin.
El estndar industrial en cuanto a estos lenguajes es el MIDI (Musical Instrument Data Interface).
Este estndar define una serie de pistas que son asignadas cada una a un instrumento. Las pistas se
interpretan paralelamente a lo largo del tiempo como si cada una fuera una parte de la partitura (un score).
Cada pista contiene una lista de notas, y los instantes de tiempo en que hay que tocarlas. Cada nota
tiene varios atributos: su duracin, su tono, su volmen son los principales. Adems existen otros valores
que afectan a uno o varios parmetros de las notas que se estn tocando en una pista como la modulacin
(pitch blend), el vibrato y el trmolo.
La norma MIDI adems define un tipo de conexin y formato especficos para intercambiar
informacin desde o hacia un instrumento musical. La configuracin susal en un entorno MIDI consiste
en un teclado sintetizador y un ordenador. Aqu, tanto el teclado como el ordenador actan de
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.8
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
secuenciador. El compositor toca la pieza en el teclado y va MIDI se graba en la memoria del ordenador.
Ya despus, con un programa de edicin se retoca la partitura, se repiten pasajes que no se grabaron o
se mezcla la composicin actual con otras ya grabadas. El resultado se puede reenviar al teclado que
interpreta los comandos MIDI desde el ordenador y los ejecuta en su sintetizador como si se estuviese
tocando con el teclado en ese momento.
Con el auge de la informtica personal y la multimedia, cada vez es ms corriente integrar en el
sistema informtico dos de las tres tareas de la secuenciacin: la edicin y la interpretacin, quedando
la conexin MIDI en un solo sentido, desde un terclado externo, ms cmodo para tocar que el de un
ordenador, hacia el sistema.
La primera gran revolucin en el campo de la msica digital para ordenadores personales vino de
la mano de la empresa Commodore, que en su modelo Commodore 64 integraba un ms que respetable
chip sintetizador, el SID. Opcionalmente el C64 dispona de un conector MIDI que gestionaba dicho
integrado, por lo que tena acceso a gran cantidad de piezas escritas usando este lenguaje. Hasta entonces,
y an despus, la inclusin de la conexin MIDI era algo que a lo sumo se consideraba opcional dentro
de la configuracin de un ordenador personal. De todas maneras, el SID no poda usarse para fines
profesionales dada su baja calidad relativa (si exceptuamos al grupo Mecano, que us un C64 en la
grabacin de su primer disco!).
Para la segunda generacin de ordenadores espectaculares de que haca gala Commodore se
pens en un hardware de audio ms sofisticado y flexible que el anterior, todo ello embebido en una
arquitectura que persegua el mayor paralelismo posible entre operaciones y todo ello gobernado por la
naciente (para los equipos personales) tecnologa de 32 bits. As se desarroll el Amiga, y su integrado
generador de formas de onda complejas 8364.
En el Amiga tambin era fcil aadir un conector MIDI, y de hecho se us con ms asiduidad que
en el C64. Sin embargo lo peculiar de su arquitectura de generacin de sonidos hizo ms popular un
determinado formato de fichero cuyo contenido est intimamente ligado al hardware de dicho sistema.
Este formato es el Sound Tracker Module Music o ms comunmente llamado MOD. Fue un
formato ideado por los mismos programadores del Sound Tracker, que lo incorporaban como opcin a
la hora de grabar una composicin escrita con l, aunque el formato por defecto era el de song. La razn
de que el MOD se implantase sobre el song fue principalmente porque aqul incorporaba toda la
informacin de los instrumentos muestreados en el mismo fichero lo que haca ms fcil la carga de los
mismos, sintener que estar cambiando de disco para leer cada instrumento. Hay que recordar que los
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.9
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
primeros Amiga 1000 y 500 se vendan sin disco duro, y la ampliacin para disponer de uno era bastante
cara.
Las caractersticas tcnicas de un fichero MOD son las siguientes:
L 4 canales o pistas de sonido simultneos. Cada canal puede interpretar cualquier nota
dentro del rango disponible y con el instrumento que se desee de los que disponga el mdulo.
L El rango de notas cubre 3 octavas completas.
L La frecuencia de muestreo de cada canal vara con la nota que se est tocando, y puede
llegar hasta los 28Khz.
L Las 4 pistas se dividen en partes de igual longitud llamadas patrones. Cada patrn se
divide en 64 divisiones. Cada divisin puede contener una nota, un cdigo de instrumento y un
efecto para aplicar sobre esa nota. Una divisin se divide en ticks, y el nmero de ticks por
divisin es variable, y se puede modificar con uno de los efectos. La duracin de un tick es fija
y corresponde a 20ms. Por defecto se asumen 6 ticks por divisin, que corresponden a 125bpm
(un bpm corresponde a 4 divisiones).
L Cada mdulo puede definir hasta 31 instrumentos. Cada instrumento es una muestra
PCM de hasta 128K de longitud.
L Puede haber hasta 64 patrones distintos en un mdulo numerados del 0 al 63. El orden de
ejecucin de los patrones dentro del mdulo lo lleva una lista de patrones de hasta 128 bytes.
Cada elemento es el nmero del patrn que debe interpretarse a continuacin.
Como aplicacin principal de este trabajo, se desarrollar un programa que usando el hardware
del PC consiga emular el comportamiento del 8364 y aplicarlo a la interpretacin de un fichero con estas
caractersticas usando como sintetizador un sistema hard externo al PC conectado por el puerto paralelo.
A continuacin se describe el formato de un fichero .MOD (versin 2.0 de la especificacin). Los
valores de 16 bits se codifican en el formato Motorola (primero el MSB).
20 bytes. Ttulo del mdulo relleno con bytes \0 a la derecha.
La siguiente secuencia se repite 31 veces: una para cada instrumento
22 bytes. Nombre de la muestra que representa al instrumento rellena con \0. Si un
nombre empieza con el caracter # se asume que es un comentario del autor, entonces
los dems parmetros no se cuentan.
2 bytes. Longitud de la muestra en palabras de 16 bits. Una longitud igual a 1 se
considera una muestra vaca.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.10
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
1 byte. Los cuatro bits menos significativos representan un nmero en
complemento a 2 (-8 a 7) que indica el tono de la muestra. No se usar en la
simulacin.
1 byte. Volumen de la muestra entre 0 y 64.
2 bytes. Comienzo del bucle de repeticin en palabra de 16 bits. Este valor apunta
a la direccin de memoria dentro de la muestra desde la cual se realizar el looping de
la misma. El looping de una muestra consiste en la repeticin de un bloque de la misma
una vez que se ha ejecutado entera la primera vez. De esta manera se pueden
implementar instrumentos con la duracin que el compositor quiera.
2 bytes. Longitud del bucle de repeticin en palabras. El bucle existe si este valor
es mayor que 1.
1 byte. Longitud de la secuencia de patrones. Desde 1 hasta 128.
1 byte. Valor=127. Se puede ignorar.
128 bytes. Secuencia de patrones. Cada elemento de esta secuencia es un nmero de 0
a 63 que identifica el patrn que hay que tocar en ese momento. El valor mximo almacenado
en esta tabla es el nmero de patrn ms alto que existe.
4 bytes. Las iniciales M.K. Estas son las iniciales de Unknown/D.O.C quien cambi el
formato para adaptarlo a 31 instrumentos. El formato antiguo no tena este campo.
Algunos programas secuenciadores usan este campo para incluir informacin adicional. Por
ejemplo:
FLT4 o FLT8: usado por el programa Startrekker para indicar 4 u 8 canales.
M!K!: usado por Protracker para indicar que hay ms de 64 patrones.
6CHN o 8CHN: tambin identifica un mdulo de 6 u 8 canales en Protracker.
A continuacin se almacenan los patrones.Cada patrn ocupa 1024 bytes, divididos en
64 divisiones que ocupan cada una 16 bytes. Dentro de cada divisin estn los datos para
cada uno de los 4 canales, ocupando cada canal 4 bytes en una divisin. El formato de la
informacin en cada canal es la siguiente:
Si este nibble vale 1, se suma 16 al
campo instrumento
Valor de la nota Instrumento Efecto Parmetros del efecto
Byte 0 Byte 1 Byte 2 Byte 3
El primer MSN (Most Significant Nibble) del byte 0 normalmente contiene el valor 0, pero
al hacer la ampliacin a 31 instrumentos se us como bit 4 del campo instrumento.
El valor de la nota es un campo de 12 bits que ocupa el LSN (Least Significant Nibble)
del byte 0 y el byte 1. Este valor es el que habra que cargar en el contador del 8364 para
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.11
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
generar la frecuencia de muestreo requerida para tocar la nota a un determinado tono. Por
ejemplo: si hemos muestreado un DO de un piano a 8272 Hz, para escuchar ese mismo DO
hay que cargar el valor 214d en el contador del 8364. Si en lugar de este valor ponemos, por
ejemplo, un 190d, la muestra se leer ms rapidamente, y el tono resultante ser un RE.
Para nosotros este valor no tiene significado en s mismo, sino que lo usaremos como
ndice a una tabla donde estarn los valores de la recta generada con el algoritmo de
Bresenham apropiados para emular el tono.
Los valores de frecuencia usados en los MODs estndar cubren 3 octavas. Algunas
versiones cubren 2 octavas ms, una por encima y otra por debajo de las normales. Los
valores del campo nota para cada nota y octava son estos:
DO DO# RE RE# MI FA FA# SOL SOL# LA LA# SI
Octava 1
856 808 762 720 678 640 604 570 538 508 480 453
Octava 2
428 404 381 360 339 320 302 285 269 254 240 226
Octava 3
214 202 190 180 170 160 151 143 135 127 120 113
Octava 0
1712 1616 1525 1440 1357 1281 1209 1141 1077 1017 961 907
Octava 4
107 101 95 90 85 80 76 71 67 64 60 57
EL MSN del byte 2 contiene los 4 bits bajos del campo instrumento. El campo completo
ocupa 5 bits, con lo que se admiten hasta 32 instrumentos distintos, pero el valor 0 est
reservado para indicar no instrumento. Si hay un valor vlido en el campo nota pero
instrumento vale 0, indica que esa nota debe tocarse con el ltimo instrumento vlido en ese
canal. No se admite que la primera nota que aparece en un mdulo tenga instrumento 0.
El LSN de este mismo byte contiene un valor del 0 al 15 que determina el tipo de efecto
a aplicar sobre la nota. El byte 3 contiene los parmetros (si los necesita) del efecto. Un valor
de 0 en estos dos campos indica no hay efecto.
A continuacin se describen los efectos soportados en la emulacin. Para una
enumeracin completa de los efectos soportados por la versin 2.0 consultar la bibliografa.
0: Arpeggio. El parmetro se divide en dos nibbles: A y B. Este efecto consiste en tocar
la nota normalmente, despus se toca esa misma nota pero aadindole A semitonos, y
despus se vuelve a tocar aadindole B semitonos. Estas fluctuaciones de tono se realizan
a intervalos regulares de tiempo dentro de una divisin.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 3.12
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
1: Slide up. Decrementa el perodo de la nota por lo que su tono se incrementa
suavemente. El valor del decremento lo da el parmetro. La operacin se hace en cada tick,
y mientras no se encuentre otra nota en el mismo canal. Ntese que lo que se decrementa es
el valor del perodo (lo que se carga en los contadores del 8364). No se puede subir el tono
de
2: Slide down. Incrementa el perodo de la muestra, bajando su tono. Acta de manera
anloga al efecto anterior.
3: Slide to note. Cambia el tono del instrumento actual desde la nota que se est oyendo
en ese momento hasta la nota que acompaa a este efecto. La suavidad del cambio
depender, como en los dos casos anteriores, del parmetro. La direccin del cambio est
implcita por la nota inicial y final. Si el parmetro es 0, se continua con los valores del ltimo
efecto 3 en ese canal.
9: Offset. Toca el instrumento asignado a esta nota a partir de la posicin parme-
tro*256d.. Este desplazamiento se mide en palabras.
10: Volume slide. El parmetro se toma como dos nibbles. Si el niblle superior A es distinto
de 0 se sube el volmen A unidades en cada tick. Si el nibble inferior B es distinto de 0 y el
superior es igual a 0, se baja el volmen B unidades por cada tick. El cambio no puede pasar
el rango de volmen: 0 a 64.
11: Salto. El patrn entero (los 4 canales) se parar despus de ejecutada la actual
divisin, y la p'roxima divisin a leer ser la primera divisin del patrn que indique el
parmetro.
12: Poner volumen. Asigna el volumen especificado por el parmetro al instrumento actual
en la nota correspondiente a esta divisin.
13: Acabar patrn. Anlogo al comando 11 salvo que el patrn que se lee es el siguiente.
En la simulacin no se ha tenido en cuenta el parmetro, que indica a partir de qu divisin se
empieza a leer el patrn.
Efectos tipo 14. Son una serie de efectos codificados con dos nmeros. El primero es siempre
14 y se almacena en el lugar del tipo de efecto, como es susal. El segundo nmero es el MSN
del parmetro. Por tanto, los parmetros se almacenan en el LSN del byte asignado al campo
parmetro.
De ellos slo se han implementado dos: el efecto 10 y el efecto 11. Son, respectivamente, fine
volume slide up y fine volume slide down. El efecto consiste en subir o bajar el volmen tantas
unidades como indique el parmetro, pero slo una vez al principio de la divisin (tick 0).
15: Velocidad. El parmetro indica el nmero de ticks que tendr una divisin a partir de
ahora, si ste es menor que 32. Si es mayor o igual, indica los bpm (beats por minuto) con que
se ejecutar el mdulo. Slo se ha implementado la opcin menor que 32.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
4. ESTUDIO DE LA VIABILIDAD DE LA
EMULACION EN UN PC AT 386
Despus de haber descrito en el captulo 2 el hardware dedicado al sonido del Amiga, se proceder
al estudio de viabilidad de la emulacin de dicho hardware, usando los recursos que a continuacin se
exponen. Para cada componente se dar una descripcin general del mismo, su funcin dentro del sistema
y la manera en que puede ser til en la simulacin [INTEL]
4.1.- El temporizador programable 8254.
El 8254 es un timer de propsito general. Es programable por el usuario y dispone de 3 contadores
independientes que, en el caso del PC, tienen comn su seal de reloj, de aproximadamente 1,193 Mhz.
Cada uno de ellos est asignado a una parte del sistema. El contador 0 es el ms importante para
nuestra tarea, ya que es el nico que puede generar interrupciones a la CPU. Normalmente stas ocurren
unas 18,2 veces por segundo y se usan para actualizar el reloj del sistema y apagar los motores de las
disqueteras al cabo de un cierto time-out desde su ltima utilizacin.
El contador 1 se suele usar para el refresco de la RAM, aunque en los sistemas AT esto no
siempre es as, sino que hay una lgica dedicada a esta tarea.
El contador 2 se puede usar como contador del usuario, o bien permite generar tonos por el
altavoz programndolo para que genere seales cuadradas.
El 8254 tiene 5 modos de funcionamiento, pudiendo estar cada contador en cualquiera de stos:
X Modo 0: Interrupcin con la finalizacin de una cuenta.
X Modo 1: Monoestable redisparable por hardware.
X Modo 2: Generador de frecuencias.
X Modo 3: Generacin de onda cuadrada.
X Modo 4: Pulso disparado por software.
X Modo 5: Pulso disparado por hardware.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
La programacin se hace de la siguiente manera:
Puerto 43h
SC1 SC0 RW1 RW0 M2 M1 M0 BCD (norm. 0)
D7 D6 D5 D4 D3 D2 D1 D0
SC - Select Counter (seleccionar contador)
SC1 SC0
0 0 Seleccionar contador 0 (puerto 40h)
0 1 Seleccionar contador 1 (puerto 41h)
1 0 Seleccionar contador 2 (puerto 42h)
1 1 Comando read-back
M - Modo
M2 M1 M0
0 0 0 Modo 0
0 0 1 Modo 1
X 1 0 Modo 2
X 1 1 Modo 3
1 0 0 Modo 4
1 0 1 Modo 5
RW - Read/Write
RW1 RW0
0 0 Comando de almacenamiento del contador.
0 1 Leer/escribir slo LSB
1 0 Leer/escribir slo MSB
1 1 Leer/escribir LSB y despus MSB
As, para programar al timer para que genere 1000 interrupciones por segundo, se proceder de
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
la siguiente manera:
reloj equ 1193180
mov al,00110100b
out 43h,al
mov ax,reloj/1000
out 40h,al
mov al,ah
out 40h,al
Como se puede observar, se puede usar esta caracterstica del 8254 para simular la DMA del
Amiga, haciendo transferencias por interrupciones. La rutina que se encargar de hacer 1 trasvase de la
memoria al dispositivo DAC se ubicar en la int 08h.
Hay que hacer notar que cualquier rutina que use este servicio debe encargarse de llamar a la
antigua int 08h con la misma frecuencia que tena antes, esto es, 18,2 Hz, si se va a usar la aplicacin en
background.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
4.2.- El controlador programable de interrupciones 8259A.
Se usa este circuito para gestionar y priorizar las diferentes fuentes de interrupcin del sistema.
Sirve, por tanto, como interfaz entre la CPU y los perifricos. En el AT hay dos de estos controladores,
pero nos centraremos en el primero, y sobre todo en dos de sus lineas de interrupcin.
La inicializacin del 8259 escapa al propsito de este epgrafe, as que se supondr un entorno
de sistema PC en el cual la BIOS se ha encargado de todas estas tareas.
De este modo, el 8259 est configurado para 6 lineas de interrupcin de sus 7 posibles (la linea
2 est conectada en realidad a un segundo controlador). De ellas, la linea 0 corresponde a la interrupcin
del timer, y la linea 7 (y/o 5) est dedicada a la interrupcin generada por el puerto paralelo.
Cada linea de interrupcin puede enmascararse a voluntad. Para ello se emplea el puerto 21h
desde el que se pueden consultar o modificar los permisos de interrupcin de cada linea.
I7 I6 I5 I4 I3 I2 I1 I0
Interrupt Mask Register (puerto 21h)
Un 0 indica que la interrupcin est habilitada, y un 1 indica que est deshabilitada.
Cuando se est atendiendo una interrupcin, el 8259 bloquea cualquier otra peticin de
interrupcin de la misma o de inferior prioridad. Para indicar que una interrupcin ha sido atendida, se
ha de mandar un comando de EOI (End Of Interrupt) por el puerto 20h. El comando EOI es el 20h.
As, para nuestros propsitos slo necesitaremos saber cmo habilitar y deshabilitar interrupcio-
nes, y cmo decirle al controlador que hemos acabado la gestin de una. Entonces, una posible rutina de
gestin de interrupciones sera:
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
interrupc proc far
pushad ;guardamos todos los registros generales
push ds
mov ax,dgroup
mov ds,ax ;apuntamos a nuestras variables globales
call gestion_interrupcion
mov al,20h
out 20h,al ;mandar un EOI
pop ds
popad
iret ;fin de la interrupcin
interrupc endp
Como despus se ver, interesa que la duracin de esta rutina sea la menor posible, sobre todo si
la interrupcin va a suceder muchas veces por segundo.
Como el entorno de programacin es MS DOS, hay que tener en cuenta que no se pueden (por
lo general) hacer llamadas a funciones del sistema desde dentro de una rutina de servicio de interrupcio-
nes porque la interrupcin puede haber ocurrido durante el procesamiento de una llamada al sistema, y
MS DOS no es reentrante. Esto restringir las acciones que se pueden desarrollar en el gestor, y que
obligar en algunos casos a usar el hard directamente, en lugar de los servicios de la BIOS o del DOS.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
4.3.- El puerto paralelo.
En el 8364, una vez que los datos han sido leidos por los canales de DMA son enviados a los
DACs de 8 bits que en definitiva son los responsables de la generacin del sonido. En el PC, por contra,
no se dispone de ningn dispositivo estndar anlogo a los conversores digital-analgico de que dispone
el Amiga. A diferencia de otros micros de su poca, el PC fue el nico ordenador que sali peor parado
en este aspecto.
La solucin propuesta es usar el puerto paralelo. Este dispositivo consta de un bus de 8 bits con
seales de handshaking para comunicar datos desde el sistema hacia una impresora. El usuario puede
cambiar libremente el contenido del bus y actuar sobre las lineas de protocolo de la manera ms
conveniente. Se dispone de lineas de entrada desde las que se puede examinar el estado de la impresora.
Una de estas lneas (ACK) est configurada para poder generar una interrupcin al 8259.
Externamente consta de un conector D25 hembra con el siguiente patillaje:
N Nombre Sentido Funcin
1 STROBE SALIDA Indica a la impresora que hay datos vlidos en el puerto
2 D0 ENTRADA/SALIDA
3 D1 ENTRADA/SALIDA
4 D2 ENTRADA/SALIDA
5 D3 ENTRADA/SALIDA
6 D4 ENTRADA/SALIDA
7 D5 ENTRADA/SALIDA
8 D6 ENTRADA/SALIDA
9 D7 ENTRADA/SALIDA
10 ACK ENTRADA Indica al ordenador que los datos han sido ledos
11 BUSY ENTRADA Indica al ordenador que la impresora est ocupada y no puede leer datos
12 PAPER OUT ENTRADA Indica al ordenador que falta papel
13 SELECT ENTRADA Indica al ordenador que la impresora est ON-LINE
14 AUTO FEED SALIDA Indica a la impresora que debe hacer un avance de linea
15 ERROR ENTRADA Indica al ordenador que ha ocurrido un error
16 RESET SALIDA Inicializa la impresora
17 SELECT INPUT SALIDA Indica a la impresora que el puerto est operativo
18-25 GND MASA DE SEAL
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Se pueden configurar hasta tres puertos paralelos, conocidos bajo DOS como LPT1, LPT2 y
LPT3.
La programacin de cada puerto est a cargo de 3 registros, asignados de la siguiente manera:
Puerto Datos Estado Control
LPT1 3BCh 3BDh 3BEh
LPT2 378h 379h 37Ah
LPT3 278h 279h 27Ah
El formato de cada registro es el siguiente:
Puerto 3BCh, 378h, 278h (lectura/escritura)
D7 D6 D5 D4 D3 D2 D1 D0
Puerto de datos. Cada bit corresponde a un bit del bus de datos del puerto paralelo.
Puerto 3BDh, 379h, 279h (slo lectura)
BUSY\ ACK\ OUT OF PAPER ONLINE ERROR no usada no usada TIME OUT
BUSY: 0=impresora no ocupada
1=impresora ocupada
ACK: 0=no se han recibido datos
1=datos recibidos satisfactoriamente
OUT OF PAPER: 0=no se ha llegado al fin del papel
1=se ha llegado al fin del papel
ON LINE 0=la impresora est en off-line
1=la impresora est en on-line
ERROR: 0=no error
1=error
TIME OUT: 0=no hay time-out
1=se lleg al time-out
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.8
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Puerto 3BEh, 37Ah, 27Ah (lectura/escritura)
no usada no usada DIR IRQ_EN SELECT INPUT RESET\ AUTO LINE FEED STROBE\
DIR: 0=sentido de los datos desde el ordenador a la impresora
1=sentido de los datos desde la impresora al ordenador
IRQ_EN: 0=deshabilita IRQ 5/7 para ACK
1=habilita IRQ 5/7 para ACK
SELECT INPUT 0=puerto no preparado
1=puerto preparado
RESET: 0=inicializar impresora
1=funcionamiento normal
AUTO LINE FEED: 0=no hacer avance de linea
1=hacer avance de linea
STROBE: 0=no hay datos en el bus
1=hay datos en el bus
Lo importante de este dispositivo es que podemos poner cualquier dato en el bus y manejar a
nuestra voluntad las lineas de control, de forma que podemos acoplar cualquier dispositivo que queramos
que lea datos de 8 bits escritos por el ordenador. Asmismo, otro dispositivo puede ofrecer datos a travs
de este mismo puerto y avisarnos de que estn listos usando la linea ACK.
En este proyecto se usar el puerto paralelo como un mini bus ISA, con las seales de protocolo
indispensables para poder manejar cuatro dispositivos. Tres de ellos de escritura y uno de lectura. Las
cuatro lineas del puerto de control proporcionarn el acceso a cualquiera de ellos. Los detalles del montaje
se vern en el captulo 6. En los apartados siguientes se supondr la existencia de un dispositivo
conectado directamente al bus del puerto paralelo, sin uso de protocolos.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.9
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
4.4.- Ejecucin en background. Degradacin del rendimiento del
sistema.
El propsito del anlisis de los dispositivos descritos hasta ahora no es sino ofrecer una alternativa
viable a la transferencia DMA de un bloque de datos a un ritmo seleccionado, hacia un dispositivo de E/S
en un sistema que carece de estas caractersticas.
Se ha descrito a lo largo de este captulo cmo una gestin por interrupciones puede solucionar
el problema. Sin embargo, esta gestin debe ser lo ms eficaz posible, ya que, a diferencia del DMA, es
la CPU la que debe hacer el trasvase e datos interrumpiendo la tarea que est haciendo.
Adems la tasa de transferencia de datos debe ser lo suficientemente alta como para proporcionar
un sonido de calidad aceptable. Esto supone no menos de 22050 transferencias por segundo (como se vio
en el cap. 2, el 8364 llega hasta alrededor de 28000 transferencias por segundo). Esto por supuesto, con
la posibilidad de poder hacer otra tarea en primer plano mientras se lleva a cabo el trasvase.
Es por esto que se debe estudiar los tiempos de ejecucin de la rutina de servicio de interrupciones
para estimar la sobrecarga del sistema impuesta por la simulacin.
En la figura siguiente se ha representado un grfico del tiempo de utilizacin de la CPU por dos
tareas: la tarea del sistema, que es todo aquello que percibimos como trabajo activo de la CPU (el S.O.,
un procesador de textos, etc...) Y que se debe ejecutar en primer plano, y la tarea de la interrupcin del
timer que debe ser invisible al usuario.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.10
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
En esta situacin llamaremos Tefec al tiempo del que dispone la tarea del sistema, y Tint al
tiempo del que dispone la rutina de servicio de la interrupcin. Entonces, el porcentaje de sobrecarga, H,
ser:
Donde Tint+Tefec debe ser igual al intervalo entre dos peticiones de interrupcin, que ser
inversamente proporcional a la frecuencia de muestreo elegida para reproducir el sonido digitalizado.
Se debe tener en cuenta que ste es un caso ideal. En la realidad hay otras fuentes de interrupcin
que tambin deben ser atendidas, y que restan tiempo del asignado en principio a la tarea del sistema. Esta
misma puede perjudicar a la respuesta de la rutina de interrupcin si ejecuta zonas de cdigo en las que
se desactiven las interrupciones. An as el esquema propuesto es suficientemente aproximado para
aplicarlo a nuestro caso particular.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.11
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
4.5.- Prueba de emulacin de un canal digital por el puerto
paralelo.
En esta seccin se describir una primera aproximacin a lo que llegar despus a ser la rutina
principal de ejecucin de los MODs. El objetivo de la rutina que se desarrolle ser enviar un bloque cuya
direccin lejana est en p, de n bytes de longitud, siendo n<64K por el puerto paralelo con base en la
direccin 378h, y a una frecuencia de reproduccin f medida en herzios.
Se supondr un sistema DMA sin autoinicializacin (los cambios que hay que hacer en el fuente
para conseguir la autoinicializacin son triviales). Se debe disponer de una seal, flag o similar para saber
cundo ha acabado la transferencia, que en nuestro caso ser una variable global FinDMA, que valdr
1 si se lleg al final de la cuenta, y 0 si no.
El contenido del archivo de cabecera para este conjunto de rutinas es el siguiente:
extern char FinDMA;
void IniciaDMA (char *p, unsigned n, unsigned f);
void DetieneDMA (void);
Y el fuente de las rutinas es ste:
.286
; Usaremos el juego de instrucciones del 80286
.model large
; Para compilar con un programa en C usando el modelo large
.data
AnteriorInt08 dd 0 ; Antiguo vector de la int 08h
PosicionActual dd 0 ; Registro de direccin actual
ContadorDMA dw 0 ; Contador de bytes que quedan por enviar
CuentaTimer dw 0 ; Nmero de pulsos que debe contar el siguiente contador
ContadorTimer dw 0 ; Contador de pulsos hasta la siguiente
; llamada a la antigua int 08h
FinDMA db 0 ; Flag de fin de transferencia
public C FinDMA
.code
public C IniciaDMA
public C DetieneDMA
IniciaDMA proc C p:ptr byte, n:word, f:word
cli ; Sin interrupciones durante la inicializacin
push es
push si
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.12
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
les si,p
mov word ptr PosicionActual,si
mov word ptr PosicionActual+2,es
mov ax,n
mov ContadorDMA,ax
mov ax,3508h
int 21h ; Funcin: obtener vector de interrupcin
; de nmero AL en ES:BX
mov word AnteriorInt08,bx
mov word ptr AnteriorInt08+2,es
push ds
mov dx,offset NuevaInt08
mov ax,seg NuevaInt08
mov ds,ax
mov ax,2508h
int 21h ; Funcin: asignar rutina de servicio de
; la interrupcin de nmero AL al cdigo
; apuntado por DS:DX
pop ds
mov al,00110110b ; Contador 0, modo 3
out 43h,al
mov dx,0012h
mov ax,34DCh ; DX:AX=001234DCh=1193180d
mov bx,f
div bx ; AX=int(1193180/f)
push ax
out 40h,al
mov al,ah
out 40h,al ; Ahora el timer genera una seal de f Hz
pop bx
xor dx,dx ; DX=0
mov ax,65535
div bx ; AX=pulsos que hay que conar antes de
; llamar a la antigua int 08h
mov CuentaTimer,ax
mov ContadorTimer,0
mov FinDMA,0
pop si
pop es
sti ; Empieza la transferencia en background
ret
IniciaDMA endp
DetieneDMA proc C
cli
xor al,al ; Restauramos antiguo valor del timer 0
out 40h,al
jmp $+2 ; Un pequeo retraso para que el 8254 tenga
; tiempo de leer el dato
out 40h,al
push ds
lds dx,AnteriorInt08
mov ax,2508h ; Restauramos antigua rutina de la int 08
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.13
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
int 21h
pop ds
mov FinDMA,1 ; Seala el fin de la transferencia DMA
sti
ret
DetieneDMA endp
NuevaInt08 proc far
push ax
push dx
push si
push ds
push es
mov ax,dgroup
mov ds,ax ; Sealamos DS al segmento de datos de C
cmp FinDMA,1 ; Hay ms datos por transferir?
je PulsoIdle ; Si no, vete al final
les si,PosicionActual
mov dx,378h
mov al,es:[si] ; Lee la muestra actual
out dx,al ; y la manda al puerto paralelo
inc word ptr PosicionActual
dec ContadorDMA ; Actualiza contador DMA
jnz PulsoIdle ; Si termin la transferencia
mov FinDMA,1 ; notifcalo
PulsoIdle: inc ContadorTimer ; Contar pulso
mov ax,ContadorTimer
cmp ax,CuentaTimer ; es hora de llamar al reloj?
jne FinalInt08
mov ContadorTimer,0
pushf
call dword ptr AnteriorInt08 ; Simulamos una llamada a interrupcin
FinalInt08: mov al,20h
out 20h,al ; Mandar EOI al 8259
pop es
pop ds
pop si
pop dx
pop ax
iret
NuevaInt08 endp
end
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.14
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 4.6.1. Muestreo de una seal usando Bresenham
4.5.- Reproduccin de varios canales digitales
Hasta ahora, la emulacin de un canal de DMA con las mismas caractersticas de las que se
dispone en el 8364 no ha sido difcil. El problema aparece cuando son 4 los canales DMA a emular. Cada
canal tiene su propio contador que le permite muestrear a distintas frecuencias. De esta manera se pueden
interpretar cuatro notas a un tiempo.
Si embargo, en el PC slo disponemos de un timer para emular un canal DMA a una determinada
frecuencia. La solucin ms inmediata consiste en tener un contador para cada canal que cuente ticks de
interrupcin y haga la transferencia cuando se haya llegado al final de la cuenta, pero ello requerira hacer
funcionar al timer del PC a una frecuencia muy alta respecto de la mxima frecuencia a usar realmente,
por lo que la sobrecarga del sistema sera mayor, y la mayora de los ticks de interrupcin no haran nada
til; slo contar.
En la figura 4.1 se puede observar la idea que subyace a la solucin elegida. Dependiendo de la
pendiente de la recta, la grfica de la seal resultante est ms estirada o comprimida que la original. De
esta manera es como se controla el pitch o tono de la muestra resultante que ser igual a la frecuencia de
la muestra original multiplicada por la pendiente de la recta usada en la transformacin.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.15
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
La idea es, pues, la siguiente: partiendo de su pendiente, se puede construir una recta de N puntos,
donde N es la longitud de la muestra, siguiendo el algoritmo de Bresenham. Este algoritmo lo
modificaremos para que nos d los incrementos de la coordenada Y en lugar del punto resultante.
As, para una recta horizontal (pendiente=0) el algoritmo nos devolvera una secuencia como
0,0,0,0,0,...,0 porque la coordenada Y nunca cambia.
Si la pendiente es 1, tenemos una diagonal en el primer cuadrante. En este caso, la coordenada
Y se incrementa con cada paso de la X. La secuencia sera: 1,1,1,1,...,1.
Si la pendiente fuera 1/2, la secuencia sera 1,0,1,0,1,0,1,0,1,0..... Intuitivamente se demuestra que
la pendiente es el valor medio de la sucesin obtenida.
Estos valores los usaremos a la hora de incrementar la direccin para obtener una nueva muestra.
En lugar de sumar siempre 1 y dejar que sea el timer quien marque el ritmo de la transferencia, haremos
que ste tenga una frecuencia fija igual a la mxima frecuencia de muestreo que se vaya a usar. Por cada
interrupcin se van leyendo uno a uno los valores de la secuencia de incrementos proporcionada para la
nota que queremos tocar. Despus de leer la muestra actual y enviarla al puerto paralelo, la direccin de
la siguiente muestra se calcular como la direccin de la actual+el valor del elemento leido de la
secuencia.
A continuacin se lista el fuente del emulador de DMA desarrollado con este mtodo. Esta vez
se aceptarn dos transferencias simultaneas de dos bloques de memoria ubicados en direcciones distintas,
de distinta longitud y con una frecuencia de muestreo diferente para cada uno. Las muestras ledas se
mezclarn digitalmente y el resultado ser el que se envie al puerto paralelo. El listado se puede modificar
para que en lugar de ser 2 sean N los canales de DMA a emular.
Prototipos de las funciones
extern char FinDMACanal1;
extern char FinDMACanal2;
void IniciaDMA (char *p1, unsigned n1, char near *f1, char *p2, unsigned n2, char near *f2);
void DetieneDMA (char n);
Implementacin
.286
; Usaremos el juego de instrucciones del 80286
.model large
; Para compilar con un programa en C usando el modelo large
.data
AnteriorInt08 dd 0 ; Antiguo vector de la int 08h
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.16
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
PosicActCanal1 dd 0 ; Registro de direccin actual canal 1
ContDMACanal1 dw 0 ; Contador de bytes que quedan por enviar canal 1
PosicActCanal2 dd 0 ; Registro de direccin actual canal 2
ContDMACanal2 dw 0 ; Contador de bytes que quedan por enviar canal 2
BaseIncrCanal1 dw 0 ; Comienzo dentro de DS de la tabla de incrementos para el canal 1
OffsetIncrCanal1 dw 0 ; Indice que se mueve a lo largo de la tabla de incrementos
; del canal 1
Muestra1 dw 0 ; Muestra del canal 1
Muestra2 dw 0 ; Muestra del canal 2
BaseIncrCanal2 dw 0 ; Comienzo dentro de DS de la tabla de incrementos para el canal 2
OffsetIncrCanal2 dw 0 ; Indice que se mueve a lo largo de la tabla de incrementos
; del canal 2
CuentaTimer dw 0 ; Nmero de pulsos que debe contar el siguiente contador
ContadorTimer dw 0 ; Contador de pulsos hasta la siguiente
; llamada a la antigua int 08h
FinDMACanal1 db 0 ; Flag de fin de transferencia canal 1
FinDMACanal2 db 0 ; Idem canal 2
public C FinDMACanal1
public C FinDMACanal2
.code
public C IniciaDMA
public C DetieneDMA
IniciaDMA proc C p1:ptr byte, n1:word, f1:word, p2:ptr byte, n2:word, f2:word
cli ; Sin interrupciones durante la inicializacin
push es
push si
les si,p1
mov word ptr PosicActCanal1,si
mov word ptr PosicActCanal1+2,es
les si,p2
mov word ptr PosicActCanal2,si
mov word ptr PosicActCanal2+2,es
mov ax,n1
mov ContDMACanal1,ax
mov ax,n2
mov ContDMACanal2,ax
mov ax,f1
mov BaseIncrCanal1,ax
mov ax,f2
mov BaseIncrCanal2,ax
mov ax,3508h
int 21h ; Funcin: obtener vector de interrupcin
; de nmero AL en ES:BX
mov word AnteriorInt08,bx
mov word ptr AnteriorInt08+2,es
push ds
mov dx,offset NuevaInt08
mov ax,seg NuevaInt08
mov ds,ax
mov ax,2508h
int 21h ; Funcin: asignar rutina de servicio de
; la interrupcin de nmero AL al cdigo
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.17
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
; apuntado por DS:DX
pop ds
mov al,00110110b ; Contador 0, modo 3
out 43h,al
mov ax,001Bh ; Aprox. 44100 Hz
out 40h,al
mov al,ah
out 40h,al ; Ahora el timer genera una seal de 44100 Hz
mov CuentaTimer,097Bh ; Ticks antes de llamar al reloj
mov ContadorTimer,0
mov FinDMACanal1,0
mov FinDMACanal2,0
mov OffsetIncrCanal1,0
mov OffsetIncrCanal2,0
pop si
pop es
sti ; Empieza la transferencia en background
ret
IniciaDMA endp
DetieneDMA proc C n:byte
cmp n,1
jnz DetenCanal2
mov FinDMACanal1,1
cmp FinDMACanal2,1
jne CanalActivo
jmp ResetTimer
DetenCanal2: mov FinDMACanal2,1
cmp FinDMACanal1,1
jne CanalActivo
ResetTimer: cli
xor al,al ; Restauramos antiguo valor del timer 0
out 40h,al
jmp $+2 ; Un pequeo retraso para que el 8254 tenga
; tiempo de leer el dato
out 40h,al
push ds
lds dx,AnteriorInt08
mov ax,2508h ; Restauramos antigua rutina de la int 08
int 21h
pop ds
sti
CanalActivo: ret
DetieneDMA endp
NuevaInt08 proc far
push ax
push bx
push dx
push si
push ds
push es
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.18
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov ax,dgroup
mov ds,ax ; Sealamos DS al segmento de datos de C
cmp FinDMACanal1,1 ; Hay ms datos en canal 1?
je NoDMA1 ; Si no, no hacer nada
call TransfDMACanal1
NoDMA1: cmp FinDMACanal2,1 ; Hay ms datos en canal 2?
je NoDMA2 ; Si no, no hacer nada
call TransfDMACanal2
NoDMA2: mov al,Muestra1
cbw ; Lee y extiende el signo de la muestra 1 en AX
mov bx,ax
mov al,Muestra2 ; Idem con la muestra 2
cbw
add ax,bx ; Las mezcla
sar ax,1 ; obteniendo la seal resultante
mov dx,378h
out dx,al ; y la enva al puerto paralelo
inc ContadorTimer ; Contar pulso
mov ax,ContadorTimer
cmp ax,CuentaTimer ; es hora de llamar al reloj?
jne FinalInt08
mov ContadorTimer,0
pushf
call dword ptr AnteriorInt08 ; Simulamos una llamada a interrupcin
FinalInt08: mov al,20h
out 20h,al ; Mandar EOI al 8259
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
NuevaInt08 endp
TransfDMACanal1 proc near
les si,PosicActCanal1
mov al,es:[si] ; Lee la muestra actual
mov Muestra1,al ; y la almacena
mov bx,BaseIncrCanal1
mov di,OffsetIncrCanal1
mov al,[bx+di]
xor ah,ah ; AX=valor del incremento a
; sumar a la posicin actual
add si,ax ; Lo suma
mov word ptr PosicActCanal1,si ; y lo almacena
inc byte ptr OffsetIncrCanal1 ; prximo valor de incremento. Cuando lleva 255 valores,
el prxinmo es 0
sub ContDMACanal1,ax ; Decrementa el contador en la misma
; cantidad que se ha incrementado el
; puntero a la muestra actual
jnz FinTransfDMA1 ; Si termin la transferencia
mov FinDMACanal1,1 ; notifcalo
mov Muestra1,0 ; este canal ya no cuenta en la mezcla
FinTransfDMA1: ret
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 4.19
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
TransfDMACanal1 endp
TransfDMACanal2 proc near
les si,PosicActCanal2
mov al,es:[si] ; Lee la muestra actual
mov Muestra2,al ; y la almacena
mov bx,BaseIncrCanal2
mov di,OffsetIncrCanal2
mov al,[bx+di]
xor ah,ah ; AX=valor del incremento a
; sumar a la posicin actual
add si,ax ; Lo suma
mov word ptr PosicActCanal2,si ; y lo almacena
inc byte ptr OffsetIncrCanal2 ; prximo valor de incremento. Cuando lleva 255 valores,
el prxinmo es 0
sub ContDMACanal2,ax ; Decrementa el contador en la misma
; cantidad que se ha incrementado el
; puntero a la muestra actual
jnz FinTransfDMA2 ; Si termin la transferencia
mov FinDMACanal2,1 ; notifcalo
mov Muestra2,0 ; este canal ya no cuenta en la mezcla
FinTransfDMA2: ret
TransfDMACanal2 endp
end
Se has escogido una frecuencia de muestreo mxima de 44100 Hz, con lo que las rectas que
necesitaremos tendrn pendiente menor o igual a 1. Los valores del algoritmo de Bresenham para cada
canal se guardarn en el rea de variables globales, siendo f1 y f2 desplazamientos dentro de DS al
principio de cada secuencia. Cada valor de la secuencia es un byte con el valor 0 o 1; 0 si no hubo
incremento de Y, y 1 si lo hubo.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
5. EL MODO 32-BIT FLAT POINTER EN
MODO REAL O REALMEM.
5.1. El modo real y el modo protegido en un 80386.
A lo largo de este captulo examinaremos algunos de los recursos que, en cuanto a gestin de
memoria, nos ofrece el 80386 bajo MS DOS.
Este sistema operativo se ejecuta en el llamado modo real de la CPU. En este modo, que es el que
tiene por defecto al resetearse, un 80386 se comporta basicamente como un 8086 muy rpido, al que se
le han aadido instrucciones y registros de 32 bits.
El esquema de direccionamiento de memoria es el que hereda de estos micros: 1 Mb de espacio
de direccionamiento, dividido en segmentos de 64K. De esta manera la memoria pasa de ser un vector
a ser un array bidimensional. Una posicin queda determinada por dos coordenadas: segmento y
desplazamiento.
Este mecanismo era necesario ya que, por una parte el 8086 deba ser compatible (aunque slo
fuera a nivel de cdigo fuente) con sus predecesores 8085 y 8080 y esto implicaba limitaciones en el
ancho de palabra de la mquina; y por otra parte todava no estaba extendido en los micros personales
el uso de los 32 bits. As, el 8086 estaba restringido al uso de registros de 16 bits, con los cuales slo se
puede direccionar hasta 64K en principio.
Por tanto la posicin de un byte en la memoria se calcula como segmento*16+desplazamiento.
El hecho de multiplicar el valor del segmento por 16 equivale a desplazarlo 4 bits a la izquierda, con lo
que se convierte en un nmero de 20 bits. Entonces, cada valor del segmento representa una posicin base
de memoria mltiplo de 16. El valor lmite, 65535d (FFFFh), al multiplicarlo por 16 quedar como
FFFF0h o 1048560d.
El desplazamiento se suma sin ms al valor anteriormente calculado, pero surge un problema: si
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
el segmento al que estamos accediendo es el FFFFh, cualquier valor del desplazamiento mayor que 15d
nos saca fuera del espacio de 1Mb! En el 8086 lo que pasa simplemente es que el sumador usado para
calcular la direccin efectiva no tiene acarreo al bit 20, por lo que FFFF0h + 000Fh=00000h que
corresponde al primer byte de la memoria fsica. En el 80386 veremos que esto no tiene por qu ser as.
El 80286 vara toda la filosofa de direccionamiento respecto de su predecesor. Esta CPU
incorpora otro modo de funcionamiento que permite sacar partido de los 16 Mb de espacio de
direccionamiento. Con 24 bits en el bus de direcciones en este nuevo modo protegido, el valor del
segmento cobra otro significado.
La gestin de memoria del 80286 en modo protegido es basicamente la siguiente. Existe una tabla
alojada en memoria principal y en una zona protegida denominada tabla de descriptores globales (GDT).
Cada elemento de esta tabla referencia a un bloque de memoria y sus atributos. Estos son: direccin base
del bloque en 24 bits, longitud del bloque hasta 64Kb, permisos de lectura/escritua/ejecucin y otros
datos.
Si un programa hace un acceso a una direccin de memoria con valor de segmento 8 por ejemplo,
la direccin efectiva que se obtiene no es el resultado de desplazar 4 bits a la izquierda este valor, sino
que se emplea como offset respecto a la direccin base de la GDT de la que se saca la entrada
correspondiente que es la 1 (Cada entrada tiene 8 bytes de longitud) con la direccin base del segmento.
La direccin efectiva se calcula entonces sumando igual que antes el desplazamiento a este valor base.
Gracias a los datos de que se dispone en la GDT se pueden hacer comprobaciones sobre si se est
sobrepasando el lmite de segmento, en cuyo caso el acceso no es permitido y se genera una excepcin
del procesador. Tambin se genera una excepcin si el tipo de acceso es incompatible con los bits de
permiso almacenados en la entrada correspondiente de la GDT.
Como quiera que cada vez que se hace un acceso hay que leer los contenidos de la GDT es
conveniente guardar la entrada que se est usando en algn otro tipo de memoria que sea del mismo orden
de rapidez que los registros internos del procesador, para evitar estados de espera intolerables. Estos
almacenamientos reciben el nombre de descriptores cach. Existe uno por cada registro de segmento y
cada uno de ellos contiene el valor de la entrada de la GDT a la que apunta ese segmento. Son estos
descriptores los que se usan con todas las operaciones que implican gestin de memoria y slo se accede
realmente a la GDT cuando el programador cambia el valor del registro de segmento relacionado. Por lo
general, estos descriptores son invisibles para el programador.
Para el 80386 esto funciona de manera anloga. Los cambios ms importantes en la estructura de
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
un descriptor 386 son que la direccin base es ahora de 32 bits, el campo tamao (o lmite) es de 20 bits
y que se aade un campo ms de 1 bit, llamado G, que indica la granularidad del segmento. Este campo
da la unidad de medida del segmento de la siguiente manera: si el valor del campo longitud de bloque
de un segmento es 5 y el bit G=0, entonces el tamao del bloque son 5 * 1 byte = 5 bytes, si para este
mismo segmento el campo G=1, entonces la longitud real es 5 * 4096 bytes = 20480 bytes. De esta
manera con un campo de longitud de 20 bits se puede cubrir una longitud de segmento de hasta 4 Gb,
smplemente dndole el valor FFFFFh al lmite.
La descripcin de este mecanismo funciona muy bien en el modo protegido, pero tambin
funciona en modo real, con algunas variantes.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
5.2.- El modo REALMEM de 32 bits.
En el modo real del 386, que es donde nos moveremos durante casi toda la ejecucin de la
simulacin, los descriptores cach siguen funcionando exactamente de la misma manera que en el modo
protegido. Al resetear el micro, ste conmuta al modo real, inicializando los descriptores cach con los
valores BASE=0, LIMITE=FFFFh, G=0, y todos los permisos activados. Esta configuracin coincide con
la que impone el hard de un 8086, y es la que se necesita para mantener la compatibilidad. La direccin
efectiva de un dato se calcula como direccin base del descriptor+desplazamiento, siendo el total un
nmero de 32 bits.
Cuando en modo real se cambia el contenido de un registro de segmento, la CPU recalcula
internamente el campo base del descriptor cach correspondiente usando la frmula del 8086, y lo vuelve
a almacenar. No se hace ningn acceso a ninguna GDT porque simplemente no existe. El campo limite
sin embargo, no se reescribe con el valor FFFFh ni tampoco lo hace el bit G.
Esto significa que si el campo BASE de un descriptor se reescribe con el valor 0, el campo
LIMITE con el valor FFFFFh y su bit G se pone a 1, ese segmento cubrir todo el espacio de
direccionamiento del 386. Esto significa que, desde el modo real, y usando registros de 32 bits para el
desplazamiento, estaramos accediendo a toda la memoria sin el lmite de 64Kb impuesto hasta ahora.
De hecho, esto se puede hacer, y se puede optar por dos vas: conmutar momentaneamente al
modo protegido y hacer los cambios desde all usando una GDT con los valores deseados en los campos
LIMITE y G, o bien modificar directamente los descriptores cach usando la instruccin LOADALL. Para
obtener detalles sobre esta instruccin consultar la bibliografa.
Con mucho, la manera ms segura (y ms documentada) es pasar al modo protegido, crear una
GDT con una entrada que contenga el descriptor con los valores mencionados y cargar todos los registros
de segmento con la entrada de ese descriptor, con lo que su contenido pasa a los descriptores cach
correspondientes. Una vez hecho esto podemos volver al modo real, pero con los cambios en el campo
LIMITE que se necesitan.
El listado que se ofrece a continuacin hace esto mismo. Los registros de segmento afectados por
el cambio en el campo lmite son todos, excepto CS y SS.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
.model large
.data
PunteroGDT db 16
db 47 dup(0)
GDT db 0,0,0,0,0,0,0,0 ;Entrada 0. Nula
db 0ffh,0ffh,0,0,0,92h,0cfh,0ffh ;Entrada 1. BASE=0, LIMITE=4Gb
.code realmem_text
public IniciarREALMEM
IniciarREALMEM proc C
movzx eax,ds
shl eax,4
mov bx,offset GDT
movzx ebx,bx
add eax,ebx ;EAX=direccin fsica en 32 bits de la GDT
mov dword ptr PunteroGDT+2,eax
lgdt pword ptr PunteroGDT ;Cargamos la GDT
mov bx,08h ;BX=entrada 1 de la GDT
push ds
cli ;Sin interrupciones mientras estemos en el modo
protegido
mov eax,cr0 ;Cambio al modo protegido
or eax,1
mov cr0,eax
jmp ModoProtegido ;Fuerza un salto para borrar el pipeline
;de instrucciones en modo real
ModoProtegido: mov gs,bx ;Cargamos los registros de segmentos (y sus
mov fs,bx ;descriptores cach) con la entrada 1 de la GDT
mov es,bx
mov ds,bx
and al,0feh ;Salimos del modo protegido al real
mov cr0,eax
jmp ModoReal ;Se borra el pipeline de instrucciones
;en modo protegido
ModoReal: sti ;Ya se pueden restablecer las interrupciones
pop ds
ret
IniciarREALMEM endp
end
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
5.3.- El gestor de memoria extendida XMS.
Entrar en el modo REALMEM no es lo nico que hace falta para poder manejar la memoria entera
de la CPU a nuestro gusto. Es necesario que est presente un gestor de bloques de memoria que impida
conflictos de utilizacin de un mismo bloque por varios procesos. Las funciones reservar bloque y liberar
bloque de MS DOS no sirven para este propsito, ya que slo funcionan con memoria convencional.
[RAY88]
La especificacin XMS (eXtended Memory Specification) define cmo debe ser la gestin de la
memoria extendida (la que est por encima del lmite de 1Mb). Esta especificacin se ha usado como
estndar en los PC AT, y hoy en da practicamente todos los programas que requieren memoria extendida
hacen uso de los servicios proporcionados por el gestor XMS, que se incluye en las ltimas versiones del
DOS en forma de dispositivo: HiMem.Sys.
XMS define dos tipos de memoria, que son los que puede gestionar: un nico bloque de 65520
bytes alojado a partir de la direccin fsica 100000h denominado memoria alta o high memory; y un
bloque de memoria extendida situada a partir de la posicin 10FFF0h y que cubre el resto de la memoria
fsica instalada en el ordenador. Este bloque se usa como heap o montn, para servir de bloques de
memoria extendida (EMB) a los programas que los soliciten.
Para pedir memoria extendida, un programa hace uso de los servicios XMS y reserva un bloque
de x Kb de memoria. El gestor le devuelve un handler que el programa podr usar a partir de ese
momento para manipular la memoria que le ha sido asignada.
Como la especificacin XMS no tiene implementado el uso de REALMEM para el usuario, no
hay forma de escribir o leer bloques de memoria extendida. Para ello XMS provee de una funcin general
de copia ente bloques de memoria extendida, un bloque de memoria extendida y otro de memoria
convencional o bien entre dos bloques de memoria convencional. As, para leer informacin desde un
EMB se copia el mismo (o la porcin que interese) a un buffer en memoria convencional. Para escribir
datos en un EMB se copian stos a memoria convencional y con una llamada al gestor se escriben en el
EMB.
Este mecanismo es extremadamente lento para nuestros propsitos aunque los suficientemente
robusto para evitar conflictos entre procesos. Todas las operaciones han de pasar por el gestor, de manera
que es muy difcil que un programa cause un error a otro por manipular un bloque que no le corresponde.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Adems, al no usarse nunca direcciones absolutas de memoria extendidas, sino que los bloques
se referencian por su descriptor o handler, el gestor puede mover bloques de un sitio a otro para juntar
los huecos libres y evitar una excesiva fragmentacin interna del montn. Esta caracterstica sin embargo,
deber ser deshabilitada para nuestra aplicacin, como se ver despus.
El otro tipo de memoria mencionado, el bloque de memoria alta, tecnicamente forma parte de la
memoria extendida, pero tiene unas caractersticas especiales, que son independientes de que est o no
activado el modo REALMEM.
Se ha definido como el bloque cuya direccin base es 100000h, es decir, un byte ms respecto a
la ltima direccin fsica admitida (en principio) por el sistema segmento:desplazamiento en modo real
sin REALMEM. Esta direccin fsica lmite puede ser escrita de varios modos. Sea por ejemplo igual a
FFFF:000F. Haciendo los consabidos clculos comprobamos que la direccin efectiva es, como
suponamos, FFFFFh.
Pero el valor del desplazamiento puede variar entre 0000 y FFFF, y en el segmento FFFF slo
hemos usado hasta el desplazamiento 000F. Si aadimos una unidad ms, la direccin queda FFFF:0010,
que en un 8086 sabemos que significa lo mismo que la direccin 0000:0000.
Y esto es a causa de que en el 8086 el sumador que forma parte de la lgica de direccionamiento
tiene slo 20 bits, pero en el 386 ste tiene una anchura de 32 bits. Esto significa que la direccin
FFFF:0010 no hace volver a 0 la direccin de memoria, ya que esta vez el acarreo del bit 19 al bit 20 no
se pierde, sino que aparece como un bit 1 en la linea 20 del bus de direcciones, accediendo por tanto a
la posicin fsica 100000h. La ltima direccin fsica direccionable desde el modo real puro asciende por
tanto hasta la posicin 10FFEF correspondiente al par FFFF:FFFF.
Este es en definitiva el bloque conocido como high memory. Al estar en un nico segmento, no
es posible guardar en l ms de un programa, por lo que se usa comunmente para almacenar el kernel del
MS DOS (comando DOS=HIGH del config.sys).
Sin embargo, muchos programas que se escribieron en los tiempos del 8086 an siguen
conservando tncicas extraas de direccionamiento, y siguen usando el segmento FFFF para acceder a
posiciones de la tabla de interrupcin ubicada al principio de la memoria, o para acceder a la zona de
variables del BIOS. Estos programas siguen confiando en que la posicin FFFF:0010 es la misma que
0000:0000.
La solucin adoptada consiste en un artificio hard llamada habilitacin de la linea A20. El
esquema de la figura es una posible implementacin de este sistema.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.8
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 5.3.1. Esquema del circuito de habilitacin de la linea A20
Consta de un multiplexor que puede ofrecer dos salidas en funcin de una entrada de control. Si
dicha entrada vale 0, el contenido del bus de direcciones desde el bit 20 hasta el 31 es 0, con lo que
siempre se direcciona el primer Mb. Si vale 1, la parte alta del bus de direcciones el sistema es la misma
que la de la CPU con lo que se tiene acceso a toda la memoria disponible. El ncleo del MS DOS se
encarga de habilitar y deshabilitar esta lnea cuando lanza programas para su ejecucin. De esta manera,
el programa slo ve 1Mb. Cuando se hace una llamada a MS DOS ste habilita la linea A20 y salta al
ncleo en memoria alta para atender la peticin. A la vuelta, se vuelve a deshabilitar la linea A20 (en
realidad no se deshabilita, sino que se deja como estaba en el momento de llamar a MS DOS, ya que a
una aplicacin le puede interesar, sobre todo si usa XMS, el dejar habilitada esta linea).
La linea de control del multiplexor est conectada a uno de los bits del bus interno del circuito
8042. Este microcontrolador se usa en el PC AT en lugar del 8255, asumiendo adems funciones
adicionales, como la de provolcar un reset al micro, y esta misma. Sin embargo, esta implementacin no
es estndar, y hay determinados equipos (p. ej, los PS/2), que no habilitan la linea A20 de la misma
forma. Para ofrecer un interfaz comn, el gestor XMS dispone de funciones para habilitar y deshabilitar
esta linea.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.9
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
A continuacin se ofrece el fuente del gestor de memoria implementado en la biblioteca de
programas que acompaan este trabajo. El gestor es muy simple ya que no pretender ser de uso general,
sino slo para esta aplicacin. Casi todo el trabajo se deja a la XMS. Las llamadas a este gestor son las
equivalentes a malloc() y free() del lenguaje C.
El gestor usa el modo REALMEM para acceder a la memoria extendida. Se reserva una cantidad
suficiente de sta para el uso de la aplicacin y se bloquea. Esta operacin hace que el XMS no mueva
este bloque, que quedar fijo a partir de una posicin fsica de memoria. La operacin de bloqueo nos
devuielve precisamente esa direccin. El resto del trabajo consiste en asignar porciones de este bloque
al proceso segn los vaya pidiendo, guardando en un vector los datos relativos al comienzo de la porcin
y longitud de sta. El gestor ofrece un mtodo simple para fundir huecos de memoria adyacentes. Al
usuario se le devuelve un handler para referenciar uno de estos MCB (memory Control Block), a partir
del cual puede averiguar la direccin base del mismo. Este dato ser el que se use en la emulacin para
agilizar los accesos a memoria, que gracias a REALMEM se harn de manera directa, sin pasar por el
gestor XMS.
El gestor en s consta de tres mdulos: un fichero de cabecera que habr que incluir en los
programas que quieran acceder a sus servicios, un mdulo en lenguaje C con el gestor en s, y dos
mdulos en ensamblador: uno con el cdigo de interfaz entre el gestor y el driver XMS, y otro con el
cdigo de inicializacin del modo REALMEM.
XMEM.H
/*
Librera para el gestor de memoria extendida de 32 bits
-------------------------------------------------------
Esta librera provee las siguientes funciones:
X_inicia_gestor()
X_fin_gestor()
X_malloc()
X_free()
X_coreleft()
X_leer()
X_escribir()
X_direccion()
X_tamano()
Actualiza si es necesario el valor de xmserror
(C) 1994 Miguel Angel Rodrguez Jdar.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.10
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
*/
int X_inicia_gestor (unsigned int);
void X_fin_gestor (void);
int X_malloc (unsigned long);
void X_free (int);
unsigned long X_coreleft (void);
void X_leer (int, unsigned long, char *, unsigned long);
void X_escribir (char *, int, unsigned long, unsigned long);
unsigned long X_direccion (int);
unsigned long X_tamano (int);
XMEM.C
/*
Librera para el gestor de memoria extendida de 32 bits
-------------------------------------------------------
Esta librera provee las siguientes funciones:
X_inicia_gestor()
X_fin_gestor()
X_malloc()
X_free()
X_coreleft()
X_leer()
X_escribir()
X_direccion()
X_tamano()
Actualiza si es necesario el valor de xmserror
(C) 1994 Miguel Angel Rodrguez Jdar.
*/
#include <stdlib.h>
#include "xms.h"
void initcpu32 (void);
int modo_virtual (void);
static unsigned long mem_total, mem_libre;
static HXMS hmem;
static unsigned long inicio_mem, direcc_dispo;
static inhA20=0;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.11
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
enum { LIBRE, OCUPADO, BORRADO };
#define MAX_MCB 200
typedef struct {
char estado;
unsigned long direccion;
unsigned long tamano;
} MCB;
static MCB *tab_alloc;
static int ind_alloc;
#define estado(i) tab_alloc[i].estado
#define direccion(i) tab_alloc[i].direccion
#define tamano(i) tab_alloc[i].tamano
int X_inicia_gestor (unsigned kbtotales)
{
int i;
/* si la mquina est en modo virtual, salir */
if (modo_virtual())
return 0;
/* si no hay gestor XMS, salir */
if (!xms_iniciar())
return 0;
/* construir la tabla de MCB */
tab_alloc= (MCB *) malloc(MAX_MCB*sizeof(MCB));
if (!tab_alloc)
return 0;

/* calcular la cantidad de memoria a asignar por el gestor */
if (kbtotales==0)
mem_total=mem_libre=xms_disponible()*1024L;
else
mem_total=mem_libre=kbtotales*1024L;

/* entrar al modo REALMEM 32 bits si no estamos ya en l */
if ((unsigned long)getvect(0xAA)!=0x12345678)
initcpu32();
setvect(0xAA,0x12345678);
/* asignar la memoria requerida */
hmem=xms_asignar(mem_total/1024);
if (xmserror)
return 0;
/* bloquear la memoria asignada para obtener su direccin fsica */
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.12
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
inicio_mem=direcc_dispo=xms_bloquear(hmem);
if (xmserror)
return 0;
/* si la linea A20 no est habilitada, habiltala */
if (!xms_estadoA20())
{
inhA20=1;
xms_habilA20();
}
/* iniciar la tabla de MCB asignados */
for (i=0;i<MAX_MCB;i++)
{
estado(i)=LIBRE;
direccion(i)=0L;
tamano(i)=0L;
}
/* primera entrada libre en la tabla de MCB */
ind_alloc=0;
return 1;
}
int X_malloc (unsigned long tamano)
{
int i;
/* forzamos a que sea un nmero par por exceso */
tamano=(tamano+1)&0xfffffffe;
/* obtener primera entrada disponible en la tabla de MCB */
for (i=0;i<ind_alloc;i++)
if (estado(i)==LIBRE || (estado(i)==BORRADO && tamano(i)>=tamano))
break;

/* si no hay entradas libres, salir */
if (i==MAX_MCB)
return -1;

/* asignar la memoria */
switch (estado(i))
{
case LIBRE:
if (mem_libre<tamano)
return -1;
estado(i)=OCUPADO;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.13
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
direccion(i)=direcc_dispo;
tamano(i)=tamano;
mem_libre-=tamano;
direcc_dispo+=tamano;
ind_alloc++;
return i;
case BORRADO:
estado(i)=OCUPADO;
return i;
default:
return -1;
}
}
void X_fin_gestor (void)
{
free (tab_alloc);
xms_desbloquear(hmem);
xms_liberar(hmem);
if (inhA20)
xms_deshabilA20();
}
void X_free (int mcb)
{
int i,flag;
/* si el MCB dado es invlido, salir */
if (mcb>=ind_alloc)
return;
if (estado(mcb)!=OCUPADO)
return;
/* si es el ltimo MCB asignado, marcarlo como libre */
if (mcb==ind_alloc-1)
{
estado(mcb)=LIBRE;
direcc_dispo-=tamano(mcb);
mem_libre+=tamano(mcb);
direccion(mcb)=0L;
tamano(mcb)=0L;
ind_alloc--;
}
else
/* si no, marcarlo como borrado */
estado(i)=BORRADO;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.14
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
/* convertir las MCB borrados al final de la tabla en MCB libres */
for (i=MAX_MCB,flag=0;i>=0;i--)
{
if (estado(i)==BORRADO && flag==0)
flag=1;
if (estado(i)==BORRADO && flag==1)
{
estado(i)=LIBRE;
direcc_dispo-=tamano(i);
mem_libre+=tamano(i);
direccion(i)=0L;
tamano(i)=0L;
ind_alloc--;
}
if (estado(i)==OCUPADO)
break;
}
}
unsigned long X_direccion (int mcb)
{
return direccion(mcb);
}
unsigned long X_tamano (int mcb)
{
return tamano(mcb);
}
void X_escribir (char *fuente, int mcb, unsigned long offset, unsigned long
numbytes)
{
/* nos aseguramos de que el nmero es par por defecto */
numbytes&=0xfffffffe;
offset&=0xfffffffe;
/* hacemos la escritura en memoria extendida */
xms_copiar(0,fuente,hmem,(FPUNT)(direccion(mcb)-inicio_mem+offset),numbytes);
}
void X_leer (int mcb, unsigned long offset, char *destino, unsigned long numbytes)
{
/* nos aseguramos de que el nmero es par por defecto */
numbytes&=0xfffffffe;
offset&=0xfffffffe;
/* hacemos la lectura desde memoria extendida */
xms_copiar(hmem,(FPUNT)(direccion(mcb)-inicio_mem+offset),0,destino,numbytes);
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.15
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
}
unsigned long X_coreleft (void)
{
return mem_libre;
}
XMS.H
/* Fichero de cabecera para usar las funciones de manejo de XMS.
(c) 1993. Miguel Angel Rodrguez Jdar.
*/
#define HXMS unsigned int
#define BOOL int
#define FPUNT void far *
typedef struct
{
char bloqueos;
char hdisp;
unsigned int tambloque;
} XMSINFO;
extern int xmserror;
int xms_iniciar (void);
unsigned int xms_version (void);
unsigned int xms_disponible (void);
HXMS xms_asignar (unsigned int);
BOOL xms_liberar (HXMS);
BOOL xms_habilA20 (void);
BOOL xms_deshabilA20 (void);
BOOL xms_estadoA20 (void);
BOOL xms_copiar (HXMS, FPUNT, HXMS, FPUNT, unsigned long);
BOOL xms_reasignar (HXMS, unsigned int);
unsigned long xms_bloquear (HXMS);
BOOL xms_desbloquear (HXMS);
BOOL xms_info (HXMS, XMSINFO *);
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.16
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
XMS.ASM
;***************************************************************************
;* *
;* Librera de funciones XMS para C. *
;* Implementacin especfica para usar con Turbo C ++ de Borland *
;* (c) 1993. Miguel Angel Rodrguez Jdar. *
;* *
;***************************************************************************
.model large ;Asumimos el modelo largo para trabajar
;con punteros largos a memoria.
.286 ;Slo 286 y superior.
llama_xms macro popsi
local vale
mov xmserror,0
call dword ptr xmsfunc
if popsi eq 1
pop si
endif
or ax,ax
jne vale
xor dx,dx
mov al,bl
mov byte ptr xmserror,bl
ret
vale:
endm
bloque_copia struc
l_numbytes dw 0
h_numbytes dw 0
bhfuente dw 0
l_dfuente dw 0
h_dfuente dw 0
bhdestino dw 0
l_ddestino dw 0
h_ddestino dw 0
bloque_copia ends
sinfo struc
bloqueos db ?
hdisp db ?
tambloque dw ?
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.17
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
sinfo ends
.data
xmsfunc dd 0 ;puntero al inicio del controlador XMS.
xmserror dw 0
movida bloque_copia <>
public C xmserror
.code xms_codigo
public C xms_iniciar
public C xms_version
public C xms_disponible
public C xms_asignar
public C xms_liberar
public C xms_habilA20
public C xms_deshabilA20
public C xms_estadoA20
public C xms_copiar
public C xms_reasignar
public C xms_bloquear
public C xms_desbloquear
public C xms_info
xms_iniciar proc C
push es
mov ax,4300h
int 2fh ;comprobar presencia del gestor XMS
cmp al,80h
jne noesta
mov ax,4310h
int 2fh ;obtener direccin de llamada del gestor
mov word ptr xmsfunc,bx
mov word ptr xmsfunc+2,es
mov ax,1
pop es
ret
noesta: xor ax,ax
pop es
ret
xms_iniciar endp
xms_version proc C
mov ah,0 ;obtener versin en AX
llama_xms 0
ret
xms_version endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.18
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
xms_disponible proc C
mov ah,8 ;obtener XMS libre (mayor bloque EMB) en Kb
llama_xms 0
ret
xms_disponible endp
xms_asignar proc C mempedida:word
mov ah,9
mov dx,mempedida;dada en Kb
llama_xms 0 ;Asignar bloque de EMB
mov ax,dx ;handle en AX para retorno
xor dx,dx
ret
xms_asignar endp
xms_liberar proc C handle:word
mov ah,0ah
mov dx,handle ;liberar EMB
llama_xms 0
ret
xms_liberar endp
xms_habilA20 proc C
mov ah,05h
llama_xms 0
ret
xms_habilA20 endp
xms_deshabilA20 proc C
mov ah,06h
llama_xms 0
ret
xms_deshabilA20 endp
xms_estadoA20 proc C
mov ah,07h
llama_xms 0
ret
xms_estadoA20 endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.19
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
xms_copiar proc C hfuente:word, dfuente:dword, hdestino:word, ddestino:dword,
numbytes:dword
mov ax,word ptr numbytes
mov movida.l_numbytes,ax
mov ax,word ptr numbytes+2
mov movida.h_numbytes,ax
mov ax,hfuente
mov movida.bhfuente,ax
mov ax,word ptr dfuente
mov movida.l_dfuente,ax
mov ax,word ptr dfuente+2
mov movida.h_dfuente,ax
mov ax,hdestino
mov movida.bhdestino,ax
mov ax,word ptr ddestino
mov movida.l_ddestino,ax
mov ax,word ptr ddestino+2
mov movida.h_ddestino,ax
push si
mov si,offset movida
mov ah,0bh ;Mover bloques EMB
llama_xms 1
ret
xms_copiar endp
xms_reasignar proc C handle:word, longitud:word
mov dx,handle
mov bx,longitud
mov ah,0fh
llama_xms 0
ret
xms_reasignar endp
xms_bloquear proc C handle:word
mov dx,handle
mov ah,0ch
llama_xms 0
mov ax,bx
ret
xms_bloquear endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.20
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
xms_desbloquear proc C handle:word
mov dx,handle
mov ah,0dh
llama_xms 0
ret
xms_desbloquear endp
xms_info proc C handle:word, pinfo:ptr sinfo
mov dx,handle
mov ah,0eh
llama_xms 0
push es
les si,pinfo
mov es:[si].bloqueos,bh
mov es:[si].hdisp,bl
mov es:[si].tambloque,dx
pop es
ret
xms_info endp
end
CODE32.ASM
.model large
.data
mem48 db 6 dup (0)
gdt db 8 dup (0)
db 0FFh, 0FFh, 0, 0, 0, 92h, 0CFh, 0FFh
.code pmode32
public C initcpu32
public C modo_virtual
modo_virtual proc C
.386p
smsw ax
and ax,1
ret
.286
modo_virtual endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 5.21
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
initcpu32 proc C
.386p
mov mem48,16
mov eax,seg gdt
shl eax,4
mov bx,offset gdt
movzx ebx,bx
add eax,ebx
mov dword ptr mem48+2,eax
lgdt pword ptr mem48
mov bx,08h
push ds
cli
mov eax,cr0
or eax,1
mov cr0,eax
jmp ModoProtegido
ModoProtegido: mov gs,bx
mov fs,bx
mov es,bx
mov ds,bx
and al,0FEh
mov cr0,eax
jmp ModoReal
ModoReal: sti
xor ax,ax
mov fs,ax
mov gs,ax
pop ds
ret
.286
initcpu32 endp
end
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
6. DESCRIPCION DEL HARDWARE DE
AUDIO A IMPLEMENTAR EN EL PC.
6.1. Esquema funcional y elctrico.
El prototipo de la tarjeta de audio desarrollada consta de una placa madre que lleva la lgica
necesaria para generar las seales de chip select a los diferentes mdulos conectados a ella. A travs de
conectores tipo bus ISA se envan a estos mdulos alimentacin, bus de datos, seales de control y
seales analgicas.
Los mdulos conectados son cuatro: un DAC para el canal izquierdo de audio, otro para el canal
derecho, un conversor ADC y un timer programable tipo 8253.
La alimentacin proviene de otra placa, y suministra 3 tensiones: +5V, +12V y -12V. La tensin
de 5 voltios se usa para los circuitos digitales y para las referencias de tensin del ADC. Este ltimo
tambin se alimenta con 5 voltios. La corriente suministrada es alrededor de 700mA.
Las tensiones de +/- 12V alimentan a todos los amplificadores operacionales, a los DACs y
eventualmente, a un amplificador de potencia exterior. La corriente suministrada en este caso es alrededor
de 3A.
La placa madre se conecta por una parte al mdulo de alimentacin, por otra al puerto paralelo
del PC mediante un conector Centronics de 36 pines. Dispone de una entrada analgica conectada
directamente a la tarjeta ADC, y dos salidas analgicas provenientes de los dos DACs. El nivel de cada
salida se puede calibrar por separado con ayuda de un potencimetro, antes de pasar a la etapa de
potencia.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.1. Esquema de bloques de la tarjeta.
A continuacin estudiaremos el funcionamiento de cada mdulo por separado, y despus veremos
cmo se realiza el interfaz con el puerto paralelo.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.2. Esquema elctrico de la etapa de conversin digital-analgica.
El conversor digital-analgico.
Para describir este mdulo lo dividiremos en tres secciones:
T Latch de almacenamiento de muestras.
T Conversor digital-analgico.
T Filtro pasa-bajos de salida.
El esquema elctrico corresponde al de la figura 6.1.2.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
La primera seccin consta de un circuito integrado 74HCT573 que es un latch de 8 bits con carga
por nivel alto y salida no invertida. Este latch tiene su bus de entrada conectado al bus del sistema,
estando la entrada de habilitacin de carga conectada al puerto paralelo a travs de la lgica de
decodificacin. Cuando se reciba un 1 en esta entrada, el bus de salida del latch seguir las variaciones
de los bits del bus del sistema, y cuando valga 0, el bus de salida retendr el ltimo valor binario aplicado
en la entrada. Este circuito nos permitir retener un valor para aplicarlo al circuito DAC mientras el bus
est ocupado con otro dispositivo.
La salida del 74HCT573 va directamente al conversor digital-analgico (DAC). Para este proyecto
se ha usado un DAC0808 por su bajo coste, su velocidad de respuesta y su facilidad de uso. Dispone de
dos entradas por donde circula una corriente de referencia Iref, fijada mediante dos resistencias de 7,5K.
Sus entradas admiten un dato de 8 bits en binario natural, dando la salida en dos patillas Iout y Iout\. La
primera ofrece una corriente cuyo valor es Iref*DATO/256, y la segunda tiene un valor igual a
Iref*(DATO complementado)/256.
Como necesitamos el valor analgico en forma de tensin, las patillas Iout e Iout\ van a uno de
los amplificadores operacionales que posee el integrado doble operacional TL082, que se emplea aqu
como conversor corriente-tensin.
La salida de este primer operacional ya es una tensin analgica, pero todava tiene discontinuida-
des que aparecen como escalones en el osciloscopio. Para suavizar stos, y por tanto, eliminar
armnicos indeseados, se recurre al empleo de un filtro paso bajos de 2 orden activo formado por el
segundo operacional del TL082 y sus componentes asociados, conectado a la salida del DAC y acoplado
al mismo mediante un condensador electroltico de 22uF. Los componentes del filtro se han calculado
para que la frecuencia de corte est prxima a los 18KHz. La salida puede ir ya hacia el amplificador de
potencia o equipo de grabacin.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
El conversor analgico-digital
Al igual que el mdulo anterior, ste se puede dividir en tres secciones:
T Circuito de entrada y acomodacin de seal.
T Conversor analgico-digital.
T Buffer triestado.
El esquema elctrico corresponde a la figura 6.1.3.
El circuito de entrada tiene una doble funcin. Por una parte, amplifica las seales de audio
presentes en su entrada hasta un nivel aceptable, y por otra parte, introduce un offset en la salida de tal
forma que la seal que resulta de esta etapa es unipolar y comprendida entre 0 y 5V. Est compuesto por
un operacional tipo 741 o TL081 configurado como amplificador inversor con una ganancia igual a 10.
La patilla no inversora est conectada a una tensin de 4,5V para que el operacional en ausencia de seal
entregue este valor al ADC. Dicha tensin de offset es regulable gracias a un potencimetro multivuelta.
En el montaje se debe calibrar este potencimetro de tal forma que cortocircuitando la entrada del
operacional a masa, y con todos los componentes del mdulo en funcionamiento, ste d una salida igual
a 128d.
El conversor analgico-digital es un ADC0820 de National Semiconductor. Este circuito tiene
unas caractersticas muy interesantes que merece la pena destacar. En principio, y an sin tener un precio
elevado, tiene un periodo de conversin de 2us como mximo. Esto es posible ya que combina dos
ADCs de 4 bits tipo flash en una sola pastilla. Uno de los conversores ofrece los 4 bits ms
significativos, y el otro los 4 bits menos significativos. El proceso de conversin tiene dos fases:
En la primera se enfrenta la seal de entrada al primer conversor flash que ofrece directamente
una salida digital correspondiente a los 4 primeros bits. Esta salida va a un DAC que la vuelve a convertir
a analgica.
En la segunda fase la seal de entrada se resta de la seal analgica convertida, y el resultado se
ofrece al segundo convertidor flash. Su resultado es la parte menos significativa del dato completo de 8
bits.
El conversor puede funcionar en dos modos, segn el valor de la patilla MODE. Si MODE vale
0, el conversor trabaja en modo WR, y si vale 1 trabaja en modo RD-WR o en el modo Stand-alone
operation. Este ltimo ser el que se use, por permitir que el conversor funcione independientemente del
resto del sistema. El cronograma de las seales del ADC en este modo es el de la figura 6.1.4.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.3. Circuito del mdulo de conversin analgico-digital.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.4. Cronograma del funcionamiento combinado ADC0820-8253
Las entradas CS\ y RD\ estn permanentemente a nivel bajo. En esta situacin una conversin
empieza con el flanco de subida de WR\. Aproximadamente 1us despus, la salida INT pasa a nivel alto
indicando el fin de la conversin. Esta salida INT va por una parte a la placa principal para ser enviada
como seal de interrupcin. Por otra parte va a la entrada GATE1 del temporizador 8253. El pulso de INT
provoca que el 8253 inicie una cuenta que se habr programado con anterioridad. Al finalizar dicha
cuenta se generar un pulso de nivel bajo en la salida OUT1 del timer, que est conectada a la entrada
WR\ del ADC. De esta forma se provocan conversiones de manera automtica y a una frecuencia de
muestreo elegida por el usuario.
Como la entrada CS\ va a estar siempre activada, la salida digital est siempre disponible en el
bus de salida del conversor, pero ello podra acarrear conflictos si es el ordenador quien va a escribir en
l. Por ello es necesario el uso de un buffer provisto de habilitacin tri-estate. El integrado elegido es el
74HCT541 que dispone de un bus de entrada, otro de salida no invertida. Dos seales G1\ y G2\ habilitan
ste ltimo al forzarlas a nivel bajo, lo que nos posibilitar desconectar desde el ordenador el ADC del
bus sin perjuicio de que cesen las conversiones. Adems protege al ADC de una sobrecarga en sus buses.
Esto puede pasar ya que el mtodo que se va a usar para escribir un dato en el puerto paralelo consistir
en poner todas las lineas de datos del bus a 1 lgico, y despus hacer que el dispositivo que escribe fuerce
las lineas que desee a 0 para escribir el dato. Se necesita por tanto un integrado que tenga la fuerza
suficiente como para vencer a la tensin existente en el bus.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.8
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Temporizador programable.
Consta de un circuito integrado 8253 de Intel igual al de los primeros PC, ms un oscilador que
genera una seal cuadrada de 1,17924375MHz. Este oscilador consta de un cristal oscilador de
18,8679MHz y un circuito contador de 4 bits 74161 del que slo se emplea la ltima salida, en donde
encontramos una seal de reloj de frecuencia igual a 1/16 de la frecuencia de reloj de entrada.
El circuito de este mdulo es el 6.1.5. Como se puede ver el timer tiene casi todas sus lineas de
control conectadas a la regleta de conexiones. Realmente es la placa madre la que provee de seales de
control a este mdulo. De sus tres contadores, el 0 se usa como generador de onda cuadrada para generar
una interrupcin peridica que ser la que provoque el disparo del emulador DMA. El contador 1 se
emplea para provocar que el ADC0820 este continuamente realizando conversiones y se programa en el
modo hardware triggered strobe. El contador 2 no se usa.
Como seal de habilitacin por parte de la placa madre se usa la propia entrada CS\ del 8253. La
entrada RD\ est siempre a 1 ya que no se van a hacer lecturas de este dispositivo. Las entradas A1 y A0
seleccionan uno de los cuatro registros internos del timer. Todas las entradas de control estarn bajo el
control del ordenador, quien ser el responsable de activarlas de acuerdo con la secuencia de escritura que
indica el fabricante.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.9
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.5. Circuito del temporizador generador de interrupciones.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.10
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Placa principal del sistema.
Es quien acta de interfaz entre los mdulos y el puerto paralelo. Se encarga de gestionar las
lineas de control desde el puerto parlelo hacia los mdulos, y de estos a las lineas de estado hacia el
ordenador.
El puerto paralelo tiene 4 lineas de control: C0, C1, C2 y C3 pero entre todos los dispositivos, las
entradas de control son 7: 4 para cada chip select ms 3 para las lineas A1, A0 y WR\ del 8253. Como
slo podemos usar un puerto paralelo, y no es conveniente usar las lineas del propio bus de datos como
lineas de control (ello obligara a usar ms escrituras en el puerto para realizar una operacin) debemos
hallar una forma de compartir estas seales de control.
La solucin ms simple y que implica menos intervencin software consiste en lo siguiente: en
primer lugar se asignan estas 4 seales a los chip select de los 4 mdulos. As, C0 ir al DAC izquierdo,
C1 al derecho, C2 al ADC y C3 al timer. De los cuatro mdulos, tres de ellos (los dos DACs y el ADC)
deben poder estar activos a un tiempo mientras que el timer slo debe estar activo mientras se realiza la
escritura de un contador. Adems la operacin de escritura del 8253 es incompatible con la emisin de
muestras a alguno de los DACs o la recogida de muestras desde el ADC, por lo que estos tres mdulos
deben quedar completamente desconectados del bus. Esto se consigue usando la seal C3 del timer como
cerrojo para el resto las otras 3 seales de control. As, si el C3 vale 1, ste quedar inactivo y las otras
tres seales estarn conectadas a las entradas de habilitacin de los mdulos. En cambio, si vale 0, la
seal C0 pasar a ser WR del 8253, C1 pasa a ser A1\ y C2 se conecta a A0.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.11
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Registro de control del puerto paralelo.
no usada no usada no usada EN_INT C3 C2 C1 C0
7 6 5 4 3 2 1 0
ENT_INT tiene el mismo significado que EN_ACK. Si vale 1 se permiten interrupciones
provenientes de este puerto, y si est a 0 se deshabilitan.
Seal C3=0 (no timer) C1=1 (con timer)
C2 0=Deshabilitar salida del ADC
1=Habilitar salida del ADC
0=Selecciona A0=0
1=Selecciona A0=1
C1 0=Habilitar DAC derecho
1=Deshabilitar DAC derecho
0=Selecciona A1=1
1=Selecciona A1=0
C0 0=Habilitar DAC izquierdo
1=Deshabilitar DAC izquierdo
0=Impide escritura en el 8253
1=Permite escritura en el 8253
La nica seal de entrada al puerto paralelo que se usa es ACK\ que dispara la interrupcin del
puerto paralelo cuando alguna de las dos lineas de interrupcin posibles (OUT0 o INT) pasan de 0 a 1.
El circuito elctrico de la placa principal es el de la figura 6.1.6.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.12
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.6. Circuito de la placa madre.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.13
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura 6.1.7. Esquema elctrico del mdulo de alimentacin.
Mdulo de alimentacin.
Est construido alrededor de los integrados reguladores 7805, 7812 y 7912. Estas tres tensiones
se recogen de dos transformadores, siendo rectificadas por sendos puentes de diodos. Cada salida de
tensin est filtrada por un condensador de alta capacidad (2200uF). Un condensador de 100nF de
polister se encarga de derivar a tierra cualquier seal que se pudiera filtrar desde los circuitos digitales
a causa de las transiciones bruscas de nivel que provocan. El circuito por lo dems es el estndar para
estos casos, siendo innecesario cualquier otro comentario. La figura 6.1.7 muestra su esquema.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.14
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
6.2.- Programacin de la tarjeta de sonido.
En la seccin anterior se ha mostrado una tabla con los bits de control que controlan el
funcionamiento de la tarjeta. En sta se darn algunos ejemplos de funcionamiento.
Para ello, supondremos que el puerto de datos tiene la etiqueta lptdata, el puerto de estado lptstd
y el puerto de control lptctrl.
La tarjeta permite realizar, entre otras, las siguientes operaciones:
L Utilizacin de cualquiera de los dos DACs o los dos a un tiempo para reproducir sonido
monoaural.
L Utilizacin de los dos DACs en modo estreo.
L Modo escucha: muestreo desde el ADC y reproduccin simultnea en cualquiera de los
DACs sin intervencin de la CPU.
L Modo multiplexado: muestreo desde el ADC y reproduccin en mono o estreo de otra
muestra independiente de la convertida por el ADC.
L Cambio de la frecuencia de muestreo tanto de reproduccin como de conversin ADC.
Utilizacin de cualquiera de los dos DACs o los dos a un tiempo para reproducir sonido
monoaural.
Para ello slo hay que activar cul o cules queremos usar. Para ello basta hacer un OUT al puerto
lptctrl con los bits del DAC correspondiente a 0. Despus basta con enviar datos al puerto lptdata sin tener
que usar ningn protocolo.
Utilizacin de los dos DACs en modo estreo.
Se activar alternativamente el DAC izquierdo y el derecho. En cada activacin se escribir el
dato deseado a lptdata para que cada DAC lo recoja. Un procedimiento para hacer esto sera:
Procedimiento Estereo (dato_izq, dato_der)
out lptctrl,00000011b ;desactivamos los DACs.
out lptdata,dato_izq ;ponemos dato_izq en el bus del sistema.
out lptctrl,00000010b ;activamos el DAC izquierdo para que lea
;la muestra en su latch.
out lptctrl,00000011b ;desactivamos DAC izquierdo. El dato
;sigue en su latch.
out lptdata,dato_der ;ponemos dato_der en el bus del sistema.
out lptctrl,00000001b ;activamos DAC derecho.
out lptctrl,00000011b ;desactivamos DAC derecho.
Fin
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.15
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Modo escucha: muestreo desde el ADC y reproduccin simultnea en cualquiera de los DACs sin
intervencin de la CPU.
Esta operacin se inicia activando el bit C2 para permitir que el ADC vuelque sus datos al bus,
y poniendo a 0 los bits C1 y/o C0 para escuchar lo que est siendo digitalizado en ese momento. El dato
tambin est presente en el puerto paralelo desde donde el ordenador lo puede leer usando como
protocolo la seal ACK (condicin ACK=1) o la interrupcin correspondiente.
Es necesario haber inicializado el contador 1 con un valor vlido para la frecuencia de muestreo
del ADC para que aqul enve solicitudes de conversin a ste.
Modo multiplexado: muestreo desde el ADC y reproduccin en mono o estreo de otra muestra
independiente de la convertida por el ADC.
Este es el modo ms flexible que tiene la tarjeta. De esta manera se usa el bus como si hubiera dos
distintos: uno de entrada desde el ADC a la CPU y otro de salida desde la CPU a los DACs. Para ello
hay que dedicar un tiempo de bus a cada dispositivo, siendo el ordenador el encargado de gestionarlo.
Este mecanismo permite realizar efectos en tiempo real tales como eco, reverb, distorsin u otros
ms complejos y espectaculares.
El siguiente procedimiento muestra cmo usar este modo:
Procedimiento Lee_y_escribe (dato_izq, dato_der, var dato_entrada)
Estereo (dato_izq, dato_der)
out lptdata,11111111b ;Pone el bus a nivel alto para poder escribir en l
out lptctrl,00010111b ;Habilita ADC e interrupcin del timer
dato_entrada= in (lptdata) ;Lee la muestra y la pone en la variable de salida
Fin
Esta funcin debe ser llamada desde dentro de la interrupcin del ADC. Si no se quieren usar
interrupciones se debe chequear el estado del bit 6 de lptstd. El paso del valor de este bit de 0 a 1 indica
que hay datos disponibles. El chequeo debe producirse justo antes de la lectura del ADC.
Cambio de la frecuencia de muestreo tanto de reproduccin como de conversin ADC.
Para ello habremos de programar al 8253 de la tarjeta segn se ha indicado (modo 3 para la
interrupcin peridica de los DACs y modo 5 para la del ADC). El esquema de programacin de un
circuito 8253 se vio en el captulo 4. Aqu la cosa no es tan sencilla. Lo que en el timer del sistema es un
simple OUT, aqu se convierte en un procedimiento entero, que escribiremos en lenguaje C para este
ejemplo. Los pasos que se ejecutan son:
T Deshabilitar todos los dispositivos.
T Poner en el bus del sistema el valor que se va a escribir en el 8253.
T Activar C3. Programar C2 y C1 dependiendo del registro interno al que se vaya a acceder. Poner
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 6.16
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
C0=1 para permitir la escritura.
T Esperar un tiempo para que los registros internos del 8253 tengan tiempo de recoger el dato.
T Desactivar C3 con lo que el timer queda desconectado del bus.
El procedimiento es el siguiente:
void e8253 (int a1, int a0, int valor)
{
int mascara;
mascara=(a0<<2)|((!a1)<<1)|0x19;
outp(lptdata,valor);
outp(lptctrl,mascara);
esperar(); /* se realiza una espera de unos cuantos microsegundos */
outp(lptctrl,mascara&0xfe);
}
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
7. LA RUTINA DE EJECUCION DEL
INTERPRETE MOD
7.1.- Descripcin del funcionamiento del intrprete MOD.
El intrprete MOD que presentaremos en este captulo est basado en las ideas que se han
expuesto en los captulos precedentes. Las caractersticas de este intrprete son:
T Soporta 4 canales de sonido digital en 8 bits completamente independientes.
T Puede reproducir sonido a travs del altavoz interno, un DAC en el puerto paralelo, una Sound
Blaster o bien a travs de la tarjeta de proyecto descrita.
T Soporta tanto mezcla monoaural como mezcla estereofnica (la nativa del Amiga).
T Optimizado para frecuencias de muestreo de hasta 32KHz.
T Cada instrumento puede ocupar tanto espacio como memoria haya en el sistema rompiendo la
barrera de 64K por instrumento.
T Los instrumentos se almacenan en memoria extendida XMS dejando la mayor parte de la
memoria convencional libre.
T Se soportan casi todos los comandos de la versin 2.0 de la especificacin .MOD
T Se usa el modelo de memoria 32-bit flat pointer para asegurar la compatibilidad con DOS y
permitir la compilacin con un compilador estndar de 16 bit para DOS (Turbo C++ 1.0).
T Ampliable hasta 16 canales sin disminucin de la frecuencia de muestreo.
Durante su funcionamiento se usan las siguientes estructuras de datos:
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Tabla de instrumentos.
Es una matriz de 31 entradas. Cada entrada es un registro con el siguiente contenido:
st_ins struc
nombre_ins db 22 dup(?)
long_ins dw ?
volum_ins dw ?
loop_s dw ?
loop_l dw ?
base_ins dd ?
mcb dw ?
st_ins ends
Cada entrada de esta matriz se rellena con los datos proporcionados por el fichero .MOD. El
campo base_ins se rellena en el momento de pedir memoria para el instrumento, y contiene la direccin
fsica (no el descriptor) de la primera muestra del instrumento. El descriptor se almacena en el campo
mcb (Memory Control Block) para poder acceder al instrumento desde el mdulo cargador.
Los campos loop_s y loop_l contienen respectivamente el desplazamiento en bytes desde el
principio del instrumento de la primera muestra que interviene en el loop, y la longitud en bytes del
mismo. La porcin de instrumento definida por estos campos se leer una y otra vez despus de haberse
ledo todas las muestras del instrumento una vez. Esto sirve para definir sonidos ininterrumpidos. Si el
instrumento no tiene loop, estos campos valdrn respectivamente 0 y 1.
El volmen del instrumento, volum_ins, es el volmen al que se leer el instrumento, si no hay
ningn comando que altere este valor. El rango es el usual en los MOD: de 0 a 64.
La longitud del instrumento se almacena en un entero de 2 bytes, long_ins, por lo cual, y en
principio solo se permiten instrumentos de hasta 64K. La rutina intrprete convierte este valor en 32 bits
de modo que alterando el mdulo de carga se pueden leer instrumentos de ms de 64K.
El campo nom_ins contiene el nombre del instrumento. Originalmente este campo guardaba la
trayectoria completa del fichero donde estaba almacenado, ya que el original Sound Tracker mantena en
discos separados cada uno de los grupos de instrumentos de que constaba su librera de sonidos. Cuando
se cargaba una cancin dentro de este programa, este campo indicaba dnde haba que buscar el fichero
que contena el instrumento requerido. No se usa durante el funcionamiento de esta rutina.
Tabla de punteros a patrones.
Es un vector de 64 posiciones. Cada posicin es un puntero largo de modo real al principio de cada uno
de los patrones que forman el mdulo.Cada patrn contiene los datos de los 4 canales para un total de 64
lineas de ejecucin.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Registro de canal.
Existe uno por cada canal de sonido que se va a emular. Contiene todos los datos que hacen falta durante
la mezcla digital.
Es el ms usado, y debe ubicarse en una direccin de memoria que sea frontera de doble palabra
a fin de optimizar los accesos a cada uno de sus campos.
Su contenido es el siguiente:
st_muest struc
fin_muest dd 1
pri_muest dd 0
looplm dd 1
loopsm dd 0
basetabla dw 0
volumen dw 0
vol_play dw 0
vol_tabla dw 0
pitch dw 0
valor_slide dw 0
arpegio1 dw 0
arpegio2 dw 0
valtslide dw 0
finslide dw 0
valor_pitch dw 0
num_ins db 0
valefecto db 0
flag_pitch db 0
flag_slide db 0
flag_arpegio db 0
flag_tslided db 0
flag_tslideu db 0
st_muest ends
Este registro se actualiza con cada llamada al bucle de mezcla (que se describir ms adelante).
Los cuatro primeros campos se rellenan con los correspondientes valores del instrumento ledo en cada
canal definido en la linea actual del patrn actual del mdulo. Esta funcin la realiza la macro act_canal.
El campo volumen contiene el valor del volmen por defecto del instrumento, o el volmen actual
definido por cualquiera de los comandos que alteran su valor.
El campo vol_play contiene el valor del volmen real con el que ser tocado el instrumento. Este
valor difiere del del campo volumen en que aqul est afectado por el valor del volmen general del
canal, seleccionable por el usuario. El contenido de vol_play es, en cada instante igual a
volumen*volumen_del_canal/256.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
El campo vol_tabla contiene el valor de un puntero corto (referido a DS) que apunta a una tabla
de 256 posiciones. Cada valor de esta tabla es el resultado de multiplicar el valor de la muestra leda por
el valor de vol_play y dividido entre 64. El valor de este campo cambia cada vez que lo hace vol_play,
y permite multiplicar y dividir bytes con mucha mayor rapidez que con la instruccin imul (se ganan de
5 a 10 ciclos por multiplicacin).
El campo pitch contiene el valor de la nota en el formato en que es usada en el Amiga.
Cuando se vio el apartado referente al 8364 se apunt que la manera de almacenar la frecuencia de
muestreo de cada canal era a travs de un divisor que divida a la frecuencia base de funcionamiento del
chip. Este valor es el que se usa en los comandos que pueden alterarlo (slide, arpegio, toneslide, etc...).
El intrprete no puede usar este valor directamente para manejar el tono de la muestra. En el
captulo 5 se introdujo la manera de hacer sonar distintas muestras a distintas frecuencias de muestreo
menores que un valor de frecuencia de muestreo mxima, usando un solo timer (y por tanto una sola
frecuencia de muestreo comn). En el Amiga esto no hace falta dado que cada canal tiene su propio timer
y su propia lgica de DMA, pero aqu slo tenemos un timer.
El procedimiento que se describi en su momento consiste en usar una tabla de incrementos
definida para cada nota posible. Esta tabla contiene los valores que se han de aadir al valor del campo
pri_muest para que vaya direccionando una a una las diferentes muestras que componen el instrumento
al ritmo indicado por la nota que se quiere tocar. Esto es, si la tabla contiene los valores 1,0,1,0,1,0,... el
instrumento se tocar a la mitad de la frecuencia de muestreo nominal. Si contiene los valores
1,1,0,1,1,0,1,1,0,... el instrumento se leer a un ritmo de 2/3 de la frecuencia de muestreo nominal.
Cada vez que se recalcula el valor de pitch se usa para calcular la direccin de la correspondiente
tabla de incrementos. Esta direccin se guarda en el campo basetabla.
El nmero de instrumento usado se guarda en el campo instrumento.
El resto de los campos estn relacionados con los distintos comandos soportados por el intrprete
y se discutirn cuando se comente la rutina de clculo de efectos.
canal4_mono macro
local buc_canal1,buc_canal2,buc_canal3,buc_canal4
local setloops_c1,setloops_c2,setloops_c3,setloops_c4
local fin_canal1,fin_canal2,fin_canal3,fin_canal4
; Uso de los registros
; ECX = contador del bucle
; EDX = proximo valor de la tabla Bresenham
; EBX = direccion base de la tabla Bresenham
; EBP = puntero a la muestra a leer
; ES:DI = puntero al buffer DMA
; EAX = muestra leda
; ESI = direccion de la tabla de volumenes para cada canal
;Procesando canal 1
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
movzx ecx,bytes_trans ; Longitud buffer DMA
les di,bloque_lle ; Direccin buffer DMA
movzx edx,br_indice ; Indice al proximo valor de la tabla de incrementos
mov ebp,tab_muest1.pri_muest ; Direccin de la prxima muestra a leer
movzx esi,tab_muest1.vol_tabla ; Tabla de traduccin para el volmen de este canal
movzx ebx,tab_muest1.basetabla ; Direccin base de la tabla de incrementos para esta nota
xor eax,eax ; Ponemos a 0 todo el registro EAX.
buc_canal1: mov al,fs:[ebp] ; AL=muestra actual
mov al,[esi+eax] ; AL=AL*volumen1/128
stosb ; Almacena muestra
mov al,[ebx+edx] ; Lee el valor para incrementar el puntero a la prxima
muestra
inc dl ; Incrementa ndice a la tabla de incrementos
add ebp,eax ; Actualiza puntero a la siguiente muestra
cmp ebp,tab_muest1.fin_muest ; "Se ha terminado de leer la muestra o el loop?
ja setloops_c1 ; S, vuelve al principio del loop
loop buc_canal1 ; Siguiente muestra
jmp fin_canal1 ; Fin de este canal
setloops_c1: mov ebp,tab_muest1.loopsm ; EBP=principio del loop
mov eax,tab_muest1.looplm
mov tab_muest1.fin_muest,eax ; fin_muestra ahora es el fin del loop
xor eax,eax ; Volvemos a borrar EAX
loop buc_canal1 ; Y seguimos leyendo muestras
fin_canal1: mov tab_muest1.pri_muest,ebp ; Almacenamos el puntero a la siguiente muestra
;Procesando canal 2 (la mecnica es anloga al canal 1)
movzx ecx,bytes_trans
les di,bloque_lle
mov ebp,tab_muest2.pri_muest
movzx esi,tab_muest2.vol_tabla
movzx ebx,tab_muest2.basetabla
xor eax,eax
buc_canal2: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add es:[di],al ; En lugar de almacenar la muestra se a'ade a la anterior
inc di ; Incrementamos el puntero al buffer DMA
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest2.fin_muest
ja setloops_c2
loop buc_canal2
jmp fin_canal2
setloops_c2: mov ebp,tab_muest2.loopsm
mov eax,tab_muest2.looplm
mov tab_muest2.fin_muest,eax
xor eax,eax
loop buc_canal2
fin_canal2: mov tab_muest2.pri_muest,ebp
;Procesando canal 3
movzx ecx,bytes_trans
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
les di,bloque_lle
mov ebp,tab_muest3.pri_muest
movzx esi,tab_muest3.vol_tabla
movzx ebx,tab_muest3.basetabla
xor eax,eax
buc_canal3: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add es:[di],al
inc di
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest3.fin_muest
ja setloops_c3
loop buc_canal3
jmp fin_canal3
setloops_c3: mov ebp,tab_muest3.loopsm
mov eax,tab_muest3.looplm
mov tab_muest3.fin_muest,eax
xor eax,eax
loop buc_canal3
fin_canal3: mov tab_muest3.pri_muest,ebp
;Procesando canal 4
movzx ecx,bytes_trans
les di,bloque_lle
mov ebp,tab_muest4.pri_muest
movzx esi,tab_muest4.vol_tabla
movzx ebx,tab_muest4.basetabla
xor eax,eax
buc_canal4: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add al,80h
add es:[di],al
inc di
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest4.fin_muest
ja setloops_c4
loop buc_canal4
jmp fin_canal4
setloops_c4: mov ebp,tab_muest4.loopsm
mov eax,tab_muest4.looplm
mov tab_muest4.fin_muest,eax
xor eax,eax
loop buc_canal4
fin_canal4: mov tab_muest4.pri_muest,ebp
mov br_indice,dx ; Almacenamos ndice al prximo valor de la tabla de
incrementos
endm
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
El emulador DMA.
Consiste en una rutina activada por un timer, que en el caso de la tarjeta de proyecto es el propio
timer de la misma, y en un DAC simple es el timer del sistema. Esta rutina simplemente carga el puntero
de direccin actual y lee el siguiente dato a enviar al puerto paralelo (o a los dos siguientes, si es estreo)
.Las muestras se envan entonces usando el protocolo adecuado:
L Si el dispositivo de salida es el altavoz interno, usa la tabla COMPRES.INC para obtener el
verdadero valor de la muestra que se enviar.
L Si es un DAC simple conectado a las lineas de datos de un puerto paralelo, se enva la muestra
a ste sin ms.
L Si es la tarjeta de proyecto, se activa el canal izquierdo y se enva la muestra correspondiente. Se
desactiva ste, y se activa el derecho envindose tambin su muestra. Despus se desactivan los dos.
Una vez cmpletada la transferencia se decrementa el contador del emulador DMA, y si lleg a 0
se llama a la rutina prep_datos, que corresponde a las tareas a realizar cuando se da la condicin de EOC
(End Of Count) en el emulador.
Finalmente, se restauran los registros, se manda un EOI al 8259 y se sale de la rutina.
Este es el fuente de la rutina de interrupciones para el caso de la tarjeta de proyecto:
intproy proc far
push ax
push bx
push dx
push si
push ds
push es
mov al,20h
out 20h,al
mov ax,dgroup
mov ds,ax
cmp terminado,0
jne fin_iproy
les si,bloque_dma
mov bx,indice_int
mov al,es:[bx+si]
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.8
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov dx,lptdata
out dx,al
mov al,00010010b
mov dx,lptctrl
out dx,al
jmp $+2
mov al,00010011b
out dx,al
jmp $+2
mov al,es:[bx+si+1]
mov dx,lptdata
out dx,al
jmp $+2
mov al,00010001b
mov dx,lptctrl
out dx,al
jmp $+2
mov al,00010011b
out dx,al

add indice_int,2
sub cont_int,2
jz fin_bl_pry
fin_iproy: pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
fin_bl_pry: call prep_datos
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
intproy endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.9
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Rutina de clculo de efectos.
Los efectos se procesan 50 veces por segundo. En el Amiga esta tarea la haca una rutina disparada
por la interrupcin del retrazo vertical del monitor. Esto supona una frecuencia de 50Hz (60Hz) en los
Amiga del mercado estadounidense). El retrazo vertical es el recorrido que hace el rayo catdico del tubo
de imagen del monitor cuando viaja desde la esquina inferior derecha hasta la superior izquierda, para
empezar a dibujar una nueva imagen. Mientras sucede no se dibuja nada en la pantalla. En cuanto se
inicia se dispara dicha interrupcin, que suele utilizarse para dibujar en la memoria de pantalla de tal
manera que cuando la nueva imagen empieza a dibujarse en el monitor ya est completa en la RAM de
video por lo que no se aprecian discontinuidades o parpadeos durante una animacin.
Aunque la tarjeta de sonido usada en el proyecto nos proporciona una linea de interrupcin
dedicada a la emulacin de la DMA, y podramos usar el timer del PC para esta tarea, hemos preferido
no usar ste, sino aprovechar la seal de interrupcin de fin de DMA que origina el emulador para
instalar en ella la rutina que calcula los efectos y lee una nueva divisin.
Haremos, pues, que el tiempo de la transferencia de un bloque por la DMA emulada tarde lo
mismo, sea cual sea la frecuencia de muestreo. Para ello hemos de calcular previamente cul ser la
longitud de este bloque. La frmula es:
O sea, el nmero de muestras que se leern en 1/50 de segundo. El emulador de DMA dispone
de un contador de muestras enviadas al puerto paralelo. Cuando esta cuenta acabe se producir la
condicin de fin de DMA. Entonces se proceder a llamar a la rutina prep_datos. Esta rutina realiza
las siguientes tareas:
T Inicializa los contadores DMA para una nueva transferencia.
T Comprueba si el mdulo se ha terminado, y no continua si es as.
T Realiza una llamada a la rutina swap_bloque que intercambia entre s la posicin de dos bloques
de memoria. Uno de ellos ser apuntado por el puntero bloque_llena y es el bloque que va a ser llenado
con las muestras calculadas durante el proceso de mezcla (el bucle interno del intrprete MOD) y que
acaba de ser transferido al puerto paralelo. El otro es el bloque que va ser transferido al puerto paralelo,,
y que acaba de ser relleno con los datos de la ltima ejecucin del bucle de mezcla. Ser apuntado por
bloque_dma. Por supuesto, no son los contenidos los que se intercambian, sino los punteros. Con este
mecanismo de doble buffering no se pierde continuidad en la audicin del mdulo.
T Llama a la rutina llenar_dma para rellenar con muestras el contenido del bloque al que ahora
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.10
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
apunta bloque_llena.
T Por ltimo llama a la rutina calc_efecto que, a partir de los datos almacenados en la estructura
de cada canal variar los valores de tono y/o volumen de la nota actual tal y como se describe en la
especificacin MOD.
La rutina calc_efecto llama cuatro veces a una macro con un parmetro correspondiente al nmero
de cada canal del mdulo. Despus actualiza un contador de ticks y, si ese contador ha llegado al nmero
especificado de ticks por divisin (ver efecto 15) se vuelve a poner a 0 y se realiza una llamada a la rutina
actualiza. Esta rutina leer del patrn actual el nmero de divisin que viene a continuacin. Si la
anterior fue la ltima, o se recibi un efecto 11 o 13 se leer de la lista de patrones el nmero del que
viene a continuacin. Ese nmero de usar como ndice a la tabla de patrones cuyas entradas son punteros
a cada uno de los bloques de memoria que almacenan los patrones. La direccin del patn actual se lee
y se pone el contador de divisiones a 0.
La actualizacin de cada canal la lleva a cabo la macro act_canal que recibe un parmetro como
en calc_efecto. Esta macro extrae la informacin almacenada en la divisin actual para ese canal (periodo
de la nota, instrumento y efectos) y actualiza el contenido de las estructuras muestra1 a muestra4 .
El listado siguiente corresponde a los fuentes de las rutinas encargadas todas las tareas descritas
aqu. La rutina de clculo de efectos se entiende mejor habiendo ledo las especificaciones de los MODs,
en el captulo 3.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.11
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
act_canal macro canal
local hayinfo,noponnota,noponins,no_veloc,novol,noup,nodwn
local slid_dwn,noslide,nada,noarpegio,hayefecto,pon_tpd
local noromper,nosalto,nooffset,notslide,es_slideu
local siguetono1,siguetono2,siguetono3,calc_arp1,calc_arp2
local no_arp1,no_arp2,noact_ins,haz_retrig,hay_numins,mirar0
local nospecial,nosfvolup,nosfvoldo,pon_beat
;Borramos los flags que indican que hay efectos en este canal
mov tab_muest&canal.flag_slide,0
mov tab_muest&canal.flag_tslided,0
mov tab_muest&canal.flag_tslideu,0
mov tab_muest&canal.flag_arpegio,0
mov tab_muest&canal.flag_pitch,0
mov si,es:[bx]
or si,es:[bx+2]
or si,es:[bx+4]
jnz hayinfo
jmp nada
hayinfo: mov si,es:[bx]
or si,si
jz noponnota ;si el campo nota es 0, no hagas nada
cmp byte ptr es:[bx+3],cod_tono
je noponnota ;lo mismo si el efecto es slide to note.
push bx
mov bx,offset frec2offs
mov tab_muest&canal.pitch,si
add si,si
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax ;Guarda el nuevo valor de baseta-
bla
pop bx
noponnota: mov al,es:[bx+2]
or al,al
jnz hay_numins
cmp word ptr es:[bx],0
jz noponins
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.12
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov al,tab_muest&canal.num_ins
hay_numins: mov tab_muest&canal.num_ins,al
dec al
mov dl,42 ;longitud de un elemento de la tabla de instrumentos
mul dl
add ax,offset tab_ins
xor dl,dl
cmp word ptr es:[bx],0
jne haz_retrig
cmp byte ptr es:[bx+3],0
je haz_retrig
mov dl,1
haz_retrig: push bx
mov bx,ax ;bx -> instrumento elegido
mov ax,[bx].volum_ins
mov tab_muest&canal.volumen,ax ;Guarda volumen del instrumento
or dl,dl
jnz noact_ins
mov eax,[bx].base_ins
mov tab_muest&canal.pri_muest,eax ;Guarda offset a la primera pos.
mov ecx,[bx].loop_s
add ecx,eax
mov tab_muest&canal.loopsm,ecx ;Guarda offset del principio del
loop
mov ecx,[bx].long_ins
dec ecx
mov eax,tab_muest&canal.pri_muest
add eax,ecx
mov tab_muest&canal.fin_muest,eax ;Guardar offset del final de la
muestra
mov eax,[bx].loop_l
add eax,tab_muest&canal.loopsm
mov tab_muest&canal.looplm,eax ;Guarda offset del final del loop
noact_ins: pop bx
noponins: mov ax,es:[bx+3]
or ax,ax
jnz hayefecto
jmp nada
hayefecto: cmp al,cod_veloc ;si es el codigo de velocidad
jne no_veloc
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.13
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
cmp ah,32
jb mirar0
jmp nada ;si es >=32, son beats/minuto
mirar0: or ah,ah
jz nada
jmp pon_tpd

;pon_beat: mov bl,ah
; mov ax,750
; div bl
; mov ah,al
pon_tpd: mov velocidad,ah
mov cont_tpd,ah
jmp nada
no_veloc: cmp al,cod_volum ;si es cdigo de volumen
jne novol
mov al,ah ;lee el volumen
xor ah,ah
mov tab_muest&canal.volumen,ax
jmp nada
novol: cmp al,cod_pitchup ;slide up
jne noup
mov tab_muest&canal.flag_pitch,1
mov al,ah
xor ah,ah
mov tab_muest&canal.valor_pitch,ax
jmp nada
noup: cmp al,cod_pitchdo ;slide down
jne nodwn
mov tab_muest&canal.flag_pitch,1
mov al,ah
xor ah,ah
neg ax
mov tab_muest&canal.valor_pitch,ax
jmp nada
nodwn: cmp al,cod_vslide ;volume slide
jne noslide
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.14
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov tab_muest&canal.flag_slide,1
mov al,ah
test al,0f0h
jz slid_dwn
and al,0f0h
sar al,4
xor ah,ah
mov tab_muest&canal.valor_slide,ax
jmp nada
slid_dwn: xor ah,ah
neg ax
mov tab_muest&canal.valor_slide,ax
jmp nada
noslide: cmp al,cod_arpegio
jne noarpegio
mov tab_muest&canal.flag_arpegio,1
mov cl,ah
mov ax,tab_muest&canal.pitch
sar cl,4
and cl,0fh
jz no_arp1
xor ch,ch
calc_arp1: mov si,32768
mul si
mov si,34716
div si ;en cada vuelta del bucle se divide DX:AX / 2^(1/12)
loop calc_arp1 ;este nmero es la razn que hay entre la frecuencia
de
;un semitono y el siguiente en la escala musical.
no_arp1: mov tab_muest&canal.arpegio1,ax
mov ax,tab_muest&canal.pitch
mov cl,es:[bx+4]
and cl,0fh
jz no_arp2
xor ch,ch
calc_arp2: mov si,32768
mul si
mov si,34716
div si
loop calc_arp2
no_arp2: mov tab_muest&canal.arpegio2,ax
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.15
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
jmp nada
noarpegio: cmp al,cod_break ; si es el codigo de romper patron
jne noromper
mov hacersalto,1
jmp nada
noromper: cmp al,cod_salto
jne nosalto
mov al,ah
xor ah,ah
mov cont_pat,ax
mov hacersalto,1
jmp nada
nosalto: cmp al,cod_offset
jne nooffset
xor eax,eax
mov ah,es:[bx+4] ;efecto
add eax,tab_muest&canal.pri_muest
cmp eax,tab_muest&canal.fin_muest
ja nooffset
mov tab_muest&canal.pri_muest,eax
jmp nada
nooffset: cmp al,cod_tono ;slide to note
jne notslide
mov ax,es:[bx]
or ax,ax
jnz siguetono1
mov ax,tab_muest&canal.finslide
siguetono1: mov tab_muest&canal.finslide,ax
cmp ax,tab_muest&canal.pitch
jbe es_slideu
mov tab_muest&canal.flag_tslided,1
jmp siguetono3
es_slideu: mov tab_muest&canal.flag_tslideu,1
siguetono3: mov al,es:[bx+4]
or al,al
jnz siguetono2
mov al,tab_muest&canal.valefecto
siguetono2: mov tab_muest&canal.valefecto,al
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.16
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
xor ah,ah
mov tab_muest&canal.valtslide,ax
jmp nada
notslide: cmp al,cod_special ;efectos tipo 14
jne nospecial
mov al,ah
sar al,4
and ax,0f0fh
cmp al,cod_sfvolup ;fine volume up
jne nosfvolup
cmp byte ptr tab_muest&canal.volumen,64
je nosfvolup
add byte ptr tab_muest&canal.volumen,ah
jmp nada
nosfvolup: cmp al,cod_sfvoldo ;fine volume down
jne nosfvoldo
cmp byte ptr tab_muest&canal.volumen,0
je nosfvoldo
sub byte ptr tab_muest&canal.volumen,ah
jmp nada
nosfvoldo:
nospecial:
nada: add bx,6
endm
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.17
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
efectos macro canal
local nopitch,noslide,noarpegio,notslide,nofin_u,nofin_d
local final,mayor113,menor856,menor64,mayor0,notslideu
local notslided
cmp tab_muest&canal.flag_pitch,0
jz nopitch
mov ax,tab_muest&canal.pitch
sub ax,tab_muest&canal.valor_pitch
cmp ax,113
jge mayor113
mov ax,tab_muest&canal.pitch
mayor113: cmp ax,856
jle menor856
mov ax,tab_muest&canal.pitch
menor856: mov si,ax
mov tab_muest&canal.pitch,ax
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
nopitch: cmp tab_muest&canal.flag_slide,0
jz noslide
mov ax,tab_muest&canal.volumen
add ax,tab_muest&canal.valor_slide
cmp ax,64
jle menor64
mov ax,64
menor64: cmp ax,0
jge mayor0
xor ax,ax
mayor0: mov tab_muest&canal.volumen,ax
mul byte ptr volumen&canal
shr ax,6
mov tab_muest&canal.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest&canal.vol_tabla,ax
jmp final
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.18
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
noslide: cmp tab_muest&canal.flag_arpegio,0
jz noarpegio
mov ax,tab_muest&canal.pitch
mov si,tab_muest&canal.arpegio1
mov tab_muest&canal.pitch,si
mov bx,tab_muest&canal.arpegio2
mov tab_muest&canal.arpegio1,bx
mov tab_muest&canal.arpegio2,ax
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
noarpegio: cmp tab_muest&canal.flag_tslideu,0
jz notslideu
mov si,tab_muest&canal.pitch
sub si,tab_muest&canal.valtslide
cmp si,tab_muest&canal.finslide
ja nofin_u
mov si,tab_muest&canal.finslide
mov tab_muest&canal.flag_tslideu,0
nofin_u: mov tab_muest&canal.pitch,si
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
notslideu: cmp tab_muest&canal.flag_tslided,0
jz notslided
mov si,tab_muest&canal.pitch
add si,tab_muest&canal.valtslide
cmp si,tab_muest&canal.finslide
jb nofin_d
mov si,tab_muest&canal.finslide
mov tab_muest&canal.flag_tslided,0
nofin_d: mov tab_muest&canal.pitch,si
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.19
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
jmp final
notslided:
final:
endm
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.20
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
prep_datos proc near
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push fs
cld
inc conta_frames
cmp terminado,0
jne fin_prep
cmp fin_canc,0
jne fin_tprep
mov ax,bytes_trans
mov cont_int,ax
mov indice_int,0
call swap_bloque
xor ax,ax
mov fs,ax
sti
call llenar_dma
call calc_efecto
cli
jmp fin_prep
fin_tprep: mov terminado,1
fin_prep: pop fs
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
prep_datos endp

MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.21
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
actualiza proc near
actualiz: mov chivato,1 ;se va a leer una nueva divisin.
cmp hazpausa,1 ;si vale 1, se congela la lectura de nuevas
divisiones
jne nopausa
ret
nopausa: cmp hacersalto,1
jne nohazsalto
mov hacersalto,0
jmp cambpat
nohazsalto: inc cont_lin
cmp cont_lin,64
jne nocambpat
jmp cambpat
nocambpat: mov ax,patr_act
mov es,ax ;es direcciona el nuevo patron
mov bx,linea_act ;bx se va moviendo a traves del patron
call actual_canal
mov linea_act,bx
call ponvolumen
ret
cambpat: mov cont_lin,255
mov bx,offset lis_patt
mov si,cont_pat
inc cont_pat
mov al,[bx+si] ;leer el n de patron que sigue en la lista
cmp al,128
je fintocar
mov bl,4 ;tamao de un elemento de la tabla de punteros a patrones
mul bl
mov bx,ax
add bx,offset tab_patt ;bx -> puntero al patron a tocar
mov dx,[bx] ;dx=offset del nuevo patron
mov linea_act,dx
mov dx,[bx+2] ;dx=segmento del nuevo patron
mov patr_act,dx
jmp actualiz
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.22
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
fintocar: mov fin_canc,1
ret
actualiza endp
actual_canal proc near
act_canal 1
act_canal 2
act_canal 3
act_canal 4
ret
actual_canal endp
calc_efecto proc near
efectos 1
efectos 2
efectos 3
efectos 4
dec cont_tpd
jnz no_llam_act
mov al,velocidad
mov cont_tpd,al
jmp actualiza
no_llam_act: ret
calc_efecto endp
ponvolumen proc C
mov al,byte ptr tab_muest1.volumen
mul volumen1
shr ax,6
mov tab_muest1.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest1.vol_tabla,ax
mov al,byte ptr tab_muest2.volumen
mul volumen2
shr ax,6
mov tab_muest2.vol_play,ax
shl ax,8
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.23
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
add ax,offset tabla_g_vol
mov tab_muest2.vol_tabla,ax
mov al,byte ptr tab_muest3.volumen
mul volumen3
shr ax,6
mov tab_muest3.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest3.vol_tabla,ax
mov al,byte ptr tab_muest4.volumen
mul volumen4
shr ax,6
mov tab_muest4.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest4.vol_tabla,ax
ret
ponvolumen endp
swap_bloque proc near
mov eax,bloque_dma
xchg eax,bloque_lle
mov bloque_dma,eax
ret
swap_bloque endp
llenar_mono proc near
push ebp
canal4_mono
pop ebp
ret
llenar_mono endp
llenar_ste proc near
push ebp
canal4_st
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.24
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop ebp
ret
llenar_ste endp
llenar_dma proc near
cmp disp_salida,SBP_ST
je es_ste
cmp disp_salida,PROY
je es_ste
jmp llenar_mono
es_ste: jmp llenar_ste
llenar_dma endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.25
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
7.2.- Listado fuente de la biblioteca de rutinas para cargar y
ejecutar MODs
El conjunto de rutinas mostradas a continuacin permiten al usuario cargar y ejecutar archivos
MOD usando las tcnicas comentadas hasta ahora.
La biblioteca soporta varios dispositivos de salida, aunque en este trabajo se ha hecho hincapi
en la emulacin de DMA y la tarjeta de sonido proyectada para el puerto paralelo.
Los dispositivos soportados son: altavoz interno, DAC simple en el puerto paralelo, tarjeta de
proyecto, Sound Blaster 2.0 y Sound Blaster Pro.
Se incluye adems el fuente de un programa de demostracin que hace uso de esta biblioteca,
hecho enteramente en C. No se incluirn las rutinas del gestor de memoria que son las que se han
listado en el captulo 5.
Los mdulos listados son:
TRACKLIB.H Archivo de cabecera para poder usar la biblioteca en las aplicaciones de
usuario.
TRACKLD.C Mdulo que se encarga de la inicializacin del sistema, carga del mdulo y
ajuste de parmetros del mismo.
TRACKEJC.ASM Mdulo encargado de la reproduccin del archivo MOD.
SECUENC.INC Archivo de inclusin para TRACKEJC.ASM que contiene las secuencias
generadas por el algoritmo de Bresenham para cada nota del rango soportado por los archivos MOD.
COMPRES.INC Archivo de inclusin con una tabla para traducir valores de muestras a valores
apropiados para el altavoz interno. Esta tabla contiene las imgenes de una funcin que, aplicada a los
valores de un instrumento PCM devuelve otra lista de valores modificados de tal forma que las
muestras con bajo volmen se amplifican ms que las que tienen un volumen ms alto. As la energa
que produce el altavoz interno en la reproduccin es la necesaria para que se oiga el sonido con un
cierto volumen sin llegar a la distorsin.
TRPLAY.C Fuente de ejemplo de uso de las funciones de biblioteca.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.26
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
TRACKLIB.H
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif
#if !defined(__TRACKLIB)
#define __TRACKLIB
#endif
#if !defined(__STDIO_H)
#include <stdio.h>
#endif
enum SALIDA {ALTAVOZ=0, DAC_LPT, PROY, SB20, SBP_MONO, SBP_ST, NULO=255};
enum {NTSC=0, PAL};
enum {LPT1,LPT2,LPT3};
/* Estas son las variables comunes a los dos mdulos de C y ensamblador */
struct st_ins
{
char nombre_ins[22];
unsigned long_ins;
unsigned volum_ins;
unsigned loop_s;
unsigned loop_l;
unsigned long base_ins;
int mcb; };
typedef struct st_ins TINS;
struct st_muest
{
int filler1;
unsigned fin_muest;
unsigned pri_muest;
unsigned seg_muest;
unsigned looplm;
unsigned loopsm;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.27
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
unsigned basetabla;
unsigned volumen;
unsigned vol_play;
unsigned valor;
unsigned pitch;
unsigned valor_slide;
unsigned arpegio1;
unsigned arpegio2;
char num_ins;
char flag_pitch;
char flag_slide;
char flag_arpegio;
};
typedef struct st_muest TMUESTRA;
extern char *tab_patt[128];
extern char lis_patt[128];
extern TINS tab_ins[31];
extern char nombremod[22];
extern char disp_salida;
extern char chivato;
extern char hacersalto;
extern char hazpausa;
extern volatile char cont_lin;
extern volatile unsigned cont_pat;
extern char terminado;
extern char volumen1;
extern char volumen2;
extern char volumen3;
extern char volumen4;
extern unsigned frecuencia;
extern volatile char velocidad;
extern volatile char cont_tpd;
extern volatile unsigned conta_frames;
extern char *bloque_dma;
extern char *bloque_lle;
extern unsigned sb_puerto;
extern char sb_int;
extern char sb_dma;
extern char sb_time;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.28
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
extern unsigned lptdata;
extern unsigned lptstd;
extern unsigned lptctrl;
extern TMUESTRA tab_muest1;
extern TMUESTRA tab_muest2;
extern TMUESTRA tab_muest3;
extern TMUESTRA tab_muest4;
int _Cdecl detecta_SB (void);
char _Cdecl parametros_SB (void);
void _Cdecl cambia_frecuencia (char, char);
void _Cdecl init_sampler (void);
void _Cdecl des_sampler (void);
int _Cdecl cargar_modulo (FILE *);
void _Cdecl borrar_modulo (void);
unsigned _Cdecl detecta_LPT (int);
unsigned _Cdecl detecta_proy (void);
char _Cdecl prepara_doble_buffer (void);
void _Cdecl prepara_tabla_vol (char);
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.29
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
TRACKLD.C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include "xmem.h"
#define BREAK 0x0d
#define VOLUMEN 0x0c
#define VELOCIDAD 0x0f
#define SALTO 0x0b
#define PITCHUP 0x01
#define PITCHDOWN 0x02
#define TONO 0x03
#define VSLIDE 0x0a
#define SOFFSET 0x09
#define ALTAVOZ 0
#define DAC_LPT 1
#define PROY 2
#define SB20 3
#define SBP_MONO 4
#define SBP_ST 5
char nombremod[22]; /* nombre del mdulo */
unsigned frec2offs[744];
char tabla_g_vol[65][256];
struct st_ins
{
char nombre_ins[22];
unsigned long long_ins;
unsigned long loop_s;
unsigned long loop_l;
unsigned long base_ins;
unsigned volum_ins;
int mcb;
};
struct hd_ins
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.30
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
{
char nombre_ins[22];
unsigned long_ins;
unsigned volum_ins;
unsigned loop_s;
unsigned loop_l;
};
/* Estas son las variables comunes a los dos mdulos de C y ensamblador */
char *tab_patt[128];
char lis_patt[128];
struct st_ins tab_ins[31];
char disp_salida;
char velocidad;
char terminado;
char hazpausa;
char hacersalto;
extern unsigned int tabla_bres;
unsigned sb_puerto;
char sb_int;
char sb_dma;
char sb_time;
char *bloque_dma;
char *bloque_lle;
char volumen1,volumen2,volumen3,volumen4;
char cont_lin;
unsigned cont_pat;
char chivato;
unsigned bytes_trans;
unsigned conta_frames;
char periodo,perproy;
unsigned frecuencia;
unsigned periodo_ant08;
unsigned lptdata,lptstd,lptctrl;
char numintp;
void moto2intel(unsigned *numero)
/* Eata funcin convierte un entero de 2 bytes del formato de Motorola al de
Intel, y viceversa */
{
char alto,bajo;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.31
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
bajo=*numero/256;
alto=*numero%256;
*numero=alto*256+bajo;
}
unsigned detecta_LPT (int);
void e8253 (char, char, char);
int reset_proy (void)
{
char estado,cambio;
unsigned i;
e8253(1,1,0x38);
e8253(0,0,0); /* Silenciar DAC's */
e8253(0,0,0);
e8253(1,1,0x74);
e8253(0,1,0x9b);
e8253(0,1,0x4); /* Programamos el timer del ADC para 1000Hz */
outp(lptctrl,3); /* Deshabilitar todos los dispositivos */
for (i=0,cambio=0;i<5000;i++)
{
estado=inp(lptstd);
if (estado&0x40)
cambio=1;
else if (cambio==1)
cambio=2;
if (cambio==2)
break;
}
e8253(1,1,0x78); /* Silenciar ADC */
e8253(0,1,0);
e8253(0,1,0);
return (cambio==2);
}
unsigned detecta_proy (void)
{
detecta_LPT (0);
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.32
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
if (lptdata!=0 && reset_proy())
{
numintp=(lptdata==0x278)? 0xd : 0xf;
return lptdata;
}
detecta_LPT (1);
if (lptdata!=0 && reset_proy())
{
numintp=(lptdata==0x278)? 0xd : 0xf;
return lptdata;
}
detecta_LPT (2);
if (lptdata!=0 && reset_proy())
{
numintp=(lptdata==0x278)? 0xd : 0xf;
return lptdata;
}
return 0;
}

void lee_sample (FILE *modulo, unsigned long longitud, int mcb)
{
char *ptins;
unsigned long offset=0L;
int num_lectur=longitud/32768L;
unsigned ultima_lectur=longitud%32768L;
int i;
ptins=malloc(32768);
for (i=0;i<num_lectur;i++)
{
fread(ptins,1,32768,modulo);
X_escribir(ptins,mcb,offset,32768L);
offset+=32768L;
}
if (ultima_lectur)
{
fread(ptins,1,ultima_lectur,modulo);
X_escribir(ptins,mcb,offset,(unsigned long)ultima_lectur);
}
free(ptins);
}
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.33
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
int cargar_modulo (FILE *modulo)
/*
Carga un mdulo en memoria.
Devuelve: 0 ----> Carga efectuada con normalidad.
1 ----> No se pudo encontrar el mdulo.
2 ----> Error cargando mdulo. Formato errneo.
3 ----> Formato de mdulo errneo (sample>64K).
4 ----> No hay memoria suficiente para cargar el mdulo
*/
{
char tiempo; /* tiempo ledo del fichero */
char long_lista; /* longitud de la lista de patrones */
char num_pat; /* n de patrones que hay almacenados */
char i;
unsigned j;
char *ppatron,*pfuente,*pdestino;
unsigned nota;
char flag31;
unsigned long posic_fichero;
struct hd_ins hd_instru;
memset(tab_ins,0,sizeof(tab_ins));
memset(tab_patt,0,sizeof(tab_patt));
posic_fichero=ftell(modulo);
fseek(modulo,1080,SEEK_CUR);
fread(nombremod,1,4,modulo);
nombremod[4]=NULL;
fseek(modulo,posic_fichero,SEEK_SET);
if (!strcmp(nombremod,"M.K.") || !strcmp(nombremod,"FLT4"))
flag31=16;
else
flag31=0;
if (fread(nombremod,1,20,modulo)<20)
return 2;
for (i=0;i<15+flag31;i++)
{
if (fread(&hd_instru,1,30,modulo)<30)
return 2;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.34
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
memcpy(tab_ins[i].nombre_ins,hd_instru.nombre_ins,22);
moto2intel(&hd_instru.long_ins);
tab_ins[i].long_ins=hd_instru.long_ins;
moto2intel(&hd_instru.volum_ins);
tab_ins[i].volum_ins=hd_instru.volum_ins;
moto2intel(&hd_instru.loop_s);
tab_ins[i].loop_s=hd_instru.loop_s;
moto2intel(&hd_instru.loop_l);
tab_ins[i].loop_l=hd_instru.loop_l;
tab_ins[i].loop_s*=2;
tab_ins[i].loop_l*=2;
if (tab_ins[i].loop_l)
tab_ins[i].loop_l--;
if (tab_ins[i].long_ins>3)
{
tab_ins[i].long_ins*=2;
tab_ins[i].mcb=X_malloc(tab_ins[i].long_ins);
if (tab_ins[i].mcb<0)
return 4;
tab_ins[i].base_ins=X_direccion(tab_ins[i].mcb);
}
else
tab_ins[i].mcb=-1;
}
fread(&long_lista,1,1,modulo);
fread(&tiempo,1,1,modulo);
if (!tiempo)
tiempo=120;
velocidad=tiempo/20;
if (!velocidad)
velocidad=1;
if (fread(lis_patt,1,128,modulo)<128)
return 2;
num_pat=0;
for (i=0;i<127;i++)
if (lis_patt[i]>num_pat)
num_pat=lis_patt[i];
num_pat++;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.35
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
for (i=127;i>=0;i--)
if (lis_patt[i]!=0)
break;
if (long_lista<i)
long_lista=i;
lis_patt[long_lista]=128;
if (flag31)
fseek(modulo,4,SEEK_CUR);
ppatron=(char *) malloc(1024);
for (i=0;i<num_pat;i++)
{
tab_patt[i]=(char *) malloc(1536);
if (!(tab_patt[i]))
return 4;
if (fread(ppatron,1024,1,modulo)<1)
return 2;
for
(j=0,pfuente=ppatron,pdestino=tab_patt[i];j<256;j++,pfuente+=4,pdestino+=6)
{
nota=*( (unsigned *)pfuente);
moto2intel(&nota);
if (nota>=0x1000)
{
nota&=0xfff;
pdestino[2]=16;
}
else
pdestino[2]=0;
*( (unsigned *)pdestino)=nota;
pdestino[2]+=(pfuente[2]>>4)&0xf;
pdestino[3]=pfuente[2]&0xf;
if (pdestino[3]==TONO && pfuente[3]>112)
pfuente[3]=112;
if (pdestino[3]==PITCHUP && pfuente[3]>112)
pfuente[3]=112;
pdestino[4]=pfuente[3];
pdestino[5]=0;
}
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.36
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
}
free(ppatron);
for (i=0;i<15+flag31;i++)
if (tab_ins[i].long_ins)
lee_sample(modulo,tab_ins[i].long_ins,tab_ins[i].mcb);
return 0;
}
void borrar_modulo(void)
{
char i;
for(i=0;i<31;i++)
if (tab_ins[i].mcb>=0)
X_free(tab_ins[i].mcb);
for(i=0;i<63;i++)
if (tab_patt[i])
free(tab_patt[i]);
}
void cambia_frecuencia(char letra, char pal)
{
float frec;
float base;
float valor_off,incrm;
unsigned indoff,desde,hasta;
int i,j;
unsigned tabla[36]={856,808,762,720,678,640,604,570,538,508,480,453,
428,404,381,360,339,320,302,285,269,254,240,226,
214,202,190,180,170,160,151,143,135,127,120,113 };
disable();
letra&=0xdf;
if (letra<'A' || letra>'X')
letra='L';
valor_off=(float) (tabla_bres+(letra-'A')*256.0);
base=(pal==0)? 7159090.5 : 7093789.2;
frec=base/226;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.37
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
for (i=0;i<letra-'A';i++)
frec=frec/1.0594631;
sb_time = (char) (65536.0 - 256000000.0 /
(frec*(2*(disp_salida==SBP_ST)+(disp_salida!=SBP_ST)))/256.0);
bytes_trans=(1+(unsigned)((frec/51)+0.5))&0xfffe;
periodo=(char) (1193180/frec);
perproy=(char) (1179243.75/frec);
periodo_ant08=(unsigned) (frec/18.2);
frecuencia=(unsigned) frec;
if (disp_salida==SBP_ST || disp_salida==PROY)
bytes_trans*=2;
indoff=743;
for (i=0;i<35;i++)
{
desde=tabla[i];
hasta=tabla[i+1];
incrm=(float) (256.0/(tabla[i]-tabla[i+1]));
for (j=desde;j>hasta;j--)
{
frec2offs[indoff--]=(unsigned int) valor_off;
valor_off=valor_off+incrm;
}
}
frec2offs[indoff]=(unsigned int) valor_off;
enable();
}
void asigna_mem_sb (char **bloque)
{
*bloque=(char *) malloc(4096);
*bloque=(char *) MK_FP (FP_SEG (*bloque) + FP_OFF (*bloque)/16 +1,0);
while (FP_SEG(*bloque) & 0x00FF)
*bloque=(char *) MK_FP (FP_SEG(*bloque)+1,0);
}
int parametros_SB (void)
{
char *entorno;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.38
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
char *dma,*intr;
entorno=getenv("BLASTER");
if (!entorno)
return 0;
strupr(entorno);
dma=strstr(entorno,"D");
intr=strstr(entorno,"I");
if (!dma || !intr)
return 0;
sb_dma=dma[1]-'0';
sb_int=8+intr[1]-'0';
if (sb_int==1)
return 0;
return 1;
}
char prepara_doble_buffer (void)
{
if (!bloque_dma && !bloque_lle)
{
asigna_mem_sb (&bloque_dma);
asigna_mem_sb (&bloque_lle);
}
return (bloque_dma || bloque_lle);
}
void prepara_tabla_vol (char ncanales)
{
int vol,sample,muestra;
for (vol=0;vol<=64;vol++)
for (sample=0;sample<256;sample++)
{
muestra=(signed char) (sample);
tabla_g_vol[vol][sample]=((muestra*vol)>>6)/ncanales;
}
}
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.39
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
TRACKEJC.ASM
comment %
MODULO OBJETO EN ENSAMBLADOR PARA EL PROGRAMA PROCESADOR DE MODULOS DE
TRACKER.
Especificaciones:
-----------------
- Modelo de memoria: large
- Lenguaje de llamada: C (Turbo C)
- Procesador: 80386+
%
.model large
.286
;Esta macro espera hasta que el DSP de la Sound Blaster est listo para aceptar
comandos
espera_esc macro
local esp_esc
mov dx,sb_puerto
esp_esc: in al,dx
test al,80h
jnz esp_esc
endm
;Esta macro espera hasta que el DSP tenga el dato a leer listo
espera_lec macro
local esp_lec
mov dx,sb_puerto
add dx,2
esp_lec: in al,dx
test al,80h
jz esp_lec
sub dx,4
endm
;Los dispositivos de salida digital que soporta el programa
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.40
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
ALTAVOZ equ 0
DAC_LPT equ 1
PROY equ 2
SB20 equ 3
SBP_MONO equ 4
SBP_ST equ 5
;Los comandos (subconjunto de los soportados en el Amiga Protraker)
cod_break equ 0dh
cod_volum equ 0ch
cod_veloc equ 0fh
cod_pitchup equ 01h
cod_pitchdo equ 02h
cod_tono equ 03h
cod_salto equ 0bh
cod_vslide equ 0ah
cod_arpegio equ 00h
cod_offset equ 09h
cod_vibrato equ 04h
cod_tonvsli equ 05h
cod_special equ 0eh
cod_sfvolup equ 0ah
cod_sfvoldo equ 0bh
.data
;Registro para cada uno de los 31 instrumentos
st_ins struc
nombre_ins db 22 dup(?)
long_ins dd ?
loop_s dd ?
loop_l dd ?
base_ins dd ?
volum_ins dw ?
mcb dw ?
st_ins ends
;Puntero a cada partn
st_patt struc
dd ?
st_patt ends
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.41
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
;Registro para cada canal
st_muest struc
fin_muest dd 1 ; Direccin lineal de la ltima
muestra
pri_muest dd 0 ; Direccin lineal de la prxima
muestra
looplm dd 1 ; Direccin lineal de la ltima
muestra del loop
loopsm dd 0 ; Direccin lineal de la primera
muestra del loop
basetabla dw 0 ; Offset relativo a DS de la tabla de
incrementos para este canal
volumen dw 0 ; Volmen (de 0 a 64) definido por el
mdulo
vol_play dw 0 ; volumen*volumen_general_canal/256
vol_tabla dw 0 ; Offset relativo a DS de la tabla de
volmenes para el valor actual de vol_play
pitch dw 0
valor_slide dw 0
arpegio1 dw 0
arpegio2 dw 0
valtslide dw 0
finslide dw 0
valor_pitch dw 0
num_ins db 0
valefecto db 0 ; Valor del comando ledo para este
canal
flag_pitch db 0 ;
flag_slide db 0
flag_arpegio db 0
flag_tslided db 0
flag_tslideu db 0
st_muest ends
extrn C tab_ins:st_ins:31
extrn C tab_patt:st_patt:128
extrn C lis_patt:byte:128
extrn C terminado:byte
extrn C velocidad:byte
extrn C cont_lin:byte ;Contador de lineas de patron leidas
extrn C cont_pat:word ;Contador de patrones ledos
extrn C volumen1:byte
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.42
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
extrn C volumen2:byte ;mascaras para silenciar cada canal
extrn C volumen3:byte
extrn C volumen4:byte
extrn C chivato:byte
extrn C disp_salida:byte ;Salida por altavoz, por D/A o por SB
extrn C hazpausa:byte
extrn C hacersalto:byte
extrn C conta_frames:word
extrn C frec2offs:word:744 ;Tabla de trad. entre frecuencias
Amiga y offsets en la tabla de Bresenham
extrn C tabla_g_vol:byte:16640 ;Tabla de volumenes
br_indice dw 0
patr_act dw 0 ;Solo el segmento
linea_act dw 0 ;Offset dentro del patron actual
;Variables de uso de la Sound Blaster
extrn C bloque_dma:dword
extrn C bloque_lle:dword
extrn C sb_puerto:word
extrn C sb_int:byte
extrn C sb_dma:byte
extrn C sb_time:byte
extrn C bytes_trans:word
offdsp dw 0
segdsp dw 0
;Variables de uso del altavoz interno y el DAC
extrn C periodo:byte
extrn C perproy:byte
extrn C lptdata:word
extrn C lptctrl:word
extrn C lptstd:word
extrn C numintp:byte
extrn C periodo_ant08:word
cont_ant08 dw 0
indice_int dw 0
cont_int dw 0
ant08 dd 0
antproy dd 0
evendata
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.43
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
tab_muest1 st_muest <>
evendata
tab_muest2 st_muest <> ;Tabla de muestras para
evendata
tab_muest3 st_muest <> ;los 4 canales
evendata
tab_muest4 st_muest <>
evendata
fin_canc db 0
cont_tpd db 0
public C cont_tpd
public C tab_muest1
public C tab_muest2
public C tab_muest3
public C tab_muest4
public C tabla_bres
include secuenc.inc ; Valores de la tabla de incrementos
include compres.inc ; Valores de la tabla de traduccin
muestra->altavoz
.code player_tracker
.386
public C init_sampler
public C des_sampler
public C ponvolumen
public C detecta_SB
public C detecta_LPT
public C e8253
act_canal macro canal
local hayinfo,noponnota,noponins,no_veloc,novol,noup,nodwn
local slid_dwn,noslide,nada,noarpegio,hayefecto,pon_tpd
local noromper,nosalto,nooffset,notslide,es_slideu
local siguetono1,siguetono2,siguetono3,calc_arp1,calc_arp2
local no_arp1,no_arp2,noact_ins,haz_retrig,hay_numins,mirar0
local nospecial,nosfvolup,nosfvoldo,pon_beat
mov tab_muest&canal.flag_slide,0
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.44
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov tab_muest&canal.flag_tslided,0
mov tab_muest&canal.flag_tslideu,0
mov tab_muest&canal.flag_arpegio,0
mov tab_muest&canal.flag_pitch,0
mov si,es:[bx]
or si,es:[bx+2]
or si,es:[bx+4]
jnz hayinfo
jmp nada
hayinfo: mov si,es:[bx]
or si,si
jz noponnota
cmp byte ptr es:[bx+3],cod_tono
je noponnota
push bx
mov bx,offset frec2offs
mov tab_muest&canal.pitch,si
add si,si
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax ;Guarda el nuevo valor de basetabla
pop bx
noponnota: mov al,es:[bx+2]
or al,al
jnz hay_numins
cmp word ptr es:[bx],0
jz noponins
mov al,tab_muest&canal.num_ins
hay_numins: mov tab_muest&canal.num_ins,al
dec al
mov dl,42 ;longitud de un elemento de la tabla de instrumentos
mul dl
add ax,offset tab_ins
xor dl,dl
cmp word ptr es:[bx],0
jne haz_retrig
cmp byte ptr es:[bx+3],0
je haz_retrig
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.45
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov dl,1
haz_retrig: push bx
mov bx,ax ;bx -> instrumento elegido
mov ax,[bx].volum_ins
mov tab_muest&canal.volumen,ax ;Guarda volumen del instrumento
or dl,dl
jnz noact_ins
mov eax,[bx].base_ins
mov tab_muest&canal.pri_muest,eax ;Guarda offset a la primera pos.
mov ecx,[bx].loop_s
add ecx,eax
mov tab_muest&canal.loopsm,ecx ;Guarda offset del principio del
loop
mov ecx,[bx].long_ins
dec ecx
mov eax,tab_muest&canal.pri_muest
add eax,ecx
mov tab_muest&canal.fin_muest,eax ;Guardar offset del final de la
muestra
mov eax,[bx].loop_l
add eax,tab_muest&canal.loopsm
mov tab_muest&canal.looplm,eax ;Guarda offset del final del loop
noact_ins: pop bx
noponins: mov ax,es:[bx+3]
or ax,ax
jnz hayefecto
jmp nada
hayefecto: cmp al,cod_veloc ;si es el codigo de velocidad
jne no_veloc
cmp ah,32
jb mirar0
jmp nada ;si es >=32, son beats/minuto
mirar0: or ah,ah
jz nada
jmp pon_tpd

;pon_beat: mov bl,ah
; mov ax,750
; div bl
; mov ah,al
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.46
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pon_tpd: mov velocidad,ah
mov cont_tpd,ah
jmp nada
no_veloc: cmp al,cod_volum ;si es cdigo de volumen
jne novol
mov al,ah ;lee el volumen
xor ah,ah
mov tab_muest&canal.volumen,ax
jmp nada
novol: cmp al,cod_pitchup
jne noup
mov tab_muest&canal.flag_pitch,1
mov al,ah
xor ah,ah
mov tab_muest&canal.valor_pitch,ax
jmp nada
noup: cmp al,cod_pitchdo
jne nodwn
mov tab_muest&canal.flag_pitch,1
mov al,ah
xor ah,ah
neg ax
mov tab_muest&canal.valor_pitch,ax
jmp nada
nodwn: cmp al,cod_vslide
jne noslide
mov tab_muest&canal.flag_slide,1
mov al,ah
test al,0f0h
jz slid_dwn
and al,0f0h
sar al,4
xor ah,ah
mov tab_muest&canal.valor_slide,ax
jmp nada
slid_dwn: xor ah,ah
neg ax
mov tab_muest&canal.valor_slide,ax
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.47
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
jmp nada
noslide: cmp al,cod_arpegio
jne noarpegio
mov tab_muest&canal.flag_arpegio,1
mov cl,ah
mov ax,tab_muest&canal.pitch
sar cl,4
and cl,0fh
jz no_arp1
xor ch,ch
calc_arp1: mov si,32768
mul si
mov si,34716
div si
loop calc_arp1
no_arp1: mov tab_muest&canal.arpegio1,ax
mov ax,tab_muest&canal.pitch
mov cl,es:[bx+4]
and cl,0fh
jz no_arp2
xor ch,ch
calc_arp2: mov si,32768
mul si
mov si,34716
div si
loop calc_arp2
no_arp2: mov tab_muest&canal.arpegio2,ax
jmp nada
noarpegio: cmp al,cod_break ; si es el codigo de romper patron
jne noromper
mov hacersalto,1
jmp nada
noromper: cmp al,cod_salto
jne nosalto
mov al,ah
xor ah,ah
mov cont_pat,ax
mov hacersalto,1
jmp nada
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.48
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
nosalto: cmp al,cod_offset
jne nooffset
xor eax,eax
mov ah,es:[bx+4] ;efecto
add eax,tab_muest&canal.pri_muest
cmp eax,tab_muest&canal.fin_muest
ja nooffset
mov tab_muest&canal.pri_muest,eax
jmp nada
nooffset: cmp al,cod_tono
jne notslide
mov ax,es:[bx]
or ax,ax
jnz siguetono1
mov ax,tab_muest&canal.finslide
siguetono1: mov tab_muest&canal.finslide,ax
cmp ax,tab_muest&canal.pitch
jbe es_slideu
mov tab_muest&canal.flag_tslided,1
jmp siguetono3
es_slideu: mov tab_muest&canal.flag_tslideu,1
siguetono3: mov al,es:[bx+4]
or al,al
jnz siguetono2
mov al,tab_muest&canal.valefecto
siguetono2: mov tab_muest&canal.valefecto,al
xor ah,ah
mov tab_muest&canal.valtslide,ax
jmp nada
notslide: cmp al,cod_special
jne nospecial
mov al,ah
sar al,4
and ax,0f0fh
cmp al,cod_sfvolup
jne nosfvolup
cmp byte ptr tab_muest&canal.volumen,64
je nosfvolup
add byte ptr tab_muest&canal.volumen,ah
jmp nada
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.49
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
nosfvolup: cmp al,cod_sfvoldo
jne nosfvoldo
cmp byte ptr tab_muest&canal.volumen,0
je nosfvoldo
sub byte ptr tab_muest&canal.volumen,ah
jmp nada
nosfvoldo:
nospecial:
nada: add bx,6
endm
canal4_mono macro
local buc_canal1,buc_canal2,buc_canal3,buc_canal4
local setloops_c1,setloops_c2,setloops_c3,setloops_c4
local fin_canal1,fin_canal2,fin_canal3,fin_canal4
; Uso de los registros
; ECX = contador del bucle
; EDX = proximo valor de la tabla Bresenham
; EBX = direccion base de la tabla Bresenham
; EBP = puntero a la muestra a leer
; ES:DI = puntero al buffer DMA
; EAX = muestra leda
; ESI = direccion de la tabla de volumenes para cada canal
;Procesando canal 1
movzx ecx,bytes_trans ; Longitud buffer DMA
les di,bloque_lle ; Direccin buffer DMA
movzx edx,br_indice ; Indice al proximo valor de la tabla
de incrementos
mov ebp,tab_muest1.pri_muest ; Direccin de la prxima muestra a
leer
movzx esi,tab_muest1.vol_tabla ; Tabla de traduccin para el volmen
de este canal
movzx ebx,tab_muest1.basetabla ; Direccin base de la tabla de
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.50
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
incrementos para esta nota
xor eax,eax ; Ponemos a 0 todo el registro EAX.
buc_canal1: mov al,fs:[ebp] ; AL=muestra actual
mov al,[esi+eax] ; AL=AL*volumen1/128
stosb ; Almacena muestra
mov al,[ebx+edx] ; Lee el valor para incrementar el
puntero a la prxima muestra
inc dl ; Incrementa ndice a la tabla de
incrementos
add ebp,eax ; Actualiza puntero a la siguiente
muestra
cmp ebp,tab_muest1.fin_muest ; Se ha terminado de leer la muestra
o el loop?
ja setloops_c1 ; S, vuelve al principio del loop
loop buc_canal1 ; Siguiente muestra
jmp fin_canal1 ; Fin de este canal
setloops_c1: mov ebp,tab_muest1.loopsm ; EBP=principio del loop
mov eax,tab_muest1.looplm
mov tab_muest1.fin_muest,eax ; fin_muestra ahora es el fin del
loop
xor eax,eax ; Volvemos a borrar EAX
loop buc_canal1 ; Y seguimos leyendo muestras
fin_canal1: mov tab_muest1.pri_muest,ebp ; Almacenamos el puntero a la
siguiente muestra
;Procesando canal 2 (la mecnica es anloga al canal 1)
movzx ecx,bytes_trans
les di,bloque_lle
mov ebp,tab_muest2.pri_muest
movzx esi,tab_muest2.vol_tabla
movzx ebx,tab_muest2.basetabla
xor eax,eax
buc_canal2: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add es:[di],al ; En lugar de almacenar la muestra se
aade a la anterior
inc di ; Incrementamos el puntero al buffer
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.51
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
DMA
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest2.fin_muest
ja setloops_c2
loop buc_canal2
jmp fin_canal2
setloops_c2: mov ebp,tab_muest2.loopsm
mov eax,tab_muest2.looplm
mov tab_muest2.fin_muest,eax
xor eax,eax
loop buc_canal2
fin_canal2: mov tab_muest2.pri_muest,ebp
;Procesando canal 3
movzx ecx,bytes_trans
les di,bloque_lle
mov ebp,tab_muest3.pri_muest
movzx esi,tab_muest3.vol_tabla
movzx ebx,tab_muest3.basetabla
xor eax,eax
buc_canal3: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add es:[di],al
inc di
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest3.fin_muest
ja setloops_c3
loop buc_canal3
jmp fin_canal3
setloops_c3: mov ebp,tab_muest3.loopsm
mov eax,tab_muest3.looplm
mov tab_muest3.fin_muest,eax
xor eax,eax
loop buc_canal3
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.52
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
fin_canal3: mov tab_muest3.pri_muest,ebp
;Procesando canal 4
movzx ecx,bytes_trans
les di,bloque_lle
mov ebp,tab_muest4.pri_muest
movzx esi,tab_muest4.vol_tabla
movzx ebx,tab_muest4.basetabla
xor eax,eax
buc_canal4: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add al,80h
add es:[di],al
inc di
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest4.fin_muest
ja setloops_c4
loop buc_canal4
jmp fin_canal4
setloops_c4: mov ebp,tab_muest4.loopsm
mov eax,tab_muest4.looplm
mov tab_muest4.fin_muest,eax
xor eax,eax
loop buc_canal4
fin_canal4: mov tab_muest4.pri_muest,ebp
mov br_indice,dx ; Almacenamos ndice al prximo valor
de la tabla de incrementos
endm
canal4_st macro
local buc_canal1,buc_canal2,buc_canal3,buc_canal4
local setloops_c1,setloops_c2,setloops_c3,setloops_c4
local fin_canal1,fin_canal2,fin_canal3,fin_canal4
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.53
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
; Uso de los registros
; ECX = contador del bucle
; EDX = proximo valor de la tabla Bresenham
; EBX = direccion base de la tabla Bresenham
; EBP = puntero a la muestra a leer
; ES:DI = puntero al buffer DMA
; EAX = muestra leda
; ESI = direccion de la tabla de volumenes para cada canal
;Procesando canal 1
movzx ecx,bytes_trans
shr ecx,1 ; La frecuencia de muestreo en
estereo es la mitad que en mono.
les di,bloque_lle
movzx edx,br_indice
mov ebp,tab_muest1.pri_muest
movzx esi,tab_muest1.vol_tabla
movzx ebx,tab_muest1.basetabla
xor eax,eax
buc_canal1: mov al,fs:[ebp]
mov al,[esi+eax]
stosw ; Almacenamos AL (AH no nos importa)
mov al,[ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest1.fin_muest
ja setloops_c1
loop buc_canal1
jmp fin_canal1
setloops_c1: mov ebp,tab_muest1.loopsm
mov eax,tab_muest1.looplm
mov tab_muest1.fin_muest,eax
xor eax,eax
loop buc_canal1
fin_canal1: mov tab_muest1.pri_muest,ebp
;Procesando canal 2
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.54
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
movzx ecx,bytes_trans
shr ecx,1
les di,bloque_lle
inc di
mov ebp,tab_muest2.pri_muest
movzx esi,tab_muest2.vol_tabla
movzx ebx,tab_muest2.basetabla
xor eax,eax
buc_canal2: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
mov es:[di],al
add di,2
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest2.fin_muest
ja setloops_c2
loop buc_canal2
jmp fin_canal2
setloops_c2: mov ebp,tab_muest2.loopsm
mov eax,tab_muest2.looplm
mov tab_muest2.fin_muest,eax
xor eax,eax
loop buc_canal2
fin_canal2: mov tab_muest2.pri_muest,ebp
;Procesando canal 3
movzx ecx,bytes_trans
shr ecx,1
les di,bloque_lle
inc di
mov ebp,tab_muest3.pri_muest
movzx esi,tab_muest3.vol_tabla
movzx ebx,tab_muest3.basetabla
xor eax,eax
buc_canal3: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.55
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
add al,80h
add es:[di],al
add di,2
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest3.fin_muest
ja setloops_c3
loop buc_canal3
jmp fin_canal3
setloops_c3: mov ebp,tab_muest3.loopsm
mov eax,tab_muest3.looplm
mov tab_muest3.fin_muest,eax
xor eax,eax
loop buc_canal3
fin_canal3: mov tab_muest3.pri_muest,ebp
;Procesando canal 4
movzx ecx,bytes_trans
shr ecx,1
les di,bloque_lle
mov ebp,tab_muest4.pri_muest
movzx esi,tab_muest4.vol_tabla
movzx ebx,tab_muest4.basetabla
xor eax,eax
buc_canal4: mov al,byte ptr fs:[ebp]
mov al,[esi+eax]
add al,80h
add es:[di],al
add di,2
mov al,byte ptr [ebx+edx]
inc dl
add ebp,eax
cmp ebp,tab_muest4.fin_muest
ja setloops_c4
loop buc_canal4
jmp fin_canal4
setloops_c4: mov ebp,tab_muest4.loopsm
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.56
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov eax,tab_muest4.looplm
mov tab_muest4.fin_muest,eax
xor eax,eax
loop buc_canal4
fin_canal4: mov tab_muest4.pri_muest,ebp
mov br_indice,dx
endm
efectos macro canal
local nopitch,noslide,noarpegio,notslide,nofin_u,nofin_d
local final,mayor113,menor856,menor64,mayor0,notslideu
local notslided
cmp tab_muest&canal.flag_pitch,0
jz nopitch
mov ax,tab_muest&canal.pitch
sub ax,tab_muest&canal.valor_pitch
cmp ax,113
jge mayor113
mov ax,tab_muest&canal.pitch
mayor113: cmp ax,856
jle menor856
mov ax,tab_muest&canal.pitch
menor856: mov si,ax
mov tab_muest&canal.pitch,ax
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
nopitch: cmp tab_muest&canal.flag_slide,0
jz noslide
mov ax,tab_muest&canal.volumen
add ax,tab_muest&canal.valor_slide
cmp ax,64
jle menor64
mov ax,64
menor64: cmp ax,0
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.57
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
jge mayor0
xor ax,ax
mayor0: mov tab_muest&canal.volumen,ax
mul byte ptr volumen&canal
shr ax,6
mov tab_muest&canal.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest&canal.vol_tabla,ax
jmp final
noslide: cmp tab_muest&canal.flag_arpegio,0
jz noarpegio
mov ax,tab_muest&canal.pitch
mov si,tab_muest&canal.arpegio1
mov tab_muest&canal.pitch,si
mov bx,tab_muest&canal.arpegio2
mov tab_muest&canal.arpegio1,bx
mov tab_muest&canal.arpegio2,ax
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
noarpegio: cmp tab_muest&canal.flag_tslideu,0
jz notslideu
mov si,tab_muest&canal.pitch
sub si,tab_muest&canal.valtslide
cmp si,tab_muest&canal.finslide
ja nofin_u
mov si,tab_muest&canal.finslide
mov tab_muest&canal.flag_tslideu,0
nofin_u: mov tab_muest&canal.pitch,si
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
notslideu: cmp tab_muest&canal.flag_tslided,0
jz notslided
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.58
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov si,tab_muest&canal.pitch
add si,tab_muest&canal.valtslide
cmp si,tab_muest&canal.finslide
jb nofin_d
mov si,tab_muest&canal.finslide
mov tab_muest&canal.flag_tslided,0
nofin_d: mov tab_muest&canal.pitch,si
add si,si
mov bx,offset frec2offs
mov ax,[bx+si-226]
mov tab_muest&canal.basetabla,ax
jmp final
notslided:
final:
endm
init_sb proc near
push ds
espera_esc
mov al,0d1h
out dx,al
espera_esc
mov al,40h
out dx,al
espera_esc
mov al,sb_time
out dx,al

mov ah,35h
mov al,sb_int
int 21h
mov offdsp,bx
mov segdsp,es
mov ah,25h
mov al,sb_int
mov dx,offset int_dma
mov bx,seg int_dma
mov ds,bx
int 21h
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.59
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop ds
mov al,sb_int
sub al,8
mov cl,al
mov al,1
sal al,cl
mov bl,al
not bl
in al,21h
and al,bl
out 21h,al
mov dx,sb_puerto
sub dx,8
mov al,0eh
out dx,al
inc dx
in al,dx
and al,0FDh
out dx,al
cmp disp_salida,SBP_ST
jne no_act_ste
mov dx,sb_puerto
sub dx,8
mov al,0eh
out dx,al
inc dx
in al,dx
or al,2h
out dx,al
no_act_ste: ret
init_sb endp
deinit_sb proc near
mov dx,sb_puerto
sub dx,0ch
call reset_dsp
push ds
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.60
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov ah,25h
mov al,sb_int
lds dx,dword ptr offdsp
int 21h
pop ds
cmp disp_salida,SBP_ST
jne no_de_ste
mov dx,sb_puerto
sub dx,8
mov al,0eh
out dx,al
inc dx
in al,dx
and al,0FDh
out dx,al
no_de_ste: ret
deinit_sb endp
init_dac proc near
mov ax,3508h
int 21h
mov word ptr ant08,bx
mov word ptr ant08+2,es
push ds
mov dx,offset int08dac
mov ax,seg int08dac
mov ds,ax
mov ax,2508h
int 21h
pop ds
mov al,periodo
out 40h,al
jmp $+2
mov al,0
out 40h,al
mov ax,lptdata ; Parcheamos la direccin para
mov word ptr cs:[parche+1],ax ; mayor velocidad de ejecucin
ret
init_dac endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.61
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
deinit_dac proc near
push ds
lds dx,ant08
mov ax,2508h
int 21h
pop ds
xor al,al
out 40h,al
jmp $+2
out 40h,al
ret
deinit_dac endp
init_proy proc near
mov ah,35h
mov al,numintp
int 21h
mov word ptr antproy,bx
mov word ptr antproy+2,es
cli
push ds
mov al,numintp
mov dx,offset intproy
mov bx,seg intproy
mov ds,bx
mov ah,25h
int 21h
pop ds
in al,21h
and al,01011111b
out 21h,al
mov dx,lptctrl
mov al,10h
out dx,al
push 0036h ; Programar timer 0, modo 3
push 0001h ; Los tres argumentos de la llamada a e8253
push 0001h
call e8253
add sp,6
mov al,perproy
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.62
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
xor ah,ah
push ax
push 0000h
push 0000h
call e8253
add sp,6
push 0000h
push 0000h
push 0000h
call e8253
add sp,6
sti
ret
init_proy endp
deinit_proy proc near
mov dx,lptctrl
mov al,03h
out dx,al
mov al,numintp
push ds
lds dx,antproy
mov ah,25h
int 21h
pop ds
ret
deinit_proy endp
init_spk proc near
mov ax,3508h
int 21h
mov word ptr ant08,bx
mov word ptr ant08+2,es
push ds
mov dx,offset int08spk
mov ax,seg int08spk
mov ds,ax
mov ax,2508h
int 21h
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.63
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop ds
mov al,periodo
out 40h,al
jmp $+2
mov al,0
out 40h,al
in al,97
or al,3
out 97,al
mov al,10010000b
out 43h,al
ret
init_spk endp
deinit_spk proc near
push ds
lds dx,ant08
mov ax,2508h
int 21h
pop ds
xor al,al
out 40h,al
jmp $+2
out 40h,al
in al,97
and al,0fch
out 97,al
ret
deinit_spk endp

init_sampler proc C
cli
cmp disp_salida,ALTAVOZ
jne no_altavoz
call init_spk
jmp sigue_init
no_altavoz: cmp disp_salida,DAC_LPT
jne no_dac
call init_dac
jmp sigue_init
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.64
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
no_dac: cmp disp_salida,PROY
jne no_proy
call init_proy
jmp sigue_init
no_proy: call init_sb
;INICIALIZAR TABLAS Y VARIABLES
sigue_init: mov terminado,0
mov fin_canc,0
mov hacersalto,0
mov br_indice,0
mov conta_frames,0
mov indice_int,0
mov ax,bytes_trans
mov cont_int,ax
mov ax,periodo_ant08
mov cont_ant08,ax
mov al,velocidad
mov cont_tpd,al
mov bx,offset lis_patt
mov si,cont_pat
inc cont_pat
mov al,[bx+si] ;leer el n de patron que sigue en la lista
mov bl,4 ;tamao de un elemento de la tabla de punteros a patrones
mul bl
mov bx,ax
add bx,offset tab_patt ;bx -> puntero a la direccion del patron a
;tocar
mov dx,[bx] ;dx=offset del nuevo patron
mov al,24 ;longitud en bytes de una linea
mul cont_lin
add dx,ax
mov linea_act,dx
mov dx,[bx+2] ;dx=segmento del nuevo patron
mov patr_act,dx
push es
mov es,dx ;es direcciona el nuevo patron
mov bx,linea_act ;bx se va moviendo a traves del patron
call actual_canal
mov linea_act,bx
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.65
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop es
call ponvolumen
call llenar_dma
call swap_bloque
call llenar_dma
cmp disp_salida,SB20
jb fin_init
call setup_dma
fin_init: sti
ret
init_sampler endp
des_sampler proc C
cli
cmp disp_salida,ALTAVOZ
jne no_dalta
call deinit_spk
jmp sigue_des
no_dalta: cmp disp_salida,DAC_LPT
jne no_ddac
call deinit_dac
jmp sigue_des
no_ddac: cmp disp_salida,PROY
jne no_dproy
call deinit_proy
jmp sigue_des
no_dproy: call deinit_sb
sigue_des: sti
ret
des_sampler endp
int_dma proc far
push eax
push ebx
push ecx
push edx
push esi
push edi
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.66
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
push ebp
push ds
push es
push fs
cld
mov ax,dgroup
mov ds,ax
xor ax,ax
mov fs,ax
mov dx,sb_puerto
add dx,2
in al,dx ;ACK al DSP. Interrupcin recibida.
mov al,20h
out 20h,al ;ACK al 8259.
inc conta_frames
cmp terminado,1
je fin_intsb
cmp fin_canc,1
je fin_total
call swap_bloque
call setup_dma
call llenar_dma
call calc_efecto
jmp fin_intsb
fin_total: mov terminado,1
fin_intsb: pop fs
pop es
pop ds
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
iret
int_dma endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.67
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
int08dac proc far
push ax
push bx
push dx
push si
push ds
push es
mov al,20h
out 20h,al
mov ax,dgroup
mov ds,ax
cmp terminado,0
jne fin_idac
les si,bloque_dma
parche: mov dx,378h
mov bx,indice_int
mov al,es:[bx+si]
out dx,al
inc indice_int
dec cont_int
jz fin_bl_dac
fin_idac: dec cont_ant08
jz llama_reld
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
fin_bl_dac: call prep_datos
dec cont_ant08
jz llama_reld
pop es
pop ds
pop si
pop dx
pop bx
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.68
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop ax
iret
llama_reld: pushf
call dword ptr ant08
mov ax,periodo_ant08
mov cont_ant08,ax
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
int08dac endp
int08spk proc far
push ax
push bx
push dx
push si
push ds
push es
mov al,20h
out 20h,al
mov ax,dgroup
mov ds,ax
cmp terminado,0
jne fin_ispk
les si,bloque_dma
mov bx,indice_int
mov al,es:[bx+si]
mov bx,offset compresion
xlat
mul periodo
mov al,ah
out 42h,al
inc indice_int
dec cont_int
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.69
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
jz fin_bl_spk
fin_ispk: dec cont_ant08
jz llama_rels
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
fin_bl_spk: call prep_datos
dec cont_ant08
jz llama_rels
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
llama_rels: pushf
call dword ptr ant08
mov ax,periodo_ant08
mov cont_ant08,ax
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
int08spk endp
intproy proc far
push ax
push bx
push dx
push si
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.70
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
push ds
push es
mov al,20h
out 20h,al
mov ax,dgroup
mov ds,ax
cmp terminado,0
jne fin_iproy
les si,bloque_dma
mov bx,indice_int
mov al,es:[bx+si]
mov dx,lptdata
out dx,al
mov al,00010010b
mov dx,lptctrl
out dx,al
jmp $+2
mov al,00010011b
out dx,al
jmp $+2
mov al,es:[bx+si+1]
mov dx,lptdata
out dx,al
jmp $+2
mov al,00010001b
mov dx,lptctrl
out dx,al
jmp $+2
mov al,00010011b
out dx,al

add indice_int,2
sub cont_int,2
jz fin_bl_pry
fin_iproy: pop es
pop ds
pop si
pop dx
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.71
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop bx
pop ax
iret
fin_bl_pry: call prep_datos
pop es
pop ds
pop si
pop dx
pop bx
pop ax
iret
intproy endp
prep_datos proc near
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
push fs
cld
inc conta_frames
cmp terminado,0
jne fin_prep
cmp fin_canc,0
jne fin_tprep
mov ax,bytes_trans
mov cont_int,ax
mov indice_int,0
call swap_bloque
xor ax,ax
mov fs,ax
sti
call llenar_dma
call calc_efecto
cli
jmp fin_prep
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.72
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
fin_tprep: mov terminado,1
fin_prep: pop fs
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
prep_datos endp

actualiza proc near
actualiz: mov chivato,1
cmp hazpausa,1
jne nopausa
ret
nopausa: cmp hacersalto,1
jne nohazsalto
mov hacersalto,0
jmp cambpat
nohazsalto: inc cont_lin
cmp cont_lin,64
jne nocambpat
jmp cambpat
nocambpat: mov ax,patr_act
mov es,ax ;es direcciona el nuevo patron
mov bx,linea_act ;bx se va moviendo a traves del patron
call actual_canal
mov linea_act,bx
call ponvolumen
ret
cambpat: mov cont_lin,255
mov bx,offset lis_patt
mov si,cont_pat
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.73
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
inc cont_pat
mov al,[bx+si] ;leer el n de patron que sigue en la lista
cmp al,128
je fintocar
mov bl,4 ;tamao de un elemento de la tabla de punteros a patrones
mul bl
mov bx,ax
add bx,offset tab_patt ;bx -> puntero al patron a tocar
mov dx,[bx] ;dx=offset del nuevo patron
mov linea_act,dx
mov dx,[bx+2] ;dx=segmento del nuevo patron
mov patr_act,dx
jmp actualiz
fintocar: mov fin_canc,1
ret
actualiza endp
actual_canal proc near
act_canal 1
act_canal 2
act_canal 3
act_canal 4
ret
actual_canal endp
calc_efecto proc near
efectos 1
efectos 2
efectos 3
efectos 4
dec cont_tpd
jnz no_llam_act
mov al,velocidad
mov cont_tpd,al
jmp actualiza
no_llam_act: ret
calc_efecto endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.74
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
ponvolumen proc C
mov al,byte ptr tab_muest1.volumen
mul volumen1
shr ax,6
mov tab_muest1.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest1.vol_tabla,ax
mov al,byte ptr tab_muest2.volumen
mul volumen2
shr ax,6
mov tab_muest2.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest2.vol_tabla,ax
mov al,byte ptr tab_muest3.volumen
mul volumen3
shr ax,6
mov tab_muest3.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest3.vol_tabla,ax
mov al,byte ptr tab_muest4.volumen
mul volumen4
shr ax,6
mov tab_muest4.vol_play,ax
shl ax,8
add ax,offset tabla_g_vol
mov tab_muest4.vol_tabla,ax
ret
ponvolumen endp
reset_dsp proc far
push dx
add dx,6
mov al,1
out dx,al
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.75
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
mov cx,1000
simul_hlt: nop
loop simul_hlt
xor al,al
out dx,al
add dx,4
mov cx,800
buc_pool: in al,dx
cmp al,0aah
je hay_dsp
loop buc_pool
pop dx
mov ax,1
ret
hay_dsp: pop dx
add dx,0ch
mov sb_puerto,dx
mov al,0d1h
out dx,al
; sub dx,8
; mov al,4
; out dx,al
; inc dx
; mov al,0ffh
; out dx,al
; dec dx
; mov al,22h
; out dx,al
; inc dx
; mov al,0ffh
; out dx,al
mov ax,0
ret
reset_dsp endp
detecta_SB proc C
mov dx,210h
call reset_dsp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.76
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
jne sigue_1
mov al,'3'
jmp fin_sb
sigue_1: mov dx,220h
call reset_dsp
jne sigue_2
mov al,'5'
jmp fin_sb
sigue_2: mov dx,230h
call reset_dsp
jne sigue_3
mov al,'3'
jmp fin_sb
sigue_3: mov dx,240h
call reset_dsp
jne sigue_4
mov al,'5'
jmp fin_sb
sigue_4: mov dx,250h
call reset_dsp
jne sigue_5
mov al,'3'
jmp fin_sb
sigue_5: mov dx,260h
call reset_dsp
jne sigue_6
mov al,'3'
jmp fin_sb
sigue_6: mov al,'2'
fin_sb: mov ah,0
ret
detecta_SB endp
detecta_LPT proc C num_lpt:word
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.77
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
push es
push si
mov ax,40h
mov es,ax
mov si,num_lpt
add si,si
add si,8
mov ax,es:[si]
mov lptdata,ax
inc ax
mov lptstd,ax
inc ax
mov lptctrl,ax
pop si
pop es
dec ax
dec ax
ret
detecta_LPT endp
e8253 proc C a1:byte, a0:byte, valor:byte
mov dx,lptdata
mov al,valor
out dx,al
mov dx,lptctrl
in al,dx
mov cl,al
mov al,a0
sal al,2
mov bl,a1
xor bl,1
sal bl,1
or al,bl
or al,19h
out dx,al
jmp $+2
and al,0feh
out dx,al
jmp $+2
mov al,cl
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.78
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
out dx,al
ret
e8253 endp
swap_bloque proc near
mov eax,bloque_dma
xchg eax,bloque_lle
mov bloque_dma,eax
ret
swap_bloque endp
setup_dma proc near
;SETUP del DMA
mov al,sb_dma
or al,100b
out 0ah,al ; Poner mscara a DMA
out 0ch,al ; borrar flip-flop con cualquier dato
mov al,48h
or al,sb_dma
out 0bh,al ; Hacer DMA -> DAC
mov ax,word ptr bloque_dma+2
mov bx,16
mul bx ; DX:AX=SEG(bloque_dma)<<4
add ax,word ptr bloque_dma
adc dx,0 ; DX:AX=direccin lineal del buffer
DMA
mov bl,dl ; BL=pgina del bloque DMA
xor dh,dh
mov dl,sb_dma
inc dx
out dx,al ; Almacenamos la direccin
mov al,ah ; base (16 bits bajos) del
out dx,al ; bloque DMA
inc dx
mov ax,bytes_trans
dec ax
out dx,al ; Y ahora almacenamos la
mov al,ah ; longitud del bloque DMA
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.79
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
out dx,al ; (hasta 64K)
mov al,bl
cmp sb_dma,0 ; Miramos en qu canal est la SB
jne canal_1 ; para almacenar el valor de la
pgina
out 87h,al ; en el registro adecuado
jmp f_setup_dma
canal_1: cmp sb_dma,1
jne canal_3
out 83h,al
jmp f_setup_dma
canal_3: out 82h,al
f_setup_dma: mov al,sb_dma
out 0ah,al ; Comando: transferencia memoria->E/S
bajo demanda
;SETUP del DSP
espera_esc
mov al,48h
out dx,al
mov cx,bytes_trans
dec cx
espera_esc
mov al,cl
out dx,al
espera_esc
mov al,ch
out dx,al
espera_esc
mov al,91h ;Comando: DAC por DMA, high-speed
out dx,al
ret
setup_dma endp
llenar_mono proc near
push ebp
canal4_mono
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.80
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
pop ebp
ret
llenar_mono endp
llenar_ste proc near
push ebp
canal4_st
pop ebp
ret
llenar_ste endp
llenar_dma proc near
cmp disp_salida,SBP_ST
je es_ste
cmp disp_salida,PROY
je es_ste
jmp llenar_mono
es_ste: jmp llenar_ste
llenar_dma endp
end
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.81
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
SECUENC.INC
comment %
-----------------------------------------------------------------------------
LISTAS GENERADAS POR EL ALGORITMO DE BRESENHAM PARA CAMBIAR EL PITCH DE CADA
MUESTRA DE ACUERDO CON LA NOTA Y LA OCTAVA QUE SE QUIERE TOCAR.
-----------------------------------------------------------------------------
%
sec_do0 db 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0
db 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0
db 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0
db 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
db 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0
db 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0
db 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0
db 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
db 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
sec_dos0 db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
db 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
db 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
db 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
db 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
db 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
sec_re0 db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0
db 0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
db 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0
db 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0
db 0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
db 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0
db 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1
db 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
sec_res0 db 1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.82
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
db 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
sec_mi0 db 1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0
db 0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0
db 0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
db 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0
db 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0
db 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1
db 0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
sec_fa0 db 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
db 1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1
db 0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1
db 0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0
db 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0
db 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0
db 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
sec_fas0 db 1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0
db 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0
db 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0
db 0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
db 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0
sec_sol0 db 1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0
db 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1
db 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0
db 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1
db 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0
db 0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0
sec_sols0 db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.83
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
db 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0
db 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0
sec_la0 db 1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0
db 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0
db 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1
db 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0
db 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0
db 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1
db 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0
db 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0
sec_las0 db 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0
db 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0
db 0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0
db 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0
db 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1
db 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0
db 0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0
db 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0
sec_si0 db 1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1
db 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1
db 0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0
db 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0
db 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0
db 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0
db 0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0
sec_do1 db 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0
db 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0
db 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0
db 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0
db 0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0
sec_dos1 db 1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.84
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0
db 1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0
db 1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1
db 0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1
db 0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1
db 0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1
db 0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1
db 0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0
sec_re1 db 1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0
db 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0
db 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0
db 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0
db 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1
db 0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0
sec_res1 db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0
sec_mi1 db 1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0
db 0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0
db 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0
db 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1
db 0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0
db 0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1
db 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,1
sec_fa1 db 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0
db 1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1
db 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1
db 0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.85
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0
db 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1
sec_fas1 db 1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1
db 0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0
db 1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0
db 1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0
db 0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1
db 0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0
db 1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0
db 0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1
sec_sol1 db 1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1
db 0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1
db 0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0
db 0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0
db 1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1
db 0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1
db 0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0
db 0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0
db 1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0
sec_sols1 db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0
db 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0
db 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0
sec_la1 db 1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0
db 0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1
db 0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0
db 1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1
db 0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1
db 0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0
db 1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1
db 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0
db 1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0
sec_las1 db 1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1
db 0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0
db 1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0
db 1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.86
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0
db 1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1
db 0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0
db 0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0
db 1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1
sec_si1 db 1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1
db 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1
db 0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0
db 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0
db 1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0
db 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1
db 0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1
db 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0
db 1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1
sec_do2 db 128 dup (1,0)
sec_dos2 db 1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0
db 1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0
db 1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0
db 1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1
db 0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1
db 0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1
db 0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1
db 0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1
db 0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0
sec_re2 db 1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0
db 1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0
db 1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0
db 1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0
db 1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0
db 1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0
db 1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1
db 0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1
db 0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1
sec_res2 db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,1,0
db 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.87
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
sec_mi2 db 1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0
db 1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0
db 1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0
db 1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0
db 1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1
db 0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1
db 0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1
db 0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1
db 0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1
sec_fa2 db 1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0
db 1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1
db 0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1
db 1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0
db 1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1
db 0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1
db 0,1,1,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1
db 1,0,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0
db 1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1
sec_fas2 db 1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1
db 0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1
db 1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0
db 1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1
db 1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0
db 1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1
db 0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1
db 1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0,1,1,1
db 0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1
sec_sol2 db 1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1
db 0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1
db 1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1
db 0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1
db 1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1
db 0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1
db 1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1
db 0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1
db 1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1
sec_sols2 db 1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1
db 1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1
db 1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1
db 1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1
db 1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1
db 1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.88
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1
db 0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1
db 0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0
sec_la2 db 1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0
db 1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1
db 1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1
db 1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1
db 1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1
db 0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1
db 1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1
db 1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0
db 1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1
sec_las2 db 1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1
db 1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1
db 1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0
db 1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1
db 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1
db 1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1
db 1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1
db 0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1
db 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1
sec_si2 db 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1
sec_do3 db 256 dup(1)
sec_dos3 db 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1
sec_re3 db 2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1
db 1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.89
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1
db 2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1
db 1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1
db 1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1
db 2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1
db 1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1
db 1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1
sec_res3 db 2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1
db 1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1
db 1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1
db 2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1
db 1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1
db 1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1
db 2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1
db 1,2,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,2,1
db 1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,1
sec_mi3 db 2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1
db 1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1
db 1,1,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1
db 1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2
db 1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1
db 2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1
db 1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1
db 1,1,2,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2
db 1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1
sec_fa3 db 2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1
db 2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1
db 2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1
db 2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2
db 1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2
db 1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2
db 1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2
db 1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1,1,2
db 1,1,2,1,1,2,1,1,2,1,1,2,1,1,2,1
sec_fas3 db 2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,1,2,1,2
db 1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1
db 2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2
db 1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1
db 1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1
db 2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2
db 1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1
db 2,1,2,1,1,2,1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,2,1,2
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.90
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 1,2,1,1,2,1,2,1,1,2,1,2,1,2,1,1
sec_sol3 db 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1
db 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1
db 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1
db 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1
db 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,2
db 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
db 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
db 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
db 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
sec_sols3 db 2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2
db 1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1
db 2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2
db 2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2
db 1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1
db 2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2
db 2,1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2
db 1,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2,1
db 2,1,2,2,1,2,1,2,1,2,2,1,2,1,2,2
sec_la3 db 2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2
db 1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2
db 2,1,2,2,1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,2
db 1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2,1,2
db 2,1,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1
db 2,2,1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,2,1,2
db 2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2,1,2,2,1
db 2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,2
db 1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2
sec_las3 db 2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2
db 1,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2
db 2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1
db 2,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2
db 2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1
db 2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2
db 2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,2,1
db 2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2,2,2,2,1,2,2,2
db 2,1,2,2,2,1,2,2,2,2,1,2,2,2,1,2
sec_si3 db 2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2
db 2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2
db 2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2
db 2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2
db 1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.91
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2
db 2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1
db 2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,2,2
db 2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2
sec_do4 db 256 dup(2)
sec_dos4 db 3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2
db 2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3
db 2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2
db 2,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2
db 2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2
db 2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,2
db 2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2
db 3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2
db 2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2
sec_re4 db 3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,2,3
db 2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2
db 2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2
db 3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2
db 2,2,3,2,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2
db 2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,2,3,2,2,2
db 3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2
db 2,2,3,2,2,2,3,2,2,2,3,2,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2
db 2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2
sec_res4 db 3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3
db 2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,3,2,2,3,2
db 2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2
db 3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3
db 2,2,3,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2
db 2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2
db 3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,3,2,2,3,2,2,3
db 2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2,3,2,2,3,2
db 3,2,2,3,2,2,3,2,3,2,2,3,2,2,3,2
sec_mi4 db 3,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3
db 2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2
db 3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,2
db 3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3
db 2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2
db 3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3
db 2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2
db 3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3
db 3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2
sec_fa4 db 3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.92
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2
db 3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2
db 3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,3,2,3,3,2,3,3
db 2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3
db 2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3
db 2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3
db 2,3,3,2,3,3,2,3,3,2,3,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3,2,3
db 3,2,3,3,2,3,3,2,3,3,2,3,3,2,3,3
sec_fas4 db 3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,3,2,3,3,3
db 3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3
db 3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3
db 2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,2
db 3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2
db 3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3
db 3,3,3,3,2,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3
db 3,3,3,2,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3
db 3,3,2,3,3,3,3,3,2,3,3,3,3,3,2,3
sec_sol4 db 4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2
db 4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2
db 4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2
db 4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2
db 4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,2,4
db 2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4
db 2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4
db 2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4
db 2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4
sec_sols4 db 4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4
db 2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2
db 4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4
db 4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4
db 2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2
db 4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4
db 4,2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4
db 2,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4,2
db 4,2,4,4,2,4,2,4,2,4,4,2,4,2,4,4
sec_la4 db 4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,4,2,4,4,2,4,4
db 2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4
db 4,2,4,4,2,4,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,4
db 2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,4,2,4,4,2,4,4,2,4
db 4,2,4,4,2,4,4,2,4,4,2,4,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2
db 4,4,2,4,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,4,2,4
db 4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,4,2,4,4,2,4,4,2,4,4,2
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.93
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
db 4,4,2,4,4,2,4,4,2,4,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4,2,4,4
db 2,4,4,4,2,4,4,2,4,4,2,4,4,2,4,4
sec_las4 db 4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4
db 2,4,4,4,2,4,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4
db 4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2
db 4,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4
db 4,2,4,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2
db 4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4
db 4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,4,2
db 4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4,4,4,4,2,4,4,4
db 4,2,4,4,4,2,4,4,4,4,2,4,4,4,2,4
sec_si4 db 4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4
db 4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4
db 4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4
db 4,4,4,4,2,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4
db 2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4
db 4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4
db 4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2
db 4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4,4,4
db 4,4,4,4,4,2,4,4,4,4,4,4,4,4,2,4
tabla_bres dw offset sec_dos0
public C tabla_bres
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.94
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
COMPRES.INC
compresion db 1,1,1,1,1,2,2,3,3,3,4,4,4,5,5,5
db 6,6,7,7,7,8,8,8,9,9,9,10,10,11,11,11
db 12,12,12,13,13,13,14,14,15,15,15,16,16,16,17,17
db 18,18,18,19,19,19,20,20,20,21,21,22,22,22,23,23
db 23,24,24,24,25,25,26,26,26,27,27,27,28,28,28,29
db 29,30,30,30,31,31,33,36,38,40,42,45,47,49,51,54
db 56,58,60,63,65,67,69,72,74,76,78,81,83,85,87,90
db 92,94,97,99,101,103,106,108,110,112,115,117,119,121,124,126
db 128,130,133,135,137,139,142,144,146,148,151,153,155,157,160,162
db 164,167,169,171,173,176,178,180,182,185,187,189,191,194,196,198
db 200,203,205,207,209,212,214,216,218,221,223,223,224,224,225,225
db 225,226,226,226,227,227,228,228,228,229,229,229,230,230,231,231
db 231,232,232,232,233,233,234,234,234,235,235,235,236,236,237,237
db 237,238,238,238,239,239,240,240,240,241,241,241,242,242,243,243
db 243,244,244,244,245,245,246,246,246,247,247,247,248,248,249,249
db 249,250,250,250,251,251,252,252,252,253,253,253,254,254,255,255
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.95
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
TRPLAY.C
#include <stdio.h>
#include <string.h>
#include <process.h>
#include <stdlib.h>
#include "tracklib.h"
#include "xmem.h"
// Modelo large
#define QUIET(p) if (!silenc) p;
#define PRDISP QUIET (printf ("Reproduciendo %s %s\nFrecuencia de muestreo: %u
Hz\n",fmodulo,nombremod,frecuencia)) \
QUIET (printf ("ESC:salir Espacio:pausa/sigue ejecucin
S:shell al DOS\n")) \
QUIET (printf ("Dispositivo de reproduccin: ")) \
switch (disp_salida) \
{ \
case ALTAVOZ: QUIET (printf ("Altavoz interno.\n\n"))
break; \
case DAC_LPT: QUIET (printf ("DAC en puerto LPT:
%04.4X\n\n",lptdata)) break; \
case PROY: QUIET (printf ("Tarjeta de sonido de
proyecto en puerto LPT: %04.4X\n\n",lptdata)) break; \
default: QUIET (printf ("Sound Blaster %s en puerto:
%04.4X, IRQ:%d, DMA:%d\n\n",(disp_salida==SBP_MONO)? "mono":"Pro",
sb_puerto-12,sb_int-8,sb_dma)) \
}
void main(int argc,char *argv[])
{
int estado; // Resultado de la carga del mdulo
FILE *modulo; // Fichero .MOD
char tecla,letra,i;
char opcion[80],fmodulo[80];
char silenc=0;
char exe=0;
char num_lpt;
char ejecut[80];
unsigned memoria_total;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.96
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
char modo;
if (argc==1)
{
printf ("TRPLAY 2.1 Reproductor de mdulos de Amiga para PC\n");
printf ("Sintaxis:\n");
printf ("TRPLAY modulo[.MOD] [-{SPK | DACx | SBP_MONO | SBP_ST | PROY}]
[-QUIET]\n");
printf ("[-EXEprograma] [-MEMtamao] [-{NTSC | PAL}] [-{A|B|C...|X}]\n\n");
printf (" SPK : Reproduce a travs del altavoz interno.\n");
printf (" DACx : Usa un DAC en el puerto LPTx.\n");
printf (" SBP_MONO : Usa una Sound Blaster 2.0 o SB Pro monoaural.\n");
printf (" SBP_ST : Usa una Sound Blaster Pro en estreo.\n");
printf (" PROY : Usa la tarjeta de sonido del proyecto.\n");
printf (" QUIET : Modo silencioso. No se escribe nada en
pantalla.\n");
printf (" EXE : Ejecuta el programa especificado sin interrumpir la
msica.\n");
printf (" MEM : Reserva 'tamao' Kbytes de XMS para
instrumentos.\n");
printf (" NTSC/PAL : Selecciona temporizacin. Necesario para algunos
MOD's.\n");
printf (" A - X : Frec. de muestreo. A = 31388 Hz X = 8313
Hz\n\n");
printf ("Por defecto se asume 1Mb XMS, SOund Blaster Pro y 22195 Hz (G)\n");
printf ("o el altavoz interno si no hay tarjeta Sound Blaster.\n\n");
printf ("(c) 1992-1995 Miguel Angel Rodriguez Jodar.\n");
printf ("Este programa es freeware.\n");
printf ("Para cualquier duda o comentario e-mail a:\n");
printf (" rodriguj@risc36.fie.us.es or rodriguj@150.214.141.36\n");
exit(0);
}
letra='G';
disp_salida=NULO;
num_lpt=1;
memoria_total=1024;
modo=PAL;
strcpy(fmodulo,argv[1]);
strupr(fmodulo);
if (!strstr(fmodulo,".MOD"))
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.97
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
strcat(fmodulo,".MOD");
for (i=2;i<argc;i++)
{
strcpy (opcion,argv[i]);
strupr (opcion);
if (strlen(opcion)==2 && opcion[0]=='-' && opcion[1]>='A' &&
opcion[1]<='X')
letra=opcion[1];
else if (opcion[0]=='-' && !strcmp(opcion+1,"SPK"))
disp_salida=ALTAVOZ;
else if (opcion[0]=='-' && !strncmp(opcion+1,"DAC",3))
{
disp_salida=DAC_LPT;
num_lpt=opcion[4];
}
else if (opcion[0]=='-' && !strcmp(opcion+1,"SBP_MONO"))
disp_salida=SBP_MONO;
else if (opcion[0]=='-' && !strcmp(opcion+1,"SBP_ST"))
disp_salida=SBP_ST;
else if (opcion[0]=='-' && !strcmp(opcion+1,"PROY"))
disp_salida=PROY;
else if (opcion[0]=='-' && !strcmp(opcion+1,"QUIET"))
silenc=1;
else if (opcion[0]=='-' && !strncmp(opcion+1,"EXE",3))
{
strcpy(ejecut,opcion+4);
exe=1;
}
else if (opcion[0]=='-' && !strncmp(opcion+1,"MEM",3))
memoria_total=atol(opcion+4);
else if (opcion[0]=='-' && !strncmp(opcion+1,"NTSC",4))
modo=NTSC;
else
{
printf ("La opcin %s es errnea.\n",argv[i]);
exit(1);
}
}
switch (num_lpt)
{
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.98
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
case '3': num_lpt=LPT3; break;
case '2': num_lpt=LPT2; break;
case '1':
default : num_lpt=LPT1; break;
}
if (disp_salida==NULO || disp_salida==SBP_MONO || disp_salida==SBP_ST)
{
detecta_SB();
if ((sb_puerto==0x22c || sb_puerto==0x24c) && disp_salida!=SBP_MONO)
disp_salida=SBP_ST;
else if (sb_puerto!=0)
disp_salida=SBP_MONO;
else
disp_salida=ALTAVOZ;
}
if (disp_salida==NULO || disp_salida==PROY)
{
detecta_proy();
if (lptdata==0)
disp_salida=ALTAVOZ;
}
prepara_doble_buffer();
prepara_tabla_vol ((disp_salida==SBP_ST || disp_salida==PROY)? 2 : 4);
switch (disp_salida)
{
case DAC_LPT: detecta_LPT (num_lpt);
break;
case SBP_MONO:
case SBP_ST: if (!parametros_SB()) // Carga parmetros de la SB desde
la variable BLASTER
QUIET (printf ("Variable BLASTER no encontrada.\n"))
break;
}
if (memoria_total<64)
{
QUIET (printf ("Error: opcin MEM tiene un valor demasiado bajo.\nLa
cantidad de memoria XMS reservada debe ser mayor de 64K\n"));
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.99
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
exit (1);
}
if (!X_inicia_gestor(memoria_total))
{
QUIET (printf ("Error en la inicializacin del gestor de memoria
REALMEM.\n"))
QUIET (printf ("Compruebe que dispone de %uK de XMS y que la CPU no est en
modo virtual-8086.\n",memoria_total))
exit (1);
}
cambia_frecuencia(letra,modo); // Asignamos la frecuencia
// Carga el mdulo en memoria
modulo=fopen(fmodulo,"rb");
estado=cargar_modulo(modulo);
fclose(modulo);
if (estado)
{
QUIET (printf ("Error durante la carga del mdulo.\n"))
QUIET (printf ("El fichero no se encontr o es demasiado grande para caber en
memoria.\n"))
X_fin_gestor();
exit (1);
}
/* le decimos desde donde hay que tocar el modulo */
cont_lin=cont_pat=0;
/* volumenes de cada canal (de 0 a 64) */
volumen1=64;
volumen2=64;
volumen3=64;
volumen4=64;
chivato=1;
// Empieza a sonar la msica
PRDISP
init_sampler();
// A partir de ahora, todo lo que se ejecuta se hace con la msica en
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. 7.100
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
background
if (exe)
{
spawnlp(P_WAIT,ejecut,NULL);
terminado=1;
}
while (!terminado)
{
QUIET (printf("Patrn: %02.2d Divisin: %02.2d Velocidad: %02.2d
\r",cont_pat,cont_lin,velocidad))
if (kbhit())
{
tecla=getch();
if (tecla==27)
terminado=1;
if (tecla==' ')
hazpausa=!hazpausa;
if (tecla=='s')
{
puts("\n");
QUIET (printf ("Teclea EXIT para volver a TRPLAY\n"))
spawnlp(P_WAIT,getenv("COMSPEC"),NULL);
QUIET (puts("\n"))
PRDISP
}
}
}
putchar('\n');
des_sampler(); // desconectar dispositivo de salida
borrar_modulo(); // borrar mdulo de la memoria
X_fin_gestor();
}
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.1
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
ANEXOS
1.- Bibliografa
La mayora de la informacin presentada original del autor. Sin embargo, los siguientes textos se
han utilizado para clarificar, completar o documentar mejor algunos aspectos:
[BIN88] Bingham, E. O. The fast Fourier transform and its aplications. Ed. Prentice-Hall, 1988
[GRE89] Gregg, W. D. Analog and digital comunications. Ed. John Wiley, 1989
[RIF91] J. Rif-Ll. Hughet. Comunicacin digital. Ed. Masson, 1991
[TRA87] Tran Tien Lang. Electronics of Measuring Systems. Ed. John Wiley, 1987
[RAY88] Ray Duncan. MS DOS Avanzado. Ed. Anaya Multimedia, 1988
[ROS90] Miguel Angel Rodrguez-Rosell. 8088/8086-8087 Programacin ensamblador en
entorno MS DOS. Ed. Anaya Multimedia, 1988
[ANG90] J. M. Angulo. Electrnica digital moderna. Teora y prctica. Ed. Paraninfo, 1990
[INTEL] Intel Corporation. Datasheets de los circuitos 8253, 8254, 8259A y 8255
[CHR93] Christian Kuhnert, Stefan Maelger y Johannes Schemmel. Amiga Intern.Ed: Abacus,
1993
El texto del captulo 3 sobre secuenciamiento musical es original del autor. La informacin sobre
el estndar MIDI ha sido cedida por yish@cs.huji.ac.il.
La especificacin de los archivos MOD se puede encontrar en varios FTP-sites. Uno de los ms
idneos para buscar informacin sobre estos y otros aspectos del sonido digital es x2ftp.oulu.fi
En concreto, la documentacin fue aportada por Andrew Scott (Adrenalin Software). Se puede encontrar
en Internet por ascott@tartarus.uwa.edu.au
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.2
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Las descripciones del captulo 4 son un extracto de los correspondientes data-sheets publicados
por Intel. Tambin se pueden encontrar referencias mediante el programa HelpPC 2.1 que ofrece
documentacin en linea de numerosos aspectos de programacin y hardware, y que se convirti en una
valiosa ayuda en la codificacin de las rutinas. Este programa se puede encontrar en la ya mencionada
x2ftp.oulu.fi bajo el nombre HELPPC21.ZIP
La discursin sobre el modo real, el protegido y REALMEM proviene de una conferencia en
USENET en el grupo comp.os.msdos.programmers sobre acceder a ms de 64K en un segmento. La
documentacin aportada incluye la descripcin del funcionamiento de la instruccin LOADALL. El texto
entero se puede encontrar en The hyper-space navigators guide, de Terrance E. Hodgins. Semi-
Intelligent Systems PO BOX 4492. ALBURQUERQUE, NM 87196. Al autor se puede acceder va e-mail
por Internet a terry%scopes.unm.edu@ariel.unm.edu o por Compuserve en 76416,553
Un extracto del mismo se puede encontrar bajo el nombre REALMEM.ZIP o VIEW-XM.ZIP en
x2ftp.
La informacin del ADC0820 se tom de los data-sheets publicados por National Semiconductor.
Adems, en x2ftp se pueden encontrar numerosas referencias a los archivos MOD, as como
rutinas con otras caractersticas para ejecutar no slo MODs sino tambin archivos S3M. Para ms
informacin: ftp://x2ftp.oulu.fi/pub/msdos/programming.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.3
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
2.- Agradecimientos.
El autor desea expresar su agradecimiento a las siguientes personas y asociaciones:
En primer lugar, a mis compaeros Luis Santiago Snchez Fernndez, autor de la presentacin
grfica en el Sampler, Miguel Angel Hinojosa Romero, que cedi el laboratorio dnde se hicieron las
primeras pruebas, y que arriesg valientemente la integridad fsica de uno de sus dedos mientras soldaba
el segundo prototipo; y a Carmen y Sonia por ayudarles en la ardua tarea.
Al departamento de Arquitectura, especialmente a mi tutor, D. Gabriel Jimnez Moreno, y D.
Antn Civit Balcells, por el apoyo y facilidades prestadas durante el desarrollo de este trabajo.
A la pandilla (nombrarlos a todos sera muy largo), por soportar de ven en cuando mis peroratas
sobre las excelencias del ensamblador y el modo protegido del 386.
A todos los usuarios de galileo.fie.us.es por la ayuda prestada en el testeo del programa y de las
libreras.
A Julio, de R.C.O. por ponerme precios baratitos en los componentes.
A todos los usuarios del grupo comp.os.msdos.programmers de UsNet, y por extensin a todos
los habitantes de Internet que han aportado su colaboracin respondiendo a mis cuestiones y aportando
documentacin.
A Jos Angel y Sergio, por colaborar en uno de los prototipos del DAC, y por picarme con el
tema.
A Diego Galn Fernndez, cofundador del MMDL all por el ao 1991.
A Rosa Hinojosa por alimentarnos y mantenernos mientras adecentbamos el local.
A Fede (fede@teclix.fie.us.es) por ensearnos los secretos de la fabricacin de circuitos impresos
por fotografa y por aguantar nuestras idas y venidas del laboratorio.
Y a mi familia, por soportar estoicamente los ruidos que produca el equipo de msica mientras
se probaban los prototipos a altas horas de la madrugada.
Y a todos los dems que saben que deberan estar nombrados en esta pgina (lo siento, creo que
no me he acordado de todos...).
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.4
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
3.- El altavoz interno. Reproduccin de msica digital usando la
modulacin PWM.
Lo siguiente es un extracto de un artculo que escribi el autor durante la investigacin sobre la
posibilidad de usar el altavoz interno del PC para reproducir seales analgicas. Los mtodos descritos
en este artculo se han usado en las libreras del reproductor MOD para implementar la reproduccin de
4 canales usando tambin este dispositivo.
Un conversor D/A consta esencialmente de tres bloques funcionales: el primero recoge los datos
digitales que vienen del bus de datos del ordenador desde la memoria y los almacena. El segundo bloque
consta de una serie de interruptores digitales y resistencias conectadas segn un determinado tipo de red
en la cual, cuando el bit correspondiente est a 1 se conecta una determinada resistencia al circuito y
cuando est a 0 se conecta otra distinta. Esto provoca que circule por la red una intensidad de valor:
ref
Donde I es un valor de intensidad fijado por el hardware y n es el nmero de bits que se utiliza
en la conversin.
El tercer bloque convierte esta corriente en un valor de tensin proporcional a la intensidad
obtenida y que es la salida final del conversor. Esta tensin puede posteriormente ser amplificada en un
equipo convencional de audio.
Cada dato digital pasa por estos tres bloques para finalmente convertirse en un nivel de tensin
que se mantendr mientras dure el dato en la memoria del conversor.
Por tanto, la simulacin de este proceso implica necesariamente encontrar algn mtodo para que
el altavoz interno del PC sea capaz de darnos cualquier tensin de salida comprendida entre 0 y 5 voltios
y no simplemente estos dos valores extremos.
Para empezar, consideremos qu factores son realmente los que determinan el volumen de sonido
que se escucha en cada momento proveniente de un altavoz. Este es excitado por una tensin V que hace
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.5
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
que por su bobina circule una intensidad I. Estos dos valores los suministra el amplificador de potencia
y son directamente proporcionales uno respecto del otro. Para trabajar con un nico valor, y dado que son
estos dos anteriores los que determinan el volumen de sonido, consideraremos la potencia P=V*I como
factor determinante del volumen de sonido.
Una vez determinado el factor que provoca el que el altavoz d un determinado volumen se
plantea el problema de como simular este factor. Para ello veamos antes qu podemos hacer con el
altavoz interno del PC.
El altavoz interno del PC slo puede responder a dos niveles de tensin: una tensin mnima que
corresponde a una nivel lgico 0 y una tensin mxima correspondiente a un nivel lgico 1.
Estos niveles lgicos son entregados a la circuitera del altavoz por dos fuentes digitales distintas:
una de ellas es el timer del PC. Este timer tiene tres contadores, reservndose el tercero de ellos para
provocar impulsos digitales al altavoz.
La segunda fuente es un integrado que realiza varias funciones en el PC: el PPI (un 8042 en el PC AT)
que acta como interfaz programable para varios perifricos. Controla varias lneas tanto de entrada como
de salida y una de esas lneas va directamente al altavoz [ROS90].
El PPI tambin se puede programar para elegir la fuente digital que va a actuar sobre el altavoz, utilizando
otra de sus lneas.
Estas dos fuentes nos van a dar distintos resultados segn qu tipo de actuacin queramos sobre
el altavoz. Utilizando el timer, slo debemos de preocuparnos por suministrar a ste la frecuencia que
queremos or. Una vez hecho esto, el timer se encarga de hacer sonar al altavoz con un sonido de esa
frecuencia, mientras que la CPU puede dedicarse a otras tareas. Este mtodo tiene la ventaja de ser
insensible a las variaciones de velocidad de CPU que existe en cada modelo de PC. Por otra parte
utilizando el PPI tenemos completo control sobre que tipo de nivel lgico se entrega al altavoz y por
cuanto tiempo, por lo que puede servirnos para generar seales asimtricas, pero con el inconveniente de
que la CPU debe dedicarse por completo a esta tarea, incluso desactivando las interrupciones para que
el sonido sea limpio.
Independientemente de la fuente que empleemos, lo que est claro es que slo tendremos dos
tensiones disponibles en el altavoz: la correspondiente al nivel lgico 1, que son 5 voltios, y la
correspondiente al nivel lgico 0, que son 0 voltios.
La cuestin entonces es cmo generar tensiones comprendidas entre 0 y 5 V durante un cierto
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.6
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
Figura A.3.1. Simulacin de diversos valores de volumen a travs del altavoz
interno del PC
perodo de tiempo. Para conseguirlo vamos a emplear un mtodo muy parecido al que se emplea en las
fuentes conmutadas de tensin para reducir el valor de la tensin de salida.
En todo lo que sigue, los conceptos de potencia y tensin se tratarn como si fueran equivalentes
(no lo son en realidad, sino que son proporcionales).
En la mitad superior de la figura 4 podemos ver una serie de valores de tensin muestreados
muestreo
durante un tiempo T . Cada muestra mantiene estable su nivel de tensin durante todo el tiempo de
muestreo, por lo que la potencia (y por tanto el volumen escuchado) ser:
efectiva efectiva
P =V *I
efectiva
(donde V es un valor entre 0 y 5V en nuestro ejemplo)
Para conseguir esta misma cantidad de potencia en el mismo tiempo, pero con una tensin
alto
exclusivamente de 0 5V, debemos mantener 5V durante un tiempo determinado que llamaremos T ,
menor que el tiempo de muestreo, para luego conmutar bruscamente a 0V y mantener esta tensin durante
bajo
el resto del tiempo que dura la muestra (T ). As, la potencia entregada al altavoz ser:
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.7
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
efectiva alto bajo
P = 5V * T + 0V * T
alto bajo
Donde T y T no se dan como tiempos en s, sino como fracciones del tiempo de muestreo
total. De esta manera, para conseguir una tensin de 2,5V (o su nivel de potencia correspondiente) habr
que mantener 5V durante la primera mitad del tiempo de muestreo, y 0V durante la segunda mitad. En
min max
general, para mantener una tensin V cuyo valor est comprendido entre V y V durante un tiempo
muestreo alto bajo
T , los valores de T y T sern:
Para conseguir estos tiempos es recomendable utilizar el timer del PC, con el que conseguimos
que la CPU est ocupada el menor tiempo posible en la generacin del sonido. La seal resultante se
denomina seal PWM (Modulacin por Anchura de Pulso).
Como ejemplo de todo lo expuesto vamos a utilizar la versin 2.0 del Turbo Assembler de
Borland para desarrollar un programa que lea ficheros de muestras (por ejemplo, los .VOC de la Sound
Blaster) y los reproduzca por el altavoz. No hay limitacin en la longitud de los mismos.
El ejemplo asume que se est trabajando sobre un AT 286 a 16 MHz como mnimo, pero es
posible que funcione bien en mquinas ms lentas. Concretamente, se puede modificar el cdigo para que
corra en un XT (esto afectara a las rdenes SAR, SAL, PUSHA y POPA).
Para utilizarlo, teclear VOC nombre_de_fichero
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.8
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
;Fichero VOC.ASM
;Programa para leer muestras del tipo VOXKIT de tamao ilimitado
;(c) 1992 Miguel Angel Rodrguez Jdar
.286 ;usamos el juego de instrucciones del 80286
lonbloque equ 65500 ;longitud de los dos buffers
puntero struc ;Estructura para almacenar un puntero largo
offs dw ?
segm dw ?
puntero ends
;Macro para inicializar el contador 2 que maneja el altavoz. Se programa en
;modo 0 (port 43h) y se da la orden al PPI para que conmute al modo de altavoz
;controlado por timer (port 97h)
init_timer macro
mov al,10110000b
out 43h,al
in al,97
or al,3
out 97,al
endm
;Esta macro desconecta el altavoz del timer para que no suene ms.
quit_timer macro
in al,97
and al,0fch
out 97,al
endm
;Pila del programa.
pila segment stack
db 20 dup ('PILA')
pila ends
;*****************************************************************************
;* *
;* S E G M E N T O D E D A T O S *
;* *
;*****************************************************************************
datos segment
nombre db 100 dup(0)
men1 db 'ERROR!!. Necesito 130000 bytes libres de RAM para funcionar.'
db 13,10,'$'
men2 db 'Fichero no encontrado.',13,10,'$'
men3 db 'Ejecutor de mdulos VOXKIT por el altavoz interno v1.0',13,10
db '(c) 1992 Miguel Angel Rodrguez Jdar. Sevilla, 22 de Agosto de'
db '1992',13,10
db 'Teclas:1 y 2: sube/baja la frecuencia de muestreo',13,10
db 'Teclas 3 y 4: sube/baja el volumen',13,10
db 'ESC: volver al DOS',13,10,13,10,'$'
finfich db 0 ;vale 1 si se ha llegado al fin de fichero.
hayescape db 0 ;vale distinto de 0 si se puls la tecla ESC
handle dw 0 ;mantiene el valor del handle suministrado por MS-DOS.
empezado db 0 ;vale 1 si se ha empezado a reproducir sonido desde uno
;de los bufferes.
terminado db 0 ;vale 1 si se ha terminado de reproducir sonido desde uno
;de los bufferes.
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.9
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
periodo db 100 ;tiempo de muestreo. La frecuencia de muestreo es
; 1193180/periodo (Hz)
volumen db 255 ;Volumen del sonido (0-255)
muestra1 puntero <0,0> ;puntero al primer buffer
muestra2 puntero <0,0> ;puntero al segundo buffer
ant08 puntero <?,?> ;almacen temporal de la antigua int 8
ant09 puntero <?,?> ; " " " " " " 9
mact puntero <?,?> ;puntero al buffer actual
datos ends
;*****************************************************************************
;* *
;* S E G M E N T O D E C O D I G O *
;* *
;*****************************************************************************
codigo segment
assume cs:codigo,ss:pila,ds:datos,es:datos
tocavoc proc far
call pon_nombre ;obtener nombre del fichero
mov bx,300
mov ah,4ah
int 21h ;limitar la memoria asignada al programa
mov ax,datos
mov ds,ax ;direccionar el segmento de datos
mov bx,4096 ;
mov ah,48h ;
int 21h ;
jnc bien1 ;
jmp nomemo ;
bien1: mov muestra1.segm,ax ;Reservar memoria para los dos
mov muestra1.offs,0 ;buffers. Si no hay suficiente, salir
mov bx,4096 ;del programa por la etiqueta nomemo
mov ah,48h ;
int 21h ;
jnc bien2 ;
jmp nomemo ;
bien2: mov muestra2.segm,ax ;
mov muestra2.offs,0 ;
mov ax,3d00h
mov dx,offset nombre
int 21h ;abrir fichero para lectura
jnc bien3
jmp errorfich ;si no se pudo, error
bien3: mov handle,ax
mov ah,9
mov dx,offset men3
int 21h
mov ax,muestra1.segm
call carga ;cargar el primer buffer con los primeros
;64K de muestras.
mov ax,3508h ;
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.10
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
int 21h ;
mov ant08.offs,bx ;
mov ant08.segm,es ;
mov ax,3509h ;
int 21h ;
mov ant09.offs,bx ; Asignar a los vectores 8 y 9 las
mov ant09.segm,es ; nuevas rutinas de tratamiento
push ds ; almacenando antes la direccin de
mov dx,offset int08 ; las anteriores.
mov ax,seg int08 ;
mov ds,ax ;
mov ax,2508h ;
int 21h ;
mov dx,offset int09 ;
mov ax,seg int09 ;
mov ds,ax ;
mov ax,2509h ;
int 21h ;
pop ds ;
init_timer ;inicializar timer
mov al,periodo ;cargar periodo en el contador de la int 8
out 40h,al
xor al,al
out 40h,al
mov ax,muestra1.segm
mov mact.segm,ax ;hacer buffer actual = buffer_1
sti ;permitir interrupciones
bucprin: mov terminado,0 ;inicializa terminado para este buffer
noempez: cmp hayescape,0 ;Si se puls ESC...
jne cortavoc ;sal inmediatamente del bucle de ejecucin
cmp empezado,0 ;mientras no empieze a leer muestras
je noempez ;sigue esperando
mov al,finfich
inc finfich
or al,al ;si se alcanzo fin de fichero
jnz sigue ;no cargues ms de disco
mov ax,mact.segm ;
cmp ax,muestra1.segm ;
je carga_2 ;Carga el siguiente bloque en el buffer
push ax ;que NO se est utilizando ahora
call carga ;
pop ax ;
jmp sigue ;
carga_2: mov ax,muestra2.segm ;
push ax ;
call carga ;
pop ax ;
sigue: mov empezado,0 ;inicializa empezado para el prximo buffer
termino: cmp hayescape,0
jne cortavoc
cmp terminado,0 ;si no se ha terminado de ller el buffer
je termino ;sigue esperando
mov mact.segm,ax
mov mact.offs,0 ;el buffer actual es ahora aqul en el que
;se carg por ltima vez
cmp finfich,2 ;si no se ha alcanzado el fin de fichero
jne bucprin ;sigue cargando y leyendo
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.11
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
cortavoc: cli ;
quit_timer ;
xor al,al ;
out 40h,al ;
jmp $+2 ;
out 40h,al ;
push ds ;
lds dx,dword ptr ant08 ;Reponer los vectores de interrupcin antiguos
mov ax,2508h ;
int 21h ;
pop ds ;
push ds ;
lds dx,dword ptr ant09 ;
mov ax,2509h ;
int 21h ;
pop ds ;
sti ;
mov bx,handle
mov ah,3eh ;cerrar fichero
int 21h
mov ax,muestra1.segm
mov es,ax
mov ah,49h
int 21h ;liberar la memoria de los buffers
mov ax,muestra2.segm
mov es,ax
mov ah,49h
int 21h
call ponreloj ;actualizar reloj del sistema
;(que se qued parado).
fintoca: mov ax,4c00h
int 21h ;salida al DOS
nomemo: mov dx,offset men1 ;salida al DOS con mensaje de no hay
mov ah,9 ;memoria
int 21h
jmp fintoca
errorfich: mov dx,offset men2 ;salida al DOS con mensaje de fichero
mov ah,9 ;no encontrado
int 21h
jmp fintoca
tocavoc endp
;Este procedimiento copia el primer argumento de la lnea de rdenes
;en la variable "nombre"
pon_nombre proc
cld
push es
mov ax,datos
mov es,ax
mov di,offset nombre
mov si,128 ;offset de los parmetros en el PSP
mov cl,[si] ;carga longitud de los parmetros
or cl,cl ;si no se teclearon parmetros, salir
jz nonombre
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.12
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
dec cl
xor ch,ch
inc si
inc si
rep movsb ;copia nombre de fichero en la variable 'nombre'
nonombre: pop es
ret
pon_nombre endp
;Este procedimeinto carga 65500 bytes del fichero empezando en
;la posicin AX:0
carga proc
mov finfich,0
push ds
push ax
push ax
mov bx,handle
pop ds
pop es
mov si,0
mov word ptr [si],0
mov di,2
mov cx,lonbloque/2
rep movsw
mov dx,0
mov cx,lonbloque
mov ah,3fh
int 21h
pop ds
cmp ax,lonbloque
je fincarga
mov finfich,1
fincarga: ret
carga endp
;Nueva interrupcin del teclado
int09 proc
cli
push ax
push ds
mov ax,datos
mov ds,ax
in al,60h
push ax
and al,7fh
cmp al,1 ;si se puls ESC...
jne fintecla
pop ax
mov hayescape,1
jmp finint09
fintecla: pop ax
cmp al,2 ;si se puls "1"
jne noes1
mov al,periodo
cmp al,20
je finint09
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.13
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
dec al ;decrementa el periodo (aumenta la
;frecuencia de muestreo) y crgala en el
;contador 0 del timer.
mov periodo,al
out 40h,al
xor al,al
out 40h,al
jmp finint09
noes1: cmp al,3
jne noes2
mov al,periodo
cmp al,255
je finint09
inc al ;si se puls "2" incrementa el perodo.
mov periodo,al
out 40h,al
xor al,al
out 40h,al
noes2: cmp al,4 ;"3" y "4" hacen las mismas operaciones
;con la variable volumen
jne noes3
mov al,volumen
cmp al,255
je finint09
inc volumen
jmp finint09
noes3: cmp al,5
jne finint09
mov al,volumen
or al,al
jz finint09
dec volumen
finint09: mov al,20h ;mandar un EOI al 8259-A
out 20h,al
pop ds
pop ax
sti
iret
int09 endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.14
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
;Esta es la interrupcin 8. Se llama 1193180/periodo veces por segundo. Cada
;vez que se ejecuta lee una muestra del buffer actual y la manda por el altavoz
;interno utilizando el mtodo expuesto. Para conseguir los tiempos
;Talto y Tbajo se programa el contador 2 (port 42h) en modo 0. Este modo hace
;que cuando se le cargue un valor (entre 0 y periodo), ponga su salida a 0
;durante ese valor, para luego ponerla a 1 el resto del tiempo hasta que se
;le vuelva a cargar otro valor. El contador 2 se conecta al altavoz mediante
;la macro "init_timer".
int08 proc
cli
pusha
push ds
push es
mov ax,datos
mov ds,ax
mov ax,mact.segm
mov es,ax
mov si,mact.offs
or si,si
jnz noes0
mov empezado,1
noes0: cmp si,lonbloque
jne noesult
mov terminado,1
noesult: mov al,es:[si] ;cargamos una nueva muestra en al
inc mact.offs
mul volumen
xor dx,dx
mov bx,128
div bx ;ax=muestra*volumen/128
cmp ax,255 ;si ax>255...
jbe ponper
mov al,255 ;entonces ax=255
ponper: mul periodo
sar ax,8 ;al (Talto) =muestra*periodo/256
out 42h,al
xor al,al
out 42h,al ;carga Talto en el contador 2
mov al,20h ;mandar EOI
out 20h,al
pop es
pop ds
popa
sti
iret
int08 endp
MULTIMEDIA en PC. Emulacin del hardware de audio del Commodore Amiga. Digitalizador y reproductor estreo de sonido digitalizado. Pag. A.15
Miguel Angel Rodrguez Jdar. Departamento de lgebra y computacin. Facultad de Informtica y Estadstica. Sevilla, 1995
;Este procedimiento toma la hora real del reloj CMOS y la coloca en el reloj de la BIOS.
;Esto se hace para poner de nuevo en hora el reloj del sistema que se par mientras se
;ejecutaba el programa.
ponreloj proc
mov ah,2
int 1ah
mov al,ch ;Convertir horas
call convt
mov ch,al
mov al,cl ;Convertir minutos
call convt
mov cl,al
mov al,dh ;Convertir segundos
call convt
mov dh,al
xor dl,dl
mov ah,2dh
int 21h
ret
ponreloj endp
convt proc
push cx
mov ah,al
and al,0fh ;al <-- unidades
and ah,0f0h ;ah <-- decenas
mov cl,4
shr ah,cl
aad
pop cx
ret
convt endp
codigo ends
end tocavoc

También podría gustarte