format MS COFF

include "snd.inc"
include "proc32.inc"

section '.text' align 16 code readable executable

public _test_wav@4

; convert WAVEHEADER into PCM_x_xx_xx constant

align 4
proc _test_wav@4 stdcall, hdr:dword

           mov eax, [hdr]
           cmp dword [eax], 0x46464952
           jne .fail

           cmp dword [eax+8], 0x45564157
           jne .fail

           cmp word [eax+20], 1
           jne .fail

           mov ecx, dword [eax+24]
           mov edx, 22050
           cmp ecx, edx
           ja .high
           je .l_22

           cmp ecx, 8000
           je .l_8

           cmp ecx, 11025
           je .l_11

           cmp ecx, 12000
           je .l_12

           cmp ecx, 16000
           je .l_16
.fail:
           xor eax, eax
           ret
.high:
           cmp ecx, 24000
           je .LN56
           cmp ecx, 32000
           je .LN65
           cmp ecx, 44100
           je .LN74
           cmp ecx, 48000
           jne .fail

           movzx ecx, word [eax+22]
           dec ecx
           je .LN79
           dec ecx
           jne .LN74

           mov edx, 19
           jmp .done
.LN79:
           mov edx, 20
           jmp .done
.LN74:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN70
           dec ecx
           jne .LN65

           mov edx, 21
           jmp .done
.LN70:
           mov edx, 22
           jmp .done
.LN65:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN61
           dec ecx
           jne .LN56

           mov edx, 23
           jmp .done
.LN61:
           mov edx, 24
           jmp .done
.LN56:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN52
           dec ecx
           je .LN50
.l_22:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN43
           dec ecx
           je .LN41
.l_16:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN34
           dec ecx
           je .LN32
.l_12:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN25
           dec ecx
           je .LN23
.l_11:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN16
           dec ecx
           je .LN14
.l_8:
           movzx ecx, word [eax+22]
           dec ecx
           je .LN7
           dec ecx
           jne .fail

           mov edx, 35
           jmp .done
.LN7:
           mov edx, 36
           jmp .done
.LN14:
           mov edx, 33
           jmp .done
.LN16:
           mov edx, 34
           jmp .done
.LN23:
           mov edx, 31
           jmp .done
.LN25:
           mov edx, 32
           jmp .done
.LN32:
           mov edx, 29
           jmp .done
.LN34:
           mov edx, 30
           jmp .done
.LN41:
           mov edx, 27
           jmp .done
.LN43:
           mov edx, 28
           jmp .done
.LN50:
           mov edx, 25
           jmp .done
.LN52:
           mov edx, 26
.done:
           xor ecx, ecx
           cmp word [eax+34], 16
           setne cl
           dec ecx
           and ecx, -18
           add ecx, edx
           mov eax, ecx
           ret
endp
