User Tools

Site Tools


sound_20and_20envelope_20in_20assembler

This is an old revision of the document!


SOUND and ENVELOPE in assembler

by Richard Russell, March 2010

BBC BASIC for Windows provides no direct means for an assembly language program to access the SOUND or ENVELOPE statements. It can be achieved using the technique described in Calling BASIC from assembler code but an alternative approach is to use the code listed below. This makes available three subroutines: Sound, Envelope and Qstatus, the last of which allows you to discover the amount of space available in a sound queue (similar to what can be achieved using ADVAL).

The parameters and returned values are documented within the code:

      DEF PROCassemble
      LOCAL L%, P%, code%, pass%
      DIM code% 200, L% -1
      FOR pass% = 8 TO 10 STEP 2
        P% = code%
        [OPT pass%
        ; SOUND
        ;   Inputs; eax = &HSFC
        ;           ebx = amplitude/envelope
        ;           ecx = pitch
        ;           edx = duration
        ; Destroys; eax, ebx, ecx, edx, esi, edi, flags
        ;
        .Sound
        cmp dword,[^@hwo%],0
        jnz snd0
        pushad
        push 0
        push 0
        push &405
        push @hwnd%
        call "SendMessage"
        popad
        .snd0
        mov  esi,eax
        and  esi,3
        imul edi,esi,20
        add  edi,@vdu%+112
        test al,&F0
        jz   snd1
        .snd5
        mov  al,[esi+@vdu%+80]
        mov  [esi+@vdu%+76],al
        cmp  al,[esi+@vdu%+80]
        jnz  snd5
        .snd1
        mov  bh,ah
        movzx eax,byte [esi+@vdu%+76]
        mov  [edi+eax+0],dl
        mov  [edi+eax+1],cl
        mov  [edi+eax+2],bl
        mov  [edi+eax+3],bh
        add  al,4
        cmp  al,20
        jc   snd2
        xor  al,al
        .snd2
        cmp  al,[esi+@vdu%+80]
        jnz  snd3
        push 1
        call "Sleep"
        test byte [^@flags%+3],&80
        jz   snd2
        ret
        ;
        .snd3
        mov  [esi+@vdu%+76],al
        ret
        ;
        ; Sound queue status
        ;   Inputs; eax = channel number
        ;  Outputs; eax = no. of bytes free
        ; Destroys; eax, ebx, flags
        ;
        .Qstatus
        and  eax,3
        mov  ebx,eax
        mov  al,[ebx+@vdu%+80]
        sub  al,[ebx+@vdu%+76]
        jz   qstat0
        jnc  qstat1
        .qstat0
        add  al,20
        .qstat1
        sub  al,4
        ret
        ;
        ; ENVELOPE
        ;   Inputs; eax = envelope number
        ;           ebx = address of 13 byte parameter block
        ; Destroys; eax, ecx, esi, edi, flags
        ;
        .Envelope
        and  eax,15
        shl  eax,4
        mov  edi,[@vdu%-28]
        add  edi,eax
        mov  esi,ebx
        mov  ecx,13
        rep  movsb
        ret
        ]
      NEXT pass%
      ENDPROC
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
sound_20and_20envelope_20in_20assembler.1522502383.txt.gz · Last modified: 2024/01/05 00:16 (external edit)