首页
社区
课程
招聘
汇编的蜂鸣器音乐代码
2006-6-25 00:25 9230

汇编的蜂鸣器音乐代码

2006-6-25 00:25
9230
stackear        segment stack
        db      64 dup('stack...')
top     label   word
stackear   ends

dseg     segment para    'data'

mus_time0       dw 1

mus_freq        dw 330,294,262,294,3 dup(330)
                dw 3 dup(294),330,392h,392
                dw 330,294,262,294,4 dup(330)
                dw 294,294,330,294,262
mus_time        dw 6 dup(1*6),2*6
                dw 2 dup(1*6,1*6,2*6)
                dw 12 dup(1*6),4*6
;------生日快乐MUSIC-------------
mus_freq1       dw 262,262,294,262,349,330,262,262,294,262,392,349
                dw 262,262,523,440,349,330,294,446,446,440,262,392,349
mus_time1       dw 2 dup(2*6)
                dw 3 dup(4*6),8*6,2*6,2*6
                dw 3 dup(4*6),8*6,2*6,2*6
                dw 4 dup(4*6),8*6,2*6,2*6,4*6,4*6,4*6,8*6,8*6     
;-----------------------------------------
mus_freq2       dw 330,392,330,294,330,392,330,294,330
                dw 330,392,330,294,262,294,330,392,294
                dw 262,262,220,196,196,220,262,294,330,262

mus_time2       dw 3 dup(2*6),1*6,1*6,2*6,1*6,1*6,4*6
                dw 2 dup(2*6,2*6,1*6,1*6),4*6
                dw 3 dup(2*6,1*6,1*6),4*6

table_1 dw 262     ;c
        dw 294     ;d
        dw 330     ;e
        dw 349     ;f
        dw 392     ;g
        dw 440     ;a
        dw 494     ;b
        dw 523    ;c

;****************
flag            db      00h

ratio           equ     1

blank           db 0dh,0ah,0dh,0ah,'$'
err_1           db '    The press key is no use.',0dh,0ah
                db '    Please press the ESC key to up page !',0dh,0ah,'$'
string          db '    Please press <1> or <2> key to select playing music!'
                db 0dh,0ah,0dh,0ah,'$'
string0         db '*******************************************************',0dh,0ah
                db '     If you do not want to lisen or play the music.',0dh,0ah
                db '       -> Please press ESC key to return to dos.',0dh,0ah
                db '       -> Please ENTERN key to reflash the screen.',0dh,0ah
                db '*******************************************************',0dh,0ah,'$'
string1         db '                   <1>  music_1',0dh,0ah,0dh,0ah,'$'
string2         db '                   <2>  music_2',0dh,0ah,'$'
string3         db 0dh,0ah,'                   <3>  music_3',0dh,0ah,'$'
string4         db 0dh,0ah,'------Press SPACE key to self_play with 1 to 8 key',0dh,0ah,'$'  

str_11          db '       ---music_1 is playing.',0dh,0ah,0dh,0ah,'$'
str_21          db '       ---music_2 is playing.',0dh,0ah,0dh,0ah,'$'

str_31          db '    ---music_3 is playing.',0dh,0ah,0dh,0ah,'$'
str_41          db 0dh,0ah,'     --->please press 1 to 8 key to play your music',0dh,0ah
                db '          or press ENTERN key to up page',0dh,0ah,'$'
dseg    ends
;**************************************************
cseg    segment para 'code'
        assume  cs:cseg,ss:stackear,ds:dseg
start:   ;L proc far
        mov     ax,dseg
        mov     ds,ax
        mov     ax,stackear
        mov     ss,ax
        mov     sp,offset top
kk:
        mov     ah,0
        mov     al,3
        int     10h

        call    clr_screen

        lea     dx,blank
        mov     ah,9
        int     21h

        lea     dx,string
        mov     ah,09h
        int     21h
        lea     dx,string1
        mov     ah,09h
        int     21h
        lea     dx,string2
        mov     ah,09h
        int     21h

        lea     dx,string3
        int     21h
        lea     dx,string4
        int     21h
        lea     dx,blank
        int     21h
        lea     dx,string0
        mov     ah,09h
        int     21h

re_read:

        mov     ah,1
        int     16h
        jnz     re_read

        mov     ah,0
        int     16h
        cmp     ah,02h  
        jz     key_1
        cmp     ah,03h   
        jz      key_2
       cmp     ah,04      
        jz      key_3
        cmp     ah,01h     
        jz      key_esck
        cmp     ah,39h
        jz      key_space  
        cmp     ah,1ch
        jz      key_ent   

        mov     ah,0      
        mov     al,3
        int     10h

        call    clr_screen

        mov     ah,0      
        mov     al,3
        int     10h
        
        or      flag,00000001b
        lea     dx,blank
        mov     ah,09
        int     21h
        lea     dx,err_1   
        mov     ah,09h
        int     21h

        lea     si,mus_time2
        mov     bx,0350h
        call    sound_play
        jmp     re_read
key_esck:
        jmp     key_esc

key_1:
        or      flag,00000010b
        lea     dx,str_11
        mov     ah,9
        int     21h
        call    play_1
        and     flag,11111101b
        jmp     re_read
key_2:
        or      flag,00000100b
        lea     dx,str_21
        mov     ah,9
        int     21h
        call    play_2
        and     flag,11111011b
        jmp     re_read
key_3:
        or      flag,00001000b
        lea     dx,str_31
        mov     ah,9
        int     21h
        call    play_3
        and     flag,11110111b
        jmp     re_read
key_space:
        lea     dx,str_41
        mov     ah,09h
        int     21h
        call    self_play   
        ret

key_ent:
        jmp     kk
key_esc:
        test    flag,01h     
        jz      esc_0

        mov     ah,0        
        mov     al,3
        int     10h

        call    clr_screen

        mov     ah,0         
        mov     al,3
        int     10h

        lea     dx,blank
        mov     ah,09
        int     21h

        lea     dx,string   
        mov     ah,09h
        int     21h
        lea     dx,string1
        mov     ah,09h
        int     21h
        lea     dx,string2   
        mov     ah,09h
        int     21h
        lea     dx,blank
        int     21h
        lea     dx,string0
        mov     ah,09h
        int     21h

        and    flag,11111110b
        jmp    re_read
esc_0:
        call    clr_screen
        jmp     retdos
        
play_1:
        call    music
        and     flag,11111101b
        ret
play_2:
        call    music
        and     flag,11111011b
        ret
play_3:
        call    music
        and     flag,11110111b
        ret
;/////////////////////////////////
music:
        test    flag,00000010b
        jnz      mus_1
        mov     cx,28
        lea     si,mus_time2      
        lea     bp,ds:mus_freq2
        jmp     musl
mus_1:
        test    flag,00000100b
        jnz     mus_2
        mov     cx,26
        lea     si,mus_time
        lea     bp,ds:mus_freq
        jmp     musl
mus_2:
        mov     cx,25
        lea     si,mus_time1
        lea     bp,ds:mus_freq1
musl:
        push    cx
        mov     bx,ds:[bp]
;        add     bx,0fffh   

        call    sound_play   
        add     si,2
        add     bp,2
        pop     cx
        loop    musl    ;oo
        ret
;////////////////////////////////////
re_readk:
        jmp     kk
;////////////////////////////////////
self_play:
        mov     ah,0
        int     16h
        cmp     al,0dh
        je      re_readk
        mov     bx,offset table_1
        cmp     al,'1'
        jb      self_play
        cmp     al,'8'
        ja      self_play      
        and     ax,0fh
        shl     ax,1         
        sub     ax,2
        mov     si,ax
        mov     di,[bx][si]   
      
        mov     bx,[si]      
        lea     si,mus_time0
        call    sound_play
        jmp    self_play
        ret     
;/////////////////////////////////////////////
clr_screen:   
        push    ax
        push    bx
        push    cx
        push    dx

        mov     ah,6
        mov     ah,0
        mov     bh,7
        mov     ch,0
        mov     cl,0
        mov     dh,24
        mov     dl,79
        int     10h

        mov     dx,0
        mov     ah,2
        int     10h

        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
retdos:
        mov     ah,0
        mov     al,3
        int     10h
               
        mov     ax,4c00h
        int     21h

;       ***********************************
;       *     声音播放                    *
;       ***********************************
sound_play proc
        assume  cs:cseg
        ; need set BX (Used for Frequency)
        ;         
        push    es
        push    ax
        push    cx

        in      al,61h
        or      al,03h
        and     al,0ffh
        out     61h,al
        mov     al,0b6h
        out     43h,al
        mov     al,bl
        out     42h,al
        mov     al,bh
        out     42h,al

        mov     cx,0040h
        mov     es,cx
        mov     cx,es:[006ch]

        push    ax
        mov     ax,[si]

        push    bx
        mov     bl,ratio
        mul     bl
        pop     bx

        add     ax,cx
        mov     cx,ax
        pop     ax
s_wait:
        cmp     cx,es:[006ch]
        jnb     s_wait

        in      al,62h
        and     al,0fch
        out     61h,al
        
        pop     cx
        pop     ax
        pop     es
        ret
sound_play endp

soundf  proc far
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
        mov     al,0b6h
        out     43h,al
        mov     dx,12h
        mov     ax,348ch
        div     di
        out     42h,al
        mov     al,ah
        out     42h,al
        in      al,61h
        mov     ah,al
        or      al,3
        out     61,al
wait1:  mov     cx,2800
delay:  loop    delay
        dec     bx
        jnz     wait1
        mov     al,ah
        out     61h,al
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
soundf  endp

cseg    ends
        end     start

稍微注释了下!

str_11          db '       ---music_1 is playing.',0dh,0ah,0dh,0ah,'$'
str_21          db '       ---music_2 is playing.',0dh,0ah,0dh,0ah,'$'

str_31          db '    ---music_3 is playing.',0dh,0ah,0dh,0ah,'$'
str_41          db 0dh,0ah,'     --->please press 1 to 8 key to play

此3条代码是 分别代表3种不同的音月   

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
完美 1 2006-6-25 00:26
2
0
编的时候记住要换行
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
excuseser 2006-6-26 09:25
3
0
祝你生日快乐……多好的曲子,过去学four-f的驱动第一个例子的时候,写过的,自己扒谱,又次证明自己白痴。
.386
.model flat, stdcall
option casemap:none

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                  I N C L U D E   F I L E S                                       
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
include                \masm32\include\w2k\ntstatus.inc
include                \masm32\include\w2k\ntddk.inc
include                \masm32\include\w2k\hal.inc
includelib                \masm32\lib\w2k\hal.lib

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                           U S E R   D E F I N E D   E Q U A T E S                                 
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

delayR_FREQUENCY        equ 1193167                        ; 1,193,167 Hz
OCTAVE                        equ 2

PITCH_C                        equ 523                                ;  523,25 Hz
PITCH_D                        equ 587                                ;  587,33 Hz
PITCH_E                        equ 659                                ;  659,25 Hz
PITCH_F                        equ 698                                ;  698,46 Hz
PITCH_G                        equ 784                                ;  783,99 Hz
PITCH_A                        equ 880                                ;  880,00 Hz
PITCH_H                        equ 1047                                ; 1046,50 Hz
PITCH_HC                equ 1174               
PITCH_HD                equ 1318
PITCH_HE                equ 1396                               
PITCH_HF                equ 1480       
PITCH_HG                equ 1662                               
               

; We are going to play c-major chord
m1                        equ delayR_FREQUENCY/(PITCH_C*OCTAVE)
m2                        equ delayR_FREQUENCY/(PITCH_D*OCTAVE)
m3                        equ delayR_FREQUENCY/(PITCH_E*OCTAVE)
m4                        equ delayR_FREQUENCY/(PITCH_F*OCTAVE)
m5                        equ delayR_FREQUENCY/(PITCH_G*OCTAVE)
m6                        equ delayR_FREQUENCY/(PITCH_A*OCTAVE)
m7                        equ delayR_FREQUENCY/(PITCH_H*OCTAVE)
h1                        equ delayR_FREQUENCY/(PITCH_HC*OCTAVE)
h2                        equ delayR_FREQUENCY/(PITCH_HD*OCTAVE)
h3                        equ delayR_FREQUENCY/(PITCH_HE*OCTAVE)
h4                        equ delayR_FREQUENCY/(PITCH_HF*OCTAVE)
h5                        equ delayR_FREQUENCY/(PITCH_HG*OCTAVE)

m3q                        equ (PITCH_G*OCTAVE); for HalMakeBeep

delay                equ 10000000h                ; for my ~800mHz machine

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                           U S E R   D E F I N E D   M A C R O S                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DO_DELAY MACRO delays
        ; Silly method, but it works ;-)
        mov eax, delays
        .while eax
                dec eax
        .endw
ENDM

.code

MakeBeep proc dwPitch:DWORD ,dwdelay:DWORD

        ; Direct hardware access
        cli

        mov al, 10110110y
        out 43h, al         ; delayr 8253-5 (AT: 8254.2).

        mov eax, dwPitch
        out 42h, al

        mov al, ah
        out 42h, al

        ; speaker ON
        in al, 61h
        or  al, 11y
        out 61h, al

        sti

        DO_DELAY        dwdelay

        cli

        ; speaker OFF
        in al, 61h
        and al, 11111100y
        out 61h, al

        sti
        ;invoke Sleep, 10
        ret

MakeBeep endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       DriverEntry                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
tab:
  dd m5,delay
  dd m5,delay
  dd m6,delay*2
  dd m5,delay*2

  dd h1,delay*2
  dd m7,delay*4

  dd m5,delay
  dd m5,delay
  dd m6,delay*2
  dd m5,delay*2

  dd h2,delay*2
  dd h1,delay*4

  dd m5,delay
  dd m5,delay
  dd h5,delay*2
  dd h3,delay*2

  dd h1,delay*2
  dd m7,delay*2
  dd m6,delay*4

  dd h4,delay
  dd h4,delay
  dd h3,delay*2
  dd h1,delay*2

  dd h2,delay*2
  dd h1,delay*4
  
  dd 0
  dd 0       

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

        pushad
        mov ebx ,offset tab       
        .while byte ptr [ebx] != 0
        invoke        MakeBeep, [ebx],[ebx+4]
        add        ebx ,8
        .endw       
        popad
        mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
        ret

DriverEntry endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                                                                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

end DriverEntry
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
excuseser 2006-6-26 09:43
4
0
如果用midiOutShortMsg简单多,下面的例子只是让大家猜测一下是什么歌?
.data
time equ 250
m1 equ 683c90h
m2 equ 683e90h
m3 equ 684090h
m4 equ 684190h
m5 equ 684390h
m6 equ 684590h
m7 equ 684790h
l5 equ 683790h
.code
tab:
  dd m1,time*2
  dd m2,time*2
  dd m3,time*2
  dd m1,time*2
  dd m1,time*2
  dd m2,time*2
  dd m3,time*2
  dd m1,time*2

  dd m3,time*2
  dd m4,time*2
  dd m5,time*4
  dd m3,time*2
  dd m4,time*2
  dd m5,time*4

  dd m5,time
  dd m6,time
  dd m5,time
  dd m4,time
  dd m3,time*2
  dd m1,time*2
  dd m5,time
  dd m6,time
  dd m5,time
  dd m4,time
  dd m3,time*2
  dd m1,time*2

  dd m2,time*2
  dd l5,time*2
  dd m1,time*4
  dd m2,time*2
  dd l5,time*2
  dd m1,time*4
  dd 0
         
_Midi                proc
  local @hdc:HDC
  pushad
  invoke        midiOutOpen,ADDR @hdc,-1,NULL,NULL,NULL
  lea                ebx,tab
  .while dword ptr [ebx]!=0
   invoke        midiOutShortMsg,@hdc,[ebx]
   invoke        Sleep,[ebx+4]
   add                ebx,8   
  .endw
  invoke        midiOutClose,@hdc          ;be carefull that we ExitThread
  popad
  ret

_Midi         endp
雪    币: 248
活跃值: (1031)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sixL 2006-6-26 20:45
5
0
“如果用midiOutShortMsg简单多。”
可惜不是蜂鸣器。
游客
登录 | 注册 方可回帖
返回