     1                                  ; ****************************************************************************
     2                                  ; wavplay2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; WAVPLAY2.PRG ! VIA VT8237 .WAV PLAYER program by Erdogan TAN
     5                                  ;
     6                                  ; 17/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 24/06/2017 ]
     9                                  ;
    10                                  ; Modified from PLAYWAV.PRG .wav player program by Erdogan Tan, 10/03/2017 
    11                                  ;
    12                                  ; Derived from source code of 'PLAYER.COM' ('PLAYER.ASM') by Erdogan Tan
    13                                  ;	      (18/02/2017) 
    14                                  ; Assembler: NASM version 2.11
    15                                  ;	     nasm wavplay.asm -l wavplay.txt -o WAVPLAY.PRG	
    16                                  ; ----------------------------------------------------------------------------
    17                                  ; Derived from '.wav file player for DOS' Jeff Leyda, Sep 02, 2002
    18                                  
    19                                  ; CODE
    20                                  
    21                                  ; 01/03/2017
    22                                  ; 16/10/2016
    23                                  ; 29/04/2016
    24                                  ; TRDOS 386 system calls (temporary list!)
    25                                  _ver 	equ 0
    26                                  _exit 	equ 1
    27                                  _fork 	equ 2
    28                                  _read 	equ 3
    29                                  _write	equ 4
    30                                  _open	equ 5
    31                                  _close 	equ 6
    32                                  _wait 	equ 7
    33                                  _creat 	equ 8
    34                                  _link 	equ 9
    35                                  _unlink	equ 10
    36                                  _exec	equ 11
    37                                  _chdir	equ 12
    38                                  _time 	equ 13
    39                                  _mkdir 	equ 14
    40                                  _chmod	equ 15
    41                                  _chown	equ 16
    42                                  _break	equ 17
    43                                  _stat	equ 18
    44                                  _seek	equ 19
    45                                  _tell 	equ 20
    46                                  _mount	equ 21
    47                                  _umount	equ 22
    48                                  _setuid	equ 23
    49                                  _getuid	equ 24
    50                                  _stime	equ 25
    51                                  _quit	equ 26	
    52                                  _intr	equ 27
    53                                  _fstat	equ 28
    54                                  _emt 	equ 29
    55                                  _mdate 	equ 30
    56                                  _video 	equ 31
    57                                  _audio	equ 32
    58                                  _timer	equ 33
    59                                  _sleep	equ 34
    60                                  _msg    equ 35
    61                                  _geterr	equ 36
    62                                  _fpsave	equ 37
    63                                  _pri	equ 38
    64                                  _rele	equ 39
    65                                  _fff	equ 40
    66                                  _fnf	equ 41
    67                                  _alloc	equ 42
    68                                  _dalloc equ 43
    69                                  _calbac equ 44
    70                                  
    71                                  %macro sys 1-4
    72                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    73                                      ; 03/09/2015	
    74                                      ; 13/04/2015
    75                                      ; Retro UNIX 386 v1 system call.	
    76                                      %if %0 >= 2   
    77                                          mov ebx, %2
    78                                          %if %0 >= 3    
    79                                              mov ecx, %3
    80                                              %if %0 = 4
    81                                                 mov edx, %4   
    82                                              %endif
    83                                          %endif
    84                                      %endif
    85                                      mov eax, %1
    86                                      ;int 30h
    87                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    88                                  %endmacro
    89                                  
    90                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    91                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    92                                  
    93                                  BUFFERSIZE      equ     32768	; audio buffer size 
    94                                  ENDOFFILE       equ     1	; flag for knowing end of file
    95                                  
    96                                  [BITS 32]
    97                                  
    98                                  [ORG 0] 
    99                                  
   100                                  _STARTUP:
   101                                  	; Prints the Credits Text.
   102                                  	sys	_msg, Credits, 255, 0Bh
   102                              <1> 
   102                              <1> 
   102                              <1> 
   102                              <1> 
   102                              <1>  %if %0 >= 2
   102 00000000 BB[4D060000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   102 00000005 B9FF000000          <1>  mov ecx, %3
   102                              <1>  %if %0 = 4
   102 0000000A BA0B000000          <1>  mov edx, %4
   102                              <1>  %endif
   102                              <1>  %endif
   102                              <1>  %endif
   102 0000000F B823000000          <1>  mov eax, %1
   102                              <1> 
   102 00000014 CD40                <1>  int 40h
   103                                  
   104                                  	; clear bss
   105 00000016 B9[BA080000]            	mov	ecx, bss_end
   106 0000001B BF[35080000]            	mov	edi, bss_start
   107 00000020 29F9                    	sub	ecx, edi
   108 00000022 D1E9                    	shr	ecx, 1
   109 00000024 31C0                    	xor	eax, eax
   110 00000026 F366AB                  	rep	stosw
   111                                  
   112                                  	; Detect (& Enable) VT8233 Audio Device
   113 00000029 E8BB010000              	call    DetectVT8233 
   114 0000002E 731B                    	jnc     short GetFileName
   115                                  
   116                                  _dev_not_ready:
   117                                  ; couldn't find the audio device!
   118                                  	sys	_msg, noDevMsg, 255, 0Fh
   118                              <1> 
   118                              <1> 
   118                              <1> 
   118                              <1> 
   118                              <1>  %if %0 >= 2
   118 00000030 BB[D6060000]        <1>  mov ebx, %2
   118                              <1>  %if %0 >= 3
   118 00000035 B9FF000000          <1>  mov ecx, %3
   118                              <1>  %if %0 = 4
   118 0000003A BA0F000000          <1>  mov edx, %4
   118                              <1>  %endif
   118                              <1>  %endif
   118                              <1>  %endif
   118 0000003F B823000000          <1>  mov eax, %1
   118                              <1> 
   118 00000044 CD40                <1>  int 40h
   119 00000046 E978010000                      jmp     Exit
   120                                  
   121                                  GetFileName:  
   122 0000004B 89E6                    	mov	esi, esp
   123 0000004D AD                      	lodsd
   124 0000004E 83F802                  	cmp	eax, 2 ; two arguments 
   125                                  	       ; (program file name & mod file name)
   126 00000051 0F827A010000            	jb	pmsg_usage ; nothing to do
   127                                  
   128 00000057 AD                      	lodsd ; program file name address 
   129 00000058 AD                      	lodsd ; mod file name address (file to be read)
   130 00000059 89C6                    	mov	esi, eax
   131 0000005B BF[5C080000]            	mov	edi, wav_file_name
   132                                  ScanName:       
   133 00000060 AC                      	lodsb
   134 00000061 84C0                    	test	al, al
   135 00000063 0F8468010000            	je	pmsg_usage
   136 00000069 3C20                    	cmp	al, 20h
   137 0000006B 74F3                    	je	short ScanName	; scan start of name.
   138 0000006D AA                      	stosb
   139 0000006E B4FF                    	mov	ah, 0FFh
   140                                  a_0:	
   141 00000070 FEC4                    	inc	ah
   142                                  a_1:
   143 00000072 AC                      	lodsb
   144 00000073 AA                      	stosb
   145 00000074 3C2E                    	cmp	al, '.'
   146 00000076 74F8                    	je	short a_0	
   147 00000078 20C0                    	and	al, al
   148 0000007A 75F6                    	jnz	short a_1
   149                                  
   150 0000007C 08E4                    	or	ah, ah		; if period NOT found,
   151 0000007E 750B                    	jnz	short _1 	; then add a .WAV extension.
   152                                  SetExt:
   153 00000080 4F                      	dec	edi
   154 00000081 C7072E574156            	mov	dword [edi], '.WAV'
   155 00000087 C6470400                	mov	byte [edi+4], 0
   156                                  _1:
   157                                  	; Allocate Audio Buffer (for user)
   158                                  	sys	_audio, 0200h, BUFFERSIZE, audio_buffer
   158                              <1> 
   158                              <1> 
   158                              <1> 
   158                              <1> 
   158                              <1>  %if %0 >= 2
   158 0000008B BB00020000          <1>  mov ebx, %2
   158                              <1>  %if %0 >= 3
   158 00000090 B900800000          <1>  mov ecx, %3
   158                              <1>  %if %0 = 4
   158 00000095 BA[00100000]        <1>  mov edx, %4
   158                              <1>  %endif
   158                              <1>  %endif
   158                              <1>  %endif
   158 0000009A B820000000          <1>  mov eax, %1
   158                              <1> 
   158 0000009F CD40                <1>  int 40h
   159 000000A1 731B                    	jnc	short _2
   160                                  error_exit:
   161                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   161                              <1> 
   161                              <1> 
   161                              <1> 
   161                              <1> 
   161                              <1>  %if %0 >= 2
   161 000000A3 BB[26070000]        <1>  mov ebx, %2
   161                              <1>  %if %0 >= 3
   161 000000A8 B9FF000000          <1>  mov ecx, %3
   161                              <1>  %if %0 = 4
   161 000000AD BA0E000000          <1>  mov edx, %4
   161                              <1>  %endif
   161                              <1>  %endif
   161                              <1>  %endif
   161 000000B2 B823000000          <1>  mov eax, %1
   161                              <1> 
   161 000000B7 CD40                <1>  int 40h
   162 000000B9 E905010000              	jmp	Exit
   163                                  _2:
   164                                  	; DIRECT CGA (TEXT MODE) MEMORY ACCESS
   165                                  	; bl = 0, bh = 4
   166                                  	; Direct access/map to CGA (Text) memory (0B8000h)
   167                                  
   168                                  	sys	_video, 0400h
   168                              <1> 
   168                              <1> 
   168                              <1> 
   168                              <1> 
   168                              <1>  %if %0 >= 2
   168 000000BE BB00040000          <1>  mov ebx, %2
   168                              <1>  %if %0 >= 3
   168                              <1>  mov ecx, %3
   168                              <1>  %if %0 = 4
   168                              <1>  mov edx, %4
   168                              <1>  %endif
   168                              <1>  %endif
   168                              <1>  %endif
   168 000000C3 B81F000000          <1>  mov eax, %1
   168                              <1> 
   168 000000C8 CD40                <1>  int 40h
   169 000000CA 3D00800B00              	cmp	eax, 0B8000h
   170 000000CF 75D2                    	jne	short error_exit
   171                                  
   172                                  	; Initialize Audio Device
   173                                  	sys	_audio, 0301h, 0, audio_int_handler 
   173                              <1> 
   173                              <1> 
   173                              <1> 
   173                              <1> 
   173                              <1>  %if %0 >= 2
   173 000000D1 BB01030000          <1>  mov ebx, %2
   173                              <1>  %if %0 >= 3
   173 000000D6 B900000000          <1>  mov ecx, %3
   173                              <1>  %if %0 = 4
   173 000000DB BA[8E020000]        <1>  mov edx, %4
   173                              <1>  %endif
   173                              <1>  %endif
   173                              <1>  %endif
   173 000000E0 B820000000          <1>  mov eax, %1
   173                              <1> 
   173 000000E5 CD40                <1>  int 40h
   174 000000E7 72BA                    	jc	short error_exit
   175                                  _3:
   176 000000E9 E8FC020000              	call	write_audio_dev_info 
   177                                  
   178                                  ; open the file
   179                                          ; open existing file
   180 000000EE E803010000                      call    openFile ; no error? ok.
   181 000000F3 731B                            jnc     short _gsr
   182                                  
   183                                  ; file not found!
   184                                  	sys	_msg, noFileErrMsg, 255, 0Fh
   184                              <1> 
   184                              <1> 
   184                              <1> 
   184                              <1> 
   184                              <1>  %if %0 >= 2
   184 000000F5 BB[0D070000]        <1>  mov ebx, %2
   184                              <1>  %if %0 >= 3
   184 000000FA B9FF000000          <1>  mov ecx, %3
   184                              <1>  %if %0 = 4
   184 000000FF BA0F000000          <1>  mov edx, %4
   184                              <1>  %endif
   184                              <1>  %endif
   184                              <1>  %endif
   184 00000104 B823000000          <1>  mov eax, %1
   184                              <1> 
   184 00000109 CD40                <1>  int 40h
   185 0000010B E9B3000000                      jmp    Exit
   186                                  
   187                                  _gsr:  
   188 00000110 E81B010000                     	call    getSampleRate	; read the sample rate
   189                                                               	; pass it onto codec.
   190 00000115 0F82A8000000            	jc	Exit
   191                                  
   192 0000011B 66A3[3A080000]          	mov	[sample_rate], ax
   193 00000121 880D[38080000]          	mov	[stmo], cl
   194 00000127 8815[39080000]          	mov	[bps], dl
   195                                  
   196                                  	; 10/06/2017
   197                                  	sys	_audio, 0E00h ; get audio controller info
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1>  %if %0 >= 2
   197 0000012D BB000E0000          <1>  mov ebx, %2
   197                              <1>  %if %0 >= 3
   197                              <1>  mov ecx, %3
   197                              <1>  %if %0 = 4
   197                              <1>  mov edx, %4
   197                              <1>  %endif
   197                              <1>  %endif
   197                              <1>  %endif
   197 00000132 B820000000          <1>  mov eax, %1
   197                              <1> 
   197 00000137 CD40                <1>  int 40h
   198 00000139 0F8264FFFFFF            	jc	error_exit
   199                                  
   200                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   201                                  	;jne	_dev_not_ready	
   202                                  
   203                                  	; EAX = IRQ Number in AL
   204                                  	;	Audio Device Number in AH 
   205                                  	; EBX = DEV/VENDOR ID
   206                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   207                                  	; ECX = BUS/DEV/FN 
   208                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   209                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   210                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   211                                  	;      (Low word, DX = NAMBAR address)
   212                                  
   213 0000013F A2[B8080000]            	mov	[ac97_int_ln_reg], al
   214 00000144 891D[AE080000]          	mov	[dev_vendor], ebx
   215 0000014A 890D[B2080000]          	mov	[bus_dev_fn], ecx
   216 00000150 668915[B6080000]        	mov	[ac97_IO_base], dx
   217                                    
   218 00000157 E870030000              	call	write_ac97_pci_dev_info
   219                                  
   220 0000015C E8A0020000              	call	write_wav_file_info
   221                                  	
   222                                  PlayNow: 
   223                                  ;
   224                                  ; position file pointer to start in actual wav data
   225                                  ; MUCH improvement should really be done here to check if sample size is
   226                                  ; supported, make sure there are 2 channels, etc.  
   227                                  ;
   228                                          ;mov     ah, 42h
   229                                          ;mov     al, 0	; from start of file
   230                                          ;mov     bx, [FileHandle]
   231                                          ;xor     cx, cx
   232                                          ;mov     dx, 44	; jump past .wav/riff header
   233                                          ;int     21h
   234                                  
   235                                  	sys	_seek, [FileHandle], 44, 0
   235                              <1> 
   235                              <1> 
   235                              <1> 
   235                              <1> 
   235                              <1>  %if %0 >= 2
   235 00000161 8B1D[49060000]      <1>  mov ebx, %2
   235                              <1>  %if %0 >= 3
   235 00000167 B92C000000          <1>  mov ecx, %3
   235                              <1>  %if %0 = 4
   235 0000016C BA00000000          <1>  mov edx, %4
   235                              <1>  %endif
   235                              <1>  %endif
   235                              <1>  %endif
   235 00000171 B813000000          <1>  mov eax, %1
   235                              <1> 
   235 00000176 CD40                <1>  int 40h
   236                                  
   237                                  	sys	_msg, nextline, 255, 07h ; 01/05/2017
   237                              <1> 
   237                              <1> 
   237                              <1> 
   237                              <1> 
   237                              <1>  %if %0 >= 2
   237 00000178 BB[92070000]        <1>  mov ebx, %2
   237                              <1>  %if %0 >= 3
   237 0000017D B9FF000000          <1>  mov ecx, %3
   237                              <1>  %if %0 = 4
   237 00000182 BA07000000          <1>  mov edx, %4
   237                              <1>  %endif
   237                              <1>  %endif
   237                              <1>  %endif
   237 00000187 B823000000          <1>  mov eax, %1
   237                              <1> 
   237 0000018C CD40                <1>  int 40h
   238                                  
   239                                  ; play the .wav file.  Most of the good stuff is in here.
   240                                  
   241 0000018E E88A010000                      call    PlayWav
   242                                  
   243                                  ; close the .wav file and exit.
   244                                  
   245                                  StopPlaying:
   246                                  	; Stop Playing
   247                                  	sys	_audio, 0700h
   247                              <1> 
   247                              <1> 
   247                              <1> 
   247                              <1> 
   247                              <1>  %if %0 >= 2
   247 00000193 BB00070000          <1>  mov ebx, %2
   247                              <1>  %if %0 >= 3
   247                              <1>  mov ecx, %3
   247                              <1>  %if %0 = 4
   247                              <1>  mov edx, %4
   247                              <1>  %endif
   247                              <1>  %endif
   247                              <1>  %endif
   247 00000198 B820000000          <1>  mov eax, %1
   247                              <1> 
   247 0000019D CD40                <1>  int 40h
   248                                  	; Cancel callback service (for user)
   249                                  	sys	_audio, 0900h
   249                              <1> 
   249                              <1> 
   249                              <1> 
   249                              <1> 
   249                              <1>  %if %0 >= 2
   249 0000019F BB00090000          <1>  mov ebx, %2
   249                              <1>  %if %0 >= 3
   249                              <1>  mov ecx, %3
   249                              <1>  %if %0 = 4
   249                              <1>  mov edx, %4
   249                              <1>  %endif
   249                              <1>  %endif
   249                              <1>  %endif
   249 000001A4 B820000000          <1>  mov eax, %1
   249                              <1> 
   249 000001A9 CD40                <1>  int 40h
   250                                  	; Deallocate Audio Buffer (for user)
   251                                  	sys	_audio, 0A00h
   251                              <1> 
   251                              <1> 
   251                              <1> 
   251                              <1> 
   251                              <1>  %if %0 >= 2
   251 000001AB BB000A0000          <1>  mov ebx, %2
   251                              <1>  %if %0 >= 3
   251                              <1>  mov ecx, %3
   251                              <1>  %if %0 = 4
   251                              <1>  mov edx, %4
   251                              <1>  %endif
   251                              <1>  %endif
   251                              <1>  %endif
   251 000001B0 B820000000          <1>  mov eax, %1
   251                              <1> 
   251 000001B5 CD40                <1>  int 40h
   252                                  	; Disable Audio Device
   253                                  	sys	_audio, 0C00h
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1>  %if %0 >= 2
   253 000001B7 BB000C0000          <1>  mov ebx, %2
   253                              <1>  %if %0 >= 3
   253                              <1>  mov ecx, %3
   253                              <1>  %if %0 = 4
   253                              <1>  mov edx, %4
   253                              <1>  %endif
   253                              <1>  %endif
   253                              <1>  %endif
   253 000001BC B820000000          <1>  mov eax, %1
   253                              <1> 
   253 000001C1 CD40                <1>  int 40h
   254                                  Exit:  
   255 000001C3 E847000000                      call    closeFile
   256                                           
   257                                  	sys	_exit	; Bye!
   257                              <1> 
   257                              <1> 
   257                              <1> 
   257                              <1> 
   257                              <1>  %if %0 >= 2
   257                              <1>  mov ebx, %2
   257                              <1>  %if %0 >= 3
   257                              <1>  mov ecx, %3
   257                              <1>  %if %0 = 4
   257                              <1>  mov edx, %4
   257                              <1>  %endif
   257                              <1>  %endif
   257                              <1>  %endif
   257 000001C8 B801000000          <1>  mov eax, %1
   257                              <1> 
   257 000001CD CD40                <1>  int 40h
   258                                  here:
   259 000001CF EBFE                    	jmp	short here
   260                                  
   261                                  pmsg_usage:
   262                                  	sys	_msg, msg_usage, 255, 0Bh
   262                              <1> 
   262                              <1> 
   262                              <1> 
   262                              <1> 
   262                              <1>  %if %0 >= 2
   262 000001D1 BB[B8060000]        <1>  mov ebx, %2
   262                              <1>  %if %0 >= 3
   262 000001D6 B9FF000000          <1>  mov ecx, %3
   262                              <1>  %if %0 = 4
   262 000001DB BA0B000000          <1>  mov edx, %4
   262                              <1>  %endif
   262                              <1>  %endif
   262                              <1>  %endif
   262 000001E0 B823000000          <1>  mov eax, %1
   262                              <1> 
   262 000001E5 CD40                <1>  int 40h
   263 000001E7 EBDA                    	jmp	short Exit
   264                                  
   265                                  DetectVT8233:
   266                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   267                                          sys	_audio, 0103h
   267                              <1> 
   267                              <1> 
   267                              <1> 
   267                              <1> 
   267                              <1>  %if %0 >= 2
   267 000001E9 BB03010000          <1>  mov ebx, %2
   267                              <1>  %if %0 >= 3
   267                              <1>  mov ecx, %3
   267                              <1>  %if %0 = 4
   267                              <1>  mov edx, %4
   267                              <1>  %endif
   267                              <1>  %endif
   267                              <1>  %endif
   267 000001EE B820000000          <1>  mov eax, %1
   267                              <1> 
   267 000001F3 CD40                <1>  int 40h
   268 000001F5 C3                      	retn
   269                                  
   270                                  ;open or create file
   271                                  ;
   272                                  ;input: ds:dx-->filename (asciiz)
   273                                  ;       al=file Mode (create or open)
   274                                  ;output: none  cs:[FileHandle] filled
   275                                  ;
   276                                  openFile:
   277                                  	;mov	ah, 3Bh	; start with a mode
   278                                  	;add	ah, al	; add in create or open mode
   279                                  	;xor	cx, cx
   280                                  	;int	21h
   281                                  	;jc	short _of1
   282                                  	;;mov	[cs:FileHandle], ax
   283                                  
   284                                  	sys	_open, wav_file_name, 0
   284                              <1> 
   284                              <1> 
   284                              <1> 
   284                              <1> 
   284                              <1>  %if %0 >= 2
   284 000001F6 BB[5C080000]        <1>  mov ebx, %2
   284                              <1>  %if %0 >= 3
   284 000001FB B900000000          <1>  mov ecx, %3
   284                              <1>  %if %0 = 4
   284                              <1>  mov edx, %4
   284                              <1>  %endif
   284                              <1>  %endif
   284                              <1>  %endif
   284 00000200 B805000000          <1>  mov eax, %1
   284                              <1> 
   284 00000205 CD40                <1>  int 40h
   285 00000207 7205                    	jc	short _of1
   286                                  
   287 00000209 A3[49060000]            	mov	[FileHandle], eax
   288                                  _of1:
   289 0000020E C3                      	retn
   290                                  
   291                                  ; close the currently open file
   292                                  ; input: none, uses cs:[FileHandle]
   293                                  closeFile:
   294 0000020F 833D[49060000]FF        	cmp	dword [FileHandle], -1
   295 00000216 7417                    	je	short _cf1
   296                                  	;mov    bx, [FileHandle]  
   297                                  	;mov    ax, 3E00h
   298                                          ;int    21h              ;close file
   299                                  
   300                                  	sys	_close, [FileHandle]
   300                              <1> 
   300                              <1> 
   300                              <1> 
   300                              <1> 
   300                              <1>  %if %0 >= 2
   300 00000218 8B1D[49060000]      <1>  mov ebx, %2
   300                              <1>  %if %0 >= 3
   300                              <1>  mov ecx, %3
   300                              <1>  %if %0 = 4
   300                              <1>  mov edx, %4
   300                              <1>  %endif
   300                              <1>  %endif
   300                              <1>  %endif
   300 0000021E B806000000          <1>  mov eax, %1
   300                              <1> 
   300 00000223 CD40                <1>  int 40h
   301 00000225 C705[49060000]FFFF-     	mov 	dword [FileHandle], -1
   301 0000022D FFFF               
   302                                  _cf1:
   303 0000022F C3                      	retn
   304                                  
   305                                  getSampleRate:
   306                                  	
   307                                  ; reads the sample rate from the .wav file.
   308                                  ; entry: none - assumes file is already open
   309                                  ; exit: ax = sample rate (11025, 22050, 44100, 48000)
   310                                  ;	cx = number of channels (mono=1, stereo=2)
   311                                  ;	dx = bits per sample (8, 16)
   312                                  
   313 00000230 53                      	push    ebx
   314                                  
   315                                          ;mov	ah, 42h
   316                                          ;mov	al, 0	; from start of file
   317                                          ;mov	bx, [FileHandle]
   318                                          ;xor	cx, cx
   319                                          ;mov	dx, 08h	; "WAVE"
   320                                          ;int	21h
   321                                  	
   322                                  	sys	_seek, [FileHandle], 8, 0
   322                              <1> 
   322                              <1> 
   322                              <1> 
   322                              <1> 
   322                              <1>  %if %0 >= 2
   322 00000231 8B1D[49060000]      <1>  mov ebx, %2
   322                              <1>  %if %0 >= 3
   322 00000237 B908000000          <1>  mov ecx, %3
   322                              <1>  %if %0 = 4
   322 0000023C BA00000000          <1>  mov edx, %4
   322                              <1>  %endif
   322                              <1>  %endif
   322                              <1>  %endif
   322 00000241 B813000000          <1>  mov eax, %1
   322                              <1> 
   322 00000246 CD40                <1>  int 40h
   323                                  
   324                                          ;mov	dx, smpRBuff
   325                                          ;mov	cx, 28	; 28 bytes
   326                                  	;mov	ah, 3fh
   327                                          ;int	21h
   328                                  
   329                                  	sys	_read, [FileHandle], smpRBuff, 28
   329                              <1> 
   329                              <1> 
   329                              <1> 
   329                              <1> 
   329                              <1>  %if %0 >= 2
   329 00000248 8B1D[49060000]      <1>  mov ebx, %2
   329                              <1>  %if %0 >= 3
   329 0000024E B9[40080000]        <1>  mov ecx, %3
   329                              <1>  %if %0 = 4
   329 00000253 BA1C000000          <1>  mov edx, %4
   329                              <1>  %endif
   329                              <1>  %endif
   329                              <1>  %endif
   329 00000258 B803000000          <1>  mov eax, %1
   329                              <1> 
   329 0000025D CD40                <1>  int 40h
   330                                  
   331 0000025F 813D[40080000]5741-     	cmp	dword [smpRBuff], 'WAVE'
   331 00000267 5645               
   332 00000269 7520                    	jne	short gsr_stc
   333                                  
   334 0000026B 66833D[4C080000]01      	cmp	word [smpRBuff+12], 1	; Offset 20, must be 1 (= PCM)
   335 00000273 7516                    	jne	short gsr_stc
   336                                  
   337 00000275 668B0D[4E080000]        	mov	cx, [smpRBuff+14]	; return num of channels in CX
   338 0000027C 66A1[50080000]                  mov     ax, [smpRBuff+16]	; return sample rate in AX
   339 00000282 668B15[5A080000]        	mov	dx, [smpRBuff+26]	; return bits per sample value in DX
   340                                  gsr_retn:
   341 00000289 5B                              pop     ebx
   342 0000028A C3                              retn
   343                                  gsr_stc:
   344 0000028B F9                      	stc
   345 0000028C EBFB                    	jmp	short gsr_retn
   346                                  
   347                                  audio_int_handler:
   348 0000028E C605[3F080000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   349                                  
   350 00000295 803D[3C080000]01        	cmp	byte [cbs_busy], 1
   351 0000029C 732A                    	jnb	short _callback_bsy_retn
   352                                  
   353 0000029E C605[3C080000]01        	mov	byte [cbs_busy], 1
   354                                  
   355 000002A5 A0[3D080000]            	mov	al, [half_buff]
   356                                  
   357 000002AA 3C01                    	cmp	al, 1
   358 000002AC 7213                    	jb	short _callback_retn
   359                                  
   360 000002AE 8035[3D080000]03        	xor	byte [half_buff], 3 ; 2->1, 1->2
   361                                  
   362 000002B5 BB00800B00              	mov	ebx, 0B8000h ; video display page address
   363 000002BA B44E                    	mov	ah, 4Eh
   364 000002BC 0430                    	add	al, '0'
   365 000002BE 668903                  	mov	[ebx], ax ; show playing buffer (1, 2)
   366                                  _callback_retn:
   367 000002C1 C605[3C080000]00        	mov	byte [cbs_busy], 0
   368                                  _callback_bsy_retn:
   369                                  	sys	_rele ; return from callback service 
   369                              <1> 
   369                              <1> 
   369                              <1> 
   369                              <1> 
   369                              <1>  %if %0 >= 2
   369                              <1>  mov ebx, %2
   369                              <1>  %if %0 >= 3
   369                              <1>  mov ecx, %3
   369                              <1>  %if %0 = 4
   369                              <1>  mov edx, %4
   369                              <1>  %endif
   369                              <1>  %endif
   369                              <1>  %endif
   369 000002C8 B827000000          <1>  mov eax, %1
   369                              <1> 
   369 000002CD CD40                <1>  int 40h
   370                                  	; we must not come here !
   371                                  	sys	_exit
   371                              <1> 
   371                              <1> 
   371                              <1> 
   371                              <1> 
   371                              <1>  %if %0 >= 2
   371                              <1>  mov ebx, %2
   371                              <1>  %if %0 >= 3
   371                              <1>  mov ecx, %3
   371                              <1>  %if %0 = 4
   371                              <1>  mov edx, %4
   371                              <1>  %endif
   371                              <1>  %endif
   371                              <1>  %endif
   371 000002CF B801000000          <1>  mov eax, %1
   371                              <1> 
   371 000002D4 CD40                <1>  int 40h
   372                                  	
   373                                  loadFromFile:
   374                                  	; 17/03/2017
   375                                  	; edi = buffer address
   376                                  	; edx = buffer size
   377                                  	; 10/03/2017
   378                                          ;push	eax
   379                                          ;push	ecx
   380                                          ;push	edx
   381                                  	;push	ebx
   382 000002D6 F605[3E080000]01                test    byte [flags], ENDOFFILE	; have we already read the
   383 000002DD F9                              stc			; last of the file?
   384 000002DE 7531                            jnz     short endLFF
   385                                  	;clc
   386                                  	; load file into memory
   387                                  	sys 	_read, [FileHandle], edi
   387                              <1> 
   387                              <1> 
   387                              <1> 
   387                              <1> 
   387                              <1>  %if %0 >= 2
   387 000002E0 8B1D[49060000]      <1>  mov ebx, %2
   387                              <1>  %if %0 >= 3
   387 000002E6 89F9                <1>  mov ecx, %3
   387                              <1>  %if %0 = 4
   387                              <1>  mov edx, %4
   387                              <1>  %endif
   387                              <1>  %endif
   387                              <1>  %endif
   387 000002E8 B803000000          <1>  mov eax, %1
   387                              <1> 
   387 000002ED CD40                <1>  int 40h
   388 000002EF 89D1                    	mov	ecx, edx
   389 000002F1 720A                    	jc	short padfill ; error !
   390 000002F3 21C0                    	and	eax, eax
   391 000002F5 7406                    	jz	short padfill
   392 000002F7 29C1                    	sub	ecx, eax
   393 000002F9 7416                    	jz	short endLFF
   394 000002FB 01C7                    	add	edi, eax  
   395                                  padfill:
   396 000002FD 803D[39080000]10        	cmp 	byte [bps], 16
   397 00000304 740C                    	je	short _5
   398                                  	; Minimum Value = 0
   399 00000306 30C0                            xor     al, al
   400 00000308 F3AA                    	rep	stosb
   401                                  _4:
   402                                          ;clc			; don't exit with CY yet.
   403 0000030A 800D[3E080000]01                or	byte [flags], ENDOFFILE	; end of file flag
   404                                  endLFF:
   405                                  	;pop	ebx
   406                                  	;pop	edx
   407                                          ;pop	ecx
   408                                          ;pop	eax
   409 00000311 C3                              retn
   410                                  _5:
   411                                  	; Minimum value = 8000h (-32768)
   412 00000312 D1E9                    	shr	ecx, 1 
   413 00000314 66B80080                	mov	ax, 8000h ; -32768
   414 00000318 F366AB                  	rep	stosw
   415 0000031B EBED                    	jmp	short _4
   416                                  
   417                                  PlayWav:
   418                                         ; load 32768 bytes into audio buffer
   419 0000031D BF[00100000]            	mov     edi, audio_buffer
   420 00000322 BA00800000              	mov	edx, BUFFERSIZE
   421 00000327 E8AAFFFFFF              	call	loadFromFile
   422 0000032C 0F8271FDFFFF            	jc	error_exit
   423 00000332 C605[3D080000]01        	mov	byte [half_buff], 1 ; Buffer 1
   424                                  
   425                                  	; Set Master Volume Level
   426                                  	sys	_audio, 0B00h, 1D1Dh
   426                              <1> 
   426                              <1> 
   426                              <1> 
   426                              <1> 
   426                              <1>  %if %0 >= 2
   426 00000339 BB000B0000          <1>  mov ebx, %2
   426                              <1>  %if %0 >= 3
   426 0000033E B91D1D0000          <1>  mov ecx, %3
   426                              <1>  %if %0 = 4
   426                              <1>  mov edx, %4
   426                              <1>  %endif
   426                              <1>  %endif
   426                              <1>  %endif
   426 00000343 B820000000          <1>  mov eax, %1
   426                              <1> 
   426 00000348 CD40                <1>  int 40h
   427                                  	; 24/06/2017
   428                                  	;mov	byte [volume_level], 1Dh
   429 0000034A 880D[B9080000]          	mov	[volume_level], cl	
   430                                  
   431                                  	; Start	to play
   432 00000350 A0[39080000]            	mov	al, [bps]
   433 00000355 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   434 00000358 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   435 0000035A 8A1D[38080000]          	mov	bl, [stmo]
   436 00000360 FECB                    	dec	bl
   437 00000362 08C3                    	or	bl, al
   438 00000364 668B0D[3A080000]        	mov	cx, [sample_rate] 
   439 0000036B B704                    	mov	bh, 4 ; start to play	
   440                                  	sys	_audio
   440                              <1> 
   440                              <1> 
   440                              <1> 
   440                              <1> 
   440                              <1>  %if %0 >= 2
   440                              <1>  mov ebx, %2
   440                              <1>  %if %0 >= 3
   440                              <1>  mov ecx, %3
   440                              <1>  %if %0 = 4
   440                              <1>  mov edx, %4
   440                              <1>  %endif
   440                              <1>  %endif
   440                              <1>  %endif
   440 0000036D B820000000          <1>  mov eax, %1
   440                              <1> 
   440 00000372 CD40                <1>  int 40h
   441                                  
   442                                  	;mov	ebx, 0B8000h ; video display page address
   443                                  	;mov	ah, 4Eh
   444                                  	;add	al, [half_buffer]
   445                                  	;mov	[ebx], ax ; show playing buffer (1, 2)
   446                                  
   447                                  	;; load 32768 bytes into audio buffer
   448                                  	;; (for the second half of DMA buffer)
   449                                  	;; 20/05/2017
   450                                  	;mov     edi, audio_buffer
   451                                  	;mov	edx, BUFFERSIZE
   452                                  	;call	loadFromFile
   453                                  	;jc	short p_return
   454                                  	;mov	byte [half_buff], 2 ; (DMA) Buffer 2
   455                                  
   456 00000374 C605[3F080000]01        	mov	byte [srb], 1
   457                                  
   458                                  p_loop:
   459 0000037B B401                    	mov     ah, 1		; any key pressed?
   460 0000037D CD32                    	int     32h		; no, Loop.
   461 0000037F 7414                    	jz	short q_loop
   462                                  
   463 00000381 B400                    	mov     ah, 0		; flush key buffer...
   464 00000383 CD32                    	int     32h
   465                                  	
   466 00000385 3C2B                    	cmp	al, '+' ; increase sound volume
   467 00000387 742F                    	je	short inc_volume_level
   468 00000389 3C2D                    	cmp	al, '-'
   469 0000038B 744E                    	je	short dec_volume_level
   470                                  
   471                                  p_return:
   472 0000038D C605[3D080000]00        	mov	byte [half_buff], 0
   473 00000394 C3                      	retn
   474                                  q_loop:
   475 00000395 803D[3F080000]00        	cmp	byte [srb], 0
   476 0000039C 76DD                    	jna	short p_loop
   477 0000039E C605[3F080000]00        	mov	byte [srb], 0
   478 000003A5 BF[00100000]            	mov     edi, audio_buffer
   479 000003AA BA00800000              	mov	edx, BUFFERSIZE
   480 000003AF E822FFFFFF              	call    loadFromFile
   481 000003B4 72D7                    	jc	short p_return
   482                                  	;mov	byte [srb], 0
   483 000003B6 EBC3                    	jmp	short p_loop
   484                                  
   485                                  	; 24/06/2017
   486                                  inc_volume_level:
   487 000003B8 8A0D[B9080000]          	mov	cl, [volume_level]
   488 000003BE 80F91F                  	cmp	cl, 1Fh ; 31
   489 000003C1 73D2                    	jnb	short q_loop
   490 000003C3 FEC1                    	inc	cl
   491                                  change_volume_level:
   492 000003C5 880D[B9080000]          	mov	[volume_level], cl
   493 000003CB 88CD                    	mov	ch, cl
   494                                  	; Set Master Volume Level
   495                                  	sys	_audio, 0B00h
   495                              <1> 
   495                              <1> 
   495                              <1> 
   495                              <1> 
   495                              <1>  %if %0 >= 2
   495 000003CD BB000B0000          <1>  mov ebx, %2
   495                              <1>  %if %0 >= 3
   495                              <1>  mov ecx, %3
   495                              <1>  %if %0 = 4
   495                              <1>  mov edx, %4
   495                              <1>  %endif
   495                              <1>  %endif
   495                              <1>  %endif
   495 000003D2 B820000000          <1>  mov eax, %1
   495                              <1> 
   495 000003D7 CD40                <1>  int 40h
   496 000003D9 EBBA                    	jmp	short q_loop
   497                                  dec_volume_level:
   498 000003DB 8A0D[B9080000]          	mov	cl, [volume_level]
   499 000003E1 80F901                  	cmp	cl, 1 ; 1
   500 000003E4 76AF                    	jna	short q_loop
   501 000003E6 FEC9                    	dec	cl
   502 000003E8 EBDB                    	jmp	short change_volume_level
   503                                  
   504                                  write_audio_dev_info:
   505                                  	; EBX = Message address
   506                                  	; ECX = Max. message length (or stop on ZERO character)
   507                                  	;	(1 to 255)
   508                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
   509                                       	sys 	_msg, msgAudioDevInfo, 255, 0Fh
   509                              <1> 
   509                              <1> 
   509                              <1> 
   509                              <1> 
   509                              <1>  %if %0 >= 2
   509 000003EA BB[95060000]        <1>  mov ebx, %2
   509                              <1>  %if %0 >= 3
   509 000003EF B9FF000000          <1>  mov ecx, %3
   509                              <1>  %if %0 = 4
   509 000003F4 BA0F000000          <1>  mov edx, %4
   509                              <1>  %endif
   509                              <1>  %endif
   509                              <1>  %endif
   509 000003F9 B823000000          <1>  mov eax, %1
   509                              <1> 
   509 000003FE CD40                <1>  int 40h
   510 00000400 C3                              retn
   511                                  
   512                                  write_wav_file_info:
   513                                  	; 01/05/2017
   514                                  	sys	_msg, msgWavFileName, 255, 0Fh
   514                              <1> 
   514                              <1> 
   514                              <1> 
   514                              <1> 
   514                              <1>  %if %0 >= 2
   514 00000401 BB[46070000]        <1>  mov ebx, %2
   514                              <1>  %if %0 >= 3
   514 00000406 B9FF000000          <1>  mov ecx, %3
   514                              <1>  %if %0 = 4
   514 0000040B BA0F000000          <1>  mov edx, %4
   514                              <1>  %endif
   514                              <1>  %endif
   514                              <1>  %endif
   514 00000410 B823000000          <1>  mov eax, %1
   514                              <1> 
   514 00000415 CD40                <1>  int 40h
   515                                  	sys	_msg, wav_file_name, 255, 0Fh
   515                              <1> 
   515                              <1> 
   515                              <1> 
   515                              <1> 
   515                              <1>  %if %0 >= 2
   515 00000417 BB[5C080000]        <1>  mov ebx, %2
   515                              <1>  %if %0 >= 3
   515 0000041C B9FF000000          <1>  mov ecx, %3
   515                              <1>  %if %0 = 4
   515 00000421 BA0F000000          <1>  mov edx, %4
   515                              <1>  %endif
   515                              <1>  %endif
   515                              <1>  %endif
   515 00000426 B823000000          <1>  mov eax, %1
   515                              <1> 
   515 0000042B CD40                <1>  int 40h
   516                                  
   517                                  write_sample_rate:
   518                                  	; 01/05/2017
   519 0000042D 66A1[3A080000]          	mov	ax, [sample_rate]
   520                                  	; ax = sample rate (hertz)
   521 00000433 31D2                    	xor	edx, edx
   522 00000435 66B90A00                	mov	cx, 10
   523 00000439 66F7F1                  	div	cx
   524 0000043C 0015[6B070000]          	add	[msgHertz+4], dl
   525 00000442 29D2                    	sub	edx, edx
   526 00000444 66F7F1                  	div	cx
   527 00000447 0015[6A070000]          	add	[msgHertz+3], dl
   528 0000044D 29D2                    	sub	edx, edx
   529 0000044F 66F7F1                  	div	cx
   530 00000452 0015[69070000]          	add	[msgHertz+2], dl
   531 00000458 29D2                    	sub	edx, edx
   532 0000045A 66F7F1                  	div	cx
   533 0000045D 0015[68070000]          	add	[msgHertz+1], dl
   534 00000463 0005[67070000]          	add	[msgHertz], al
   535                                  	
   536                                  	sys	_msg, msgSampleRate, 255, 0Fh
   536                              <1> 
   536                              <1> 
   536                              <1> 
   536                              <1> 
   536                              <1>  %if %0 >= 2
   536 00000469 BB[58070000]        <1>  mov ebx, %2
   536                              <1>  %if %0 >= 3
   536 0000046E B9FF000000          <1>  mov ecx, %3
   536                              <1>  %if %0 = 4
   536 00000473 BA0F000000          <1>  mov edx, %4
   536                              <1>  %endif
   536                              <1>  %endif
   536                              <1>  %endif
   536 00000478 B823000000          <1>  mov eax, %1
   536                              <1> 
   536 0000047D CD40                <1>  int 40h
   537                                  
   538 0000047F BE[82070000]            	mov	esi, msg16Bits
   539 00000484 803D[39080000]10        	cmp	byte [bps], 16
   540 0000048B 7405                    	je	short wsr_1
   541 0000048D BE[72070000]            	mov	esi, msg8Bits
   542                                  wsr_1:
   543                                  	sys	_msg, esi, 255, 0Fh
   543                              <1> 
   543                              <1> 
   543                              <1> 
   543                              <1> 
   543                              <1>  %if %0 >= 2
   543 00000492 89F3                <1>  mov ebx, %2
   543                              <1>  %if %0 >= 3
   543 00000494 B9FF000000          <1>  mov ecx, %3
   543                              <1>  %if %0 = 4
   543 00000499 BA0F000000          <1>  mov edx, %4
   543                              <1>  %endif
   543                              <1>  %endif
   543                              <1>  %endif
   543 0000049E B823000000          <1>  mov eax, %1
   543                              <1> 
   543 000004A3 CD40                <1>  int 40h
   544                                  
   545 000004A5 BE[7B070000]            	mov	esi, msgMono
   546 000004AA 803D[38080000]01        	cmp	byte [stmo], 1
   547 000004B1 7405                    	je	short wsr_2
   548 000004B3 BE[8C070000]            	mov	esi, msgStereo		
   549                                  wsr_2:
   550                                  	sys	_msg, esi, 255, 0Fh
   550                              <1> 
   550                              <1> 
   550                              <1> 
   550                              <1> 
   550                              <1>  %if %0 >= 2
   550 000004B8 89F3                <1>  mov ebx, %2
   550                              <1>  %if %0 >= 3
   550 000004BA B9FF000000          <1>  mov ecx, %3
   550                              <1>  %if %0 = 4
   550 000004BF BA0F000000          <1>  mov edx, %4
   550                              <1>  %endif
   550                              <1>  %endif
   550                              <1>  %endif
   550 000004C4 B823000000          <1>  mov eax, %1
   550                              <1> 
   550 000004C9 CD40                <1>  int 40h
   551 000004CB C3                              retn
   552                                  
   553                                  write_ac97_pci_dev_info:
   554                                  	; 06/06/2017
   555                                  	; 03/06/2017
   556                                  	; BUS/DEV/FN
   557                                  	;	00000000BBBBBBBBDDDDDFFF00000000
   558                                  	; DEV/VENDOR
   559                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
   560                                  
   561 000004CC 8B35[AE080000]          	mov	esi, [dev_vendor]
   562 000004D2 89F0                    	mov	eax, esi
   563 000004D4 0FB6D8                  	movzx	ebx, al
   564 000004D7 88DA                    	mov	dl, bl
   565 000004D9 80E30F                  	and	bl, 0Fh
   566 000004DC 8A83[95070000]          	mov	al, [ebx+hex_chars]
   567 000004E2 A2[DA070000]            	mov	[msgVendorId+3], al
   568 000004E7 88D3                    	mov	bl, dl
   569 000004E9 C0EB04                  	shr	bl, 4
   570 000004EC 8A83[95070000]          	mov	al, [ebx+hex_chars]
   571 000004F2 A2[D9070000]            	mov	[msgVendorId+2], al
   572 000004F7 88E3                    	mov	bl, ah
   573 000004F9 88DA                    	mov	dl, bl
   574 000004FB 80E30F                  	and	bl, 0Fh
   575 000004FE 8A83[95070000]          	mov	al, [ebx+hex_chars]
   576 00000504 A2[D8070000]            	mov	[msgVendorId+1], al
   577 00000509 88D3                    	mov	bl, dl
   578 0000050B C0EB04                  	shr	bl, 4
   579 0000050E 8A83[95070000]          	mov	al, [ebx+hex_chars]
   580 00000514 A2[D7070000]            	mov	[msgVendorId], al
   581 00000519 C1E810                  	shr	eax, 16
   582 0000051C 88C3                    	mov	bl, al
   583 0000051E 88DA                    	mov	dl, bl
   584 00000520 80E30F                  	and	bl, 0Fh
   585 00000523 8A83[95070000]          	mov	al, [ebx+hex_chars]
   586 00000529 A2[EB070000]            	mov	[msgDevId+3], al
   587 0000052E 88D3                    	mov	bl, dl
   588 00000530 C0EB04                  	shr	bl, 4
   589 00000533 8A83[95070000]          	mov	al, [ebx+hex_chars]
   590 00000539 A2[EA070000]            	mov	[msgDevId+2], al
   591 0000053E 88E3                    	mov	bl, ah
   592 00000540 88DA                    	mov	dl, bl
   593 00000542 80E30F                  	and	bl, 0Fh
   594 00000545 8A83[95070000]          	mov	al, [ebx+hex_chars]
   595 0000054B A2[E9070000]            	mov	[msgDevId+1], al
   596 00000550 88D3                    	mov	bl, dl
   597 00000552 C0EB04                  	shr	bl, 4
   598 00000555 8A83[95070000]          	mov	al, [ebx+hex_chars]
   599 0000055B A2[E8070000]            	mov	[msgDevId], al
   600                                  
   601 00000560 8B35[B2080000]          	mov	esi, [bus_dev_fn]
   602 00000566 C1EE08                  	shr	esi, 8
   603 00000569 6689F0                  	mov	ax, si
   604 0000056C 88C3                    	mov	bl, al
   605 0000056E 88DA                    	mov	dl, bl
   606 00000570 80E307                  	and	bl, 7 ; bit 0,1,2
   607 00000573 8A83[95070000]          	mov	al, [ebx+hex_chars]
   608 00000579 A2[0F080000]            	mov	[msgFncNo+1], al
   609 0000057E 88D3                    	mov	bl, dl
   610 00000580 C0EB03                  	shr	bl, 3
   611 00000583 88DA                    	mov	dl, bl
   612 00000585 80E30F                  	and	bl, 0Fh
   613 00000588 8A83[95070000]          	mov	al, [ebx+hex_chars]
   614 0000058E A2[01080000]            	mov	[msgDevNo+1], al
   615 00000593 88D3                    	mov	bl, dl
   616 00000595 C0EB04                  	shr	bl, 4
   617 00000598 8A83[95070000]          	mov	al, [ebx+hex_chars]
   618 0000059E A2[00080000]            	mov	[msgDevNo], al
   619 000005A3 88E3                    	mov	bl, ah
   620 000005A5 88DA                    	mov	dl, bl
   621 000005A7 80E30F                  	and	bl, 0Fh
   622 000005AA 8A83[95070000]          	mov	al, [ebx+hex_chars]
   623 000005B0 A2[F5070000]            	mov	[msgBusNo+1], al
   624 000005B5 88D3                    	mov	bl, dl
   625 000005B7 C0EB04                  	shr	bl, 4
   626 000005BA 8A83[95070000]          	mov	al, [ebx+hex_chars]
   627 000005C0 A2[F4070000]            	mov	[msgBusNo], al
   628                                  
   629 000005C5 66A1[B6080000]          	mov	ax, [ac97_IO_base]
   630 000005CB 88C3                    	mov	bl, al
   631 000005CD 88DA                    	mov	dl, bl
   632 000005CF 80E30F                  	and	bl, 0Fh
   633 000005D2 8A83[95070000]          	mov	al, [ebx+hex_chars]
   634 000005D8 A2[27080000]            	mov	[msgBaseAddr+3], al
   635 000005DD 88D3                    	mov	bl, dl
   636 000005DF C0EB04                  	shr	bl, 4
   637 000005E2 8A83[95070000]          	mov	al, [ebx+hex_chars]
   638 000005E8 A2[26080000]            	mov	[msgBaseAddr+2], al
   639 000005ED 88E3                    	mov	bl, ah
   640 000005EF 88DA                    	mov	dl, bl
   641 000005F1 80E30F                  	and	bl, 0Fh
   642 000005F4 8A83[95070000]          	mov	al, [ebx+hex_chars]
   643 000005FA A2[25080000]            	mov	[msgBaseAddr+1], al
   644 000005FF 88D3                    	mov	bl, dl
   645 00000601 C0EB04                  	shr	bl, 4
   646 00000604 8A83[95070000]          	mov	al, [ebx+hex_chars]
   647 0000060A A2[24080000]            	mov	[msgBaseAddr], al
   648                                  
   649 0000060F 30E4                    	xor	ah, ah
   650 00000611 A0[B8080000]            	mov	al, [ac97_int_ln_reg]
   651 00000616 B10A                    	mov	cl, 10
   652 00000618 F6F1                    	div	cl
   653 0000061A 660105[30080000]        	add	[msgIRQ], ax
   654 00000621 20C0                    	and	al, al
   655 00000623 750D                    	jnz	short _w_ac97imsg_
   656 00000625 A0[31080000]            	mov	al, [msgIRQ+1]
   657 0000062A B420                    	mov	ah, ' '
   658 0000062C 66A3[30080000]          	mov	[msgIRQ], ax
   659                                  _w_ac97imsg_:
   660                                  	sys	_msg, msgAC97Info, 255, 07h
   660                              <1> 
   660                              <1> 
   660                              <1> 
   660                              <1> 
   660                              <1>  %if %0 >= 2
   660 00000632 BB[A6070000]        <1>  mov ebx, %2
   660                              <1>  %if %0 >= 3
   660 00000637 B9FF000000          <1>  mov ecx, %3
   660                              <1>  %if %0 = 4
   660 0000063C BA07000000          <1>  mov edx, %4
   660                              <1>  %endif
   660                              <1>  %endif
   660                              <1>  %endif
   660 00000641 B823000000          <1>  mov eax, %1
   660                              <1> 
   660 00000646 CD40                <1>  int 40h
   661                                  
   662 00000648 C3                              retn
   663                                  
   664                                  ; DATA
   665                                  
   666                                  FileHandle:	
   667 00000649 FFFFFFFF                	dd	-1
   668                                  
   669                                  Credits:
   670 0000064D 54696E792057415620-     	db	'Tiny WAV Player for TRDOS 386 by Erdogan Tan. '
   670 00000656 506C6179657220666F-
   670 0000065F 72205452444F532033-
   670 00000668 383620627920457264-
   670 00000671 6F67616E2054616E2E-
   670 0000067A 20                 
   671 0000067B 4A756E652032303137-     	db	'June 2017.',10,13,0
   671 00000684 2E0A0D00           
   672 00000688 32342F30362F323031-     	db	'24/06/2017', 10,13,0
   672 00000691 370A0D00           
   673                                  
   674                                  msgAudioDevInfo:
   675 00000695 666F72205649412056-     	db 	'for VIA VT8233 Audio Controller.', 10,13,0
   675 0000069E 543832333320417564-
   675 000006A7 696F20436F6E74726F-
   675 000006B0 6C6C65722E0A0D00   
   676                                  
   677                                  msg_usage:
   678 000006B8 75736167653A207761-     	db	'usage: wavplay filename.wav',10,13,0
   678 000006C1 76706C61792066696C-
   678 000006CA 656E616D652E776176-
   678 000006D3 0A0D00             
   679                                  
   680                                  noDevMsg:
   681 000006D6 4572726F723A20556E-     	db	'Error: Unable to find VIA VT8233 based audio device!'
   681 000006DF 61626C6520746F2066-
   681 000006E8 696E64205649412056-
   681 000006F1 543832333320626173-
   681 000006FA 656420617564696F20-
   681 00000703 64657669636521     
   682 0000070A 0A0D00                  	db	10,13,0
   683                                  
   684                                  noFileErrMsg:
   685 0000070D 4572726F723A206669-     	db	'Error: file not found.',10,13,0
   685 00000716 6C65206E6F7420666F-
   685 0000071F 756E642E0A0D00     
   686                                  
   687                                  trdos386_err_msg:
   688 00000726 5452444F5320333836-     	db	'TRDOS 386 System call error !',10,13,0
   688 0000072F 2053797374656D2063-
   688 00000738 616C6C206572726F72-
   688 00000741 20210A0D00         
   689                                  
   690                                  ; 10/06/2017
   691 00000746 0D0A5741562046696C-     msgWavFileName:	db 0Dh, 0Ah, "WAV File Name: ",0
   691 0000074F 65204E616D653A2000 
   692 00000758 0D0A53616D706C6520-     msgSampleRate:	db 0Dh, 0Ah, "Sample Rate: "
   692 00000761 526174653A20       
   693 00000767 303030303020487A2C-     msgHertz:	db "00000 Hz, ", 0 
   693 00000770 2000               
   694 00000772 3820626974732C2000      msg8Bits:	db "8 bits, ", 0 
   695 0000077B 4D6F6E6F0D0A00          msgMono:	db "Mono", 0Dh, 0Ah, 0
   696 00000782 313620626974732C20-     msg16Bits:	db "16 bits, ", 0 
   696 0000078B 00                 
   697 0000078C 53746572656F            msgStereo:	db "Stereo"
   698 00000792 0D0A00                  nextline:	db 0Dh, 0Ah, 0
   699                                  
   700                                  ; 03/06/2017
   701 00000795 303132333435363738-     hex_chars	db "0123456789ABCDEF", 0
   701 0000079E 3941424344454600   
   702 000007A6 0D0A                    msgAC97Info	db 0Dh, 0Ah
   703 000007A8 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
   703 000007B1 6F20436F6E74726F6C-
   703 000007BA 6C6572202620436F64-
   703 000007C3 656320496E666F0D0A 
   704 000007CC 56656E646F72204944-     		db "Vendor ID: "
   704 000007D5 3A20               
   705 000007D7 303030306820446576-     msgVendorId	db "0000h Device ID: "
   705 000007E0 6963652049443A20   
   706 000007E8 30303030680D0A          msgDevId	db "0000h", 0Dh, 0Ah
   707 000007EF 4275733A20              		db "Bus: "
   708 000007F4 303068204465766963-     msgBusNo	db "00h Device: "
   708 000007FD 653A20             
   709 00000800 3030682046756E6374-     msgDevNo	db "00h Function: "
   709 00000809 696F6E3A20         
   710 0000080E 303068                  msgFncNo	db "00h"
   711 00000811 0D0A                    		db 0Dh, 0Ah
   712 00000813 4261736520494F2041-     		db "Base IO Address: "
   712 0000081C 6464726573733A20   
   713 00000824 303030306820204952-     msgBaseAddr	db "0000h  IRQ: "
   713 0000082D 513A20             
   714 00000830 3030                    msgIRQ		dw 3030h
   715 00000832 0D0A00                  		db 0Dh, 0Ah, 0
   716                                  
   717                                  EOF: 
   718                                  
   719                                  ; BSS
   720                                  
   721                                  bss_start:
   722                                  
   723                                  ABSOLUTE bss_start
   724                                  
   725 00000835 <res 00000003>          alignb 4
   726                                  
   727 00000838 <res 00000001>          stmo:		resb 1 ; stereo or mono (1=stereo) 
   728 00000839 <res 00000001>          bps:		resb 1 ; bits per sample (8,16)
   729 0000083A <res 00000002>          sample_rate:	resw 1 ; Sample Frequency (Hz)
   730                                  
   731 0000083C <res 00000001>          cbs_busy:	resb 1 
   732 0000083D <res 00000001>          half_buff:	resb 1
   733 0000083E <res 00000001>          flags:		resb 1
   734 0000083F <res 00000001>          srb:		resb 1	
   735                                  
   736 00000840 <res 0000001C>          smpRBuff:	resw 14 
   737                                  
   738                                  wav_file_name:
   739 0000085C <res 00000050>          		resb 80 ; wave file, path name (<= 80 bytes)
   740                                  
   741                                  ; 10/06/2017
   742 000008AC <res 00000002>          resw 1
   743 000008AE <res 00000004>          dev_vendor:	resd 1
   744 000008B2 <res 00000004>          bus_dev_fn:	resd 1
   745 000008B6 <res 00000002>          ac97_IO_base:	resw 1
   746 000008B8 <res 00000001>          ac97_int_ln_reg: resb 1
   747                                  ; 24/06/2017
   748 000008B9 <res 00000001>          volume_level:	resb 1
   749                                  
   750                                  bss_end:
   751 000008BA <res 00000746>          alignb 4096
   752 00001000 <res 00008000>          audio_buffer:	resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
