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) , , 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 .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 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 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 RowOfs: resw 256 7393 7394 000079E0 NewScope_L: resw 256 7395 00007BE0 NewScope_R: resw 256 7396 00007DE0 OldScope_L: resw 256 7397 00007FE0 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 g_buffer: resb 1024 ; 16 bit stereo samples for wave graphics display 7429 7430 ;------------------------------------------------------------------------------ 7431 7432 00008610 alignb 4096 7433 7434 ; 256 byte buffer for descriptor list 7435 00009000 BDL_BUFFER: resb 256 7436 00009100 resb 4096-256 7437 ; DMA buffers (AC97) - ((max. 10600 bytes will be used per buffer)) 7438 0000A000 WAV_BUFFER_1: resb 12288 ; 3*4096 ; 1st wav/pcm data buffer 7439 0000D000 WAV_BUFFER_2: resd 12288 ; 3*4096 ; segment of 2nd wav/pcm data buffer 7440 7441 ;------------------------------------------------------------------------------ 7442 7443 00019000 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 resb 10560 7458 00022940 resb 10560 7459 00025280 resb 3456 ; memory allocation = 6*4096 bytes 7460 7461 ;------------------------------------------------------------------------------