code_seg        segment
        assume cs:code_seg
        org     100h
        jmp     start
;-------------------------------------------
;B/C Software                        ;Author
;520 North Stateline Rd
;Sharon, Pa 16146
;----------------------------------
message1 db     'press Esc to Quit',0dh,0ah,'$'     ;Esc to end whooper
message2 db     'press any other key to play$'      ;or to go again
;----------------------------------
start   proc    near
        mov     ah,9                 ;DOS function number to print string
        mov     dx,offset message1   ;the message
        int     21h                  ;DOS interrupt
        mov     ah,9                 ;DOS function number to print string
        mov     dx,offset message2   ;the message
        int     21h                  ;DOS interrupt
begin:  mov     ah,0                 ;BIOS function wait for key press
        int     16h                  ;BIOS interrupt
        cmp     ah,1                 ;Esc scan code 
        jz      done                 ;do we stop ?
        call    whooper              ;no call whooping sound
        jmp     begin                ;go see if we do it again
done:   mov     ax,4c00h             ;no exit back to DOS
        int     21h                  ;DOS interrupt
start   endp
;-------------------------------------------
whooper proc    near
        cli                          ;no interrupts
backery:mov     bx,5000              ;start frequency low
        mov     al,10110110xb        ;channel 2
        out     43h,al               ;send it
backerx:mov     ax,bx                ;place frequency in (ax)
        out     42h,al               ;send LSB first
        mov     al,ah                ;place MSB in al
        out     42h,al               ;send it next
        in      al,61h               ;lets turn the speaker on
        or      al,00000011xb        ;this number will do it
        out     61h,al               ;send it 
        mov     cx,50                ;50 is best for (8mhz clock)
looperx:loop    looperx              ;delay so we can hear sound
        dec     bx                   ;decremnent repeat count
        jnz     backerx              ;if not = 0 go do again
        in      al,61h               ;if were done - turn speaker off
        and     al,11111100xb        ;this number will do it
        out     61h,al               ;send it
        sti                          ;enable interrupts
        ret                          ;go see if user wants to go again
whooper endp
;----------------------------------
code_seg        segment
