Vous êtes sur la page 1sur 16

LENGUAJE ENSAMBLADOR 80386

PRCTICA 4

PRCTICA 4
GENERACIN DE SONIDOS DE DIFERENTES FRECUENCIAS

1.

INTRODUCCIN
Esta prctica est centrada a los sonidos que se pueden emitir en una computadora a
travs de un programa en LENGUAJE ENSAMBLADOR. Todos los sonidos que se
emiten, se pueden variar mediante la frecuencia, la cual est dada en veces por segundo.

2.

OBJETIVOS
2.1

El alumno aprender a usar los puertos de salida para emitir sonidos y ruidos por el
altavoz.

2.2

Aprender a variar la frecuencia de duracin de cualquier meloda.

2.3

Aprender a usar rutinas para producir tonos y efectos raros.

DESARROLLO

3.1

Capturar el siguiente mdulo y guardarlo en SONIDO.ASM.

%TITLE

"RUTINAS PARA PRODUCIR TONOS"

IDEAL
DOSSEG
MODEL
DATASEG
ContReloj
ContA
ContD
Entera
Notas

DW
DW
DW
DW
DW
DW
DW
DW
DW
DW

small

?,?
1000
1000
2000
4186
4435
4699
4978
5274
5588

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;Para nota
;Para silencio
;Nota entera
;C
;D
;E
;F
4-1

LENGUAJE ENSAMBLADOR 80386

DW
DW
DW
DW
DW
DW

PRCTICA 4

5920
6272
6645
7040
7459
790

;G
;A
;B

CODESEG
PUBLIC
Toca
CALCULA CONSTANTE PAR FIJAR FRECUENCIA

;Frec
;
;Entrada:
;Salida:
;Registros:

CX =frecuencia en Hertz
CX = Cociente a enviar al puerto 42H
CX

PROC

Frec
push
push
mov
mov
div
mov
pop
pop

ENDP

dx
ax
dx,12h
ax,34deh
cx
cx,ax
ax
dx

;Salva registros
;Parte superior del numerador
;Parte inferior del numerador
;Divide entre frecuencia
;El cociente es la salida
;Repone registros

Frec

Salvamos registros, hacemos la divisin con el registro CX. El resultado est en el registro
AX, lo movemos al registro CX, ya que el registro CX tendr la frecuencia usada.

3.2

Capturar el mdulo siguiente y salvarlo en SONIDO.ASM


FIJA LA FRECUENCIA EN LA BOCINA f = F/n. F = 1.193,182 Hz

;PoneTono
;
;Entrada:
;Salida:
;Registros:

CX = constante para el temporizador


Registros de 8253 quedan con la constante
Ninguno

PROC

PoneTono
push

ax
;Carga perodo en el timer

mov
out
mov

al,cl
42h,al
al,ch

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;Byte bajo, primero


;Enva al 8254
;Byte alto, despus
4-2

LENGUAJE ENSAMBLADOR 80386

out
pop

ENDP

42h,al
ax

PRCTICA 4

;Repone registro

PoneTono

El registro CX contiene la frecuencia. Movemos la parte baja del registro CX al registro AL


para mandar el contenido de AL a la puerta de salida 42h.
La parte alta del registro CX la mandamos al registro AL y lo ponemos en la puerta de
salida 42h.

3.3

Capturar el mdulo siguiente y salvarlo en SONIDO.ASM


ARRANCA (INICIA) EL TONO EN EL ALTAVOZ

;ATono
;
;Entrada:
;Salida:
;Registros:

Ninguna
Tono audible
Ninguno

PROC

ATono
push
in
or
out
pop

ENDP

ax
al,61h
al,03
61h,al
ax

;Salva registro
;Trae contenido de puerto B
;Enciende bocina y timer
;Saca nuevo valor de puerto B
;Repone registro

ATono

Traemos byte al puerto de entrada, posteriormente encendemos el altavoz y sacamos el


nuevo valor del registro AL por el puerto de salida 61h.

3.4

Salvar el mdulo siguiente en SONIDO.ASM


TARDA UN NMERO DADO DE MILISEGUNDOS

;Lapso
;
;Entrada:
;Salida:
;Registros:

CX = milisegundos
Ninguna
CX

PROC

Lapso
push
mov
mov
mov
div
mov

ax dx cx bx
dx,0
ax,cx
bx,55
bx
bx,ax

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;Salva registros

;18.2 tics/seg
;BX = nmero de tics
4-3

LENGUAJE ENSAMBLADOR 80386

mov
int
mov
mov

PRCTICA 4

ah,00
1ah
[word ContReloj],cx
[word ContReloj + 2],dx

;Trae tics del da con BIOS

ah,0
1ah
dx,bx
cx,0
cx,[word ContReloj]
@@10
@@20
dx,[word ContReloj+2]
@@10

;Lee con BIOS los tics

bx cx dx ax

;recobra registros

;Salva parte alta


;Salva parte baja

@@10:
mov
int
sub
sbb
cmp
jb
ja
cmp
jb

;Les resta tics del lapso


;Compara parte alta
;Si es menor vuelve a leer
;Si mayor, ya termino
;Iguales, compara parte inferior

@@20:
pop
ret

ENDP

Lapso

Salvamos registros. Cargamos registro DX con cero, registro AX con el tiempo del registro
CX y el registro BX con 55. Dividimos el registro BX, el resultado se encuentra en AX, lo
colocamos en el registro BX (nmero de tics).
Usamos el servicio 0 de la interrupcin 1Ah para obtener los tics del reloj y salvarlos en la
variable:
ContReloj

dw

?,? (CX,DX)

Volvemos a usar la interrupcin 1Ah para obtener los nuevos tics del reloj.
Restamos el registro DX con el nmero de tics (BX). El resultado es almacenado en DX.
Hacemos una resta con prstamo del registro CX con cero.
Comparamos la parte alta de la variable ContReloj con el registro CX; si es menor salta a
@@10 para volver a usar la interrupcin 1Ah; si es mayor termina y recupera registros; si
no suceden ambos casos comparamos la parte inferior de la variable ContReloj con el
registro DX; si es menor salta a @@10 para usar la interrupcin 1Ah; si no termina con la
subrutina y recupera registros.

3.5

Salvar el mdulo siguiente en SONIDO.ASM


;QTono
;
;Entrada:
;Salida:
;Registros:

QUITA (APAGA) EL TONO


Ninguna
Ninguna (Tono deja de orse)
Ninguno

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

4-4

LENGUAJE ENSAMBLADOR 80386

PROC

PRCTICA 4

QTono
push
in
and
out
pop

ENDP

ax
al,61h
al,0fch
61h,al
ax

;Salva registro AX
;Trae valor de puerto B
;Apaga altavoz y timer
;Recupera registro AX

QTono

Traemos valor a puerta de entrada, apagamos el altavoz y sacamos el valor del registro AL
por la puerta de salida 61h.

3.6

Capturar los mdulos siguientes en SONIDO.ASM


CONVIERTE EL VALOR DE NOTA (0 A 95) A FRECUENCIA

;Nota
;
;Entrada:
;Salida:
;Registros:

AL = nmero de escala cromtica extendida


DX = valor adecuado para PoneTono
Ninguno

PROC

Nota
push
push
push
mov
mov
div
mov
mov
cbw
shl
mov
mov
call
xchg
neg
add
sal
pop
pop
pop

ENDP

cx
bx
ax
ah,0
cl,12
cl
dl,al
al,ah
ax,1
bx,ax
cx,[notas + bx]
Frec
cx,dx
cl
cl,8
dx,cl
ax
bx
cx

;Salva registros que


;usa
;Extiende nmero de nota
;Divide entre 12
;Has la divisin
;El cociente da la octava
;El residuo es el ndice
;Bsqueda requiere 16 bits
;Dos bytes por nota
;Usa direccionamiento base
;Trae de la tabla
;Convierte la frecuencia
;Octava en CL, periodo en DX
;Contador de corrimiento
;= 8 - octava
;Recupera registros

Nota

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

4-5

LENGUAJE ENSAMBLADOR 80386

PRCTICA 4

RUTINA QUE TOCA MSICA A PARTIR DE DATOS BINARIOS


;Toca
;
DS: SI apunta a lista de datos binarios, formada por 4 comandos:
;Entrada:
T, N, D y X, que forman la tonada, donde:
;
;
;
Comando Tiempo:
;
1er. Byte = ASCII T
;
2do. Byte = tiempo en notas enteras por minuto
;
;
Comando Nota:
;
; 1er. Byte = ASCII N
;
2do. Byte = nmero de nota (0 a 95)
;
3er. Byte = largo (binario de punto fijo 8 bits, escala 1)
;
4to. Byte = estilo (binario de punto fijo 8 bits, escala 0)
;
;
Comando Descanso:
;
1er. Byte = ASCII D
;
2do. Byte = largo (binario de punto fijo 8 bits, escala 1)
;
;
Comando de Terminacin:
;
1er. Byte = ASCII X
;
;Salida:
A bocina y temporizador solamente
;Registros:
Ninguno

PROC

Toca
push
push
push
push
push

si
dx
cx
bx
ax

;Salva registros usados

pone tempo por omisin..

mov
cld

[Entera],2000

;2,000 ms para una nota entera


;Incrementando

@@10:
lodsb
;

checa si llega comando de terminacin..

cmp
jne
jmp
;

;Trae byte de la lista

al,'X'
@@20
@@99

;Final ?

comando tempo.

@@20:
cmp
jne

al,'T'
@@30

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;Comando tiempo?
;No, brinca
4-6

LENGUAJE ENSAMBLADOR 80386

lodsb
mov
mov
mov
mov
div
mov
jmp
;

cl,al
ch,0
ax,60000
dx,0
cx
[Entera],ax
@@10

PRCTICA 4

;Trae tempo
;Lo pone en CX
;Milisegundos en un minuto
;Borra parte superior
;Divide entre el tiempo
;ms por nota entera

comando nota..

@@30:
cmp
jne
lodsb
call
mov
call
call
mov
lodsb
mov
mov
sal
mul
mov
lodsb
mov
mov
mul
mov
sub
mov
mov
call
call
mov
call
jmp
;

al,'N'
@@40
Nota
cx,dx
PoneTono
Atono
cx,[Entera]
ah,al
al,0
cx,1
cx
cx,dx
ah,al
al,0
cx
[ContA],dx
cx,dx
[ContD],cx
cx,[ContA]
Lapso
QTono
cx,[contD]
Lapso
@@10

;Comando nota ?
;No, brinca
;Trae nmero de nota
;Convierte
;Resultado en CX
;Pone la frecuencia
;Prende el altavoz
;Trae ms por nota entera
;Trae duracin
;Prepara multiplicador
;de duracin
;Factor de escala 1
;Multiplica
;Contador total para la nota
;Trae estilo
;Prepara multiplicador
;de estilo
;Multiplica
;Salva contador para nota
;Contador para descanso
;Lo salva
;Parte audible de la nota
;Retardo
;Apaga altavoz
;Parte inaudible de la nota

Comando de descanso..

@@40:
cmp
jne
mov
lodsb
mov
mov
sal
mul
mov

al,'D'
@@99
cx,[Entera]
ah,al
al,0
cx,1
cx
cx,dx

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;Comando de silencio ?
;No, salir
;Trae ms por nota entera
;Trae duracin
;Prepara multiplicador
;de duracin
;Factor para escala 1
;Multiplica
;Contador total
4-7

LENGUAJE ENSAMBLADOR 80386

call
jmp

PRCTICA 4

Lapso
@@10

@@99:
pop
pop
pop
pop
pop
ret

ax
bx
cx
dx
si

ENDP

;Recupera

Toca

END

;Fin de mdulo SONIDO.ASM.

Salvamos registros. Colocamos 2,000 milisegundos en variable [Entera]. Traemos Byte de


la lista y lo comparamos con "X", con "T", con "N" y con "D".

3.7

Ensamblar completamente el programa SONIDO.ASM, mediante el comando:


C>tasm /zi sonido

3.8

Meter en librera el mdulo SONIDO.ASM, mediante el comando:


C>tlib rem -+sonido

3.9

Capturar el siguiente programa con el nombre de STRAUSS.ASM.

%TITLE

'EMITE POR EL ALTAVOZ UN FRAGMENTO DE CONCIERTO'

IDEAL

DOSSEG
MODEL
STACK

small
512

DATASEG
ClaveFin

DB

Himno

DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB

'T',18
'N',58,24,192
'N',62,08,192
'N',65,96,192
'N',62,24,192
'N',67,08,192
'N',65,32,192
'N',62,24,192
N',58,08,192
'N',53,32,192
'N',58,24,192

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;Corno Francs

4-8

LENGUAJE ENSAMBLADOR 80386

DB
DB
DB
DB
DB
DB
DB
DB
DB
DB

PRCTICA 4

'N',62,08,192
'N',60,32,192
'N',58,24,192
'N',53,08,192
'N',50,32,192
'N',46,24,192
'N',55,08,192
'N',53,64,192
'N',41,64,192
'X'

CODESEG
;

De

SONIDO.OBJ

EXTRN

Toca:proc

Inicia:
mov
mov
mov
mov
call
mov
mov
nt

ax,@data
ds,ax
es,ax
si,offset Himno
Toca
ah,4ch
al,[ClaveFin]
21h

END Inicia
3.10

;Inicia segmento de datos

;Apunta a tabla
;Ejecuta meloda
;Regresa a DOS

;Fin de programa STRAUSS.ASM

Ensamblar el programa anterior y hacerlo ejecutable.

C:\SEM386>tasm /zi strauss


C:\SEM386>tlink /v strauss,,,rem
3.11

Ejecutar el programa:

C:\SEM386>strauss
3.12

Capturar las siguientes rutinas y ponerlas en el mdulo SONIDO.ASM:

%TITLE

"RUTINAS PARA PRODUCIR EFECTOS ESPECIALES"

DATASEG
f1
f2

DW
DW

256
4096

;frecuencia inicial
;frecuencia final

CODESEG
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS

4-9

LENGUAJE ENSAMBLADOR 80386

PUBLIC
;Fuga
;
;Entrada:
;
;
;Salida:
;Registros:

PROC

Alerta

SONIDO QUE DESLIZA LA FRECUENCIA HACIA ARRIBA O HACIA ABAJO


BX = frecuencia inicial
CX = frecuencia final
DX = control de la razn de cambio (ms bajo rpido)
Bocina y 8254 solamente
Ninguno

Fuga
push
push
push
push
push
mov
mov
call

PRCTICA 4

si
dx
cx
bx
ax
[f1],bx
[f2],cx
Atono

;salva registro

;salva frecuencia inicial


;salva frecuencia final
;arranca el tono

fija parmetros del bucle

mov
cmp
jle
neg

si,1
bx,cx
@@10
si

;incremento del lazo


;hacia arriba?
;s, brinca
;decrementa frecuencias

cx,bx
Frec
PoneTono
cx,dx
cx,2

;trae la frecuencia
;convierte la frecuencia
;prepara el tono
;parmetro de retardo

@@10:
mov
call
call
mov
shl

@@20:
nop
nop
loop
cmp
je
add
jmp

@@20
bx,[f2]
@@30
bx,si
@@10

;checa si acabo
;resbala la frecuencia

@@30:
call
pop
pop
pop
pop

Qtono
ax
bx
cx
dx

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

;apaga la bocina
;repone todo

4-10

LENGUAJE ENSAMBLADOR 80386

pop
ret

PRCTICA 4

si

ENDP

Fuga

;Alerta
;
;Entrada:
;Salida:
;Registros:

EFECTA UNA ALERTA ROJA CON DIEZ FUGAS CRECIENTES


Ninguna
Bocina y temporizador nicamente
Ninguno

PROC

Alerta
push
push
push
mov

dx
cx
bx
cx,10

;salva todo

cx
bx,256
cx,4096
dx,2
Fuga
cx
@@10
bx
cx
dx

;salva contador
;frecuencia inicial
;frecuencia final
;control

@@10:
push
mov
mov
mov
call
pop
loop
pop
pop
pop

ENDP
3.13

;restaura contador
;repone registros

Alerta

Capturar el siguiente programa y salvarlo como ROJA.ASM:

%TITLE

EMITE POR LA BOCINA UNA ALERTA ROJA

IDEAL
DOSSEG
MODEL
STACK

small
512

DATASEG
ClaveFin

DB

CODESEG
;

De

SONIDO.OBJ

EXTRN

Alerta:proc

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

4-11

LENGUAJE ENSAMBLADOR 80386

PRCTICA 4

Inicia:
mov
mov
mov
call
mov
mov
int

ax,@data
ds,ax
es,ax
Alerta
ah,4ch
al,[ClaveFin]
21h

END Inicia
3.14

;inicia segmento de datos

;ejecuta alerta roja


;regresa a DOS

;fin de programa ROJA.ASM

Ensamblar y ligar el programa anterior mediante:

C:\SEM386>tasm /zi roja


C:\SEM386>tlink /v roja,,,rem
3.15

Ejecutar el programa de alerta roja:

C:\SEM386>roja
(Se debe escuchar como sirena)

4.

TAREAS

4.1

Hacer que la meloda STRAUSS se escuche ms rpido.

4.2

Con las siguientes notas hacer el programa FANFA, tonadilla muy usada en los hipdromos
(Himno a la victoria).
55,32,128
60,32,128
64,32,128
67,48,228
67,16,228
67,32,228
64,48,228
64,16,228
64,32,228
60,32,128
64,32,128
60,34,128
55,96,240

4.3

Calcular la frecuencia y la duracin de las notas de la meloda anterior.

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

4-12

LENGUAJE ENSAMBLADOR 80386

PRCTICA 4

4.4

Crear el programa MARTHA.ASM para tocar dicha meloda.

4.5

Crear un programa llamado EJECUTA que ejecute una meloda guardada en un archivo.
Capturar el archivo tipo ASCII cuyo listado se da con el nombre ALEGRIA.MLD que permite
ejecutar el conocido himno a la alegra. Hacer otro archivo para tocar Yesterday. El uso de
EJECUTA es:

C:\SEM386>ejecuta alegria
T,35
N,59,64,192
N,60,32,192
N,62,32,192
N,62,32,192
N,60,32,192
N,59,32,192
N,57,32,192
N,55,32,192
N,55,32,192
N,57,32,192
N,59,32,192
N,59,48,192
N,57,16,228
N,57,64,192
D,24
N,59,64,192
N,60,32,192
N,62,32,192
N,62,32,192
N,60,32,192
N,59,32,192
N,57,32,192
N,55,32,192
N,55,32,192
N,57,32,192
N,59,32,192
N,57,48,192
N,55,16,228
N,55,64,192
D,16
N,57,64,192
N,59,32,192
N,55,32,192
N,57,32,192
N,59,16,228
N,60,16,228
N,59,32,192
N,55,32,192
N,57,32,192
N,59,16,228
N,60,16,228
N,59,32,192
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES
EDICIN: PROFESOR PABLO FUENTES RAMOS

4-13

LENGUAJE ENSAMBLADOR 80386

PRCTICA 4

N,57,32,192
N,55,32,192
N,57,32,192
N,50,64,192
D,16
N,59,64,192
N,60,32,192
N,62,32,192
N,62,32,192
N,60,32,192
N,59,32,192
N,57,32,192
N,55,32,192
N,55,32,192
N,57,32,192
N,59,32,192
N,57,48,192
N,55,16,228
N,55,64,192
X

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

4-14

LENGUAJE ENSAMBLADOR 80386

PRCTICA 4

DOS OCTAVAS EN EL TECLADO DE UN PIANO CON SUS FRECUENCIAS

C 130 8

D 146 8

E 164 8

F 174 6

G 196 0

A 220.0

B 246 8

C 261.7

D 293 7

E 329 6

F 349 2

G 392 0

A 440 0

B 493.9

C 523.3

138.6 (C#, D)
155.6 (D#, E)

185.0 (F#, G)
207.7 (G#, A)
233.1 (A#, B)

277.2 (C#, D)
311.1 (D#, E)

370.0 (F#, G)
415.3 (G#, A)
466.2 (A#, B

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES


EDICIN: PROFESOR PABLO FUENTES RAMOS

4-15

Nombre de archivo: practica 4 ensamblador 80386


Directorio:
C:\Computacion V\practicas 80386
Plantilla:
C:\WINDOWS\Application
Data\Microsoft\Plantillas\Normal.dot
Ttulo:
PRCTICA 4
Asunto:
Prcticas de Laboratorio de Computacin V
Autor:
M. en C. Salvador Saucedo Flores
Palabras clave:
Comentarios:
Fecha de creacin:
08/07/02 04:59 P.M.
Cambio nmero:
18
Guardado el:
30/07/02 09:47 A.M.
Guardado por:
Pablo Fuentes Ramos
Tiempo de edicin: 517 minutos
Impreso el:
30/07/02 09:47 A.M.
ltima impresin completa
Nmero de pginas: 15
Nmero de palabras: 1,781 (aprox.)
Nmero de caracteres: 10,153 (aprox.)

Vous aimerez peut-être aussi