1 ; **************************************************************************** 2 ; twavplay.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; TWAVPLAY.PRG ! VIA VT8237R WAV PLAYER & VGA DEMO program by Erdogan TAN 5 ; 6 ; 23/08/2020 7 ; 8 ; [ Last Modification: 24/08/2020 ] 9 ; 10 ; Derived from 'tmodply3.s' and 'wavplay2.s' source code by Erdogan Tan 11 ; 12 ; Assembler: NASM 2.14 13 ; ---------------------------------------------------------------------------- 14 ; nasm twavplay.s -l twavplay.txt -o TWAVPLAY.PRG 15 ; **************************************************************************** 16 17 ; 01/03/2017 18 ; 16/10/2016 19 ; 29/04/2016 20 ; TRDOS 386 system calls (temporary list!) 21 _ver equ 0 22 _exit equ 1 23 _fork equ 2 24 _read equ 3 25 _write equ 4 26 _open equ 5 27 _close equ 6 28 _wait equ 7 29 _creat equ 8 30 _link equ 9 31 _unlink equ 10 32 _exec equ 11 33 _chdir equ 12 34 _time equ 13 35 _mkdir equ 14 36 _chmod equ 15 37 _chown equ 16 38 _break equ 17 39 _stat equ 18 40 _seek equ 19 41 _tell equ 20 42 _mount equ 21 43 _umount equ 22 44 _setuid equ 23 45 _getuid equ 24 46 _stime equ 25 47 _quit equ 26 48 _intr equ 27 49 _fstat equ 28 50 _emt equ 29 51 _mdate equ 30 52 _video equ 31 53 _audio equ 32 54 _timer equ 33 55 _sleep equ 34 56 _msg equ 35 57 _geterr equ 36 58 _fpsave equ 37 59 _pri equ 38 60 _rele equ 39 61 _fff equ 40 62 _fnf equ 41 63 _alloc equ 42 64 _dalloc equ 43 65 _calbac equ 44 66 67 %macro sys 1-4 68 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 69 ; 03/09/2015 70 ; 13/04/2015 71 ; Retro UNIX 386 v1 system call. 72 %if %0 >= 2 73 mov ebx, %2 74 %if %0 >= 3 75 mov ecx, %3 76 %if %0 = 4 77 mov edx, %4 78 %endif 79 %endif 80 %endif 81 mov eax, %1 82 ;int 30h 83 int 40h ; TRDOS 386 (TRDOS v2.0) 84 %endmacro 85 86 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 87 ; sys systemcall (eax) , , 88 89 ; 19/06/2017 90 BUFFERSIZE equ 32768 91 ; 23/08/2020 92 ENDOFFILE equ 1 ; flag for knowing end of file 93 94 ; ---------------------------------------------------------------------------- 95 ; Tiny MOD Player v0.1b by Carlos Hasan. 96 ; July 14th, 1993. 97 98 ;============================================================================= 99 ; 100 ;============================================================================= 101 102 [BITS 32] 103 [org 0] 104 105 Start: 106 ; clear bss 107 00000000 B9[00000800] mov ecx, EOF 108 00000005 BF[D54A0000] mov edi, bss_start 109 0000000A 29F9 sub ecx, edi 110 0000000C D1E9 shr ecx, 1 111 0000000E 31C0 xor eax, eax 112 00000010 F366AB rep stosw 113 114 ; Detect (& Enable) VT8233 Audio Device 115 00000013 E824020000 call DetectVT8233 116 00000018 731B jnc short GetFileName 117 118 _dev_not_ready: 119 ; couldn't find the audio device! 120 sys _msg, noDevMsg, 255, 0Fh 120 <1> 120 <1> 120 <1> 120 <1> 120 <1> %if %0 >= 2 120 0000001A BB[76490000] <1> mov ebx, %2 120 <1> %if %0 >= 3 120 0000001F B9FF000000 <1> mov ecx, %3 120 <1> %if %0 = 4 120 00000024 BA0F000000 <1> mov edx, %4 120 <1> %endif 120 <1> %endif 120 <1> %endif 120 00000029 B823000000 <1> mov eax, %1 120 <1> 120 0000002E CD40 <1> int 40h 121 00000030 E9E1010000 jmp Exit 122 123 GetFileName: 124 00000035 89E6 mov esi, esp 125 00000037 AD lodsd 126 00000038 83F802 cmp eax, 2 ; two arguments 127 ; (program file name & mod file name) 128 0000003B 0F82E3010000 jb pmsg_usage ; nothing to do 129 130 00000041 AD lodsd ; program file name address 131 00000042 AD lodsd ; wav file name address (file to be read) 132 00000043 89C6 mov esi, eax 133 00000045 BF[084B0000] mov edi, wav_file_name 134 ScanName: 135 0000004A AC lodsb 136 0000004B 84C0 test al, al 137 0000004D 0F84D1010000 je pmsg_usage 138 00000053 3C20 cmp al, 20h 139 00000055 74F3 je short ScanName ; scan start of name. 140 00000057 AA stosb 141 00000058 B4FF mov ah, 0FFh 142 a_0: 143 0000005A FEC4 inc ah 144 a_1: 145 0000005C AC lodsb 146 0000005D AA stosb 147 0000005E 3C2E cmp al, '.' 148 00000060 74F8 je short a_0 149 00000062 20C0 and al, al 150 00000064 75F6 jnz short a_1 151 152 00000066 08E4 or ah, ah ; if period NOT found, 153 00000068 750B jnz short PrintPMesg ; then add a .MOD extension. 154 SetExt: 155 0000006A 4F dec edi 156 0000006B C7072E574156 mov dword [edi], '.WAV' 157 00000071 C6470400 mov byte [edi+4], 0 158 PrintPMesg: 159 ; 23/08/2020 160 00000075 C605[48490000]00 mov byte [credits_zero], 0 161 162 ; Prints the Credits Text. 163 sys _msg, Credits, 255, 0Fh 163 <1> 163 <1> 163 <1> 163 <1> 163 <1> %if %0 >= 2 163 0000007C BB[EA480000] <1> mov ebx, %2 163 <1> %if %0 >= 3 163 00000081 B9FF000000 <1> mov ecx, %3 163 <1> %if %0 = 4 163 00000086 BA0F000000 <1> mov edx, %4 163 <1> %endif 163 <1> %endif 163 <1> %endif 163 0000008B B823000000 <1> mov eax, %1 163 <1> 163 00000090 CD40 <1> int 40h 164 _1: 165 ; 19/06/2017 166 ; Allocate Audio Buffer (for user) 167 sys _audio, 0200h, BUFFERSIZE, audio_buffer 167 <1> 167 <1> 167 <1> 167 <1> 167 <1> %if %0 >= 2 167 00000092 BB00020000 <1> mov ebx, %2 167 <1> %if %0 >= 3 167 00000097 B900800000 <1> mov ecx, %3 167 <1> %if %0 = 4 167 0000009C BA[00600000] <1> mov edx, %4 167 <1> %endif 167 <1> %endif 167 <1> %endif 167 000000A1 B820000000 <1> mov eax, %1 167 <1> 167 000000A6 CD40 <1> int 40h 168 000000A8 0F82B8000000 jc error_exit 169 _2: 170 ; 23/08/2020 171 ; Initialize Audio Device (bl = 1 -> Interrupt method) 172 ;sys _audio, 0301h, 0, audio_int_handler 173 ;jc error_exit 174 175 ; 24/08/2020 176 177 ; 20/10/2017 178 ; Initialize Audio Device (bl = 0 -> SRB method) 179 sys _audio, 0300h, 1, srb 179 <1> 179 <1> 179 <1> 179 <1> 179 <1> %if %0 >= 2 179 000000AE BB00030000 <1> mov ebx, %2 179 <1> %if %0 >= 3 179 000000B3 B901000000 <1> mov ecx, %3 179 <1> %if %0 = 4 179 000000B8 BA[634B0000] <1> mov edx, %4 179 <1> %endif 179 <1> %endif 179 <1> %endif 179 000000BD B820000000 <1> mov eax, %1 179 <1> 179 000000C2 CD40 <1> int 40h 180 000000C4 0F829C000000 jc error_exit 181 182 ; 23/08/2020 183 184 ; open the wav file 185 ; open existing file 186 000000CA E87A010000 call openFile ; no error? ok. 187 000000CF 731B jnc short _3 188 189 ; file not found! 190 sys _msg, noFileErrMsg, 255, 0Fh 190 <1> 190 <1> 190 <1> 190 <1> 190 <1> %if %0 >= 2 190 000000D1 BB[AD490000] <1> mov ebx, %2 190 <1> %if %0 >= 3 190 000000D6 B9FF000000 <1> mov ecx, %3 190 <1> %if %0 = 4 190 000000DB BA0F000000 <1> mov edx, %4 190 <1> %endif 190 <1> %endif 190 <1> %endif 190 000000E0 B823000000 <1> mov eax, %1 190 <1> 190 000000E5 CD40 <1> int 40h 191 000000E7 E92A010000 jmp Exit 192 193 _3: 194 000000EC E892010000 call getSampleRate ; read the sample rate 195 ; pass it onto codec. 196 000000F1 0F821F010000 jc Exit 197 198 000000F7 66A3[EA4A0000] mov [sample_rate], ax 199 000000FD 880D[E84A0000] mov [stmo], cl 200 00000103 8815[E94A0000] mov [bps], dl 201 202 ; 10/06/2017 203 sys _audio, 0E00h ; get audio controller info 203 <1> 203 <1> 203 <1> 203 <1> 203 <1> %if %0 >= 2 203 00000109 BB000E0000 <1> mov ebx, %2 203 <1> %if %0 >= 3 203 <1> mov ecx, %3 203 <1> %if %0 = 4 203 <1> mov edx, %4 203 <1> %endif 203 <1> %endif 203 <1> %endif 203 0000010E B820000000 <1> mov eax, %1 203 <1> 203 00000113 CD40 <1> int 40h 204 00000115 724F jc error_exit 205 206 ;cmp ah, 3 ; VT 8233? (VIA AC'97 Audio Controller) 207 ;jne _dev_not_ready 208 209 ; EAX = IRQ Number in AL 210 ; Audio Device Number in AH 211 ; EBX = DEV/VENDOR ID 212 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 213 ; ECX = BUS/DEV/FN 214 ; (00000000BBBBBBBBDDDDDFFF00000000) 215 ; EDX = Base IO Addr (DX) for SB16 & VT8233 216 ; EDX = NABMBAR/NAMBAR (for AC97) 217 ; (Low word, DX = NAMBAR address) 218 219 00000117 A2[624B0000] mov [ac97_int_ln_reg], al 220 0000011C 891D[584B0000] mov [dev_vendor], ebx 221 00000122 890D[5C4B0000] mov [bus_dev_fn], ecx 222 00000128 668915[604B0000] mov [ac97_io_base], dx 223 224 0000012F E847030000 call write_audio_dev_info 225 226 ; 24/08/2020 227 00000134 E8C3040000 call write_wav_file_info 228 229 ; 23/08/2020 230 PlayNow: 231 ; 27/10/2017 232 00000139 66B90001 mov cx, 256 233 0000013D 31DB xor ebx, ebx 234 0000013F BF[704B0000] mov edi, RowOfs 235 MakeOfs: 236 ; 29/10/2017 237 ;mov ax, 128 238 ;mul bx 239 ;mov al, ah 240 ;mov ah, 80 241 ;mul ah 242 00000144 89D8 mov eax, ebx 243 00000146 66C1E007 shl ax, 7 ; * 128 244 0000014A B050 mov al, 80 245 0000014C F6E4 mul ah 246 0000014E 66AB stosw 247 00000150 43 inc ebx 248 00000151 E2F1 loop MakeOfs 249 250 ; 23/08/2020 251 252 ; DIRECT VGA MEMORY ACCESS 253 ; bl = 0, bh = 5 254 ; Direct access/map to VGA memory (0A0000h) 255 256 sys _video, 0500h 256 <1> 256 <1> 256 <1> 256 <1> 256 <1> %if %0 >= 2 256 00000153 BB00050000 <1> mov ebx, %2 256 <1> %if %0 >= 3 256 <1> mov ecx, %3 256 <1> %if %0 = 4 256 <1> mov edx, %4 256 <1> %endif 256 <1> %endif 256 <1> %endif 256 00000158 B81F000000 <1> mov eax, %1 256 <1> 256 0000015D CD40 <1> int 40h 257 0000015F 3D00000A00 cmp eax, 0A0000h 258 00000164 741B je short _4 259 error_exit: 260 sys _msg, trdos386_err_msg, 255, 0Eh 260 <1> 260 <1> 260 <1> 260 <1> 260 <1> %if %0 >= 2 260 00000166 BB[C6490000] <1> mov ebx, %2 260 <1> %if %0 >= 3 260 0000016B B9FF000000 <1> mov ecx, %3 260 <1> %if %0 = 4 260 00000170 BA0E000000 <1> mov edx, %4 260 <1> %endif 260 <1> %endif 260 <1> %endif 260 00000175 B823000000 <1> mov eax, %1 260 <1> 260 0000017A CD40 <1> int 40h 261 0000017C E995000000 jmp Exit 262 263 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 264 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 265 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 266 ; second, or the module will sound "looped". 267 ; Because we need better sync with the ModPlayer to draw the scope, 268 ; the polling is called from my routine, and then the irq 0 must be 269 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 270 ; samples played by the Sound Blaster. Note that some samples are 271 ; discarded in the next code, just for fun! 272 273 _4: 274 ;mov ax, 0013h ; Set Mode 320x200x256 275 ;int 31h 276 277 ; 21/10/2017 278 ;mov ax, 0012h ; Set Mode 640x480x16 279 ;int 31h 280 281 ; 22/10/2017 282 00000181 E841050000 call setgraphmode ; Set video mode to 640*480x16 283 284 ; 22/10/2017 285 ;call loadlbm 286 ;jc short loadlbm_err 287 288 00000186 BE[F4080000] mov esi, LOGO_ADDRESS 289 0000018B E829060000 call putlbm 290 ;jnc short loadlbm_ok 291 00000190 731D jnc short _5 ; 292 293 ;mov byte [error_color], 0Eh ; Yellow 294 295 loadlbm_err: 296 ; 21/10/2017 297 ;mov ax, 0003h ; Set Text Mode 80x25x16 298 ;int 31h 299 ; 22/10/2017 300 00000192 E84D050000 call settextmode 301 302 sys _msg, LOGO_ERROR_MSG, 255, 0Ch 302 <1> 302 <1> 302 <1> 302 <1> 302 <1> %if %0 >= 2 302 00000197 BB[C7080000] <1> mov ebx, %2 302 <1> %if %0 >= 3 302 0000019C B9FF000000 <1> mov ecx, %3 302 <1> %if %0 = 4 302 000001A1 BA0C000000 <1> mov edx, %4 302 <1> %endif 302 <1> %endif 302 <1> %endif 302 000001A6 B823000000 <1> mov eax, %1 302 <1> 302 000001AB CD40 <1> int 40h 303 000001AD EB67 jmp short Exit 304 305 loadlbm_ok: 306 ; 21/10/2017 307 _5: 308 ; 09/10/2017 (2*BUFFERSIZE, 64K) 309 ; 23/06/2017 310 ; Map DMA buffer to user's memory space 311 sys _audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer 311 <1> 311 <1> 311 <1> 311 <1> 311 <1> %if %0 >= 2 311 000001AF BB000D0000 <1> mov ebx, %2 311 <1> %if %0 >= 3 311 000001B4 B900000100 <1> mov ecx, %3 311 <1> %if %0 = 4 311 000001B9 BA[00000100] <1> mov edx, %4 311 <1> %endif 311 <1> %endif 311 <1> %endif 311 000001BE B820000000 <1> mov eax, %1 311 <1> 311 000001C3 CD40 <1> int 40h 312 ;jc error_exit 313 314 ; 23/08/2020 315 316 ; position file pointer to start in actual wav data 317 ; MUCH improvement should really be done here to check if sample size is 318 ; supported, make sure there are 2 channels, etc. 319 ; 320 ;mov ah, 42h 321 ;mov al, 0 ; from start of file 322 ;mov bx, [FileHandle] 323 ;xor cx, cx 324 ;mov dx, 44 ; jump past .wav/riff header 325 ;int 21h 326 327 sys _seek, [FileHandle], 44, 0 327 <1> 327 <1> 327 <1> 327 <1> 327 <1> %if %0 >= 2 327 000001C5 8B1D[E5480000] <1> mov ebx, %2 327 <1> %if %0 >= 3 327 000001CB B92C000000 <1> mov ecx, %3 327 <1> %if %0 = 4 327 000001D0 BA00000000 <1> mov edx, %4 327 <1> %endif 327 <1> %endif 327 <1> %endif 327 000001D5 B813000000 <1> mov eax, %1 327 <1> 327 000001DA CD40 <1> int 40h 328 329 ; play the .wav file. Most of the good stuff is in here. 330 331 000001DC E851010000 call PlayWav 332 333 ; close the .wav file and exit. 334 335 StopPlaying: 336 ; Stop Playing 337 sys _audio, 0700h 337 <1> 337 <1> 337 <1> 337 <1> 337 <1> %if %0 >= 2 337 000001E1 BB00070000 <1> mov ebx, %2 337 <1> %if %0 >= 3 337 <1> mov ecx, %3 337 <1> %if %0 = 4 337 <1> mov edx, %4 337 <1> %endif 337 <1> %endif 337 <1> %endif 337 000001E6 B820000000 <1> mov eax, %1 337 <1> 337 000001EB CD40 <1> int 40h 338 ; Cancel callback service (for user) 339 sys _audio, 0900h 339 <1> 339 <1> 339 <1> 339 <1> 339 <1> %if %0 >= 2 339 000001ED BB00090000 <1> mov ebx, %2 339 <1> %if %0 >= 3 339 <1> mov ecx, %3 339 <1> %if %0 = 4 339 <1> mov edx, %4 339 <1> %endif 339 <1> %endif 339 <1> %endif 339 000001F2 B820000000 <1> mov eax, %1 339 <1> 339 000001F7 CD40 <1> int 40h 340 ; Deallocate Audio Buffer (for user) 341 sys _audio, 0A00h 341 <1> 341 <1> 341 <1> 341 <1> 341 <1> %if %0 >= 2 341 000001F9 BB000A0000 <1> mov ebx, %2 341 <1> %if %0 >= 3 341 <1> mov ecx, %3 341 <1> %if %0 = 4 341 <1> mov edx, %4 341 <1> %endif 341 <1> %endif 341 <1> %endif 341 000001FE B820000000 <1> mov eax, %1 341 <1> 341 00000203 CD40 <1> int 40h 342 ; Disable Audio Device 343 sys _audio, 0C00h 343 <1> 343 <1> 343 <1> 343 <1> 343 <1> %if %0 >= 2 343 00000205 BB000C0000 <1> mov ebx, %2 343 <1> %if %0 >= 3 343 <1> mov ecx, %3 343 <1> %if %0 = 4 343 <1> mov edx, %4 343 <1> %endif 343 <1> %endif 343 <1> %endif 343 0000020A B820000000 <1> mov eax, %1 343 <1> 343 0000020F CD40 <1> int 40h 344 345 ; 23/08/2020 346 00000211 E8CE040000 call settextmode 347 Exit: 348 00000216 E847000000 call closeFile 349 350 sys _exit ; Bye! 350 <1> 350 <1> 350 <1> 350 <1> 350 <1> %if %0 >= 2 350 <1> mov ebx, %2 350 <1> %if %0 >= 3 350 <1> mov ecx, %3 350 <1> %if %0 = 4 350 <1> mov edx, %4 350 <1> %endif 350 <1> %endif 350 <1> %endif 350 0000021B B801000000 <1> mov eax, %1 350 <1> 350 00000220 CD40 <1> int 40h 351 here: 352 00000222 EBFE jmp short here 353 354 pmsg_usage: 355 sys _msg, msg_usage, 255, 0Bh 355 <1> 355 <1> 355 <1> 355 <1> 355 <1> %if %0 >= 2 355 00000224 BB[EA480000] <1> mov ebx, %2 355 <1> %if %0 >= 3 355 00000229 B9FF000000 <1> mov ecx, %3 355 <1> %if %0 = 4 355 0000022E BA0B000000 <1> mov edx, %4 355 <1> %endif 355 <1> %endif 355 <1> %endif 355 00000233 B823000000 <1> mov eax, %1 355 <1> 355 00000238 CD40 <1> int 40h 356 0000023A EBDA jmp short Exit 357 358 DetectVT8233: 359 ; Detect (BH=1) VT8233 (BL=3) Audio Controller 360 sys _audio, 0103h 360 <1> 360 <1> 360 <1> 360 <1> 360 <1> %if %0 >= 2 360 0000023C BB03010000 <1> mov ebx, %2 360 <1> %if %0 >= 3 360 <1> mov ecx, %3 360 <1> %if %0 = 4 360 <1> mov edx, %4 360 <1> %endif 360 <1> %endif 360 <1> %endif 360 00000241 B820000000 <1> mov eax, %1 360 <1> 360 00000246 CD40 <1> int 40h 361 00000248 C3 retn 362 363 ; 23/08/2020 364 365 ;open or create file 366 ; 367 ;input: ds:dx-->filename (asciiz) 368 ; al=file Mode (create or open) 369 ;output: none cs:[FileHandle] filled 370 ; 371 openFile: 372 ;mov ah, 3Bh ; start with a mode 373 ;add ah, al ; add in create or open mode 374 ;xor cx, cx 375 ;int 21h 376 ;jc short _of1 377 ;;mov [cs:FileHandle], ax 378 379 sys _open, wav_file_name, 0 379 <1> 379 <1> 379 <1> 379 <1> 379 <1> %if %0 >= 2 379 00000249 BB[084B0000] <1> mov ebx, %2 379 <1> %if %0 >= 3 379 0000024E B900000000 <1> mov ecx, %3 379 <1> %if %0 = 4 379 <1> mov edx, %4 379 <1> %endif 379 <1> %endif 379 <1> %endif 379 00000253 B805000000 <1> mov eax, %1 379 <1> 379 00000258 CD40 <1> int 40h 380 0000025A 7205 jc short _of1 381 382 0000025C A3[E5480000] mov [FileHandle], eax 383 _of1: 384 00000261 C3 retn 385 386 ; close the currently open file 387 ; input: none, uses cs:[FileHandle] 388 closeFile: 389 00000262 833D[E5480000]FF cmp dword [FileHandle], -1 390 00000269 7417 je short _cf1 391 ;mov bx, [FileHandle] 392 ;mov ax, 3E00h 393 ;int 21h ;close file 394 395 sys _close, [FileHandle] 395 <1> 395 <1> 395 <1> 395 <1> 395 <1> %if %0 >= 2 395 0000026B 8B1D[E5480000] <1> mov ebx, %2 395 <1> %if %0 >= 3 395 <1> mov ecx, %3 395 <1> %if %0 = 4 395 <1> mov edx, %4 395 <1> %endif 395 <1> %endif 395 <1> %endif 395 00000271 B806000000 <1> mov eax, %1 395 <1> 395 00000276 CD40 <1> int 40h 396 00000278 C705[E5480000]FFFF- mov dword [FileHandle], -1 396 00000280 FFFF 397 _cf1: 398 00000282 C3 retn 399 400 getSampleRate: 401 402 ; reads the sample rate from the .wav file. 403 ; entry: none - assumes file is already open 404 ; exit: ax = sample rate (11025, 22050, 44100, 48000) 405 ; cx = number of channels (mono=1, stereo=2) 406 ; dx = bits per sample (8, 16) 407 408 00000283 53 push ebx 409 410 ;mov ah, 42h 411 ;mov al, 0 ; from start of file 412 ;mov bx, [FileHandle] 413 ;xor cx, cx 414 ;mov dx, 08h ; "WAVE" 415 ;int 21h 416 417 sys _seek, [FileHandle], 8, 0 417 <1> 417 <1> 417 <1> 417 <1> 417 <1> %if %0 >= 2 417 00000284 8B1D[E5480000] <1> mov ebx, %2 417 <1> %if %0 >= 3 417 0000028A B908000000 <1> mov ecx, %3 417 <1> %if %0 = 4 417 0000028F BA00000000 <1> mov edx, %4 417 <1> %endif 417 <1> %endif 417 <1> %endif 417 00000294 B813000000 <1> mov eax, %1 417 <1> 417 00000299 CD40 <1> int 40h 418 419 ;mov dx, smpRBuff 420 ;mov cx, 28 ; 28 bytes 421 ;mov ah, 3fh 422 ;int 21h 423 424 sys _read, [FileHandle], smpRBuff, 28 424 <1> 424 <1> 424 <1> 424 <1> 424 <1> %if %0 >= 2 424 0000029B 8B1D[E5480000] <1> mov ebx, %2 424 <1> %if %0 >= 3 424 000002A1 B9[EC4A0000] <1> mov ecx, %3 424 <1> %if %0 = 4 424 000002A6 BA1C000000 <1> mov edx, %4 424 <1> %endif 424 <1> %endif 424 <1> %endif 424 000002AB B803000000 <1> mov eax, %1 424 <1> 424 000002B0 CD40 <1> int 40h 425 426 000002B2 813D[EC4A0000]5741- cmp dword [smpRBuff], 'WAVE' 426 000002BA 5645 427 000002BC 7520 jne short gsr_stc 428 429 000002BE 66833D[F84A0000]01 cmp word [smpRBuff+12], 1 ; Offset 20, must be 1 (= PCM) 430 000002C6 7516 jne short gsr_stc 431 432 000002C8 668B0D[FA4A0000] mov cx, [smpRBuff+14] ; return num of channels in CX 433 000002CF 66A1[FC4A0000] mov ax, [smpRBuff+16] ; return sample rate in AX 434 000002D5 668B15[064B0000] mov dx, [smpRBuff+26] ; return bits per sample value in DX 435 gsr_retn: 436 000002DC 5B pop ebx 437 000002DD C3 retn 438 gsr_stc: 439 000002DE F9 stc 440 000002DF EBFB jmp short gsr_retn 441 442 ;============================================================================= 443 444 ; ; 23/08/2020 445 ;audio_int_handler: 446 ; ; 14/10/2017 447 ; mov byte [srb], 1 448 ; 449 ; sys _rele ; return from callback service 450 ; ; we must not come here ! 451 ; sys _exit 452 453 ;============================================================================= 454 455 ; 23/08/2020 456 loadFromFile: 457 000002E1 BF[00600000] mov edi, audio_buffer 458 000002E6 BA00800000 mov edx, BUFFERSIZE 459 460 ; 17/03/2017 461 ; edi = buffer address 462 ; edx = buffer size 463 ; 10/03/2017 464 ;push eax 465 ;push ecx 466 ;push edx 467 ;push ebx 468 000002EB F605[644B0000]01 test byte [flags], ENDOFFILE ; have we already read the 469 000002F2 F9 stc ; last of the file? 470 000002F3 7531 jnz short endLFF 471 ;clc 472 ; load file into memory 473 sys _read, [FileHandle], edi 473 <1> 473 <1> 473 <1> 473 <1> 473 <1> %if %0 >= 2 473 000002F5 8B1D[E5480000] <1> mov ebx, %2 473 <1> %if %0 >= 3 473 000002FB 89F9 <1> mov ecx, %3 473 <1> %if %0 = 4 473 <1> mov edx, %4 473 <1> %endif 473 <1> %endif 473 <1> %endif 473 000002FD B803000000 <1> mov eax, %1 473 <1> 473 00000302 CD40 <1> int 40h 474 00000304 89D1 mov ecx, edx 475 00000306 720A jc short padfill ; error ! 476 00000308 21C0 and eax, eax 477 0000030A 7406 jz short padfill 478 0000030C 29C1 sub ecx, eax 479 0000030E 7416 jz short endLFF 480 00000310 01C7 add edi, eax 481 padfill: 482 00000312 803D[E94A0000]10 cmp byte [bps], 16 483 00000319 740C je short _lff2 484 ; Minimum Value = 0 485 0000031B 30C0 xor al, al 486 0000031D F3AA rep stosb 487 _lff1: 488 ;clc ; don't exit with CY yet. 489 0000031F 800D[644B0000]01 or byte [flags], ENDOFFILE ; end of file flag 490 endLFF: 491 ;pop ebx 492 ;pop edx 493 ;pop ecx 494 ;pop eax 495 00000326 C3 retn 496 _lff2: 497 ; Minimum value = 8000h (-32768) 498 00000327 D1E9 shr ecx, 1 499 00000329 66B80080 mov ax, 8000h ; -32768 500 0000032D F366AB rep stosw 501 00000330 EBED jmp short _lff1 502 503 ;============================================================================= 504 ; 505 ;============================================================================= 506 507 PlayWav: 508 ; 23/08/2020 509 510 ; load 32768 bytes into audio buffer 511 ;mov edi, audio_buffer 512 ;mov edx, BUFFERSIZE 513 00000332 E8AAFFFFFF call loadFromFile 514 00000337 0F8229FEFFFF jc error_exit 515 516 ; 27/07/2020 517 0000033D F605[644B0000]01 test byte [flags], ENDOFFILE ; end of file 518 00000344 7511 jnz short _6 ; yes 519 ; bypass filling dma half buffer 2 520 521 ; bh = 16 : update (current, first) dma half buffer 522 ; bl = 0 : then switch to the next (second) half buffer 523 sys _audio, 1000h 523 <1> 523 <1> 523 <1> 523 <1> 523 <1> %if %0 >= 2 523 00000346 BB00100000 <1> mov ebx, %2 523 <1> %if %0 >= 3 523 <1> mov ecx, %3 523 <1> %if %0 = 4 523 <1> mov edx, %4 523 <1> %endif 523 <1> %endif 523 <1> %endif 523 0000034B B820000000 <1> mov eax, %1 523 <1> 523 00000350 CD40 <1> int 40h 524 525 ; 27/07/2020 526 ; [audio_flag] = 1 (in TRDOS 386 kernel) 527 528 ; audio_buffer must be filled again after above system call 529 ; (Because audio interrupt will be generated by VT8237R 530 ; at the end of the first half of dma buffer.. so, 531 ; the second half must be ready. 'sound_play' will use it.) 532 533 ; 13/10/2017 534 ;mov edi, audio_buffer 535 ;mov edx, BUFFERSIZE 536 00000352 E88AFFFFFF call loadFromFile 537 ;jc short p_return ; 27/07/2020 538 _6: 539 ; Set Master Volume Level 540 sys _audio, 0B00h, 1D1Dh 540 <1> 540 <1> 540 <1> 540 <1> 540 <1> %if %0 >= 2 540 00000357 BB000B0000 <1> mov ebx, %2 540 <1> %if %0 >= 3 540 0000035C B91D1D0000 <1> mov ecx, %3 540 <1> %if %0 = 4 540 <1> mov edx, %4 540 <1> %endif 540 <1> %endif 540 <1> %endif 540 00000361 B820000000 <1> mov eax, %1 540 <1> 540 00000366 CD40 <1> int 40h 541 ; 24/06/2017 542 ;mov byte [volume_level], 1Dh 543 00000368 880D[71550000] mov [volume_level], cl 544 545 ;mov byte [srb], 0 546 547 ; Start to play 548 0000036E A0[E94A0000] mov al, [bps] 549 00000373 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 550 00000376 D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 551 00000378 8A1D[E84A0000] mov bl, [stmo] 552 0000037E FECB dec bl 553 00000380 08C3 or bl, al 554 00000382 668B0D[EA4A0000] mov cx, [sample_rate] 555 00000389 B704 mov bh, 4 ; start to play 556 sys _audio 556 <1> 556 <1> 556 <1> 556 <1> 556 <1> %if %0 >= 2 556 <1> mov ebx, %2 556 <1> %if %0 >= 3 556 <1> mov ecx, %3 556 <1> %if %0 = 4 556 <1> mov edx, %4 556 <1> %endif 556 <1> %endif 556 <1> %endif 556 0000038B B820000000 <1> mov eax, %1 556 <1> 556 00000390 CD40 <1> int 40h 557 558 ; 27/07/2020 559 ; Here.. 560 ; If byte [flags] <> ENDOFFILE ... 561 ; user's audio_buffer has been copied to dma half buffer 2 562 563 ; [audio_flag] = 0 (in TRDOS 386 kernel) 564 565 ; audio_buffer must be filled again after above system call 566 ; (Because, audio interrupt will be generated by VT8237R 567 ; at the end of the first half of dma buffer.. so, 568 ; the 2nd half of dma buffer is ready but the 1st half 569 ; must be filled again.) 570 571 ; 27/07/2020 572 00000392 F605[644B0000]01 test byte [flags], ENDOFFILE ; end of file 573 00000399 750B jnz short p_loop ; yes 574 575 ; 13/10/2017 576 ;mov edi, audio_buffer 577 ;mov edx, BUFFERSIZE 578 0000039B E841FFFFFF call loadFromFile 579 ;jc short p_return ; 27/07/2020 580 581 ; we need to wait for 'SRB' (audio interrupt) 582 ; (we can not return from 'PlayWav' here 583 ; even if we have got an error from file reading) 584 ; ((!!current audio data must be played!!)) 585 586 ;mov ebx, 0B8000h ; video display page address 587 ;mov ah, 4Eh 588 ;add al, [half_buffer] 589 ;mov [ebx], ax ; show playing buffer (1, 2) 590 591 ;; load 32768 bytes into audio buffer 592 ;; (for the second half of DMA buffer) 593 ;; 20/05/2017 594 ;mov edi, audio_buffer 595 ;mov edx, BUFFERSIZE 596 ;call loadFromFile 597 ;jc short p_return 598 ;mov byte [half_buff], 2 ; (DMA) Buffer 2 599 600 ; 23/08/2020 601 602 ; 27/10/2017 603 604 ; 03/08/2020 605 ;jmp short modp_gs ; 23/06/2017 606 607 ; 24/08/2020 608 000003A0 FE05[654B0000] inc byte [counter] 609 p_loop: 610 000003A6 803D[634B0000]00 cmp byte [srb], 0 611 000003AD 7610 jna short q_loop 612 613 000003AF C605[634B0000]00 mov byte [srb], 0 614 modp_gs: 615 ; 24/08/2020 616 ;mov edi, audio_buffer 617 ;mov edx, BUFFERSIZE 618 000003B6 E826FFFFFF call loadFromFile 619 000003BB 723A jc short q_return 620 621 ; 23/08/2020 622 000003BD EB6B jmp r_loop 623 q_loop: 624 ; 24/08/2020 625 000003BF F605[654B0000]3F test byte [counter], 63 626 000003C6 7562 jnz short r_loop 627 k_loop: 628 000003C8 B401 mov ah, 1 ; any key pressed? 629 000003CA CD32 int 32h ; no, Loop. 630 000003CC 745C jz short r_loop 631 632 000003CE B400 mov ah, 0 ; flush key buffer... 633 000003D0 CD32 int 32h 634 635 ; 19/10/2017 (modplay6.s) 636 000003D2 3C20 cmp al, 20h 637 000003D4 740E je short change_pan 638 ; 09/10/2017 (playmod5.s) 639 000003D6 3C2B cmp al, '+' ; increase sound volume 640 000003D8 741E je short inc_volume_level 641 000003DA 3C2D cmp al, '-' 642 000003DC 743D je short dec_volume_level 643 644 ; 19/10/2017 (modplay6.s) 645 000003DE 24DF and al, 0DFh 646 000003E0 3C50 cmp al, 'P' 647 000003E2 7513 jne short q_return 648 649 change_pan: 650 ; 19/10/2017 (modplay6.s) 651 000003E4 8A0D[70550000] mov cl, [pan_shift] 652 000003EA FEC1 inc cl 653 000003EC 80E103 and cl, 3 654 000003EF 880D[70550000] mov [pan_shift], cl 655 000003F5 EB33 jmp short r_loop 656 657 q_return: 658 000003F7 C3 retn 659 660 ; 09/10/2017 (playmod5.s) 661 ; 24/06/2017 (wavplay2.s) 662 inc_volume_level: 663 000003F8 8A0D[71550000] mov cl, [volume_level] 664 000003FE 80F91F cmp cl, 1Fh ; 31 665 00000401 7327 jnb short r_loop 666 00000403 FEC1 inc cl 667 change_volume_level: 668 00000405 880D[71550000] mov [volume_level], cl 669 0000040B 88CD mov ch, cl 670 ; Set Master Volume Level 671 sys _audio, 0B00h 671 <1> 671 <1> 671 <1> 671 <1> 671 <1> %if %0 >= 2 671 0000040D BB000B0000 <1> mov ebx, %2 671 <1> %if %0 >= 3 671 <1> mov ecx, %3 671 <1> %if %0 = 4 671 <1> mov edx, %4 671 <1> %endif 671 <1> %endif 671 <1> %endif 671 00000412 B820000000 <1> mov eax, %1 671 <1> 671 00000417 CD40 <1> int 40h 672 00000419 EB0F jmp short r_loop 673 dec_volume_level: 674 0000041B 8A0D[71550000] mov cl, [volume_level] 675 00000421 80F901 cmp cl, 1 ; 1 676 00000424 7604 jna short r_loop 677 00000426 FEC9 dec cl 678 00000428 EBDB jmp short change_volume_level 679 680 r_loop: 681 ; 24/08/2020 682 0000042A FE05[654B0000] inc byte [counter] 683 00000430 758D jnz short q_loop 684 685 ; 23/08/2020 686 00000432 F605[E84A0000]02 test byte [stmo], 2 687 00000439 0F8467FFFFFF jz p_loop 688 0000043F 803D[E94A0000]10 cmp byte [bps], 16 689 00000446 0F855AFFFFFF jne p_loop 690 691 ; 27/10/2017 692 ; Get Current DMA buffer Pointer 693 ; 23/06/2017 ('modplay6.s') 694 ; bh = 15, get current pointer (DMA buffer offset) 695 ; bl = 0, for PCM OUT 696 ; ecx = 0 697 ; 698 sys _audio, 0F00h, 0 698 <1> 698 <1> 698 <1> 698 <1> 698 <1> %if %0 >= 2 698 0000044C BB000F0000 <1> mov ebx, %2 698 <1> %if %0 >= 3 698 00000451 B900000000 <1> mov ecx, %3 698 <1> %if %0 = 4 698 <1> mov edx, %4 698 <1> %endif 698 <1> %endif 698 <1> %endif 698 00000456 B820000000 <1> mov eax, %1 698 <1> 698 0000045B CD40 <1> int 40h 699 700 ; 28/10/2017 701 0000045D 24FC and al, 0FCh ; dword alignment (stereo, 16 bit) 702 ; 23/06/2017 703 0000045F BE[00000100] mov esi, DMA_Buffer 704 00000464 01C6 add esi, eax ; add offset value 705 ; 24/06/2017 706 00000466 B9[00FC0100] mov ecx, DMA_Buffer + (65536 - (256*4)) 707 0000046B 39CE cmp esi, ecx 708 0000046D 7602 jna short _7 709 0000046F 89CE mov esi, ecx 710 _7: 711 ; 23/10/2017 ('tmodplay.s') 712 00000471 E875020000 call drawscopes 713 714 00000476 E92BFFFFFF jmp p_loop 715 716 ;============================================================================= 717 ; 718 ;============================================================================= 719 720 ;dword2str: 721 ; ; 13/11/2016 - Erdogan Tan 722 ; ; eax = dword value 723 ; ; 724 ; call dwordtohex 725 ; mov [dword_str], edx 726 ; mov [dword_str+4], eax 727 ; mov si, dword_str 728 ; retn 729 730 ; 05/03/2017 (TRDOS 386) 731 ; trdos386.s (unix386.s) - 10/05/2015 732 ; Convert binary number to hexadecimal string 733 734 ;bytetohex: 735 ; ; INPUT -> 736 ; ; AL = byte (binary number) 737 ; ; OUTPUT -> 738 ; ; AX = hexadecimal string 739 ; ; 740 ; push ebx 741 ; movzx ebx, al 742 ; shr bl, 4 743 ; mov bl, [ebx+hex_chars] 744 ; xchg bl, al 745 ; and bl, 0Fh 746 ; mov ah, [ebx+hex_chars] 747 ; pop ebx 748 ; retn 749 750 ;wordtohex: 751 ; ; INPUT -> 752 ; ; AX = word (binary number) 753 ; ; OUTPUT -> 754 ; ; EAX = hexadecimal string 755 ; ; 756 ; push ebx 757 ; xor ebx, ebx 758 ; xchg ah, al 759 ; push eax 760 ; mov bl, ah 761 ; shr bl, 4 762 ; mov al, [ebx+hex_chars] 763 ; mov bl, ah 764 ; and bl, 0Fh 765 ; mov ah, [ebx+hex_chars] 766 ; shl eax, 16 767 ; pop eax 768 ; pop ebx 769 ; jmp short bytetohex 770 771 ;dwordtohex: 772 ; ; INPUT -> 773 ; ; EAX = dword (binary number) 774 ; ; OUTPUT -> 775 ; ; EDX:EAX = hexadecimal string 776 ; ; 777 ; push eax 778 ; shr eax, 16 779 ; call wordtohex 780 ; mov edx, eax 781 ; pop eax 782 ; call wordtohex 783 ; retn 784 785 ; 19/06/2017 786 ; 05/03/2017 (TRDOS 386) 787 ; 13/11/2016 - Erdogan Tan 788 write_audio_dev_info: 789 ; BUS/DEV/FN 790 ; 00000000BBBBBBBBDDDDDFFF00000000 791 ; DEV/VENDOR 792 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 793 794 0000047B 8B35[584B0000] mov esi, [dev_vendor] 795 00000481 6689F0 mov ax, si 796 00000484 0FB6D8 movzx ebx, al 797 00000487 88DA mov dl, bl 798 00000489 80E30F and bl, 0Fh 799 0000048C 8A83[E6490000] mov al, [ebx+hex_chars] 800 00000492 A2[2B4A0000] mov [msgVendorId+3], al 801 00000497 88D3 mov bl, dl 802 00000499 C0EB04 shr bl, 4 803 0000049C 8A83[E6490000] mov al, [ebx+hex_chars] 804 000004A2 A2[2A4A0000] mov [msgVendorId+2], al 805 000004A7 88E3 mov bl, ah 806 000004A9 88DA mov dl, bl 807 000004AB 80E30F and bl, 0Fh 808 000004AE 8A83[E6490000] mov al, [ebx+hex_chars] 809 000004B4 A2[294A0000] mov [msgVendorId+1], al 810 000004B9 88D3 mov bl, dl 811 000004BB C0EB04 shr bl, 4 812 000004BE 8A83[E6490000] mov al, [ebx+hex_chars] 813 000004C4 A2[284A0000] mov [msgVendorId], al 814 000004C9 C1EE10 shr esi, 16 815 000004CC 6689F0 mov ax, si 816 000004CF 88C3 mov bl, al 817 000004D1 88DA mov dl, bl 818 000004D3 80E30F and bl, 0Fh 819 000004D6 8A83[E6490000] mov al, [ebx+hex_chars] 820 000004DC A2[3C4A0000] mov [msgDevId+3], al 821 000004E1 88D3 mov bl, dl 822 000004E3 C0EB04 shr bl, 4 823 000004E6 8A83[E6490000] mov al, [ebx+hex_chars] 824 000004EC A2[3B4A0000] mov [msgDevId+2], al 825 000004F1 88E3 mov bl, ah 826 000004F3 88DA mov dl, bl 827 000004F5 80E30F and bl, 0Fh 828 000004F8 8A83[E6490000] mov al, [ebx+hex_chars] 829 000004FE A2[3A4A0000] mov [msgDevId+1], al 830 00000503 88D3 mov bl, dl 831 00000505 C0EB04 shr bl, 4 832 00000508 8A83[E6490000] mov al, [ebx+hex_chars] 833 0000050E A2[394A0000] mov [msgDevId], al 834 835 00000513 8B35[5C4B0000] mov esi, [bus_dev_fn] 836 00000519 C1EE08 shr esi, 8 837 0000051C 6689F0 mov ax, si 838 0000051F 88C3 mov bl, al 839 00000521 88DA mov dl, bl 840 00000523 80E307 and bl, 7 ; bit 0,1,2 841 00000526 8A83[E6490000] mov al, [ebx+hex_chars] 842 0000052C A2[604A0000] mov [msgFncNo+1], al 843 00000531 88D3 mov bl, dl 844 00000533 C0EB03 shr bl, 3 845 00000536 88DA mov dl, bl 846 00000538 80E30F and bl, 0Fh 847 0000053B 8A83[E6490000] mov al, [ebx+hex_chars] 848 00000541 A2[524A0000] mov [msgDevNo+1], al 849 00000546 88D3 mov bl, dl 850 00000548 C0EB04 shr bl, 4 851 0000054B 8A83[E6490000] mov al, [ebx+hex_chars] 852 00000551 A2[514A0000] mov [msgDevNo], al 853 00000556 88E3 mov bl, ah 854 00000558 88DA mov dl, bl 855 0000055A 80E30F and bl, 0Fh 856 0000055D 8A83[E6490000] mov al, [ebx+hex_chars] 857 00000563 A2[464A0000] mov [msgBusNo+1], al 858 00000568 88D3 mov bl, dl 859 0000056A C0EB04 shr bl, 4 860 0000056D 8A83[E6490000] mov al, [ebx+hex_chars] 861 00000573 A2[454A0000] mov [msgBusNo], al 862 863 00000578 66A1[604B0000] mov ax, [ac97_io_base] 864 0000057E 88C3 mov bl, al 865 00000580 88DA mov dl, bl 866 00000582 80E30F and bl, 0Fh 867 00000585 8A83[E6490000] mov al, [ebx+hex_chars] 868 0000058B A2[794A0000] mov [msgIOBaseAddr+3], al 869 00000590 88D3 mov bl, dl 870 00000592 C0EB04 shr bl, 4 871 00000595 8A83[E6490000] mov al, [ebx+hex_chars] 872 0000059B A2[784A0000] mov [msgIOBaseAddr+2], al 873 000005A0 88E3 mov bl, ah 874 000005A2 88DA mov dl, bl 875 000005A4 80E30F and bl, 0Fh 876 000005A7 8A83[E6490000] mov al, [ebx+hex_chars] 877 000005AD A2[774A0000] mov [msgIOBaseAddr+1], al 878 000005B2 88D3 mov bl, dl 879 000005B4 C0EB04 shr bl, 4 880 000005B7 8A83[E6490000] mov al, [ebx+hex_chars] 881 000005BD A2[764A0000] mov [msgIOBaseAddr], al 882 883 ; 24/11/2016 884 000005C2 30E4 xor ah, ah 885 000005C4 A0[624B0000] mov al, [ac97_int_ln_reg] 886 000005C9 B10A mov cl, 10 887 000005CB F6F1 div cl 888 000005CD 660105[814A0000] add [msgIRQ], ax 889 000005D4 20C0 and al, al 890 000005D6 750D jnz short _w_ac97imsg_ ; 19/06/2017 891 000005D8 A0[824A0000] mov al, [msgIRQ+1] 892 000005DD B420 mov ah, ' ' 893 000005DF 66A3[814A0000] mov [msgIRQ], ax 894 _w_ac97imsg_: 895 ; EBX = Message address 896 ; ECX = Max. message length (or stop on ZERO character) 897 ; (1 to 255) 898 ; DL = Message color (07h = light gray, 0Fh = white) 899 sys _msg, msgAC97Info, 255, 07h 899 <1> 899 <1> 899 <1> 899 <1> 899 <1> %if %0 >= 2 899 000005E5 BB[F7490000] <1> mov ebx, %2 899 <1> %if %0 >= 3 899 000005EA B9FF000000 <1> mov ecx, %3 899 <1> %if %0 = 4 899 000005EF BA07000000 <1> mov edx, %4 899 <1> %endif 899 <1> %endif 899 <1> %endif 899 000005F4 B823000000 <1> mov eax, %1 899 <1> 899 000005F9 CD40 <1> int 40h 900 000005FB C3 retn 901 902 ; 24/08/2020 903 write_wav_file_info: 904 ; 01/05/2017 905 sys _msg, msgWavFileName, 255, 0Fh 905 <1> 905 <1> 905 <1> 905 <1> 905 <1> %if %0 >= 2 905 000005FC BB[864A0000] <1> mov ebx, %2 905 <1> %if %0 >= 3 905 00000601 B9FF000000 <1> mov ecx, %3 905 <1> %if %0 = 4 905 00000606 BA0F000000 <1> mov edx, %4 905 <1> %endif 905 <1> %endif 905 <1> %endif 905 0000060B B823000000 <1> mov eax, %1 905 <1> 905 00000610 CD40 <1> int 40h 906 sys _msg, wav_file_name, 255, 0Fh 906 <1> 906 <1> 906 <1> 906 <1> 906 <1> %if %0 >= 2 906 00000612 BB[084B0000] <1> mov ebx, %2 906 <1> %if %0 >= 3 906 00000617 B9FF000000 <1> mov ecx, %3 906 <1> %if %0 = 4 906 0000061C BA0F000000 <1> mov edx, %4 906 <1> %endif 906 <1> %endif 906 <1> %endif 906 00000621 B823000000 <1> mov eax, %1 906 <1> 906 00000626 CD40 <1> int 40h 907 908 write_sample_rate: 909 ; 01/05/2017 910 00000628 66A1[EA4A0000] mov ax, [sample_rate] 911 ; ax = sample rate (hertz) 912 0000062E 31D2 xor edx, edx 913 00000630 66B90A00 mov cx, 10 914 00000634 66F7F1 div cx 915 00000637 0015[AB4A0000] add [msgHertz+4], dl 916 0000063D 29D2 sub edx, edx 917 0000063F 66F7F1 div cx 918 00000642 0015[AA4A0000] add [msgHertz+3], dl 919 00000648 29D2 sub edx, edx 920 0000064A 66F7F1 div cx 921 0000064D 0015[A94A0000] add [msgHertz+2], dl 922 00000653 29D2 sub edx, edx 923 00000655 66F7F1 div cx 924 00000658 0015[A84A0000] add [msgHertz+1], dl 925 0000065E 0005[A74A0000] add [msgHertz], al 926 927 sys _msg, msgSampleRate, 255, 0Fh 927 <1> 927 <1> 927 <1> 927 <1> 927 <1> %if %0 >= 2 927 00000664 BB[984A0000] <1> mov ebx, %2 927 <1> %if %0 >= 3 927 00000669 B9FF000000 <1> mov ecx, %3 927 <1> %if %0 = 4 927 0000066E BA0F000000 <1> mov edx, %4 927 <1> %endif 927 <1> %endif 927 <1> %endif 927 00000673 B823000000 <1> mov eax, %1 927 <1> 927 00000678 CD40 <1> int 40h 928 929 0000067A BE[C24A0000] mov esi, msg16Bits 930 0000067F 803D[E94A0000]10 cmp byte [bps], 16 931 00000686 7405 je short wsr_1 932 00000688 BE[B24A0000] mov esi, msg8Bits 933 wsr_1: 934 sys _msg, esi, 255, 0Fh 934 <1> 934 <1> 934 <1> 934 <1> 934 <1> %if %0 >= 2 934 0000068D 89F3 <1> mov ebx, %2 934 <1> %if %0 >= 3 934 0000068F B9FF000000 <1> mov ecx, %3 934 <1> %if %0 = 4 934 00000694 BA0F000000 <1> mov edx, %4 934 <1> %endif 934 <1> %endif 934 <1> %endif 934 00000699 B823000000 <1> mov eax, %1 934 <1> 934 0000069E CD40 <1> int 40h 935 936 000006A0 BE[BB4A0000] mov esi, msgMono 937 000006A5 803D[E84A0000]01 cmp byte [stmo], 1 938 000006AC 7405 je short wsr_2 939 000006AE BE[CC4A0000] mov esi, msgStereo 940 wsr_2: 941 sys _msg, esi, 255, 0Fh 941 <1> 941 <1> 941 <1> 941 <1> 941 <1> %if %0 >= 2 941 000006B3 89F3 <1> mov ebx, %2 941 <1> %if %0 >= 3 941 000006B5 B9FF000000 <1> mov ecx, %3 941 <1> %if %0 = 4 941 000006BA BA0F000000 <1> mov edx, %4 941 <1> %endif 941 <1> %endif 941 <1> %endif 941 000006BF B823000000 <1> mov eax, %1 941 <1> 941 000006C4 CD40 <1> int 40h 942 000006C6 C3 retn 943 944 ;============================================================================= 945 ; gfx.asm - draw scopes in VGA 640x480x16 mode 946 ;============================================================================= 947 948 ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 949 950 ;----------------------------------------------------------------------------- 951 ; setgraphmode - setup the VGA 640x480x16 graphics mode 952 ;----------------------------------------------------------------------------- 953 ; 22/10/2017 954 setgraphmode: 955 ;pushad 956 000006C7 66B81200 mov ax,0012h 957 ;int 10h 958 000006CB CD31 int 31h 959 000006CD 66BAC003 mov dx,3C0h 960 000006D1 30C0 xor al,al 961 setgraphmodel0: 962 ;out dx,al 963 000006D3 B401 mov ah, 1 ; outb 964 000006D5 CD34 int 34h 965 ;out dx, al 966 ;mov ah, 1 967 000006D7 CD34 int 34h 968 000006D9 FEC0 inc al 969 000006DB 3C10 cmp al, 10h 970 000006DD 72F4 jb short setgraphmodel0 971 000006DF B020 mov al, 20h 972 ;out dx, al 973 ;mov ah, 1 974 000006E1 CD34 int 34h 975 ;popad 976 000006E3 C3 retn 977 978 ;----------------------------------------------------------------------------- 979 ; settextmode - restore the VGA 80x25x16 text mode 980 ;----------------------------------------------------------------------------- 981 ; 22/10/2017 982 settextmode: 983 ;pushad 984 000006E4 66B80300 mov ax, 0003h 985 ;int 10h 986 000006E8 CD31 int 31h 987 ;popad 988 000006EA C3 retn 989 990 ;----------------------------------------------------------------------------- 991 ; drawscopes - draw the track voices sample scopes 992 ; In: 993 ; ESI = (current) sample buffer 994 ;----------------------------------------------------------------------------- 995 ; 29/10/2017 996 ; 28/10/2017 997 ; (ESI = Current DMA buffer offset) 998 ; 27/10/2017 999 ; 26/10/2017 1000 ; 23/10/2017 1001 drawscopes: 1002 ;pushad 1003 ;mov esi, g_buff 1004 ;mov esi, edx 1005 000006EB 31C9 xor ecx, ecx 1006 000006ED 31D2 xor edx, edx 1007 000006EF 31FF xor edi, edi 1008 drawscope0: 1009 000006F1 66AD lodsw 1010 000006F3 80F480 xor ah, 80h 1011 000006F6 0FB6DC movzx ebx, ah ; Left Channel 1012 000006F9 66D1E3 shl bx, 1 1013 000006FC 668B83[704B0000] mov ax, [RowOfs+ebx] 1014 00000703 668987[704D0000] mov [NewScope_L+edi], ax 1015 0000070A 30FF xor bh, bh 1016 0000070C 66AD lodsw 1017 0000070E 80F480 xor ah, 80h 1018 00000711 88E3 mov bl, ah ; Right Channel 1019 00000713 66D1E3 shl bx, 1 1020 00000716 668B83[704B0000] mov ax, [RowOfs+ebx] 1021 0000071D 668987[704F0000] mov [NewScope_R+edi], ax 1022 00000724 6683C702 add di, 2 1023 00000728 FEC1 inc cl 1024 0000072A 75C5 jnz short drawscope0 1025 1026 0000072C 66BAC403 mov dx, 3C4h 1027 ;mov ax, 0802h 1028 ;out dx, ax 1029 00000730 66BB0208 mov bx, 0802h 1030 00000734 B403 mov ah, 3 ; outw 1031 00000736 CD34 int 34h 1032 00000738 66BACE03 mov dx, 3CEh 1033 0000073C B008 mov al, 08h 1034 ;out dx, al 1035 0000073E B401 mov ah, 1 ; outb 1036 00000740 CD34 int 34h 1037 00000742 6642 inc dx 1038 1039 ; 26/10/2017 1040 00000744 31F6 xor esi, esi 1041 ;xor edi, edi 1042 00000746 BB45060A00 mov ebx, 0A0645h 1043 drawscopel4: 1044 0000074B B080 mov al, 80h 1045 drawscopel2: 1046 0000074D 50 push eax ; * 1047 0000074E 52 push edx ; ** 1048 ;out dx, al 1049 0000074F B401 mov ah, 1 ; outb 1050 00000751 CD34 int 34h 1051 1052 00000753 B4FF mov ah, 0FFh 1053 ;mov ecx, 32 1054 00000755 B120 mov cl, 32 1055 00000757 28C0 sub al, al 1056 drawscopel3: 1057 ; 23/10/2017 1058 00000759 668B96[70510000] mov dx, [OldScope_L+esi] 1059 00000760 663B96[704D0000] cmp dx, [NewScope_L+esi] 1060 00000767 7414 je short drawscopef3 1061 00000769 88041A mov [edx+ebx], al ; L 1062 0000076C 668B96[704D0000] mov dx, [NewScope_L+esi] 1063 00000773 88241A mov [edx+ebx], ah ; L 1064 00000776 668996[70510000] mov [OldScope_L+esi], dx 1065 drawscopef3: 1066 ; 27/10/2017 1067 0000077D 668B96[70530000] mov dx, [OldScope_R+esi] 1068 00000784 663B96[704F0000] cmp dx, [NewScope_R+esi] 1069 0000078B 7416 je short drawscopef4 1070 0000078D 88441A26 mov [edx+ebx+38], al ; R 1071 00000791 668B96[704F0000] mov dx, [NewScope_R+esi] 1072 00000798 88641A26 mov [edx+ebx+38], ah ; R 1073 0000079C 668996[70530000] mov [OldScope_R+esi], dx 1074 drawscopef4: 1075 000007A3 83C610 add esi, 2*8 1076 000007A6 43 inc ebx 1077 000007A7 E2B0 loop drawscopel3 1078 1079 000007A9 5A pop edx ; ** 1080 000007AA 58 pop eax ; * 1081 000007AB 81EEFE010000 sub esi, 2*256-2 1082 000007B1 83EB20 sub ebx, 32 1083 000007B4 D0E8 shr al, 1 1084 000007B6 7595 jnz short drawscopel2 1085 ;popad 1086 000007B8 C3 retn 1087 1088 ;============================================================================= 1089 ; Load IFF/ILBM files for VGA 640x480x16 graphics mode 1090 ;============================================================================= 1091 1092 ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 1093 1094 ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax) 1095 1096 ;----------------------------------------------------------------------------- 1097 ; EQUATES AND STRUCTURES 1098 ;----------------------------------------------------------------------------- 1099 1100 ID_FORM equ 4D524F46h ; IFF/ILBM chunk IDs 1101 ID_ILBM equ 4D424C49h 1102 ID_BMHD equ 44484D42h 1103 ID_CMAP equ 50414D43h 1104 ID_BODY equ 59444F42h 1105 1106 struc Form ; IFF/ILBM header file format 1107 00000000 .ID: resd 1 1108 00000004 .Length: resd 1 1109 00000008 .Type: resd 1 1110 .size: 1111 endstruc 1112 1113 struc Chunk ; IFF/ILBM header chunk format 1114 00000000 .ID: resd 1 1115 00000004 .Length: resd 1 1116 .size: 1117 endstruc 1118 1119 struc BMHD ; IFF/ILBM BMHD chunk format 1120 00000000 .Width: resw 1 1121 00000002 .Height: resw 1 1122 00000004 .PosX: resw 1 1123 00000006 .PosY: resw 1 1124 00000008 .Planes: resb 1 1125 00000009 .Masking: resb 1 1126 0000000A .Compression: resb 1 1127 0000000B .Pad: resb 1 1128 0000000C .Transparent: resw 1 1129 0000000E .AspectX resb 1 1130 0000000F .AspectY: resb 1 1131 00000010 .PageWidth: resw 1 1132 00000012 .PageHeight: resw 1 1133 .size: 1134 endstruc 1135 1136 struc CMAP ; IFF/ILBM CMAP chunk format 1137 00000000 .Colors: resb 768 1138 .size: 1139 endstruc 1140 1141 ;LOGO_ADDRESS equ 100000h ; virtual address at the end of the 1st 1MB 1142 1143 ;------------------------------------------------------------------------------ 1144 ; bswap - macro to reverse the byte order of a 32-bit register, converting 1145 ; a value in little/big endian form to big/little endian form. 1146 ;------------------------------------------------------------------------------ 1147 %macro bswap 1 1148 xchg al, ah 1149 rol eax, 16 1150 xchg al, ah 1151 %endmacro 1152 1153 ;------------------------------------------------------------------------------ 1154 ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode 1155 ; In: 1156 ; ESI = IFF/ILBM image file address 1157 ;------------------------------------------------------------------------------ 1158 putlbm: 1159 000007B9 60 pushad 1160 1161 ; check if this is a valid IFF/ILBM Deluxe Paint file 1162 1163 000007BA 813E464F524D cmp dword [esi+Form.ID], ID_FORM 1164 000007C0 7551 jne short putlbmd0 1165 000007C2 817E08494C424D cmp dword [esi+Form.Type], ID_ILBM 1166 000007C9 7548 jne short putlbmd0 1167 1168 ; get the IFF/ILBM file length in bytes 1169 1170 000007CB 8B4604 mov eax, [esi+Form.Length] 1171 bswap eax 1171 000007CE 86C4 <1> xchg al, ah 1171 000007D0 C1C010 <1> rol eax, 16 1171 000007D3 86C4 <1> xchg al, ah 1172 000007D5 89C1 mov ecx, eax 1173 1174 ; decrease the file length and update the file pointer 1175 1176 000007D7 83E904 sub ecx, 4 1177 000007DA 83C60C add esi, Form.size 1178 1179 ; IFF/ILBM main parser body loop 1180 1181 putlbml0: 1182 000007DD 85C9 test ecx, ecx 1183 000007DF 7E64 jle short putlbmd1 1184 1185 ; get the next chunk ID and length in bytes 1186 1187 000007E1 8B1E mov ebx, [esi+Chunk.ID] 1188 000007E3 8B4604 mov eax, [esi+Chunk.Length] 1189 bswap eax 1189 000007E6 86C4 <1> xchg al, ah 1189 000007E8 C1C010 <1> rol eax, 16 1189 000007EB 86C4 <1> xchg al, ah 1190 000007ED 93 xchg ebx, eax 1191 000007EE 83C608 add esi, Chunk.size 1192 1193 ; word align the chunk length and decrease the file length counter 1194 1195 000007F1 43 inc ebx 1196 000007F2 80E3FE and bl, 0FEh ; ~1 1197 000007F5 83E908 sub ecx, Chunk.size 1198 000007F8 29D9 sub ecx, ebx 1199 1200 ; check for the BMHD/CMAP/BODY chunk headers 1201 1202 000007FA 3D424D4844 cmp eax, ID_BMHD 1203 000007FF 7415 je short putlbmf0 1204 00000801 3D434D4150 cmp eax, ID_CMAP 1205 00000806 7440 je short putlbmf1 1206 00000808 3D424F4459 cmp eax, ID_BODY 1207 0000080D 7455 je short putlbmf2 1208 1209 ; advance to the next IFF/ILBM chunk structure 1210 1211 putlbmc0: 1212 0000080F 01DE add esi, ebx 1213 00000811 EBCA jmp short putlbml0 1214 1215 putlbmd0: 1216 00000813 F9 stc 1217 00000814 61 popad 1218 00000815 C3 retn 1219 1220 ; process the BMHD bitmap header chunk 1221 1222 putlbmf0: 1223 00000816 807E0804 cmp byte [esi+BMHD.Planes], 4 1224 0000081A 75F7 jne short putlbmd0 1225 0000081C 807E0A01 cmp byte [esi+BMHD.Compression], 1 1226 00000820 75F1 jne short putlbmd0 1227 00000822 807E0B00 cmp byte [esi+BMHD.Pad], 0 1228 00000826 75EB jne short putlbmd0 1229 00000828 0FB706 movzx eax, word [esi+BMHD.Width] 1230 0000082B 86C4 xchg al, ah 1231 0000082D 83C007 add eax, 7 1232 00000830 C1E803 shr eax, 3 1233 00000833 A3[E04A0000] mov [picture.width], eax 1234 00000838 0FB74602 movzx eax, word [esi+BMHD.Height] 1235 0000083C 86C4 xchg al, ah 1236 0000083E A3[E44A0000] mov [picture.height], eax 1237 00000843 EBCA jmp short putlbmc0 1238 1239 putlbmd1: 1240 00000845 F8 clc 1241 00000846 61 popad 1242 00000847 C3 retn 1243 1244 ; process the CMAP colormap chunk 1245 1246 putlbmf1: 1247 00000848 66BAC803 mov dx, 3C8h 1248 0000084C 30C0 xor al, al 1249 ;out dx, al 1250 0000084E B401 mov ah, 1 ; outb 1251 00000850 CD34 int 34h 1252 00000852 6642 inc dx 1253 putlbml1: 1254 00000854 8A06 mov al, [esi] 1255 00000856 C0E802 shr al, 2 1256 ;out dx, al 1257 ;mov ah, 1 ; outb 1258 00000859 CD34 int 34h ; IOCTL interrupt (IN/OUT) 1259 0000085B 46 inc esi 1260 0000085C 4B dec ebx 1261 0000085D 7FF5 jg short putlbml1 1262 0000085F E979FFFFFF jmp putlbml0 1263 1264 ; process the BODY bitmap body chunk 1265 1266 putlbmf2: 1267 00000864 60 pushad 1268 00000865 BF00000A00 mov edi, 0A0000h 1269 ;cld 1270 0000086A 66BACE03 mov dx, 3CEh 1271 ;mov ax, 0FF08h 1272 ;out dx, ax 1273 0000086E 66BB08FF mov bx, 0FF08h 1274 00000872 B403 mov ah, 3 ; outw 1275 00000874 CD34 int 34h ; IOCTL interrupt (IN/OUT) 1276 00000876 66BAC403 mov dx, 3C4h 1277 0000087A B002 mov al, 02h 1278 ;out dx, al 1279 0000087C B401 mov ah, 1 ; outb 1280 0000087E CD34 int 34h ; IOCTL interrupt (IN/OUT) 1281 00000880 6642 inc dx 1282 00000882 8B0D[E44A0000] mov ecx, [picture.height] 1283 putlbml2: 1284 00000888 51 push ecx 1285 00000889 B011 mov al, 11h 1286 putlbml3: 1287 0000088B 50 push eax 1288 0000088C 57 push edi 1289 ;out dx, al 1290 0000088D B401 mov ah, 1 ; outb 1291 0000088F CD34 int 34h ; IOCTL interrupt (IN/OUT) 1292 00000891 8B1D[E04A0000] mov ebx, [picture.width] 1293 putlbml4: 1294 00000897 AC lodsb 1295 00000898 84C0 test al, al 1296 0000089A 7C0A jl short putlbmf3 1297 0000089C 0FB6C8 movzx ecx, al 1298 0000089F 41 inc ecx 1299 000008A0 29CB sub ebx, ecx 1300 000008A2 F3A4 rep movsb 1301 000008A4 EB0B jmp short putlbmc4 1302 putlbmf3: 1303 000008A6 F6D8 neg al 1304 000008A8 0FB6C8 movzx ecx, al 1305 000008AB 41 inc ecx 1306 000008AC 29CB sub ebx, ecx 1307 000008AE AC lodsb 1308 000008AF F3AA rep stosb 1309 putlbmc4: 1310 000008B1 85DB test ebx, ebx 1311 000008B3 7FE2 jg short putlbml4 1312 000008B5 5F pop edi 1313 000008B6 58 pop eax 1314 000008B7 00C0 add al, al 1315 000008B9 73D0 jnc short putlbml3 1316 000008BB 83C750 add edi, 80 1317 000008BE 59 pop ecx 1318 000008BF E2C7 loop putlbml2 1319 000008C1 61 popad 1320 000008C2 E948FFFFFF jmp putlbmc0 1321 1322 ; EX1.C (Carlos Hasan, 21/06/1994) 1323 ;------------------------------------------------------------------------------ 1324 ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory 1325 ; ESI = IFF/ILBM image file address 1326 ;------------------------------------------------------------------------------ 1327 1328 ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) { 1329 ; printf("Error loading the IFF/ILBM logo picture\n"); 1330 ; MODStopModule(); 1331 ; MODFreeModule(Song); 1332 ; return; 1333 ; } 1334 ; setgraphmode(); 1335 ; putlbm(Logo); 1336 ; while (!kbhit()) 1337 ; drawscopes(Song->NumTracks); 1338 ; settextmode(); 1339 ; free(Logo); 1340 ; MODStopModule(); 1341 ; MODFreeModule(Song); 1342 1343 ;loadlbm: 1344 ; ; ebx = ASCIIZ file name address 1345 ; ; ecx = open mode (0 = open for read) 1346 ; sys _open, LOGO_FILE_NAME, 0 ; open for reading 1347 ; jc short loadlbm_retn 1348 ; 1349 ; mov [LBM_FileHandle], eax 1350 ; 1351 ; ; get file size by moving file pointer to the end of file 1352 ; ; ebx = file handle/number 1353 ; ; ecx : offset = 0 1354 ; ; edx : switch = 2 (move fp to end of file + offset) 1355 ; sys _seek, eax, 0, 2 1356 ; jc short loadlbm_cf 1357 ; 1358 ; mov [LBM_FileSize], eax 1359 ; 1360 ; ; move file pointer to the beginning of the file 1361 ; ; ecx = 0 1362 ; ; edx = 0 1363 ; ;xor ecx, ecx 1364 ; xor dl, dl 1365 ; ; ebx = [LBM_FileHandle] 1366 ; sys _seek 1367 ; ;jc short loadlbm_cf 1368 ; 1369 ; ; ebx = File handle 1370 ; ; ecx = Buffer address 1371 ; ; edx = Byte count 1372 ; ;sys _read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize] 1373 ; mov ecx, LOGO_ADDRESS 1374 ; mov edx, [LBM_FileSize] 1375 ; sys _read 1376 ; jc short loadlbm_cf 1377 ; 1378 ; cmp eax, edx ; read count = file size ? 1379 ; ;jb short loadlbm_cf 1380 ;loadlbm_cf: 1381 ; pushf 1382 ; sys _close, [LBM_FileHandle] 1383 ; popf 1384 ;loadlbm_retn: 1385 ; retn 1386 ; 1387 ;LOGO_FILE_NAME: 1388 ; db "LOGO.LBM", 0 1389 1390 LOGO_ERROR_MSG: 1391 000008C7 4572726F72206C6F61- db "Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 1391 000008D0 64696E672074686520- 1391 000008D9 4946462F494C424D20- 1391 000008E2 6C6F676F2070696374- 1391 000008EB 75726520210D0A00 1392 1393 000008F3 90 align 2 1394 ; 22/10/2017 1395 LOGO_ADDRESS: 1396 ;incbin "LOGO.LBM" 1397 ; 27/10/2017 1398 000008F4 incbin "TINYPLAY.LBM" 1399 1400 ;============================================================================= 1401 ; preinitialized data 1402 ;============================================================================= 1403 1404 000048E4 00 db 0 1405 ; 23/08/2020 1406 FileHandle: 1407 000048E5 FFFFFFFF dd -1 1408 000048E9 00 db 0 1409 Credits: 1410 msg_usage: 1411 000048EA 54696E792057415620- db 'Tiny WAV Player for TRDOS 386 by Erdogan Tan',10,13 1411 000048F3 506C6179657220666F- 1411 000048FC 72205452444F532033- 1411 00004905 383620627920457264- 1411 0000490E 6F67616E2054616E0A- 1411 00004917 0D 1412 00004918 666F72205649412056- db 'for VIA VT8233 Audio Controller.',10,13 1412 00004921 543832333320417564- 1412 0000492A 696F20436F6E74726F- 1412 00004933 6C6C65722E0A0D 1413 0000493A 417567757374203230- db 'August 2020.',10,13 1413 00004943 32302E0A0D 1414 credits_zero: 1415 00004948 0A0D db 10,13 1416 0000494A 75736167653A207477- db 'usage: twavplay filename.wav',10,13,0 1416 00004953 6176706C6179206669- 1416 0000495C 6C656E616D652E7761- 1416 00004965 760A0D00 1417 00004969 32342F30382F323032- db '24/08/2020',10,13,0 1417 00004972 300A0D00 1418 1419 noDevMsg: 1420 00004976 4572726F723A20556E- db 'Error: Unable to find VIA VT8233 based audio device!' 1420 0000497F 61626C6520746F2066- 1420 00004988 696E64205649412056- 1420 00004991 543832333320626173- 1420 0000499A 656420617564696F20- 1420 000049A3 64657669636521 1421 000049AA 0A0D00 db 10,13,0 1422 1423 noFileErrMsg: 1424 000049AD 4572726F723A206669- db 'Error: file not found.',10,13,0 1424 000049B6 6C65206E6F7420666F- 1424 000049BF 756E642E0A0D00 1425 1426 trdos386_err_msg: 1427 000049C6 5452444F5320333836- db 'TRDOS 386 System call error !',10,13,0 1427 000049CF 2053797374656D2063- 1427 000049D8 616C6C206572726F72- 1427 000049E1 20210A0D00 1428 1429 ; 13/11/2016 1430 000049E6 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 1430 000049EF 3941424344454600 1431 ; 1432 msgAC97Info: 1433 000049F7 0D0A db 0Dh, 0Ah 1434 000049F9 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 1434 00004A02 6F20436F6E74726F6C- 1434 00004A0B 6C6572202620436F64- 1434 00004A14 656320496E666F0D0A 1435 00004A1D 56656E646F72204944- db "Vendor ID: " 1435 00004A26 3A20 1436 00004A28 303030306820446576- msgVendorId: db "0000h Device ID: " 1436 00004A31 6963652049443A20 1437 00004A39 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 1438 00004A40 4275733A20 db "Bus: " 1439 00004A45 303068204465766963- msgBusNo: db "00h Device: " 1439 00004A4E 653A20 1440 00004A51 3030682046756E6374- msgDevNo: db "00h Function: " 1440 00004A5A 696F6E3A20 1441 00004A5F 303068 msgFncNo db "00h" 1442 00004A62 0D0A db 0Dh, 0Ah 1443 00004A64 492F4F204261736520- db "I/O Base Address: " 1443 00004A6D 416464726573733A20 1444 00004A76 303030306820495251- msgIOBaseAddr: db "0000h IRQ: " 1444 00004A7F 3A20 1445 00004A81 3030 msgIRQ: dw 3030h 1446 00004A83 0D0A00 db 0Dh, 0Ah, 0 1447 1448 00004A86 0D0A5741562046696C- msgWavFileName: db 0Dh, 0Ah, "WAV File Name: ",0 1448 00004A8F 65204E616D653A2000 1449 00004A98 0D0A53616D706C6520- msgSampleRate: db 0Dh, 0Ah, "Sample Rate: " 1449 00004AA1 526174653A20 1450 00004AA7 303030303020487A2C- msgHertz: db "00000 Hz, ", 0 1450 00004AB0 2000 1451 00004AB2 3820626974732C2000 msg8Bits: db "8 bits, ", 0 1452 00004ABB 4D6F6E6F0D0A00 msgMono: db "Mono", 0Dh, 0Ah, 0 1453 00004AC2 313620626974732C20- msg16Bits: db "16 bits, ", 0 1453 00004ACB 00 1454 00004ACC 53746572656F msgStereo: db "Stereo" 1455 00004AD2 0D0A00 nextline: db 0Dh, 0Ah, 0 1456 1457 ;============================================================================= 1458 ; uninitialized data 1459 ;============================================================================= 1460 1461 ; 23/08/2020 1462 1463 ; BSS 1464 1465 bss_start: 1466 1467 ABSOLUTE bss_start 1468 1469 00004AD5 alignb 4 1470 1471 ;------------------------------------------------------------------------------ 1472 ; IFF/ILBM DATA 1473 ;------------------------------------------------------------------------------ 1474 1475 00004AD8 LBM_FileHandle: resd 1 1476 00004ADC LBM_FileSize: resd 1 1477 ; 1478 00004AE0 picture.width: resd 1 ; current picture width and height 1479 00004AE4 picture.height: resd 1 1480 1481 ;------------------------------------------------------------------------------ 1482 1483 ;alignb 4 1484 1485 00004AE8 stmo: resb 1 ; stereo or mono (1=stereo) 1486 00004AE9 bps: resb 1 ; bits per sample (8,16) 1487 00004AEA sample_rate: resw 1 ; Sample Frequency (Hz) 1488 1489 00004AEC smpRBuff: resw 14 1490 1491 wav_file_name: 1492 00004B08 resb 80 ; wave file, path name (<= 80 bytes) 1493 1494 alignb 4 1495 1496 00004B58 dev_vendor: resd 1 1497 00004B5C bus_dev_fn: resd 1 1498 00004B60 ac97_io_base: resw 1 1499 00004B62 ac97_int_ln_reg: resb 1 1500 00004B63 srb: resb 1 1501 1502 00004B64 flags: resb 1 1503 1504 ; 23/08/2020 1505 00004B65 counter: resb 1 1506 1507 00004B66 alignb 16 1508 1509 ; PLAY.ASM 1510 ;Scope: resw 320 1511 00004B70 RowOfs: resw 256 1512 1513 ; 23/10/2017 1514 00004D70 NewScope_L: resw 256 1515 00004F70 NewScope_R: resw 256 1516 00005170 OldScope_L: resw 256 1517 00005370 OldScope_R: resw 256 1518 1519 ; 20/10/2017 (modplay7.s, SB16) 1520 ; 19/10/2017 (modplay6.s, AC97) 1521 00005570 pan_shift: resb 1 1522 00005571 volume_level: resb 1 1523 1524 00005572 alignb 4096 1525 1526 audio_buffer: 1527 00006000 resb BUFFERSIZE ; DMA Buffer Size / 2 (32768) 1528 1529 0000E000 alignb 65536 1530 1531 DMA_Buffer: 1532 00010000 resb 2*BUFFERSIZE ; 65536 ; 09/10/2017 1533 file_buffer: 1534 00020000 resb 65536*6 1535 EOF: