Está en la página 1de 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.

3 DESARROLLO

3.1 Capturar el siguiente mdulo y guardarlo en SONIDO.ASM.

%TITLE "RUTINAS PARA PRODUCIR TONOS"

IDEAL
DOSSEG
MODEL small
DATASEG

ContReloj DW ?,?
ContA DW 1000 ;Para nota
ContD DW 1000 ;Para silencio
Entera DW 2000 ;Nota entera
Notas DW 4186 ;C
DW 4435
DW 4699 ;D
DW 4978
DW 5274 ;E
DW 5588 ;F
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-1
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

DW 5920
DW 6272 ;G
DW 6645
DW 7040 ;A
DW 7459
DW 790 ;B

CODESEG
PUBLIC Toca

;Frec CALCULA CONSTANTE PAR FIJAR FRECUENCIA


;
;Entrada: CX =frecuencia en Hertz
;Salida: CX = Cociente a enviar al puerto 42H
;Registros: CX

PROC Frec

push dx ;Salva registros


push ax
mov dx,12h ;Parte superior del numerador
mov ax,34deh ;Parte inferior del numerador
div cx ;Divide entre frecuencia
mov cx,ax ;El cociente es la salida
pop ax ;Repone registros
pop dx

ENDP 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

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


;
;Entrada: CX = constante para el temporizador
;Salida: Registros de 8253 quedan con la constante
;Registros: Ninguno

PROC PoneTono

push ax

;Carga perodo en el timer

mov al,cl ;Byte bajo, primero


out 42h,al ;Enva al 8254
mov al,ch ;Byte alto, despus

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-2


EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

out 42h,al
pop ax ;Repone registro

ENDP 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

;ATono ARRANCA (INICIA) EL TONO EN EL ALTAVOZ


;
;Entrada: Ninguna
;Salida: Tono audible
;Registros: Ninguno

PROC ATono

push ax ;Salva registro


in al,61h ;Trae contenido de puerto B
or al,03 ;Enciende bocina y timer
out 61h,al ;Saca nuevo valor de puerto B
pop ax ;Repone registro

ENDP 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

;Lapso TARDA UN NMERO DADO DE MILISEGUNDOS


;
;Entrada: CX = milisegundos
;Salida: Ninguna
;Registros: CX

PROC Lapso

push ax dx cx bx ;Salva registros


mov dx,0
mov ax,cx
mov bx,55 ;18.2 tics/seg
div bx
mov bx,ax ;BX = nmero de tics
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-3
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

mov ah,00 ;Trae tics del da con BIOS


int 1ah
mov [word ContReloj],cx ;Salva parte alta
mov [word ContReloj + 2],dx ;Salva parte baja

@@10:

mov ah,0 ;Lee con BIOS los tics


int 1ah
sub dx,bx ;Les resta tics del lapso
sbb cx,0
cmp cx,[word ContReloj] ;Compara parte alta
jb @@10 ;Si es menor vuelve a leer
ja @@20 ;Si mayor, ya termino
cmp dx,[word ContReloj+2] ;Iguales, compara parte inferior
jb @@10

@@20:

pop bx cx dx ax ;recobra registros


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 QUITA (APAGA) EL TONO


;
;Entrada: Ninguna
;Salida: Ninguna (Tono deja de orse)
;Registros: Ninguno

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-4


EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

PROC QTono

push ax ;Salva registro AX


in al,61h ;Trae valor de puerto B
and al,0fch ;Apaga altavoz y timer
out 61h,al
pop ax ;Recupera registro AX

ENDP 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

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


;
;Entrada: AL = nmero de escala cromtica extendida
;Salida: DX = valor adecuado para PoneTono
;Registros: Ninguno

PROC Nota

push cx ;Salva registros que


push bx ;usa
push ax
mov ah,0 ;Extiende nmero de nota
mov cl,12 ;Divide entre 12
div cl ;Has la divisin
mov dl,al ;El cociente da la octava
mov al,ah ;El residuo es el ndice
cbw ;Bsqueda requiere 16 bits
shl ax,1 ;Dos bytes por nota
mov bx,ax ;Usa direccionamiento base
mov cx,[notas + bx] ;Trae de la tabla
call Frec ;Convierte la frecuencia
xchg cx,dx ;Octava en CL, periodo en DX
neg cl ;Contador de corrimiento
add cl,8 ;= 8 - octava
sal dx,cl
pop ax ;Recupera registros
pop bx
pop cx

ENDP Nota

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-5


EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

;Toca RUTINA QUE TOCA MSICA A PARTIR DE DATOS BINARIOS


;
;Entrada: DS: SI apunta a lista de datos binarios, formada por 4 comandos:
; 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 si ;Salva registros usados


push dx
push cx
push bx
push ax

; pone tempo por omisin..

mov [Entera],2000 ;2,000 ms para una nota entera


cld ;Incrementando

@@10:

lodsb ;Trae byte de la lista

; checa si llega comando de terminacin..

cmp al,'X' ;Final ?


jne @@20
jmp @@99

; comando tempo.

@@20:

cmp al,'T' ;Comando tiempo?


jne @@30 ;No, brinca
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-6
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

lodsb ;Trae tempo


mov cl,al ;Lo pone en CX
mov ch,0
mov ax,60000 ;Milisegundos en un minuto
mov dx,0 ;Borra parte superior
div cx ;Divide entre el tiempo
mov [Entera],ax ;ms por nota entera
jmp @@10

; comando nota..

@@30:

cmp al,'N' ;Comando nota ?


jne @@40 ;No, brinca
lodsb ;Trae nmero de nota
call Nota ;Convierte
mov cx,dx ;Resultado en CX
call PoneTono ;Pone la frecuencia
call Atono ;Prende el altavoz
mov cx,[Entera] ;Trae ms por nota entera
lodsb ;Trae duracin
mov ah,al ;Prepara multiplicador
mov al,0 ;de duracin
sal cx,1 ;Factor de escala 1
mul cx ;Multiplica
mov cx,dx ;Contador total para la nota
lodsb ;Trae estilo
mov ah,al ;Prepara multiplicador
mov al,0 ;de estilo
mul cx ;Multiplica
mov [ContA],dx ;Salva contador para nota
sub cx,dx ;Contador para descanso
mov [ContD],cx ;Lo salva
mov cx,[ContA] ;Parte audible de la nota
call Lapso ;Retardo
call QTono ;Apaga altavoz
mov cx,[contD] ;Parte inaudible de la nota
call Lapso
jmp @@10

; Comando de descanso..

@@40:

cmp al,'D' ;Comando de silencio ?


jne @@99 ;No, salir
mov cx,[Entera] ;Trae ms por nota entera
lodsb ;Trae duracin
mov ah,al ;Prepara multiplicador
mov al,0 ;de duracin
sal cx,1 ;Factor para escala 1
mul cx ;Multiplica
mov cx,dx ;Contador total
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-7
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

call Lapso
jmp @@10

@@99:

pop ax ;Recupera
pop bx
pop cx
pop dx
pop si
ret

ENDP 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 small
STACK 512

DATASEG

ClaveFin DB 0

Himno DB 'T',18 ;Corno Francs


DB 'N',58,24,192
DB 'N',62,08,192
DB 'N',65,96,192
DB 'N',62,24,192
DB 'N',67,08,192
DB 'N',65,32,192
DB 'N',62,24,192
DB N',58,08,192
DB 'N',53,32,192
DB 'N',58,24,192
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-8
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

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

CODESEG

; De SONIDO.OBJ

EXTRN Toca:proc

Inicia:

mov ax,@data ;Inicia segmento de datos


mov ds,ax
mov es,ax
mov si,offset Himno ;Apunta a tabla
call Toca ;Ejecuta meloda
mov ah,4ch ;Regresa a DOS
mov al,[ClaveFin]
nt 21h

END Inicia ;Fin de programa STRAUSS.ASM

3.10 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 DW 256 ;frecuencia inicial


f2 DW 4096 ;frecuencia final

CODESEG

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-9


EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

PUBLIC Alerta

;Fuga SONIDO QUE DESLIZA LA FRECUENCIA HACIA ARRIBA O HACIA ABAJO


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

PROC Fuga

push si ;salva registro


push dx
push cx
push bx
push ax
mov [f1],bx ;salva frecuencia inicial
mov [f2],cx ;salva frecuencia final
call Atono ;arranca el tono

; fija parmetros del bucle

mov si,1 ;incremento del lazo


cmp bx,cx ;hacia arriba?
jle @@10 ;s, brinca
neg si ;decrementa frecuencias

@@10:

mov cx,bx ;trae la frecuencia


call Frec ;convierte la frecuencia
call PoneTono ;prepara el tono
mov cx,dx ;parmetro de retardo
shl cx,2

@@20:

nop
nop
loop @@20
cmp bx,[f2] ;checa si acabo
je @@30
add bx,si ;resbala la frecuencia
jmp @@10

@@30:

call Qtono ;apaga la bocina


pop ax ;repone todo
pop bx
pop cx
pop dx
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-10
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

pop si
ret

ENDP Fuga

;Alerta EFECTA UNA ALERTA ROJA CON DIEZ FUGAS CRECIENTES


;
;Entrada: Ninguna
;Salida: Bocina y temporizador nicamente
;Registros: Ninguno

PROC Alerta

push dx ;salva todo


push cx
push bx
mov cx,10

@@10:

push cx ;salva contador


mov bx,256 ;frecuencia inicial
mov cx,4096 ;frecuencia final
mov dx,2 ;control
call Fuga
pop cx ;restaura contador
loop @@10
pop bx ;repone registros
pop cx
pop dx

ENDP Alerta

3.13 Capturar el siguiente programa y salvarlo como ROJA.ASM:

%TITLE EMITE POR LA BOCINA UNA ALERTA ROJA

IDEAL
DOSSEG
MODEL small
STACK 512

DATASEG

ClaveFin DB 0

CODESEG

; De SONIDO.OBJ

EXTRN Alerta:proc
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-11
EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

Inicia:

mov ax,@data ;inicia segmento de datos


mov ds,ax
mov es,ax
call Alerta ;ejecuta alerta roja
mov ah,4ch ;regresa a DOS
mov al,[ClaveFin]
int 21h

END Inicia ;fin de programa ROJA.ASM

3.14 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 4-12


EDICIN: PROFESOR PABLO FUENTES RAMOS
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 4-13
EDICIN: PROFESOR PABLO FUENTES RAMOS
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 4-14


EDICIN: PROFESOR PABLO FUENTES RAMOS
LENGUAJE ENSAMBLADOR 80386 PRCTICA 4

DOS OCTAVAS EN EL TECLADO DE UN PIANO CON SUS FRECUENCIAS


C 130 8
138.6 (C#, D)
D 146 8
155.6 (D#, E)
E 164 8

F 174 6
185.0 (F#, G)
G 196 0
207.7 (G#, A)
A 220.0
233.1 (A#, B)
B 246 8

C 261.7
277.2 (C#, D)
D 293 7
311.1 (D#, E)
E 329 6

F 349 2
370.0 (F#, G)
G 392 0
415.3 (G#, A)
A 440 0
466.2 (A#, B
B 493.9

C 523.3

AUTOR: PROFESOR SALVADOR SAUCEDO FLORES 4-15


EDICIN: PROFESOR PABLO FUENTES RAMOS
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.)

También podría gustarte