     1                                  ; ****************************************************************************
     2                                  ; twavplay.asm (for TRDOS 386) -twavplay3.s-
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TWAVPLAY.PRG ! AC'97 & SB16 WAV PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 09/02/2025
     7                                  ;
     8                                  ; [ Last Modification: 20/02/2025 ]
     9                                  ;
    10                                  ; Assembler: NASM 2.15
    11                                  ; ----------------------------------------------------------------------------
    12                                  ;	   nasm  twavplay.s -l twavplay.txt -o TWAVPLAY.PRG
    13                                  ; ****************************************************************************
    14                                  
    15                                  ; VGA Video Mode 12h, 640*480 16 colors, stereo wave scope/graphics
    16                                  
    17                                  ; ----------------------------------------------------------------------------
    18                                  ; TuneLoop method for AC97 - Interrupt/Callback (syscalbac) method for SB16
    19                                  ; ----------------------------------------------------------------------------
    20                                  
    21                                  ; 09/02/2025
    22                                  ; Code reference:
    23                                  ;	twavplay.asm (TWAVPLAY.COM, 09/02/2025)
    24                                  ;	ac97play.s (AC97PLAY.PRG, 05/02/2025
    25                                  
    26                                  ; ----------------------------------------------------------------------------
    27                                  
    28                                  ; 30/11/2024
    29                                  ; 20/08/2024 ; TRDOS 386 v2.0.9
    30                                  ; 29/04/2016
    31                                  _ver 	equ 0
    32                                  _exit 	equ 1
    33                                  _fork 	equ 2
    34                                  _read 	equ 3
    35                                  _write	equ 4
    36                                  _open	equ 5
    37                                  _close 	equ 6
    38                                  _wait 	equ 7
    39                                  _creat 	equ 8
    40                                  _link 	equ 9
    41                                  _unlink	equ 10
    42                                  _exec	equ 11
    43                                  _chdir	equ 12
    44                                  _time 	equ 13
    45                                  _mkdir 	equ 14
    46                                  _chmod	equ 15
    47                                  _chown	equ 16
    48                                  _break	equ 17
    49                                  _stat	equ 18
    50                                  _seek	equ 19
    51                                  _tell 	equ 20
    52                                  _mount	equ 21
    53                                  _umount	equ 22
    54                                  _setuid	equ 23
    55                                  _getuid	equ 24
    56                                  _stime	equ 25
    57                                  _quit	equ 26
    58                                  _intr	equ 27
    59                                  _fstat	equ 28
    60                                  _emt 	equ 29
    61                                  _mdate 	equ 30
    62                                  _video 	equ 31
    63                                  _audio	equ 32
    64                                  _timer	equ 33
    65                                  _sleep	equ 34
    66                                  _msg    equ 35
    67                                  _geterr	equ 36
    68                                  _fpsave	equ 37
    69                                  _pri	equ 38
    70                                  _rele	equ 39
    71                                  _fff	equ 40
    72                                  _fnf	equ 41
    73                                  _alloc	equ 42
    74                                  _dalloc equ 43
    75                                  _calbac equ 44
    76                                  _dma	equ 45
    77                                  _stdio  equ 46
    78                                  
    79                                  ; ----------------------------------------------------------------------------
    80                                  
    81                                  %macro sys 1-4
    82                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
    83                                      ; 03/09/2015
    84                                      ; 13/04/2015
    85                                      ; Retro UNIX 386 v1 system call.
    86                                      %if %0 >= 2
    87                                          mov ebx, %2
    88                                          %if %0 >= 3
    89                                              mov ecx, %3
    90                                              %if %0 = 4
    91                                                 mov edx, %4
    92                                              %endif
    93                                          %endif
    94                                      %endif
    95                                      mov eax, %1
    96                                      ;int 30h
    97                                      int 40h ; TRDOS 386 (TRDOS v2.0)
    98                                  %endmacro
    99                                  
   100                                  ; Retro UNIX 386 v1 system call format:
   101                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   102                                  
   103                                  ; ----------------------------------------------------------------------------
   104                                  
   105                                  %macro	SbOut	1
   106                                  %%Wait:
   107                                  	;in	al, dx
   108                                  	mov	ah, 0
   109                                  	int	34h
   110                                  	or	al, al
   111                                  	js	short %%Wait
   112                                  	mov	al, %1
   113                                  	;out	dx, al
   114                                  	mov	ah, 1
   115                                  	int	34h
   116                                  %endmacro
   117                                  
   118                                  ; ----------------------------------------------------------------------------
   119                                  
   120                                  ;BUFFERSIZE equ 65520 ; AC97
   121                                  ; 07/02/2025
   122                                  ;BUFFERSIZE equ 33680 ; AC97
   123                                  ; 08/02/2025	
   124                                  ;BUFFERSIZE equ 10548 ; AC97 ; 48kHZ 16bit stereo audio block (18.2 block/s) 
   125                                  
   126                                  ENDOFFILE equ 1	; flag for knowing end of file
   127                                  
   128                                  ;LOADSIZE equ 16384 ; SB16
   129                                  ;dma_buffer_size equ 32768  ; SB16
   130                                  ; 08/02/2025
   131                                  ;LOADSIZE equ 10560 ; SB16 ; 48kHZ 16bit stereo audio block (18.2 block/s)
   132                                  
   133                                  ; ----------------------------------------------------------------------------
   134                                  ; Reference:
   135                                  ; ----------
   136                                  ; Tiny Player v2.11 by Carlos Hasan.
   137                                  ;	June, 1994.
   138                                  
   139                                  ;=============================================================================
   140                                  ;	code
   141                                  ;=============================================================================
   142                                  
   143                                  [BITS 32] ; 32-bit intructions
   144                                  
   145                                  [ORG 0]
   146                                  
   147                                  	; 09/02/2025
   148                                  Start:
   149                                  	; Prints the Credits Text.
   150                                  	sys	_msg, Credits, 255, 0Bh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000000 BB[F2730000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000005 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000000A BA0B000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000000F B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00000014 CD40                <1>  int 40h
   151                                  
   152                                  	; Clear BSS (uninitialized data) area
   153 00000016 B9B1020000              	mov	ecx, (bss_end - bss_start) / 4
   154 0000001B BF[40770000]            	mov	edi, bss_start
   155 00000020 31C0                    	xor	eax, eax
   156 00000022 F366AB                  	rep	stosw
   157                                  
   158                                  	; Detect (& Enable) AC'97 or SB16 Audio Device
   159 00000025 E8A72B0000              	call	detect_audio_device
   160 0000002A 7318                    	jnc     short GetFileName
   161                                  
   162                                  _dev_not_ready:
   163                                  	; couldn't find the audio device!
   164                                  	sys	_msg, noDevMsg, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000002C BB[5F740000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000031 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000036 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000003B B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00000040 CD40                <1>  int 40h
   165 00000042 EB6E                            jmp     Exit
   166                                  
   167                                  ; ----------------------------------------------------------------------------
   168                                  
   169                                  GetFileName:
   170                                  	; (TRDOS 386 -Retro UNIX 386- argument transfer method)
   171                                  	; (stack: argc,argv0addr,argv1addr,argv2addr ..
   172                                  	;			.. argv0text, argv1text ..) 
   173                                  	; ---- argc, argv[] ----
   174 00000044 89E6                    	mov	esi, esp
   175 00000046 AD                      	lodsd
   176 00000047 83F802                  	cmp	eax, 2 ; two arguments 
   177 0000004A 7302                    	jnb	short _x
   178 0000004C EB4E                    	jmp	pmsg_usage
   179                                  
   180                                  _x:
   181 0000004E AD                      	lodsd	; skip program (PRG) file name
   182 0000004F 8B36                    	mov	esi, [esi] ; WAV file name 
   183                                  
   184 00000051 BF[74770000]            	mov	edi, wav_file_name
   185 00000056 31C9                    	xor	ecx, ecx ; 0
   186                                  ScanName:       
   187 00000058 AC                      	lodsb
   188                                  
   189 00000059 3C0D                    	cmp	al, 0Dh	; CR
   190 0000005B 7633                    	jna	short a_4
   191                                  _y:
   192 0000005D 3C20                    	cmp	al, 20h
   193 0000005F 74F7                    	je	short ScanName	; scan start of name.
   194 00000061 AA                      	stosb
   195 00000062 B4FF                    	mov	ah, 0FFh
   196                                  a_0:	
   197 00000064 FEC4                    	inc	ah
   198                                  a_1:
   199 00000066 41                      	inc	ecx
   200 00000067 AC                      	lodsb
   201 00000068 AA                      	stosb
   202 00000069 3C2E                    	cmp	al, '.'
   203 0000006B 74F7                    	je	short a_0
   204 0000006D 3C20                    	cmp	al, 20h
   205 0000006F 7611                    	jna	short a_3
   206 00000071 20E4                    	and	ah, ah
   207 00000073 7406                    	jz	short a_2
   208                                  
   209                                  	; 20/02/2025
   210 00000075 3C2F                    	cmp	al, '/'
   211 00000077 7502                    	jne	short a_2
   212 00000079 B400                    	mov	ah, 0
   213                                  a_2:
   214 0000007B 80F94B                  	cmp	cl, 75	; 64+8+'.'+3 -> offset 75 is the last chr
   215 0000007E 72E6                    	jb	short a_1
   216 00000080 EB0E                    	jmp	short a_4
   217                                  a_3:
   218 00000082 4F                      	dec	edi
   219 00000083 08E4                    	or	ah, ah		; if period NOT found,
   220 00000085 7509                    	jnz	short a_4 	; then add a .WAV extension.
   221                                  SetExt:
   222 00000087 C7072E574156            	mov	dword [edi], '.WAV' ; ! 64+12 is DOS limit
   223                                  				    ;   but writing +4 must not
   224                                  				    ;   destroy the following data
   225                                  				; so, 80 bytes path + 0 is possible here
   226 0000008D 83C704                  	add	edi, 4
   227                                  a_4:	
   228 00000090 C60700                  	mov	byte [edi], 0
   229                                  	
   230 00000093 803D[74770000]20        	cmp	byte [wav_file_name], 20h
   231 0000009A 7721                    	ja	short open_wav_file
   232                                  
   233                                  ; ----------------------------------------------------------------------------
   234                                  
   235                                  pmsg_usage: 
   236                                  	sys	_msg, msg_usage, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000009C BB[3E740000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000000A1 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000000A6 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000000AB B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000000B0 CD40                <1>  int 40h
   237                                  
   238                                  Exit:
   239 000000B2 31DB                    	xor	ebx, ebx ; exit code = 0 ; not necessary
   240                                  	sys	_exit
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87                              <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000000B4 B801000000          <1>  mov eax, %1
    96                              <1> 
    97 000000B9 CD40                <1>  int 40h
   241                                  halt:
   242 000000BB EBFE                    	jmp	short halt
   243                                  
   244                                  ; ----------------------------------------------------------------------------
   245                                  
   246                                  open_wav_file:
   247                                          ; open existing file
   248 000000BD BA[74770000]            	mov	edx, wav_file_name
   249 000000C2 E8DC010000                      call    openFile ; no error? ok.
   250 000000C7 7330                            jnc     short _z
   251                                  
   252                                  	; file not found!
   253                                  	sys	_msg, noFileErrMsg, 255, 0Ch
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000000C9 BB[91740000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000000CE B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000000D3 BA0C000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000000D8 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000000DD CD40                <1>  int 40h
   254                                  
   255 000000DF EBD1                    	jmp	short Exit
   256                                  
   257                                  not_valid_wav:
   258                                  	; not a proper/valid wav file !
   259                                  	sys	_msg, not_valid_wavf, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000000E1 BB[AC740000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000000E6 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000000EB BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000000F0 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000000F5 CD40                <1>  int 40h
   260                                  
   261 000000F7 EBB9                    	jmp	short Exit
   262                                  
   263                                  _z:
   264 000000F9 E8C9010000                     	call    getWAVParameters
   265 000000FE 72E1                    	jc	short not_valid_wav
   266                                  
   267 00000100 B304                    	mov	bl, 4
   268 00000102 8A0D[68770000]          	mov	cl, [WAVE_BlockAlign]
   269 00000108 28CB                    	sub	bl, cl	; = 0 for 16 bit stereo
   270                                  			; = 2 for 8 bit stereo or 16 bit mono
   271                                  			; = 3 for 8 bit mono
   272                                  
   273 0000010A D0EB                    	shr	bl, 1	; 0 --> 0, 2 --> 1, 3 --> 1
   274 0000010C 80D300                  	adc	bl, 0	; 3 --> 1 --> 2
   275 0000010F 881D[C8770000]          	mov	[fbs_shift], bl	; = 2 mono and 8 bit
   276                                  				; = 0 stereo and 16 bit
   277                                  				; = 1 mono or 8 bit
   278 00000115 31C0                    	xor	eax, eax
   279                                  
   280 00000117 803D[D6770000]01        	cmp	byte [audio_hardware], 1 ; SB16 ?
   281 0000011E 750B                    	jne	short _r
   282                                  				; no, skip [g_samples] calculation
   283                                  
   284                                  	; count of audio samples for graphics data
   285 00000120 FEC4                    	inc	ah
   286                                  	; eax = 256
   287 00000122 D0E9                    	shr	cl, 1
   288                                  	; 0 = 8 bit mono, 1 = 16 bit mono or 8 bit stereo
   289                                  	; 2 = 16 bit stereo  
   290 00000124 D3E0                    	shl	eax, cl
   291 00000126 A3[08820000]            	mov	[g_samples], eax ; 256 .. 1024
   292                                  
   293                                  _r:
   294                                  	; calculate 18.2 block/s buffer size for proper wave scope
   295 0000012B 66A1[60770000]          	mov	ax, [WAVE_SampleRate]
   296 00000131 31D2                    	xor	edx, edx
   297 00000133 B228                    	mov	dl, 4*10
   298 00000135 F7E2                    	mul	edx
   299 00000137 31C9                    	xor	ecx, ecx
   300 00000139 B1B6                    	mov	cl, 182
   301 0000013B F7F1                    	div	ecx
   302 0000013D 88D9                    	mov	cl, bl	; 0 = stereo & 16bit
   303                                  			; 1 = mono 16bit or stereo 8bit
   304                                  			; 2 = mono & 8bit
   305 0000013F 24FC                    	and	al, ~3 ; NOT 3
   306 00000141 D3E8                    	shr	eax, cl
   307                                  		; AX = 
   308                                  		; 10548 bytes for 48kHZ 16bit stereo
   309                                  		; 9692 bytes for 44kHZ 16bit stereo
   310                                  		; 7032 bytes for 32kHZ 16bit stereo
   311                                  		; 5272 bytes for 24kHz 16bit stereo
   312                                  		; 4844 bytes for 22kHZ 16bit stereo 
   313                                  		; 3516 bytes for 16kHZ 16bit stereo
   314                                  		; 2636 bytes for 12kHZ 16bit stereo
   315                                  		; 2420 bytes for 11kHZ 16bit stereo
   316                                  		; 1756 bytes for 8kHZ 16bit stereo
   317                                  
   318 00000143 A3[E4810000]            	mov	[loadsize], eax
   319                                  	
   320 00000148 803D[D6770000]01        	cmp	byte [audio_hardware], 1 ; SB16 ?
   321 0000014F 7404                    	je	short _t		; yes	
   322                                  
   323                                  	; AC97 codec plays 16 bit stereo PCM data only
   324 00000151 D3E0                    	shl	eax, cl
   325                                  	; count of 16 bit samples
   326 00000153 D1E8                    	shr	eax, 1
   327                                  _t:
   328 00000155 A3[E8810000]            	mov	[buffersize], eax ; (if audio hardware supports vra)	
   329                                  		 
   330                                  ; ----------------------------------------------------------------------------
   331                                  
   332                                  	; 10/02/2025
   333                                  	; 20/10/2017 - playwav.s
   334                                  
   335                                  allocate_dma_buffer:
   336 0000015A 803D[D6770000]01        	cmp	byte [audio_hardware], 1
   337 00000161 751F                    	jne	short allocate_ac97_buffers
   338                                  
   339                                  	; SB16
   340                                  
   341                                  	dmabufsize equ 24576 ; rounded up to page border (21120 will be use)
   342                                  
   343                                  	; DIRECT MEMORY ACCESS (for Audio DMA)
   344                                  	; ebx = DMA buffer address (virtual, user)
   345                                  	; ecx = buffer size (in bytes)
   346                                  	; edx = upper limit = 16MB
   347                                  
   348                                  	_16MB	equ 1024*1024*16
   349                                  
   350                                  	sys	_alloc, dma_buffer, dmabufsize, _16MB 
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000163 BB[00000200]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000168 B900600000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000016D BA00000001          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000172 B82A000000          <1>  mov eax, %1
    96                              <1> 
    97 00000177 CD40                <1>  int 40h
   351 00000179 7230                    	jc	short syscall_err
   352                                  
   353 0000017B A3[00820000]            	mov	[DMA_phy_buff], eax	; physical address
   354                                  	     				; of the buffer
   355                                  					; (which is needed
   356                                  					; for DMA controller)
   357                                  
   358 00000180 EB1D                    	jmp	short audio_hardware_init
   359                                  
   360                                  ; ----------------------------------------------------------------------------
   361                                  
   362                                  	; 10/02/2025
   363                                  	; 05/02/2025 - ac97play.s
   364                                  
   365                                  allocate_ac97_buffers:
   366                                  
   367                                  	; AC97
   368                                  
   369                                  	sys	_alloc, BDL_BUFFER, 7*4096, 0	; no upper limit
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000182 BB[00900000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000187 B900700000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000018C BA00000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000191 B82A000000          <1>  mov eax, %1
    96                              <1> 
    97 00000196 CD40                <1>  int 40h
   370 00000198 7211                    	jc	short syscall_err
   371                                  
   372 0000019A A3[FC810000]            	mov	[_bdl_buffer], eax ; BDL_BUFFER physical address
   373                                  
   374                                  ; ----------------------------------------------------------------------------
   375                                  
   376                                  audio_hardware_init:
   377                                  
   378 0000019F E875200000              	call	audio_system_init
   379                                  	;jc	short Exit
   380 000001A4 7320                    	jnc	short write_info
   381 000001A6 E907FFFFFF              	jmp	Exit
   382                                  
   383                                  ; ----------------------------------------------------------------------------
   384                                  
   385                                  syscall_err:
   386                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000001AB BB[5C750000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000001B0 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000001B5 BA0E000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000001BA B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000001BF CD40                <1>  int 40h
   387 000001C1 E9ECFEFFFF              	jmp	Exit
   388                                  
   389                                  ; ----------------------------------------------------------------------------
   390                                  
   391                                  write_info:
   392 000001C6 E8111D0000              	call	write_audio_dev_info
   393                                  
   394 000001CB E87E1F0000              	call	write_wav_file_info
   395                                  
   396                                  	sys	_msg, msgPressAKey, 255, 07h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000001D0 BB[0A770000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000001D5 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000001DA BA07000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000001DF B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000001E4 CD40                <1>  int 40h
   397                                  
   398 000001E6 30E4                    	xor	ah, ah
   399 000001E8 CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   400                                  			; getchar (wait for keystroke)
   401                                  
   402 000001EA 3C1B                    	cmp	al, 1Bh ; ESC
   403 000001EC 7505                    	jne	short _continue
   404 000001EE E9BFFEFFFF              	jmp	Exit
   405                                  
   406                                  _continue:
   407                                  	;call	audio_system_init
   408                                  	;jc	short Exit
   409                                  
   410                                  ; ----------------------------------------------------------------------------
   411                                  
   412                                  PlayNow: 
   413 000001F3 B900010000              	mov	ecx, 256
   414 000001F8 31DB                    	xor	ebx, ebx
   415 000001FA BF[E0770000]            	mov	edi, RowOfs
   416                                  MakeOfs:
   417 000001FF 89D8                    	mov	eax, ebx
   418 00000201 C1E007                  	shl	eax, 7 ; * 128
   419 00000204 B050                    	mov	al, 80
   420 00000206 F6E4                    	mul	ah
   421 00000208 66AB                    	stosw
   422 0000020A 43                      	inc	ebx
   423 0000020B E2F2                    	loop	MakeOfs
   424                                  
   425                                  ; ----------------------------------------------------------------------------
   426                                  
   427                                  	; DIRECT VGA MEMORY ACCESS
   428                                  	; bl = 0, bh = 5
   429                                  	; Direct access/map to VGA memory (0A0000h)
   430                                  
   431                                  	sys	_video, 0500h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000020D BB00050000          <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000212 B81F000000          <1>  mov eax, %1
    96                              <1> 
    97 00000217 CD40                <1>  int 40h
   432 00000219 3D00000A00              	cmp	eax, 0A0000h
   433 0000021E 758B                    	jne	short syscall_err
   434                                  
   435                                  ; ----------------------------------------------------------------------------
   436                                  
   437                                  	;;;;
   438                                  setgraphmode:
   439                                  	; set VGA 640x480x16 graphics mode
   440 00000220 66B81200                	mov	ax, 12h
   441 00000224 CD31                    	int	31h	; TRDOS 386 Video Interrupt
   442                                  			; Set video mode
   443 00000226 66BAC003                	mov	dx, 3C0h
   444 0000022A 30C0                    	xor	al, al
   445                                  setgraphmodel0:
   446                                  	;out	dx, al
   447 0000022C B401                    	mov	ah, 1	; outb
   448 0000022E CD34                    	int	34h	; TRDOS 386 IOCTL Interrupt
   449                                  	;out	dx, al
   450                                  	;mov	ah, 1	; outb
   451 00000230 CD34                    	int	34h
   452 00000232 FEC0                    	inc	al
   453 00000234 3C10                    	cmp	al, 10h
   454 00000236 72F4                    	jb	short setgraphmodel0
   455 00000238 B020                    	mov	al, 20h
   456                                  	;out	dx, al
   457                                  	;mov	ah, 1	; outb
   458 0000023A CD34                    	int	34h
   459                                  	;;;;
   460                                  
   461                                  ; ----------------------------------------------------------------------------
   462                                  	
   463                                  	;mov	esi, LOGO_ADDRESS
   464 0000023C E8182E0000              	call	putlbm
   465                                  ;	jnc	short loadlbm_ok
   466                                  ;
   467                                  ;loadlbm_err:
   468                                  ;	call	settextmode
   469                                  ;	sys	_msg, LOGO_ERROR_MSG, 255, 0Ch
   470                                  ;	jmp	Exit
   471                                  ;
   472                                  ;LOGO_ERROR_MSG:
   473                                  ;	db "Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0
   474                                  ;
   475                                  ;loadlbm_ok:
   476                                  
   477                                  ; ----------------------------------------------------------------------------
   478                                  	
   479 00000241 803D[D6770000]01        	cmp	byte [audio_hardware], 1
   480 00000248 7530                    	jne	short skip_sdc
   481                                  	
   482                                  	; parepare g_buffer wave graphics parameters
   483                                  
   484 0000024A BB[2E300000]            	mov	ebx, sdc_16bit_stereo
   485                                  
   486 0000024F A0[68770000]            	mov	al, [WAVE_BlockAlign]
   487 00000254 3C04                    	cmp	al, 4
   488 00000256 741C                    	je	short set_sdc_p_ok
   489 00000258 BB[4B300000]            	mov	ebx, sdc_8bit_mono
   490 0000025D 3C01                    	cmp	al, 1
   491 0000025F 7413                    	je	short set_sdc_p_ok
   492 00000261 BB[3F300000]            	mov	ebx, sdc_8bit_stereo
   493 00000266 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
   494 0000026D 7405                    	je	short set_sdc_p_ok
   495 0000026F BB[34300000]            	mov	ebx, sdc_16bit_mono
   496                                  set_sdc_p_ok:
   497 00000274 891D[04820000]          	mov	[sound_data_copy], ebx
   498                                  
   499                                  skip_sdc:
   500                                  
   501                                  ; ----------------------------------------------------------------------------
   502                                  
   503                                  	; play the .wav file.
   504                                  
   505 0000027A E88A000000              	call	PlayWav
   506                                  
   507                                  ; ----------------------------------------------------------------------------
   508                                  
   509                                  	; close the .wav file and exit.
   510 0000027F E835000000              	call	closeFile
   511                                  
   512                                  ; ----------------------------------------------------------------------------
   513                                  
   514 00000284 803D[D6770000]01        	cmp	byte [audio_hardware], 1
   515 0000028B 750C                    	jne	short terminate
   516                                  
   517                                  	; Cancel syscalback service for Sound Blaster 16
   518                                  	
   519 0000028D A0[C6770000]            	mov	al, [audio_intr] ; 5 or 7
   520 00000292 30E4                    	xor	ah, ah ; reset
   521 00000294 E8FC2B0000              	call	set_hardware_int_vector
   522                                  
   523                                  ; ----------------------------------------------------------------------------
   524                                  
   525                                  terminate:
   526 00000299 E8432C0000              	call	settextmode
   527                                  	
   528 0000029E E90FFEFFFF              	jmp	Exit
   529                                  
   530                                  ; ----------------------------------------------------------------------------
   531                                  
   532                                  	; INPUT: edx = file name address
   533                                  	; OUTPUT: [FileHandle]
   534                                  openFile:
   535                                  	; open File for read
   536                                  	sys	_open, edx, 0
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000002A3 89D3                <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000002A5 B900000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000002AA B805000000          <1>  mov eax, %1
    96                              <1> 
    97 000002AF CD40                <1>  int 40h
   537 000002B1 7205                    	jc	short _of_err
   538                                  		; cf = 1 -> not found or access error
   539 000002B3 A3[ED730000]            	mov	[FileHandle], eax
   540                                  _of_err:
   541 000002B8 C3                      	retn
   542                                  
   543                                  ; ----------------------------------------------------------------------------
   544                                  
   545                                  	; INPUT: [FileHandle]
   546                                  	; OUTPUT: none
   547                                  closeFile:
   548                                  	sys	_close, [FileHandle]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000002B9 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000002BF B806000000          <1>  mov eax, %1
    96                              <1> 
    97 000002C4 CD40                <1>  int 40h
   549 000002C6 C3                      	retn
   550                                  
   551                                  ; ----------------------------------------------------------------------------
   552                                  
   553                                  getWAVParameters:
   554                                  	sys	_read, [FileHandle], WAVFILEHEADERbuff, 44
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000002C7 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000002CD B9[48770000]        <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000002D2 BA2C000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000002D7 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000002DC CD40                <1>  int 40h
   555 000002DE 7228                    	jc	short gwavp_retn
   556                                  
   557 000002E0 83F82C                  	cmp	eax, 44
   558 000002E3 7223                    	jb	short gwavp_retn
   559                                  
   560 000002E5 813D[50770000]5741-     	cmp	dword [RIFF_Format], 'WAVE'
   560 000002ED 5645               
   561 000002EF 7516                    	jne	short gwavp_stc_retn
   562                                  
   563 000002F1 66833D[5C770000]01      	cmp	word [WAVE_AudioFormat], 1 ; Offset 20, must be 1 (= PCM)
   564 000002F9 750C                    	jne	short gwavp_stc_retn
   565                                  
   566                                  	; (OpenMPT creates wav files with a new type header,
   567                                  	;  this program can not use the new type
   568                                  	;  because of 'data' offset is not at DATA_SubchunkID.)
   569                                  	; ((GoldWave creates common type wav file.))
   570                                  
   571 000002FB 813D[6C770000]6461-     	cmp	dword [DATA_SubchunkID], 'data'
   571 00000303 7461               
   572 00000305 7401                    	je	short gwavp_retn
   573                                  
   574                                  gwavp_stc_retn:
   575 00000307 F9                      	stc
   576                                  gwavp_retn:
   577 00000308 C3                      	retn
   578                                  
   579                                  ;=============================================================================
   580                                  ;
   581                                  ;=============================================================================
   582                                  
   583                                  	; 10/02/2025
   584                                  	; 09/02/2025
   585                                  PlayWav:
   586 00000309 803D[D6770000]01        	cmp	byte [audio_hardware], 1
   587 00000310 776B                    	ja	short playwav_ac97
   588                                  
   589                                  playwav_sb16:
   590 00000312 803D[D9770000]01        	cmp	byte [stopped], 1
   591 00000319 7210                    	jb	short playwav_sb16_@
   592                                  
   593                                  	; replay
   594 0000031B C605[D9770000]00        	mov	byte [stopped], 0
   595 00000322 C605[30770000]01        	mov	byte [half_buffer], 1
   596                                  
   597 00000329 EB11                    	jmp	short playwav_sb16_@@
   598                                  
   599                                  playwav_sb16_@:
   600                                  	; set audio interrupt vector (to user's handler)
   601                                  	; set syscallback service for Sound Blaster 16
   602 0000032B A0[D7770000]            	mov	al, [IRQnum]
   603 00000330 B401                    	mov	ah, 1 ; set
   604                                  	; 10/02/2025
   605 00000332 BA[D7770000]            	mov	edx, IRQnum
   606 00000337 E8592B0000              	call	set_hardware_int_vector
   607                                  
   608                                  playwav_sb16_@@:
   609 0000033C BF[00000200]            	mov	edi, dma_buffer
   610 00000341 E8FC020000              	call	SB16_LoadFromFile
   611                                  
   612 00000346 A1[EC810000]            	mov	eax, [count]
   613 0000034B 0105[F0810000]          	add	[LoadedDataBytes], eax
   614                                  
   615 00000351 BF[00000200]            	mov	edi, dma_buffer
   616 00000356 033D[E4810000]          	add	edi, [loadsize] ; = add edi, [buffersize]
   617 0000035C E8E1020000              	call	SB16_LoadFromFile
   618                                  
   619 00000361 A1[EC810000]            	mov	eax, [count]
   620 00000366 0105[F0810000]          	add	[LoadedDataBytes], eax
   621                                  
   622 0000036C E8B31F0000              	call	sb16_init_play
   623                                  
   624 00000371 C605[D7770000]00        	mov	byte [IRQnum], 0
   625 00000378 E9C3000000              	jmp	SB16_TuneLoop
   626                                  
   627                                  playwav_ac97:
   628 0000037D 803D[D9770000]01        	cmp	byte [stopped], 1
   629 00000384 720E                    	jb	short playwav_ac97_@
   630                                  
   631 00000386 C605[D9770000]00        	mov	byte [stopped], 0
   632                                  
   633 0000038D E8DF260000              	call	ac97_RePlayWav
   634                                  
   635 00000392 EB0A                    	jmp	short AC97_TuneLoop
   636                                  
   637                                  playwav_ac97_@:
   638 00000394 E8D9230000              	call	ac97_play_setup
   639                                  
   640 00000399 E89A260000              	call	ac97_init_play
   641                                  
   642                                  	;jmp	short AC97_TuneLoop
   643                                  
   644                                  ; ----------------------------------------------------------------------------
   645                                  
   646                                  	; 09/02/2025
   647                                  AC97_TuneLoop:
   648                                  
   649                                  ;tuneLoop:
   650                                  tLWait:
   651 0000039E 803D[D9770000]00        	cmp	byte [stopped], 0
   652 000003A5 7612                    	jna	short tL1 
   653                                  tLWait@:
   654 000003A7 803D[D9770000]03        	cmp	byte [stopped], 3
   655 000003AE 7307                    	jnb	short tL0
   656                                  
   657 000003B0 E8F4000000              	call	checkUpdateEvents
   658 000003B5 73E7                    	jnc	short tLWait
   659                                  tL0:
   660 000003B7 EB33                    	jmp	_exitt_
   661                                  tL1:
   662 000003B9 E8C6270000              	call	updateLVI	; /set LVI != CIV/
   663 000003BE 74F7                    	jz	short tL0
   664                                  
   665 000003C0 E8E4000000              	call	checkUpdateEvents
   666 000003C5 72F0                    	jc	short tL0
   667                                  
   668 000003C7 803D[D9770000]00        	cmp	byte [stopped], 0
   669 000003CE 77D7                    	ja	short tLWait@
   670                                  
   671 000003D0 E89F270000              	call	getCurrentIndex
   672 000003D5 A801                    	test	al, BIT0
   673 000003D7 74E0                    	jz	short tL1	; loop if buffer 2 is not playing
   674                                  
   675                                  	; load buffer 1
   676 000003D9 BF[00A00000]            	mov     edi, WAV_BUFFER_1
   677 000003DE 893D[F8810000]          	mov	[audio_buffer], edi
   678 000003E4 FF15[E0810000]          	call	dword [loadfromwavfile]
   679 000003EA 7306                    	jnc	short tL2
   680                                  
   681                                  	; end of file
   682                                  _exitt_:
   683                                  	; Stop Playing
   684 000003EC E8F9260000              	call	ac97_stop
   685 000003F1 C3                      	retn
   686                                  tL2:
   687 000003F2 A1[EC810000]            	mov	eax, [count]
   688 000003F7 0105[F0810000]          	add	[LoadedDataBytes], eax
   689                                  tL3:
   690 000003FD E882270000              	call    updateLVI
   691 00000402 74E8                    	jz	short _exitt_
   692                                  
   693 00000404 E8A0000000              	call	checkUpdateEvents
   694 00000409 72E1                    	jc	short _exitt_
   695                                  
   696 0000040B 803D[D9770000]00        	cmp	byte [stopped], 0
   697 00000412 7793                    	ja	short tLWait@
   698                                  
   699 00000414 E85B270000              	call    getCurrentIndex
   700 00000419 A801                    	test	al, BIT0
   701 0000041B 75E0                    	jnz	short tL3	; loop if buffer 1 is not playing
   702                                  
   703                                  	; load buffer 2
   704 0000041D BF[00D00000]            	mov     edi, WAV_BUFFER_2
   705 00000422 893D[F8810000]          	mov	[audio_buffer], edi
   706 00000428 FF15[E0810000]          	call	dword [loadfromwavfile]
   707 0000042E 72BC                    	jc	short _exitt_
   708                                  
   709 00000430 A1[EC810000]            	mov	eax, [count]
   710 00000435 0105[F0810000]          	add	[LoadedDataBytes], eax
   711                                  
   712 0000043B E95EFFFFFF              	jmp	tLWait
   713                                  
   714                                  ; ----------------------------------------------------------------------------
   715                                  
   716                                  	; 10/02/2025
   717                                  	; 09/02/2025
   718                                  SB16_TuneLoop:
   719                                  ;TuneLoop:
   720                                  .tLWait:
   721 00000440 803D[D9770000]00        	cmp	byte [stopped], 0
   722 00000447 760D                    	jna	short .tL2
   723                                  .tL1:
   724 00000449 E85B000000              	call	checkUpdateEvents
   725 0000044E 73F0                    	jnc	short .tLWait
   726                                  ._exit_:
   727 00000450 E8991F0000              	call	sb16_stop
   728 00000455 C3                      	retn
   729                                  .tL2:
   730                                  	; Check SB 16 interrupt status
   731 00000456 803D[D7770000]00        	cmp	byte [IRQnum], 0
   732 0000045D 76EA                    	jna	short .tL1
   733                                  
   734                                  	;;;;
   735                                  	; 10/02/2025
   736 0000045F 668B15[D2770000]        	mov 	dx, [audio_io_base]
   737 00000466 80C20E                  	add	dl, 0Eh ; 8bit DMA-mode int ack
   738                                  	;in	al, dx
   739 00000469 B400                    	mov	ah, 0 ; inb
   740 0000046B CD34                    	int	34h
   741 0000046D 42                      	inc	edx ; 0Fh ; 16bit DMA-mode int ack
   742                                  	;in	al, dx	; SB 16 acknowledge.
   743 0000046E B400                    	mov	ah, 0 ; inb
   744 00000470 CD34                    	int	34h
   745                                  	;;;;
   746                                  
   747 00000472 8035[30770000]01        	xor	byte [half_buffer], 1
   748                                  
   749 00000479 C605[D7770000]00        	mov	byte [IRQnum], 0
   750                                  
   751                                  	; load buffer 1
   752 00000480 BF[00000200]            	mov	edi, dma_buffer  ; wav_buffer1
   753 00000485 803D[30770000]00        	cmp	byte [half_buffer], 0
   754 0000048C 7606                    	jna	short .tL3
   755                                  
   756                                  	; load buffer 2
   757 0000048E 033D[E4810000]          	add	edi, [loadsize]
   758                                  .tL3:
   759 00000494 E8A9010000              	call	SB16_LoadFromFile
   760 00000499 72B5                    	jc	short ._exit_	; end of file
   761                                  
   762 0000049B A1[EC810000]            	mov	eax, [count]
   763 000004A0 0105[F0810000]          	add	[LoadedDataBytes], eax
   764                                  
   765 000004A6 EBA1                    	jmp	short .tL1
   766                                  
   767                                  ;=============================================================================
   768                                  ;
   769                                  ;=============================================================================
   770                                  
   771                                  c4ue_ok:
   772 000004A8 C3                      	retn
   773                                  
   774                                  	; 10/02/2025
   775                                  	; 09/02/2025
   776                                  checkUpdateEvents:
   777 000004A9 E88E000000              	call	check4keyboardstop
   778 000004AE 72F8                    	jc	short c4ue_ok
   779                                  
   780 000004B0 50                      	push	eax ; *
   781 000004B1 09C0                    	or	eax, eax
   782 000004B3 7458                    	jz	short c4ue_cpt
   783                                  
   784 000004B5 3C20                    	cmp	al, 20h ; SPACE (spacebar) ; pause/play
   785 000004B7 752C                    	jne	short c4ue_chk_s
   786 000004B9 803D[D9770000]00        	cmp	byte [stopped], 0
   787 000004C0 7707                    	ja	short c4ue_chk_ps
   788                                  
   789 000004C2 E83C260000              	call	audio_pause
   790                                  
   791 000004C7 EB44                    	jmp	short c4ue_cpt
   792                                  
   793                                  c4ue_chk_ps:
   794 000004C9 803D[D9770000]01        	cmp	byte [stopped], 1
   795 000004D0 7707                    	ja	short c4ue_replay
   796                                  
   797                                  	; continue to play (after a pause)
   798 000004D2 E843260000              	call	audio_play
   799                                  
   800 000004D7 EB34                    	jmp	short c4ue_cpt
   801                                  
   802                                  c4ue_replay:
   803 000004D9 58                      	pop	eax ; *
   804 000004DA 58                      	pop	eax ; return address
   805                                  
   806 000004DB E835010000              	call	move_to_beginning
   807                                  
   808                                  	;mov	byte [stopped], 0
   809                                  
   810 000004E0 E924FEFFFF              	jmp	PlayWav
   811                                  
   812                                  c4ue_chk_s:
   813 000004E5 3C53                    	cmp	al, 'S'	; stop
   814 000004E7 7510                    	jne	short c4ue_chk_fb
   815 000004E9 803D[D9770000]00        	cmp	byte [stopped], 0
   816 000004F0 771B                    	ja	c4ue_cpt ; Already stopped/paused
   817                                  
   818 000004F2 E8E5250000              	call	audio_stop
   819                                  
   820 000004F7 EB14                    	jmp	short c4ue_cpt
   821                                  
   822                                  c4ue_chk_fb:
   823 000004F9 3C46                    	cmp	al, 'F'
   824 000004FB 7507                    	jne	short c4ue_chk_b
   825 000004FD E8EB000000              	call 	move_forward
   826 00000502 EB09                    	jmp	short c4ue_cpt
   827                                  
   828                                  c4ue_chk_b:
   829 00000504 3C42                    	cmp	al, 'B'
   830 00000506 7505                    	jne	short c4ue_cpt
   831                                  
   832 00000508 E8E0000000              	call 	move_backward
   833                                  
   834                                  c4ue_cpt:
   835 0000050D 59                      	pop	ecx ; *
   836                                  
   837                                  	sys	_time, 4 ; get timer ticks (18.2 ticks/second)
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000050E BB04000000          <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000513 B80D000000          <1>  mov eax, %1
    96                              <1> 
    97 00000518 CD40                <1>  int 40h
   838                                  
   839 0000051A 3B05[F4810000]          	cmp	eax, [timerticks]
   840 00000520 7407                    	je	short c4ue_skip_utt
   841                                  c4ue_utt:
   842 00000522 A3[F4810000]            	mov	[timerticks], eax
   843 00000527 EB05                    	jmp	short c4ue_cpt_@
   844                                  
   845                                  c4ue_skip_utt:
   846 00000529 21C9                    	and	ecx, ecx
   847 0000052B 7401                    	jz	short c4ue_cpt_@
   848                                  c4ue_vb_ok:
   849 0000052D C3                      	retn
   850                                  
   851                                  c4ue_cpt_@:
   852 0000052E 803D[D9770000]00        	cmp	byte [stopped], 0
   853 00000535 77F6                    	ja	short c4ue_vb_ok
   854                                  
   855 00000537 E9AC290000              	jmp	drawscopes
   856                                  
   857                                  ;=============================================================================
   858                                  ;
   859                                  ;=============================================================================
   860                                  
   861                                  	; 09/02/2025
   862                                  check4keyboardstop:
   863 0000053C B401                    	mov	ah, 1	; check keyboard buffer
   864 0000053E CD32                    	int	32h	; TRDOS 386 Keyboard Interrupt
   865                                  	;clc
   866 00000540 742E                    	jz	short _cksr ; empty
   867                                  
   868 00000542 30E4                    	xor	ah, ah	; Getchar
   869 00000544 CD32                    	int	32h
   870                                  
   871                                  	;;;;
   872                                  	; 10/02/2025
   873                                  clear_keyb_buf:
   874 00000546 50                      	push	eax
   875 00000547 B401                    	mov	ah, 1	; Getchar
   876 00000549 CD32                    	int	32h
   877 0000054B 7407                    	jz	short p_0
   878 0000054D 28E4                    	sub	ah, ah
   879 0000054F CD32                    	int	32h
   880 00000551 5A                      	pop	edx
   881 00000552 EBF2                    	jmp	short clear_keyb_buf
   882                                  p_0:		
   883 00000554 58                      	pop	eax
   884                                  	;;;;
   885                                  
   886                                  	; (change PCM out volume)
   887 00000555 3C2B                    	cmp	al, '+'
   888 00000557 7508                    	jne	short p_1
   889                                  
   890 00000559 FE05[D8770000]          	inc	byte [volume]
   891 0000055F EB0A                    	jmp	short p_2
   892                                  p_1:
   893 00000561 3C2D                    	cmp	al, '-'
   894 00000563 750E                    	jne	short p_4
   895                                  
   896 00000565 FE0D[D8770000]          	dec	byte [volume]
   897                                  p_2:
   898 0000056B E81E000000              	call	SetPCMOutVolume
   899                                  _cksr:
   900 00000570 31C0                    	xor	eax, eax
   901                                  p_3:
   902 00000572 C3                      	retn
   903                                  p_4:
   904 00000573 80FC01                  	cmp	ah, 01h  ; ESC
   905 00000576 7414                        	je	short p_quit
   906 00000578 3C03                    	cmp	al, 03h  ; CTRL+C
   907 0000057A 7410                    	je	short p_quit
   908                                  
   909 0000057C 3C20                    	cmp	al, 20h
   910 0000057E 74F2                    	je	short p_3
   911                                  
   912 00000580 3C0D                    	cmp	al, 0Dh ; CR/ENTER
   913 00000582 74EE                    	je	short p_3
   914                                  
   915 00000584 24DF                    	and	al, 0DFh
   916                                  
   917 00000586 3C51                    	cmp	al, 'Q'
   918 00000588 7402                    	je	short p_quit
   919                                  
   920 0000058A F8                      	clc
   921 0000058B C3                      	retn
   922                                  
   923                                  p_quit:
   924 0000058C F9                      	stc
   925 0000058D C3                      	retn
   926                                  
   927                                  ;-----------------------------------------------------------------------------
   928                                  ;
   929                                  ;-----------------------------------------------------------------------------
   930                                  
   931                                  	; 09/02/2025
   932                                  SetPCMOutVolume:
   933 0000058E 803D[D6770000]01        	cmp	byte [audio_hardware], 1
   934 00000595 7428                    	je	short sb16_set_volume
   935                                  
   936                                  ;-----------------------------------------------------------------------------
   937                                  
   938                                  ac97_set_volume:
   939 00000597 A0[D8770000]            	mov	al, [volume]
   940 0000059C B41F                    	mov	ah, 31
   941 0000059E 38E0                    	cmp	al, ah ; 31
   942 000005A0 7607                    	jna	short _ac97sv_@
   943 000005A2 88E0                    	mov	al, ah
   944 000005A4 A2[D8770000]            	mov	[volume], al ; max = 31, min = 0
   945                                  _ac97sv_@:
   946                                  	; max = 0, min = 31
   947 000005A9 28C4                    	sub	ah, al
   948 000005AB 88E0                    	mov	al, ah
   949 000005AD 668B15[D2770000]        	mov	dx, [NAMBAR]
   950                                    	;add	dx, CODEC_MASTER_VOL_REG
   951 000005B4 6683C218                	add	dx, CODEC_PCM_OUT_REG
   952                                  	;out	dx, ax
   953 000005B8 89C3                    	mov	ebx, eax
   954 000005BA B403                    	mov	ah, 3	; write port, word
   955 000005BC CD34                    	int	34h	; TRDOS 386 IOCTL interrupt
   956 000005BE C3                      	retn
   957                                  
   958                                  ;-----------------------------------------------------------------------------
   959                                  
   960                                  sb16_set_volume:
   961 000005BF A0[D8770000]            	mov	al, [volume]
   962 000005C4 B40F                    	mov	ah, 15
   963 000005C6 38E0                    	cmp	al, ah ; 15
   964 000005C8 7607                    	jna	short _sb16sv_@
   965 000005CA 88E0                    	mov	al, ah
   966 000005CC A2[D8770000]            	mov	[volume], al ; max = 15, min = 0
   967                                  _sb16sv_@:
   968                                  	; al = sound volume (15 = max, 0 = min)
   969 000005D1 50                      	push	eax
   970                                  	; Tell the SB 16 card which register to write
   971 000005D2 668B15[D2770000]        	mov	dx, [audio_io_base]
   972                                  	;add	dx, 4 ; Mixer chip address port
   973 000005D9 80C204                  	add	dl, 4
   974 000005DC B022                    	mov	al, 22h
   975                                  	;out	dx, al
   976 000005DE B401                    	mov	ah, 1	; write port, byte
   977 000005E0 CD34                    	int	34h	; TRDOS 386 IOCTL interrupt
   978                                  
   979 000005E2 58                      	pop	eax
   980                                  	;and	al, 0Fh
   981                                  	; Set the volume for both L and R
   982 000005E3 B311                    	mov	bl, 11h
   983 000005E5 F6E3                    	mul	bl
   984                                  	; Set new volume
   985                                  	;mov	dx, [audio_io_base]
   986                                  	;;add	dx, 5
   987                                  	;add	dl, 5
   988                                  	; 10/02/2025
   989 000005E7 42                      	inc	edx
   990                                  	;out	dx, al
   991 000005E8 B401                    	mov	ah, 1	; outb
   992 000005EA CD34                    	int	34h
   993 000005EC C3                      	retn
   994                                  
   995                                  ;=============================================================================
   996                                  ; 09/02/2025 - change song (wave file) play position
   997                                  ;=============================================================================
   998                                  
   999                                  move_backward:
  1000                                  move_forward:
  1001                                  	;; In order to go backwards 5 seconds:
  1002                                  	;; Update file pointer to the beginning, skip headers
  1003 000005ED 88C1                    	mov	cl, al ; 'B' or 'F'
  1004                                  
  1005                                  move_backward_or_forward:
  1006                                  	; (Ref: player.asm, Matan Alfasi, 2017)
  1007                                    
  1008 000005EF B805000000              	mov	eax, 5
  1009 000005F4 0FB71D[68770000]        	movzx	ebx, word [WAVE_BlockAlign]
  1010 000005FB F7E3                    	mul	ebx
  1011 000005FD 668B1D[60770000]        	mov	bx, [WAVE_SampleRate]
  1012 00000604 F7E3                    	mul	ebx
  1013                                  	; eax = transfer byte count for 5 seconds
  1014                                  
  1015 00000606 80F942                  	cmp	cl, 'B'
  1016 00000609 8B0D[F0810000]          	mov	ecx, [LoadedDataBytes]
  1017 0000060F 7508                    	jne	short move_fw ; cl = 'F'
  1018                                  move_bw:
  1019 00000611 29C1                    	sub	ecx, eax
  1020 00000613 7314                    	jnc	short move_file_pointer
  1021                                  move_to_beginning:
  1022 00000615 31C9                    	xor	ecx, ecx ; 0
  1023 00000617 EB10                    	jmp	short move_file_pointer
  1024                                  move_fw: 
  1025 00000619 01C1                    	add	ecx, eax
  1026 0000061B 720A                    	jc	short move_to_end
  1027 0000061D 8B1D[70770000]          	mov	ebx, [DATA_SubchunkSize]
  1028 00000623 39D9                    	cmp	ecx, ebx
  1029 00000625 7602                    	jna	short move_file_pointer
  1030                                  move_to_end:
  1031 00000627 89D9                    	mov	ecx, ebx
  1032                                  move_file_pointer:
  1033 00000629 890D[F0810000]          	mov	[LoadedDataBytes], ecx
  1034 0000062F 83C12C                  	add	ecx, 44 ; + header
  1035                                  
  1036                                  	; seek
  1037 00000632 31D2                    	xor	edx, edx ; offset from beginning of the file
  1038                                  	; ecx = offset	
  1039                                  	; ebx = file handle
  1040                                  	; edx = 0
  1041                                  	sys	_seek, [FileHandle]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000634 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000063A B813000000          <1>  mov eax, %1
    96                              <1> 
    97 0000063F CD40                <1>  int 40h
  1042                                  
  1043 00000641 C3                      	retn
  1044                                  
  1045                                  ;=============================================================================
  1046                                  ; Wave Data Loading procedure for Sound Blaster 16 (there is not a conversion)
  1047                                  ;=============================================================================
  1048                                  
  1049                                  	; 09/02/2025
  1050                                  SB16_LoadFromFile:
  1051 00000642 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1052                                  					; last of the file?
  1053 00000649 7402                    	jz	short sblff_0		; no
  1054 0000064B F9                      	stc
  1055 0000064C C3                      	retn
  1056                                  
  1057                                  sblff_0:
  1058                                  	; edi = audio buffer address
  1059                                  
  1060                                  	; load/read file
  1061                                  	; --------------
  1062                                  	; ebx = file handle
  1063                                  	; ecx = buffer
  1064                                  	; edx = read count
  1065                                  
  1066                                  	sys 	_read, [FileHandle], edi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000064D 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000653 89F9                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000655 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000065B B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000660 CD40                <1>  int 40h
  1067 00000662 721A                    	jc	short sblff_2 ; error !
  1068                                  
  1069 00000664 A3[EC810000]            	mov	[count], eax
  1070                                  
  1071 00000669 39D0                    	cmp	eax, edx
  1072 0000066B 7410                    	je	short _endLFF
  1073                                  
  1074                                  	; edi = buffer address
  1075 0000066D 01C7                    	add	edi, eax
  1076                                  sblff_1:
  1077 0000066F 89D1                    	mov	ecx, edx
  1078 00000671 E80C000000              	call    sb_padfill		; blank pad the remainder
  1079                                          ;clc				; don't exit with CY yet.
  1080 00000676 800D[C9770000]01                or	byte [flags], ENDOFFILE	; end of file flag
  1081                                  	; 07/02/2025
  1082                                  	;cmp	word [count], 1
  1083                                  _endLFF:
  1084 0000067D C3                              retn
  1085                                  
  1086                                  sblff_2:
  1087 0000067E 31C0                    	xor	eax, eax
  1088 00000680 EBED                    	jmp	short sblff_1
  1089                                  
  1090                                  ;-----------------------------------------------------------------------------
  1091                                  
  1092                                  sb_padfill:
  1093                                  	; edi = offset (to be filled with ZEROs)
  1094                                  	; eax = number of bytes loaded
  1095                                  	; ecx = buffer size (> loaded bytes)
  1096 00000682 29C1                    	sub	ecx, eax
  1097 00000684 31C0                    	xor	eax, eax
  1098 00000686 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  1099 0000068D 7702                    	ja	short padfill@
  1100 0000068F B080                    	mov	al, 80h
  1101                                  padfill@:
  1102 00000691 F3AA                    	rep	stosb
  1103 00000693 C3                      	retn
  1104                                  
  1105                                  ;=============================================================================
  1106                                  ; AC97 procedures - load and convert sound data
  1107                                  ;=============================================================================
  1108                                  
  1109                                  	; 09/02/2025
  1110                                  
  1111                                  ;-----------------------------------------------------------------------------
  1112                                  ; /////
  1113                                  ;-----------------------------------------------------------------------------
  1114                                  
  1115                                  	; 05/02/2025 - ac97play.s
  1116                                  loadFromFile:
  1117 00000694 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1118                                  					; last of the file?
  1119 0000069B 7402                    	jz	short lff_0		; no
  1120 0000069D F9                      	stc
  1121 0000069E C3                      	retn
  1122                                  
  1123                                  lff_0:
  1124                                  	; edi = audio buffer address
  1125                                  
  1126 0000069F 803D[C8770000]00        	cmp	byte [fbs_shift], 0
  1127 000006A6 7675                    	jna	short lff_1 ; stereo, 16 bit
  1128                                  
  1129                                  lff_2:
  1130                                  	;; fbs_shift =
  1131                                  	;;	2 for mono and 8 bit sample (multiplier = 4)
  1132                                  	;;	1 for mono or 8 bit sample (multiplier = 2)
  1133                                  	;;;;;;	0 for stereo and 16 bit sample (multiplier = 1)
  1134                                  	
  1135 000006A8 BE[00000200]            	mov	esi, temp_buffer 
  1136                                  
  1137                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000006AD 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000006B3 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000006B5 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000006BB B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000006C0 CD40                <1>  int 40h
  1138 000006C2 0F8286000000            	jc	lff_4 ; error !
  1139                                  
  1140 000006C8 A3[EC810000]            	mov	[count], eax
  1141                                  
  1142 000006CD 21C0                    	and	eax, eax
  1143 000006CF 747F                    	jz	lff_10
  1144                                  
  1145 000006D1 8A1D[C8770000]          	mov	bl, [fbs_shift]
  1146                                  
  1147 000006D7 89FA                    	mov	edx, edi ; audio buffer start address
  1148                                  
  1149 000006D9 89C1                    	mov	ecx, eax
  1150 000006DB 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8 ; bits per sample (8 or 16)
  1151 000006E2 751E                    	jne	short lff_7 ; 16 bit samples
  1152                                  	; 8 bit samples
  1153 000006E4 FECB                    	dec	bl  ; shift count, 1 = stereo, 2 = mono
  1154 000006E6 740E                    	jz	short lff_6 ; 8 bit, stereo
  1155                                  lff_5:
  1156                                  	; mono & 8 bit
  1157 000006E8 AC                      	lodsb
  1158 000006E9 2C80                    	sub	al, 80h
  1159 000006EB C1E008                  	shl	eax, 8 ; convert 8 bit sample to 16 bit sample
  1160 000006EE 66AB                    	stosw	; left channel
  1161 000006F0 66AB                    	stosw	; right channel
  1162 000006F2 E2F4                    	loop	lff_5
  1163 000006F4 EB16                    	jmp	short lff_9	
  1164                                  lff_6:
  1165                                  	; stereo & 8 bit
  1166 000006F6 AC                      	lodsb
  1167 000006F7 2C80                    	sub	al, 80h
  1168 000006F9 C1E008                  	shl	eax, 8 ; convert 8 bit sample to 16 bit sample
  1169 000006FC 66AB                    	stosw
  1170 000006FE E2F6                    	loop	lff_6			
  1171 00000700 EB0A                    	jmp	short lff_9
  1172                                  lff_7:
  1173 00000702 D1E9                    	shr	ecx, 1 ; word count
  1174                                  lff_8:
  1175 00000704 66AD                    	lodsw
  1176 00000706 66AB                    	stosw	; left channel
  1177 00000708 66AB                    	stosw	; right channel
  1178 0000070A E2F8                    	loop	lff_8
  1179                                  lff_9:
  1180 0000070C 89F8                    	mov	eax, edi
  1181 0000070E 8B0D[E8810000]          	mov	ecx, [buffersize] ; words
  1182 00000714 D1E1                    	shl	ecx, 1 ; bytes
  1183 00000716 01D1                    	add	ecx, edx ; + buffer start address
  1184 00000718 39C8                    	cmp	eax, ecx
  1185 0000071A 7225                    	jb	short lff_3
  1186 0000071C C3                      	retn
  1187                                  
  1188                                  lff_1:  
  1189                                  	; edi = audio buffer address
  1190                                  
  1191                                  	; load/read file
  1192                                  	; --------------
  1193                                  	; ebx = file handle
  1194                                  	; ecx = buffer
  1195                                  	; edx = read count
  1196                                  
  1197                                  	sys 	_read, [FileHandle], edi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000071D 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000723 89F9                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000725 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000072B B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000730 CD40                <1>  int 40h
  1198 00000732 721A                    	jc	short lff_4 ; error !
  1199                                  
  1200 00000734 A3[EC810000]            	mov	[count], eax
  1201                                  
  1202 00000739 39D0                    	cmp	eax, edx
  1203 0000073B 7410                    	je	short endLFF
  1204                                  
  1205 0000073D 01C7                    	add	edi, eax
  1206                                  
  1207 0000073F 89D1                    	mov	ecx, edx
  1208                                  lff_3:
  1209 00000741 E814000000              	call    padfill			; blank pad the remainder
  1210                                          ;clc				; don't exit with CY yet.
  1211 00000746 800D[C9770000]01                or	byte [flags], ENDOFFILE	; end of file flag
  1212                                  endLFF:
  1213 0000074D C3                              retn
  1214                                  lff_4:
  1215 0000074E 31C0                    	xor	eax, eax
  1216                                  lff_10:
  1217 00000750 8B0D[E8810000]          	mov	ecx, [buffersize] ; samples
  1218 00000756 D1E1                    	shl	ecx, 1	; bytes
  1219 00000758 EBE7                    	jmp	short lff_3
  1220                                  
  1221                                  ;-----------------------------------------------------------------------------
  1222                                  
  1223                                  padfill:
  1224                                  	; edi = offset (to be filled with ZEROs)
  1225                                  	; eax = di = number of bytes loaded
  1226                                  	; ecx = buffer size (> loaded bytes)	
  1227                                  
  1228 0000075A 29C1                    	sub	ecx, eax
  1229 0000075C 31C0                    	xor	eax, eax
  1230 0000075E F3AA                    	rep	stosb
  1231 00000760 C3                      	retn
  1232                                  
  1233                                  ;-----------------------------------------------------------------------------
  1234                                  ; interpolation procedures
  1235                                  ;-----------------------------------------------------------------------------
  1236                                  
  1237                                  ; 09/02/2025
  1238                                  ; 05/02/2025 - ac97play.s
  1239                                  ;----------------------------------------------------------------------------
  1240                                  
  1241                                  ;;Note:	At the end of every buffer load,
  1242                                  ;;	during buffer switch/swap, there will be discontinuity
  1243                                  ;;	between the last converted sample and the 1st sample
  1244                                  ;;	of the next buffer.
  1245                                  ;;	(like as a dot noises vaguely between normal sound samples)
  1246                                  ;;	-To avoid this defect, the 1st sample of
  1247                                  ;;	the next buffer may be read from the wav file but
  1248                                  ;;	the file pointer would need to be set to 1 sample back
  1249                                  ;;	again via seek system call. Time comsumption problem! -
  1250                                  ;;
  1251                                  ;;	Erdogan Tan - 15/11/2023
  1252                                  ;;
  1253                                  ;;	((If entire wav data would be loaded at once.. conversion
  1254                                  ;;	defect/noise would disappear.. but for DOS, to keep
  1255                                  ;;	64KB buffer limit is important also it is important
  1256                                  ;;	for running under 1MB barrier without HIMEM.SYS or DPMI.
  1257                                  ;;	I have tested this program by using 2-30MB wav files.))
  1258                                  ;;
  1259                                  ;;	Test Computer:	ASUS desktop/mainboard, M2N4-SLI, 2010.
  1260                                  ;;			AMD Athlon 64 X2 2200 MHZ CPU.
  1261                                  ;;		       	NFORCE4 (CK804) AC97 audio hardware.
  1262                                  ;;			Realtek ALC850 codec.
  1263                                  ;;		       	Retro DOS v4.2 (MSDOS 6.22) operating system.
  1264                                  
  1265                                  ;-----------------------------------------------------------------------------
  1266                                  ;-----------------------------------------------------------------------------
  1267                                  
  1268                                  load_8khz_mono_8_bit:
  1269 00000761 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1270                                  					; last of the file?
  1271 00000768 7402                    	jz	short lff8m_0		; no
  1272 0000076A F9                      	stc
  1273 0000076B C3                      	retn
  1274                                  
  1275                                  lff8m_0:
  1276                                  	; edi = audio buffer address
  1277                                  
  1278 0000076C BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1279                                  
  1280                                  	; load file into memory
  1281                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000771 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000777 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000779 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000077F B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000784 CD40                <1>  int 40h
  1282 00000786 7305                    	jnc	short lff8m_6
  1283 00000788 E9A8000000              	jmp	lff8m_5  ; error !
  1284                                  
  1285                                  lff8m_6:
  1286 0000078D A3[EC810000]            	mov	[count], eax
  1287                                  
  1288 00000792 21C0                    	and	eax, eax
  1289 00000794 0F849B000000            	jz	lff8_eof
  1290                                  
  1291 0000079A 89C1                    	mov	ecx, eax	; byte count
  1292                                  lff8m_1:
  1293 0000079C AC                      	lodsb
  1294 0000079D A2[D31E0000]            	mov	[previous_val], al
  1295 000007A2 2C80                    	sub	al, 80h
  1296 000007A4 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  1297 000007A8 66AB                    	stosw		; original sample (left channel)
  1298 000007AA 66AB                    	stosw		; original sample (right channel)
  1299                                  	;xor	eax, eax
  1300 000007AC 8A06                    	mov	al, [esi]
  1301 000007AE 49                      	dec	ecx
  1302 000007AF 7502                    	jnz	short lff8m_2
  1303 000007B1 B080                    	mov	al, 80h
  1304                                  lff8m_2:
  1305                                  	;mov	[next_val], ax
  1306 000007B3 88C7                    	mov	bh, al	; [next_val]
  1307 000007B5 8A25[D31E0000]          	mov	ah, [previous_val]
  1308 000007BB 00E0                    	add	al, ah	; [previous_val]
  1309 000007BD D0D8                    	rcr	al, 1
  1310 000007BF 88C2                    	mov	dl, al	; this is interpolated middle (3th) sample
  1311 000007C1 00E0                    	add	al, ah	; [previous_val]
  1312 000007C3 D0D8                    	rcr	al, 1	
  1313 000007C5 88C3                    	mov	bl, al 	; this is temporary interpolation value
  1314 000007C7 00E0                    	add	al, ah	; [previous_val]
  1315 000007C9 D0D8                    	rcr	al, 1
  1316 000007CB 2C80                    	sub	al, 80h
  1317 000007CD 66C1E008                	shl	ax, 8
  1318 000007D1 66AB                    	stosw		; this is 1st interpolated sample (L)
  1319 000007D3 66AB                    	stosw		; this is 1st interpolated sample (R)
  1320 000007D5 88D8                    	mov	al, bl
  1321 000007D7 00D0                    	add	al, dl
  1322 000007D9 D0D8                    	rcr	al, 1
  1323 000007DB 2C80                    	sub	al, 80h
  1324 000007DD 66C1E008                	shl	ax, 8
  1325 000007E1 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1326 000007E3 66AB                    	stosw		; this is 2nd interpolated sample (R)
  1327 000007E5 88D0                    	mov	al, dl
  1328 000007E7 2C80                    	sub	al, 80h
  1329 000007E9 66C1E008                	shl	ax, 8
  1330 000007ED 66AB                    	stosw		; this is middle (3th) interpolated sample (L)
  1331 000007EF 66AB                    	stosw		; this is middle (3th) interpolated sample (R)
  1332                                  	;mov	al, [next_val]
  1333 000007F1 88F8                    	mov	al, bh
  1334 000007F3 00D0                    	add	al, dl
  1335 000007F5 D0D8                    	rcr	al, 1
  1336 000007F7 88C3                    	mov	bl, al	; this is temporary interpolation value
  1337 000007F9 00D0                    	add	al, dl
  1338 000007FB D0D8                    	rcr	al, 1
  1339 000007FD 2C80                    	sub	al, 80h
  1340 000007FF 66C1E008                	shl	ax, 8
  1341 00000803 66AB                    	stosw		; this is 4th interpolated sample (L)
  1342 00000805 66AB                    	stosw		; this is 4th interpolated sample (R)
  1343                                  	;mov	al, [next_val]
  1344 00000807 88F8                    	mov	al, bh
  1345 00000809 00D8                    	add	al, bl
  1346 0000080B D0D8                    	rcr	al, 1
  1347 0000080D 2C80                    	sub	al, 80h
  1348 0000080F 66C1E008                	shl	ax, 8
  1349 00000813 66AB                    	stosw		; this is 5th interpolated sample (L)
  1350 00000815 66AB                    	stosw		; this is 5th interpolated sample (R)
  1351                                  	; 8 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  1352 00000817 09C9                    	or	ecx, ecx
  1353 00000819 7581                    	jnz	short lff8m_1
  1354                                  
  1355                                  	; --------------
  1356                                  
  1357                                  lff8s_3:
  1358                                  lff8m_3:
  1359                                  lff8s2_3:
  1360                                  lff8m2_3:
  1361                                  lff16s_3:
  1362                                  lff16m_3:
  1363                                  lff16s2_3:
  1364                                  lff16m2_3:
  1365                                  lff24_3:
  1366                                  lff32_3:
  1367                                  lff44_3:
  1368                                  lff22_3:
  1369                                  lff11_3:
  1370                                  lff12_3:
  1371 0000081B 8B0D[E8810000]          	mov	ecx, [buffersize] ; buffer size in words
  1372 00000821 D1E1                    	shl	ecx, 1 ; buffer size in bytes
  1373 00000823 030D[F8810000]          	add	ecx, [audio_buffer]
  1374 00000829 29F9                    	sub	ecx, edi
  1375 0000082B 7607                    	jna	short lff8m_4
  1376                                  	;inc	ecx
  1377 0000082D C1E902                  	shr	ecx, 2
  1378 00000830 31C0                    	xor	eax, eax ; fill (remain part of) buffer with zeros
  1379 00000832 F3AB                    	rep	stosd
  1380                                  lff8m_4:
  1381                                  	;clc
  1382 00000834 C3                      	retn
  1383                                  
  1384                                  lff8s_5:
  1385                                  lff8m_5:
  1386                                  lff8s2_5:
  1387                                  lff8m2_5:
  1388                                  lff16s_5:
  1389                                  lff16m_5:
  1390                                  lff16s2_5:
  1391                                  lff16m2_5:
  1392                                  lff24_5:
  1393                                  lff32_5:
  1394                                  lff44_5:
  1395                                  lff22_5:
  1396                                  lff11_5:
  1397                                  lff12_5:
  1398                                  
  1399                                  lff8_eof:
  1400                                  lff16_eof:
  1401                                  lff24_eof:
  1402                                  lff32_eof:
  1403                                  lff44_eof:
  1404                                  lff22_eof:
  1405                                  lff11_eof:
  1406                                  lff12_eof:
  1407 00000835 C605[C9770000]01        	mov	byte [flags], ENDOFFILE
  1408 0000083C EBDD                    	jmp	short lff8m_3
  1409                                  
  1410                                  ;----------------------------------------------------------------------------
  1411                                  
  1412                                  load_8khz_stereo_8_bit:
  1413 0000083E F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1414                                  					; last of the file?
  1415 00000845 7402                    	jz	short lff8s_0		; no
  1416 00000847 F9                      	stc
  1417 00000848 C3                      	retn
  1418                                  
  1419                                  lff8s_0:
  1420                                  	; edi = audio buffer address
  1421                                  
  1422 00000849 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1423                                  
  1424                                  	; load file into memory
  1425                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000084E 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000854 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000856 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000085C B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000861 CD40                <1>  int 40h
  1426 00000863 72D0                    	jc	short lff8s_5 ; error !
  1427                                  
  1428 00000865 A3[EC810000]            	mov	[count], eax
  1429                                  
  1430 0000086A D1E8                    	shr	eax, 1
  1431 0000086C 74C7                    	jz	short lff8_eof
  1432                                  
  1433 0000086E 89C1                    	mov	ecx, eax	; word count
  1434                                  lff8s_1:
  1435 00000870 AC                      	lodsb
  1436 00000871 A2[D31E0000]            	mov	[previous_val_l], al
  1437 00000876 2C80                    	sub	al, 80h
  1438 00000878 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  1439 0000087C 66AB                    	stosw		; original sample (L)
  1440 0000087E AC                      	lodsb
  1441 0000087F A2[D51E0000]            	mov	[previous_val_r], al
  1442 00000884 2C80                    	sub	al, 80h
  1443 00000886 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  1444 0000088A 66AB                    	stosw		; original sample (R)
  1445                                  
  1446                                  	;xor	eax, eax
  1447 0000088C 668B06                  	mov	ax, [esi]
  1448 0000088F 49                      	dec	ecx
  1449 00000890 7504                    	jnz	short lff8s_2
  1450                                  		; convert 8 bit sample to 16 bit sample
  1451 00000892 66B88080                	mov	ax, 8080h
  1452                                  lff8s_2:
  1453 00000896 A2[D71E0000]            	mov	[next_val_l], al
  1454 0000089B 8825[D91E0000]          	mov	[next_val_r], ah
  1455 000008A1 8A25[D31E0000]          	mov	ah, [previous_val_l]
  1456 000008A7 00E0                    	add	al, ah
  1457 000008A9 D0D8                    	rcr	al, 1
  1458 000008AB 88C2                    	mov	dl, al	; this is interpolated middle (3th) sample (L)
  1459 000008AD 00E0                    	add	al, ah
  1460 000008AF D0D8                    	rcr	al, 1	
  1461 000008B1 88C3                    	mov	bl, al	; this is temporary interpolation value (L)
  1462 000008B3 00E0                    	add	al, ah
  1463 000008B5 D0D8                    	rcr	al, 1
  1464 000008B7 2C80                    	sub	al, 80h
  1465 000008B9 66C1E008                	shl	ax, 8
  1466 000008BD 66AB                    	stosw		; this is 1st interpolated sample (L)
  1467 000008BF A0[D91E0000]            	mov	al, [next_val_r]
  1468 000008C4 8A25[D51E0000]          	mov	ah, [previous_val_r]
  1469 000008CA 00E0                    	add	al, ah
  1470 000008CC D0D8                    	rcr	al, 1
  1471 000008CE 88C6                    	mov	dh, al	; this is interpolated middle (3th) sample (R)
  1472 000008D0 00E0                    	add	al, ah
  1473 000008D2 D0D8                    	rcr	al, 1
  1474 000008D4 88C7                    	mov	bh, al	; this is temporary interpolation value (R)
  1475 000008D6 00E0                    	add	al, ah
  1476 000008D8 D0D8                    	rcr	al, 1
  1477 000008DA 2C80                    	sub	al, 80h
  1478 000008DC 66C1E008                	shl	ax, 8
  1479 000008E0 66AB                    	stosw		; this is 1st interpolated sample (R)
  1480 000008E2 88D8                    	mov	al, bl
  1481 000008E4 00D0                    	add	al, dl
  1482 000008E6 D0D8                    	rcr	al, 1
  1483 000008E8 2C80                    	sub	al, 80h
  1484 000008EA 66C1E008                	shl	ax, 8
  1485 000008EE 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1486 000008F0 88F8                    	mov	al, bh
  1487 000008F2 00F0                    	add	al, dh
  1488 000008F4 D0D8                    	rcr	al, 1
  1489 000008F6 2C80                    	sub	al, 80h
  1490 000008F8 66C1E008                	shl	ax, 8
  1491 000008FC 66AB                    	stosw 		; this is 2nd interpolated sample (R)
  1492 000008FE 88D0                    	mov	al, dl
  1493 00000900 2C80                    	sub	al, 80h
  1494 00000902 66C1E008                	shl	ax, 8
  1495 00000906 66AB                    	stosw		; this is middle (3th) interpolated sample (L)
  1496 00000908 88F0                    	mov	al, dh
  1497 0000090A 2C80                    	sub	al, 80h
  1498 0000090C 66C1E008                	shl	ax, 8
  1499 00000910 66AB                    	stosw		; this is middle (3th) interpolated sample (R)
  1500 00000912 A0[D71E0000]            	mov	al, [next_val_l]
  1501 00000917 00D0                    	add	al, dl
  1502 00000919 D0D8                    	rcr	al, 1
  1503 0000091B 88C3                    	mov	bl, al	; this is temporary interpolation value (L)
  1504 0000091D 00D0                    	add	al, dl
  1505 0000091F D0D8                    	rcr	al, 1
  1506 00000921 2C80                    	sub	al, 80h
  1507 00000923 66C1E008                	shl	ax, 8
  1508 00000927 66AB                    	stosw		; this is 4th interpolated sample (L)
  1509 00000929 A0[D91E0000]            	mov	al, [next_val_r]
  1510 0000092E 00F0                    	add	al, dh
  1511 00000930 D0D8                    	rcr	al, 1
  1512 00000932 88C7                    	mov	bh, al	; this is temporary interpolation value (R)
  1513 00000934 00F0                    	add	al, dh
  1514 00000936 D0D8                    	rcr	al, 1
  1515 00000938 2C80                    	sub	al, 80h
  1516 0000093A 66C1E008                	shl	ax, 8
  1517 0000093E 66AB                    	stosw		; this is 4th interpolated sample (R)
  1518 00000940 A0[D71E0000]            	mov	al, [next_val_l]
  1519 00000945 00D8                    	add	al, bl
  1520 00000947 D0D8                    	rcr	al, 1
  1521 00000949 2C80                    	sub	al, 80h
  1522 0000094B 66C1E008                	shl	ax, 8
  1523 0000094F 66AB                    	stosw		; this is 5th interpolated sample (L)
  1524 00000951 A0[D91E0000]            	mov	al, [next_val_r]
  1525 00000956 00F8                    	add	al, bh
  1526 00000958 D0D8                    	rcr	al, 1
  1527 0000095A 2C80                    	sub	al, 80h
  1528 0000095C 66C1E008                	shl	ax, 8
  1529 00000960 66AB                    	stosw		; this is 5th interpolated sample (R)
  1530                                  	; 8 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  1531 00000962 E305                    	jecxz	lff8s_6
  1532 00000964 E907FFFFFF              	jmp	lff8s_1
  1533                                  lff8s_6:
  1534 00000969 E9ADFEFFFF              	jmp	lff8s_3
  1535                                  
  1536                                  ;----------------------------------------------------------------------------
  1537                                  
  1538                                  load_8khz_mono_16_bit:
  1539 0000096E F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1540                                  					; last of the file?
  1541 00000975 7402                    	jz	short lff8m2_0		; no
  1542 00000977 F9                      	stc
  1543 00000978 C3                      	retn
  1544                                  
  1545                                  lff8m2_0:
  1546                                  	; edi = audio buffer address
  1547                                  
  1548 00000979 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1549                                  
  1550                                  	; load file into memory
  1551                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000097E 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000984 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000986 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000098C B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000991 CD40                <1>  int 40h
  1552 00000993 0F82A0000000            	jc	lff8m2_7 ; error !
  1553                                  
  1554 00000999 A3[EC810000]            	mov	[count], eax
  1555                                  
  1556 0000099E D1E8                    	shr	eax, 1
  1557 000009A0 7505                    	jnz	short lff8m2_8
  1558 000009A2 E98EFEFFFF              	jmp	lff8_eof
  1559                                  
  1560                                  lff8m2_8:
  1561 000009A7 89C1                    	mov	ecx, eax	; word count
  1562                                  lff8m2_1:
  1563 000009A9 66AD                    	lodsw
  1564 000009AB 66AB                    	stosw		; original sample (left channel)
  1565 000009AD 66AB                    	stosw		; original sample (right channel)
  1566 000009AF 80C480                  	add	ah, 80h	; convert sound level to 0-65535 format
  1567 000009B2 66A3[D31E0000]          	mov	[previous_val], ax
  1568 000009B8 668B06                  	mov	ax, [esi]
  1569 000009BB 49                      	dec	ecx
  1570 000009BC 7502                    	jnz	short lff8m2_2
  1571 000009BE 31C0                    	xor	eax, eax
  1572                                  lff8m2_2:
  1573 000009C0 80C480                  	add	ah, 80h ; convert sound level to 0-65535 format
  1574 000009C3 89C5                    	mov	ebp, eax ; [next_val]
  1575 000009C5 660305[D31E0000]        	add	ax, [previous_val]
  1576 000009CC 66D1D8                  	rcr	ax, 1
  1577 000009CF 89C2                    	mov	edx, eax ; this is interpolated middle (3th) sample
  1578 000009D1 660305[D31E0000]        	add	ax, [previous_val]
  1579 000009D8 66D1D8                  	rcr	ax, 1	; this is temporary interpolation value
  1580 000009DB 89C3                    	mov	ebx, eax 		
  1581 000009DD 660305[D31E0000]        	add	ax, [previous_val]
  1582 000009E4 66D1D8                  	rcr	ax, 1
  1583 000009E7 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1584 000009EA 66AB                    	stosw		; this is 1st interpolated sample (L)
  1585 000009EC 66AB                    	stosw		; this is 1st interpolated sample (R)
  1586 000009EE 89D8                    	mov	eax, ebx
  1587 000009F0 6601D0                  	add	ax, dx
  1588 000009F3 66D1D8                  	rcr	ax, 1
  1589 000009F6 80EC80                  	sub	ah, 80h
  1590 000009F9 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1591 000009FB 66AB                    	stosw		; this is 2nd interpolated sample (R)
  1592 000009FD 89D0                    	mov	eax, edx
  1593 000009FF 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1594 00000A02 66AB                    	stosw		; this is middle (3th) interpolated sample (L)
  1595 00000A04 66AB                    	stosw		; this is middle (3th) interpolated sample (R)
  1596 00000A06 89E8                    	mov	eax, ebp
  1597 00000A08 6601D0                  	add	ax, dx
  1598 00000A0B 66D1D8                  	rcr	ax, 1
  1599 00000A0E 89C3                    	mov	ebx, eax ; this is temporary interpolation value
  1600 00000A10 6601D0                  	add	ax, dx
  1601 00000A13 66D1D8                  	rcr	ax, 1
  1602 00000A16 80EC80                  	sub	ah, 80h
  1603 00000A19 66AB                    	stosw		; this is 4th interpolated sample (L)
  1604 00000A1B 66AB                    	stosw		; this is 4th interpolated sample (R)
  1605 00000A1D 89E8                    	mov	eax, ebp
  1606 00000A1F 6601D8                  	add	ax, bx
  1607 00000A22 66D1D8                  	rcr	ax, 1
  1608 00000A25 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1609 00000A28 66AB                    	stosw		; this is 5th interpolated sample (L)
  1610 00000A2A 66AB                    	stosw		; this is 5th interpolated sample (R)
  1611                                  	; 8 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  1612 00000A2C 09C9                    	or	ecx, ecx
  1613 00000A2E 0F8575FFFFFF            	jnz	lff8m2_1
  1614 00000A34 E9E2FDFFFF              	jmp	lff8m2_3
  1615                                  
  1616                                  lff8m2_7:
  1617                                  lff8s2_7:
  1618 00000A39 E9F7FDFFFF              	jmp	lff8m2_5  ; error
  1619                                  
  1620                                  ;----------------------------------------------------------------------------
  1621                                  
  1622                                  load_8khz_stereo_16_bit:
  1623 00000A3E F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1624                                  					; last of the file?
  1625 00000A45 7402                    	jz	short lff8s2_0		; no
  1626 00000A47 F9                      	stc
  1627 00000A48 C3                      	retn
  1628                                  
  1629                                  lff8s2_0:
  1630                                  	; edi = audio buffer address
  1631                                  
  1632 00000A49 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1633                                  
  1634                                  	; load file into memory
  1635                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000A4E 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000A54 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000A56 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000A5C B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000A61 CD40                <1>  int 40h
  1636 00000A63 72D4                    	jc	short lff8s2_7 ; error !
  1637                                  
  1638 00000A65 A3[EC810000]            	mov	[count], eax
  1639                                  	
  1640 00000A6A C1E802                  	shr	eax, 2
  1641 00000A6D 7505                    	jnz	short lff8s2_8
  1642 00000A6F E9C1FDFFFF              	jmp	lff8_eof
  1643                                  
  1644                                  lff8s2_8:
  1645 00000A74 89C1                    	mov	ecx, eax ; dword count
  1646                                  lff8s2_1:
  1647 00000A76 66AD                    	lodsw
  1648 00000A78 66AB                    	stosw		; original sample (L)
  1649 00000A7A 80C480                  	add	ah, 80h	; convert sound level to 0-65535 format
  1650 00000A7D 66A3[D31E0000]          	mov	[previous_val_l], ax
  1651 00000A83 66AD                    	lodsw
  1652 00000A85 66AB                    	stosw		; original sample (R)
  1653 00000A87 80C480                  	add	ah, 80h	; convert sound level to 0-65535 format
  1654 00000A8A 66A3[D51E0000]          	mov	[previous_val_r], ax
  1655 00000A90 668B06                  	mov	ax, [esi]
  1656 00000A93 668B5602                	mov	dx, [esi+2]
  1657 00000A97 49                      	dec	ecx
  1658 00000A98 7504                    	jnz	short lff8s2_2
  1659 00000A9A 31D2                    	xor	edx, edx
  1660 00000A9C 31C0                    	xor	eax, eax
  1661                                  lff8s2_2:
  1662 00000A9E 80C480                  	add	ah, 80h	; convert sound level to 0-65535 format
  1663 00000AA1 66A3[D71E0000]          	mov	[next_val_l], ax
  1664 00000AA7 80C680                  	add	dh, 80h	; convert sound level to 0-65535 format
  1665 00000AAA 668915[D91E0000]        	mov	[next_val_r], dx
  1666 00000AB1 660305[D31E0000]        	add	ax, [previous_val_l]
  1667 00000AB8 66D1D8                  	rcr	ax, 1
  1668 00000ABB 89C2                    	mov	edx, eax ; this is interpolated middle (3th) sample (L)
  1669 00000ABD 660305[D31E0000]        	add	ax, [previous_val_l]
  1670 00000AC4 66D1D8                  	rcr	ax, 1	
  1671 00000AC7 89C3                    	mov	ebx, eax ; this is temporary interpolation value (L)
  1672 00000AC9 660305[D31E0000]        	add	ax, [previous_val_l]
  1673 00000AD0 66D1D8                  	rcr	ax, 1
  1674 00000AD3 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1675 00000AD6 66AB                    	stosw		; this is 1st interpolated sample (L)
  1676 00000AD8 66A1[D91E0000]          	mov	ax, [next_val_r]
  1677 00000ADE 660305[D51E0000]        	add	ax, [previous_val_r]
  1678 00000AE5 66D1D8                  	rcr	ax, 1
  1679 00000AE8 89C5                    	mov	ebp, eax ; this is interpolated middle (3th) sample (R)
  1680 00000AEA 660305[D51E0000]        	add	ax, [previous_val_r]
  1681 00000AF1 66D1D8                  	rcr	ax, 1
  1682 00000AF4 50                      	push	eax ; *	; this is temporary interpolation value (R)
  1683 00000AF5 660305[D51E0000]        	add	ax, [previous_val_r]
  1684 00000AFC 66D1D8                  	rcr	ax, 1
  1685 00000AFF 80EC80                  	sub	ah, 80h
  1686 00000B02 66AB                    	stosw		; this is 1st interpolated sample (R)
  1687 00000B04 89D8                    	mov	eax, ebx
  1688 00000B06 6601D0                  	add	ax, dx
  1689 00000B09 66D1D8                  	rcr	ax, 1
  1690 00000B0C 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1691 00000B0F 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1692 00000B11 58                      	pop	eax ; *
  1693 00000B12 6601E8                  	add	ax, bp
  1694 00000B15 66D1D8                  	rcr	ax, 1
  1695 00000B18 80EC80                  	sub	ah, 80h
  1696 00000B1B 66AB                    	stosw 		; this is 2nd interpolated sample (R)
  1697 00000B1D 89D0                    	mov	eax, edx
  1698 00000B1F 80EC80                  	sub	ah, 80h
  1699 00000B22 66AB                    	stosw		; this is middle (3th) interpolated sample (L)
  1700 00000B24 89E8                    	mov	eax, ebp
  1701 00000B26 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1702 00000B29 66AB                    	stosw		; this is middle (3th) interpolated sample (R)
  1703 00000B2B 66A1[D71E0000]          	mov	ax, [next_val_l]
  1704 00000B31 6601D0                  	add	ax, dx
  1705 00000B34 66D1D8                  	rcr	ax, 1
  1706 00000B37 89C3                    	mov	ebx, eax ; this is temporary interpolation value (L)
  1707 00000B39 6601D0                  	add	ax, dx
  1708 00000B3C 66D1D8                  	rcr	ax, 1
  1709 00000B3F 80EC80                  	sub	ah, 80h
  1710 00000B42 66AB                    	stosw		; this is 4th interpolated sample (L)
  1711 00000B44 66A1[D91E0000]          	mov	ax, [next_val_r]
  1712 00000B4A 6601E8                  	add	ax, bp
  1713 00000B4D 66D1D8                  	rcr	ax, 1
  1714 00000B50 50                      	push	eax ; ** ; this is temporary interpolation value (R)
  1715 00000B51 6601E8                  	add	ax, bp
  1716 00000B54 66D1D8                  	rcr	ax, 1
  1717 00000B57 80EC80                  	sub	ah, 80h
  1718 00000B5A 66AB                    	stosw		; this is 4th interpolated sample (R)
  1719 00000B5C 66A1[D71E0000]          	mov	ax, [next_val_l]
  1720 00000B62 6601D8                  	add	ax, bx
  1721 00000B65 66D1D8                  	rcr	ax, 1
  1722 00000B68 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1723 00000B6B 66AB                    	stosw		; this is 5th interpolated sample (L)
  1724 00000B6D 58                      	pop	eax ; **
  1725 00000B6E 660305[D91E0000]        	add	ax, [next_val_r]
  1726 00000B75 66D1D8                  	rcr	ax, 1
  1727 00000B78 80EC80                  	sub	ah, 80h
  1728 00000B7B 66AB                    	stosw		; this is 5th interpolated sample (R)
  1729                                  	; 8 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  1730 00000B7D E305                    	jecxz	lff8_s2_9
  1731 00000B7F E9F2FEFFFF              	jmp	lff8s2_1
  1732                                  lff8_s2_9:
  1733 00000B84 E992FCFFFF              	jmp	lff8s2_3
  1734                                  
  1735                                  ;----------------------------------------------------------------------------
  1736                                  
  1737                                  load_16khz_mono_8_bit:
  1738 00000B89 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1739                                  					; last of the file?
  1740 00000B90 7402                    	jz	short lff16m_0		; no
  1741 00000B92 F9                      	stc
  1742 00000B93 C3                      	retn
  1743                                  
  1744                                  lff16m_0:
  1745                                  	; edi = audio buffer address
  1746                                  
  1747 00000B94 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1748                                  
  1749                                  	; load file into memory
  1750                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000B99 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000B9F 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000BA1 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000BA7 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000BAC CD40                <1>  int 40h
  1751 00000BAE 7253                    	jc	short lff16m_7 ; error !
  1752                                  
  1753 00000BB0 A3[EC810000]            	mov	[count], eax
  1754                                  	
  1755 00000BB5 21C0                    	and	eax, eax
  1756 00000BB7 7505                    	jnz	short lff16m_8
  1757 00000BB9 E977FCFFFF              	jmp	lff16_eof
  1758                                  
  1759                                  lff16m_8:
  1760 00000BBE 89C1                    	mov	ecx, eax		; byte count
  1761                                  lff16m_1:
  1762 00000BC0 AC                      	lodsb
  1763                                  	;mov	[previous_val], al
  1764 00000BC1 88C3                    	mov	bl, al
  1765 00000BC3 2C80                    	sub	al, 80h
  1766 00000BC5 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  1767 00000BC9 66AB                    	stosw		; original sample (left channel)
  1768 00000BCB 66AB                    	stosw		; original sample (right channel)
  1769                                  	;xor	eax, eax
  1770 00000BCD 8A06                    	mov	al, [esi]
  1771 00000BCF 49                      	dec	ecx
  1772 00000BD0 7502                    	jnz	short lff16m_2
  1773 00000BD2 B080                    	mov	al, 80h
  1774                                  lff16m_2:
  1775                                  	;mov	[next_val], al
  1776 00000BD4 88C7                    	mov	bh, al
  1777                                  	;add	al, [previous_val]
  1778 00000BD6 00D8                    	add	al, bl
  1779 00000BD8 D0D8                    	rcr	al, 1
  1780 00000BDA 88C2                    	mov	dl, al	; this is interpolated middle (temp) sample
  1781                                  	;add	al, [previous_val]
  1782 00000BDC 00D8                    	add	al, bl
  1783 00000BDE D0D8                    	rcr	al, 1
  1784 00000BE0 2C80                    	sub	al, 80h
  1785 00000BE2 66C1E008                	shl	ax, 8
  1786 00000BE6 66AB                    	stosw		; this is 1st interpolated sample (L)
  1787 00000BE8 66AB                    	stosw		; this is 1st interpolated sample (R)
  1788                                  	;mov	al, [next_val]
  1789 00000BEA 88F8                    	mov	al, bh
  1790 00000BEC 00D0                    	add	al, dl
  1791 00000BEE D0D8                    	rcr	al, 1
  1792 00000BF0 2C80                    	sub	al, 80h
  1793 00000BF2 66C1E008                	shl	ax, 8
  1794 00000BF6 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1795 00000BF8 66AB                    	stosw		; this is 2nd interpolated sample (R)
  1796                                  	
  1797                                  	; 16 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  1798 00000BFA 09C9                    	or	ecx, ecx
  1799 00000BFC 75C2                    	jnz	short lff16m_1
  1800 00000BFE E918FCFFFF              	jmp	lff16m_3
  1801                                  
  1802                                  lff16m_7:
  1803                                  lff16s_7:
  1804 00000C03 E92DFCFFFF              	jmp	lff16m_5  ; error
  1805                                  
  1806                                  ;----------------------------------------------------------------------------
  1807                                  
  1808                                  load_16khz_stereo_8_bit:
  1809 00000C08 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1810                                  					; last of the file?
  1811 00000C0F 7402                    	jz	short lff16s_0		; no
  1812 00000C11 F9                      	stc
  1813 00000C12 C3                      	retn
  1814                                  
  1815                                  lff16s_0:
  1816                                  	; edi = audio buffer address
  1817                                  
  1818 00000C13 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1819                                  
  1820                                  	; load file into memory
  1821                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000C18 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000C1E 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000C20 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000C26 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000C2B CD40                <1>  int 40h
  1822 00000C2D 72D4                    	jc	short lff16s_7 ; error !
  1823                                  
  1824 00000C2F A3[EC810000]            	mov	[count], eax
  1825                                  
  1826 00000C34 D1E8                    	shr	eax, 1
  1827 00000C36 7505                    	jnz	short lff16s_8
  1828 00000C38 E9F8FBFFFF              	jmp	lff16_eof
  1829                                  
  1830                                  lff16s_8:
  1831 00000C3D 89C1                    	mov	ecx, eax	; word count
  1832                                  lff16s_1:
  1833 00000C3F AC                      	lodsb
  1834 00000C40 A2[D31E0000]            	mov	[previous_val_l], al
  1835 00000C45 2C80                    	sub	al, 80h
  1836 00000C47 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  1837 00000C4B 66AB                    	stosw		; original sample (L)
  1838 00000C4D AC                      	lodsb
  1839 00000C4E A2[D51E0000]            	mov	[previous_val_r], al
  1840 00000C53 2C80                    	sub	al, 80h
  1841 00000C55 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  1842 00000C59 66AB                    	stosw		; original sample (R)
  1843                                  
  1844                                  	;xor	eax, eax
  1845 00000C5B 668B06                  	mov	ax, [esi]
  1846 00000C5E 49                      	dec	ecx
  1847 00000C5F 7504                    	jnz	short lff16s_2
  1848                                  		; convert 8 bit sample to 16 bit sample
  1849 00000C61 66B88080                	mov	ax, 8080h
  1850                                  lff16s_2:
  1851                                  	;mov	[next_val_l], al
  1852                                  	;mov	[next_val_r], ah
  1853 00000C65 89C3                    	mov	ebx, eax
  1854 00000C67 0205[D31E0000]          	add	al, [previous_val_l]
  1855 00000C6D D0D8                    	rcr	al, 1
  1856 00000C6F 88C2                    	mov	dl, al	; this is temporary interpolation value (L)
  1857 00000C71 0205[D31E0000]          	add	al, [previous_val_l]
  1858 00000C77 D0D8                    	rcr	al, 1
  1859 00000C79 2C80                    	sub	al, 80h
  1860 00000C7B 66C1E008                	shl	ax, 8
  1861 00000C7F 66AB                    	stosw		; this is 1st interpolated sample (L)
  1862 00000C81 88F8                    	mov	al, bh	; [next_val_r]
  1863 00000C83 0205[D51E0000]          	add	al, [previous_val_r]
  1864 00000C89 D0D8                    	rcr	al, 1
  1865 00000C8B 88C6                    	mov	dh, al	; this is temporary interpolation value (R)
  1866 00000C8D 0205[D51E0000]          	add	al, [previous_val_r]
  1867 00000C93 D0D8                    	rcr	al, 1
  1868 00000C95 2C80                    	sub	al, 80h
  1869 00000C97 66C1E008                	shl	ax, 8
  1870 00000C9B 66AB                    	stosw		; this is 1st interpolated sample (R)
  1871 00000C9D 88D0                    	mov	al, dl
  1872 00000C9F 00D8                    	add	al, bl	; [next_val_l]
  1873 00000CA1 D0D8                    	rcr	al, 1
  1874 00000CA3 2C80                    	sub	al, 80h
  1875 00000CA5 66C1E008                	shl	ax, 8
  1876 00000CA9 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1877 00000CAB 88F0                    	mov	al, dh
  1878 00000CAD 00F8                    	add	al, bh	; [next_val_r]
  1879 00000CAF D0D8                    	rcr	al, 1
  1880 00000CB1 2C80                    	sub	al, 80h
  1881 00000CB3 66C1E008                	shl	ax, 8
  1882 00000CB7 66AB                    	stosw 		; this is 2nd interpolated sample (R)
  1883                                  	
  1884                                  	; 16 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  1885 00000CB9 09C9                    	or	ecx, ecx
  1886 00000CBB 7582                    	jnz	short lff16s_1
  1887 00000CBD E959FBFFFF              	jmp	lff16s_3
  1888                                  
  1889                                  ;----------------------------------------------------------------------------
  1890                                  
  1891                                  load_16khz_mono_16_bit:
  1892 00000CC2 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1893                                  					; last of the file?
  1894 00000CC9 7402                    	jz	short lff16m2_0		; no
  1895 00000CCB F9                      	stc
  1896 00000CCC C3                      	retn
  1897                                  
  1898                                  lff16m2_0:
  1899                                  	; edi = audio buffer address
  1900                                  
  1901 00000CCD BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1902                                  
  1903                                  	; load file into memory
  1904                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000CD2 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000CD8 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000CDA 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000CE0 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000CE5 CD40                <1>  int 40h
  1905 00000CE7 7255                    	jc	short lff16m2_7 ; error !
  1906                                  
  1907 00000CE9 A3[EC810000]            	mov	[count], eax
  1908                                  	
  1909 00000CEE D1E8                    	shr	eax, 1
  1910 00000CF0 7505                    	jnz	short lff16m2_8
  1911 00000CF2 E93EFBFFFF              	jmp	lff16_eof
  1912                                  
  1913                                  lff16m2_8:
  1914 00000CF7 89C1                    	mov	ecx, eax  ; word count
  1915                                  lff16m2_1:
  1916 00000CF9 66AD                    	lodsw
  1917 00000CFB 66AB                    	stosw		; original sample (left channel)
  1918 00000CFD 66AB                    	stosw		; original sample (right channel)
  1919 00000CFF 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  1920                                  	;mov	[previous_val], ax
  1921 00000D02 89C3                    	mov	ebx, eax
  1922 00000D04 668B06                  	mov	ax, [esi]
  1923 00000D07 49                      	dec	ecx
  1924 00000D08 7502                    	jnz	short lff16m2_2
  1925 00000D0A 31C0                    	xor	eax, eax
  1926                                  lff16m2_2:
  1927 00000D0C 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  1928 00000D0F 89C5                    	mov	ebp, eax ; [next_val]
  1929                                  	;add	ax, [previous_val]
  1930 00000D11 6601D8                  	add	ax, bx
  1931 00000D14 66D1D8                  	rcr	ax, 1
  1932 00000D17 89C2                    	mov	edx, eax ; this is temporary interpolation value
  1933                                  	;add	ax, [previous_val]
  1934 00000D19 6601D8                  	add	ax, bx
  1935 00000D1C 66D1D8                  	rcr	ax, 1
  1936 00000D1F 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1937 00000D22 66AB                    	stosw		; this is 1st interpolated sample (L)
  1938 00000D24 66AB                    	stosw		; this is 1st interpolated sample (R)
  1939 00000D26 89E8                    	mov	eax, ebp 
  1940 00000D28 6601D0                  	add	ax, dx
  1941 00000D2B 66D1D8                  	rcr	ax, 1
  1942 00000D2E 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  1943 00000D31 66AB                    	stosw		; this is 2nd interpolated sample (L)
  1944 00000D33 66AB                    	stosw		; this is 2nd interpolated sample (R)
  1945                                  	; 16 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  1946 00000D35 09C9                    	or	ecx, ecx
  1947 00000D37 75C0                    	jnz	short lff16m2_1
  1948 00000D39 E9DDFAFFFF              	jmp	lff16m2_3
  1949                                  
  1950                                  lff16m2_7:
  1951                                  lff16s2_7:
  1952 00000D3E E9F2FAFFFF              	jmp	lff16m2_5  ; error
  1953                                  
  1954                                  ;----------------------------------------------------------------------------
  1955                                  
  1956                                  load_16khz_stereo_16_bit:
  1957 00000D43 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  1958                                  					; last of the file?
  1959 00000D4A 7402                    	jz	short lff16s2_0		; no
  1960 00000D4C F9                      	stc
  1961 00000D4D C3                      	retn
  1962                                  
  1963                                  lff16s2_0:
  1964                                  	; edi = audio buffer address
  1965                                  
  1966 00000D4E BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  1967                                  
  1968                                  	; load file into memory
  1969                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000D53 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000D59 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000D5B 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000D61 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000D66 CD40                <1>  int 40h
  1970 00000D68 72D4                    	jc	short lff16s2_7 ; error !
  1971                                  
  1972 00000D6A A3[EC810000]            	mov	[count], eax
  1973                                  	
  1974 00000D6F C1E802                  	shr	eax, 2
  1975 00000D72 7505                    	jnz	short lff16s2_8
  1976 00000D74 E9BCFAFFFF              	jmp	lff16_eof
  1977                                  
  1978                                  lff16s2_8:
  1979 00000D79 89C1                    	mov	ecx, eax  ; dword count
  1980                                  lff16s2_1:
  1981 00000D7B 66AD                    	lodsw
  1982 00000D7D 66AB                    	stosw		; original sample (L)
  1983 00000D7F 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format 
  1984 00000D82 66A3[D31E0000]          	mov	[previous_val_l], ax
  1985 00000D88 66AD                    	lodsw
  1986 00000D8A 66AB                    	stosw		; original sample (R)
  1987 00000D8C 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format 
  1988 00000D8F 66A3[D51E0000]          	mov	[previous_val_r], ax
  1989 00000D95 668B06                  	mov	ax, [esi]
  1990 00000D98 668B5602                	mov	dx, [esi+2]
  1991 00000D9C 49                      	dec	ecx
  1992 00000D9D 7504                    	jnz	short lff16s2_2
  1993 00000D9F 31D2                    	xor	edx, edx
  1994 00000DA1 31C0                    	xor	eax, eax
  1995                                  lff16s2_2:
  1996 00000DA3 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format 
  1997                                  	;mov	[next_val_l], ax
  1998 00000DA6 89C5                    	mov	ebp, eax
  1999 00000DA8 80C680                  	add	dh, 80h	; convert sound level 0 to 65535 format 
  2000 00000DAB 668915[D91E0000]        	mov	[next_val_r], dx
  2001 00000DB2 660305[D31E0000]        	add	ax, [previous_val_l]
  2002 00000DB9 66D1D8                  	rcr	ax, 1
  2003 00000DBC 89C2                    	mov	edx, eax ; this is temporary interpolation value (L)
  2004 00000DBE 660305[D31E0000]        	add	ax, [previous_val_l]
  2005 00000DC5 66D1D8                  	rcr	ax, 1
  2006 00000DC8 80EC80                  	sub	ah, 80h ; -32768 to +32767 format again
  2007 00000DCB 66AB                    	stosw		; this is 1st interpolated sample (L)
  2008 00000DCD 66A1[D91E0000]          	mov	ax, [next_val_r]
  2009 00000DD3 660305[D51E0000]        	add	ax, [previous_val_r]
  2010 00000DDA 66D1D8                  	rcr	ax, 1
  2011 00000DDD 89C3                    	mov	ebx, eax ; this is temporary interpolation value (R)
  2012 00000DDF 660305[D51E0000]        	add	ax, [previous_val_r]
  2013 00000DE6 66D1D8                  	rcr	ax, 1
  2014 00000DE9 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2015 00000DEC 66AB                    	stosw		; this is 1st interpolated sample (R)
  2016                                  	;mov	ax, [next_val_l]
  2017 00000DEE 89E8                    	mov	eax, ebp
  2018 00000DF0 6601D0                  	add	ax, dx
  2019 00000DF3 66D1D8                  	rcr	ax, 1
  2020 00000DF6 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2021 00000DF9 66AB                    	stosw		; this is 2nd interpolated sample (L)
  2022 00000DFB 66A1[D91E0000]          	mov	ax, [next_val_r]
  2023 00000E01 6601D8                  	add	ax, bx
  2024 00000E04 66D1D8                  	rcr	ax, 1
  2025 00000E07 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2026 00000E0A 66AB                    	stosw 		; this is 2nd interpolated sample (R)
  2027                                  	
  2028                                  	; 16 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  2029 00000E0C 09C9                    	or	ecx, ecx
  2030 00000E0E 0F8567FFFFFF            	jnz	lff16s2_1
  2031 00000E14 E902FAFFFF              	jmp	lff16s2_3
  2032                                  
  2033                                  ;----------------------------------------------------------------------------
  2034                                  
  2035                                  load_24khz_mono_8_bit:
  2036 00000E19 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2037                                  					; last of the file?
  2038 00000E20 7402                    	jz	short lff24m_0		; no
  2039 00000E22 F9                      	stc
  2040 00000E23 C3                      	retn
  2041                                  
  2042                                  lff24m_0:
  2043                                  	; edi = audio buffer address
  2044                                  
  2045 00000E24 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2046                                  
  2047                                  	; load file into memory
  2048                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000E29 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000E2F 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000E31 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000E37 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000E3C CD40                <1>  int 40h
  2049 00000E3E 723B                    	jc	short lff24m_7 ; error !
  2050                                  
  2051 00000E40 A3[EC810000]            	mov	[count], eax
  2052                                  	
  2053 00000E45 21C0                    	and	eax, eax
  2054 00000E47 7505                    	jnz	short lff24m_8
  2055 00000E49 E9E7F9FFFF              	jmp	lff24_eof
  2056                                  
  2057                                  lff24m_8:
  2058 00000E4E 89C1                    	mov	ecx, eax	; byte count
  2059                                  lff24m_1:
  2060 00000E50 AC                      	lodsb
  2061                                  	;mov	[previous_val], al
  2062 00000E51 88C3                    	mov	bl, al
  2063 00000E53 2C80                    	sub	al, 80h
  2064 00000E55 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  2065 00000E59 66AB                    	stosw		; original sample (left channel)
  2066 00000E5B 66AB                    	stosw		; original sample (right channel)
  2067                                  	;xor	eax, eax
  2068 00000E5D 8A06                    	mov	al, [esi]
  2069 00000E5F 49                      	dec	ecx
  2070 00000E60 7502                    	jnz	short lff24m_2
  2071 00000E62 B080                    	mov	al, 80h
  2072                                  lff24m_2:
  2073                                  	;;mov	[next_val], al
  2074                                  	;mov	bh, al
  2075                                  	;add	al, [previous_val]
  2076 00000E64 00D8                    	add	al, bl
  2077 00000E66 D0D8                    	rcr	al, 1
  2078 00000E68 2C80                    	sub	al, 80h
  2079 00000E6A 66C1E008                	shl	ax, 8
  2080 00000E6E 66AB                    	stosw		; this is interpolated sample (L)
  2081 00000E70 66AB                    	stosw		; this is interpolated sample (R)
  2082                                  	
  2083                                  	; 24 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  2084 00000E72 09C9                    	or	ecx, ecx
  2085 00000E74 75DA                    	jnz	short lff24m_1
  2086 00000E76 E9A0F9FFFF              	jmp	lff24_3
  2087                                  
  2088                                  lff24m_7:
  2089                                  lff24s_7:
  2090 00000E7B E9B5F9FFFF              	jmp	lff24_5  ; error
  2091                                  
  2092                                  ;----------------------------------------------------------------------------
  2093                                  
  2094                                  load_24khz_stereo_8_bit:
  2095 00000E80 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2096                                  					; last of the file?
  2097 00000E87 7402                    	jz	short lff24s_0		; no
  2098 00000E89 F9                      	stc
  2099 00000E8A C3                      	retn
  2100                                  
  2101                                  lff24s_0:
  2102                                  	; edi = audio buffer address
  2103                                  
  2104 00000E8B BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2105                                  
  2106                                  	; load file into memory
  2107                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000E90 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000E96 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000E98 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000E9E B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000EA3 CD40                <1>  int 40h
  2108 00000EA5 72D4                    	jc	short lff24s_7 ; error !
  2109                                  
  2110 00000EA7 A3[EC810000]            	mov	[count], eax
  2111                                  
  2112 00000EAC D1E8                    	shr	eax, 1
  2113 00000EAE 7505                    	jnz	short lff24s_8
  2114 00000EB0 E980F9FFFF              	jmp	lff24_eof
  2115                                  
  2116                                  lff24s_8:
  2117 00000EB5 89C1                    	mov	ecx, eax  ; word count
  2118                                  lff24s_1:
  2119 00000EB7 AC                      	lodsb
  2120 00000EB8 A2[D31E0000]            	mov	[previous_val_l], al
  2121 00000EBD 2C80                    	sub	al, 80h
  2122 00000EBF 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  2123 00000EC3 66AB                    	stosw		; original sample (L)
  2124 00000EC5 AC                      	lodsb
  2125 00000EC6 A2[D51E0000]            	mov	[previous_val_r], al
  2126 00000ECB 2C80                    	sub	al, 80h
  2127 00000ECD 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  2128 00000ED1 66AB                    	stosw		; original sample (R)
  2129                                  
  2130                                  	;xor	eax, eax
  2131 00000ED3 668B06                  	mov	ax, [esi]
  2132 00000ED6 49                      	dec	ecx
  2133 00000ED7 7504                    	jnz	short lff24s_2
  2134                                  		; convert 8 bit sample to 16 bit sample
  2135 00000ED9 66B88080                	mov	ax, 8080h
  2136                                  lff24s_2:
  2137                                  	;;mov	[next_val_l], al
  2138                                  	;;mov	[next_val_r], ah
  2139                                  	;mov	bx, ax
  2140 00000EDD 88E7                    	mov	bh, ah
  2141 00000EDF 0205[D31E0000]          	add	al, [previous_val_l]
  2142 00000EE5 D0D8                    	rcr	al, 1
  2143                                  	;mov	dl, al
  2144 00000EE7 2C80                    	sub	al, 80h
  2145 00000EE9 66C1E008                	shl	ax, 8
  2146 00000EED 66AB                    	stosw		; this is interpolated sample (L)
  2147 00000EEF 88F8                    	mov	al, bh	; [next_val_r]
  2148 00000EF1 0205[D51E0000]          	add	al, [previous_val_r]
  2149 00000EF7 D0D8                    	rcr	al, 1
  2150                                  	;mov	dh, al
  2151 00000EF9 2C80                    	sub	al, 80h
  2152 00000EFB 66C1E008                	shl	ax, 8
  2153 00000EFF 66AB                    	stosw		; this is interpolated sample (R)
  2154                                  		
  2155                                  	; 24 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  2156 00000F01 09C9                    	or	ecx, ecx
  2157 00000F03 75B2                    	jnz	short lff24s_1
  2158 00000F05 E911F9FFFF              	jmp	lff24_3
  2159                                  
  2160                                  ;----------------------------------------------------------------------------
  2161                                  
  2162                                  load_24khz_mono_16_bit:
  2163 00000F0A F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2164                                  					; last of the file?
  2165 00000F11 7402                    	jz	short lff24m2_0		; no
  2166 00000F13 F9                      	stc
  2167 00000F14 C3                      	retn
  2168                                  
  2169                                  lff24m2_0:
  2170                                  	; edi = audio buffer address
  2171                                  
  2172 00000F15 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2173                                  
  2174                                  	; load file into memory
  2175                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000F1A 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000F20 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000F22 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000F28 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000F2D CD40                <1>  int 40h
  2176 00000F2F 723A                    	jc	short lff24m2_7 ; error !
  2177                                  
  2178 00000F31 A3[EC810000]            	mov	[count], eax
  2179                                  
  2180 00000F36 D1E8                    	shr	eax, 1
  2181 00000F38 7505                    	jnz	short lff24m2_8
  2182 00000F3A E9F6F8FFFF              	jmp	lff24_eof
  2183                                  
  2184                                  lff24m2_8:
  2185 00000F3F 89C1                    	mov	ecx, eax  ; word count
  2186                                  lff24m2_1:
  2187 00000F41 66AD                    	lodsw
  2188 00000F43 66AB                    	stosw		; original sample (left channel)
  2189 00000F45 66AB                    	stosw		; original sample (right channel)
  2190 00000F47 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  2191                                  	;mov	[previous_val], ax
  2192                                  	;mov	ebx, eax
  2193 00000F4A 668B1E                  	mov	bx, [esi]
  2194 00000F4D 49                      	dec	ecx
  2195 00000F4E 7502                    	jnz	short lff24m2_2
  2196                                  	;xor	eax, eax
  2197 00000F50 31DB                    	xor	ebx, ebx
  2198                                  lff24m2_2:
  2199 00000F52 80C780                  	add	bh, 80h ; convert sound level 0 to 65535 format
  2200                                  	;add	ah, 80h
  2201                                  	;mov	ebp, eax	; [next_val]
  2202                                  	;add	ax, [previous_val]
  2203                                  	; ax = [previous_val]
  2204                                  	; bx = [next_val]
  2205 00000F55 6601D8                  	add	ax, bx
  2206 00000F58 66D1D8                  	rcr	ax, 1
  2207 00000F5B 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2208 00000F5E 66AB                    	stosw		; this is interpolated sample (L)
  2209 00000F60 66AB                    	stosw		; this is interpolated sample (R)
  2210                                  	; 24 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  2211 00000F62 09C9                    	or	ecx, ecx
  2212 00000F64 75DB                    	jnz	short lff24m2_1
  2213 00000F66 E9B0F8FFFF              	jmp	lff24_3
  2214                                  
  2215                                  lff24m2_7:
  2216                                  lff24s2_7:
  2217 00000F6B E9C5F8FFFF              	jmp	lff24_5  ; error
  2218                                  
  2219                                  ;----------------------------------------------------------------------------
  2220                                  
  2221                                  load_24khz_stereo_16_bit:
  2222 00000F70 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2223                                  					; last of the file?
  2224 00000F77 7402                    	jz	short lff24s2_0		; no
  2225 00000F79 F9                      	stc
  2226 00000F7A C3                      	retn
  2227                                  
  2228                                  lff24s2_0:
  2229                                  	; edi = audio buffer address
  2230                                  
  2231 00000F7B BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2232                                  
  2233                                  	; load file into memory
  2234                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00000F80 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00000F86 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00000F88 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00000F8E B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00000F93 CD40                <1>  int 40h
  2235 00000F95 72D4                    	jc	short lff24s2_7 ; error !
  2236                                  
  2237 00000F97 A3[EC810000]            	mov	[count], eax
  2238                                  
  2239 00000F9C C1E802                  	shr	eax, 2
  2240 00000F9F 7505                    	jnz	short lff24s2_8
  2241 00000FA1 E98FF8FFFF              	jmp	lff24_eof
  2242                                  
  2243                                  lff24s2_8:
  2244 00000FA6 89C1                    	mov	ecx, eax  ; dword count
  2245                                  lff24s2_1:
  2246 00000FA8 66AD                    	lodsw
  2247 00000FAA 66AB                    	stosw		; original sample (L)
  2248 00000FAC 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format
  2249 00000FAF 66A3[D31E0000]          	mov	[previous_val_l], ax
  2250 00000FB5 66AD                    	lodsw
  2251 00000FB7 66AB                    	stosw		; original sample (R)
  2252 00000FB9 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format
  2253                                  	;mov	[previous_val_r], ax
  2254 00000FBC 89C3                    	mov	ebx, eax
  2255 00000FBE 668B06                  	mov	ax, [esi]
  2256 00000FC1 668B5602                	mov	dx, [esi+2]
  2257 00000FC5 49                      	dec	ecx
  2258 00000FC6 7504                    	jnz	short lff24s2_2
  2259 00000FC8 31D2                    	xor	edx, edx
  2260 00000FCA 31C0                    	xor	eax, eax
  2261                                  lff24s2_2:
  2262 00000FCC 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format
  2263                                  	;;mov	[next_val_l], ax
  2264                                  	;mov	ebp, eax
  2265 00000FCF 80C680                  	add	dh, 80h	; convert sound level 0 to 65535 format
  2266                                  	;mov	[next_val_r], dx
  2267 00000FD2 660305[D31E0000]        	add	ax, [previous_val_l]
  2268 00000FD9 66D1D8                  	rcr	ax, 1
  2269 00000FDC 80EC80                  	sub	ah, 80h ; -32768 to +32767 format again
  2270 00000FDF 66AB                    	stosw		; this is interpolated sample (L)
  2271                                  	;mov	ax, [next_val_r]
  2272 00000FE1 89D0                    	mov	eax, edx
  2273                                  	;add	ax, [previous_val_r]
  2274 00000FE3 6601D8                  	add	ax, bx
  2275 00000FE6 66D1D8                  	rcr	ax, 1
  2276 00000FE9 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2277 00000FEC 66AB                    	stosw		; this is interpolated sample (R)
  2278                                  
  2279                                  	; 24 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  2280 00000FEE 09C9                    	or	ecx, ecx
  2281 00000FF0 75B6                    	jnz	short lff24s2_1
  2282 00000FF2 E924F8FFFF              	jmp	lff24_3
  2283                                  
  2284                                  ;----------------------------------------------------------------------------
  2285                                  
  2286                                  load_32khz_mono_8_bit:
  2287 00000FF7 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2288                                  					; last of the file?
  2289 00000FFE 7402                    	jz	short lff32m_0		; no
  2290 00001000 F9                      	stc
  2291 00001001 C3                      	retn
  2292                                  
  2293                                  lff32m_0:
  2294                                  	; edi = audio buffer address
  2295                                  
  2296 00001002 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2297                                  
  2298                                  	; load file into memory
  2299                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001007 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000100D 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000100F 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001015 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 0000101A CD40                <1>  int 40h
  2300 0000101C 7247                    	jc	short lff32m_7 ; error !
  2301                                  
  2302 0000101E A3[EC810000]            	mov	[count], eax
  2303                                  
  2304 00001023 21C0                    	and	eax, eax
  2305 00001025 7505                    	jnz	short lff32m_8
  2306 00001027 E909F8FFFF              	jmp	lff32_eof
  2307                                  
  2308                                  lff32m_8:
  2309 0000102C 89C1                    	mov	ecx, eax	; byte count
  2310                                  lff32m_1:
  2311 0000102E AC                      	lodsb
  2312                                  	;mov	[previous_val], al
  2313 0000102F 88C3                    	mov	bl, al
  2314 00001031 2C80                    	sub	al, 80h
  2315 00001033 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  2316 00001037 66AB                    	stosw		; original sample (left channel)
  2317 00001039 66AB                    	stosw		; original sample (right channel)
  2318                                  	;xor	eax, eax
  2319 0000103B 8A06                    	mov	al, [esi]
  2320 0000103D 49                      	dec	ecx
  2321 0000103E 7502                    	jnz	short lff32m_2
  2322 00001040 B080                    	mov	al, 80h
  2323                                  lff32m_2:
  2324                                  	;;mov	[next_val], al
  2325                                  	;mov	bh, al
  2326                                  	;add	al, [previous_val]
  2327 00001042 00D8                    	add	al, bl
  2328 00001044 D0D8                    	rcr	al, 1
  2329 00001046 2C80                    	sub	al, 80h
  2330 00001048 66C1E008                	shl	ax, 8
  2331 0000104C 66AB                    	stosw		; this is interpolated sample (L)
  2332 0000104E 66AB                    	stosw		; this is interpolated sample (R)
  2333                                  	
  2334                                  	; different than 8-16-24 kHZ !
  2335                                  	; 'original-interpolated-original' trio samples
  2336 00001050 E30E                    	jecxz	lff32m_3
  2337                                  
  2338 00001052 AC                      	lodsb
  2339 00001053 2C80                    	sub	al, 80h
  2340 00001055 66C1E008                	shl	ax, 8
  2341 00001059 66AB                    	stosw		; original sample (left channel)
  2342 0000105B 66AB                    	stosw		; original sample (right channel)
  2343                                  
  2344                                  	; 32 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  2345 0000105D 49                      	dec	ecx
  2346 0000105E 75CE                    	jnz	short lff32m_1
  2347                                  lff32m_3:
  2348 00001060 E9B6F7FFFF              	jmp	lff32_3
  2349                                  
  2350                                  lff32m_7:
  2351                                  lff32s_7:
  2352 00001065 E9CBF7FFFF              	jmp	lff32_5  ; error
  2353                                  
  2354                                  ;----------------------------------------------------------------------------
  2355                                  
  2356                                  load_32khz_stereo_8_bit:
  2357 0000106A F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2358                                  					; last of the file?
  2359 00001071 7402                    	jz	short lff32s_0		; no
  2360 00001073 F9                      	stc
  2361 00001074 C3                      	retn
  2362                                  
  2363                                  lff32s_0:
  2364                                  	; edi = audio buffer address
  2365                                  
  2366 00001075 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2367                                  
  2368                                  	; load file into memory
  2369                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000107A 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001080 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00001082 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001088 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 0000108D CD40                <1>  int 40h
  2370 0000108F 72D4                    	jc	short lff32s_7 ; error !
  2371                                  
  2372 00001091 A3[EC810000]            	mov	[count], eax
  2373                                  
  2374 00001096 D1E8                    	shr	eax, 1
  2375 00001098 7505                    	jnz	short lff32s_8
  2376 0000109A E996F7FFFF              	jmp	lff32_eof
  2377                                  
  2378                                  lff32s_8:
  2379 0000109F 89C1                    	mov	ecx, eax  ; word count
  2380                                  lff32s_1:
  2381 000010A1 AC                      	lodsb
  2382 000010A2 A2[D31E0000]            	mov	[previous_val_l], al
  2383 000010A7 2C80                    	sub	al, 80h
  2384 000010A9 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  2385 000010AD 66AB                    	stosw		; original sample (L)
  2386 000010AF AC                      	lodsb
  2387 000010B0 A2[D51E0000]            	mov	[previous_val_r], al
  2388 000010B5 2C80                    	sub	al, 80h
  2389 000010B7 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  2390 000010BB 66AB                    	stosw		; original sample (R)
  2391                                  
  2392                                  	;xor	eax, eax
  2393 000010BD 668B06                  	mov	ax, [esi]
  2394 000010C0 49                      	dec	ecx
  2395 000010C1 7504                    	jnz	short lff32s_2
  2396                                  		; convert 8 bit sample to 16 bit sample
  2397 000010C3 66B88080                	mov	ax, 8080h
  2398                                  lff32s_2:
  2399                                  	;;mov	[next_val_l], al
  2400                                  	;;mov	[next_val_r], ah
  2401                                  	;mov	bx, ax
  2402 000010C7 88E7                    	mov	bh, ah
  2403 000010C9 0205[D31E0000]          	add	al, [previous_val_l]
  2404 000010CF D0D8                    	rcr	al, 1
  2405                                  	;mov	dl, al
  2406 000010D1 2C80                    	sub	al, 80h
  2407 000010D3 66C1E008                	shl	ax, 8
  2408 000010D7 66AB                    	stosw		; this is interpolated sample (L)
  2409 000010D9 88F8                    	mov	al, bh	; [next_val_r]
  2410 000010DB 0205[D51E0000]          	add	al, [previous_val_r]
  2411 000010E1 D0D8                    	rcr	al, 1
  2412                                  	;mov	dh, al
  2413 000010E3 2C80                    	sub	al, 80h
  2414 000010E5 66C1E008                	shl	ax, 8
  2415 000010E9 66AB                    	stosw		; this is interpolated sample (R)
  2416                                  
  2417                                  	; different than 8-16-24 kHZ !
  2418                                  	; 'original-interpolated-original' trio samples
  2419 000010EB E315                    	jecxz	lff32s_3
  2420                                  
  2421 000010ED AC                      	lodsb
  2422 000010EE 2C80                    	sub	al, 80h
  2423 000010F0 66C1E008                	shl	ax, 8
  2424 000010F4 66AB                    	stosw		; original sample (left channel)
  2425                                  
  2426 000010F6 AC                      	lodsb
  2427 000010F7 2C80                    	sub	al, 80h
  2428 000010F9 66C1E008                	shl	ax, 8
  2429 000010FD 66AB                    	stosw		; original sample (right channel)
  2430                                  
  2431                                  	; 32 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  2432 000010FF 49                      	dec	ecx
  2433 00001100 759F                    	jnz	short lff32s_1
  2434                                  lff32s_3:
  2435 00001102 E914F7FFFF              	jmp	lff32_3
  2436                                  
  2437                                  ;----------------------------------------------------------------------------
  2438                                  
  2439                                  load_32khz_mono_16_bit:
  2440 00001107 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2441                                  					; last of the file?
  2442 0000110E 7402                    	jz	short lff32m2_0		; no
  2443 00001110 F9                      	stc
  2444 00001111 C3                      	retn
  2445                                  
  2446                                  lff32m2_0:
  2447                                  	; edi = audio buffer address
  2448                                  
  2449 00001112 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2450                                  
  2451                                  	; load file into memory
  2452                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001117 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000111D 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000111F 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001125 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 0000112A CD40                <1>  int 40h
  2453 0000112C 7241                    	jc	short lff32m2_7 ; error !
  2454                                  
  2455 0000112E A3[EC810000]            	mov	[count], eax
  2456                                  
  2457 00001133 D1E8                    	shr	eax, 1
  2458 00001135 7505                    	jnz	short lff32m2_8
  2459 00001137 E9F9F6FFFF              	jmp	lff32_eof
  2460                                  
  2461                                  lff32m2_8:
  2462 0000113C 89C1                    	mov	ecx, eax  ; word count
  2463                                  lff32m2_1:
  2464 0000113E 66AD                    	lodsw
  2465 00001140 66AB                    	stosw		; original sample (left channel)
  2466 00001142 66AB                    	stosw		; original sample (right channel)
  2467 00001144 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  2468                                  	;mov	[previous_val], ax
  2469                                  	;mov	ebx, eax
  2470                                  	;xor	eax, eax
  2471                                  	;mov	ax, [esi]
  2472 00001147 668B1E                  	mov	bx, [esi]
  2473 0000114A 49                      	dec	ecx
  2474 0000114B 7502                    	jnz	short lff32m2_2
  2475 0000114D 31DB                    	xor	ebx, ebx
  2476                                  lff32m2_2:
  2477 0000114F 80C780                  	add	bh, 80h ; convert sound level 0 to 65535 format
  2478                                  	;add	ah, 80h
  2479                                  	;mov	ebp, eax ; [next_val]
  2480                                  	;add	ax, [previous_val]
  2481                                  	; ax = [previous_val]
  2482                                  	; bx = [next_val]
  2483 00001152 6601D8                  	add	ax, bx
  2484 00001155 66D1D8                  	rcr	ax, 1
  2485 00001158 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2486 0000115B 66AB                    	stosw		; this is interpolated sample (L)
  2487 0000115D 66AB                    	stosw		; this is interpolated sample (R)
  2488                                  
  2489                                  	; different than 8-16-24 kHZ !
  2490                                  	; 'original-interpolated-original' trio samples
  2491 0000115F E309                    	jecxz	lff32m2_3
  2492                                  
  2493 00001161 66AD                    	lodsw
  2494 00001163 66AB                    	stosw		; original sample (left channel)
  2495 00001165 66AB                    	stosw		; original sample (right channel)
  2496                                  
  2497                                  	; 32 kHZ mono to 48 kHZ stereo conversion of the sample is OK
  2498 00001167 49                      	dec	ecx
  2499 00001168 75D4                    	jnz	short lff32m2_1
  2500                                  lff32m2_3:
  2501 0000116A E9ACF6FFFF              	jmp	lff32_3
  2502                                  
  2503                                  lff32m2_7:
  2504                                  lff32s2_7:
  2505 0000116F E9C1F6FFFF              	jmp	lff32_5  ; error
  2506                                  
  2507                                  ;----------------------------------------------------------------------------
  2508                                  
  2509                                  load_32khz_stereo_16_bit:
  2510 00001174 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2511                                  					; last of the file?
  2512 0000117B 7402                    	jz	short lff32s2_0		; no
  2513 0000117D F9                      	stc
  2514 0000117E C3                      	retn
  2515                                  
  2516                                  lff32s2_0:
  2517                                  	; edi = audio buffer address
  2518                                  
  2519 0000117F BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2520                                  
  2521                                  	; load file into memory
  2522                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001184 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000118A 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000118C 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001192 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001197 CD40                <1>  int 40h
  2523 00001199 72D4                    	jc	short lff32s2_7 ; error !
  2524                                  
  2525 0000119B A3[EC810000]            	mov	[count], eax
  2526                                  
  2527 000011A0 C1E802                  	shr	eax, 2
  2528 000011A3 7505                    	jnz	short lff32s2_8
  2529 000011A5 E98BF6FFFF              	jmp	lff32_eof
  2530                                  
  2531                                  lff32s2_8:
  2532 000011AA 89C1                    	mov	ecx, eax ; dword count
  2533                                  lff32s2_1:
  2534 000011AC 66AD                    	lodsw
  2535 000011AE 66AB                    	stosw		; original sample (L)
  2536 000011B0 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format
  2537 000011B3 66A3[D31E0000]          	mov	[previous_val_l], ax
  2538 000011B9 66AD                    	lodsw
  2539 000011BB 66AB                    	stosw		; original sample (R)
  2540 000011BD 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format
  2541                                  	;mov	[previous_val_r], ax
  2542 000011C0 89C3                    	mov	ebx, eax
  2543 000011C2 668B06                  	mov	ax, [esi]
  2544 000011C5 668B5602                	mov	dx, [esi+2]
  2545 000011C9 49                      	dec	ecx
  2546 000011CA 7504                    	jnz	short lff32s2_2
  2547 000011CC 31D2                    	xor	edx, edx
  2548 000011CE 31C0                    	xor	eax, eax
  2549                                  lff32s2_2:
  2550 000011D0 80C480                  	add	ah, 80h	; convert sound level 0 to 65535 format
  2551                                  	;;mov	[next_val_l], ax
  2552                                  	;mov	ebp, eax
  2553 000011D3 80C680                  	add	dh, 80h	; convert sound level 0 to 65535 format
  2554                                  	;mov	[next_val_r], dx
  2555 000011D6 660305[D31E0000]        	add	ax, [previous_val_l]
  2556 000011DD 66D1D8                  	rcr	ax, 1
  2557 000011E0 80EC80                  	sub	ah, 80h ; -32768 to +32767 format again
  2558 000011E3 66AB                    	stosw		; this is interpolated sample (L)
  2559                                  	;mov	ax, [next_val_r]
  2560 000011E5 89D0                    	mov	eax, edx
  2561                                  	;add	ax, [previous_val_r]
  2562 000011E7 6601D8                  	add	ax, bx
  2563 000011EA 66D1D8                  	rcr	ax, 1
  2564 000011ED 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  2565 000011F0 66AB                    	stosw		; this is interpolated sample (R)
  2566                                  
  2567                                  	; different than 8-16-24 kHZ !
  2568                                  	; 'original-interpolated-original' trio samples 
  2569 000011F2 E30B                    	jecxz	lff32s2_3
  2570                                  
  2571 000011F4 66AD                    	lodsw
  2572 000011F6 66AB                    	stosw	; original sample (L)
  2573 000011F8 66AD                    	lodsw
  2574 000011FA 66AB                    	stosw	; original sample (R)
  2575                                  
  2576                                  	; 32 kHZ stereo to 48 kHZ stereo conversion of the sample is OK
  2577 000011FC 49                      	dec	ecx
  2578 000011FD 75AD                    	jnz	short lff32s2_1
  2579                                  lff32s2_3:
  2580 000011FF E917F6FFFF              	jmp	lff32_3
  2581                                  
  2582                                  ;----------------------------------------------------------------------------
  2583                                  
  2584                                  load_22khz_mono_8_bit:
  2585 00001204 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2586                                  					; last of the file?
  2587 0000120B 7402                    	jz	short lff22m_0		; no
  2588 0000120D F9                      	stc
  2589 0000120E C3                      	retn
  2590                                  
  2591                                  lff22m_0:
  2592                                  	; edi = audio buffer address
  2593                                  
  2594 0000120F BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2595                                  
  2596                                  	; load file into memory
  2597                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001214 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000121A 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000121C 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001222 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001227 CD40                <1>  int 40h
  2598 00001229 725D                    	jc	short lff22m_7 ; error !
  2599                                  
  2600 0000122B A3[EC810000]            	mov	[count], eax
  2601                                  	
  2602 00001230 21C0                    	and	eax, eax
  2603 00001232 7505                    	jnz	short lff22m_8
  2604 00001234 E9FCF5FFFF              	jmp	lff22_eof
  2605                                  
  2606                                  lff22m_8:
  2607 00001239 89C1                    	mov	ecx, eax	; byte count
  2608                                  lff22m_9:
  2609 0000123B BD05000000              	mov	ebp, 5 ; interpolation (one step) loop count
  2610 00001240 C605[DB1E0000]03        	mov	byte [faz], 3  ; 3 steps/phases
  2611                                  lff22m_1:
  2612                                  	; 3:2:2:2:2:2::3:2:2:2:2::3:2:2:2:2:2  ; 37/17
  2613 00001247 AC                      	lodsb
  2614 00001248 8A16                    	mov	dl, [esi]
  2615 0000124A 49                      	dec	ecx
  2616 0000124B 7502                    	jnz	short lff22m_2_1
  2617 0000124D B280                    	mov	dl, 80h
  2618                                  lff22m_2_1:
  2619                                  	; al = [previous_val]
  2620                                  	; dl = [next_val]
  2621 0000124F E835070000              	call	interpolating_3_8bit_mono ; 1 of 17
  2622 00001254 E32D                    	jecxz	lff22m_3
  2623                                  lff22m_2_2:
  2624 00001256 AC                      	lodsb
  2625 00001257 8A16                    	mov	dl, [esi]
  2626 00001259 49                      	dec	ecx
  2627 0000125A 7502                    	jnz	short lff22m_2_3
  2628 0000125C B280                    	mov	dl, 80h
  2629                                  lff22m_2_3:
  2630 0000125E E8B0070000               	call	interpolating_2_8bit_mono ; 2 of 17 .. 6 of 17
  2631 00001263 E31E                    	jecxz	lff22m_3
  2632 00001265 4D                      	dec	ebp
  2633 00001266 75EE                    	jnz	short lff22m_2_2
  2634                                  
  2635 00001268 A0[DB1E0000]            	mov	al, [faz]
  2636 0000126D FEC8                    	dec	al
  2637 0000126F 74CA                    	jz	short lff22m_9
  2638 00001271 FE0D[DB1E0000]          	dec	byte [faz]
  2639 00001277 BD04000000              	mov	ebp, 4
  2640 0000127C FEC8                    	dec	al
  2641 0000127E 75C7                    	jnz	short lff22m_1 ; 3:2:2:2:2 ; 7-11 of 17
  2642 00001280 45                      	inc	ebp ; 5
  2643 00001281 EBC4                    	jmp	short lff22m_1 ; 3:2:2:2:2:2 ; 12-17 of 17
  2644                                  
  2645                                  lff22m_3:
  2646                                  lff22s_3:
  2647 00001283 E993F5FFFF              	jmp	lff22_3	; padfill
  2648                                  		; (put zeros in the remain words of the buffer)
  2649                                  lff22m_7:
  2650                                  lff22s_7:
  2651 00001288 E9A8F5FFFF              	jmp	lff22_5  ; error
  2652                                  
  2653                                  ;----------------------------------------------------------------------------
  2654                                  
  2655                                  load_22khz_stereo_8_bit:
  2656 0000128D F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2657                                  					; last of the file?
  2658 00001294 7402                    	jz	short lff22s_0		; no
  2659 00001296 F9                      	stc
  2660 00001297 C3                      	retn
  2661                                  
  2662                                  lff22s_0:
  2663                                  	; edi = audio buffer address
  2664                                  
  2665 00001298 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2666                                  
  2667                                  	; load file into memory
  2668                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000129D 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000012A3 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000012A5 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000012AB B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000012B0 CD40                <1>  int 40h
  2669 000012B2 72D4                    	jc	short lff22s_7 ; error !
  2670                                  
  2671 000012B4 A3[EC810000]            	mov	[count], eax
  2672                                  
  2673 000012B9 D1E8                    	shr	eax, 1
  2674 000012BB 7505                    	jnz	short lff22s_8
  2675 000012BD E973F5FFFF              	jmp	lff22_eof
  2676                                  
  2677                                  lff22s_8:
  2678 000012C2 89C1                    	mov	ecx, eax	; word count
  2679                                  lff22s_9:
  2680 000012C4 BD05000000              	mov	ebp, 5 ; interpolation (one step) loop count
  2681 000012C9 C605[DB1E0000]03        	mov	byte [faz], 3  ; 3 steps/phase
  2682                                  lff22s_1:
  2683                                  	; 3:2:2:2:2:2::3:2:2:2:2::3:2:2:2:2:2  ; 37/17
  2684 000012D0 66AD                    	lodsw
  2685 000012D2 668B16                  	mov	dx, [esi]
  2686 000012D5 49                      	dec	ecx
  2687 000012D6 7504                    	jnz	short lff22s_2_1
  2688 000012D8 66BA8080                	mov	dx, 8080h
  2689                                  lff22s_2_1:
  2690                                  	; al = [previous_val_l]
  2691                                  	; ah = [previous_val_r]
  2692                                  	; dl = [next_val_l]
  2693                                  	; dh = [next_val_r]
  2694 000012DC E8DB060000              	call	interpolating_3_8bit_stereo ; 1 of 17
  2695 000012E1 E3A0                    	jecxz	lff22s_3
  2696                                  lff22s_2_2:
  2697 000012E3 66AD                    	lodsw
  2698 000012E5 668B16                  	mov	dx, [esi]
  2699 000012E8 49                      	dec	ecx
  2700 000012E9 7504                    	jnz	short lff22s_2_3
  2701 000012EB 66BA8080                	mov	dx, 8080h
  2702                                  lff22s_2_3:
  2703 000012EF E83C070000               	call	interpolating_2_8bit_stereo ; 2 of 17 .. 6 of 17
  2704 000012F4 E38D                    	jecxz	lff22s_3
  2705 000012F6 4D                      	dec	ebp
  2706 000012F7 75EA                    	jnz	short lff22s_2_2
  2707                                  
  2708 000012F9 A0[DB1E0000]            	mov	al, [faz]
  2709 000012FE FEC8                    	dec	al
  2710 00001300 74C2                    	jz	short lff22s_9
  2711 00001302 FE0D[DB1E0000]          	dec	byte [faz]
  2712 00001308 BD04000000              	mov	ebp, 4
  2713 0000130D FEC8                    	dec	al
  2714 0000130F 75BF                    	jnz	short lff22s_1 ; 3:2:2:2:2 ; 7-11 of 17
  2715 00001311 45                      	inc	ebp ; 5
  2716 00001312 EBBC                    	jmp	short lff22s_1 ; 3:2:2:2:2:2 ; 12-17 of 17
  2717                                  
  2718                                  ;----------------------------------------------------------------------------
  2719                                  
  2720                                  load_22khz_mono_16_bit:
  2721 00001314 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2722                                  					; last of the file?
  2723 0000131B 7402                    	jz	short lff22m2_0		; no
  2724 0000131D F9                      	stc
  2725 0000131E C3                      	retn
  2726                                  
  2727                                  lff22m2_0:
  2728                                  	; edi = audio buffer address
  2729                                  
  2730 0000131F BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2731                                  
  2732                                  	; load file into memory
  2733                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001324 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000132A 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000132C 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001332 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001337 CD40                <1>  int 40h
  2734 00001339 7261                    	jc	short lff22m2_7 ; error !
  2735                                  
  2736 0000133B A3[EC810000]            	mov	[count], eax
  2737                                  
  2738 00001340 D1E8                    	shr	eax, 1
  2739 00001342 7505                    	jnz	short lff22m2_8
  2740 00001344 E9ECF4FFFF              	jmp	lff22_eof
  2741                                  
  2742                                  lff22m2_8:
  2743 00001349 89C1                    	mov	ecx, eax	; word count
  2744                                  lff22m2_9:
  2745 0000134B BD05000000              	mov	ebp, 5 ; interpolation (one step) loop count
  2746 00001350 C605[DB1E0000]03        	mov	byte [faz], 3  ; 3 steps/phases
  2747                                  lff22m2_1:
  2748                                  	; 3:2:2:2:2:2::3:2:2:2:2::3:2:2:2:2:2  ; 37/17
  2749 00001357 66AD                    	lodsw
  2750 00001359 668B16                  	mov	dx, [esi]
  2751 0000135C 49                      	dec	ecx
  2752 0000135D 7502                    	jnz	short lff22m2_2_1
  2753 0000135F 31D2                    	xor	edx, edx
  2754                                  lff22m2_2_1:	
  2755                                  	; ax = [previous_val]
  2756                                  	; dx = [next_val]
  2757 00001361 E8FB060000              	call	interpolating_3_16bit_mono ; 1 of 17
  2758 00001366 E32F                    	jecxz	lff22m2_3
  2759                                  lff22m2_2_2:
  2760 00001368 66AD                    	lodsw
  2761 0000136A 668B16                  	mov	dx, [esi]
  2762 0000136D 49                      	dec	ecx
  2763 0000136E 7502                    	jnz	short lff22m2_2_3
  2764 00001370 31D2                    	xor	edx, edx
  2765                                  lff22m2_2_3:
  2766 00001372 E87D070000               	call	interpolating_2_16bit_mono ; 2 of 17 .. 6 of 17
  2767 00001377 E31E                    	jecxz	lff22m2_3
  2768 00001379 4D                      	dec	ebp
  2769 0000137A 75EC                    	jnz	short lff22m2_2_2
  2770                                  
  2771 0000137C A0[DB1E0000]            	mov	al, [faz]
  2772 00001381 FEC8                    	dec	al
  2773 00001383 74C6                    	jz	short lff22m2_9
  2774 00001385 FE0D[DB1E0000]          	dec	byte [faz]
  2775 0000138B BD04000000              	mov	ebp, 4
  2776 00001390 FEC8                    	dec	al
  2777 00001392 75C3                    	jnz	short lff22m2_1 ; 3:2:2:2:2 ; 7-11 of 17
  2778 00001394 45                      	inc	ebp ; 5
  2779 00001395 EBC0                    	jmp	short lff22m2_1 ; 3:2:2:2:2:2 ; 12-17 of 17
  2780                                  
  2781                                  lff22m2_3:
  2782                                  lff22s2_3:
  2783 00001397 E97FF4FFFF              	jmp	lff22_3	; padfill
  2784                                  		; (put zeros in the remain words of the buffer)
  2785                                  lff22m2_7:
  2786                                  lff22s2_7:
  2787 0000139C E994F4FFFF              	jmp	lff22_5  ; error
  2788                                  
  2789                                  ;----------------------------------------------------------------------------
  2790                                  
  2791                                  load_22khz_stereo_16_bit:
  2792 000013A1 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2793                                  					; last of the file?
  2794 000013A8 7402                    	jz	short lff22s2_0		; no
  2795 000013AA F9                      	stc
  2796 000013AB C3                      	retn
  2797                                  
  2798                                  lff22s2_0:
  2799                                  	; edi = audio buffer address
  2800                                  
  2801 000013AC BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2802                                  
  2803                                  	; load file into memory
  2804                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000013B1 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000013B7 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000013B9 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000013BF B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000013C4 CD40                <1>  int 40h
  2805 000013C6 72D4                    	jc	short lff22s2_7 ; error !
  2806                                  
  2807 000013C8 A3[EC810000]            	mov	[count], eax
  2808                                  
  2809 000013CD C1E802                  	shr	eax, 2	; dword (left chan word + right chan word)
  2810 000013D0 7505                    	jnz	short lff22s2_8
  2811 000013D2 E95EF4FFFF              	jmp	lff22_eof
  2812                                  
  2813                                  lff22s2_8:
  2814 000013D7 89C1                    	mov	ecx, eax	; dword count
  2815                                  lff22s2_9:
  2816 000013D9 BD05000000              	mov	ebp, 5 ; interpolation (one step) loop count
  2817 000013DE C605[DB1E0000]03        	mov	byte [faz], 3  ; 3 steps/phase
  2818                                  lff22s2_1:
  2819                                  	; 3:2:2:2:2:2::3:2:2:2:2::3:2:2:2:2:2  ; 37/17
  2820 000013E5 66AD                    	lodsw
  2821 000013E7 89C3                    	mov	ebx, eax
  2822 000013E9 66AD                    	lodsw
  2823 000013EB 8B16                    	mov	edx, [esi]
  2824 000013ED 668915[D71E0000]        	mov	[next_val_l], dx
  2825 000013F4 C1EA10                  	shr	edx, 16
  2826 000013F7 49                      	dec	ecx
  2827 000013F8 7509                    	jnz	short lff22s2_2_1
  2828 000013FA 31D2                    	xor	edx, edx ; 0
  2829 000013FC 668915[D71E0000]        	mov	[next_val_l], dx
  2830                                  lff22s2_2_1:
  2831                                  	; bx = [previous_val_l]
  2832                                  	; ax = [previous_val_r]
  2833                                  	; [next_val_l]
  2834                                  	; dx = [next_val_r]
  2835 00001403 E889060000              	call	interpolating_3_16bit_stereo ; 1 of 17 
  2836 00001408 E38D                    	jecxz	lff22s2_3
  2837                                  lff22s2_2_2:
  2838 0000140A 66AD                    	lodsw
  2839 0000140C 89C3                    	mov	ebx, eax
  2840 0000140E 66AD                    	lodsw
  2841 00001410 8B16                    	mov	edx, [esi]
  2842 00001412 668915[D71E0000]        	mov	[next_val_l], dx
  2843 00001419 C1EA10                  	shr	edx, 16
  2844 0000141C 49                      	dec	ecx
  2845 0000141D 7509                    	jnz	short lff22s2_2_3
  2846 0000141F 31D2                    	xor	edx, edx ; 0
  2847 00001421 668915[D71E0000]        	mov	[next_val_l], dx
  2848                                  lff22s2_2_3:
  2849 00001428 E8DF060000               	call	interpolating_2_16bit_stereo ; 2 of 17 .. 6 of 17
  2850 0000142D E31E                    	jecxz	lff22s2_2_4
  2851                                  
  2852 0000142F 4D                      	dec	ebp
  2853 00001430 75D8                    	jnz	short lff22s2_2_2
  2854                                  
  2855 00001432 A0[DB1E0000]            	mov	al, [faz]
  2856 00001437 FEC8                    	dec	al
  2857 00001439 749E                    	jz	short lff22s2_9
  2858 0000143B FE0D[DB1E0000]          	dec	byte [faz]
  2859 00001441 BD04000000              	mov	ebp, 4
  2860 00001446 FEC8                    	dec	al
  2861 00001448 759B                    	jnz	short lff22s2_1 ; 3:2:2:2:2 ; 7-11 of 17
  2862 0000144A 45                      	inc	ebp ; 5
  2863 0000144B EB98                    	jmp	short lff22s2_1 ; 3:2:2:2:2:2 ; 12-17 of 17
  2864                                  
  2865                                  lff22s2_2_4:
  2866 0000144D E9C9F3FFFF              	jmp	lff22_3	; padfill
  2867                                  
  2868                                  ;----------------------------------------------------------------------------
  2869                                  
  2870                                  load_11khz_mono_8_bit:
  2871 00001452 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2872                                  					; last of the file?
  2873 00001459 7402                    	jz	short lff11m_0		; no
  2874 0000145B F9                      	stc
  2875 0000145C C3                      	retn
  2876                                  
  2877                                  lff11m_0:
  2878                                  	; edi = audio buffer address
  2879                                  
  2880 0000145D BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2881                                  
  2882                                  	; load file into memory
  2883                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001462 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001468 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000146A 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001470 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001475 CD40                <1>  int 40h
  2884 00001477 7247                    	jc	short lff11m_7 ; error !
  2885                                  
  2886 00001479 A3[EC810000]            	mov	[count], eax
  2887                                  
  2888 0000147E 21C0                    	and	eax, eax
  2889 00001480 7505                    	jnz	short lff11m_8
  2890 00001482 E9AEF3FFFF              	jmp	lff11_eof
  2891                                  
  2892                                  lff11m_8:
  2893 00001487 89C1                    	mov	ecx, eax	; byte count
  2894                                  lff11m_9:
  2895 00001489 BD06000000              	mov	ebp, 6 ; interpolation (one step) loop count
  2896                                  lff11m_1:
  2897                                  	; 5:4:4::5:4:4::5:4:4::5:4:4::5:4:4::5:4  ; 74/17
  2898 0000148E AC                      	lodsb
  2899 0000148F 8A16                    	mov	dl, [esi]
  2900 00001491 49                      	dec	ecx
  2901 00001492 7502                    	jnz	short lff11m_2_1
  2902 00001494 B280                    	mov	dl, 80h
  2903                                  lff11m_2_1:	
  2904                                  	; al = [previous_val]
  2905                                  	; dl = [next_val]
  2906 00001496 E8A0060000              	call	interpolating_5_8bit_mono
  2907 0000149B E328                    	jecxz	lff11m_3
  2908                                  lff11m_2_2:
  2909 0000149D AC                      	lodsb
  2910 0000149E 8A16                    	mov	dl, [esi]
  2911 000014A0 49                      	dec	ecx
  2912 000014A1 7502                    	jnz	short lff11m_2_3
  2913 000014A3 B280                    	mov	dl, 80h
  2914                                  lff11m_2_3:
  2915 000014A5 E89D070000               	call	interpolating_4_8bit_mono
  2916 000014AA E319                    	jecxz	lff11m_3
  2917                                  
  2918 000014AC 4D                      	dec	ebp
  2919 000014AD 74DA                    	jz	short lff11m_9
  2920                                  
  2921 000014AF AC                      	lodsb
  2922 000014B0 8A16                    	mov	dl, [esi]
  2923 000014B2 49                      	dec	ecx
  2924 000014B3 7502                    	jnz	short lff11m_2_4
  2925 000014B5 B280                    	mov	dl, 80h
  2926                                  lff11m_2_4:
  2927 000014B7 E88B070000              	call	interpolating_4_8bit_mono
  2928 000014BC E307                    	jecxz	lff11m_3
  2929 000014BE EBCE                    	jmp	short lff11m_1
  2930                                  
  2931                                  lff11m_7:
  2932                                  lff11s_7:
  2933 000014C0 E970F3FFFF              	jmp	lff11_5  ; error
  2934                                  
  2935                                  lff11m_3:
  2936                                  lff11s_3:
  2937 000014C5 E951F3FFFF              	jmp	lff11_3	; padfill
  2938                                  		; (put zeros in the remain words of the buffer)
  2939                                  
  2940                                  ;----------------------------------------------------------------------------
  2941                                  
  2942                                  load_11khz_stereo_8_bit:
  2943 000014CA F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  2944                                  					; last of the file?
  2945 000014D1 7402                    	jz	short lff11s_0		; no
  2946 000014D3 F9                      	stc
  2947 000014D4 C3                      	retn
  2948                                  
  2949                                  lff11s_0:
  2950                                  	; edi = audio buffer address
  2951                                  
  2952 000014D5 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  2953                                  
  2954                                  	; load file into memory
  2955                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000014DA 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000014E0 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000014E2 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000014E8 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000014ED CD40                <1>  int 40h
  2956 000014EF 72CF                    	jc	short lff11s_7 ; error !
  2957                                  
  2958 000014F1 A3[EC810000]            	mov	[count], eax
  2959                                  
  2960 000014F6 D1E8                    	shr	eax, 1
  2961 000014F8 7505                    	jnz	short lff11s_8
  2962 000014FA E936F3FFFF              	jmp	lff11_eof
  2963                                  
  2964                                  lff11s_8:
  2965 000014FF 89C1                    	mov	ecx, eax	; word count
  2966                                  lff11s_9:
  2967 00001501 BD06000000              	mov	ebp, 6 ; interpolation (one step) loop count
  2968                                  lff11s_1:
  2969                                  	; 5:4:4::5:4:4::5:4:4::5:4:4::5:4:4::5:4  ; 74/17
  2970 00001506 66AD                    	lodsw
  2971 00001508 668B16                  	mov	dx, [esi]
  2972 0000150B 49                      	dec	ecx
  2973 0000150C 7504                    	jnz	short lff11s_2_1
  2974 0000150E 66BA8080                	mov	dx, 8080h
  2975                                  lff11s_2_1:
  2976                                  	; al = [previous_val_l]
  2977                                  	; ah = [previous_val_r]
  2978                                  	; dl = [next_val_l]
  2979                                  	; dh = [next_val_r]
  2980 00001512 E883060000              	call	interpolating_5_8bit_stereo
  2981 00001517 E3AC                    	jecxz	lff11s_3
  2982                                  lff11s_2_2:
  2983 00001519 66AD                    	lodsw
  2984 0000151B 668B16                  	mov	dx, [esi]
  2985 0000151E 49                      	dec	ecx
  2986 0000151F 7504                    	jnz	short lff11s_2_3
  2987 00001521 66BA8080                	mov	dx, 8080h
  2988                                  lff11s_2_3:
  2989 00001525 E85C070000               	call	interpolating_4_8bit_stereo
  2990 0000152A E399                    	jecxz	lff11s_3
  2991                                  	
  2992 0000152C 4D                      	dec	ebp
  2993 0000152D 74D2                    	jz	short lff11s_9
  2994                                  
  2995 0000152F 66AD                    	lodsw
  2996 00001531 668B16                  	mov	dx, [esi]
  2997 00001534 49                      	dec	ecx
  2998 00001535 7504                    	jnz	short lff11s_2_4
  2999 00001537 66BA8080                	mov	dx, 8080h
  3000                                  lff11s_2_4:
  3001 0000153B E846070000              	call	interpolating_4_8bit_stereo
  3002 00001540 E383                    	jecxz	lff11s_3
  3003 00001542 EBC2                    	jmp	short lff11s_1
  3004                                  
  3005                                  ;----------------------------------------------------------------------------
  3006                                  
  3007                                  load_11khz_mono_16_bit:
  3008 00001544 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3009                                  					; last of the file?
  3010 0000154B 7402                    	jz	short lff11m2_0		; no
  3011 0000154D F9                      	stc
  3012 0000154E C3                      	retn
  3013                                  
  3014                                  lff11m2_0:
  3015                                  	; edi = audio buffer address
  3016                                  
  3017 0000154F BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3018                                  
  3019                                  	; load file into memory
  3020                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001554 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000155A 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000155C 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001562 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001567 CD40                <1>  int 40h
  3021 00001569 724D                    	jc	short lff11m2_7 ; error !
  3022                                  
  3023 0000156B A3[EC810000]            	mov	[count], eax
  3024                                  	
  3025 00001570 D1E8                    	shr	eax, 1
  3026 00001572 7505                    	jnz	short lff11m2_8
  3027 00001574 E9BCF2FFFF              	jmp	lff11_eof
  3028                                  
  3029                                  lff11m2_8:
  3030 00001579 89C1                    	mov	ecx, eax	; word count
  3031                                  lff11m2_9:
  3032 0000157B BD06000000              	mov	ebp, 6 ; interpolation (one step) loop count
  3033                                  lff11m2_1:
  3034                                  	; 5:4:4::5:4:4::5:4:4::5:4:4::5:4:4::5:4  ; 74/17
  3035 00001580 66AD                    	lodsw
  3036 00001582 668B16                  	mov	dx, [esi]
  3037 00001585 49                      	dec	ecx
  3038 00001586 7502                    	jnz	short lff11m2_2_1
  3039 00001588 31D2                    	xor	edx, edx
  3040                                  lff11m2_2_1:	
  3041                                  	; ax = [previous_val]
  3042                                  	; dx = [next_val]
  3043 0000158A E864070000              	call	interpolating_5_16bit_mono
  3044 0000158F E362                    	jecxz	lff11m2_3
  3045                                  lff11m2_2_2:
  3046 00001591 66AD                    	lodsw
  3047 00001593 668B16                  	mov	dx, [esi]
  3048 00001596 49                      	dec	ecx
  3049 00001597 7502                    	jnz	short lff11m2_2_3
  3050 00001599 31D2                    	xor	edx, edx
  3051                                  lff11m2_2_3:
  3052 0000159B E87D080000               	call	interpolating_4_16bit_mono
  3053 000015A0 E351                    	jecxz	lff11m2_3
  3054                                  
  3055 000015A2 4D                      	dec	ebp
  3056 000015A3 74D6                    	jz	short lff11m2_9
  3057                                  
  3058 000015A5 66AD                    	lodsw
  3059 000015A7 668B16                  	mov	dx, [esi]
  3060 000015AA 49                      	dec	ecx
  3061 000015AB 7502                    	jnz	short lff11m2_2_4
  3062 000015AD 31D2                    	xor	edx, edx
  3063                                  lff11m2_2_4:
  3064 000015AF E869080000               	call	interpolating_4_16bit_mono
  3065 000015B4 E33D                    	jecxz	lff11m2_3
  3066 000015B6 EBC8                    	jmp	short lff11m2_1
  3067                                  
  3068                                  lff11m2_7:
  3069                                  lff11s2_7:
  3070 000015B8 E978F2FFFF              	jmp	lff11_5  ; error
  3071                                  
  3072                                  ;----------------------------------------------------------------------------
  3073                                  
  3074                                  load_11khz_stereo_16_bit:
  3075 000015BD F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3076                                  					; last of the file?
  3077 000015C4 7402                    	jz	short lff11s2_0		; no
  3078 000015C6 F9                      	stc
  3079 000015C7 C3                      	retn
  3080                                  
  3081                                  lff11s2_0:
  3082                                  	; edi = audio buffer address
  3083                                  
  3084 000015C8 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3085                                  
  3086                                  	; load file into memory
  3087                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000015CD 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000015D3 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000015D5 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000015DB B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000015E0 CD40                <1>  int 40h
  3088 000015E2 72D4                    	jc	short lff11s2_7 ; error !
  3089                                  
  3090 000015E4 A3[EC810000]            	mov	[count], eax
  3091                                  	
  3092 000015E9 C1E802                  	shr	eax, 2	; dword (left chan word + right chan word)
  3093 000015EC 750A                    	jnz	short lff11s2_8
  3094 000015EE E942F2FFFF              	jmp	lff11_eof
  3095                                  
  3096                                  lff11m2_3:
  3097                                  lff11s2_3:
  3098 000015F3 E923F2FFFF              	jmp	lff11_3	; padfill
  3099                                  		; (put zeros in the remain words of the buffer)
  3100                                  
  3101                                  lff11s2_8:
  3102 000015F8 89C1                    	mov	ecx, eax	; dword count
  3103                                  lff11s2_9:
  3104 000015FA BD06000000              	mov	ebp, 6 ; interpolation (one step) loop count
  3105                                  lff11s2_1:
  3106                                  	; 5:4:4::5:4:4::5:4:4::5:4:4::5:4:4::5:4  ; 74/17
  3107 000015FF 66AD                    	lodsw
  3108 00001601 89C3                    	mov	ebx, eax
  3109 00001603 66AD                    	lodsw
  3110 00001605 8B16                    	mov	edx, [esi]
  3111                                  	;mov	[next_val_l], edx
  3112                                  	;shr	edx, 16
  3113                                  	;mov	[next_val_r], dx
  3114 00001607 49                      	dec	ecx
  3115 00001608 7502                    	jnz	short lff11s2_2_1
  3116 0000160A 31D2                    	xor	edx, edx ; 0
  3117                                  	;mov	[next_val_l], dx
  3118                                  	;mov	[next_val_r], dx
  3119                                  lff11s2_2_1:
  3120                                  	; bx = [previous_val_l]
  3121                                  	; ax = [previous_val_r]
  3122                                  	; [next_val_l]
  3123                                  	; dx = [next_val_r]
  3124 0000160C 8915[D71E0000]          	mov	[next_val_l], edx
  3125                                  
  3126 00001612 E837070000              	call	interpolating_5_16bit_stereo
  3127 00001617 E3DA                    	jecxz	lff11s2_3
  3128                                  lff11s2_2_2:
  3129 00001619 66AD                    	lodsw
  3130 0000161B 89C3                    	mov	ebx, eax
  3131 0000161D 66AD                    	lodsw
  3132 0000161F 8B16                    	mov	edx, [esi]
  3133                                  	;mov	[next_val_l], dx
  3134                                  	;shr	edx, 16
  3135                                  	;mov	[next_val_r], dx
  3136 00001621 49                      	dec	ecx
  3137 00001622 7502                    	jnz	short lff11s2_2_3
  3138 00001624 31D2                    	xor	edx, edx ; 0
  3139                                  	;mov	[next_val_l], dx
  3140                                  	;mov	[next_val_r], dx
  3141                                  lff11s2_2_3:
  3142 00001626 8915[D71E0000]          	mov	[next_val_l], edx
  3143                                  
  3144 0000162C E825080000              	call	interpolating_4_16bit_stereo
  3145 00001631 E3C0                    	jecxz	lff11s2_3
  3146                                  	
  3147 00001633 4D                      	dec	ebp
  3148 00001634 74C4                    	jz	short lff11s2_9
  3149                                  
  3150 00001636 66AD                    	lodsw
  3151 00001638 89C3                    	mov	ebx, eax
  3152 0000163A 66AD                    	lodsw
  3153 0000163C 8B16                    	mov	edx, [esi]
  3154                                  	;mov	[next_val_l], dx
  3155                                  	;shr	edx, 16
  3156                                  	;mov	[next_val_r], dx
  3157 0000163E 49                      	dec	ecx
  3158 0000163F 7502                    	jnz	short lff11s2_2_4
  3159 00001641 31D2                    	xor	edx, edx ; 0
  3160                                  	;mov	[next_val_l], dx
  3161                                  	;mov	[next_val_r], dx
  3162                                  lff11s2_2_4:
  3163 00001643 8915[D71E0000]          	mov	[next_val_l], edx
  3164                                  
  3165 00001649 E808080000               	call	interpolating_4_16bit_stereo
  3166 0000164E E3A3                    	jecxz	lff11s2_3
  3167 00001650 EBAD                    	jmp	short lff11s2_1
  3168                                  
  3169                                  ;----------------------------------------------------------------------------
  3170                                  
  3171                                  load_44khz_mono_8_bit:
  3172 00001652 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3173                                  					; last of the file?
  3174 00001659 7402                    	jz	short lff44m_0		; no
  3175 0000165B F9                      	stc
  3176 0000165C C3                      	retn
  3177                                  
  3178                                  lff44m_0:
  3179                                  	; edi = audio buffer address
  3180                                  
  3181 0000165D BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3182                                  
  3183                                  	; load file into memory
  3184                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001662 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001668 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000166A 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001670 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001675 CD40                <1>  int 40h
  3185 00001677 7250                    	jc	short lff44m_7 ; error !
  3186                                  
  3187 00001679 A3[EC810000]            	mov	[count], eax
  3188                                  
  3189 0000167E 21C0                    	and	eax, eax
  3190 00001680 7505                    	jnz	short lff44m_8
  3191 00001682 E9AEF1FFFF              	jmp	lff44_eof
  3192                                  
  3193                                  lff44m_8:
  3194 00001687 89C1                    	mov	ecx, eax	; byte count
  3195                                  lff44m_9:
  3196 00001689 BD0A000000              	mov	ebp, 10 ; interpolation (one step) loop count
  3197 0000168E C605[DB1E0000]02        	mov	byte [faz], 2  ; 2 steps/phases
  3198                                  lff44m_1:
  3199                                  	; 2:1:1:1:1:1:1:1:1:1:1::	; 25/23
  3200                                  	; 2:1:1:1:1:1:1:1:1:1:1:1
  3201 00001695 AC                      	lodsb
  3202 00001696 8A16                    	mov	dl, [esi]
  3203 00001698 49                      	dec	ecx
  3204 00001699 7502                    	jnz	short lff44m_2_1
  3205 0000169B B280                    	mov	dl, 80h
  3206                                  lff44m_2_1:
  3207                                  	; al = [previous_val]
  3208                                  	; dl = [next_val]
  3209 0000169D E871030000              	call	interpolating_2_8bit_mono
  3210 000016A2 E320                    	jecxz	lff44m_3
  3211                                  lff44m_2_2:
  3212 000016A4 AC                      	lodsb
  3213 000016A5 2C80                    	sub	al, 80h
  3214 000016A7 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3215 000016AB 66AB                    	stosw		; (L)
  3216 000016AD 66AB                    	stosw		; (R)
  3217                                  
  3218 000016AF 49                      	dec	ecx
  3219 000016B0 7412                    	jz	short lff44m_3
  3220 000016B2 4D                      	dec	ebp
  3221 000016B3 75EF                    	jnz	short lff44m_2_2
  3222                                  	
  3223 000016B5 FE0D[DB1E0000]          	dec	byte [faz]
  3224 000016BB 74CC                    	jz	short lff44m_9
  3225 000016BD BD0B000000              	mov	ebp, 11
  3226 000016C2 EBD1                    	jmp	short lff44m_1
  3227                                  
  3228                                  lff44m_3:
  3229                                  lff44s_3:
  3230 000016C4 E952F1FFFF              	jmp	lff44_3	; padfill
  3231                                  		; (put zeros in the remain words of the buffer)
  3232                                  lff44m_7:
  3233                                  lff44s_7:
  3234 000016C9 E967F1FFFF              	jmp	lff44_5  ; error
  3235                                  
  3236                                  ;----------------------------------------------------------------------------
  3237                                  
  3238                                  load_44khz_stereo_8_bit:
  3239 000016CE F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3240                                  					; last of the file?
  3241 000016D5 7402                    	jz	short lff44s_0		; no
  3242 000016D7 F9                      	stc
  3243 000016D8 C3                      	retn
  3244                                  
  3245                                  lff44s_0:
  3246                                  	; edi = audio buffer address
  3247                                  
  3248 000016D9 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3249                                  
  3250                                  	; load file into memory
  3251                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000016DE 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000016E4 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000016E6 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000016EC B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000016F1 CD40                <1>  int 40h
  3252 000016F3 72D4                    	jc	short lff44s_7 ; error !
  3253                                  
  3254 000016F5 A3[EC810000]            	mov	[count], eax
  3255                                  
  3256 000016FA D1E8                    	shr	eax, 1
  3257 000016FC 7505                    	jnz	short lff44s_8
  3258 000016FE E932F1FFFF              	jmp	lff44_eof
  3259                                  
  3260                                  lff44s_8:
  3261 00001703 89C1                    	mov	ecx, eax	; word count
  3262                                  lff44s_9:
  3263 00001705 BD0A000000              	mov	ebp, 10 ; interpolation (one step) loop count
  3264 0000170A C605[DB1E0000]02        	mov	byte [faz], 2  ; 2 steps/phase
  3265                                  lff44s_1:
  3266                                  	; 2:1:1:1:1:1:1:1:1:1:1::	; 25/23
  3267                                  	; 2:1:1:1:1:1:1:1:1:1:1:1
  3268 00001711 66AD                    	lodsw
  3269 00001713 668B16                  	mov	dx, [esi]
  3270 00001716 49                      	dec	ecx
  3271 00001717 7504                    	jnz	short lff44s_2_1
  3272 00001719 66BA8080                	mov	dx, 8080h
  3273                                  lff44s_2_1:	
  3274                                  	; al = [previous_val_l]
  3275                                  	; ah = [previous_val_r]
  3276                                  	; dl = [next_val_l]
  3277                                  	; dh = [next_val_r]
  3278 0000171D E80E030000              	call	interpolating_2_8bit_stereo
  3279 00001722 E3A0                    	jecxz	lff44s_3
  3280                                  lff44s_2_2:
  3281 00001724 AC                      	lodsb
  3282 00001725 2C80                    	sub	al, 80h
  3283 00001727 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3284 0000172B 66AB                    	stosw		; (L)
  3285 0000172D AC                      	lodsb
  3286 0000172E 2C80                    	sub	al, 80h
  3287 00001730 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3288 00001734 66AB                    	stosw		; (R)
  3289                                  
  3290 00001736 49                      	dec	ecx
  3291 00001737 748B                    	jz	short lff44s_3
  3292 00001739 4D                      	dec	ebp
  3293 0000173A 75E8                    	jnz	short lff44s_2_2
  3294                                  	
  3295 0000173C FE0D[DB1E0000]          	dec	byte [faz]
  3296 00001742 74C1                    	jz	short lff44s_9
  3297 00001744 BD0B000000              	mov	ebp, 11
  3298 00001749 EBC6                    	jmp	short lff44s_1
  3299                                  
  3300                                  ;----------------------------------------------------------------------------
  3301                                  
  3302                                  load_44khz_mono_16_bit:
  3303 0000174B F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3304                                  					; last of the file?
  3305 00001752 7402                    	jz	short lff44m2_0		; no
  3306 00001754 F9                      	stc
  3307 00001755 C3                      	retn
  3308                                  
  3309                                  lff44m2_0:
  3310                                  	; edi = audio buffer address
  3311                                  
  3312 00001756 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3313                                  
  3314                                  	; load file into memory
  3315                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000175B 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001761 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00001763 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001769 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 0000176E CD40                <1>  int 40h
  3316 00001770 724D                    	jc	short lff44m2_7 ; error !
  3317                                  
  3318 00001772 A3[EC810000]            	mov	[count], eax
  3319                                  
  3320 00001777 D1E8                    	shr	eax, 1
  3321 00001779 7505                    	jnz	short lff44m2_8
  3322 0000177B E9B5F0FFFF              	jmp	lff44_eof
  3323                                  
  3324                                  lff44m2_8:
  3325 00001780 89C1                    	mov	ecx, eax	; word count
  3326                                  lff44m2_9:
  3327 00001782 BD0A000000              	mov	ebp, 10 ; interpolation (one step) loop count
  3328 00001787 C605[DB1E0000]02        	mov	byte [faz], 2  ; 2 steps/phases
  3329                                  lff44m2_1:
  3330                                  	; 2:1:1:1:1:1:1:1:1:1:1::	; 25/23
  3331                                  	; 2:1:1:1:1:1:1:1:1:1:1:1
  3332 0000178E 66AD                    	lodsw
  3333 00001790 668B16                  	mov	dx, [esi]
  3334 00001793 49                      	dec	ecx
  3335 00001794 7502                    	jnz	short lff44m2_2_1
  3336 00001796 31D2                    	xor	edx, edx
  3337                                  lff44m2_2_1:	
  3338                                  	; ax = [previous_val]
  3339                                  	; dx = [next_val]
  3340 00001798 E857030000              	call	interpolating_2_16bit_mono
  3341 0000179D E31B                    	jecxz	lff44m2_3
  3342                                  lff44m2_2_2:
  3343 0000179F 66AD                    	lodsw
  3344 000017A1 66AB                    	stosw		; (L)eft Channel
  3345 000017A3 66AB                    	stosw		; (R)ight Channel
  3346                                  
  3347 000017A5 49                      	dec	ecx
  3348 000017A6 7412                    	jz	short lff44m2_3	
  3349 000017A8 4D                      	dec	ebp
  3350 000017A9 75F4                    	jnz	short lff44m2_2_2
  3351                                  
  3352 000017AB FE0D[DB1E0000]          	dec	byte [faz]
  3353 000017B1 74CF                    	jz	short lff44m2_9 
  3354 000017B3 BD0B000000              	mov	ebp, 11
  3355 000017B8 EBD4                    	jmp	short lff44m2_1
  3356                                  
  3357                                  lff44m2_3:
  3358                                  lff44s2_3:
  3359 000017BA E95CF0FFFF              	jmp	lff44_3	; padfill
  3360                                  		; (put zeros in the remain words of the buffer)
  3361                                  lff44m2_7:
  3362                                  lff44s2_7:
  3363 000017BF E971F0FFFF              	jmp	lff44_5  ; error
  3364                                  
  3365                                  ;----------------------------------------------------------------------------
  3366                                  
  3367                                  load_44khz_stereo_16_bit:
  3368 000017C4 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3369                                  					; last of the file?
  3370 000017CB 7402                    	jz	short lff44s2_0		; no
  3371 000017CD F9                      	stc
  3372 000017CE C3                      	retn
  3373                                  
  3374                                  lff44s2_0:
  3375                                  	; edi = audio buffer address
  3376                                  
  3377 000017CF BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3378                                  
  3379                                  	; load file into memory
  3380                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000017D4 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000017DA 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000017DC 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000017E2 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000017E7 CD40                <1>  int 40h
  3381 000017E9 72D4                    	jc	short lff44s2_7 ; error !
  3382                                  
  3383 000017EB A3[EC810000]            	mov	[count], eax
  3384                                  
  3385 000017F0 C1E802                  	shr	eax, 2	; dword (left chan word + right chan word)
  3386 000017F3 7505                    	jnz	short lff44s2_8
  3387 000017F5 E93BF0FFFF              	jmp	lff44_eof
  3388                                  
  3389                                  lff44s2_8:
  3390 000017FA 89C1                    	mov	ecx, eax	; dword count
  3391                                  lff44s2_9:
  3392 000017FC BD0A000000              	mov	ebp, 10 ; interpolation (one step) loop count
  3393 00001801 C605[DB1E0000]02        	mov	byte [faz], 2  ; 2 steps/phase
  3394                                  lff44s2_1:
  3395                                  	; 2:1:1:1:1:1:1:1:1:1:1::	; 25/23
  3396                                  	; 2:1:1:1:1:1:1:1:1:1:1:1
  3397 00001808 66AD                    	lodsw
  3398 0000180A 89C3                    	mov	ebx, eax
  3399 0000180C 66AD                    	lodsw
  3400                                  	;mov	dx, [esi]
  3401                                  	;mov	[next_val_l], dx
  3402                                  	;mov	dx, [esi+2]
  3403 0000180E 8B16                    	mov	edx, [esi]
  3404 00001810 668915[D71E0000]        	mov	[next_val_l], dx
  3405 00001817 C1EA10                  	shr	edx, 16
  3406 0000181A 49                      	dec	ecx
  3407 0000181B 7509                    	jnz	short lff44s2_2_1
  3408 0000181D 31D2                    	xor	edx, edx ; 0
  3409 0000181F 668915[D71E0000]        	mov	[next_val_l], dx
  3410                                  lff44s2_2_1:
  3411                                  	; bx = [previous_val_l]
  3412                                  	; ax = [previous_val_r]
  3413                                  	; [next_val_l]
  3414                                  	; dx = [next_val_r]
  3415 00001826 E8E1020000              	call	interpolating_2_16bit_stereo
  3416 0000182B E38D                    	jecxz	lff44s2_3
  3417                                  lff44s2_2_2:
  3418                                  	;movsw		; (L)eft Channel
  3419                                  	;movsw		; (R)ight Channel
  3420 0000182D A5                      	movsd
  3421                                  
  3422 0000182E 49                      	dec	ecx
  3423 0000182F 7489                    	jz	short lff44s2_3	
  3424 00001831 4D                      	dec	ebp
  3425 00001832 75F9                    	jnz	short lff44s2_2_2
  3426                                  	
  3427 00001834 FE0D[DB1E0000]          	dec	byte [faz]
  3428 0000183A 74C0                    	jz	short lff44s2_9 
  3429 0000183C BD0B000000              	mov	ebp, 11
  3430 00001841 EBC5                    	jmp	short lff44s2_1
  3431                                  
  3432                                  ;----------------------------------------------------------------------------
  3433                                  
  3434                                  load_12khz_mono_8_bit:
  3435 00001843 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3436                                  					; last of the file?
  3437 0000184A 7402                    	jz	short lff12m_0		; no
  3438 0000184C F9                      	stc
  3439 0000184D C3                      	retn
  3440                                  
  3441                                  lff12m_0:
  3442                                  	; edi = audio buffer address
  3443                                  
  3444 0000184E BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3445                                  
  3446                                  	; load file into memory
  3447                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001853 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001859 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000185B 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001861 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001866 CD40                <1>  int 40h
  3448 00001868 7256                    	jc	short lff12m_7 ; error !
  3449                                  
  3450 0000186A A3[EC810000]            	mov	[count], eax
  3451                                  
  3452 0000186F 21C0                    	and	eax, eax
  3453 00001871 7505                    	jnz	short lff12m_8
  3454 00001873 E9BDEFFFFF              	jmp	lff12_eof
  3455                                  
  3456                                  lff12m_8:
  3457 00001878 89C1                    	mov	ecx, eax	; byte count
  3458                                  lff12m_1:
  3459                                  	; original-interpolated-interpolated-interpolated
  3460 0000187A AC                      	lodsb
  3461 0000187B 8A16                    	mov	dl, [esi]
  3462 0000187D 49                      	dec	ecx
  3463 0000187E 7502                    	jnz	short lff12m_2
  3464 00001880 B280                    	mov	dl, 80h
  3465                                  lff12m_2:	
  3466                                  	; al = [previous_val]
  3467                                  	; dl = [next_val]
  3468 00001882 E8C0030000               	call	interpolating_4_8bit_mono
  3469 00001887 E353                    	jecxz	lff12m_3
  3470 00001889 EBEF                    	jmp	short lff12m_1
  3471                                  
  3472                                  ;----------------------------------------------------------------------------
  3473                                  
  3474                                  load_12khz_stereo_8_bit:
  3475 0000188B F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3476                                  					; last of the file?
  3477 00001892 7402                    	jz	short lff12s_0		; no
  3478 00001894 F9                      	stc
  3479 00001895 C3                      	retn
  3480                                  
  3481                                  lff12s_0:
  3482                                  	; edi = audio buffer address
  3483                                  
  3484 00001896 BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3485                                  
  3486                                  	; load file into memory
  3487                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000189B 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000018A1 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000018A3 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000018A9 B803000000          <1>  mov eax, %1
    96                              <1> 
    97 000018AE CD40                <1>  int 40h
  3488 000018B0 720E                    	jc	short lff12s_7 ; error !
  3489                                  
  3490 000018B2 A3[EC810000]            	mov	[count], eax
  3491                                  	
  3492 000018B7 D1E8                    	shr	eax, 1
  3493 000018B9 750A                    	jnz	short lff12s_8
  3494 000018BB E975EFFFFF              	jmp	lff12_eof
  3495                                  
  3496                                  lff12m_7:
  3497                                  lff12s_7:
  3498 000018C0 E970EFFFFF              	jmp	lff12_5  ; error
  3499                                  
  3500                                  lff12s_8:
  3501 000018C5 89C1                    	mov	ecx, eax	; word count
  3502                                  lff12s_1:
  3503                                  	; original-interpolated-interpolated-interpolated
  3504 000018C7 66AD                    	lodsw
  3505 000018C9 668B16                  	mov	dx, [esi]
  3506 000018CC 49                      	dec	ecx
  3507 000018CD 7504                    	jnz	short lff12s_2
  3508 000018CF 66BA8080                	mov	dx, 8080h
  3509                                  lff12s_2:	
  3510                                  	; al = [previous_val_l]
  3511                                  	; ah = [previous_val_r]
  3512                                  	; dl = [next_val_l]
  3513                                  	; dh = [next_val_r]
  3514 000018D3 E8AE030000              	call	interpolating_4_8bit_stereo
  3515 000018D8 E302                    	jecxz	lff12s_3
  3516 000018DA EBEB                    	jmp	short lff12s_1
  3517                                  
  3518                                  lff12m_3:
  3519                                  lff12s_3:
  3520 000018DC E93AEFFFFF              	jmp	lff12_3	; padfill
  3521                                  		; (put zeros in the remain words of the buffer)
  3522                                  
  3523                                  ;----------------------------------------------------------------------------
  3524                                  
  3525                                  load_12khz_mono_16_bit:
  3526 000018E1 F605[C9770000]01        	test    byte [flags], ENDOFFILE	; have we already read the
  3527                                  					; last of the file?
  3528 000018E8 7402                    	jz	short lff12m2_0		; no
  3529 000018EA F9                      	stc
  3530 000018EB C3                      	retn
  3531                                  
  3532                                  lff12m2_0:
  3533                                  	; edi = audio buffer address
  3534                                  
  3535 000018EC BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3536                                  
  3537                                  	; load file into memory
  3538                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000018F1 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000018F7 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000018F9 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000018FF B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001904 CD40                <1>  int 40h
  3539 00001906 7223                    	jc	short lff12m2_7 ; error !
  3540                                  
  3541 00001908 A3[EC810000]            	mov	[count], eax
  3542                                  
  3543 0000190D D1E8                    	shr	eax, 1
  3544 0000190F 7505                    	jnz	short lff12m2_8
  3545 00001911 E91FEFFFFF              	jmp	lff12_eof
  3546                                  
  3547                                  lff12m2_8:
  3548 00001916 89C1                    	mov	ecx, eax	; word count
  3549                                  lff12m2_1:
  3550                                  	; original-interpolated-interpolated-interpolated
  3551 00001918 66AD                    	lodsw
  3552 0000191A 668B16                  	mov	dx, [esi]
  3553 0000191D 49                      	dec	ecx
  3554 0000191E 7502                    	jnz	short lff12m2_2
  3555 00001920 31D2                    	xor	edx, edx
  3556                                  lff12m2_2:	
  3557                                  	; ax = [previous_val]
  3558                                  	; dx = [next_val]
  3559 00001922 E8F6040000               	call	interpolating_4_16bit_mono
  3560 00001927 E3B3                    	jecxz	lff12m_3
  3561 00001929 EBED                    	jmp	short lff12m2_1
  3562                                  
  3563                                  lff12m2_7:
  3564                                  lff12s2_7:
  3565 0000192B E905EFFFFF              	jmp	lff12_5  ; error
  3566                                  
  3567                                  ;----------------------------------------------------------------------------
  3568                                  
  3569                                  load_12khz_stereo_16_bit:
  3570 00001930 F605[C9770000]01                test    byte [flags], ENDOFFILE	; have we already read the
  3571                                  					; last of the file?
  3572 00001937 7402                    	jz	short lff12s2_0		; no
  3573 00001939 F9                      	stc
  3574 0000193A C3                      	retn
  3575                                  
  3576                                  lff12s2_0:
  3577                                  	; edi = audio buffer address
  3578                                  
  3579 0000193B BE[00000200]            	mov	esi, temp_buffer ; temporary buffer for wav data
  3580                                  
  3581                                  	; load file into memory
  3582                                  	sys 	_read, [FileHandle], esi, [loadsize]
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001940 8B1D[ED730000]      <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001946 89F1                <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00001948 8B15[E4810000]      <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000194E B803000000          <1>  mov eax, %1
    96                              <1> 
    97 00001953 CD40                <1>  int 40h
  3583 00001955 72D4                    	jc	short lff12s2_7 ; error !
  3584                                  
  3585 00001957 A3[EC810000]            	mov	[count], eax
  3586                                  
  3587 0000195C C1E802                  	shr	eax, 2	; dword (left chan word + right chan word)
  3588 0000195F 750A                    	jnz	short lff12s2_8
  3589 00001961 E9CFEEFFFF              	jmp	lff12_eof
  3590                                  
  3591                                  lff12m2_3:
  3592                                  lff12s2_3:
  3593 00001966 E9B0EEFFFF              	jmp	lff12_3	; padfill
  3594                                  		; (put zeros in the remain words of the buffer)
  3595                                  
  3596                                  lff12s2_8:
  3597 0000196B 89C1                    	mov	ecx, eax	; dword count
  3598                                  lff12s2_1:
  3599                                  	; original-interpolated-interpolated-interpolated
  3600 0000196D 66AD                    	lodsw
  3601 0000196F 89C3                    	mov	ebx, eax
  3602 00001971 66AD                    	lodsw
  3603 00001973 8B16                    	mov	edx, [esi]
  3604 00001975 49                      	dec	ecx
  3605 00001976 7502                    	jnz	short lff12s2_2
  3606 00001978 31D2                    	xor	edx, edx ; 0
  3607                                  lff12s2_2:
  3608 0000197A 8915[D71E0000]          	mov	[next_val_l], edx
  3609                                  
  3610                                  	; bx = [previous_val_l]
  3611                                  	; ax = [previous_val_r]
  3612                                  	; [next_val_l]
  3613                                  	; [next_val_r]
  3614 00001980 E8D1040000              	call	interpolating_4_16bit_stereo
  3615 00001985 E3DF                    	jecxz	lff12s2_3
  3616 00001987 EBE4                    	jmp	short lff12s2_1
  3617                                  
  3618                                  ;-----------------------------------------------------------------------------
  3619                                  ;-----------------------------------------------------------------------------
  3620                                  
  3621                                  	; 09/02/2025
  3622                                  
  3623                                  interpolating_3_8bit_mono:
  3624                                  	; al = [previous_val]
  3625                                  	; dl = [next_val]
  3626                                  	; original-interpolated-interpolated
  3627                                  
  3628 00001989 88C3                    	mov	bl, al
  3629 0000198B 2C80                    	sub	al, 80h
  3630 0000198D 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3631 00001991 66AB                    	stosw		; original sample (L)
  3632 00001993 66AB                    	stosw		; original sample (R)
  3633 00001995 88D8                    	mov	al, bl
  3634 00001997 00D0                    	add	al, dl
  3635 00001999 D0D8                    	rcr	al, 1
  3636 0000199B 88C7                    	mov	bh, al	; interpolated middle (temporary)
  3637 0000199D 00D8                    	add	al, bl
  3638 0000199F D0D8                    	rcr	al, 1
  3639 000019A1 2C80                    	sub	al, 80h
  3640 000019A3 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3641 000019A7 66AB                    	stosw		; interpolated sample 1 (L)
  3642 000019A9 66AB                    	stosw		; interpolated sample 1 (R)
  3643 000019AB 88F8                    	mov	al, bh
  3644 000019AD 00D0                    	add	al, dl	; [next_val]
  3645 000019AF D0D8                    	rcr	al, 1
  3646 000019B1 2C80                    	sub	al, 80h
  3647 000019B3 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3648 000019B7 66AB                    	stosw		; interpolated sample 2 (L)
  3649 000019B9 66AB                    	stosw		; interpolated sample 2 (R)
  3650 000019BB C3                      	retn
  3651                                  
  3652                                  ;-----------------------------------------------------------------------------
  3653                                  
  3654                                  interpolating_3_8bit_stereo:
  3655                                  	; al = [previous_val_l]
  3656                                  	; ah = [previous_val_r]
  3657                                  	; dl = [next_val_l]
  3658                                  	; dh = [next_val_r]	
  3659                                  	; original-interpolated-interpolated
  3660                                  
  3661 000019BC 89C3                    	mov	ebx, eax
  3662 000019BE 2C80                    	sub	al, 80h
  3663 000019C0 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3664 000019C4 66AB                    	stosw		; original sample (L)
  3665 000019C6 88F8                    	mov	al, bh
  3666 000019C8 2C80                    	sub	al, 80h
  3667 000019CA 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3668 000019CE 66AB                    	stosw		; original sample (R)
  3669 000019D0 88D8                    	mov	al, bl
  3670 000019D2 00D0                    	add	al, dl	; [next_val_l]
  3671 000019D4 D0D8                    	rcr	al, 1
  3672 000019D6 50                      	push	eax ; *	; al = interpolated middle (L) (temporary)
  3673 000019D7 00D8                    	add	al, bl	; [previous_val_l]
  3674 000019D9 D0D8                    	rcr	al, 1
  3675 000019DB 2C80                    	sub	al, 80h
  3676 000019DD 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3677 000019E1 66AB                    	stosw		; interpolated sample 1 (L)
  3678 000019E3 88F8                    	mov	al, bh
  3679 000019E5 00F0                    	add	al, dh	; [next_val_r]
  3680 000019E7 D0D8                    	rcr	al, 1
  3681 000019E9 50                      	push	eax ; ** ; al = interpolated middle (R) (temporary)
  3682 000019EA 00F8                    	add	al, bh	; [previous_val_r]
  3683 000019EC D0D8                    	rcr	al, 1
  3684 000019EE 2C80                    	sub	al, 80h
  3685 000019F0 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3686 000019F4 66AB                    	stosw		; interpolated sample 1 (R)
  3687 000019F6 5B                      	pop	ebx ; **
  3688 000019F7 58                      	pop	eax ; *
  3689 000019F8 00D0                    	add	al, dl	; [next_val_l]
  3690 000019FA D0D8                    	rcr	al, 1
  3691 000019FC 2C80                    	sub	al, 80h
  3692 000019FE 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3693 00001A02 66AB                    	stosw		; interpolated sample 2 (L)
  3694 00001A04 88D8                    	mov	al, bl
  3695 00001A06 00F0                    	add	al, dh	; [next_val_r]
  3696 00001A08 D0D8                    	rcr	al, 1
  3697 00001A0A 2C80                    	sub	al, 80h
  3698 00001A0C 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3699 00001A10 66AB                    	stosw		; interpolated sample 2 (R)
  3700 00001A12 C3                      	retn
  3701                                  
  3702                                  ;-----------------------------------------------------------------------------
  3703                                  
  3704                                  interpolating_2_8bit_mono:
  3705                                  	; al = [previous_val]
  3706                                  	; dl = [next_val]
  3707                                  	; original-interpolated
  3708                                  
  3709 00001A13 88C3                    	mov	bl, al
  3710 00001A15 2C80                    	sub	al, 80h
  3711 00001A17 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3712 00001A1B 66AB                    	stosw		; original sample (L)
  3713 00001A1D 66AB                    	stosw		; original sample (R)
  3714 00001A1F 88D8                    	mov	al, bl
  3715 00001A21 00D0                    	add	al, dl
  3716 00001A23 D0D8                    	rcr	al, 1
  3717 00001A25 2C80                    	sub	al, 80h
  3718 00001A27 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3719 00001A2B 66AB                    	stosw		; interpolated sample (L)
  3720 00001A2D 66AB                    	stosw		; interpolated sample (R)
  3721 00001A2F C3                      	retn
  3722                                  
  3723                                  ;-----------------------------------------------------------------------------
  3724                                  
  3725                                  interpolating_2_8bit_stereo:
  3726                                  	; al = [previous_val_l]
  3727                                  	; ah = [previous_val_r]
  3728                                  	; dl = [next_val_l]
  3729                                  	; dh = [next_val_r]
  3730                                  	; original-interpolated
  3731                                  
  3732 00001A30 89C3                    	mov	ebx, eax
  3733 00001A32 2C80                    	sub	al, 80h
  3734 00001A34 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3735 00001A38 66AB                    	stosw		; original sample (L)
  3736 00001A3A 88F8                    	mov	al, bh
  3737 00001A3C 2C80                    	sub	al, 80h
  3738 00001A3E 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3739 00001A42 66AB                    	stosw		; original sample (R)
  3740 00001A44 88D8                    	mov	al, bl	; [previous_val_l]
  3741 00001A46 00D0                    	add	al, dl	; [next_val_l]
  3742 00001A48 D0D8                    	rcr	al, 1
  3743 00001A4A 2C80                    	sub	al, 80h
  3744 00001A4C 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3745 00001A50 66AB                    	stosw		; interpolated sample (L)
  3746 00001A52 88F8                    	mov	al, bh
  3747 00001A54 00F0                    	add	al, dh	; [next_val_r]
  3748 00001A56 D0D8                    	rcr	al, 1
  3749 00001A58 2C80                    	sub	al, 80h
  3750 00001A5A 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3751 00001A5E 66AB                    	stosw		; interpolated sample (R)
  3752 00001A60 C3                      	retn
  3753                                  
  3754                                  ;-----------------------------------------------------------------------------
  3755                                  
  3756                                  interpolating_3_16bit_mono:
  3757                                  	; ax = [previous_val]
  3758                                  	; dx = [next_val]
  3759                                  	; original-interpolated-interpolated
  3760                                  
  3761 00001A61 66AB                    	stosw		; original sample (L)
  3762 00001A63 66AB                    	stosw		; original sample (R)
  3763 00001A65 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  3764 00001A68 50                      	push	eax ; *	; [previous_val]
  3765 00001A69 80C680                  	add	dh, 80h
  3766 00001A6C 6601D0                  	add	ax, dx
  3767 00001A6F 66D1D8                  	rcr	ax, 1
  3768 00001A72 5B                      	pop	ebx ; *
  3769 00001A73 93                      	xchg	ebx, eax ; bx  = interpolated middle (temporary)
  3770 00001A74 6601D8                  	add	ax, bx	; [previous_val] + interpolated middle
  3771 00001A77 66D1D8                  	rcr	ax, 1
  3772 00001A7A 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3773 00001A7D 66AB                    	stosw 		; interpolated sample 1 (L)
  3774 00001A7F 66AB                    	stosw		; interpolated sample 1 (R)
  3775 00001A81 89D8                    	mov	eax, ebx
  3776 00001A83 6601D0                  	add	ax, dx	; interpolated middle + [next_val]
  3777 00001A86 66D1D8                  	rcr	ax, 1
  3778 00001A89 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3779 00001A8C 66AB                    	stosw		; interpolated sample 2 (L)
  3780 00001A8E 66AB                    	stosw		; interpolated sample 2 (R)
  3781 00001A90 C3                      	retn
  3782                                  
  3783                                  ;-----------------------------------------------------------------------------
  3784                                  
  3785                                  interpolating_3_16bit_stereo:
  3786                                  	; bx = [previous_val_l]
  3787                                  	; ax = [previous_val_r]
  3788                                  	; [next_val_l]
  3789                                  	; dx = [next_val_r]
  3790                                  	; original-interpolated-interpolated
  3791                                  
  3792 00001A91 93                      	xchg	eax, ebx
  3793 00001A92 66AB                    	stosw		; original sample (L)
  3794 00001A94 93                      	xchg	eax, ebx
  3795 00001A95 66AB                    	stosw		; original sample (R)
  3796 00001A97 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  3797 00001A9A 50                      	push	eax ; *	; [previous_val_r]
  3798 00001A9B 80C780                  	add	bh, 80h
  3799 00001A9E 8005[D81E0000]80        	add	byte [next_val_l+1], 80h
  3800 00001AA5 66A1[D71E0000]          	mov	ax, [next_val_l]
  3801 00001AAB 6601D8                  	add	ax, bx	; [previous_val_l]
  3802 00001AAE 66D1D8                  	rcr	ax, 1
  3803 00001AB1 93                      	xchg	eax, ebx ; ax = [previous_val_l]
  3804 00001AB2 6601D8                  	add	ax, bx	; bx = interpolated middle (L)
  3805 00001AB5 66D1D8                  	rcr	ax, 1
  3806 00001AB8 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3807 00001ABB 66AB                    	stosw 		; interpolated sample 1 (L)
  3808 00001ABD 58                      	pop	eax  ; *
  3809 00001ABE 80C680                  	add	dh, 80h ; convert sound level 0 to 65535 format
  3810 00001AC1 52                      	push	edx  ; * ; [next_val_r]
  3811 00001AC2 92                      	xchg	eax, edx
  3812 00001AC3 6601D0                  	add	ax, dx	; [next_val_r] + [previous_val_r]
  3813 00001AC6 66D1D8                  	rcr	ax, 1	; / 2
  3814 00001AC9 50                      	push	eax ; ** ; interpolated middle (R)
  3815 00001ACA 6601D0                  	add	ax, dx	; + [previous_val_r]
  3816 00001ACD 66D1D8                  	rcr	ax, 1
  3817 00001AD0 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3818 00001AD3 66AB                    	stosw 		; interpolated sample 1 (R)
  3819 00001AD5 66A1[D71E0000]          	mov	ax, [next_val_l]
  3820 00001ADB 6601D8                  	add	ax, bx	; + interpolated middle (L)
  3821 00001ADE 66D1D8                  	rcr	ax, 1
  3822 00001AE1 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3823 00001AE4 66AB                    	stosw 		; interpolated sample 2 (L)
  3824 00001AE6 58                      	pop	eax ; **
  3825 00001AE7 5A                      	pop	edx ; *
  3826 00001AE8 6601D0                  	add	ax, dx	; interpolated middle + [next_val_r]
  3827 00001AEB 66D1D8                  	rcr	ax, 1	; / 2
  3828 00001AEE 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3829 00001AF1 66AB                    	stosw 		; interpolated sample 2 (L)
  3830 00001AF3 C3                      	retn
  3831                                  
  3832                                  ;-----------------------------------------------------------------------------
  3833                                  
  3834                                  interpolating_2_16bit_mono:
  3835                                  	; ax = [previous_val]
  3836                                  	; dx = [next_val]
  3837                                  	; original-interpolated
  3838                                  
  3839 00001AF4 66AB                    	stosw		; original sample (L)
  3840 00001AF6 66AB                    	stosw		; original sample (R)
  3841 00001AF8 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  3842 00001AFB 80C680                  	add	dh, 80h
  3843 00001AFE 6601D0                  	add	ax, dx
  3844 00001B01 66D1D8                  	rcr	ax, 1
  3845 00001B04 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3846 00001B07 66AB                    	stosw		; interpolated sample (L)
  3847 00001B09 66AB                    	stosw		; interpolated sample (R)
  3848 00001B0B C3                      	retn
  3849                                  
  3850                                  ;-----------------------------------------------------------------------------
  3851                                  
  3852                                  interpolating_2_16bit_stereo:
  3853                                  	; bx = [previous_val_l]
  3854                                  	; ax = [previous_val_r]
  3855                                  	; [next_val_l]
  3856                                  	; dx = [next_val_r]
  3857                                  	; original-interpolated
  3858                                  
  3859 00001B0C 93                      	xchg	eax, ebx
  3860 00001B0D 66AB                    	stosw		; original sample (L)
  3861 00001B0F 93                      	xchg	eax, ebx
  3862 00001B10 66AB                    	stosw		; original sample (R)
  3863 00001B12 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  3864 00001B15 80C680                  	add	dh, 80h
  3865 00001B18 6601D0                  	add	ax, dx	; [previous_val_r] + [next_val_r]
  3866 00001B1B 66D1D8                  	rcr	ax, 1	; / 2
  3867 00001B1E 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3868                                  	;push	eax ; *	; interpolated sample (R)
  3869 00001B21 C1E010                  	shl	eax, 16
  3870 00001B24 66A1[D71E0000]          	mov	ax, [next_val_l]
  3871 00001B2A 80C480                  	add	ah, 80h
  3872 00001B2D 80C780                  	add	bh, 80h
  3873 00001B30 6601D8                  	add	ax, bx	; [next_val_l] + [previous_val_l]
  3874 00001B33 66D1D8                  	rcr	ax, 1	; / 2
  3875 00001B36 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  3876                                  	;stosw 		; interpolated sample (L)
  3877                                  	;pop	eax ; *
  3878                                  	;sub	ah, 80h	; -32768 to +32767 format again
  3879                                  	;stosw 		; interpolated sample (R)
  3880 00001B39 AB                      	stosd
  3881 00001B3A C3                      	retn
  3882                                  
  3883                                  ;-----------------------------------------------------------------------------
  3884                                  
  3885                                  interpolating_5_8bit_mono:
  3886                                  	; al = [previous_val]
  3887                                  	; dl = [next_val]
  3888                                  	; original-interpltd-interpltd-interpltd-interpltd
  3889                                  
  3890 00001B3B 88C3                    	mov	bl, al
  3891 00001B3D 2C80                    	sub	al, 80h
  3892 00001B3F 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3893 00001B43 66AB                    	stosw		; original sample (L)
  3894 00001B45 66AB                    	stosw		; original sample (R)
  3895 00001B47 88D8                    	mov	al, bl
  3896 00001B49 00D0                    	add	al, dl
  3897 00001B4B D0D8                    	rcr	al, 1
  3898 00001B4D 88C7                    	mov	bh, al	; interpolated middle (temporary)
  3899 00001B4F 00D8                    	add	al, bl  ; [previous_val]
  3900 00001B51 D0D8                    	rcr	al, 1
  3901 00001B53 88C6                    	mov	dh, al	; interpolated 1st quarter (temporary)
  3902 00001B55 00D8                    	add	al, bl
  3903 00001B57 D0D8                    	rcr	al, 1
  3904 00001B59 2C80                    	sub	al, 80h
  3905 00001B5B 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3906 00001B5F 66AB                    	stosw		; interpolated sample 1 (L)
  3907 00001B61 66AB                    	stosw		; interpolated sample 1 (R)
  3908 00001B63 88F8                    	mov	al, bh
  3909 00001B65 00F0                    	add	al, dh
  3910 00001B67 D0D8                    	rcr	al, 1
  3911 00001B69 2C80                    	sub	al, 80h
  3912 00001B6B 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3913 00001B6F 66AB                    	stosw		; interpolated sample 2 (L)
  3914 00001B71 66AB                    	stosw		; interpolated sample 2 (R)
  3915 00001B73 88F8                    	mov	al, bh
  3916 00001B75 00D0                    	add	al, dl	; [next_val]
  3917 00001B77 D0D8                    	rcr	al, 1
  3918 00001B79 88C6                    	mov	dh, al	; interpolated 3rd quarter (temporary)
  3919 00001B7B 00F8                    	add	al, bh
  3920 00001B7D D0D8                    	rcr	al, 1
  3921 00001B7F 2C80                    	sub	al, 80h
  3922 00001B81 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3923 00001B85 66AB                    	stosw		; interpolated sample 3 (L)
  3924 00001B87 66AB                    	stosw		; interpolated sample 3 (R)
  3925 00001B89 88F0                    	mov	al, dh
  3926 00001B8B 00D0                    	add	al, dl
  3927 00001B8D D0D8                    	rcr	al, 1
  3928 00001B8F 2C80                    	sub	al, 80h
  3929 00001B91 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3930 00001B95 66AB                    	stosw		; interpolated sample 4 (L)
  3931 00001B97 66AB                    	stosw		; interpolated sample 4 (R)
  3932 00001B99 C3                      	retn
  3933                                  
  3934                                  ;-----------------------------------------------------------------------------
  3935                                  
  3936                                  interpolating_5_8bit_stereo:
  3937                                  	; al = [previous_val_l]
  3938                                  	; ah = [previous_val_r]
  3939                                  	; dl = [next_val_l]
  3940                                  	; dh = [next_val_r]
  3941                                  	; original-interpltd-interpltd-interpltd-interpltd
  3942                                  
  3943 00001B9A 89C3                    	mov	ebx, eax
  3944 00001B9C 2C80                    	sub	al, 80h
  3945 00001B9E 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3946 00001BA2 66AB                    	stosw		; original sample (L)
  3947 00001BA4 88F8                    	mov	al, bh
  3948 00001BA6 2C80                    	sub	al, 80h
  3949 00001BA8 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3950 00001BAC 66AB                    	stosw		; original sample (R)
  3951 00001BAE 52                      	push	edx ; *
  3952 00001BAF 88D8                    	mov	al, bl
  3953 00001BB1 00D0                    	add	al, dl	; [next_val_l]
  3954 00001BB3 D0D8                    	rcr	al, 1
  3955 00001BB5 50                      	push	eax ; ** ; al = interpolated middle (L) (temporary)
  3956 00001BB6 00D8                    	add	al, bl	; [previous_val_l]
  3957 00001BB8 D0D8                    	rcr	al, 1
  3958 00001BBA 86D8                    	xchg	al, bl
  3959 00001BBC 00D8                    	add	al, bl	; bl = interpolated 1st quarter (L) (temp)
  3960 00001BBE D0D8                    	rcr	al, 1
  3961 00001BC0 2C80                    	sub	al, 80h
  3962 00001BC2 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3963 00001BC6 66AB                    	stosw		; interpolated sample 1 (L)
  3964 00001BC8 88F8                    	mov	al, bh
  3965 00001BCA 00F0                    	add	al, dh	; [next_val_r]
  3966 00001BCC D0D8                    	rcr	al, 1
  3967 00001BCE 50                      	push	eax ; *** ; al = interpolated middle (R) (temporary)
  3968 00001BCF 00F8                    	add	al, bh	; [previous_val_r]
  3969 00001BD1 D0D8                    	rcr	al, 1
  3970 00001BD3 86F8                    	xchg	al, bh
  3971 00001BD5 00F8                    	add	al, bh	; bh = interpolated 1st quarter (R) (temp)
  3972 00001BD7 D0D8                    	rcr	al, 1
  3973 00001BD9 2C80                    	sub	al, 80h
  3974 00001BDB 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3975 00001BDF 66AB                    	stosw		; interpolated sample 1 (R)
  3976 00001BE1 5A                      	pop	edx ; ***
  3977 00001BE2 58                      	pop	eax ; ** ; al = interpolated middle (L) (temporary)
  3978 00001BE3 86D8                    	xchg	al, bl	; al = interpolated 1st quarter (L) (temp)
  3979 00001BE5 00D8                    	add	al, bl	; bl = interpolated middle (L) (temporary)
  3980 00001BE7 D0D8                    	rcr	al, 1
  3981 00001BE9 2C80                    	sub	al, 80h
  3982 00001BEB 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3983 00001BEF 66AB                    	stosw		; interpolated sample 2 (L)
  3984 00001BF1 88D0                    	mov	al, dl 	; interpolated middle (R) (temporary)
  3985 00001BF3 86F8                    	xchg	al, bh	; al = interpolated 1st quarter (R) (temp)
  3986 00001BF5 00F8                    	add	al, bh	; bh = interpolated middle (R) (temporary)
  3987 00001BF7 D0D8                    	rcr	al, 1
  3988 00001BF9 2C80                    	sub	al, 80h
  3989 00001BFB 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  3990 00001BFF 66AB                    	stosw		; interpolated sample 2 (R)
  3991 00001C01 5A                      	pop	edx ; *
  3992 00001C02 88D8                    	mov	al, bl	; interpolated middle (L) (temporary)
  3993 00001C04 00D0                    	add	al, dl	; [next_val_l]
  3994 00001C06 D0D8                    	rcr	al, 1
  3995 00001C08 86D8                    	xchg	al, bl	; al = interpolated middle (R) (temporary)
  3996 00001C0A 00D8                    	add	al, bl	; bl = interpolated 3rd quarter (L) (temp)
  3997 00001C0C D0D8                    	rcr	al, 1
  3998 00001C0E 2C80                    	sub	al, 80h
  3999 00001C10 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4000 00001C14 66AB                    	stosw		; interpolated sample 3 (L)
  4001 00001C16 88F8                    	mov	al, bh
  4002 00001C18 00F0                    	add	al, dh	; interpolated middle (R) + [next_val_r]
  4003 00001C1A D0D8                    	rcr	al, 1
  4004 00001C1C 86F8                    	xchg	al, bh	; al = interpolated middle (R)
  4005 00001C1E 00F8                    	add	al, bh	; bh = interpolated 3rd quarter (R) (temp)
  4006 00001C20 D0D8                    	rcr	al, 1
  4007 00001C22 2C80                    	sub	al, 80h
  4008 00001C24 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4009 00001C28 66AB                    	stosw		; interpolated sample 3 (R)
  4010 00001C2A 88D8                    	mov	al, bl
  4011 00001C2C 00D0                    	add	al, dl	; [next_val_l]
  4012 00001C2E D0D8                    	rcr	al, 1
  4013 00001C30 2C80                    	sub	al, 80h
  4014 00001C32 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4015 00001C36 66AB                    	stosw		; interpolated sample 4 (L)
  4016 00001C38 88F8                    	mov	al, bh
  4017 00001C3A 00F0                    	add	al, dh	; [next_val_r]
  4018 00001C3C D0D8                    	rcr	al, 1
  4019 00001C3E 2C80                    	sub	al, 80h
  4020 00001C40 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4021 00001C44 66AB                    	stosw		; interpolated sample 4 (R)
  4022 00001C46 C3                      	retn
  4023                                  
  4024                                  ;-----------------------------------------------------------------------------
  4025                                  
  4026                                  interpolating_4_8bit_mono:
  4027                                  	; al = [previous_val]
  4028                                  	; dl = [next_val]
  4029                                  	; original-interpolated-interpolated-interpolated
  4030 00001C47 88C3                    	mov	bl, al
  4031 00001C49 2C80                    	sub	al, 80h
  4032 00001C4B 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4033 00001C4F 66AB                    	stosw		; original sample (L)
  4034 00001C51 66AB                    	stosw		; original sample (R)
  4035 00001C53 88D8                    	mov	al, bl
  4036 00001C55 00D0                    	add	al, dl
  4037 00001C57 D0D8                    	rcr	al, 1
  4038 00001C59 86D8                    	xchg	al, bl  ; al = [previous_val]
  4039 00001C5B 00D8                    	add	al, bl	; bl = interpolated middle (sample 2)
  4040 00001C5D D0D8                    	rcr	al, 1
  4041 00001C5F 2C80                    	sub	al, 80h
  4042 00001C61 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4043 00001C65 66AB                    	stosw		; interpolated sample 1 (L)
  4044 00001C67 66AB                    	stosw		; interpolated sample 1 (R)
  4045 00001C69 88D8                    	mov	al, bl	; interpolated middle (sample 2)
  4046 00001C6B 2C80                    	sub	al, 80h
  4047 00001C6D 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4048 00001C71 66AB                    	stosw		; interpolated sample 2 (L)
  4049 00001C73 66AB                    	stosw		; interpolated sample 2 (R)
  4050 00001C75 88D8                    	mov	al, bl
  4051 00001C77 00D0                    	add	al, dl	; [next_val]
  4052 00001C79 D0D8                    	rcr	al, 1
  4053 00001C7B 2C80                    	sub	al, 80h
  4054 00001C7D 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4055 00001C81 66AB                    	stosw		; interpolated sample 3 (L)
  4056 00001C83 66AB                    	stosw		; interpolated sample 3 (R)
  4057 00001C85 C3                      	retn
  4058                                  
  4059                                  ;-----------------------------------------------------------------------------
  4060                                  
  4061                                  interpolating_4_8bit_stereo:
  4062                                  	; al = [previous_val_l]
  4063                                  	; ah = [previous_val_r]
  4064                                  	; dl = [next_val_l]
  4065                                  	; dh = [next_val_r]
  4066                                  	; original-interpolated-interpolated-interpolated
  4067                                  
  4068 00001C86 89C3                    	mov	ebx, eax
  4069 00001C88 2C80                    	sub	al, 80h
  4070 00001C8A 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4071 00001C8E 66AB                    	stosw		; original sample (L)
  4072 00001C90 88F8                    	mov	al, bh
  4073 00001C92 2C80                    	sub	al, 80h
  4074 00001C94 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4075 00001C98 66AB                    	stosw		; original sample (R)
  4076 00001C9A 88D8                    	mov	al, bl
  4077 00001C9C 00D0                    	add	al, dl	; [next_val_l]
  4078 00001C9E D0D8                    	rcr	al, 1
  4079 00001CA0 86D8                    	xchg	al, bl	; al = [previous_val_l]
  4080 00001CA2 00D8                    	add	al, bl	; bl = interpolated middle (L) (sample 2)
  4081 00001CA4 D0D8                    	rcr	al, 1
  4082 00001CA6 2C80                    	sub	al, 80h
  4083 00001CA8 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4084 00001CAC 66AB                    	stosw		; interpolated sample 1 (L)
  4085 00001CAE 88F8                    	mov	al, bh
  4086 00001CB0 00F0                    	add	al, dh	; [next_val_r]
  4087 00001CB2 D0D8                    	rcr	al, 1
  4088 00001CB4 86F8                    	xchg	al, bh	; al = [previous_val_h]
  4089 00001CB6 00F8                    	add	al, bh	; bh = interpolated middle (R) (sample 2)
  4090 00001CB8 D0D8                    	rcr	al, 1
  4091 00001CBA 2C80                    	sub	al, 80h
  4092 00001CBC 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4093 00001CC0 66AB                    	stosw		; interpolated sample 1 (R)
  4094 00001CC2 88D8                    	mov	al, bl	; interpolated middle (L) (sample 2)
  4095 00001CC4 2C80                    	sub	al, 80h
  4096 00001CC6 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4097 00001CCA 66AB                    	stosw		; interpolated sample 2 (L)
  4098 00001CCC 88F8                    	mov	al, bh	; interpolated middle (L) (sample 2)
  4099 00001CCE 2C80                    	sub	al, 80h
  4100 00001CD0 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4101 00001CD4 66AB                    	stosw		; interpolated sample 2 (L)
  4102 00001CD6 88D8                    	mov	al, bl
  4103 00001CD8 00D0                    	add	al, dl	; [next_val_l]
  4104 00001CDA D0D8                    	rcr	al, 1
  4105 00001CDC 2C80                    	sub	al, 80h
  4106 00001CDE 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4107 00001CE2 66AB                    	stosw		; interpolated sample 3 (L)
  4108 00001CE4 88F8                    	mov	al, bh
  4109 00001CE6 00F0                    	add	al, dh	; [next_val_r]
  4110 00001CE8 D0D8                    	rcr	al, 1
  4111 00001CEA 2C80                    	sub	al, 80h
  4112 00001CEC 66C1E008                	shl	ax, 8	; convert 8 bit sample to 16 bit sample
  4113 00001CF0 66AB                    	stosw		; interpolated sample 3 (R)
  4114 00001CF2 C3                      	retn
  4115                                  
  4116                                  ;-----------------------------------------------------------------------------
  4117                                  
  4118                                  interpolating_5_16bit_mono:
  4119                                  	; ax = [previous_val]
  4120                                  	; dx = [next_val]
  4121                                  	; original-interpltd-interpltd-interpltd-interpltd
  4122                                  
  4123 00001CF3 66AB                    	stosw		; original sample (L)
  4124 00001CF5 66AB                    	stosw		; original sample (R)
  4125 00001CF7 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  4126 00001CFA 89C3                    	mov	ebx, eax ; [previous_val]
  4127 00001CFC 80C680                  	add	dh, 80h
  4128 00001CFF 6601D0                  	add	ax, dx
  4129 00001D02 66D1D8                  	rcr	ax, 1
  4130 00001D05 50                      	push	eax ; *	; interpolated middle (temporary)
  4131 00001D06 6601D8                  	add	ax, bx	; interpolated middle + [previous_val]
  4132 00001D09 66D1D8                  	rcr	ax, 1
  4133 00001D0C 50                      	push	eax ; **	; interpolated 1st quarter (temporary)
  4134 00001D0D 6601D8                  	add	ax, bx	; 1st quarter + [previous_val]
  4135 00001D10 66D1D8                  	rcr	ax, 1	
  4136 00001D13 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4137 00001D16 66AB                    	stosw 		; interpolated sample 1 (L)
  4138 00001D18 66AB                    	stosw		; interpolated sample 1 (R)
  4139 00001D1A 58                      	pop	eax ; **
  4140 00001D1B 5B                      	pop	ebx ; *
  4141 00001D1C 6601D8                  	add	ax, bx	; 1st quarter + middle
  4142 00001D1F 66D1D8                  	rcr	ax, 1	; / 2
  4143 00001D22 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4144 00001D25 66AB                    	stosw		; interpolated sample 2 (L)
  4145 00001D27 66AB                    	stosw		; interpolated sample 2 (R)
  4146 00001D29 89D8                    	mov	eax, ebx
  4147 00001D2B 6601D0                  	add	ax, dx	; interpolated middle + [next_val]
  4148 00001D2E 66D1D8                  	rcr	ax, 1
  4149 00001D31 50                      	push	eax ; *	; interpolated 3rd quarter (temporary)
  4150 00001D32 6601D8                  	add	ax, bx	; + interpolated middle
  4151 00001D35 66D1D8                  	rcr	ax, 1
  4152 00001D38 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4153 00001D3B 66AB                    	stosw		; interpolated sample 3 (L)
  4154 00001D3D 66AB                    	stosw		; interpolated sample 3 (R)
  4155 00001D3F 58                      	pop	eax ; *
  4156 00001D40 6601D0                  	add	ax, dx	; 3rd quarter + [next_val]
  4157 00001D43 66D1D8                  	rcr	ax, 1	; / 2
  4158 00001D46 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4159 00001D49 66AB                    	stosw		; interpolated sample 4 (L)
  4160 00001D4B 66AB                    	stosw		; interpolated sample 4 (R)
  4161 00001D4D C3                      	retn
  4162                                  
  4163                                  ;-----------------------------------------------------------------------------
  4164                                  
  4165                                  interpolating_5_16bit_stereo:
  4166                                  	; bx = [previous_val_l]
  4167                                  	; ax = [previous_val_r]
  4168                                  	; [next_val_l]
  4169                                  	; [next_val_r]
  4170                                  	; original-interpltd-interpltd-interpltd-interpltd
  4171                                  
  4172 00001D4E 51                      	push	ecx ; !
  4173 00001D4F 93                      	xchg	eax, ebx
  4174 00001D50 66AB                    	stosw		; original sample (L)
  4175 00001D52 93                      	xchg	eax, ebx
  4176 00001D53 66AB                    	stosw		; original sample (R)
  4177 00001D55 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  4178 00001D58 50                      	push	eax ; *	; [previous_val_r]
  4179 00001D59 80C780                  	add	bh, 80h
  4180 00001D5C 8005[D81E0000]80        	add	byte [next_val_l+1], 80h
  4181 00001D63 66A1[D71E0000]          	mov	ax, [next_val_l]
  4182 00001D69 6601D8                  	add	ax, bx	; [previous_val_l]
  4183 00001D6C 66D1D8                  	rcr	ax, 1
  4184 00001D6F 89C1                    	mov	ecx, eax ; interpolated middle (L)
  4185 00001D71 6601D8                  	add	ax, bx
  4186 00001D74 66D1D8                  	rcr	ax, 1
  4187 00001D77 89C2                    	mov	edx, eax ; interpolated 1st quarter (L)
  4188 00001D79 6601D8                  	add	ax, bx	; [previous_val_l]
  4189 00001D7C 66D1D8                  	rcr	ax, 1
  4190 00001D7F 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4191 00001D82 66AB                    	stosw 		; interpolated sample 1 (L)
  4192 00001D84 89C8                    	mov	eax, ecx
  4193 00001D86 6601D0                  	add	ax, dx	; middle (L) + 1st quarter (L)
  4194 00001D89 66D1D8                  	rcr	ax, 1	; / 2
  4195 00001D8C 89C3                    	mov	ebx, eax  ; interpolated sample 2 (L)
  4196 00001D8E 5A                      	pop	edx ; *	; [previous_val_r]
  4197 00001D8F 89D0                    	mov	eax, edx
  4198 00001D91 8005[DA1E0000]80        	add	byte [next_val_r+1], 80h
  4199 00001D98 660305[D91E0000]        	add	ax, [next_val_r]
  4200 00001D9F 66D1D8                  	rcr	ax, 1
  4201 00001DA2 50                      	push	eax ; *	; interpolated middle (R)
  4202 00001DA3 6601D0                  	add	ax, dx
  4203 00001DA6 66D1D8                  	rcr	ax, 1
  4204 00001DA9 50                      	push	eax ; ** ; interpolated 1st quarter (R)
  4205 00001DAA 6601D0                  	add	ax, dx	; [previous_val_r]
  4206 00001DAD 66D1D8                  	rcr	ax, 1
  4207 00001DB0 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4208 00001DB3 66AB                    	stosw 		; interpolated sample 1 (R)
  4209 00001DB5 89D8                    	mov	eax, ebx
  4210 00001DB7 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4211 00001DBA 66AB                    	stosw 		; interpolated sample 2 (L)
  4212 00001DBC 58                      	pop	eax ; **
  4213 00001DBD 5A                      	pop	edx ; *
  4214 00001DBE 6601D0                  	add	ax, dx	; 1st quarter (R) + middle (R)
  4215 00001DC1 66D1D8                  	rcr	ax, 1	; / 2
  4216 00001DC4 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4217 00001DC7 66AB                    	stosw 		; interpolated sample 2 (R)
  4218 00001DC9 89C8                    	mov	eax, ecx
  4219 00001DCB 660305[D71E0000]        	add	ax, [next_val_l]
  4220 00001DD2 66D1D8                  	rcr	ax, 1
  4221 00001DD5 50                      	push	eax ; * ; interpolated 3rd quarter (L)
  4222 00001DD6 6601C8                  	add	ax, cx	; interpolated middle (L)
  4223 00001DD9 66D1D8                  	rcr	ax, 1
  4224 00001DDC 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4225 00001DDF 66AB                    	stosw 		; interpolated sample 3 (L)
  4226 00001DE1 89D0                    	mov	eax, edx
  4227 00001DE3 660305[D91E0000]        	add	ax, [next_val_r]
  4228 00001DEA 66D1D8                  	rcr	ax, 1
  4229 00001DED 50                      	push	eax ; ** ; interpolated 3rd quarter (R)
  4230 00001DEE 6601D0                  	add	ax, dx	; interpolated middle (R)
  4231 00001DF1 66D1D8                  	rcr	ax, 1
  4232 00001DF4 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4233 00001DF7 66AB                    	stosw 		; interpolated sample 3 (R)
  4234 00001DF9 5B                      	pop	ebx ; **
  4235 00001DFA 58                      	pop	eax ; *
  4236 00001DFB 660305[D71E0000]        	add	ax, [next_val_l]
  4237 00001E02 66D1D8                  	rcr	ax, 1
  4238 00001E05 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4239 00001E08 66AB                    	stosw 		; interpolated sample 4 (L)
  4240 00001E0A 89D8                    	mov	eax, ebx	
  4241 00001E0C 660305[D91E0000]        	add	ax, [next_val_r]
  4242 00001E13 66D1D8                  	rcr	ax, 1
  4243 00001E16 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4244 00001E19 66AB                    	stosw 		; interpolated sample 4 (R)
  4245 00001E1B 59                      	pop	ecx ; !
  4246 00001E1C C3                      	retn
  4247                                  
  4248                                  ;-----------------------------------------------------------------------------
  4249                                  
  4250                                  interpolating_4_16bit_mono:
  4251                                  	; ax = [previous_val]
  4252                                  	; dx = [next_val]
  4253                                  	; 02/02/2025
  4254                                  	; original-interpolated-interpolated-interpolated
  4255                                  
  4256 00001E1D 66AB                    	stosw		; original sample (L)
  4257 00001E1F 66AB                    	stosw		; original sample (R)
  4258 00001E21 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  4259 00001E24 89C3                    	mov	ebx, eax ; [previous_val]
  4260 00001E26 80C680                  	add	dh, 80h
  4261 00001E29 6601D0                  	add	ax, dx	; [previous_val] + [next_val]
  4262 00001E2C 66D1D8                  	rcr	ax, 1
  4263 00001E2F 93                      	xchg	eax, ebx
  4264 00001E30 6601D8                  	add	ax, bx	; [previous_val] + interpolated middle
  4265 00001E33 66D1D8                  	rcr	ax, 1
  4266 00001E36 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4267 00001E39 66AB                    	stosw 		; interpolated sample 1 (L)
  4268 00001E3B 66AB                    	stosw		; interpolated sample 1 (R)
  4269 00001E3D 89D8                    	mov	eax, ebx ; interpolated middle
  4270 00001E3F 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4271 00001E42 66AB                    	stosw 		; interpolated sample 2 (L)
  4272 00001E44 66AB                    	stosw		; interpolated sample 2 (R)
  4273 00001E46 89D8                    	mov	eax, ebx
  4274 00001E48 6601D0                  	add	ax, dx	; interpolated middle + [next_val]
  4275 00001E4B 66D1D8                  	rcr	ax, 1
  4276 00001E4E 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4277 00001E51 66AB                    	stosw		; interpolated sample 3 (L)
  4278 00001E53 66AB                    	stosw		; interpolated sample 3 (R)
  4279 00001E55 C3                      	retn
  4280                                  
  4281                                  ;-----------------------------------------------------------------------------
  4282                                  
  4283                                  interpolating_4_16bit_stereo:
  4284                                  	; bx = [previous_val_l]
  4285                                  	; ax = [previous_val_r]
  4286                                  	; [next_val_l]
  4287                                  	; [next_val_r]
  4288                                  	; original-interpolated-interpolated-interpolated
  4289                                  
  4290 00001E56 93                      	xchg	eax, ebx
  4291 00001E57 66AB                    	stosw		; original sample (L)
  4292 00001E59 93                      	xchg	eax, ebx
  4293 00001E5A 66AB                    	stosw		; original sample (R)
  4294 00001E5C 80C480                  	add	ah, 80h ; convert sound level 0 to 65535 format
  4295 00001E5F 89C2                    	mov	edx, eax ; [previous_val_r]
  4296 00001E61 80C780                  	add	bh, 80h
  4297 00001E64 8005[D81E0000]80        	add	byte [next_val_l+1], 80h
  4298 00001E6B 66A1[D71E0000]          	mov	ax, [next_val_l]
  4299 00001E71 6601D8                  	add	ax, bx	; [previous_val_l]
  4300 00001E74 66D1D8                  	rcr	ax, 1
  4301 00001E77 93                      	xchg	eax, ebx
  4302 00001E78 6601D8                  	add	ax, bx	; bx = interpolated middle (L)
  4303 00001E7B 66D1D8                  	rcr	ax, 1
  4304 00001E7E 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4305 00001E81 66AB                    	stosw 		; interpolated sample 1 (L)
  4306 00001E83 8005[DA1E0000]80        	add	byte [next_val_r+1], 80h
  4307 00001E8A 89D0                    	mov	eax, edx ; [previous_val_r]
  4308 00001E8C 660305[D91E0000]        	add	ax, [next_val_r]
  4309 00001E93 66D1D8                  	rcr	ax, 1
  4310 00001E96 92                      	xchg	eax, edx
  4311 00001E97 6601D0                  	add	ax, dx	; dx = interpolated middle (R)
  4312 00001E9A 66D1D8                  	rcr	ax, 1
  4313 00001E9D 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4314 00001EA0 66AB                    	stosw 		; interpolated sample 1 (R)
  4315 00001EA2 89D8                    	mov	eax, ebx
  4316 00001EA4 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4317 00001EA7 66AB                    	stosw 		; interpolated sample 2 (L)
  4318 00001EA9 89D0                    	mov	eax, edx
  4319 00001EAB 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4320 00001EAE 66AB                    	stosw 		; interpolated sample 2 (R)
  4321 00001EB0 89D8                    	mov	eax, ebx
  4322 00001EB2 660305[D71E0000]        	add	ax, [next_val_l]
  4323 00001EB9 66D1D8                  	rcr	ax, 1
  4324 00001EBC 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4325 00001EBF 66AB                    	stosw 		; interpolated sample 3 (L)
  4326 00001EC1 89D0                    	mov	eax, edx
  4327 00001EC3 660305[D91E0000]        	add	ax, [next_val_r]
  4328 00001ECA 66D1D8                  	rcr	ax, 1
  4329 00001ECD 80EC80                  	sub	ah, 80h	; -32768 to +32767 format again
  4330 00001ED0 66AB                    	stosw 		; interpolated sample 3 (R)
  4331 00001ED2 C3                      	retn
  4332                                  
  4333                                  ;-----------------------------------------------------------------------------
  4334                                  
  4335                                  previous_val:
  4336 00001ED3 0000                    previous_val_l: dw 0
  4337 00001ED5 0000                    previous_val_r: dw 0
  4338                                  next_val:
  4339 00001ED7 0000                    next_val_l: dw 0
  4340 00001ED9 0000                    next_val_r: dw 0
  4341                                  
  4342 00001EDB 00                      faz:	db 0
  4343                                  
  4344                                  ;=============================================================================
  4345                                  ;	Write AC'97 Hadrware Information
  4346                                  ;=============================================================================
  4347                                  	
  4348                                  	; 09/02/2025
  4349                                  
  4350                                  write_audio_dev_info:
  4351 00001EDC 31DB                    	xor	ebx, ebx
  4352 00001EDE 803D[D6770000]01        	cmp	byte [audio_hardware], 1
  4353 00001EE5 7557                    	jne	short write_ac97_pci_dev_info
  4354                                  
  4355                                  ;-----------------------------------------------------------------------------
  4356                                  	
  4357                                  	; 09/02/2025
  4358                                  	; 05/02/2025 - sb16play.s
  4359                                  
  4360                                  write_sb16_dev_info:
  4361 00001EE7 A1[D2770000]            	mov	eax, [audio_io_base]
  4362                                  	;xor	ebx, ebx
  4363 00001EEC 88C3                    	mov	bl, al
  4364 00001EEE 88DA                    	mov	dl, bl
  4365 00001EF0 80E30F                  	and	bl, 0Fh
  4366 00001EF3 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4367 00001EF9 A2[F1760000]            	mov	[msgBasePort+2], al
  4368 00001EFE 88D3                    	mov	bl, dl
  4369 00001F00 C0EB04                  	shr	bl, 4
  4370 00001F03 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4371 00001F09 A2[F0760000]            	mov	[msgBasePort+1], al
  4372 00001F0E 88E3                    	mov	bl, ah
  4373                                  	;and	bl, 0Fh
  4374 00001F10 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4375 00001F16 A2[EF760000]            	mov	[msgBasePort], al
  4376                                  
  4377                                  	;xor	eax, eax
  4378 00001F1B A0[C6770000]            	mov	al, [audio_intr]
  4379 00001F20 0430                    	add	al, 30h
  4380 00001F22 A2[06770000]            	mov	[msgSB16IRQ], al
  4381                                  
  4382                                  	sys	_msg, msgSB16Info, 255, 07h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00001F27 BB[B9760000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00001F2C B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00001F31 BA07000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00001F36 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00001F3B CD40                <1>  int 40h
  4383                                  
  4384 00001F3D C3                      	retn
  4385                                  
  4386                                  ;-----------------------------------------------------------------------------
  4387                                  
  4388                                  	; 09/02/2025
  4389                                  	; 05/02/2025 - ac97play.s
  4390                                  	
  4391                                  write_ac97_pci_dev_info:
  4392                                  	; BUS/DEV/FN
  4393                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  4394                                  	; DEV/VENDOR
  4395                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  4396                                  
  4397 00001F3E A1[CA770000]            	mov	eax, [dev_vendor]
  4398                                  	; 07/12/2024
  4399 00001F43 31DB                    	xor	ebx, ebx
  4400 00001F45 88C3                    	mov	bl, al
  4401 00001F47 88DA                    	mov	dl, bl
  4402 00001F49 80E30F                  	and	bl, 0Fh
  4403 00001F4C 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4404 00001F52 A2[C3750000]            	mov	[msgVendorId+3], al
  4405 00001F57 88D3                    	mov	bl, dl
  4406 00001F59 C0EB04                  	shr	bl, 4
  4407 00001F5C 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4408 00001F62 A2[C2750000]            	mov	[msgVendorId+2], al
  4409 00001F67 88E3                    	mov	bl, ah
  4410 00001F69 88DA                    	mov	dl, bl
  4411 00001F6B 80E30F                  	and	bl, 0Fh
  4412 00001F6E 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4413 00001F74 A2[C1750000]            	mov	[msgVendorId+1], al
  4414 00001F79 88D3                    	mov	bl, dl
  4415 00001F7B C0EB04                  	shr	bl, 4
  4416 00001F7E 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4417 00001F84 A2[C0750000]            	mov	[msgVendorId], al
  4418 00001F89 C1E810                  	shr	eax, 16
  4419 00001F8C 88C3                    	mov	bl, al
  4420 00001F8E 88DA                    	mov	dl, bl
  4421 00001F90 80E30F                  	and	bl, 0Fh
  4422 00001F93 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4423 00001F99 A2[D4750000]            	mov	[msgDevId+3], al
  4424 00001F9E 88D3                    	mov	bl, dl
  4425 00001FA0 C0EB04                  	shr	bl, 4
  4426 00001FA3 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4427 00001FA9 A2[D3750000]            	mov	[msgDevId+2], al
  4428 00001FAE 88E3                    	mov	bl, ah
  4429 00001FB0 88DA                    	mov	dl, bl
  4430 00001FB2 80E30F                  	and	bl, 0Fh
  4431 00001FB5 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4432 00001FBB A2[D2750000]            	mov	[msgDevId+1], al
  4433 00001FC0 88D3                    	mov	bl, dl
  4434 00001FC2 C0EB04                  	shr	bl, 4
  4435 00001FC5 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4436 00001FCB A2[D1750000]            	mov	[msgDevId], al
  4437                                  
  4438 00001FD0 A1[CE770000]            	mov	eax, [bus_dev_fn]
  4439 00001FD5 C1E808                  	shr	eax, 8
  4440 00001FD8 88C3                    	mov	bl, al
  4441 00001FDA 88DA                    	mov	dl, bl
  4442 00001FDC 80E307                  	and	bl, 7 ; bit 0,1,2
  4443 00001FDF 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4444 00001FE5 A2[F8750000]            	mov	[msgFncNo+1], al
  4445 00001FEA 88D3                    	mov	bl, dl
  4446 00001FEC C0EB03                  	shr	bl, 3
  4447 00001FEF 88DA                    	mov	dl, bl
  4448 00001FF1 80E30F                  	and	bl, 0Fh
  4449 00001FF4 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4450 00001FFA A2[EA750000]            	mov	[msgDevNo+1], al
  4451 00001FFF 88D3                    	mov	bl, dl
  4452 00002001 C0EB04                  	shr	bl, 4
  4453 00002004 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4454 0000200A A2[E9750000]            	mov	[msgDevNo], al
  4455 0000200F 88E3                    	mov	bl, ah
  4456 00002011 88DA                    	mov	dl, bl
  4457 00002013 80E30F                  	and	bl, 0Fh
  4458 00002016 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4459 0000201C A2[DE750000]            	mov	[msgBusNo+1], al
  4460 00002021 88D3                    	mov	bl, dl
  4461 00002023 C0EB04                  	shr	bl, 4
  4462 00002026 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4463 0000202C A2[DD750000]            	mov	[msgBusNo], al
  4464                                  
  4465                                  	;mov	ax, [ac97_NamBar]
  4466 00002031 66A1[D2770000]          	mov	ax, [NAMBAR]
  4467 00002037 88C3                    	mov	bl, al
  4468 00002039 88DA                    	mov	dl, bl
  4469 0000203B 80E30F                  	and	bl, 0Fh
  4470 0000203E 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4471 00002044 A2[07760000]            	mov	[msgNamBar+3], al
  4472 00002049 88D3                    	mov	bl, dl
  4473 0000204B C0EB04                  	shr	bl, 4
  4474 0000204E 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4475 00002054 A2[06760000]            	mov	[msgNamBar+2], al
  4476 00002059 88E3                    	mov	bl, ah
  4477 0000205B 88DA                    	mov	dl, bl
  4478 0000205D 80E30F                  	and	bl, 0Fh
  4479 00002060 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4480 00002066 A2[05760000]            	mov	[msgNamBar+1], al
  4481 0000206B 88D3                    	mov	bl, dl
  4482 0000206D C0EB04                  	shr	bl, 4
  4483 00002070 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4484 00002076 A2[04760000]            	mov	[msgNamBar], al
  4485                                  
  4486                                  	;mov	ax, [ac97_NabmBar]
  4487 0000207B 66A1[D4770000]          	mov	ax, [NABMBAR]
  4488 00002081 88C3                    	mov	bl, al
  4489 00002083 88DA                    	mov	dl, bl
  4490 00002085 80E30F                  	and	bl, 0Fh
  4491 00002088 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4492 0000208E A2[17760000]            	mov	[msgNabmBar+3], al
  4493 00002093 88D3                    	mov	bl, dl
  4494 00002095 C0EB04                  	shr	bl, 4
  4495 00002098 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4496 0000209E A2[16760000]            	mov	[msgNabmBar+2], al
  4497 000020A3 88E3                    	mov	bl, ah
  4498 000020A5 88DA                    	mov	dl, bl
  4499 000020A7 80E30F                  	and	bl, 0Fh
  4500 000020AA 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4501 000020B0 A2[15760000]            	mov	[msgNabmBar+1], al
  4502 000020B5 88D3                    	mov	bl, dl
  4503 000020B7 C0EB04                  	shr	bl, 4
  4504 000020BA 8A83[7E750000]          	mov	al, [ebx+hex_chars]
  4505 000020C0 A2[14760000]            	mov	[msgNabmBar], al
  4506                                  
  4507 000020C5 31C0                    	xor	eax, eax
  4508 000020C7 A0[C6770000]            	mov	al, [ac97_int_ln_reg]
  4509 000020CC B10A                    	mov	cl, 10
  4510 000020CE F6F1                    	div	cl
  4511                                  	;add	[msgIRQ], ax
  4512 000020D0 66053030                	add	ax, 3030h
  4513 000020D4 66A3[20760000]          	mov	[msgIRQ], ax
  4514                                  	;and	al, al
  4515 000020DA 3C30                    	cmp	al, 30h
  4516 000020DC 750D                    	jne	short _w_ac97imsg_
  4517 000020DE A0[21760000]            	mov	al, [msgIRQ+1]
  4518 000020E3 B420                    	mov	ah, ' '
  4519 000020E5 66A3[20760000]          	mov	[msgIRQ], ax
  4520                                  _w_ac97imsg_:
  4521                                  	sys	_msg, msgAC97Info, 255, 07h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000020EB BB[8F750000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000020F0 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000020F5 BA07000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000020FA B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000020FF CD40                <1>  int 40h
  4522                                  
  4523                                          ;retn
  4524                                  
  4525                                  ;-----------------------------------------------------------------------------
  4526                                  
  4527                                  write_VRA_info:
  4528                                  	sys	_msg, msgVRAheader, 255, 07h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002101 BB[74760000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002106 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000210B BA07000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002110 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00002115 CD40                <1>  int 40h
  4529 00002117 803D[C7770000]00        	cmp	byte [VRA], 0
  4530 0000211E 7617                    	jna	short _w_VRAi_no
  4531                                  _w_VRAi_yes:
  4532                                  	sys	_msg, msgVRAyes, 255, 07h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002120 BB[82760000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002125 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000212A BA07000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000212F B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00002134 CD40                <1>  int 40h
  4533 00002136 C3                      	retn
  4534                                  _w_VRAi_no:
  4535                                  	sys	_msg, msgVRAno, 255, 07h
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002137 BB[88760000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 0000213C B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00002141 BA07000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002146 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 0000214B CD40                <1>  int 40h
  4536 0000214D C3                      	retn
  4537                                  
  4538                                  ;=============================================================================
  4539                                  ;	Write WAV File Information
  4540                                  ;=============================================================================
  4541                                  
  4542                                  	; 09/02/2025
  4543                                  	; 05/02/2025 - twavply2.s
  4544                                  
  4545                                  write_wav_file_info:
  4546                                  	sys	_msg, msgWavFileName, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000214E BB[25760000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002153 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00002158 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000215D B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00002162 CD40                <1>  int 40h
  4547                                  	sys	_msg, wav_file_name, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002164 BB[74770000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002169 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000216E BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002173 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00002178 CD40                <1>  int 40h
  4548                                  
  4549                                  write_sample_rate:
  4550 0000217A 66A1[60770000]          	mov	ax, [WAVE_SampleRate]
  4551                                  	; ax = sample rate (hertz)
  4552 00002180 31D2                    	xor	edx, edx
  4553 00002182 66B90A00                	mov	cx, 10
  4554 00002186 66F7F1                  	div	cx
  4555 00002189 0015[4A760000]          	add	[msgHertz+4], dl
  4556 0000218F 29D2                    	sub	edx, edx
  4557 00002191 66F7F1                  	div	cx
  4558 00002194 0015[49760000]          	add	[msgHertz+3], dl
  4559 0000219A 29D2                    	sub	edx, edx
  4560 0000219C 66F7F1                  	div	cx
  4561 0000219F 0015[48760000]          	add	[msgHertz+2], dl
  4562 000021A5 29D2                    	sub	edx, edx
  4563 000021A7 66F7F1                  	div	cx
  4564 000021AA 0015[47760000]          	add	[msgHertz+1], dl
  4565 000021B0 0005[46760000]          	add	[msgHertz], al
  4566                                  	
  4567                                  	sys	_msg, msgSampleRate, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000021B6 BB[37760000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000021BB B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000021C0 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000021C5 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000021CA CD40                <1>  int 40h
  4568                                  
  4569 000021CC BE[61760000]            	mov	esi, msg16Bits
  4570 000021D1 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16
  4571 000021D8 7405                    	je	short wsr_1
  4572 000021DA BE[51760000]            	mov	esi, msg8Bits
  4573                                  wsr_1:
  4574                                  	sys	_msg, esi, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 000021DF 89F3                <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000021E1 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000021E6 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000021EB B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000021F0 CD40                <1>  int 40h
  4575                                  
  4576 000021F2 BE[5A760000]            	mov	esi, msgMono
  4577 000021F7 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  4578 000021FE 7405                    	je	short wsr_2
  4579 00002200 BE[6B760000]            	mov	esi, msgStereo
  4580                                  wsr_2:
  4581                                  	sys	_msg, esi, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002205 89F3                <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002207 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 0000220C BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002211 B823000000          <1>  mov eax, %1
    96                              <1> 
    97 00002216 CD40                <1>  int 40h
  4582 00002218 C3                              retn
  4583                                  
  4584                                  ;=============================================================================
  4585                                  ;	Audio System Initialization
  4586                                  ;=============================================================================
  4587                                  	
  4588                                  	; 09/02/2025
  4589                                  
  4590                                  audio_system_init:
  4591 00002219 803D[D6770000]01        	cmp	byte [audio_hardware], 1
  4592 00002220 7421                    	je	short sb16_init
  4593                                  
  4594 00002222 E893020000              	call	ac97_init
  4595 00002227 7319                    	jnc	short init_ok
  4596                                  
  4597 00002229 BE[FA740000]            	mov	esi, ac97_init_err_msg
  4598                                  
  4599                                  init_error:
  4600                                  	sys	_msg, esi, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000222E 89F3                <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002230 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 00002235 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 0000223A B823000000          <1>  mov eax, %1
    96                              <1> 
    97 0000223F CD40                <1>  int 40h
  4601 00002241 F9                      	stc
  4602                                  init_ok:
  4603 00002242 C3                      	retn
  4604                                  
  4605                                  ;=============================================================================
  4606                                  ;	Sound Blaster 16 Initialization
  4607                                  ;=============================================================================
  4608                                  
  4609                                  	; 09/02/2025
  4610                                  	; 20/10/2017 - playwav.s
  4611                                  
  4612                                  sb16_init:
  4613                                  	; 09/02/2025
  4614                                  	; Ref: TRDOS 386 Kernel v2.0.9, audio.s (06/06/2024)
  4615                                  	;      SbInit_play procedure (06/08/2022, v2.0.5)
  4616                                  
  4617 00002243 8B1D[00820000]          	mov	ebx, [DMA_phy_buff] ; physical address of DMA buffer
  4618                                  
  4619 00002249 8B0D[E8810000]          	mov	ecx, [buffersize] ; = [loadsize] for SB16
  4620 0000224F D1E1                    	shl	ecx, 1	; 2*[buffersize] = dma buffer size
  4621                                  
  4622 00002251 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16
  4623 00002258 7543                    	jne	short sbInit_0	; set 8 bit DMA buffer
  4624                                  
  4625                                  	; convert byte count to word count
  4626 0000225A D1E9                    	shr	ecx, 1
  4627 0000225C 49                      	dec	ecx	; word count - 1
  4628                                  
  4629                                  	; convert byte offset to word offset
  4630 0000225D D1EB                    	shr	ebx, 1
  4631                                  
  4632                                  	; 16 bit DMA buffer setting (DMA channel 5)
  4633 0000225F B005                    	mov	al, 05h  ; set mask bit for channel 5 (4+1)
  4634                                  	;out	0D4h, al
  4635 00002261 66BAD400                	mov	dx, 0D4h ; DMA mask register
  4636 00002265 B401                    	mov	ah, 1  ;outb
  4637 00002267 CD34                    	int	34h
  4638                                  	
  4639 00002269 30C0                    	xor	al, al   ; stops all DMA processes on selected channel
  4640                                  	;out	0D8h, al
  4641 0000226B B2D8                    	mov	dl, 0D8h ; clear selected channel register
  4642                                  	;mov	ah, 1  ;outb
  4643 0000226D CD34                    	int	34h
  4644                                  
  4645 0000226F 88D8                    	mov	al, bl	 ; byte 0 of DMA buffer offset in words (physical)
  4646                                  	;out	0C4, al
  4647 00002271 B2C4                    	mov	dl, 0C4h ; DMA channel 5 port number
  4648                                  	;mov	ah, 1  ;outb
  4649 00002273 CD34                    	int	34h
  4650                                  
  4651 00002275 88F8                    	mov	al, bh   ; byte 1 of DMA buffer offset in words (physical)
  4652                                  	;out	0C4h, al
  4653                                  	;mov	dl, 0C4h ; DMA channel 5 port number
  4654                                  	;mov	ah, 1  ;outb
  4655 00002277 CD34                    	int	34h
  4656                                  	
  4657 00002279 C1EB0F                  	shr	ebx, 15	 ; complete 16 bit shift
  4658 0000227C 80E3FE                  	and	bl, 0FEh ; clear bit 0 (not necessary, it will be ignored)
  4659                                  
  4660 0000227F 88D8                    	mov	al, bl   ; byte 2 of DMA buffer address (physical)
  4661                                  	;out	8Bh, al
  4662 00002281 B28B                    	mov	dl, 8Bh	 ; page register port addr for channel 5
  4663                                  	;mov	ah, 1  ;outb
  4664 00002283 CD34                    	int	34h
  4665                                  
  4666 00002285 88C8                    	mov	al, cl   ; low byte of DMA count - 1
  4667                                  	;out	0C6h, al
  4668 00002287 B2C6                    	mov	dl, 0C6h ; count register port addr for channel 1
  4669                                  	;mov	ah, 1  ;outb
  4670 00002289 CD34                    	int	34h
  4671                                  
  4672 0000228B 88E8                    	mov	al, ch   ; high byte of DMA count - 1
  4673                                  	;out	0C6h, al
  4674                                  	;mov	dl, 0C6h ; count register port addr for channel 1
  4675                                  	;mov	ah, 1  ;outb
  4676 0000228D CD34                    	int	34h
  4677                                  
  4678                                  	; channel 5, read, autoinitialized, single mode
  4679 0000228F B059                    	mov	al, 59h
  4680                                  	;out	0D6h, al
  4681 00002291 B2D6                    	mov	dl, 0D6h ; DMA mode register port address
  4682                                  	;mov	ah, 1  ;outb
  4683 00002293 CD34                    	int	34h
  4684                                  
  4685 00002295 B001                    	mov	al, 01h  ; clear mask bit for channel 5
  4686                                  	;out	0D4h, al
  4687 00002297 B2D4                    	mov	dl, 0D4h ; DMA mask register port address
  4688                                  	;mov	ah, 1  ;outb
  4689 00002299 CD34                    	int	34h
  4690                                  
  4691 0000229B EB3A                    	jmp	short ResetDsp
  4692                                  
  4693                                  sbInit_0:
  4694 0000229D 49                      	dec	ecx	; byte count - 1
  4695                                  
  4696                                  	; 8 bit DMA buffer setting (DMA channel 1)
  4697 0000229E B005                    	mov	al, 05h ; set mask bit for channel 1 (4+1)
  4698                                  	;out	0Ah, al
  4699 000022A0 66BA0A00                	mov	dx, 0Ah ; DMA mask register
  4700 000022A4 B401                    	mov	ah, 1  ;outb
  4701 000022A6 CD34                    	int	34h
  4702                                  
  4703 000022A8 30C0                    	xor	al, al  ; stops all DMA processes on selected channel
  4704                                  	;out	0Ch, al
  4705 000022AA B20C                    	mov	dl, 0Ch ; clear selected channel register
  4706                                  	;mov	ah, 1  ;outb
  4707 000022AC CD34                    	int	34h
  4708                                  
  4709 000022AE 88D8                    	mov	al, bl	; byte 0 of DMA buffer address (physical)
  4710                                  	;out	02h, al
  4711 000022B0 B202                    	mov	dl, 02h	; DMA channel 1 port number
  4712                                  	;mov	ah, 1  ;outb
  4713 000022B2 CD34                    	int	34h
  4714                                  
  4715 000022B4 88F8                    	mov	al, bh  ; byte 1 of DMA buffer address (physical)
  4716                                  	;out	02h, al
  4717                                  	;mov	dl, 02h ; DMA channel 1 port number
  4718                                  	;mov	ah, 1  ;outb
  4719 000022B6 CD34                    	int	34h
  4720                                  
  4721 000022B8 C1EB10                  	shr	ebx, 16
  4722                                  
  4723 000022BB 88D8                    	mov	al, bl  ; byte 2 of DMA buffer address (physical)
  4724                                  	;out	83h, al
  4725 000022BD B283                    	mov	dl, 83h ; page register port addr for channel 1
  4726                                  	;mov	ah, 1  ;outb
  4727 000022BF CD34                    	int	34h
  4728                                  
  4729 000022C1 88C8                    	mov	al, cl  ; low byte of DMA count - 1
  4730                                  	;out	03h, al
  4731 000022C3 B203                    	mov	dl, 03h ; count register port addr for channel 1
  4732                                  	;mov	ah, 1  ;outb
  4733 000022C5 CD34                    	int	34h
  4734                                  
  4735 000022C7 88E8                    	mov	al, ch  ; high byte of DMA count - 1
  4736                                  	;out	03h, al
  4737                                  	;mov	dl, 03h ; count register port addr for channel 1
  4738                                  	;mov	ah, 1  ;outb
  4739 000022C9 CD34                    	int	34h
  4740                                  
  4741                                  	; channel 1, read, autoinitialized, single mode
  4742 000022CB B059                    	mov	al, 59h
  4743                                  	;out	0Bh, al
  4744 000022CD B20B                    	mov	dl, 0Bh ; DMA mode register port address
  4745                                  	;mov	ah, 1  ;outb
  4746 000022CF CD34                    	int	34h
  4747                                  
  4748 000022D1 B001                    	mov	al, 01h ; clear mask bit for channel 1
  4749                                  	;out	0Ah, al
  4750 000022D3 B20A                    	mov	dl, 0Ah ; DMA mask register port address
  4751                                  	;mov	ah, 1  ;outb
  4752 000022D5 CD34                    	int	34h
  4753                                  
  4754                                  ResetDsp:
  4755 000022D7 668B15[D2770000]        	mov	dx, [audio_io_base]
  4756                                  	;add	dx, 06h
  4757 000022DE 80C206                  	add	dl, 06h
  4758 000022E1 B001                    	mov	al, 1
  4759                                  	;out	dx, al
  4760 000022E3 B401                    	mov	ah, 1  ;outb
  4761 000022E5 CD34                    	int	34h
  4762                                  
  4763                                  	;in	al, dx
  4764                                  	;in	al, dx
  4765                                  	;in	al, dx
  4766                                  	;in	al, dx
  4767                                  
  4768 000022E7 31C0                    	xor	eax, eax
  4769                                  	;mov	ah, 0  ;inb
  4770 000022E9 CD34                    	int	34h
  4771                                  	;mov	ah, 0
  4772 000022EB CD34                    	int	34h
  4773                                  
  4774                                  	;out	dx, al
  4775 000022ED FEC4                    	inc	ah ; ah = 1 ;outb
  4776 000022EF CD34                    	int	34h
  4777                                  
  4778                                  	;mov	ecx, 100
  4779 000022F1 66B96400                	mov	cx, 100
  4780 000022F5 28E4                    	sub	ah, ah ; 0
  4781                                  WaitId:
  4782 000022F7 668B15[D2770000]        	mov	dx, [audio_io_base]
  4783 000022FE 80C20E                  	add	dl, 0Eh
  4784                                  	;in	al, dx
  4785                                  	;mov	ah, 0  ;inb
  4786 00002301 CD34                    	int	34h
  4787 00002303 08C0                    	or	al, al
  4788                                  	;js	short sb_GetId
  4789 00002305 7910                    	jns	short sb_next
  4790                                  	;loop	WaitId
  4791                                  	;jmp	sb_Exit
  4792                                  
  4793                                  sb_GetId:
  4794 00002307 668B15[D2770000]        	mov	dx, [audio_io_base]
  4795                                  	;add	dx, 0Ah
  4796 0000230E 80C20A                  	add	dl, 0Ah
  4797                                  	;in	al, dx
  4798                                  	;mov	ah, 0  ;inb
  4799 00002311 CD34                    	int	34h
  4800 00002313 3CAA                    	cmp	al, 0AAh
  4801 00002315 740C                    	je	short SbOk
  4802                                  sb_next:
  4803 00002317 E2DE                    	loop	WaitId
  4804                                  	;stc
  4805                                  
  4806 00002319 BE[CE740000]            	mov	esi, sb16_init_err_msg
  4807 0000231E E90BFFFFFF              	jmp	init_error
  4808                                  
  4809                                  SbOk:
  4810 00002323 C3                      	retn
  4811                                  
  4812                                  ;-----------------------------------------------------------------------------
  4813                                  ;-----------------------------------------------------------------------------
  4814                                  
  4815                                  	; 10/02/2025
  4816                                  	; 09/02/2025
  4817                                  	; 20/10/2017 - playwav.s
  4818                                  
  4819                                  sb16_init_play:
  4820 00002324 668B15[D2770000]        	mov	dx, [audio_io_base]
  4821                                  	;add	dx, 0Ch
  4822 0000232B 80C20C                  	add	dl, 0Ch
  4823                                  	SbOut	0D1h	; Turn on speaker
   106                              <1> %%Wait:
   107                              <1> 
   108 0000232E B400                <1>  mov ah, 0
   109 00002330 CD34                <1>  int 34h
   110 00002332 08C0                <1>  or al, al
   111 00002334 78F8                <1>  js short %%Wait
   112 00002336 B0D1                <1>  mov al, %1
   113                              <1> 
   114 00002338 B401                <1>  mov ah, 1
   115 0000233A CD34                <1>  int 34h
  4824                                  	SbOut	41h	; 8 bit or 16 bit transfer
   106                              <1> %%Wait:
   107                              <1> 
   108 0000233C B400                <1>  mov ah, 0
   109 0000233E CD34                <1>  int 34h
   110 00002340 08C0                <1>  or al, al
   111 00002342 78F8                <1>  js short %%Wait
   112 00002344 B041                <1>  mov al, %1
   113                              <1> 
   114 00002346 B401                <1>  mov ah, 1
   115 00002348 CD34                <1>  int 34h
  4825 0000234A 668B1D[60770000]        	mov	bx, [WAVE_SampleRate] ; sampling rate (Hz)
  4826                                  	SbOut	bh	; sampling rate high byte
   106                              <1> %%Wait:
   107                              <1> 
   108 00002351 B400                <1>  mov ah, 0
   109 00002353 CD34                <1>  int 34h
   110 00002355 08C0                <1>  or al, al
   111 00002357 78F8                <1>  js short %%Wait
   112 00002359 88F8                <1>  mov al, %1
   113                              <1> 
   114 0000235B B401                <1>  mov ah, 1
   115 0000235D CD34                <1>  int 34h
  4827                                  	SbOut	bl	; sampling rate low byte
   106                              <1> %%Wait:
   107                              <1> 
   108 0000235F B400                <1>  mov ah, 0
   109 00002361 CD34                <1>  int 34h
   110 00002363 08C0                <1>  or al, al
   111 00002365 78F8                <1>  js short %%Wait
   112 00002367 88D8                <1>  mov al, %1
   113                              <1> 
   114 00002369 B401                <1>  mov ah, 1
   115 0000236B CD34                <1>  int 34h
  4828                                  
  4829                                  StartDMA:
  4830                                  	; autoinitialized mode
  4831 0000236D 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16 ; 16 bit samples
  4832 00002374 7411                    	je	short sb_play_1
  4833                                  	; 8 bit samples
  4834 00002376 66BBC600                	mov	bx, 0C6h ; 8 bit output (0C6h)
  4835 0000237A 803D[5E770000]02        	cmp	byte [WAVE_NumChannels], 2 ; 1 = mono, 2 = stereo
  4836 00002381 7214                    	jb	short sb_play_2
  4837 00002383 B720                    	mov	bh, 20h	; 8 bit stereo (20h)
  4838 00002385 EB10                    	jmp	short sb_play_2
  4839                                  sb_play_1:
  4840                                  	; 16 bit samples
  4841 00002387 66BBB610                	mov	bx, 10B6h ; 16 bit output (0B6h)
  4842 0000238B 803D[5E770000]02        	cmp	byte [WAVE_NumChannels], 2 ; 1 = mono, 2 = stereo
  4843 00002392 7203                    	jb	short sb_play_2
  4844 00002394 80C720                  	add	bh, 20h	; 16 bit stereo (30h)
  4845                                  sb_play_2:
  4846                                  	; PCM output (8/16 bit mono autoinitialized transfer)
  4847                                  	SbOut   bl	; bCommand
   106                              <1> %%Wait:
   107                              <1> 
   108 00002397 B400                <1>  mov ah, 0
   109 00002399 CD34                <1>  int 34h
   110 0000239B 08C0                <1>  or al, al
   111 0000239D 78F8                <1>  js short %%Wait
   112 0000239F 88D8                <1>  mov al, %1
   113                              <1> 
   114 000023A1 B401                <1>  mov ah, 1
   115 000023A3 CD34                <1>  int 34h
  4848                                  	SbOut	bh	; bMode
   106                              <1> %%Wait:
   107                              <1> 
   108 000023A5 B400                <1>  mov ah, 0
   109 000023A7 CD34                <1>  int 34h
   110 000023A9 08C0                <1>  or al, al
   111 000023AB 78F8                <1>  js short %%Wait
   112 000023AD 88F8                <1>  mov al, %1
   113                              <1> 
   114 000023AF B401                <1>  mov ah, 1
   115 000023B1 CD34                <1>  int 34h
  4849                                  
  4850 000023B3 8B1D[E8810000]          	mov	ebx, [buffersize] ; = [loadsize] for SB16
  4851                                  			; half buffer size
  4852 000023B9 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16 ; 16 bit DMA
  4853 000023C0 7502                    	jne	short sb_play_3
  4854 000023C2 D1EB                    	shr	ebx, 1	; byte count to word count (samples)
  4855                                  sb_play_3:
  4856 000023C4 4B                      	dec	ebx ; wBlkSize is one less than the actual size
  4857                                  	SbOut   bl
   106                              <1> %%Wait:
   107                              <1> 
   108 000023C5 B400                <1>  mov ah, 0
   109 000023C7 CD34                <1>  int 34h
   110 000023C9 08C0                <1>  or al, al
   111 000023CB 78F8                <1>  js short %%Wait
   112 000023CD 88D8                <1>  mov al, %1
   113                              <1> 
   114 000023CF B401                <1>  mov ah, 1
   115 000023D1 CD34                <1>  int 34h
  4858                                  	SbOut   bh
   106                              <1> %%Wait:
   107                              <1> 
   108 000023D3 B400                <1>  mov ah, 0
   109 000023D5 CD34                <1>  int 34h
   110 000023D7 08C0                <1>  or al, al
   111 000023D9 78F8                <1>  js short %%Wait
   112 000023DB 88F8                <1>  mov al, %1
   113                              <1> 
   114 000023DD B401                <1>  mov ah, 1
   115 000023DF CD34                <1>  int 34h
  4859                                  
  4860 000023E1 C605[D8770000]0D        	mov	byte [volume], 13 ; max = 15, min = 0
  4861                                  
  4862 000023E8 E8A1E1FFFF              	call	SetPCMOutVolume
  4863                                  
  4864 000023ED C3                      	retn
  4865                                  
  4866                                  ;-----------------------------------------------------------------------------
  4867                                  
  4868                                  	; 10/02/2025
  4869                                  	; 09/02/2025
  4870                                  	; 20/10/2017 - playwav.s
  4871                                  
  4872                                  sb16_stop:
  4873                                  	; 09/02/2025
  4874                                  	; Ref: TRDOS 386 Kernel v2.0.9 audio.s (06/06/2024)
  4875                                  	;      sb16_stop procedure (06/08/2022, v2.0.5)
  4876                                  
  4877                                  	;mov	byte [stopped], 2
  4878                                  	;
  4879 000023EE 668B15[D2770000]        	mov	dx, [audio_io_base]
  4880                                  	;add	dx, 0Ch
  4881 000023F5 80C20C                  	add	dl, 0Ch
  4882                                  
  4883 000023F8 B3D9                    	mov	bl, 0D9h ; exit auto-initialize 16 bit transfer
  4884                                  	; stop  autoinitialized DMA transfer mode 
  4885 000023FA 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16 ; 16 bit samples
  4886 00002401 7402                    	je	short sb16_stop_1
  4887                                  	;mov	bl, 0DAh ; exit auto-initialize 8 bit transfer
  4888 00002403 FEC3                    	inc	bl
  4889                                  sb16_stop_1:
  4890                                  	SbOut	bl ; exit auto-initialize transfer command
   106                              <1> %%Wait:
   107                              <1> 
   108 00002405 B400                <1>  mov ah, 0
   109 00002407 CD34                <1>  int 34h
   110 00002409 08C0                <1>  or al, al
   111 0000240B 78F8                <1>  js short %%Wait
   112 0000240D 88D8                <1>  mov al, %1
   113                              <1> 
   114 0000240F B401                <1>  mov ah, 1
   115 00002411 CD34                <1>  int 34h
  4891                                  
  4892 00002413 30C0                    	xor	al, al ; stops all DMA processes on selected channel
  4893 00002415 B401                    	mov	ah, 1
  4894                                  
  4895 00002417 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16 ; 16 bit samples
  4896 0000241E 7408                    	je	short sb16_stop_2
  4897                                  
  4898                                  	;out	0Ch, al ; clear selected channel register
  4899 00002420 66BA0C00                	mov	dx, 0Ch
  4900                                  	;mov	ah, 1 ;outb
  4901 00002424 CD34                    	int	34h
  4902                                  
  4903 00002426 EB06                    	jmp	short sb16_stop_3
  4904                                  
  4905                                  sb16_stop_2:
  4906                                  	;out	0D8h, al ; clear selected channel register
  4907 00002428 66BAD800                	mov	dx, 0D8h
  4908                                  	;mov	ah, 1 ;outb
  4909 0000242C CD34                    	int	34h
  4910                                  
  4911                                  sb16_stop_3:
  4912 0000242E C605[D9770000]02        	mov	byte [stopped], 2 ; stop !
  4913                                  SbDone:
  4914                                  	; 10/02/2025
  4915 00002435 668B15[D2770000]        	mov	dx, [audio_io_base]
  4916 0000243C 80C20C                  	add	dl, 0Ch
  4917                                  	SbOut   0D0h
   106                              <1> %%Wait:
   107                              <1> 
   108 0000243F B400                <1>  mov ah, 0
   109 00002441 CD34                <1>  int 34h
   110 00002443 08C0                <1>  or al, al
   111 00002445 78F8                <1>  js short %%Wait
   112 00002447 B0D0                <1>  mov al, %1
   113                              <1> 
   114 00002449 B401                <1>  mov ah, 1
   115 0000244B CD34                <1>  int 34h
  4918                                  	SbOut   0D3h
   106                              <1> %%Wait:
   107                              <1> 
   108 0000244D B400                <1>  mov ah, 0
   109 0000244F CD34                <1>  int 34h
   110 00002451 08C0                <1>  or al, al
   111 00002453 78F8                <1>  js short %%Wait
   112 00002455 B0D3                <1>  mov al, %1
   113                              <1> 
   114 00002457 B401                <1>  mov ah, 1
   115 00002459 CD34                <1>  int 34h
  4919                                  sb16_stop_4:
  4920 0000245B C3                      	retn
  4921                                  
  4922                                  ;-----------------------------------------------------------------------------
  4923                                  
  4924                                  	; 09/02/2025
  4925                                  	
  4926                                  sb16_pause:
  4927                                  	; Ref: TRDOS 386 Kernel v2.0.9 audio.s (06/06/2024)
  4928                                  	;      sb16_pause procedure (06/08/2022, v2.0.5)
  4929                                  
  4930 0000245C C605[D9770000]01        	mov	byte [stopped], 1 ; paused
  4931                                  	;
  4932 00002463 668B15[D2770000]        	mov	dx, [audio_io_base]
  4933                                  	;add	dx, 0Ch ; Command & Data Port
  4934 0000246A 80C20C                  	add	dl, 0Ch
  4935 0000246D 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16 ; 16 bit samples
  4936 00002474 7404                    	je	short sb_pause_1
  4937                                  	; 8 bit samples
  4938 00002476 B3D0                    	mov	bl, 0D0h ; 8 bit DMA mode
  4939 00002478 EB02                    	jmp	short sb_pause_2
  4940                                  sb_pause_1:
  4941                                  	; 16 bit samples
  4942 0000247A B3D5                    	mov	bl, 0D5h ; 16 bit DMA mode
  4943                                  sb_pause_2:
  4944                                  	SbOut   bl ; bCommand
   106                              <1> %%Wait:
   107                              <1> 
   108 0000247C B400                <1>  mov ah, 0
   109 0000247E CD34                <1>  int 34h
   110 00002480 08C0                <1>  or al, al
   111 00002482 78F8                <1>  js short %%Wait
   112 00002484 88D8                <1>  mov al, %1
   113                              <1> 
   114 00002486 B401                <1>  mov ah, 1
   115 00002488 CD34                <1>  int 34h
  4945                                  sb_pause_3:
  4946 0000248A C3                      	retn
  4947                                  
  4948                                  ;-----------------------------------------------------------------------------
  4949                                  
  4950                                  	; 09/02/2025
  4951                                  
  4952                                  sb16_play:
  4953                                  sb16_continue:
  4954                                  	; Ref: TRDOS 386 Kernel v2.0.9 audio.s (06/06/2024)
  4955                                  	;      sb16_pause procedure (06/08/2022, v2.0.5)
  4956                                  
  4957                                  	; continue to play (after pause)
  4958 0000248B C605[D9770000]00        	mov	byte [stopped], 0
  4959                                  	;
  4960 00002492 668B15[D2770000]        	mov	dx, [audio_io_base]
  4961                                  	;add	dx, 0Ch ; Command & Data Port
  4962 00002499 80C20C                  	add	dl, 0Ch
  4963 0000249C 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16 ; 16 bit samples
  4964 000024A3 7404                    	je	short sb_cont_1
  4965                                  	; 8 bit samples
  4966 000024A5 B3D4                    	mov	bl, 0D4h ; 8 bit DMA mode
  4967 000024A7 EB02                    	jmp	short sb_cont_2
  4968                                  sb_cont_1:
  4969                                  	; 16 bit samples
  4970 000024A9 B3D6                    	mov	bl, 0D6h ; 16 bit DMA mode
  4971                                  sb_cont_2:     
  4972                                  	SbOut   bl ; bCommand
   106                              <1> %%Wait:
   107                              <1> 
   108 000024AB B400                <1>  mov ah, 0
   109 000024AD CD34                <1>  int 34h
   110 000024AF 08C0                <1>  or al, al
   111 000024B1 78F8                <1>  js short %%Wait
   112 000024B3 88D8                <1>  mov al, %1
   113                              <1> 
   114 000024B5 B401                <1>  mov ah, 1
   115 000024B7 CD34                <1>  int 34h
  4973                                  sb_cont_3:
  4974 000024B9 C3                      	retn
  4975                                  
  4976                                  ;=============================================================================
  4977                                  ;	AC'97 Audio System Initialization
  4978                                  ;============================================================================
  4979                                  
  4980                                  	; 09/02/2025
  4981                                  ac97_init:
  4982                                  	; 05/02/2025 - ac97play.s
  4983                                  codecConfig:
  4984                                  	;AC97_EA_VRA equ 1
  4985                                  	AC97_EA_VRA equ BIT0
  4986                                  
  4987                                  init_ac97_controller:
  4988 000024BA A1[CE770000]            	mov	eax, [bus_dev_fn]
  4989 000024BF B004                    	mov	al, PCI_CMD_REG
  4990 000024C1 E804080000              	call	pciRegRead16		; read PCI command register
  4991 000024C6 80CA05                  	or      dl, IO_ENA+BM_ENA	; enable IO and bus master
  4992 000024C9 E87E080000              	call	pciRegWrite16
  4993                                  
  4994                                  	;call	delay_100ms
  4995                                  
  4996                                  init_ac97_codec:
  4997 000024CE BD28000000              	mov	ebp, 40
  4998                                  	;mov	ebp, 1000
  4999                                  _initc_1:
  5000 000024D3 66BA3000                	mov	dx, GLOB_STS_REG ; 30h
  5001 000024D7 660315[D4770000]        	add	dx, [NABMBAR]
  5002                                  	;in	eax, dx
  5003 000024DE B404                    	mov	ah, 4	; read port, dword
  5004 000024E0 CD34                    	int	34h
  5005                                  
  5006 000024E2 E85B060000              	call	delay1_4ms
  5007                                  
  5008 000024E7 83F8FF                  	cmp	eax, 0FFFFFFFFh ; -1
  5009 000024EA 750A                    	jne	short _initc_3
  5010                                  _initc_2:
  5011 000024EC 4D                      	dec	ebp
  5012 000024ED 7425                    	jz	short _ac97_codec_ready
  5013                                  
  5014 000024EF E83F060000              	call	delay_100ms
  5015 000024F4 EBDD                    	jmp	short _initc_1
  5016                                  _initc_3:
  5017 000024F6 A900030010              	test	eax, CTRL_ST_CREADY
  5018 000024FB 7517                    	jnz	short _ac97_codec_ready
  5019                                  
  5020 000024FD 803D[3D740000]01        	cmp	byte [reset], 1
  5021 00002504 73E6                    	jnb	short _initc_2
  5022                                  
  5023 00002506 E899010000              	call	reset_ac97_codec
  5024                                  
  5025 0000250B C605[3D740000]01        	mov	byte [reset], 1
  5026                                  
  5027 00002512 EBD8                    	jmp	short _initc_2
  5028                                  
  5029                                  _ac97_codec_ready:
  5030 00002514 668B15[D2770000]        	mov	dx, [NAMBAR]
  5031                                  	;add	dx, 0 ; ac_reg_0 ; reset register
  5032                                  	;out	dx, ax
  5033 0000251B 89C3                    	mov	ebx, eax ; bx = data, word
  5034 0000251D B403                    	mov	ah, 3	; write port, word
  5035 0000251F CD34                    	int	34h
  5036                                  	
  5037 00002521 E80D060000              	call	delay_100ms
  5038                                  
  5039 00002526 09ED                    	or	ebp, ebp
  5040 00002528 7535                    	jnz	short _ac97_codec_init_ok
  5041                                  
  5042                                  	;xor	eax, eax ; 0
  5043 0000252A 668B15[D2770000]        	mov	dx, [NAMBAR]
  5044 00002531 6683C226                	add	dx, CODEC_REG_POWERDOWN
  5045                                  	;out	dx, ax
  5046                                  	;mov	ebx, eax
  5047 00002535 31DB                    	xor	ebx, ebx
  5048 00002537 B403                    	mov	ah, 3	; write port, word
  5049 00002539 CD34                    	int	34h
  5050                                  
  5051                                  	;call	delay1_4ms
  5052                                  
  5053                                  	; wait for 1 second
  5054 0000253B B9E8030000              	mov	ecx, 1000 ; 1000*4*0.25ms = 1s
  5055                                  	;mov	ecx, 40
  5056                                  _ac97_codec_rloop:
  5057                                  	;call	delay_100ms
  5058 00002540 E8FD050000              	call	delay1_4ms
  5059                                  
  5060 00002545 668B15[D2770000]        	mov	dx, [NAMBAR]
  5061 0000254C 6683C226                	add	dx, CODEC_REG_POWERDOWN
  5062                                  	;in	ax, dx
  5063 00002550 B402                    	mov	ah, 2	; read port, word
  5064 00002552 CD34                    	int	34h
  5065                                  
  5066                                  	;call	delay1_4ms
  5067                                  	
  5068 00002554 6683E00F                	and	ax, 0Fh
  5069 00002558 3C0F                    	cmp	al, 0Fh
  5070 0000255A 7403                    	je	short _ac97_codec_init_ok
  5071 0000255C E2E2                    	loop	_ac97_codec_rloop 
  5072                                  
  5073                                  init_ac97_codec_err1:
  5074                                  	;stc	; cf = 1
  5075                                  init_ac97_codec_err2:
  5076 0000255E C3                      	retn
  5077                                  
  5078                                  _ac97_codec_init_ok:
  5079 0000255F E8E1000000              	call 	reset_ac97_controller
  5080                                  
  5081                                  	;call	delay_100ms
  5082                                  
  5083                                  	;call	delay1_4ms
  5084                                  	;call	delay1_4ms
  5085                                  	;call	delay1_4ms
  5086 00002564 E8D9050000              	call	delay1_4ms
  5087                                  
  5088                                  setup_ac97_codec:
  5089 00002569 66813D[60770000]80-     	cmp	word [WAVE_SampleRate], 48000
  5089 00002571 BB                 
  5090 00002572 0F849A000000            	je	skip_rate
  5091                                  	
  5092                                  	;cmp	byte [VRA], 0
  5093                                  	;jna	short skip_rate
  5094                                  
  5095 00002578 668B15[D2770000]        	mov	dx, [NAMBAR]
  5096 0000257F 6683C22A                	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  5097                                  	;in	ax, dx
  5098 00002583 B402                    	mov	ah, 2 ; read port, word
  5099 00002585 CD34                    	int	34h
  5100                                  
  5101 00002587 E8B6050000              	call	delay1_4ms
  5102                                  	
  5103                                  	;and	al, NOT BIT1 ; Clear DRA
  5104                                  	;;;
  5105                                  	; (FASM)
  5106                                  	;and	al, NOT (BIT1+BIT0) ; Clear DRA+VRA
  5107                                  	; (NASM)
  5108 0000258C 24FC                    	and	al, ~(BIT1+BIT0) ; 0FCh
  5109                                  	;out	dx, ax
  5110 0000258E 89C3                    	mov	ebx, eax
  5111 00002590 668B15[D2770000]        	mov	dx, [NAMBAR]
  5112 00002597 6683C22A                	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  5113 0000259B B403                    	mov	ah, 3 ; write port, word
  5114 0000259D CD34                    	int	34h
  5115                                  
  5116 0000259F E8AC010000              	call	check_vra
  5117                                  
  5118 000025A4 803D[C7770000]00        	cmp	byte [VRA], 0
  5119 000025AB 7665                    	jna	short skip_rate
  5120                                  
  5121 000025AD 668B15[D2770000]        	mov	dx, [NAMBAR]
  5122 000025B4 6683C22A                	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  5123                                  	;in	ax, dx
  5124 000025B8 B402                    	mov	ah, 2 ; read port, word
  5125 000025BA CD34                    	int	34h
  5126                                  
  5127                                  	;and	al, ~BIT1 ; Clear DRA
  5128                                  	;;;
  5129                                  
  5130 000025BC 0C01                    	or	al, AC97_EA_VRA ; 1
  5131                                  
  5132 000025BE 668B15[D2770000]        	mov	dx, [NAMBAR]
  5133 000025C5 6683C22A                	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  5134                                  	;out	dx, ax		; Enable variable rate audio
  5135 000025C9 89C3                    	mov	ebx, eax
  5136 000025CB B403                    	mov	ah, 3 ; write port, word
  5137 000025CD CD34                    	int	34h
  5138                                  
  5139 000025CF B90A000000              	mov	ecx, 10
  5140                                  check_vra_loop:
  5141                                  	;call	delay_100ms
  5142 000025D4 E869050000              	call	delay1_4ms
  5143                                  
  5144 000025D9 668B15[D2770000]        	mov	dx, [NAMBAR]
  5145 000025E0 6683C22A                	add	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  5146                                  	;in	ax, dx
  5147 000025E4 B402                    	mov	ah, 2 ; read port, word
  5148 000025E6 CD34                    	int	34h
  5149                                  	
  5150 000025E8 A801                    	test	al, AC97_EA_VRA ; 1
  5151 000025EA 750B                    	jnz	short set_rate
  5152                                  
  5153 000025EC E2E6                    	loop	check_vra_loop
  5154                                  
  5155                                  ;vra_not_supported:
  5156 000025EE C605[C7770000]00        	mov	byte [VRA], 0
  5157 000025F5 EB1B                    	jmp	short skip_rate
  5158                                  
  5159                                  set_rate:
  5160                                  	;mov	ax, [WAVE_SampleRate]
  5161                                  
  5162 000025F7 668B15[D2770000]        	mov    	dx, [NAMBAR]               	
  5163 000025FE 6683C22C                	add    	dx, CODEC_PCM_FRONT_DACRATE_REG	; 2Ch
  5164                                  	;out	dx, ax 		; PCM Front/Center Output Sample Rate
  5165                                  	;mov	ebx, eax  ; bx = data, word
  5166 00002602 668B1D[60770000]        	mov	bx, [WAVE_SampleRate]
  5167 00002609 B403                    	mov	ah, 3 ; write port, word
  5168 0000260B CD34                    	int	34h
  5169                                  
  5170                                  	;call	delay_100ms
  5171 0000260D E830050000              	call	delay1_4ms
  5172                                  
  5173                                  skip_rate:
  5174                                  	;mov	ax, 0202h
  5175 00002612 668B15[D2770000]          	mov	dx, [NAMBAR]
  5176 00002619 6683C202                  	add	dx, CODEC_MASTER_VOL_REG ; 02h
  5177                                  	;out	dx, ax
  5178                                  	;mov	ebx, eax  ; bx = data, word
  5179 0000261D 66BB0202                	mov	bx, 0202h 
  5180 00002621 B403                    	mov	ah, 3 ; write port, word
  5181 00002623 CD34                    	int	34h
  5182                                  
  5183                                  	;call	delay1_4ms
  5184                                  	;call	delay1_4ms
  5185                                  	;call	delay1_4ms
  5186 00002625 E818050000              	call	delay1_4ms
  5187                                  
  5188                                  	;mov	ax, 0202h
  5189 0000262A 668B15[D2770000]          	mov	dx, [NAMBAR]
  5190 00002631 6683C218                  	add	dx, CODEC_PCM_OUT_REG ; 18h
  5191                                    	;out	dx, ax
  5192                                  	;mov	ebx, eax  ; bx = data, word
  5193 00002635 66BB0202                	mov	bx, 0202h
  5194 00002639 B403                    	mov	ah, 3 ; write port, word
  5195 0000263B CD34                    	int	34h
  5196                                  	
  5197                                  	;call	delay1_4ms
  5198                                  	;call	delay1_4ms
  5199                                  	;call	delay1_4ms
  5200                                  	;call	delay1_4ms
  5201                                  
  5202                                  	;clc
  5203                                  
  5204 0000263D C605[D8770000]1D        	mov	byte [volume], 29 ; max = 31, min = 0
  5205                                  
  5206 00002644 C3                              retn
  5207                                  
  5208                                  ;-----------------------------------------------------------------------------
  5209                                  
  5210                                  	; 09/02/2025
  5211                                  	; 05/02/2025 - ac97play.s
  5212                                  
  5213                                  reset_ac97_controller:
  5214                                  	; reset AC97 audio controller registers
  5215 00002645 31C0                    	xor	eax, eax
  5216 00002647 66BA0B00                        mov	dx, PI_CR_REG
  5217 0000264B 660315[D4770000]        	add	dx, [NABMBAR]
  5218                                  	;out	dx, al
  5219                                  	; al = data, byte
  5220 00002652 B401                    	mov	ah, 1 ; write port, byte
  5221 00002654 CD34                    	int	34h
  5222                                  
  5223                                  	;call	delay1_4ms
  5224                                  
  5225 00002656 66BA1B00                        mov     dx, PO_CR_REG
  5226 0000265A 660315[D4770000]        	add	dx, [NABMBAR]
  5227                                  	;out	dx, al
  5228                                  	; al = data, byte
  5229 00002661 B401                    	mov	ah, 1 ; write port, byte
  5230 00002663 CD34                    	int	34h
  5231                                  
  5232                                  	;call	delay1_4ms
  5233                                  
  5234 00002665 66BA2B00                        mov     dx, MC_CR_REG
  5235 00002669 660315[D4770000]        	add	dx, [NABMBAR]
  5236                                  	;out	dx, al
  5237 00002670 B401                    	mov	ah, 1 ; write port, byte
  5238 00002672 CD34                    	int	34h
  5239                                  
  5240                                  	;call	delay1_4ms
  5241                                  
  5242 00002674 B002                            mov	al, RR
  5243 00002676 66BA0B00                        mov	dx, PI_CR_REG
  5244 0000267A 660315[D4770000]        	add	dx, [NABMBAR]
  5245                                  	;out	dx, al
  5246 00002681 B401                    	mov	ah, 1 ; write port, byte
  5247 00002683 CD34                    	int	34h
  5248                                  
  5249                                  	;call	delay1_4ms
  5250                                  
  5251 00002685 66BA1B00                        mov	dx, PO_CR_REG
  5252 00002689 660315[D4770000]        	add	dx, [NABMBAR]
  5253                                  	;out	dx, al
  5254 00002690 B401                    	mov	ah, 1 ; write port, byte
  5255 00002692 CD34                    	int	34h
  5256                                  
  5257                                  	;call	delay1_4ms
  5258                                  
  5259 00002694 66BA2B00                        mov	dx, MC_CR_REG
  5260 00002698 660315[D4770000]        	add	dx, [NABMBAR]
  5261                                  	;out	dx, al
  5262 0000269F B401                    	mov	ah, 1 ; write port, byte
  5263 000026A1 CD34                    	int	34h
  5264                                  
  5265                                  	;call	delay1_4ms
  5266                                  
  5267 000026A3 C3                      	retn
  5268                                  
  5269                                  ;-----------------------------------------------------------------------------
  5270                                  
  5271                                  	; 09/02/2025
  5272                                  	; 05/02/2025 - ac97play.s
  5273                                  
  5274                                  reset_ac97_codec:
  5275 000026A4 66BA2C00                	mov	dx, GLOB_CNT_REG ; 2Ch
  5276 000026A8 660315[D4770000]        	add	dx, [NABMBAR]
  5277                                  	;in	eax, dx
  5278 000026AF B404                    	mov	ah, 4 ; read port, dword
  5279 000026B1 CD34                    	int	34h
  5280                                  
  5281 000026B3 A802                    	test	al, 2
  5282 000026B5 7407                    	jz	short _r_ac97codec_cold
  5283                                  
  5284 000026B7 E80E000000              	call	warm_ac97codec_reset
  5285 000026BC 7308                    	jnc	short _r_ac97codec_ok
  5286                                  _r_ac97codec_cold:
  5287 000026BE E840000000                      call	cold_ac97codec_reset
  5288 000026C3 7301                            jnc	short _r_ac97codec_ok
  5289                                  	
  5290                                          ;xor	eax, eax ; timeout error
  5291                                         	;stc
  5292 000026C5 C3                      	retn
  5293                                  
  5294                                  _r_ac97codec_ok:
  5295 000026C6 31C0                            xor     eax, eax
  5296 000026C8 40                              inc	eax
  5297 000026C9 C3                      	retn
  5298                                  
  5299                                  ;-----------------------------------------------------------------------------
  5300                                  
  5301                                  	; 09/02/2025
  5302                                  	; 05/02/2025 - ac97play.s
  5303                                  
  5304                                  warm_ac97codec_reset:
  5305                                  	;mov	eax, 6
  5306 000026CA 66BA2C00                	mov	dx, GLOB_CNT_REG ; 2Ch
  5307 000026CE 660315[D4770000]        	add	dx, [NABMBAR]
  5308                                  	;out	dx, eax
  5309                                  	;mov	ebx, eax  ; ebx = data, dword
  5310 000026D5 BB06000000              	mov	ebx, 6
  5311 000026DA B405                    	mov	ah, 5 ; write port, dword
  5312 000026DC CD34                    	int	34h
  5313                                  
  5314 000026DE B90A000000              	mov	ecx, 10	; total 1s
  5315                                  _warm_ac97c_rst_wait:
  5316 000026E3 E84B040000              	call	delay_100ms
  5317                                  
  5318 000026E8 66BA3000                	mov	dx, GLOB_STS_REG ; 30h
  5319 000026EC 660315[D4770000]        	add	dx, [NABMBAR]
  5320                                  	;in	eax, dx
  5321 000026F3 B404                    	mov	ah, 4 ; read port, dword
  5322 000026F5 CD34                    	int	34h
  5323                                  
  5324 000026F7 A900030010              	test	eax, CTRL_ST_CREADY
  5325 000026FC 7504                    	jnz	short _warm_ac97c_rst_ok
  5326                                  
  5327 000026FE 49                      	dec	ecx
  5328 000026FF 75E2                    	jnz	short _warm_ac97c_rst_wait
  5329                                  
  5330                                  _warm_ac97c_rst_fail:
  5331 00002701 F9                              stc
  5332                                  _warm_ac97c_rst_ok:
  5333 00002702 C3                      	retn
  5334                                  
  5335                                  ;-----------------------------------------------------------------------------
  5336                                  
  5337                                  	; 09/02/2025
  5338                                  	; 05/02/2025 - ac97play.s
  5339                                  
  5340                                  cold_ac97codec_reset:
  5341                                          ;mov	eax, 2
  5342 00002703 66BA2C00                	mov	dx, GLOB_CNT_REG ; 2Ch
  5343 00002707 660315[D4770000]        	add	dx, [NABMBAR]
  5344                                  	;out	dx, eax
  5345                                  	;mov	ebx, eax  ; ebx = data, dword
  5346 0000270E BB02000000              	mov	ebx, 2
  5347 00002713 B405                    	mov	ah, 5 ; write port, dword
  5348 00002715 CD34                    	int	34h
  5349                                  
  5350 00002717 E817040000              	call	delay_100ms 	; wait 100 ms
  5351 0000271C E812040000              	call	delay_100ms 	; wait 100 ms
  5352 00002721 E80D040000              	call	delay_100ms 	; wait 100 ms
  5353 00002726 E808040000              	call	delay_100ms 	; wait 100 ms
  5354                                  
  5355 0000272B B910000000              	mov	ecx, 16	; total 20*100 ms = 2s
  5356                                  _cold_ac97c_rst_wait:
  5357 00002730 66BA3000                	mov	dx, GLOB_STS_REG ; 30h
  5358 00002734 660315[D4770000]        	add	dx, [NABMBAR]
  5359                                  	;in	eax, dx
  5360 0000273B B404                    	mov	ah, 4 ; read port, dword
  5361 0000273D CD34                    	int	34h
  5362                                  
  5363 0000273F A900030010              	test	eax, CTRL_ST_CREADY
  5364 00002744 7509                    	jnz	short _cold_ac97c_rst_ok
  5365                                  
  5366 00002746 E8E8030000              	call	delay_100ms
  5367                                  
  5368 0000274B 49                      	dec	ecx
  5369 0000274C 75E2                    	jnz	short _cold_ac97c_rst_wait
  5370                                  
  5371                                  _cold_ac97c_rst_fail:
  5372 0000274E F9                              stc
  5373                                  _cold_ac97c_rst_ok:
  5374 0000274F C3                      	retn
  5375                                  
  5376                                  ;-----------------------------------------------------------------------------
  5377                                  
  5378                                  	; 09/02/2025
  5379                                  	; 05/02/2025 - ac97play.s
  5380                                  
  5381                                  check_vra:
  5382 00002750 C605[C7770000]01        	mov	byte [VRA], 1
  5383                                  
  5384 00002757 668B15[D2770000]        	mov	dx, [NAMBAR]
  5385 0000275E 6683C228                	add	dx, CODEC_EXT_AUDIO_REG	; 28h
  5386                                  	;in	ax, dx
  5387 00002762 B402                    	mov	ah, 2 ; read port, word
  5388 00002764 CD34                    	int	34h
  5389                                  
  5390                                  	;call	delay1_4ms
  5391                                  
  5392 00002766 A801                    	test	al, BIT0 ; 1 ; Variable Rate Audio bit
  5393 00002768 7507                    	jnz	short check_vra_ok
  5394                                  
  5395                                  vra_not_supported:
  5396 0000276A C605[C7770000]00        	mov	byte [VRA], 0
  5397                                  check_vra_ok:
  5398 00002771 C3                      	retn
  5399                                  
  5400                                  ;-----------------------------------------------------------------------------
  5401                                  ;-----------------------------------------------------------------------------
  5402                                  
  5403                                  	; 10/02/2025
  5404                                  	; 08/02/2025 - twavplay.asm
  5405                                  	; !!!! 18.2 block/second buffer sizing for proper wave scopes !!!!
  5406                                  	; (wave graphics synchronization) 
  5407                                  
  5408                                  ac97_play_setup:
  5409 00002772 803D[C7770000]01        	cmp	byte [VRA], 1
  5410 00002779 720B                    	jb	short chk_sample_rate
  5411                                  
  5412                                  playwav_48_khz:
  5413 0000277B C705[E0810000]-         	mov	dword [loadfromwavfile], loadFromFile
  5413 00002781 [94060000]         
  5414 00002785 C3                      	retn
  5415                                  
  5416                                  chk_sample_rate:
  5417                                  	; set conversion parameters
  5418                                  	; (for 8, 11.025, 16, 22.050, 24, 32 kHZ)
  5419 00002786 66A1[60770000]          	mov	ax, [WAVE_SampleRate]
  5420 0000278C 663D80BB                	cmp	ax, 48000
  5421 00002790 74E9                    	je	short playwav_48_khz
  5422                                  chk_22khz:
  5423 00002792 663D2256                	cmp	ax, 22050
  5424 00002796 7545                    	jne	short chk_11khz
  5425 00002798 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5426 0000279F 7615                    	jna	short chk_22khz_1
  5427 000027A1 BB[A1130000]            	mov	ebx, load_22khz_stereo_16_bit
  5428 000027A6 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5429 000027AD 751A                    	jne	short chk_22khz_2
  5430 000027AF BB[14130000]            	mov	ebx, load_22khz_mono_16_bit
  5431 000027B4 EB13                    	jmp	short chk_22khz_2
  5432                                  chk_22khz_1:
  5433 000027B6 BB[8D120000]            	mov	ebx, load_22khz_stereo_8_bit
  5434 000027BB 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5435 000027C2 7505                    	jne	short chk_22khz_2
  5436 000027C4 BB[04120000]            	mov	ebx, load_22khz_mono_8_bit
  5437                                  chk_22khz_2:
  5438 000027C9 B8B7040000              	mov	eax, 1207  ; (71*17)		
  5439 000027CE BA25000000              	mov	edx, 37
  5440 000027D3 B911000000              	mov	ecx, 17
  5441 000027D8 E921020000              	jmp	set_sizes
  5442                                  chk_11khz:
  5443 000027DD 663D112B                	cmp	ax, 11025
  5444 000027E1 7545                    	jne	short chk_44khz
  5445 000027E3 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5446 000027EA 7615                    	jna	short chk_11khz_1
  5447 000027EC BB[BD150000]            	mov	ebx, load_11khz_stereo_16_bit
  5448 000027F1 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5449 000027F8 751A                    	jne	short chk_11khz_2
  5450 000027FA BB[44150000]            	mov	ebx, load_11khz_mono_16_bit
  5451 000027FF EB13                    	jmp	short chk_11khz_2
  5452                                  chk_11khz_1:
  5453 00002801 BB[CA140000]            	mov	ebx, load_11khz_stereo_8_bit
  5454 00002806 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5455 0000280D 7505                    	jne	short chk_11khz_2
  5456 0000280F BB[52140000]            	mov	ebx, load_11khz_mono_8_bit
  5457                                  chk_11khz_2:
  5458 00002814 B864020000              	mov	eax, 612  ; (36*17)	
  5459 00002819 BA4A000000              	mov	edx, 74
  5460 0000281E B911000000              	mov	ecx, 17
  5461 00002823 E9D6010000              	jmp	set_sizes
  5462                                  chk_44khz:
  5463 00002828 663D44AC                	cmp	ax, 44100
  5464 0000282C 7545                    	jne	short chk_16khz
  5465 0000282E 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5466 00002835 7615                    	jna	short chk_44khz_1
  5467 00002837 BB[C4170000]            	mov	ebx, load_44khz_stereo_16_bit
  5468 0000283C 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5469 00002843 751A                    	jne	short chk_44khz_2
  5470 00002845 BB[4B170000]            	mov	ebx, load_44khz_mono_16_bit
  5471 0000284A EB13                    	jmp	short chk_44khz_2
  5472                                  chk_44khz_1:
  5473 0000284C BB[CE160000]            	mov	ebx, load_44khz_stereo_8_bit
  5474 00002851 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5475 00002858 7505                    	jne	short chk_44khz_2
  5476 0000285A BB[52160000]            	mov	ebx, load_44khz_mono_8_bit
  5477                                  chk_44khz_2:
  5478 0000285F B886090000              	mov	eax, 2438  ; (106*23)
  5479 00002864 BA19000000              	mov	edx, 25
  5480 00002869 B917000000              	mov	ecx, 23
  5481 0000286E E98B010000              	jmp	set_sizes
  5482                                  chk_16khz:
  5483 00002873 663D803E                	cmp	ax, 16000
  5484 00002877 7545                    	jne	short chk_8khz
  5485 00002879 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5486 00002880 7615                    	jna	short chk_16khz_1
  5487 00002882 BB[430D0000]            	mov	ebx, load_16khz_stereo_16_bit
  5488 00002887 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5489 0000288E 751A                    	jne	short chk_16khz_2
  5490 00002890 BB[C20C0000]            	mov	ebx, load_16khz_mono_16_bit
  5491 00002895 EB13                    	jmp	short chk_16khz_2
  5492                                  chk_16khz_1:
  5493 00002897 BB[080C0000]            	mov	ebx, load_16khz_stereo_8_bit
  5494 0000289C 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5495 000028A3 7505                    	jne	short chk_16khz_2
  5496 000028A5 BB[890B0000]            	mov	ebx, load_16khz_mono_8_bit
  5497                                  chk_16khz_2:
  5498 000028AA B86F030000              	mov	eax, 879
  5499 000028AF BA03000000              	mov	edx, 3
  5500 000028B4 B901000000              	mov	ecx, 1
  5501 000028B9 E940010000              	jmp	set_sizes
  5502                                  chk_8khz:
  5503 000028BE 663D401F                	cmp	ax, 8000
  5504 000028C2 7545                    	jne	short chk_24khz
  5505 000028C4 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5506 000028CB 7615                    	jna	short chk_8khz_1
  5507 000028CD BB[3E0A0000]            	mov	ebx, load_8khz_stereo_16_bit
  5508 000028D2 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5509 000028D9 751A                    	jne	short chk_8khz_2
  5510 000028DB BB[6E090000]            	mov	ebx, load_8khz_mono_16_bit
  5511 000028E0 EB13                    	jmp	short chk_8khz_2
  5512                                  chk_8khz_1:
  5513 000028E2 BB[3E080000]            	mov	ebx, load_8khz_stereo_8_bit
  5514 000028E7 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5515 000028EE 7505                    	jne	short chk_8khz_2
  5516 000028F0 BB[61070000]            	mov	ebx, load_8khz_mono_8_bit
  5517                                  chk_8khz_2:
  5518 000028F5 B8B8010000              	mov	eax, 440
  5519 000028FA BA06000000              	mov	edx, 6
  5520 000028FF B901000000              	mov	ecx, 1
  5521 00002904 E9F5000000              	jmp	set_sizes
  5522                                  chk_24khz:
  5523 00002909 663DC05D                	cmp	ax, 24000
  5524 0000290D 7545                    	jne	short chk_32khz
  5525 0000290F 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5526 00002916 7615                    	jna	short chk_24khz_1
  5527 00002918 BB[700F0000]            	mov	ebx, load_24khz_stereo_16_bit
  5528 0000291D 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5529 00002924 751A                    	jne	short chk_24khz_2
  5530 00002926 BB[0A0F0000]            	mov	ebx, load_24khz_mono_16_bit
  5531 0000292B EB13                    	jmp	short chk_24khz_2
  5532                                  chk_24khz_1:
  5533 0000292D BB[800E0000]            	mov	ebx, load_24khz_stereo_8_bit
  5534 00002932 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5535 00002939 7505                    	jne	short chk_24khz_2
  5536 0000293B BB[190E0000]            	mov	ebx, load_24khz_mono_8_bit
  5537                                  chk_24khz_2:
  5538 00002940 B826050000              	mov	eax, 1318
  5539 00002945 BA02000000              	mov	edx, 2
  5540 0000294A B901000000              	mov	ecx, 1
  5541 0000294F E9AA000000              	jmp	set_sizes
  5542                                  
  5543                                  chk_32khz:
  5544 00002954 663D007D                	cmp	ax, 32000
  5545 00002958 755E                    	jne	short chk_12khz
  5546 0000295A 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5547 00002961 7615                    	jna	short chk_32khz_1
  5548 00002963 BB[74110000]            	mov	ebx, load_32khz_stereo_16_bit
  5549 00002968 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5550 0000296F 751A                    	jne	short chk_32khz_2
  5551 00002971 BB[07110000]            	mov	ebx, load_32khz_mono_16_bit
  5552 00002976 EB13                    	jmp	short chk_32khz_2
  5553                                  chk_32khz_1:
  5554 00002978 BB[6A100000]            	mov	ebx, load_32khz_stereo_8_bit
  5555 0000297D 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5556 00002984 7505                    	jne	short chk_32khz_2
  5557 00002986 BB[F70F0000]            	mov	ebx, load_32khz_mono_8_bit
  5558                                  chk_32khz_2:
  5559 0000298B B8DE060000              	mov	eax, 1758
  5560 00002990 BA03000000              	mov	edx, 3
  5561 00002995 B902000000              	mov	ecx, 2
  5562 0000299A EB62                    	jmp	short set_sizes
  5563                                  
  5564                                  vra_needed:
  5565 0000299C 58                      	pop	eax ; discard return address to the caller
  5566                                  vra_err:
  5567                                  	sys	_msg, msg_no_vra, 255, 0Fh
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 0000299D BB[23750000]        <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 000029A2 B9FF000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91 000029A7 BA0F000000          <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 000029AC B823000000          <1>  mov eax, %1
    96                              <1> 
    97 000029B1 CD40                <1>  int 40h
  5568 000029B3 E9FAD6FFFF              	jmp	Exit
  5569                                  
  5570                                  	;;;;
  5571                                  chk_12khz:
  5572 000029B8 663DE02E                	cmp	ax, 12000
  5573 000029BC 75DE                    	jne	short vra_needed
  5574 000029BE 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5575 000029C5 7615                    	jna	short chk_12khz_1
  5576 000029C7 BB[30190000]            	mov	ebx, load_12khz_stereo_16_bit
  5577 000029CC 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5578 000029D3 751A                    	jne	short chk_12khz_2
  5579 000029D5 BB[E1180000]            	mov	ebx, load_12khz_mono_16_bit
  5580 000029DA EB13                    	jmp	short chk_12khz_2
  5581                                  chk_12khz_1:
  5582 000029DC BB[8B180000]            	mov	ebx, load_12khz_stereo_8_bit
  5583 000029E1 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5584 000029E8 7505                    	jne	short chk_12khz_2
  5585 000029EA BB[43180000]            	mov	ebx, load_12khz_mono_8_bit
  5586                                  chk_12khz_2:
  5587 000029EF B893020000              	mov	eax, 659
  5588 000029F4 BA04000000              	mov	edx, 4
  5589 000029F9 B901000000              	mov	ecx, 1
  5590                                  	;jmp	short set_sizes
  5591                                  	;;;;
  5592                                  
  5593                                  ;-----------------------------------------------------------------------------
  5594                                  
  5595                                  set_sizes:
  5596 000029FE 803D[5E770000]01        	cmp	byte [WAVE_NumChannels], 1
  5597 00002A05 7402                    	je	short ss_1
  5598 00002A07 D1E0                    	shl	eax, 1
  5599                                  ss_1:
  5600 00002A09 803D[6A770000]08        	cmp	byte [WAVE_BitsPerSample], 8
  5601 00002A10 7602                    	jna	short ss_2
  5602                                  	; 16 bit samples
  5603 00002A12 D1E0                    	shl	eax, 1
  5604                                  ss_2:
  5605 00002A14 A3[E4810000]            	mov	[loadsize], eax
  5606 00002A19 F7E2                    	mul	edx
  5607                                  
  5608 00002A1B 83F901                  	cmp	ecx, 1
  5609 00002A1E 7402                    	je	short ss_3
  5610                                  
  5611 00002A20 F7F1                    	div	ecx
  5612                                  ss_3:	
  5613                                  	;;;
  5614                                  	; eax = byte count of (to be) converted samples 
  5615                                  	;;;
  5616 00002A22 8A0D[C8770000]          	mov	cl, [fbs_shift]
  5617                                  
  5618 00002A28 D3E0                    	shl	eax, cl
  5619                                  		; *1 for 16 bit stereo
  5620                                  		; *2 for 16 bit mono or 8 bit stereo
  5621                                  		; *4 for for 8 bit mono
  5622                                  	;;;
  5623                                  
  5624                                  	; eax = 16 bit stereo byte count (target buffer size)
  5625                                  	
  5626 00002A2A D1E8                    	shr	eax, 1	; buffer size is 16 bit sample count
  5627 00002A2C A3[E8810000]            	mov	[buffersize], eax  ; **
  5628 00002A31 891D[E0810000]          	mov	[loadfromwavfile], ebx
  5629                                  
  5630 00002A37 C3                      	retn
  5631                                  
  5632                                  ;-----------------------------------------------------------------------------
  5633                                  ;-----------------------------------------------------------------------------
  5634                                  
  5635                                  	; 10/02/2025
  5636                                  	; 05/02/2025 - ac97play.s
  5637                                  
  5638                                  ac97_init_play:
  5639                                  
  5640                                  _PlayNow:
  5641                                  	; create Buffer Descriptor List
  5642                                  
  5643                                  	;  Generic Form of Buffer Descriptor
  5644                                  	;  ---------------------------------
  5645                                  	;  63   62    61-48    47-32   31-0
  5646                                  	;  ---  ---  --------  ------- -----
  5647                                  	;  IOC  BUP -reserved- Buffer  Buffer
  5648                                  	;		      Length   Pointer
  5649                                  	;		      [15:0]   [31:0]
  5650                                  
  5651 00002A38 8B1D[FC810000]          	mov	ebx, [_bdl_buffer] ; BDL_BUFFER physical address
  5652                                  
  5653 00002A3E 81C300100000            	add	ebx, 4096	; WAVBUFFER_1 physical address
  5654                                  
  5655 00002A44 BF[00900000]            	mov	edi, BDL_BUFFER
  5656 00002A49 B910000000              	mov	ecx, 16
  5657                                  _0:
  5658                                  	;mov	eax, WAV_BUFFER_1
  5659 00002A4E 89D8                    	mov	eax, ebx	; WAVBUFFER_1 physical address
  5660 00002A50 AB                      	stosd
  5661                                  
  5662 00002A51 A1[E8810000]            	mov	eax, [buffersize]
  5663                                  	;shr	eax, 1 ; buffer size in word
  5664 00002A56 0D00000040              	or	eax, BUP	; tuneloop (without interrupt)
  5665 00002A5B AB                      	stosd
  5666                                  
  5667                                  	;mov	eax, WAV_BUFFER_2
  5668 00002A5C 89D8                    	mov	eax, ebx
  5669 00002A5E 0500300000              	add	eax, 12288	; WAVBUFFER_2 physical address
  5670 00002A63 AB                      	stosd
  5671                                  
  5672 00002A64 A1[E8810000]            	mov	eax, [buffersize]
  5673                                  	; 02/12/2024
  5674                                  	;shr	eax, 1 ; buffer size in word
  5675 00002A69 0D00000040              	or	eax, BUP	; tuneloop (without interrupt)
  5676 00002A6E AB                      	stosd
  5677                                  
  5678 00002A6F E2DD                    	loop	_0
  5679                                  	
  5680                                  ac97_RePlayWav:
  5681 00002A71 BF[00A00000]                    mov     edi, WAV_BUFFER_1
  5682 00002A76 893D[F8810000]          	mov	[audio_buffer], edi
  5683 00002A7C FF15[E0810000]          	call	dword [loadfromwavfile]
  5684                                  
  5685 00002A82 A1[EC810000]            	mov	eax, [count]
  5686 00002A87 0105[F0810000]          	add	[LoadedDataBytes], eax
  5687                                  
  5688 00002A8D BF[00D00000]            	mov     edi, WAV_BUFFER_2
  5689 00002A92 893D[F8810000]          	mov	[audio_buffer], edi
  5690 00002A98 FF15[E0810000]          	call	dword [loadfromwavfile]
  5691                                  
  5692 00002A9E A1[EC810000]            	mov	eax, [count]
  5693 00002AA3 0105[F0810000]          	add	[LoadedDataBytes], eax
  5694                                  
  5695                                  	; write NABMBAR+10h with offset of buffer descriptor list
  5696                                  
  5697                                  	;mov	eax, [_bdl_buffer]
  5698 00002AA9 8B1D[FC810000]          	mov	ebx, [_bdl_buffer]	; BDL_BUFFER physical address
  5699                                  	
  5700 00002AAF 668B15[D4770000]        	mov	dx, [NABMBAR]
  5701 00002AB6 6683C210                	add	dx, PO_BDBAR_REG	; set pointer to BDL
  5702                                  	;out	dx, eax			; write to AC97 controller
  5703                                  	;mov	ebx, eax ; data, dword
  5704                                  	; ebx = [_bdl_buffer] ; data, dword
  5705 00002ABA B405                    	mov	ah, 5	; write port dword
  5706 00002ABC CD34                    	int	34h
  5707                                  
  5708                                  	;call	delay1_4ms
  5709                                  
  5710 00002ABE B01F                    	mov	al, 31
  5711 00002AC0 E8FC000000              	call	setLastValidIndex
  5712                                  
  5713                                  	;call	delay1_4ms
  5714                                  
  5715                                  	;mov	al, [volume]
  5716 00002AC5 E8C4DAFFFF              	call	SetPCMOutVolume
  5717                                  
  5718 00002ACA 668B15[D4770000]        	mov	dx, [NABMBAR]
  5719 00002AD1 6683C21B                        add	dx, PO_CR_REG		; PCM out Control Register
  5720                                  	;mov	al, IOCE + RPBM		; Enable 'Interrupt On Completion' + run
  5721                                  	;				; (LVBI interrupt will not be enabled)
  5722                                  	; (TUNELOOP version, without interrupt)
  5723 00002AD5 B001                    	mov	al, RPBM
  5724                                  	;out	dx, al			; Start bus master operation.
  5725                                  	; al = data, byte
  5726 00002AD7 B401                    	mov	ah, 1 ; write port, byte
  5727 00002AD9 CD34                    	int	34h
  5728                                  
  5729                                  	;call	delay1_4ms
  5730                                  
  5731 00002ADB C3                      	retn
  5732                                  
  5733                                  ;-----------------------------------------------------------------------------
  5734                                  ;-----------------------------------------------------------------------------
  5735                                  
  5736                                  	; 10/02/2025
  5737                                  	; 06/02/2025 - twavplay.asm
  5738                                  	; Ref: TRDOS 386 v2.0.9, audio.s, Erdogan Tan, 06/06/2024
  5739                                  
  5740                                  audio_stop:
  5741 00002ADC 803D[D6770000]01        	cmp	byte [audio_hardware], 1
  5742 00002AE3 7705                    	ja	short ac97_stop
  5743 00002AE5 E904F9FFFF              	jmp	sb16_stop
  5744                                  
  5745                                  ;-----------------------------------------------------------------------------
  5746                                  
  5747                                  ac97_stop:
  5748 00002AEA C605[D9770000]02        	mov	byte [stopped], 2
  5749                                  
  5750                                  ac97_po_cmd@:
  5751 00002AF1 30C0                    	xor	al, al ; 0
  5752                                  ac97_po_cmd:
  5753 00002AF3 668B15[D4770000]        	mov     dx, [NABMBAR]
  5754 00002AFA 6683C21B                        add     dx, PO_CR_REG	; PCM out control register
  5755                                  	;out	dx, al
  5756 00002AFE B401                    	mov	ah, 1 ; write port, byte
  5757 00002B00 CD34                    	int	34h
  5758 00002B02 C3                      	retn
  5759                                  
  5760                                  ;-----------------------------------------------------------------------------
  5761                                  ;-----------------------------------------------------------------------------
  5762                                  
  5763                                  	; 10/02/2025
  5764                                  audio_pause:
  5765 00002B03 803D[D6770000]01        	cmp	byte [audio_hardware], 1
  5766 00002B0A 7705                    	ja	short ac97_pause
  5767 00002B0C E94BF9FFFF              	jmp	sb16_pause
  5768                                  
  5769                                  ;-----------------------------------------------------------------------------
  5770                                  
  5771                                  ac97_pause:
  5772 00002B11 C605[D9770000]01        	mov	byte [stopped], 1 ; paused
  5773                                  	;mov	al, 0
  5774                                  	;jmp	short ac97_po_cmd
  5775 00002B18 EBD7                    	jmp	short ac97_po_cmd@
  5776                                  
  5777                                  ;-----------------------------------------------------------------------------
  5778                                  ;-----------------------------------------------------------------------------
  5779                                  
  5780                                  	; 10/02/2025
  5781                                  audio_play:
  5782 00002B1A 803D[D6770000]01        	cmp	byte [audio_hardware], 1
  5783 00002B21 7705                    	ja	short ac97_play
  5784 00002B23 E963F9FFFF              	jmp	sb16_play
  5785                                  
  5786                                  ;-----------------------------------------------------------------------------
  5787                                  
  5788                                  ac97_play: ; continue to play (after pause)
  5789 00002B28 C605[D9770000]00        	mov	byte [stopped], 0
  5790 00002B2F B001                    	mov	al, RPBM
  5791 00002B31 EBC0                    	jmp	short ac97_po_cmd
  5792                                  
  5793                                  ;-----------------------------------------------------------------------------
  5794                                  ;-----------------------------------------------------------------------------
  5795                                  
  5796                                  PORTB		EQU 061h
  5797                                  REFRESH_STATUS	EQU 010h	; Refresh signal status
  5798                                  
  5799                                  	; 10/02/2025
  5800                                  	; 05/02/2025 - ac97play.s
  5801                                  delay_100ms:
  5802 00002B33 51                      	push	ecx
  5803 00002B34 B990010000              	mov	ecx, 400  ; 400*0.25ms
  5804                                  _delay_x_ms:
  5805 00002B39 E804000000              	call	delay1_4ms
  5806 00002B3E E2F9                            loop	_delay_x_ms
  5807 00002B40 59                      	pop	ecx
  5808 00002B41 C3                      	retn
  5809                                  
  5810                                  ;-----------------------------------------------------------------------------
  5811                                  
  5812                                  	; 10/02/2025
  5813                                  delay1_4ms:
  5814 00002B42 50                              push    eax
  5815 00002B43 51                              push    ecx
  5816 00002B44 53                      	push	ebx
  5817 00002B45 52                      	push	edx
  5818 00002B46 B910000000                      mov     ecx, 16		; close enough.
  5819                                  	;in	al, PORTB
  5820 00002B4B 66BA6100                	mov	dx, PORTB
  5821 00002B4F B400                    	mov	ah, 0  ; read port, byte
  5822 00002B51 CD34                    	int	34h
  5823                                  
  5824 00002B53 2410                    	and	al, REFRESH_STATUS
  5825                                  	;mov	ah, al		; Start toggle state
  5826 00002B55 88C3                    	mov	bl, al
  5827 00002B57 09C9                    	or	ecx, ecx
  5828 00002B59 7401                    	jz	short _d4ms1
  5829 00002B5B 41                      	inc	ecx		; Throwaway first toggle
  5830                                  _d4ms1:	
  5831                                  	;in	al, PORTB	; Read system control port
  5832 00002B5C 66BA6100                	mov	dx, PORTB
  5833 00002B60 B400                    	mov	ah, 0  ; read port, byte
  5834 00002B62 CD34                    	int	34h
  5835                                  
  5836 00002B64 2410                    	and	al, REFRESH_STATUS ; Refresh toggles 15.085 microseconds
  5837                                  	;cmp	ah, al
  5838 00002B66 38C3                    	cmp	bl, al
  5839 00002B68 74F2                    	je	short _d4ms1	; Wait for state change
  5840                                  
  5841                                  	;mov	ah, al		; Update with new state
  5842 00002B6A 88C3                    	mov	bl, al
  5843 00002B6C 49                      	dec	ecx
  5844 00002B6D 75ED                    	jnz	short _d4ms1
  5845                                  
  5846 00002B6F 5A                      	pop	edx
  5847 00002B70 5B                              pop	ebx
  5848 00002B71 59                      	pop	ecx
  5849 00002B72 58                              pop	eax
  5850                                  
  5851 00002B73 C3                              retn
  5852                                  
  5853                                  ;-----------------------------------------------------------------------------
  5854                                  
  5855                                  	; 10/02/2025
  5856                                  	; 05/02/2025 - ac97play.s
  5857                                  
  5858                                  ; returns AL = current index value
  5859                                  getCurrentIndex:
  5860 00002B74 668B15[D4770000]        	mov	dx, [NABMBAR]
  5861 00002B7B 6683C214                	add	dx, PO_CIV_REG
  5862                                  	;in	al, dx
  5863 00002B7F B400                    	mov	ah, 0 ; read port, byte
  5864 00002B81 CD34                    	int	34h
  5865                                  uLVI2:
  5866 00002B83 C3                      	retn
  5867                                  
  5868                                  ;-----------------------------------------------------------------------------
  5869                                  
  5870                                  	; 10/02/2025
  5871                                  	; 05/02/2025 - ac97play.s
  5872                                  
  5873                                  updateLVI:
  5874 00002B84 668B15[D4770000]        	mov	dx, [NABMBAR]
  5875 00002B8B 6683C214                	add	dx, PO_CIV_REG
  5876                                  	; (Current Index Value and Last Valid Index value)
  5877                                  	;in	ax, dx
  5878 00002B8F B402                    	mov	ah, 2 ; read port, word
  5879 00002B91 CD34                    	int	34h
  5880                                  
  5881 00002B93 38E0                    	cmp	al, ah ; is current index = last index ?
  5882 00002B95 75EC                    	jne	short uLVI2
  5883                                  
  5884 00002B97 E8D8FFFFFF              	call	getCurrentIndex
  5885                                   
  5886 00002B9C F605[C9770000]01        	test	byte [flags], ENDOFFILE
  5887                                  	;jnz	short uLVI1
  5888 00002BA3 7418                    	jz	short uLVI0  ; 08/11/2023
  5889                                  
  5890 00002BA5 50                      	push	eax
  5891 00002BA6 668B15[D4770000]        	mov	dx, [NABMBAR]
  5892 00002BAD 6683C216                	add	dx, PO_SR_REG  ; PCM out status register
  5893                                  	;in	ax, dx
  5894 00002BB1 B402                    	mov	ah, 2 ; read port, word
  5895 00002BB3 CD34                    	int	34h
  5896                                  
  5897 00002BB5 A803                    	test	al, 3 ; bit 1 = Current Equals Last Valid (CELV)
  5898                                  		      ; (has been processed)
  5899                                  		      ; bit 0 = 1 -> DMA Controller Halted (DCH)
  5900 00002BB7 58                      	pop	eax
  5901 00002BB8 7407                    	jz	short uLVI1
  5902                                  uLVI3:
  5903 00002BBA 31C0                    	xor	eax, eax
  5904                                  	; zf = 1
  5905 00002BBC C3                      	retn
  5906                                  uLVI0:
  5907                                          ; not at the end of the file yet.
  5908 00002BBD FEC8                    	dec	al
  5909 00002BBF 241F                    	and	al, 1Fh
  5910                                  uLVI1:
  5911                                  	;call	setLastValidIndex
  5912                                  ;uLVI2:
  5913                                  	;retn
  5914                                  
  5915                                  ;-----------------------------------------------------------------------------
  5916                                  
  5917                                  	; 10/02/2025
  5918                                  	; 05/02/2025 - ac97play.s
  5919                                  
  5920                                  ;input AL = index # to stop on
  5921                                  setLastValidIndex:
  5922 00002BC1 668B15[D4770000]        	mov	dx, [NABMBAR]
  5923 00002BC8 6683C215                	add	dx, PO_LVI_REG
  5924                                          ;out	dx, al
  5925                                  	; al = data, byte
  5926 00002BCC B401                    	mov	ah, 1 ; write port, byte
  5927 00002BCE CD34                    	int	34h
  5928 00002BD0 C3                      	retn
  5929                                  
  5930                                  ;=============================================================================
  5931                                  ;	Detect (& Enable) Audio Device
  5932                                  ;=============================================================================
  5933                                  
  5934                                  	; 10/02/2025
  5935                                  
  5936                                  detect_audio_device:
  5937                                  
  5938                                  	; check for SB16 at first
  5939 00002BD1 E8EA010000              	call	DetectSB16
  5940 00002BD6 730D                    	jnc	short detected
  5941                                  	
  5942 00002BD8 E80F000000              	call	DetectAC97
  5943 00002BDD 720C                    	jc	short not_detected
  5944                                  
  5945 00002BDF FE05[D6770000]          	inc	byte [audio_hardware] ; 2 = AC'97
  5946                                  detected:
  5947 00002BE5 FE05[D6770000]          	inc	byte [audio_hardware] ; 1 = SB16
  5948                                  	
  5949                                  not_detected:			      ; 0 = none
  5950 00002BEB C3                      	retn
  5951                                  
  5952                                  ;=============================================================================
  5953                                  ;	Detect AC'97 Hardware
  5954                                  ;=============================================================================
  5955                                  
  5956                                  	; 10/02/2025
  5957                                  	; 05/02/2025 - ac97play.s
  5958                                  
  5959                                  DetectAC97:
  5960                                  DetectICH:
  5961 00002BEC BE[682D0000]            	mov	esi, valid_ids	; address of Valid ICH (AC97) Device IDs
  5962 00002BF1 B915000000              	mov	ecx, valid_id_count
  5963                                  pfd_1:
  5964 00002BF6 AD                      	lodsd
  5965 00002BF7 E840000000              	call	pciFindDevice
  5966 00002BFC 7303                    	jnc	short d_ac97_1
  5967 00002BFE E2F6                    	loop	pfd_1
  5968                                  
  5969                                  	;stc
  5970 00002C00 C3                      	retn
  5971                                  
  5972                                  d_ac97_1:
  5973                                  	; eax = BUS/DEV/FN
  5974                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  5975                                  	; edx = DEV/VENDOR
  5976                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  5977                                  
  5978 00002C01 A3[CE770000]            	mov	[bus_dev_fn], eax
  5979 00002C06 8915[CA770000]          	mov	[dev_vendor], edx
  5980                                  
  5981                                  	; get ICH base address regs for mixer and bus master
  5982                                  
  5983 00002C0C B010                            mov     al, NAMBAR_REG
  5984 00002C0E E8B7000000                      call    pciRegRead16		; read PCI registers 10-11
  5985                                          ;and    dx, IO_ADDR_MASK 	; mask off BIT0
  5986 00002C13 80E2FE                  	and	dl, 0FEh
  5987                                  
  5988 00002C16 668915[D2770000]                mov     [NAMBAR], dx		; save audio mixer base addr
  5989                                  
  5990 00002C1D B014                    	mov     al, NABMBAR_REG
  5991 00002C1F E8A6000000                      call    pciRegRead16
  5992                                          ;and    dx, IO_ADDR_MASK
  5993 00002C24 80E2C0                  	and	dl, 0C0h
  5994                                  
  5995 00002C27 668915[D4770000]                mov     [NABMBAR], dx		; save bus master base addr
  5996                                  
  5997 00002C2E B03C                    	mov	al, AC97_INT_LINE ; Interrupt line register (3Ch)
  5998 00002C30 E88E000000              	call	pciRegRead8
  5999                                  	
  6000 00002C35 8815[C6770000]          	mov	[ac97_int_ln_reg], dl
  6001                                  
  6002                                  	;clc
  6003                                  
  6004 00002C3B C3                      	retn
  6005                                  
  6006                                  ;-----------------------------------------------------------------------------
  6007                                  ;
  6008                                  ;-----------------------------------------------------------------------------
  6009                                  
  6010                                  	; 10/02/2025
  6011                                  	; 05/02/2025 - ac97play.s
  6012                                  
  6013                                  ; --------------------------------------------------------
  6014                                  ; Ref: 27/05/2024 - (TRDOS 386 Kernel) audio.s
  6015                                  ; --------------------------------------------------------
  6016                                  
  6017                                  NOT_PCI32_PCI16	EQU 03FFFFFFFh ; NOT BIT31+BIT30
  6018                                  NOT_BIT31 EQU 7FFFFFFFh
  6019                                  
  6020                                  pciFindDevice:
  6021                                  	; scan through PCI space looking for a device+vendor ID
  6022                                  	;
  6023                                  	; Entry: EAX=Device+Vendor ID
  6024                                  	;
  6025                                  	; Exit: EAX=PCI address if device found
  6026                                  	;	EDX=Device+Vendor ID
  6027                                  	;       CY clear if found, set if not found. EAX invalid if CY set.
  6028                                  	;
  6029                                  	; Destroys: ebx, edi
  6030                                  
  6031                                  
  6032 00002C3C 89C3                    	mov	ebx, eax
  6033 00002C3E BF00000080              	mov	edi, 80000000h
  6034                                  nextPCIdevice:
  6035 00002C43 89F8                    	mov 	eax, edi	; read PCI registers
  6036 00002C45 E88C000000              	call	pciRegRead32
  6037                                  
  6038 00002C4A 39DA                    	cmp	edx, ebx
  6039 00002C4C 7412                    	je	short PCIScanExit ; found
  6040                                  
  6041 00002C4E 81FF00F8FF80            	cmp	edi, 80FFF800h
  6042 00002C54 7308                    	jnb	short pfd_nf	; not found
  6043 00002C56 81C700010000            	add	edi, 100h
  6044 00002C5C EBE5                    	jmp	short nextPCIdevice
  6045                                  pfd_nf:
  6046 00002C5E F9                      	stc
  6047 00002C5F C3                      	retn
  6048                                  PCIScanExit:
  6049                                  	;pushf
  6050 00002C60 B8FFFFFF7F              	mov	eax, NOT_BIT31
  6051 00002C65 21F8                    	and	eax, edi	; return only bus/dev/fn #
  6052 00002C67 C3                      	retn
  6053                                  
  6054                                  ;-----------------------------------------------------------------------------
  6055                                  
  6056                                  	; 10/02/2025
  6057                                  pciRegRead:
  6058                                  	; 8/16/32bit PCI reader
  6059                                  	;
  6060                                  	; Entry: EAX=PCI Bus/Device/fn/register number
  6061                                  	;           BIT30 set if 32 bit access requested
  6062                                  	;           BIT29 set if 16 bit access requested
  6063                                  	;           otherwise defaults to 8 bit read
  6064                                  	;
  6065                                  	; Exit:  DL,DX,EDX register data depending on requested read size
  6066                                  	;
  6067                                  	; Note1: this routine is meant to be called via pciRegRead8,
  6068                                  	;	 pciRegread16 or pciRegRead32, listed below.
  6069                                  	;
  6070                                  	; Note2: don't attempt to read 32 bits of data from a non dword
  6071                                  	;	 aligned reg number. Likewise, don't do 16 bit reads from
  6072                                  	;	 non word aligned reg #
  6073                                  	
  6074 00002C68 53                      	push	ebx
  6075 00002C69 51                      	push	ecx
  6076 00002C6A 89C3                    	mov	ebx, eax		; save eax, dh
  6077 00002C6C 88F1                    	mov     cl, dh
  6078                                  
  6079 00002C6E 25FFFFFF3F              	and     eax, NOT_PCI32_PCI16	; clear out data size request
  6080 00002C73 0D00000080              	or      eax, BIT31		; make a PCI access request
  6081                                  	; (FASM)
  6082                                  	;and	al, NOT 3 ; 0FCh
  6083                                  	; (NASM)
  6084 00002C78 24FC                    	and	al, ~3 ; 0FCh		; force index to be dword
  6085                                  
  6086 00002C7A 66BAF80C                        mov     dx, PCI_INDEX_PORT
  6087                                          ;out	dx, eax			; write PCI selector
  6088 00002C7E 53                      	push	ebx
  6089 00002C7F 89C3                    	mov	ebx, eax ; data, dword
  6090 00002C81 B405                    	mov	ah, 5 ; write port, dword
  6091                                  	; dx = port number
  6092 00002C83 CD34                    	int	34h
  6093 00002C85 5B                      	pop	ebx
  6094                                  	
  6095 00002C86 66BAFC0C                        mov     dx, PCI_DATA_PORT
  6096 00002C8A 88D8                            mov     al, bl
  6097 00002C8C 2403                            and     al, 3			; figure out which port to
  6098 00002C8E 00C2                            add     dl, al			; read to
  6099                                  
  6100 00002C90 F7C3000000C0            	test    ebx, PCI32+PCI16
  6101 00002C96 750A                            jnz     short _pregr0
  6102                                  
  6103                                  	;in	al, dx			; return 8 bits of data
  6104 00002C98 B400                    	mov	ah, 0 ; read port, byte
  6105                                  	; dx = port number
  6106 00002C9A CD34                    	int	34h
  6107                                          
  6108 00002C9C 88C2                    	mov	dl, al
  6109 00002C9E 88CE                    	mov     dh, cl			; restore dh for 8 bit read
  6110 00002CA0 EB17                    	jmp	short _pregr2
  6111                                  _pregr0:	
  6112 00002CA2 F7C300000080            	test    ebx, PCI32
  6113 00002CA8 7509                            jnz	short _pregr1
  6114                                  
  6115                                  	;in	ax, dx
  6116 00002CAA B402                    	mov	ah, 2 ; read port, word
  6117                                  	; dx = port number
  6118 00002CAC CD34                    	int	34h
  6119                                  
  6120 00002CAE 6689C2                  	mov     dx, ax			; return 16 bits of data
  6121 00002CB1 EB06                    	jmp	short _pregr2
  6122                                  _pregr1:
  6123                                  	;in	eax, dx			; return 32 bits of data
  6124 00002CB3 B404                    	mov	ah, 4 ; read port, dword
  6125                                  	; dx = port number
  6126 00002CB5 CD34                    	int	34h
  6127                                  
  6128 00002CB7 89C2                    	mov	edx, eax
  6129                                  _pregr2:
  6130 00002CB9 89D8                    	mov     eax, ebx		; restore eax
  6131 00002CBB 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; clear out data size request
  6132 00002CC0 59                      	pop	ecx
  6133 00002CC1 5B                      	pop	ebx
  6134 00002CC2 C3                      	retn
  6135                                  
  6136                                  pciRegRead8:
  6137 00002CC3 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; set up 8 bit read size
  6138 00002CC8 EB9E                            jmp     short pciRegRead	; call generic PCI access
  6139                                  
  6140                                  pciRegRead16:
  6141 00002CCA 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; set up 16 bit read size
  6142 00002CCF 0D00000040                      or      eax, PCI16		; call generic PCI access
  6143 00002CD4 EB92                            jmp     short pciRegRead
  6144                                  
  6145                                  pciRegRead32:
  6146 00002CD6 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; set up 32 bit read size
  6147 00002CDB 0D00000080                      or      eax, PCI32		; call generic PCI access
  6148 00002CE0 EB86                            jmp     pciRegRead
  6149                                  
  6150                                  ;-----------------------------------------------------------------------------
  6151                                  
  6152                                  	; 10/02/2025
  6153                                  pciRegWrite:
  6154                                  	; 8/16/32bit PCI writer
  6155                                  	;
  6156                                  	; Entry: EAX=PCI Bus/Device/fn/register number
  6157                                  	;           BIT31 set if 32 bit access requested
  6158                                  	;           BIT30 set if 16 bit access requested
  6159                                  	;           otherwise defaults to 8bit read
  6160                                  	;        DL/DX/EDX data to write depending on size
  6161                                  	;
  6162                                  	; Note1: this routine is meant to be called via pciRegWrite8,
  6163                                  	;	 pciRegWrite16 or pciRegWrite32 as detailed below.
  6164                                  	;
  6165                                  	; Note2: don't attempt to write 32bits of data from a non dword
  6166                                  	;	 aligned reg number. Likewise, don't do 16 bit writes from
  6167                                  	;	 non word aligned reg #
  6168                                  
  6169 00002CE2 53                      	push	ebx
  6170 00002CE3 51                      	push	ecx
  6171 00002CE4 89C3                            mov     ebx, eax		; save eax, edx
  6172 00002CE6 89D1                            mov     ecx, edx
  6173 00002CE8 25FFFFFF3F              	and     eax, NOT_PCI32_PCI16	; clear out data size request
  6174 00002CED 0D00000080                      or      eax, BIT31		; make a PCI access request
  6175                                  	; (FASM)
  6176                                  	;and	al, NOT 3 ; 0FCh
  6177                                  	; (NASM)
  6178 00002CF2 24FC                    	and	al, ~3 ; 0FCh		; force index to be dword
  6179                                  
  6180 00002CF4 66BAF80C                        mov     dx, PCI_INDEX_PORT
  6181                                  	;out	dx, eax			; write PCI selector
  6182 00002CF8 53                      	push	ebx
  6183 00002CF9 89C3                    	mov	ebx, eax ; data, dword
  6184 00002CFB B405                    	mov	ah, 5 ; write port, dword
  6185                                  	; dx = port number
  6186 00002CFD CD34                    	int	34h
  6187 00002CFF 5B                      	pop	ebx
  6188                                  	
  6189 00002D00 66BAFC0C                        mov     dx, PCI_DATA_PORT
  6190 00002D04 88D8                            mov     al, bl
  6191 00002D06 2403                            and     al, 3			; figure out which port to
  6192 00002D08 00C2                            add     dl, al			; write to
  6193                                  
  6194 00002D0A F7C3000000C0            	test    ebx, PCI32+PCI16
  6195 00002D10 7508                            jnz     short _pregw0
  6196 00002D12 88C8                    	mov	al, cl 			; put data into al
  6197                                  	;out	dx, al
  6198                                  	; al = data, byte
  6199 00002D14 B401                    	mov	ah, 1 ; write port, byte
  6200                                  	; dx = port number
  6201 00002D16 CD34                    	int	34h
  6202                                  
  6203 00002D18 EB1F                    	jmp	short _pregw2
  6204                                  _pregw0:
  6205 00002D1A F7C300000080            	test    ebx, PCI32
  6206 00002D20 750D                            jnz     short _pregw1
  6207 00002D22 6689C8                  	mov	ax, cx			; put data into ax
  6208                                  	;out	dx, ax
  6209 00002D25 53                      	push	ebx
  6210 00002D26 89C3                    	mov	ebx, eax ; data, word
  6211 00002D28 B403                    	mov	ah, 3 ; write port, word
  6212                                  	; dx = port number
  6213 00002D2A CD34                    	int	34h
  6214 00002D2C 5B                      	pop	ebx
  6215                                  
  6216 00002D2D EB0A                    	jmp	short _pregw2
  6217                                  _pregw1:
  6218 00002D2F 89C8                    	mov	eax, ecx		; put data into eax
  6219                                  	;out	dx, eax
  6220 00002D31 53                      	push	ebx
  6221 00002D32 89C3                    	mov	ebx, eax ; data, dword
  6222 00002D34 B405                    	mov	ah, 5 ; write port, dword
  6223                                  	; dx = port number
  6224 00002D36 CD34                    	int	34h
  6225 00002D38 5B                      	pop	ebx
  6226                                  _pregw2:
  6227 00002D39 89D8                            mov     eax, ebx		; restore eax
  6228 00002D3B 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; clear out data size request
  6229 00002D40 89CA                            mov     edx, ecx		; restore dx
  6230 00002D42 59                      	pop	ecx
  6231 00002D43 5B                      	pop	ebx
  6232 00002D44 C3                      	retn
  6233                                  
  6234                                  pciRegWrite8:
  6235 00002D45 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; set up 8 bit write size
  6236 00002D4A EB96                            jmp	short pciRegWrite	; call generic PCI access
  6237                                  
  6238                                  pciRegWrite16:
  6239 00002D4C 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; set up 16 bit write size
  6240 00002D51 0D00000040                      or      eax, PCI16		; call generic PCI access
  6241 00002D56 EB8A                            jmp	short pciRegWrite
  6242                                  
  6243                                  pciRegWrite32:
  6244 00002D58 25FFFFFF3F                      and     eax, NOT_PCI32_PCI16	; set up 32 bit write size
  6245 00002D5D 0D00000080                      or      eax, PCI32		; call generic PCI access
  6246 00002D62 E97BFFFFFF                      jmp	pciRegWrite
  6247                                  
  6248                                  ;-----------------------------------------------------------------------------
  6249                                  ; ac97.inc (11/11/2023)
  6250                                  ;-----------------------------------------------------------------------------
  6251                                  
  6252                                  ; 10/02/2025
  6253                                  ; 07/02/2025 - twavplay.asm
  6254                                  ; 05/02/2025 - cgaplay.s
  6255                                  
  6256                                  ; special characters
  6257                                  LF      EQU 10
  6258                                  CR      EQU 13
  6259                                  
  6260                                  ; PCI stuff
  6261                                  
  6262                                  BIT0  EQU 1
  6263                                  BIT1  EQU 2
  6264                                  BIT2  EQU 4
  6265                                  BIT8  EQU 100h
  6266                                  BIT9  EQU 200h
  6267                                  BIT28 EQU 10000000h
  6268                                  BIT30 EQU 40000000h
  6269                                  BIT31 EQU 80000000h
  6270                                  
  6271                                  BUP		equ	BIT30		; Buffer Underrun Policy.
  6272                                  					; if this buffer is the last buffer
  6273                                  					; in a playback, fill the remaining
  6274                                  					; samples with 0 (silence) or not.
  6275                                  					; It's a good idea to set this to 1
  6276                                  					; for the last buffer in playback,
  6277                                  					; otherwise you're likely to get a lot
  6278                                  					; of noise at the end of the sound.
  6279                                  
  6280                                  RR		equ	BIT1		; reset registers. Nukes all regs
  6281                                                                          ; except bits 4:2 of this register.
  6282                                                                          ; Only set this bit if BIT 0 is 0
  6283                                  RPBM		equ	BIT0		; Run/Pause
  6284                                  					; set this bit to start the codec!
  6285                                  IO_ENA		EQU	BIT0		; i/o decode enable
  6286                                  BM_ENA		EQU	BIT2		; bus master enable
  6287                                  
  6288                                  PCI_INDEX_PORT  EQU     0CF8h
  6289                                  PCI_DATA_PORT   EQU     0CFCh
  6290                                  PCI32           EQU     BIT31           ; bitflag to signal 32bit access
  6291                                  PCI16           EQU     BIT30           ; bitflag for 16bit access
  6292                                  
  6293                                  AC97_INT_LINE	equ	3Ch		; AC97 Interrupt Line register offset
  6294                                  
  6295                                  ; Intel ICH2 equates. It is assumed that ICH0 and plain ole ICH are compatible.
  6296                                  
  6297                                  INTEL_VID       equ     8086h           ; Intel's PCI vendor ID
  6298                                  ; 03/11/2023 - Erdogan Tan (Ref: MenuetOS AC97 WAV Player source code, 2004)
  6299                                  SIS_VID		equ	1039h
  6300                                  NVIDIA_VID	equ	10DEh	 ; Ref: MPXPLAY/SBEMU/KOLIBRIOS AC97 source c.
  6301                                  AMD_VID		equ	1022h
  6302                                  
  6303                                  ICH_DID         equ     2415h           ; ICH device ID
  6304                                  ICH0_DID        equ     2425h           ; ICH0
  6305                                  ICH2_DID        equ     2445h           ; ICH2 I think there are more ICHes.
  6306                                                                          ; they all should be compatible.
  6307                                  
  6308                                  ; 17/02/2017 (Erdogan Tan, ref: ALSA Device IDs, ALSA project)
  6309                                  ICH3_DID	equ     2485h           ; ICH3
  6310                                  ICH4_DID        equ     24C5h           ; ICH4
  6311                                  ICH5_DID	equ     24D5h           ; ICH5
  6312                                  ICH6_DID	equ     266Eh           ; ICH6
  6313                                  ESB6300_DID	equ     25A6h           ; 6300ESB
  6314                                  ESB631X_DID	equ     2698h           ; 631XESB
  6315                                  ICH7_DID	equ	27DEh		; ICH7
  6316                                  ; 03/11/2023 - Erdogan Tan (Ref: MenuetOS AC97 WAV Player source code, 2004)
  6317                                  MX82440_DID	equ	7195h
  6318                                  SI7012_DID	equ	7012h
  6319                                  NFORCE_DID	equ	01B1h
  6320                                  NFORCE2_DID	equ	006Ah
  6321                                  AMD8111_DID	equ	746Dh
  6322                                  AMD768_DID	equ	7445h
  6323                                  ; 03/11/2023 - Erdogan Tan - Ref: MPXPLAY/SBEMU/KOLIBRIOS AC97 source code
  6324                                  CK804_DID	equ	0059h
  6325                                  MCP04_DID	equ	003Ah
  6326                                  CK8_DID		equ	008Ah
  6327                                  NFORCE3_DID	equ	00DAh
  6328                                  CK8S_DID	equ	00EAh
  6329                                  
  6330                                  NAMBAR_REG	equ	10h		; native audio mixer BAR
  6331                                  NABMBAR_REG	equ	14h		; native audio bus mastering BAR
  6332                                  
  6333                                  CODEC_MASTER_VOL_REG	equ	02h	; master volume
  6334                                  CODEC_MASTER_TONE_REG	equ	08h	; master tone (R+L)
  6335                                  CODEC_PCM_OUT_REG 	equ	18h     ; PCM output volume
  6336                                  CODEC_EXT_AUDIO_REG	equ	28h	; extended audio
  6337                                  CODEC_EXT_AUDIO_CTRL_REG equ	2Ah	; extended audio control
  6338                                  CODEC_PCM_FRONT_DACRATE_REG equ	2Ch	; PCM out sample rate
  6339                                  
  6340                                  ; ICH supports 3 different types of register sets for three types of things
  6341                                  ; it can do, thus:
  6342                                  ;
  6343                                  ; PCM in (for recording) aka PI
  6344                                  ; PCM out (for playback) aka PO
  6345                                  ; MIC in (for recording) aka MC
  6346                                  
  6347                                  PI_BDBAR_REG	equ	0		; PCM in buffer descriptor BAR
  6348                                  PO_BDBAR_REG	equ	10h		; PCM out buffer descriptor BAR
  6349                                  
  6350                                  GLOB_CNT_REG	equ	2Ch		; Global control register
  6351                                  GLOB_STS_REG 	equ	30h		; Global Status register (RO)
  6352                                  
  6353                                  PI_CR_REG 	equ	0Bh		; PCM in Control Register
  6354                                  PO_CR_REG	equ	1Bh		; PCM out Control Register
  6355                                  MC_CR_REG	equ	2Bh		; MIC in Control Register
  6356                                  
  6357                                  PCI_CMD_REG	EQU	04h		; reg 04h, command register
  6358                                  
  6359                                  CTRL_ST_CREADY		equ	BIT8+BIT9+BIT28 ; Primary Codec Ready
  6360                                  CODEC_REG_POWERDOWN	equ	26h
  6361                                  
  6362                                  PO_CIV_REG	equ	14h		; PCM out current Index value (RO)
  6363                                  PO_LVI_REG	equ	15h		; PCM out Last Valid Index
  6364                                  PO_SR_REG	equ	16h		; PCM out Status register
  6365                                  
  6366                                  BDL_SIZE	equ	32*8		; Buffer Descriptor List size
  6367                                  
  6368                                  ; 07/02/2025 - twavplay.asm
  6369                                  PO_PICB_REG	equ 18h	; PCM Out Position In Current Buffer Register
  6370                                  
  6371                                  ;-----------------------------------------------------------------------------
  6372                                  
  6373                                  ; 06/05/2025
  6374                                  
  6375                                  ; 22/12/2024
  6376 00002D67 90                      align 4
  6377                                  
  6378                                  ; 29/05/2024 (TRDOS 386)
  6379                                  ; 17/02/2017
  6380                                  ; Valid ICH device IDs
  6381                                  
  6382                                  valid_ids:
  6383                                  	;dd (ICH_DID shl 16) + INTEL_VID	; 8086h:2415h
  6384 00002D68 86801524                	dd (ICH_DID << 16) + INTEL_VID		; 8086h:2415h
  6385 00002D6C 86802524                	dd (ICH0_DID << 16) + INTEL_VID		; 8086h:2425h
  6386 00002D70 86804524                	dd (ICH2_DID << 16) + INTEL_VID		; 8086h:2445h
  6387 00002D74 86808524                	dd (ICH3_DID << 16) + INTEL_VID		; 8086h:2485h
  6388 00002D78 8680C524                	dd (ICH4_DID << 16) + INTEL_VID		; 8086h:24C5h
  6389 00002D7C 8680D524                	dd (ICH5_DID << 16) + INTEL_VID		; 8086h:24D5h
  6390 00002D80 86806E26                	dd (ICH6_DID << 16) + INTEL_VID		; 8086h:266Eh
  6391 00002D84 8680A625                	dd (ESB6300_DID << 16) + INTEL_VID	; 8086h:25A6h
  6392 00002D88 86809826                	dd (ESB631X_DID << 16) + INTEL_VID	; 8086h:2698h
  6393 00002D8C 8680DE27                	dd (ICH7_DID << 16) + INTEL_VID		; 8086h:27DEh
  6394                                  	; 03/11/2023 - Erdogan Tan
  6395 00002D90 86809571                	dd (MX82440_DID << 16) + INTEL_VID	; 8086h:7195h
  6396 00002D94 39101270                	dd (SI7012_DID << 16)  + SIS_VID	; 1039h:7012h
  6397 00002D98 DE10B101                	dd (NFORCE_DID << 16)  + NVIDIA_VID	; 10DEh:01B1h
  6398 00002D9C DE106A00                	dd (NFORCE2_DID << 16) + NVIDIA_VID	; 10DEh:006Ah
  6399 00002DA0 22106D74                	dd (AMD8111_DID << 16) + AMD_VID	; 1022h:746Dh
  6400 00002DA4 22104574                	dd (AMD768_DID << 16)  + AMD_VID	; 1022h:7445h
  6401 00002DA8 DE105900                	dd (CK804_DID << 16) + NVIDIA_VID	; 10DEh:0059h
  6402 00002DAC DE103A00                	dd (MCP04_DID << 16) + NVIDIA_VID	; 10DEh:003Ah
  6403 00002DB0 DE108A00                	dd (CK8_DID << 16) + NVIDIA_VID		; 1022h:008Ah
  6404 00002DB4 DE10DA00                	dd (NFORCE3_DID << 16) + NVIDIA_VID	; 10DEh:00DAh
  6405 00002DB8 DE10EA00                	dd (CK8S_DID << 16) + NVIDIA_VID	; 10DEh:00EAh
  6406                                  
  6407                                  valid_id_count equ (($ - valid_ids)>>2)	; 05/11/2023
  6408                                  
  6409 00002DBC 00000000                	dd 0
  6410                                  
  6411                                  ;=============================================================================
  6412                                  ;	Detect Sound Blaster 16 sound card (or compatible hardware)
  6413                                  ;=============================================================================
  6414                                  
  6415                                  	; 10/02/2025
  6416                                  	; 09/02/2025 - twavplay.asm
  6417                                  	; 20/10/2017 - playwav.s
  6418                                  
  6419                                  DetectSB16:
  6420                                  	; Ref: TRDOS 386 Kernel v2.0.9 audio.s (06/06/2024)
  6421                                  	;      DetectSB procedure (06/08/2022, v2.0.5)
  6422                                  ScanPort:
  6423 00002DC0 66BB1002                	mov	bx, 0210h	; start scanning ports
  6424                                  				; 210h, 220h, .. 260h
  6425                                  ResetDSP:
  6426 00002DC4 6689DA                  	mov	dx, bx		; try to reset the DSP.
  6427 00002DC7 80C206                  	add	dl, 06h
  6428                                  
  6429 00002DCA B001                    	mov	al, 1
  6430                                  	;out	dx, al
  6431 00002DCC B401                    	mov	ah, 1 ; outb
  6432 00002DCE CD34                    	int	34h
  6433                                  
  6434                                  	;in	al, dx
  6435                                  	;in	al, dx
  6436                                  	;in	al, dx
  6437                                  	;in	al, dx
  6438                                  
  6439 00002DD0 B400                    	mov	ah, 0 ; inb
  6440 00002DD2 CD34                    	int	34h
  6441                                  	;mov	ah, 0 ; inb
  6442 00002DD4 CD34                    	int	34h
  6443                                  
  6444 00002DD6 30C0                    	xor     al, al
  6445                                  	;out	dx, al
  6446 00002DD8 B401                    	mov	ah, 1 ; outb
  6447 00002DDA CD34                    	int	34h
  6448                                  
  6449                                  	;add     dx, 08h
  6450                                  	; 10/02/2025
  6451 00002DDC 80C208                  	add	dl, 08h
  6452                                  	;mov	cx, 100
  6453 00002DDF 66B92000                	mov	cx, 32
  6454 00002DE3 28E4                    	sub	ah, ah ; 0
  6455                                  WaitID:
  6456                                  	;in	al, dx
  6457 00002DE5 CD34                    	int	34h  ;ah = 0 ; inb
  6458 00002DE7 08C0                    	or      al, al
  6459 00002DE9 7804                    	js      short GetID
  6460 00002DEB E2F8                    	loop    WaitID
  6461 00002DED EB0E                    	jmp     short NextPort
  6462                                  GetID:
  6463                                  	;sub	dx, 04h
  6464                                  	; 10/02/2025
  6465 00002DEF 80EA04                  	sub	dl, 04h
  6466                                  	;in	al, dx
  6467 00002DF2 CD34                    	int	34h  ;ah = 0 ; inb
  6468 00002DF4 3CAA                    	cmp     al, 0AAh
  6469 00002DF6 740F                    	je      short Found
  6470                                  	;add	dx, 04h
  6471                                  	; 10/02/2025
  6472 00002DF8 80C204                  	add	dl, 04h	
  6473 00002DFB E2E8                    	loop    WaitID
  6474                                  NextPort:
  6475                                  	;add	bx, 10h		; if not response,
  6476 00002DFD 80C310                  	add	bl, 10h
  6477                                  	;cmp	bx, 260h	; try the next port.
  6478 00002E00 80FB60                  	cmp	bl, 60h
  6479 00002E03 76BF                    	jbe     short ResetDSP
  6480 00002E05 F9                      	stc
  6481 00002E06 C3                      	retn
  6482                                  Found:
  6483 00002E07 66891D[D2770000]        	mov     [audio_io_base], bx ; SB Port Address Found!
  6484                                  ScanIRQ:
  6485                                  SetIrqs:
  6486 00002E0E 28C0                    	sub 	al, al ; 0
  6487 00002E10 A2[D7770000]            	mov 	[IRQnum], al ; reset
  6488                                  	;mov	[audio_intr], al
  6489                                  
  6490                                  	; ah > 0 -> set IRQ vector
  6491                                  	; al = IRQ number
  6492 00002E15 66B80501                	mov	ax, 105h ; IRQ 5
  6493 00002E19 BA[DF2E0000]            	mov	edx, IRQ5_srb
  6494 00002E1E E872000000              	call	set_hardware_int_vector
  6495                                  
  6496 00002E23 66B80701                	mov	ax, 107h ; IRQ 7
  6497 00002E27 BA[E02E0000]            	mov	edx, IRQ7_srb
  6498 00002E2C E864000000              	call	set_hardware_int_vector
  6499                                  
  6500 00002E31 668B15[D2770000]        	mov     dx, [audio_io_base] ; tells to the SB to
  6501                                  	;add	dx, 0Ch		    ; generate a IRQ!
  6502 00002E38 80C20C                  	add	dl, 0Ch
  6503                                  WaitSb:
  6504                                  	;in	al, dx
  6505 00002E3B B400                    	mov	ah, 0 ; inb
  6506 00002E3D CD34                    	int	34h
  6507 00002E3F 08C0                    	or      al, al
  6508 00002E41 78F8                    	js      short WaitSb
  6509 00002E43 B0F2                    	mov     al, 0F2h
  6510                                  	;out	dx, al
  6511 00002E45 B401                    	mov	ah,1  ; outb
  6512 00002E47 CD34                    	int	34h	
  6513                                  
  6514 00002E49 31C9                    	xor	ecx, ecx	; wait until IRQ level
  6515                                  	;mov	ecx, 65536
  6516                                  WaitIRQ: 
  6517                                  	; 10/02/2025
  6518                                  	;mov	al, [IRQnum]
  6519                                  	;cmp    al, 0 ; is changed or timeout.
  6520                                  	;ja	short IrqOk
  6521 00002E4B A0[DF2E0000]            	mov	al, [IRQ5_srb]
  6522 00002E50 3C05                    	cmp	al, 5
  6523 00002E52 740F                    	je	short IrqOk
  6524 00002E54 A0[E02E0000]            	mov	al, [IRQ7_srb]
  6525 00002E59 3C07                    	cmp	al, 7
  6526 00002E5B 7406                    	je	short IrqOk	
  6527 00002E5D 6649                    	dec	cx
  6528                                  	;dec	ecx
  6529 00002E5F 75EA                    	jnz	short WaitIRQ
  6530 00002E61 EB18                    	jmp	short RestoreIrqs
  6531                                  IrqOk:
  6532                                  	;;;
  6533                                  	; 10/02/2025
  6534 00002E63 A2[D7770000]            	mov	[IRQnum], al
  6535 00002E68 A2[C6770000]            	mov	[audio_intr], al
  6536 00002E6D 668B15[D2770000]        	mov 	dx, [audio_io_base]
  6537                                  	;add	dx, 0Eh
  6538 00002E74 80C20E                  	add	dl, 0Eh ; 8bit DMA-mode int ack
  6539                                  	;in	al, dx
  6540 00002E77 B400                    	mov	ah, 0 ; inb
  6541 00002E79 CD34                    	int	34h
  6542                                  
  6543                                  	; 10/02/2025
  6544                                  	; 16bit DMA mode intr ack is
  6545                                  	; not necessary for initial IRQ scan
  6546                                  %if 0
  6547                                  	inc	edx ; 0Fh ; 16bit DMA-mode int ack
  6548                                  	;in	al, dx	; SB 16 acknowledge.
  6549                                  	;mov	ah, 0 ; inb
  6550                                  	int	34h
  6551                                  %endif
  6552                                  	;;;
  6553                                  	;mov	al, 20h
  6554                                  	;out	20h, al	; Hardware acknowledge.
  6555                                  RestoreIrqs:
  6556                                  	; ah = 0 -> reset IRQ vector
  6557                                  	; al = IRQ number
  6558 00002E7B 66B80500                	mov	ax, 5 ; IRQ 5
  6559 00002E7F E811000000              	call	set_hardware_int_vector
  6560 00002E84 66B80700                	mov	ax, 7 ; IRQ 7
  6561 00002E88 E808000000              	call	set_hardware_int_vector
  6562                                  
  6563 00002E8D 803D[D7770000]01        	cmp     byte [IRQnum], 1 ; IRQ level was changed?
  6564                                  	
  6565 00002E94 C3                      	retn
  6566                                  
  6567                                  ;-----------------------------------------------------------------------------
  6568                                  ;
  6569                                  ;-----------------------------------------------------------------------------
  6570                                  
  6571                                  	; 10/02/2025
  6572                                  	; 20/10/2027 - playwav.s
  6573                                  
  6574                                  	; syscalbac:
  6575                                  	; ----------
  6576                                  	; Link or unlink IRQ callback service to/from user (ring 3)
  6577                                  
  6578                                  	; sycalbac Input: 
  6579                                  	; 	bl = IRQ number
  6580                                  	;	bh = 0 -> reset/unlink
  6581                                  	;	bh = 1 -> set/link
  6582                                  	;	cl = signal response/return byte value (to user)
  6583                                  	;	bh = 3 -> counter (start value is cl+1)
  6584                                  	; 	edx = signal response (return) byte address
  6585                                  	;	      or callback service address
  6586                                  
  6587                                  set_hardware_int_vector:
  6588 00002E95 08E4                    	or	ah, ah
  6589 00002E97 751E                    	jnz	short shintv_1 ; set user's audio interrupt handler
  6590                                  
  6591                                  rhintv_1:		
  6592 00002E99 3C05                    	cmp	al, 5
  6593 00002E9B 750D                    	jne	short rhintv_2
  6594                                  
  6595                                  	; Signal Response Byte 
  6596                                  	sys	_calbac, 5	; unlink IRQ 5
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002E9D BB05000000          <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002EA2 B82C000000          <1>  mov eax, %1
    96                              <1> 
    97 00002EA7 CD40                <1>  int 40h
  6597                                  
  6598 00002EA9 C3                      	retn
  6599                                  
  6600                                  rhintv_2:
  6601                                  	; al = 7
  6602                                  
  6603                                  	; Signal Response Byte
  6604                                  	sys	_calbac, 7	; unlink IRQ 7
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002EAA BB07000000          <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89                              <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002EAF B82C000000          <1>  mov eax, %1
    96                              <1> 
    97 00002EB4 CD40                <1>  int 40h
  6605                                  
  6606 00002EB6 C3                      	retn
  6607                                  
  6608                                  shintv_1:
  6609 00002EB7 3C05                    	cmp	al, 5
  6610 00002EB9 7512                    	jne	short shintv_2
  6611                                  
  6612                                  	; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
  6613                                  
  6614                                  	; edx = srb address (IRQnum or IRQ5_srb)
  6615                                  
  6616                                  	sys	_calbac, 105h, 5 ; IRQ 5
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002EBB BB05010000          <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002EC0 B905000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002EC5 B82C000000          <1>  mov eax, %1
    96                              <1> 
    97 00002ECA CD40                <1>  int 40h
  6617                                  
  6618 00002ECC C3                      	retn
  6619                                  
  6620                                  shintv_2:	
  6621                                  	; al = 7
  6622                                  
  6623                                  	; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ
  6624                                  
  6625                                  	; edx = srb address (IRQnum or IRQ7_srb)
  6626                                  
  6627                                  	sys	_calbac, 107h, 7 ; IRQ 7
    82                              <1> 
    83                              <1> 
    84                              <1> 
    85                              <1> 
    86                              <1>  %if %0 >= 2
    87 00002ECD BB07010000          <1>  mov ebx, %2
    88                              <1>  %if %0 >= 3
    89 00002ED2 B907000000          <1>  mov ecx, %3
    90                              <1>  %if %0 = 4
    91                              <1>  mov edx, %4
    92                              <1>  %endif
    93                              <1>  %endif
    94                              <1>  %endif
    95 00002ED7 B82C000000          <1>  mov eax, %1
    96                              <1> 
    97 00002EDC CD40                <1>  int 40h
  6628                                  
  6629 00002EDE C3                      	retn
  6630                                  
  6631                                  ;-----------------------------------------------------------------------------
  6632                                  
  6633                                  	; 10/02/2025
  6634 00002EDF 00                      IRQ5_srb: db 0
  6635 00002EE0 00                      IRQ7_srb: db 0
  6636                                  
  6637                                  ;=============================================================================
  6638                                  ; settextmode - restore the VGA 80x25x16 text mode
  6639                                  ;=============================================================================
  6640                                  	
  6641                                  	; 10/02/2025
  6642                                  settextmode:
  6643 00002EE1 66B80300                	mov	ax, 0003h
  6644                                  	;int	10h
  6645 00002EE5 CD31                    	int	31h ; TRDOS 386 - Video interrupt
  6646 00002EE7 C3                      	retn
  6647                                  	
  6648                                  ;=============================================================================
  6649                                  ; drawscopes - draw wave/voice sample scopes
  6650                                  ;=============================================================================
  6651                                  	
  6652                                  	; 10/02/2025 - twavply3.s
  6653                                  	; 09/02/2025 - twavplay.asm (16bit)
  6654                                  	; 05/02/2025 - twavplay2.s
  6655                                  drawscopes:
  6656 00002EE8 E8C5000000              	call	get_current_sound_data
  6657 00002EED BE[10820000]            	mov	esi, g_buffer
  6658                                  
  6659 00002EF2 31C9                    	xor     ecx, ecx
  6660 00002EF4 31D2                    	xor     edx, edx
  6661 00002EF6 31FF                    	xor	edi, edi
  6662                                  drawscope0:
  6663 00002EF8 66AD                    	lodsw
  6664 00002EFA 80F480                  	xor	ah, 80h
  6665 00002EFD 0FB6DC                  	movzx	ebx, ah	; Left Channel
  6666 00002F00 D1E3                    	shl	ebx, 1
  6667 00002F02 668B83[E0770000]        	mov	ax, [RowOfs+ebx]
  6668 00002F09 668987[E0790000]        	mov	[NewScope_L+edi], ax
  6669 00002F10 30FF                    	xor	bh, bh
  6670 00002F12 66AD                    	lodsw
  6671 00002F14 80F480                  	xor	ah, 80h
  6672 00002F17 88E3                    	mov	bl, ah	; Right Channel
  6673 00002F19 D1E3                    	shl	ebx, 1
  6674 00002F1B 668B83[E0770000]        	mov	ax, [RowOfs+ebx]
  6675 00002F22 668987[E07B0000]        	mov	[NewScope_R+edi], ax
  6676 00002F29 6683C702                	add	di, 2
  6677 00002F2D FEC1                    	inc	cl
  6678 00002F2F 75C7                    	jnz	short drawscope0
  6679                                  
  6680 00002F31 66BAC403                	mov	dx, 3C4h
  6681                                  	;mov	ax, 0802h
  6682                                          ;out	dx, ax
  6683 00002F35 66BB0208                        mov	bx, 0802h
  6684 00002F39 B403                    	mov	ah, 3 ; outw
  6685 00002F3B CD34                    	int	34h
  6686                                  
  6687                                  	;mov	dx, 3CEh
  6688 00002F3D B2CE                    	mov	dl, 0CEh
  6689 00002F3F B008                    	mov	al, 08h
  6690                                         ;out	dx, al
  6691 00002F41 B401                            mov	ah, 1 ; outb
  6692 00002F43 CD34                    	int	34h
  6693                                  
  6694 00002F45 42                      	inc	edx
  6695                                  
  6696 00002F46 31F6                    	xor	esi, esi
  6697 00002F48 BB45060A00              	mov	ebx, 0A0645h
  6698                                  drawscopel4:
  6699 00002F4D B080                    	mov     al, 80h
  6700                                  drawscopel2:
  6701 00002F4F 50                      	push	eax ; **
  6702 00002F50 52                      	push	edx ; *
  6703                                  	;out	dx, al
  6704 00002F51 B401                    	mov	ah, 1 ; outb
  6705 00002F53 CD34                    	int	34h
  6706                                  
  6707                                  	;mov	ecx, 32
  6708 00002F55 B120                    	mov	cl, 32
  6709 00002F57 66B800FF                	mov	ax, 0FF00h
  6710                                  drawscopel3:
  6711 00002F5B 668BBE[E07D0000]                mov	di, [OldScope_L+esi]
  6712 00002F62 668B96[E0790000]        	mov	dx, [NewScope_L+esi]
  6713 00002F69 39D7                            cmp	edi, edx
  6714 00002F6B 740D                            je	short drawscopef3
  6715 00002F6D 88043B                  	mov	[ebx+edi], al ; L
  6716 00002F70 882413                  	mov	[ebx+edx], ah ; L
  6717 00002F73 668996[E07D0000]                mov     [OldScope_L+esi], dx
  6718                                  drawscopef3:
  6719 00002F7A 668BBE[E07F0000]        	mov	di, [OldScope_R+esi]
  6720 00002F81 668B96[E07B0000]        	mov	dx, [NewScope_R+esi]
  6721 00002F88 39D7                    	cmp	edi, edx
  6722 00002F8A 740F                    	je	short drawscopef4
  6723 00002F8C 88443B26                	mov	[ebx+edi+38], al ; R
  6724 00002F90 88641326                	mov	[ebx+edx+38], ah ; R
  6725 00002F94 668996[E07F0000]        	mov     [OldScope_R+esi], dx
  6726                                  drawscopef4:
  6727 00002F9B 83C610                  	add	esi, 2*8
  6728 00002F9E 43                      	inc	ebx
  6729 00002F9F E2BA                    	loop    drawscopel3
  6730                                  
  6731 00002FA1 5A                              pop     edx ; *
  6732 00002FA2 58                              pop     eax ; **
  6733 00002FA3 81EEFE010000            	sub	esi, 2*256-2
  6734 00002FA9 83EB20                  	sub	ebx, 32
  6735 00002FAC D0E8                            shr     al, 1
  6736 00002FAE 759F                            jnz	short drawscopel2
  6737 00002FB0 F8                      	clc
  6738 00002FB1 C3                              retn
  6739                                  
  6740                                  ;=============================================================================
  6741                                  ; Get Current Sound Data
  6742                                  ;=============================================================================
  6743                                  ; Reference: TRDOS 386 v2.0.9 Kernel - audio.s file (28/01/2025)
  6744                                  
  6745                                  	; 10/02/2025 - twavplay.s
  6746                                  	; 08/02/2025 - twavplay.asm (16bit)
  6747                                  
  6748                                  	; !!! 18.2 block/second buffer sizing for proper wave scopes !!!
  6749                                  	; (wave graphics synchronization) 
  6750                                  
  6751                                  get_current_sound_data:
  6752                                  	; get current sound (PCM out) data for graphics
  6753                                  
  6754 00002FB2 BF[10820000]            	mov	edi, g_buffer
  6755                                  
  6756 00002FB7 803D[D6770000]01        	cmp	byte [audio_hardware], 1
  6757 00002FBE 7749                    	ja	short ac97_current_sound_data
  6758                                  
  6759                                  ;-----------------------------------------------------------------------------
  6760                                  	
  6761                                  	; 10/02/2025
  6762                                  	; 08/02/2025 - twavplay.asm (16bit)
  6763                                  
  6764                                  sb16_current_sound_data:
  6765 00002FC0 8B0D[08820000]          	mov	ecx, [g_samples]
  6766                                  	
  6767 00002FC6 803D[6A770000]10        	cmp	byte [WAVE_BitsPerSample], 16
  6768 00002FCD 7512                    	jne	short sb16_gcd_1 ; 8 bit DMA channel
  6769                                  	;in	al, 0C6h ; DMA channel 5 count register
  6770 00002FCF 66BAC600                	mov	dx, 0C6h
  6771 00002FD3 B400                    	mov	ah, 0 ; inb
  6772 00002FD5 CD34                    	int	34h
  6773                                  	; AL = Low Byte of the word count
  6774                                  	;;mov	ah, al
  6775 00002FD7 C1E018                  	shl	eax, 24	; (*)
  6776                                  	;in	al, 0C6h
  6777                                  	;mov	dx, 0C6h
  6778                                  	;mov	ah, 0 ; inb
  6779 00002FDA CD34                    	int	34h
  6780                                  	; AL = High Byte of the word count
  6781                                  	;;xchg	ah, al
  6782                                  	;rol	eax, 8	; (*)
  6783                                  	;shl	ax, 1 ; word count -> byte count
  6784 00002FDC C1C009                  	rol	eax, 9
  6785 00002FDF EB10                    	jmp	short sb16_gcd_2
  6786                                  
  6787                                  sb16_gcd_1:
  6788                                  	;in	al, 03h ; DMA channel 1 count register
  6789 00002FE1 66BA0300                	mov	dx, 03h
  6790 00002FE5 B400                    	mov	ah, 0 ; inb
  6791 00002FE7 CD34                    	int	34h
  6792                                  	; AL = Low Byte of the byte count
  6793                                  	;;mov	ah, al
  6794 00002FE9 C1E018                  	shl	eax, 24	; (**)
  6795                                  	;in	al, 03h
  6796                                  	;mov	dx, 03h
  6797                                  	;mov	ah, 0 ; inb
  6798 00002FEC CD34                    	int	34h
  6799                                  	; AL = High Byte of the byte count
  6800                                  	;;xchg	ah, al
  6801 00002FEE C1C008                  	rol	eax, 8	; (**)
  6802                                  
  6803                                  sb16_gcd_2:
  6804                                  	; eax = remain count
  6805 00002FF1 8B1D[E8810000]          	mov	ebx, [buffersize] ; half buffer size
  6806 00002FF7 39D8                    	cmp	eax, ebx
  6807 00002FF9 7602                    	jna	short sb16_gcd_3 ; 2nd half
  6808 00002FFB 31DB                    	xor	ebx, ebx ; 1st half
  6809                                  sb16_gcd_3:
  6810 00002FFD 8DB3[00000200]          	lea	esi, [dma_buffer+ebx] ; start of 1st half or 2nd half
  6811                                  
  6812                                  	; esi = dma buffer offset
  6813                                  	; ecx = load (source) count
  6814                                  	; edi = g_buffer
  6815                                  
  6816                                  	; 15/02/2025
  6817 00003003 FF25[04820000]          	jmp	dword [sound_data_copy]
  6818                                  
  6819                                  ;-----------------------------------------------------------------------------
  6820                                  
  6821                                  	; 10/02/2025
  6822                                  	; 09/02/2025 - twavplay.asm (16bit)
  6823                                  
  6824                                  ac97_current_sound_data:
  6825                                  	;;mov	ecx, 1024 ; always 16bit stereo
  6826                                  	;mov	ecx, 512
  6827 00003009 B900010000              	mov	ecx, 256
  6828                                  
  6829 0000300E 66BA1400                	mov	dx, PO_CIV_REG ; Position In Current Buff Reg
  6830 00003012 660315[D4770000]        	add	dx, [NABMBAR]
  6831                                  	;in	al, dx	; current index value
  6832 00003019 B400                    	mov	ah, 0 ; inb ; read port, byte
  6833 0000301B CD34                    	int	34h
  6834                                  	;mov	ebx, WAV_BUFFER_1
  6835 0000301D BE[00A00000]            	mov	esi, WAV_BUFFER_1
  6836 00003022 A801                    	test	al, 1
  6837 00003024 7405                    	jz	short ac97_gcd_1
  6838                                  	;mov	ebx, WAV_BUFFER_2
  6839 00003026 BE[00D00000]            	mov	esi, WAV_BUFFER_2
  6840                                  ac97_gcd_1:
  6841                                  	;mov	dx, PO_PICB_REG ; Position In Current Buff Reg
  6842                                  	;add	dx, [NABMBAR]
  6843                                  	;;in	ax, dx	; remain words
  6844                                  	;mov	ah, 2 ; inw ; read port, word
  6845                                  	;int	34h
  6846                                  	;;shl	eax, 1	; remain bytes
  6847                                  ac97_gcd_2:
  6848                                  	;xor	esi, esi ; 1st half
  6849                                  ac97_gcd_3:
  6850                                  	;mov	esi, [buffersize] ; 16 bit sample count
  6851                                  	;sub	esi, eax
  6852                                  	;shl	esi, 1 ; byte offset
  6853                                  
  6854                                  	; esi = 0, start of the wave/pcm data (dma) buffer
  6855                                  	; (buffer size is adjusted for playing in 1/18.2 second) 
  6856                                  
  6857                                  	;add	esi, ebx
  6858                                  
  6859                                  	; ds:si = dma buffer offset
  6860                                  	; cx = load (source) count
  6861                                  	; es:di = g_buffer
  6862                                  
  6863                                  	; AC97 dma buffer contains 16bit stereo samples (only)
  6864                                  	; copy samples to g_buffer
  6865                                  
  6866                                  	;shr	ecx, 1
  6867                                  	;rep	movsw
  6868                                  
  6869                                  	;shr	ecx, 2
  6870 0000302B F3A5                    	rep	movsd
  6871                                  
  6872 0000302D C3                      	retn
  6873                                  
  6874                                  ;-----------------------------------------------------------------------------
  6875                                  
  6876                                  	; 10/02/2025
  6877                                  	; 09/02/2025 - twavplay.asm (16bit)
  6878                                  sdc_16bit_stereo:
  6879                                  	; esi = dma buffer offset
  6880                                  	; ecx = load (source) count = 1024
  6881                                  	; edi = g_buffer
  6882                                  	;shr	ecx, 1
  6883                                  	;rep	movsw
  6884 0000302E C1E902                  	shr	ecx, 2
  6885 00003031 F3A5                    	rep	movsd
  6886 00003033 C3                      	retn
  6887                                  
  6888                                  ;-----------------------------------------------------------------------------
  6889                                  
  6890                                  	; 10/02/2025
  6891                                  	; 09/02/2025 - twavplay.asm (16bit)
  6892                                  sdc_16bit_mono:
  6893                                  	; esi = dma buffer offset
  6894                                  	; ecx = load (source) count = 512
  6895                                  	; edi = g_buffer
  6896 00003034 D1E9                    	shr	ecx, 1
  6897                                  sdc_16bm_loop:
  6898 00003036 66AD                    	lodsw
  6899 00003038 66AB                    	stosw
  6900 0000303A 66AB                    	stosw
  6901 0000303C E2F8                    	loop	sdc_16bm_loop
  6902 0000303E C3                      	retn
  6903                                  
  6904                                  ;-----------------------------------------------------------------------------
  6905                                  
  6906                                  	; 10/02/2025
  6907                                  	; 09/02/2025 - twavplay.asm (16bit)
  6908                                  sdc_8bit_stereo:
  6909                                  	; esi = dma buffer offset
  6910                                  	; ecx = load (source) count = 512
  6911                                  	; edi = g_buffer
  6912                                  
  6913                                  	; convert to 16 bit sample
  6914                                  sdc_8bs_loop:
  6915 0000303F AC                      	lodsb
  6916 00003040 2C80                    	sub	al, 80h ; middle = 0, min = -128, max = 127
  6917 00003042 66C1E008                	shl	ax, 8
  6918 00003046 66AB                    	stosw
  6919 00003048 E2F5                    	loop	sdc_8bs_loop
  6920 0000304A C3                      	retn
  6921                                  
  6922                                  ;-----------------------------------------------------------------------------
  6923                                  
  6924                                  	; 10/02/2025
  6925                                  	; 09/02/2025 - twavplay.asm (16bit
  6926                                  sdc_8bit_mono:
  6927                                  	; esi = dma buffer offset
  6928                                  	; ecx = load (source) count = 256
  6929                                  	; edi = g_buffer
  6930                                  
  6931                                  	; convert to 16 bit sample
  6932                                  sdc_8bm_loop:
  6933 0000304B AC                      	lodsb
  6934 0000304C 2C80                    	sub	al, 80h ; middle = 0, min = -128, max = 127
  6935 0000304E 66C1E008                	shl	ax, 8
  6936 00003052 66AB                    	stosw	; L
  6937                                  	; convert to stereo
  6938 00003054 66AB                    	stosw	; R
  6939 00003056 E2F3                    	loop	sdc_8bm_loop
  6940 00003058 C3                      	retn
  6941                                  
  6942                                  ;-----------------------------------------------------------------------------
  6943                                  
  6944                                  ;=============================================================================
  6945                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode
  6946                                  ;=============================================================================
  6947                                  
  6948                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  6949                                  
  6950                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  6951                                  
  6952                                  ;-----------------------------------------------------------------------------
  6953                                  ; EQUATES AND STRUCTURES
  6954                                  ;-----------------------------------------------------------------------------
  6955                                  
  6956                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  6957                                  ID_ILBM equ 4D424C49h
  6958                                  ID_BMHD equ 44484D42h
  6959                                  ID_CMAP equ 50414D43h
  6960                                  ID_BODY equ 59444F42h
  6961                                  
  6962                                  struc Form			; IFF/ILBM header file format
  6963 00000000 ????????                  .ID:		resd 1
  6964 00000004 ????????                  .Length:	resd 1
  6965 00000008 ????????                  .Type:	resd 1
  6966                                    .size:
  6967                                  endstruc
  6968                                  
  6969                                  struc Chunk			; IFF/ILBM header chunk format
  6970 00000000 ????????                  .ID:		resd 1
  6971 00000004 ????????                  .Length:	resd 1
  6972                                    .size:
  6973                                  endstruc
  6974                                  
  6975                                  struc BMHD			; IFF/ILBM BMHD chunk format
  6976 00000000 ????                      .Width: 	resw 1
  6977 00000002 ????                      .Height:	resw 1
  6978 00000004 ????                      .PosX:	resw 1
  6979 00000006 ????                      .PosY:	resw 1
  6980 00000008 ??                        .Planes:	resb 1
  6981 00000009 ??                        .Masking:	resb 1
  6982 0000000A ??                        .Compression:	resb 1
  6983 0000000B ??                        .Pad:		resb 1
  6984 0000000C ????                      .Transparent:	resw 1
  6985 0000000E ??                        .AspectX	resb 1
  6986 0000000F ??                        .AspectY:	resb 1
  6987 00000010 ????                      .PageWidth:	resw 1
  6988 00000012 ????                      .PageHeight:	resw 1
  6989                                    .size:
  6990                                  endstruc
  6991                                  
  6992                                  struc CMAP			; IFF/ILBM CMAP chunk format
  6993 00000000 <res 300h>                .Colors:	resb 768
  6994                                    .size:
  6995                                  endstruc
  6996                                  
  6997                                  ;------------------------------------------------------------------------------
  6998                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  6999                                  ;         a value in little/big endian form to big/little endian form.
  7000                                  ;------------------------------------------------------------------------------
  7001                                  
  7002                                  %macro	bswap   1
  7003                                  	xchg    al, ah
  7004                                  	rol     eax, 16
  7005                                  	xchg    al, ah
  7006                                  %endmacro
  7007                                  
  7008                                  ;------------------------------------------------------------------------------
  7009                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  7010                                  ; In:
  7011                                  ;  ESI = IFF/ILBM image file address
  7012                                  ;------------------------------------------------------------------------------
  7013                                  
  7014                                  	; 10/02/2025
  7015                                  	; 05/02/2025 - twavply2.s
  7016                                  
  7017                                  putlbm:
  7018 00003059 BE[54310000]            	mov	esi, LOGO_ADDRESS
  7019                                  	
  7020                                  	;pushad
  7021                                  
  7022                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  7023                                  
  7024                                  	;cmp	dword [esi+Form.ID], ID_FORM
  7025                                  	;jne	short putlbmd0
  7026                                  	;cmp	dword [esi+Form.Type], ID_ILBM
  7027                                  	;jne	short putlbmd0
  7028                                  
  7029                                  ; get the IFF/ILBM file length in bytes
  7030                                  
  7031 0000305E 8B4604                  	mov	eax, [esi+Form.Length]
  7032                                  	bswap	eax
  7003 00003061 86E0                <1>  xchg al, ah
  7004 00003063 C1C010              <1>  rol eax, 16
  7005 00003066 86E0                <1>  xchg al, ah
  7033 00003068 89C1                    	mov	ecx, eax
  7034                                  
  7035                                  ; decrease the file length and updates the file pointer
  7036                                  
  7037 0000306A 83E904                  	sub	ecx, 4
  7038 0000306D 83C60C                  	add	esi, Form.size
  7039                                  
  7040                                  ; IFF/ILBM main parser body loop
  7041                                  
  7042                                  putlbml0:
  7043 00003070 85C9                    	test	ecx, ecx
  7044 00003072 7E63                    	jle	short putlbmd1
  7045                                  
  7046                                  ; get the next chunk ID and length in bytes
  7047                                  
  7048 00003074 8B1E                    	mov	ebx, [esi+Chunk.ID]
  7049 00003076 8B4604                  	mov	eax, [esi+Chunk.Length]
  7050                                  	bswap	eax
  7003 00003079 86E0                <1>  xchg al, ah
  7004 0000307B C1C010              <1>  rol eax, 16
  7005 0000307E 86E0                <1>  xchg al, ah
  7051 00003080 93                      	xchg	ebx, eax
  7052 00003081 83C608                  	add	esi, Chunk.size
  7053                                  
  7054                                  ; word align the chunk length and decrease the file length counter
  7055                                  
  7056 00003084 43                      	inc	ebx
  7057 00003085 80E3FE                  	and	bl, 0FEh ; ~1
  7058 00003088 83E908                  	sub	ecx, Chunk.size
  7059 0000308B 29D9                    	sub	ecx, ebx
  7060                                  
  7061                                  ; check for the BMHD/CMAP/BODY chunk headers
  7062                                  
  7063 0000308D 3D424D4844              	cmp	eax, ID_BMHD
  7064 00003092 7414                    	je	short putlbmf0
  7065 00003094 3D434D4150              	cmp	eax, ID_CMAP
  7066 00003099 743E                    	je	short putlbmf1
  7067 0000309B 3D424F4459              	cmp	eax, ID_BODY
  7068 000030A0 7452                    	je	short putlbmf2
  7069                                  
  7070                                  ; advance to the next IFF/ILBM chunk structure
  7071                                  
  7072                                  putlbmc0:
  7073 000030A2 01DE                    	add	esi, ebx
  7074 000030A4 EBCA                    	jmp	short putlbml0
  7075                                  
  7076                                  putlbmd0:
  7077 000030A6 F9                      	stc
  7078                                  	;popad
  7079 000030A7 C3                      	retn
  7080                                  
  7081                                  ; process the BMHD bitmap header chunk
  7082                                  
  7083                                  putlbmf0:
  7084 000030A8 807E0804                	cmp	byte [esi+BMHD.Planes], 4
  7085 000030AC 75F8                    	jne	short putlbmd0
  7086 000030AE 807E0A01                	cmp	byte [esi+BMHD.Compression], 1
  7087 000030B2 75F2                    	jne	short putlbmd0
  7088 000030B4 807E0B00                	cmp	byte [esi+BMHD.Pad], 0
  7089 000030B8 75EC                    	jne	short putlbmd0
  7090 000030BA 0FB706                  	movzx	eax, word [esi+BMHD.Width]
  7091 000030BD 86E0                    	xchg	al, ah
  7092 000030BF 83C007                  	add	eax, 7
  7093 000030C2 C1E803                  	shr	eax, 3
  7094 000030C5 A3[40770000]            	mov	[picture.width], eax
  7095 000030CA 0FB74602                	movzx	eax, word [esi+BMHD.Height]
  7096 000030CE 86E0                    	xchg	al, ah
  7097 000030D0 A3[44770000]            	mov	[picture.height], eax
  7098 000030D5 EBCB                    	jmp	short putlbmc0
  7099                                  
  7100                                  putlbmd1:
  7101 000030D7 F8                      	clc
  7102                                  	;popad
  7103 000030D8 C3                      	retn
  7104                                  
  7105                                  ; process the CMAP colormap chunk
  7106                                  
  7107                                  putlbmf1:
  7108 000030D9 66BAC803                	mov	dx, 3C8h
  7109 000030DD 30C0                    	xor	al, al
  7110                                  	;out	dx, al
  7111 000030DF B401                    	mov	ah, 1 ; outb
  7112 000030E1 CD34                    	int	34h
  7113                                  	;inc	dx
  7114 000030E3 42                      	inc	edx
  7115                                  putlbml1:
  7116 000030E4 8A06                    	mov	al, [esi]
  7117 000030E6 C0E802                  	shr	al, 2
  7118                                  	;out	dx, al
  7119                                  	;mov	ah, 1 ; outb
  7120 000030E9 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  7121 000030EB 46                      	inc	esi
  7122 000030EC 4B                      	dec	ebx
  7123 000030ED 7FF5                    	jg	short putlbml1
  7124 000030EF E97CFFFFFF              	jmp	putlbml0
  7125                                  
  7126                                  ; process the BODY bitmap body chunk
  7127                                  
  7128                                  putlbmf2:
  7129 000030F4 60                      	pushad
  7130 000030F5 BF00000A00              	mov	edi, 0A0000h
  7131                                  	;cld
  7132 000030FA 66BACE03                	mov	dx, 3CEh
  7133                                  	;mov	ax, 0FF08h
  7134                                  	;out	dx, ax
  7135 000030FE 66BB08FF                	mov	bx, 0FF08h
  7136 00003102 B403                    	mov	ah, 3 ; outw
  7137 00003104 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  7138                                  	;mov	dx, 3C4h
  7139 00003106 B2C4                    	mov	dl, 0C4h
  7140 00003108 B002                    	mov	al, 02h
  7141                                  	;out	dx, al
  7142 0000310A B401                    	mov	ah, 1 ; outb
  7143 0000310C CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  7144                                  	;inc	dx
  7145 0000310E 42                      	inc	edx
  7146 0000310F 8B0D[44770000]          	mov	ecx, [picture.height]
  7147                                  putlbml2:
  7148 00003115 51                      	push	ecx
  7149 00003116 B011                    	mov	al, 11h
  7150                                  putlbml3:
  7151 00003118 50                      	push	eax
  7152 00003119 57                      	push	edi
  7153                                  	;out	dx, al
  7154 0000311A B401                    	mov	ah, 1 ; outb
  7155 0000311C CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  7156 0000311E 8B1D[40770000]          	mov	ebx, [picture.width]
  7157                                  putlbml4:
  7158 00003124 AC                      	lodsb
  7159 00003125 31C9                    	xor	ecx, ecx
  7160 00003127 84C0                    	test	al, al
  7161 00003129 7C09                    	jl	short putlbmf3
  7162                                  	;movzx	ecx, al
  7163 0000312B 88C1                    	mov	cl, al
  7164 0000312D 41                      	inc	ecx
  7165 0000312E 29CB                    	sub	ebx, ecx
  7166 00003130 F3A4                    	rep	movsb
  7167 00003132 EB0A                    	jmp	short putlbmc4
  7168                                  putlbmf3:
  7169 00003134 F6D8                    	neg	al
  7170                                  	;movzx	ecx, al
  7171 00003136 88C1                    	mov	cl, al
  7172 00003138 41                      	inc	ecx
  7173 00003139 29CB                    	sub	ebx, ecx
  7174 0000313B AC                      	lodsb
  7175 0000313C F3AA                    	rep	stosb
  7176                                  putlbmc4:
  7177 0000313E 85DB                    	test	ebx, ebx
  7178 00003140 7FE2                    	jg	short putlbml4
  7179 00003142 5F                      	pop	edi
  7180 00003143 58                      	pop	eax
  7181 00003144 00C0                    	add	al, al
  7182 00003146 73D0                    	jnc	short putlbml3
  7183 00003148 83C750                  	add	edi, 80
  7184 0000314B 59                      	pop	ecx
  7185 0000314C E2C7                    	loop	putlbml2
  7186 0000314E 61                      	popad
  7187 0000314F E94EFFFFFF              	jmp	putlbmc0
  7188                                  
  7189                                  ;------------------------------------------------------------------------------
  7190                                  ;------------------------------------------------------------------------------
  7191                                  
  7192                                  align 2
  7193                                  
  7194                                  ; 22/10/2017
  7195                                  LOGO_ADDRESS:
  7196                                  ; 27/10/2017
  7197 00003154 <bin 4298h>             incbin "TINYPLAY.LBM"
  7198                                  
  7199                                  ;=============================================================================
  7200                                  ;		preinitialized data
  7201                                  ;=============================================================================
  7202                                  	
  7203 000073EC 00                      		db 0
  7204 000073ED FFFFFFFF                FileHandle:	dd -1
  7205 000073F1 00                      		db 0
  7206                                  
  7207 000073F2 54696E792057415620-     Credits:	db 'Tiny WAV Player for TRDOS 386 by Erdogan Tan. '
  7207 000073FB 506C6179657220666F-
  7207 00007404 72205452444F532033-
  7207 0000740D 383620627920457264-
  7207 00007416 6F67616E2054616E2E-
  7207 0000741F 20                 
  7208 00007420 466562727561727920-     		db 'February 2025.',10,13,0
  7208 00007429 323032352E0A0D00   
  7209 00007431 32302F30322F323032-     		db '20/02/2025',10,13
  7209 0000743A 350A0D             
  7210 0000743D 00                      reset:		db 0
  7211                                  
  7212 0000743E 0A0D                    msg_usage:	db 10,13
  7213 00007440 75736167653A207477-     		db 'usage: twavplay filename.wav',10,13,0
  7213 00007449 6176706C6179206669-
  7213 00007452 6C656E616D652E7761-
  7213 0000745B 760A0D00           
  7214                                  
  7215 0000745F 0A0D                    noDevMsg:	db 10,13
  7216 00007461 4572726F723A20556E-     		db 'Error: Unable to find a proper audio device !'
  7216 0000746A 61626C6520746F2066-
  7216 00007473 696E6420612070726F-
  7216 0000747C 70657220617564696F-
  7216 00007485 206465766963652021 
  7217 0000748E 0A0D00                  		db 10,13,0
  7218                                  
  7219 00007491 0A0D                    noFileErrMsg:	db 10,13
  7220 00007493 4572726F723A206669-     		db 'Error: file not found.',10,13,0
  7220 0000749C 6C65206E6F7420666F-
  7220 000074A5 756E642E0A0D00     
  7221                                  
  7222 000074AC 0A0D                    not_valid_wavf:	db 10,13
  7223 000074AE 4E6F7420612070726F-     		db 'Not a proper/valid WAV file !',10,13,0
  7223 000074B7 7065722F76616C6964-
  7223 000074C0 205741562066696C65-
  7223 000074C9 20210A0D00         
  7224                                  
  7225                                  		; 08/02/2025
  7226                                  sb16_init_err_msg:
  7227 000074CE 0A0D                    		db 10,13
  7228 000074D0 536F756E6420426C61-     		db 'Sound Blaster 16 initialization error !',10,13,0
  7228 000074D9 737465722031362069-
  7228 000074E2 6E697469616C697A61-
  7228 000074EB 74696F6E206572726F-
  7228 000074F4 7220210A0D00       
  7229                                  ac97_init_err_msg:
  7230 000074FA 0A0D                    		db 10,13
  7231 000074FC 414339372068617264-     		db 'AC97 hardware initialization error !',10,13,0
  7231 00007505 7761726520696E6974-
  7231 0000750E 69616C697A6174696F-
  7231 00007517 6E206572726F722021-
  7231 00007520 0A0D00             
  7232                                  		
  7233                                  ;init_err_msg:	;db 10,13
  7234                                  		;db 'Audio system initialization error !',10,13,0
  7235                                  
  7236 00007523 0A0D                    msg_no_vra:	db 10,13
  7237 00007525 4E6F20565241207375-     		db "No VRA support ! Only 48 kHZ sample rate supported !"
  7237 0000752E 70706F72742021204F-
  7237 00007537 6E6C79203438206B48-
  7237 00007540 5A2073616D706C6520-
  7237 00007549 726174652073757070-
  7237 00007552 6F727465642021     
  7238 00007559 0A0D00                  		db 10,13,0
  7239                                  
  7240                                  trdos386_err_msg:
  7241 0000755C 0A0D                    		db 10,13
  7242 0000755E 5452444F5320333836-     		db 'TRDOS 386 System call error !',10,13,0
  7242 00007567 2053797374656D2063-
  7242 00007570 616C6C206572726F72-
  7242 00007579 20210A0D00         
  7243                                  
  7244 0000757E 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  7244 00007587 3941424344454600   
  7245                                  
  7246 0000758F 0D0A                    msgAC97Info:	db 0Dh, 0Ah
  7247 00007591 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah
  7247 0000759A 6F20436F6E74726F6C-
  7247 000075A3 6C6572202620436F64-
  7247 000075AC 656320496E666F0D0A 
  7248 000075B5 56656E646F72204944-     		db "Vendor ID: "
  7248 000075BE 3A20               
  7249 000075C0 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  7249 000075C9 6963652049443A20   
  7250 000075D1 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  7251 000075D8 4275733A20              		db "Bus: "
  7252 000075DD 303068204465766963-     msgBusNo:	db "00h Device: "
  7252 000075E6 653A20             
  7253 000075E9 3030682046756E6374-     msgDevNo:	db "00h Function: "
  7253 000075F2 696F6E3A20         
  7254 000075F7 303068                  msgFncNo:	db "00h"
  7255 000075FA 0D0A                    		db 0Dh, 0Ah
  7256                                  
  7257 000075FC 4E414D4241523A20        		db "NAMBAR: "
  7258 00007604 30303030682020          msgNamBar:	db "0000h  "
  7259 0000760B 4E41424D4241523A20      		db "NABMBAR: "
  7260 00007614 303030306820204952-     msgNabmBar:	db "0000h  IRQ: "
  7260 0000761D 513A20             
  7261 00007620 3030                    msgIRQ:		dw 3030h
  7262 00007622 0D0A00                  		db 0Dh, 0Ah, 0
  7263                                  
  7264 00007625 0D0A5741562046696C-     msgWavFileName:	db 0Dh, 0Ah, "WAV File Name: ",0
  7264 0000762E 65204E616D653A2000 
  7265 00007637 0D0A53616D706C6520-     msgSampleRate:	db 0Dh, 0Ah, "Sample Rate: "
  7265 00007640 526174653A20       
  7266 00007646 303030303020487A2C-     msgHertz:	db "00000 Hz, ", 0 
  7266 0000764F 2000               
  7267 00007651 3820626974732C2000      msg8Bits:	db "8 bits, ", 0 
  7268 0000765A 4D6F6E6F0D0A00          msgMono:	db "Mono", 0Dh, 0Ah, 0
  7269 00007661 313620626974732C20-     msg16Bits:	db "16 bits, ", 0
  7269 0000766A 00                 
  7270 0000766B 53746572656F            msgStereo:	db "Stereo"
  7271 00007671 0D0A00                  nextline:	db 0Dh, 0Ah, 0
  7272                                  
  7273 00007674 56524120737570706F-     msgVRAheader:	db "VRA support: "
  7273 0000767D 72743A20           
  7274 00007681 00                      		db 0	
  7275 00007682 5945530D0A00            msgVRAyes:	db "YES", 0Dh, 0Ah, 0
  7276 00007688 4E4F200D0A              msgVRAno:	db "NO ", 0Dh, 0Ah
  7277 0000768D 28496E746572706F6C-     		db "(Interpolated sample rate playing method)"
  7277 00007696 617465642073616D70-
  7277 0000769F 6C6520726174652070-
  7277 000076A8 6C6179696E67206D65-
  7277 000076B1 74686F6429         
  7278 000076B6 0D0A00                  		db 0Dh, 0Ah, 0
  7279                                  
  7280 000076B9 0D0A                    msgSB16Info:	db 0Dh, 0Ah
  7281 000076BB 20417564696F204861-     		db " Audio Hardware: Sound Blaster 16", 0Dh, 0Ah
  7281 000076C4 7264776172653A2053-
  7281 000076CD 6F756E6420426C6173-
  7281 000076D6 7465722031360D0A   
  7282 000076DE 202020202020426173-     		db "      Base Port: "
  7282 000076E7 6520506F72743A20   
  7283                                  msgBasePort:
  7284 000076EF 303030680D0A            		db "000h", 0Dh, 0Ah
  7285 000076F5 202020202020202020-     		db "            IRQ: "
  7285 000076FE 2020204952513A20   
  7286                                  msgSB16IRQ:
  7287 00007706 30                      		db 30h
  7288 00007707 0D0A00                  		db 0Dh, 0Ah, 0
  7289                                  
  7290                                  ; 07/02/2025
  7291 0000770A 0D0A                    msgPressAKey:	db 0Dh, 0Ah
  7292 0000770C 202E2E2E2070726573-     		db ' ... press a key to continue ... '
  7292 00007715 732061206B65792074-
  7292 0000771E 6F20636F6E74696E75-
  7292 00007727 65202E2E2E20       
  7293 0000772D 0D0A00                  		db 0Dh, 0Ah, 0
  7294                                  
  7295                                  ; 07/02/2025
  7296 00007730 01                      half_buffer:	db 1
  7297                                  
  7298 00007731 2E2E20565241204F4B-     vra_ok:		db '.. VRA OK ..', 0Dh, 0Ah,0
  7298 0000773A 202E2E0D0A00       
  7299                                  
  7300                                  ;=============================================================================
  7301                                  ;		uninitialized data
  7302                                  ;=============================================================================
  7303                                  
  7304                                  ; 10/02/2025
  7305                                  ; 09/02/2025
  7306                                  
  7307                                  ; BSS
  7308                                  
  7309                                  bss_start:
  7310                                  
  7311                                  ABSOLUTE bss_start
  7312                                  
  7313                                  alignb 4
  7314                                  
  7315                                  ;------------------------------------------------------------------------------
  7316                                  ; IFF/ILBM DATA
  7317                                  ;------------------------------------------------------------------------------
  7318                                  
  7319 00007740 ????????                picture.width:	resd 1 	; current picture width and height
  7320 00007744 ????????                picture.height:	resd 1
  7321                                  
  7322                                  ;------------------------------------------------------------------------------
  7323                                  
  7324                                  ;;;;;;;
  7325                                  WAVFILEHEADERbuff:
  7326 00007748 ????????                RIFF_ChunkID:	resd 1	; Must be equal to "RIFF" - big-endian
  7327                                  			; 0x52494646
  7328 0000774C ????????                RIFF_ChunkSize: resd 1	; Represents total file size, not
  7329                                          		; including the first 2 fields
  7330                                  			; (Total_File_Size - 8), little-endian
  7331 00007750 ????????                RIFF_Format:	resd 1	; Must be equal to "WAVE" - big-endian
  7332                                  			; 0x57415645
  7333                                  
  7334                                  ;; WAVE header parameters ("Sub-chunk")
  7335                                  WAVE_SubchunkID:
  7336 00007754 ????????                		resd 1	; Must be equal to "fmt " - big-endian
  7337                                  			; 0x666d7420
  7338                                  WAVE_SubchunkSize:
  7339 00007758 ????????                		resd 1	; Represents total chunk size
  7340                                  WAVE_AudioFormat:
  7341 0000775C ????                    		resw 1	; PCM (Raw) - is 1, other - is a form
  7342                                  			; of compression, not supported.
  7343                                  WAVE_NumChannels:
  7344 0000775E ????                    		resw 1	; Number of channels, Mono-1, Stereo-2
  7345                                  WAVE_SampleRate:
  7346 00007760 ????????                		resd 1	; Frequency rate, in Hz (8000, 44100 ...)
  7347 00007764 ????????                WAVE_ByteRate:	resd 1	; SampleRate * NumChannels * BytesPerSample
  7348                                  WAVE_BlockAlign:
  7349 00007768 ????                    		resw 1	; NumChannels * BytesPerSample
  7350                                  			; Number of bytes for one sample.
  7351                                  WAVE_BitsPerSample:
  7352 0000776A ????                    		resw 1	; 8 = 8 bits, 16 = 16 bits, etc.
  7353                                  
  7354                                  ;; DATA header parameters
  7355                                  DATA_SubchunkID:
  7356 0000776C ????????                		resd 1	; Must be equal to "data" - big-endian
  7357                                          		; 0x64617461
  7358                                  DATA_SubchunkSize:
  7359 00007770 ????????                		resd 1	; NumSamples * NumChannels * BytesPerSample
  7360                                          		; Number of bytes in the data.
  7361                                  ;;;;;;;
  7362                                  
  7363                                  ;------------------------------------------------------------------------------
  7364                                  
  7365 00007774 <res 50h>               wav_file_name:	resb 80 ; wave file, path name (<= 80 bytes)
  7366                                  
  7367 000077C4 ????                    		resw 1
  7368                                  
  7369                                  ;------------------------------------------------------------------------------
  7370                                  
  7371                                  ac97_int_ln_reg:
  7372 000077C6 ??                      audio_intr:	resb 1
  7373 000077C7 ??                      VRA:		resb 1	; Variable Rate Audio Support Status
  7374 000077C8 ??                      fbs_shift:	resb 1
  7375 000077C9 ??                      flags:		resb 1
  7376                                  
  7377 000077CA ????????                dev_vendor:	resd 1
  7378 000077CE ????????                bus_dev_fn:	resd 1
  7379                                  audio_io_base:		; Sound Blaster 16 base port address (220h)
  7380 000077D2 ????                    NAMBAR:		resw 1
  7381 000077D4 ????                    NABMBAR:	resw 1
  7382                                  
  7383 000077D6 ??                      audio_hardware:	resb 1
  7384 000077D7 ??                      IRQnum:		resb 1
  7385 000077D8 ??                      volume:		resb 1
  7386 000077D9 ??                      stopped:	resb 1
  7387                                  
  7388                                  ;------------------------------------------------------------------------------
  7389                                  
  7390 000077DA ????????????            alignb 16
  7391                                  
  7392 000077E0 <res 200h>              RowOfs:		resw 256
  7393                                  
  7394 000079E0 <res 200h>              NewScope_L:	resw 256
  7395 00007BE0 <res 200h>              NewScope_R:	resw 256
  7396 00007DE0 <res 200h>              OldScope_L:	resw 256
  7397 00007FE0 <res 200h>              OldScope_R:	resw 256
  7398                                  
  7399                                  ;------------------------------------------------------------------------------
  7400                                  
  7401                                  loadfromwavfile:
  7402 000081E0 ????????                		resd 1	; 'loadfromfile' or load+conversion proc address
  7403 000081E4 ????????                loadsize:	resd 1	; (.wav file) read count (bytes) per one time
  7404 000081E8 ????????                buffersize:	resd 1	; 16 bit samples (not bytes)
  7405                                  
  7406 000081EC ????????                count:		resd 1	; byte count of one (wav file) read
  7407                                  LoadedDataBytes:
  7408 000081F0 ????????                		resd 1	; total read/load count
  7409                                  		
  7410 000081F4 ????????                timerticks:	resd 1	; (to eliminate excessive lookup of events in tuneloop)
  7411                                  			; (in order to get the emulator/qemu to run correctly)
  7412                                  
  7413 000081F8 ????????                audio_buffer:	resd 1	; temporary (saving) area for AC97 DMA buffer address
  7414                                  
  7415 000081FC ????????                _bdl_buffer:	resd 1	; physcal address of buffer descriptor list (AC97)	
  7416 00008200 ????????                DMA_phy_buff:	resd 1	; physical address of 'dma_buffer' (SB16)
  7417                                  
  7418                                  bss_end:
  7419                                  
  7420                                  ;------------------------------------------------------------------------------
  7421                                  
  7422                                  sound_data_copy:	; address pointer for g_buffer fast (conversion) copy
  7423 00008204 ????????                		resd 1
  7424 00008208 ????????                g_samples:	resd 1	; count of samples for g_buffer copy/transfer
  7425                                  
  7426 0000820C ????????                alignb 16
  7427                                  
  7428 00008210 <res 400h>              g_buffer:	resb 1024 ; 16 bit stereo samples for wave graphics display
  7429                                  
  7430                                  ;------------------------------------------------------------------------------
  7431                                  
  7432 00008610 <res 9F0h>              alignb 4096
  7433                                  
  7434                                  ; 256 byte buffer for descriptor list
  7435 00009000 <res 100h>              BDL_BUFFER:	resb 256
  7436 00009100 <res F00h>              		resb 4096-256
  7437                                  ; DMA buffers (AC97) - ((max. 10600 bytes will be used per buffer))
  7438 0000A000 <res 3000h>             WAV_BUFFER_1:	resb 12288 ; 3*4096 ; 1st wav/pcm data buffer
  7439 0000D000 <res C000h>             WAV_BUFFER_2:	resd 12288 ; 3*4096 ; segment of 2nd wav/pcm data buffer
  7440                                  
  7441                                  ;------------------------------------------------------------------------------
  7442                                  
  7443 00019000 <res 7000h>             alignb 65536
  7444                                  
  7445                                  temp_buffer:	
  7446                                  		; max. 10600 bytes (no-VRA AC97)
  7447                                  		; 10600: 44.1 kHZ stereo 2438 samples, 2650 (48kHZ) samples
  7448                                  		; 10656: 11.025 kHZ stereo 612 samples, 2664 (48kHZ) samples
  7449                                  		; 10508: 22.050 kHZ stereo 1207 samples, 2627 (48kHZ) samples
  7450                                  		; 10544: 24 kHZ stereo 1318 samples, 2636 (48kHZ) samples
  7451                                  		; 10548: 32 kHZ stereo 1758 samples, 2637 (48kHZ) samples
  7452                                  		; 10548: 16 kHZ stereo 879 samples, 2637 (48kHZ) samples
  7453                                  		; 10544: 12 kHZ stereo 659 samples, 2636 (48kHZ) samples
  7454                                  		; 10560: 8 kHZ stereo 440 samples, 2640 (48kHZ) samples
  7455                                  		
  7456                                  dma_buffer:	; max. 21120 bytes (SB16)
  7457 00020000 <res 2940h>             		resb 10560
  7458 00022940 <res 2940h>             		resb 10560
  7459 00025280 <res D80h>              		resb 3456 ; memory allocation = 6*4096 bytes
  7460                                  
  7461                                  ;------------------------------------------------------------------------------
