### Author Topic: Beep sounds  (Read 648 times)

#### felipe

• Member
• Posts: 483
• Asssssssembly language...said the snake.
##### Beep sounds
« on: July 30, 2017, 03:29:58 AM »
"A long time ago, all PC computers shared a common 8254 programable interval timer chip for the generation of primitive sounds. The Beep function was written specifically to emit a beep on that piece of hardware.

On these older systems, muting and volume controls have no effect on Beep; you would still hear the tone. To silence the tone, you used the following commands:

net stop beep

sc config beep start= disabled

Since then, sound cards have become standard equipment on almost all PC computers. As sound cards became more common, manufacturers began to remove the old timer chip from computers. The chips were also excluded from the design of server computers. The result is that Beep did not work on all computers without the chip. This was okay because most developers had moved on to calling the MessageBeep function that uses whatever is the default sound device instead of the 8254 chip.

Eventually because of the lack of hardware to communicate with, support for Beep was dropped in Windows Vista and Windows XP 64-Bit Edition.

In Windows 7, Beep was rewritten to pass the beep to the default sound device for the session. This is normally the sound card, except when run under Terminal Services, in which case the beep is rendered on the client."

This is from the microsoft site:https://msdn.microsoft.com/es-es/library/windows/desktop/ms679277(v=vs.85).aspx

So it is old, but can be used. So you can try this little game (very simple and useless probably) or watch the code.
Btw, some values (in the permitted range) will not produce audible sound (if any) and others will not produce the sound with the desired lenght (but this is not my fault)  . Come on! is just a game!  But you can comment whatever you want (as the forum permits  ). Enjoy  (or not  )

Code: [Select]
`.386.model      flat,stdcalloption      casemap:noneinclude     \masm32\include\windows.incinclude     \masm32\include\kernel32.incinclude     \masm32\include\user32.incincludelib  \masm32\lib\kernel32.libincludelib  \masm32\lib\user32.lib.data?align 4stdinput    dword   ?stdoutput   dword   ?chrswrit    dword   ?chrsread    dword   ?freq        dword   ?milisec     dword   ?erflag      dword   ?beepstate   dword   ?wasoff      dword   ?.dataalign 1mens00      byte    'Welcome',0ah,0dh            byte    '=======',0ah,0dh,0ah            byte    'With this simple program you will be able to do some sounds.',0ah,0dh            byte    'Just choose the frequency desired and then the',0ah,0dh            byte    'time lapse for the tone you have just chose.',0ah,0dh            inpbuff     byte    256 dup(' ')conname     byte    'BEEP SOUNDS',0toneprom    byte    0ah,'###############################################################',0d,0ah            byte    'Enter the tone for the sound you will create.',0ah,0dh            byte    'This tone must be a number that represents the frequency',0ah,0dh            byte    'of the tone, using hertz (hz) as the measured unit.',0ah,0dh            byte    'Allowed values are in the range of 37-32767: 'msgerror    byte    0ah,0dh,'Error, some value was not correct!',0d,0ah            byte    'Press ENTER key to continue with the program.'timeprom    byte    0ah,'###############################################################',0d,0ah            byte    'Enter the time for the sound (the lapse of the sound).',0ah,0dh            byte    'It should be a number that represents milliseconds (ms) of sound.',0ah,0dh            byte    'This will be the length of the sound:  'caption     byte    'CONFIGURATION DETECTED',0content     byte    'The beep of your computer is off. This program will not work with the beep off.',0ah,0dh            byte    'You can turn it on and later turn it off again.',0ah,0dh            byte    'Turn the beep on?',0msgcap      byte    'PROGRAM INFORMATION',0msgcont     byte    'This program can not continue.',0ah,0dh            byte    'You can try it later again.',0mboxcap     byte    'CONFIRM PLEASE',0mboxcon     byte    'Do you wish to play again?',0mbxcon      byte    'Do you wish to turn off the beep again?',0                .codealign 4start:            push    SPIF_UPDATEINIFILE            lea     eax,beepstate            push    eax            push    0            push    SPI_GETBEEP            call    SystemParametersInfo                    ; Check the beep state.            cmp     beepstate,TRUE                          ; If is the beep on the program starts.            je      consolego            push    MB_YESNO or MB_ICONINFORMATION            lea     eax,caption            push    eax            lea     eax,content            push    eax            push    NULL            call    MessageBox                              ; We ask the user if we should turn on the beep.            cmp     eax,IDYES            je      turnon            push    MB_OK or MB_ICONSTOP            lea     eax,msgcap            push    eax            lea     eax,msgcont            push    eax            push    NULL            call    MessageBox                              ; We say goodbye.            jmp     goodbyealign 4turnon:            mov     wasoff,1                                ; To know it was off at the begining.            push    SPIF_UPDATEINIFILE            push    NULL            push    TRUE            push    SPI_SETBEEP            call    SystemParametersInfo                    ; We turn on the beep and starts the program.align 4consolego:            call    AllocConsole                            ; Creates the console for the program.            lea     eax,conname            push    eax            call    SetConsoleTitle                         ; Set the title of the console window.            push    STD_INPUT_HANDLE            call    GetStdHandle                            ; Handle for the input of the console            mov     stdinput,eax            push    STD_OUTPUT_HANDLE            call    GetStdHandle                            ;    and the output.            mov     stdoutput,eax            push    NULL                                    ; Reserved by Windows.            lea     eax,chrswrit            push    eax            push    174                                     ; Number of chars to write.            lea     eax,mens00                                           push    eax            push    stdoutput            call    WriteConsole            mov     erflag,0align 4mainloop:            push    NULL                                    ; Reserved by Windows.            lea     eax,chrswrit            push    eax            push    269                                     ; Number of chars to write.            lea     eax,toneprom            push    eax            push    stdoutput            call    WriteConsole            push    NULL                                    ; Reserved by Windows.            lea     eax,chrsread            push    eax            push    256                                     ; Number of chars to read (as a maximum).            lea     eax,inpbuff            push    eax            push    stdinput            call    ReadConsole            lea     esi,inpbuff            push    esi            call    checkit                                 ; Checks the syntax (just numbers allowed).            cmp     erflag,0            jne     bye            lea     esi,inpbuff            push    esi            call    chksize                                 ; Checks the size of the number.            cmp     erflag,0            jne     bye            mov     freq,edi            push    NULL            lea     eax,chrswrit            push    eax            push    227            lea     eax,timeprom            push    eax            push    stdoutput            call    WriteConsole            push    NULL            lea     eax,chrsread            push    eax            push    256            lea     eax,inpbuff            push    eax            push    stdinput            call    ReadConsole            lea     esi,inpbuff            push    esi            call    checkit            cmp     erflag,0            jne     bye            lea     esi,inpbuff            push    esi            call    chksize            cmp     erflag,0            jne     bye            mov     milisec,edi            push    milisec            push    freq            call    Beep            push    MB_YESNO or MB_ICONQUESTION            lea     eax,mboxcap            push    eax            lea     eax,mboxcon            push    eax            push    NULL            call    MessageBox                              ; We ask the user to play again.            cmp     eax,IDYES            jne     oksobye                                 ; No, so ok bye.            call    FreeConsole            jmp     consolego                               ; Yes so we start the program again.align 4oksobye:            cmp     wasoff,0                                ; It was turned off at the begining or not?            je      sayonara                                ; No, so sayonara.                    push    MB_YESNO or MB_ICONQUESTION            lea     eax,mboxcap            push    eax            lea     eax,mbxcon            push    eax            push    NULL            call    MessageBox                              ; Yes so we ask to turn the beep off (as it was before).            cmp     eax,IDYES            jne     sayonara                                ; No, so sayonara to the user.            push    SPIF_UPDATEINIFILE            push    NULL            push    FALSE            push    SPI_SETBEEP            call    SystemParametersInfo                    ; We turn the beep off            jmp     sayonara                                ;   and then we say sayonara to the user.align 4bye:            push    NULL                                    ; Reserved by Windows.            lea     eax,chrsread            push    eax            push    1                                       ; Chars to read.            lea     eax,inpbuff            push    eax            push    stdinput            call    ReadConsole                             ; For the ENTER key after we get the error in out program (for bad entries).            call    FreeConsole            jmp     consolego                               ; Try again.            align 4sayonara:            call    FreeConsole                             ; The program finish here, so sayonara to the console window too.            align 4goodbye:            push    0                                       ; Exit code to Windows.            call    ExitProcess                                         align 4     checkit:                                                    ; We check here the syntax of the entry (just numbers allowed).            push    ebp            mov     ebp,esp            mov     ecx,chrsread            dec     ecx                                     ; Discard 0ah and 0dh.            dec     ecx            mov     esi,[ebp+8]                             ; This is the address that was stored in esi (that was pushed) I did this                                                            ;  like an  automatic thing (i haven't think yet if it is usefull).align 4justnumbers:            cmp     byte ptr[esi],30h            jb      error            cmp     byte ptr[esi],39h            ja      error            inc     esi            loop    justnumbers            mov     esp,ebp            pop     ebp            ret     4 align 4error:            push    NULL            lea     eax,chrswrit            push    eax            push    83            lea     eax,msgerror            push    eax            push    stdoutput            call    WriteConsole                            ; We write to the console the msg error.            mov     erflag,1                                ; This flag tell us if there was an error in the mainloop.            mov     esp,ebp            pop     ebp            ret     4align 4chksize:                                                    ; This procedure tell us if the number is in the correct range.            push    ebp            mov     ebp,esp            mov     esi,[ebp+8]                             ; Address of the string of numbers.            mov     ecx,chrsread            dec     ecx                                     ; Discard 0ah and 0dh.            dec     ecx            add     esi,ecx                                 ; From right to left.            dec     esi            mov     ebx,1            xor     edi,edi                                 ; Sum start in 0.align 4getbinary:            movzx   eax,byte ptr[esi]            and     eax,0000000fh                           ; Convert to unpacked bcd.            xor     edx,edx            mul     ebx            add     edi,eax                                 ; Store the binary sum.            imul    ebx,10                                  ; Increases powers of ten.            dec     esi            loop    getbinary                cmp     edi,37            jl      errsize                                 ; Out of freq. range.            cmp     edi,32767            jg      errsize                                 ; Out of freq. range.            mov     esp,ebp            pop     ebp            ret     4align 4errsize:                                                    ; We show here the error msg.            push    NULL                                    ; Reserved by Windows.            lea     eax,chrswrit            push    eax            push    83            lea     eax,msgerror            push    eax            push    stdoutput            call    WriteConsole            mov     erflag,1                                ; For use in the mainloop of the program.            mov     esp,ebp            pop     ebp            ret     4                        end     start                                   ; That's all that's all that's all folks!            `
« Last Edit: July 30, 2017, 05:44:29 AM by felipe »
Felipe.

#### felipe

• Member
• Posts: 483
• Asssssssembly language...said the snake.
##### Re: Beep sounds
« Reply #1 on: July 30, 2017, 05:20:19 AM »
I have corrected some minor problem:

I added a logical flag to see if was the beep off before the program execution. Now it will not show the message to turn the beep off (as it was) if it was on.
Felipe.

#### felipe

• Member
• Posts: 483
• Asssssssembly language...said the snake.
##### Re: Beep sounds
« Reply #2 on: July 30, 2017, 05:48:15 AM »
Another problem found, that was corrected: 174 characters are written in the first call to writeconsole (it said 176 before). So no more unwanted character "1" will appear again after pushing the yes button, to play again.
Felipe.

#### anunitu

• Member
• Posts: 969
##### Re: Beep sounds
« Reply #3 on: July 30, 2017, 06:36:35 AM »
The original use of the beep was for boot error codes.

https://www.computerhope.com/beep.htm

#### felipe

• Member
• Posts: 483
• Asssssssembly language...said the snake.
##### Re: Beep sounds
« Reply #4 on: July 30, 2017, 06:54:14 AM »
Nice page.
Felipe.