;CON EMU 8086
;NOMBRE:JOE MENDOZA ANGELES 20070100I
;si quieren que suene mejor cambien las notas
; para que suene se ejecuta
;1.Emulate (NO hagas RUN)
;2.Menu:external
;3.hacer en la pestana que dice run external y le dan en SI
stack segment
db 64 dup ('xxxxxx')
stack ends
datos segment
titulo db ,' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',10,13
db ,' ³ ³',10,13
db ,' ³ NOCHE DE PAZ CON EL ALTAVOZ ³',10,13
db ,' ³ ³',10,13
db ,' ³ ³',10,13
db ,' ³ BY: MENDOZA ANGELES JOE ³',10,13
db ,' ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ$',10,13
joe db 3fh,4fh,4fh,40h,3fh,4fh,3dh,4dh,43h,43h,3fh,4fh,4fh,40h,3fh,4fh,3dh,4dh,43h,43h,3ch,4ch,4ch,4ch,3ch,4ch,41h,51h,51h,51h,41h,51h,3bh,4bh,4bh,4bh,3bh,4bh,3fh,4fh,4fh,4fh,43h,43h,40h,50h,50h,40h,40h,50h,3bh,4bh,4bh,3bh,3bh,4bh,3fh,4fh,4fh,40h,3fh,4fh,3dh,4dh,43h,43h,40h,50h,50h,40h,40h,50h,3bh,4bh,4bh,3bh,3bh,4bh,3fh,4fh,4fh,40h,3fh,4fh,3dh,4dh,43h,43h,3ch,4ch,4ch,3ch,3ch,4ch,3eh,4eh,3ch,4ch,41h,51h,3bh,4bh,4bh,4bh,3dh,4dh,4dh,43h,3fh,4fh,4fh,3dh,3bh,4bh,3eh,4eh,3ch,4ch,41h,51h,3bh,4bh,4bh,4bh,3bh,4bh,4bh,43h,42H
conta dw 00
elegirnota MACRO
mov si,conta
mov ah,joe[si]
inc si
mov conta,si
endm
retardomacro MACRO
push cx
mov cx,0fffh
n1:mov bx,0ffffh
n2:dec bx
jnz n2
loop n1
mov cx,0fffh
n3:mov bx,0ffffh
n4:dec bx
jnz n4
loop n3
pop cx
endm
codigo segment
assume cs:codigo,ds:datos,ss:stack
principal proc far
push ds
sub ax,ax
push ax
mov ax,datos
mov ds,ax
lea dx,titulo
mov ah,09
int 21h ; imprime el mensaje inicial
denuevo: call ingresa1
retardomacro ; retardar entre nota y nota
cmp ah,42h
je dos
cmp ah,43h
je etret ;si es non se saltea todo
call frecuencia ; frecuencia de timer 8253/4
;call inicializa ; inicializa 8253/4
call cargar ; llevar cuenta al 8253/4
call sonido ; activa timer
etret: call retardo ; retarda dando mas volumen
call retardo ; retarda dando mas volumen
cmp ah,43h
je continuo ;si deseamos continuidad
cmp ah,4bh
je continuo ;si deseamos continuidad
cmp ah,4ch
je continuo ;si deseamos continuidad
cmp ah,4dh
je continuo ;si deseamos continuidad
cmp ah,4eh
je continuo ;si deseamos continuidad
cmp ah,4fh
je continuo ;si deseamos continuidad
cmp ah,50h
je continuo ;si deseamos continuidad
cmp ah,51h
je continuo ;si deseamos continuidad
call desactivar ; desactivar el parlante
continuo:
jmp denuevo
dos: ret
principal endp
ingresa1 proc near
elegirnota
call ingresa2
ret
endp
ingresa2 proc near
ingr:
cmp ah,42h; compara si es doss para salir del dos
je fin
cmp ah,3bh
je f1 ; compara si es DO
cmp ah,3ch
je f2 ; compara si es RE
cmp ah,3dh
je f3 ; compara si es MI
cmp ah,3eh
je f4 ; compara si es FA
cmp ah,3fh
je f5 ; compara si es SOL
cmp ah,40h
je f6 ; compara si es LA
cmp ah,41h
je f7 ; compara si es SI
sostenidos:
cmp ah,4bh
je f1 ; compara si es DO
cmp ah,4ch
je f2 ; compara si es RE
cmp ah,4dh
je f3 ; compara si es MI
cmp ah,4eh
je f4 ; compara si es FA
cmp ah,4fh
je f5 ; compara si es SOL
cmp ah,50h
je f6 ; compara si es LA
cmp ah,51h
je f7 ; compara si es SI
cmp ah,43h
je fnon ; no hace nada
cmp ah,44h
je fnon ;continuo
jmp ingr ;retorna al inicio del bucle
f1: mov cx,2093 ; frecuencia do
jmp fin
f2: mov cx,2349 ; frecuencia re
jmp fin
f3: mov cx,2637 ; frecuencia mi
jmp fin
f4: mov cx,2794 ; frecuencia fa
jmp fin
f5: mov cx,3136 ; frecuencia sol
jmp fin
f6: mov cx,3520 ; frecuencia la
jmp fin
f7: mov cx,3951 ; frecuencia si
jmp fin
fnon:
jmp fin ; no hace nada
fin: ret
retardo proc near
push cx
mov cx,20h
; mov cx,0020h
v1:mov bx,0ffffh
v5:dec bx
jnz v5
loop v1
pop cx
ret
retardo endp
frecuencia proc near
push ax
push dx
mov dx,12h ; frecuencia de clk 8253
mov ax,34dch ; frecuencia 34dch=13532dec
div cx ; div ax/cx(dx:ax/cx; ax<-cocien;dx<-resto) (cx depende de la nota leida Do Re)
mov cx,ax ; cx(soloimportaelcociente) cuenta de timer
pop dx
pop ax
ret
frecuencia endp
inicializa proc near
push ax
mov al,182 ; palabra de control
out 67,al ; programar 8253
pop ax
ret
inicializa endp
cargar proc near
push ax
mov al,cl ; enviar cuenta 8253
out 66,al ;
mov al,ch ;
out 66,al ;
pop ax
ret
cargar endp
sonido proc near
push ax
in al,97 ; leer pto 97 del 8255
or al,03h ;
out 97,al ; activar
pop ax ;
ret
sonido endp
desactivar proc near ;Apagara el parlante
push ax ;para que el sonido no sea
in al,97 ;continuo
and al,0fch ; bit 0 y bit 8255 = 0
out 97,al ; parlante apagado
pop ax
ret
desactivar endp
codigo ends
end principal
;PARA NOTA:PARA ESCUCHAR EN EL MENU EXTERNAL (RUN EXTERNAL) QUE APARECE CUANDO CORRES EL PROGRAMA