LENGUAJE ENSAMBLADOR 80386 ENSAMBLADOR 80386
PRÁCTICA 4
PRÁCTICA 4 DE SONIDOS DE DIFERENTES FRECUENCIAS GENERACIÓN DE GENERACIÓN SONIDOS DE 1.
INTRODUCCIÓN Esta práctica está centrada a los sonidos que se pueden emitir en una computadora a través 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 p or segundo.
2.
OBJETIVOS 2.1
El alumno aprenderá a usar los puertos de salida para emitir sonidos y ruidos ruidos por el altavoz.
2.2
Apren Ap ren der á a variar la frecuencia de duración de cualquier melodía.
2.3
Apren Ap ren der á a usar rutinas para producir tonos y efectos raros.
3
DESARROLLO
3.1
Capturar el SONIDO. ASM .ASM. el siguiente módulo y guardarlo en SONIDO
%TITLE
" RUTINAS PARA PRODUCIR TONOS" 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 AUTOR: PROFESOR EDICIÓN: PROFESOR EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Para nota ;Para ;Pa ra sil encio ;Nota entera ;C ;D ;E ;F 4-1
LENGUAJE ENSAMBLADOR 80386
DW DW DW DW DW DW
PRÁCTICA 4
5920 6272 6645 7040 7459 790
;G ;A ;B
CODESEG PUBLIC Toca ;Frec ; ;Entrada: ;Salida: ;Registros :
CALCULA CONSTANTE PAR FIJAR FRECUENCIA
PROC
Frec push push mov mov div mov pop pop
ENDP
CX =frecuencia en Hertz CX = Cociente a enviar al puerto 42H CX
dx ax dx,12h ax,34deh cx cx,ax ax dx
;Salva registro s ;Parte superior del numerador ;Parte inferior del num erador ;Divide entre frecuencia ;El cociente es la salida ;Repone registros
Frec
Salvamos registros, hacemos la división 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 módulo siguiente y salvarlo en SONIDO. ASM ;PoneTono ; ;Entrada: ;Salida: ;Registros :
Ninguno
PROC
PoneTono push
FIJA LA FRECUENCIA EN LA BOCINA f = F/n. F = 1.193,182 Hz CX = constante para el temporizador Registros de 8253 quedan con la constante
ax
;Carga período en el tim er mov out mov
al,cl 42h,al al,ch
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Byte bajo, primero ;Envía al 8254 ;Byte alto, después 4-2
LENGUAJE ENSAMBLADOR 80386
out pop
ENDP
42h,al ax
PRÁCTICA 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 módulo siguiente y salvarlo en SONIDO. ASM ;ATono
ARRA NCA (INICIA) EL TONO EN EL AL TAVOZ
; ;Entrada: ;Salida: ;Registros :
PROC
Ninguna Tono audible Ninguno
ATono push in or out pop
ENDP
ax al,61h al,03 61h,al ax
;Salva regist ro ;Trae contenido de puerto B ;Enciende bocina y timer ;Saca nuevo valor d e 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 módulo siguiente en SONIDO. ASM ;Lapso ; ;Entrada: ;Salida: ;Registros :
PROC
TARDA UN NÚMERO DADO DE MILISEGUNDOS CX = milisegundos Ninguna
CX
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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Salva registro s ;18.2 ti cs/seg ;BX = número de tics 4-3
LENGUAJE ENSAMBLADOR 80386
mov int mov mov
PRÁCTICA 4
ah,00 1ah [word ContReloj],cx [word ContReloj + 2],dx
;Trae tics del d ía con B IOS
ah,0 1ah dx,bx cx,0 cx,[word ContReloj] @@10 @@20 dx,[word ContReloj+2] @@10
;Lee con BIOS los ti cs
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 vu elve 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 (número de tics). Usamos el servicio 0 de la interrupción 1Ah para obtener los tics del reloj y salvarlos en la variable:
ContReloj dw
? ,? (CX,DX)
Volvemos a usar la interrupción 1Ah para obtener los nuevos tics del reloj. Restamos el registro DX con el número de tics (BX ). El resultado es almacenado en DX. Hacemos una resta con préstamo 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 interrupción 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 interrupción 1Ah ; si no termina con la subrutina y recupera registros.
3.5
Salvar el módulo siguiente en SONIDO. ASM ;QTono ; ;Entrada: ;Salida: ;Registros :
QUITA (APAGA) EL TONO Ninguna Ninguna (Tono deja de oírse) Ninguno
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-4
LENGUAJE ENSAMBLADOR 80386
PROC
PRÁCTICA 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 módulos siguientes en SONIDO. ASM ;Nota ; ;Entrada: ;Salida: ;Registros :
PROC
AL = número de escala cromática extendida DX = valor adecuado para PoneTono Ninguno
Nota push push push mov mov div mov mov cbw shl mov mov call xchg neg add sal pop pop pop
ENDP
CONVIERTE EL VALOR DE NOTA (0 A 95) A FRECUENCIA
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 q ue ;usa ;Extiende número de nota ;Divide entre 12 ;Has la divisi ón ;El cociente da la oct ava ;El residuo es el índice ;Búsqu eda 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 registro s
Nota
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-5
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 4
RUTINA QUE TOCA MÚSICA A PARTIR DE DATOS BINARIOS ;Toca ; ;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 = número 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 Terminación: ; 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 omisió n.. mov cld
[Entera],2000
;2,000 ms para una not a entera ;Incrementando
@@10: ;Trae byte de la lis ta
lodsb
;
checa si llega comando de terminación.. cmp jne jmp
;
al,'X' @@20 @@99
;¿Final ?
comando tempo.
@@20: cmp jne
al,'T' @@30
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: 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
PRÁCTICA 4
;Trae tempo ;Lo po ne en CX ;Milisegundos en un minuto ;Borra parte superior ;Divide entre el tiempo ;ms por n ota 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 número de not a ;Convierte ;Resultado en CX ;Pone la frecuencia ;Prende el altavoz ;Trae ms por nota entera ;Trae duración ;Prepara multipl icador ;de duración ;Factor d e escala 1 ;Multiplica ;Contador total para la nota ;Trae estilo ;Prepara multipl icador ;de estilo ;Multiplica ;Salva contador para nota ;Contador p ara descanso ;Lo salva ;Parte audible de la nota ;Retardo ;Apaga altavoz ;Parte inaudible de l a 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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;¿Comando de si lencio ? ;No, salir ;Trae ms por nota entera ;Trae duración ;Prepara multipl icador ;de duración ;Factor p ara escala 1 ;Multiplica ;Contador total 4-7
LENGUAJE ENSAMBLADOR 80386
call jmp
PRÁCTICA 4
Lapso @@10
@@99: pop pop pop pop pop ret
;Recupera
ax bx cx dx si
ENDP
Toca
END
;Fin de mód ulo 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 librería el módulo 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 AL TAVOZ UN FRAGMENTO DE CONCIERTO '
IDEAL
DOSSEG MODEL STACK
small 512
DATASEG ClaveFin
DB
0
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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;Corno Francés
4-8
LENGUAJE ENSAMBLADOR 80386
DB DB DB DB DB DB DB DB DB DB
PRÁCTICA 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:
3.10
mov mov mov mov call mov mov nt
ax,@data ds,ax es,ax si,offset Himno Toca ah,4ch al,[ClaveFin] 21h
;Inicia segmento de datos
END
Inicia
;Fin de pro grama STRAUSS.ASM
;Apunt a a tabla ;Ejecuta melodía ;Regresa a DOS
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 módulo 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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-9
LENGUAJE ENSAMBLADOR 80386
PUBLIC ;Fuga ; ;Entrada: ; ; ;Salida: ;Registros:
PROC
Al erta
SONIDO QUE DESLIZA LA FRECUENCIA HACIA ARRIBA O HACIA ABAJO BX = frecuencia inicial CX = frecuencia final DX = control de la razón de cambio (más bajo → rápido) Bocina y 8254 solamente Ninguno
Fuga push push push push push mov mov call
;
PRÁCTICA 4
si dx cx bx ax [f1],bx [f2],cx Atono
;salva registro
;salva frecuencia inicial ;salva frecuencia final ;arranca el t ono
fija parámetros del bucle mov cmp jle neg
si,1 bx,cx @@10 si
;incremento del l azo ;¿hacia arriba? ;sí, brinca ;decrementa frecuencias
cx,bx Frec PoneTono cx,dx cx,2
;trae la frecuencia ;convi erte la frecuencia ;prepara el t ono ;parámetro 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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
;apaga la bocina ;repone todo
4-10
LENGUAJE ENSAMBLADOR 80386
pop ret
PRÁCTICA 4
si
ENDP
Fuga
;Al erta
EFECTÚA UNA ALERTA ROJA CON DIEZ FUGAS CRECIENTES
; ;Entrada: ;Salida: ;Registros :
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
0
CODESEG ;
De SONIDO.OBJ
EXTRN
Al erta:proc
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-11
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 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
;inic ia segmento de datos ;ejecuta alerta roja ;regresa a DOS
;fin de prog rama 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 escuc har como sirena)
4.
TAREAS
4.1
Hacer que la melodía STRAUSS se escuche más rápido.
4.2
Con las siguientes notas hacer el programa FANFA, tonadilla muy usada en los hipódromos (Himno a la victor ia ).
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 duración de las notas de la melodía anterior.
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-12
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 4
4.4
Crear el programa MARTHA. ASM para tocar dicha melodía.
4.5
Crear un programa llamado EJECUTA que ejecute una melodía guardada en un archivo. Capturar el archivo tipo ASCII cuyo listado se da con el nombre ALEGRIA.MLD que permite ejecutar el conocido himn o a la alegría. 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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-13
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 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 EDICIÓN: PROFESOR PABLO FUENTES RAMOS
4-14
LENGUAJE ENSAMBLADOR 80386
PRÁCTICA 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 $ $ %""&&&& 155.6 $ $ %"""""( $ $ %""&&&& 185.0 $ $ %""&&&& 207.7 $ $ %""&&&& 233.1 $ $ %"""""( $ $ %""&&&& 277.2 $ $ %""&&&& 311.1 $ $ %"""""( $ $ %""&&&& 370.0 $ $ %""&&&& 415.3 $ $ %""&&&& 466.2 $ $ %"""""( $ $ *"""+++
(C#, D') (D#, E')
(F#, G') (G#, A') (A#, B')
(C#, D') (D#, E')
(F#, G') (G#, A') (A#, B)
AUTOR: PROFESOR SALVADOR SAUCEDO FLORES EDICIÓN: 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 Título: PRÁCTICA 4 Asunto: Prácticas de Laboratorio de Computación V Autor: M. en C. Salvador Saucedo Flores Palabras clave: Comentarios: Fecha de creación: 08/07/02 04:59 P.M. Cambio número: 18 Guardado el: 30/07/02 09:47 A.M. Guardado por: Pablo Fuentes Ramos Tiempo de edición: 517 minutos Impreso el: 30/07/02 09:47 A.M. Última impresión completa Número de páginas: 15 Número de palabras: 1,781 (aprox.) Número de caracteres: 10,153 (aprox.)