1 ; **************************************************************************** 2 ; playmod6.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; PLAYMOD6.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN 5 ; 6 ; 05/03/2017 7 ; 8 ; [ Last Modification: 30/07/2020 ] 9 ; 10 ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993) 11 ; PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM 12 ; 13 ; Modified by using the source code of 'tinyply4.s' ('TINYPLY4.PRG') 14 ; by Erdogan Tan (06/10/2017) 15 ; 16 ; Modified from 'wavplay2.s' (11/06/2017) 17 ; 18 ; Modified from 'TINYPLAY.PRG' ('tinyplay.s') source code by Erdogan Tan 19 ; (05/03/2017) 20 ; 21 ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan 22 ; (04/03/2017) 23 ; Assembler: NASM 2.11 24 ; ---------------------------------------------------------------------------- 25 ; nasm playmod.s -l playmod.txt -o PLAYMOD.PRG 26 ; **************************************************************************** 27 ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017) 28 ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017) 29 ; 16 bits, stereo conversion code: 'modplay3.s' (13/10/2017) 30 31 ; 01/03/2017 32 ; 16/10/2016 33 ; 29/04/2016 34 ; TRDOS 386 system calls (temporary list!) 35 _ver equ 0 36 _exit equ 1 37 _fork equ 2 38 _read equ 3 39 _write equ 4 40 _open equ 5 41 _close equ 6 42 _wait equ 7 43 _creat equ 8 44 _link equ 9 45 _unlink equ 10 46 _exec equ 11 47 _chdir equ 12 48 _time equ 13 49 _mkdir equ 14 50 _chmod equ 15 51 _chown equ 16 52 _break equ 17 53 _stat equ 18 54 _seek equ 19 55 _tell equ 20 56 _mount equ 21 57 _umount equ 22 58 _setuid equ 23 59 _getuid equ 24 60 _stime equ 25 61 _quit equ 26 62 _intr equ 27 63 _fstat equ 28 64 _emt equ 29 65 _mdate equ 30 66 _video equ 31 67 _audio equ 32 68 _timer equ 33 69 _sleep equ 34 70 _msg equ 35 71 _geterr equ 36 72 _fpsave equ 37 73 _pri equ 38 74 _rele equ 39 75 _fff equ 40 76 _fnf equ 41 77 _alloc equ 42 78 _dalloc equ 43 79 _calbac equ 44 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 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 101 ; sys systemcall (eax) , , 102 103 ;; 19/06/2017 104 ;BUFFERSIZE equ 2*32768 ; 25/06/2017 105 BUFFERSIZE equ 32768 ; 09/10/2017 106 107 ; ---------------------------------------------------------------------------- 108 ; Tiny MOD Player v0.1b by Carlos Hasan. 109 ; July 14th, 1993. 110 111 ;============================================================================= 112 ; 113 ;============================================================================= 114 115 [BITS 32] 116 [org 0] 117 118 Start: 119 ; clear bss 120 00000000 B9[00000800] mov ecx, EOF 121 00000005 BF[5B0F0000] mov edi, bss_start 122 0000000A 29F9 sub ecx, edi 123 0000000C D1E9 shr ecx, 1 124 0000000E 31C0 xor eax, eax 125 00000010 F366AB rep stosw 126 127 ; Detect (& Enable) VT8233 Audio Device 128 00000013 E811020000 call DetectVT8233 129 00000018 731B jnc short GetFileName 130 131 _dev_not_ready: 132 ; couldn't find the audio device! 133 sys _msg, noDevMsg, 255, 0Fh 133 <1> 133 <1> 133 <1> 133 <1> 133 <1> %if %0 >= 2 133 0000001A BB[36020000] <1> mov ebx, %2 133 <1> %if %0 >= 3 133 0000001F B9FF000000 <1> mov ecx, %3 133 <1> %if %0 = 4 133 00000024 BA0F000000 <1> mov edx, %4 133 <1> %endif 133 <1> %endif 133 <1> %endif 133 00000029 B823000000 <1> mov eax, %1 133 <1> 133 0000002E CD40 <1> int 40h 134 00000030 E9D3010000 jmp Exit 135 136 GetFileName: 137 00000035 89E6 mov esi, esp 138 00000037 AD lodsd 139 00000038 83F802 cmp eax, 2 ; two arguments 140 ; (program file name & mod file name) 141 0000003B 0F82D0010000 jb pmsg_usage ; nothing to do 142 143 00000041 AD lodsd ; program file name address 144 00000042 AD lodsd ; mod file name address (file to be read) 145 00000043 89C6 mov esi, eax 146 00000045 BF[AE820000] mov edi, mod_file_name 147 ScanName: 148 0000004A AC lodsb 149 0000004B 84C0 test al, al 150 0000004D 0F84BE010000 je pmsg_usage 151 00000053 3C20 cmp al, 20h 152 00000055 74F3 je short ScanName ; scan start of name. 153 00000057 AA stosb 154 00000058 B4FF mov ah, 0FFh 155 a_0: 156 0000005A FEC4 inc ah 157 a_1: 158 0000005C AC lodsb 159 0000005D AA stosb 160 0000005E 3C2E cmp al, '.' 161 00000060 74F8 je short a_0 162 00000062 20C0 and al, al 163 00000064 75F6 jnz short a_1 164 165 00000066 08E4 or ah, ah ; if period NOT found, 166 00000068 750B jnz short PrintMesg ; then add a .MOD extension. 167 SetExt: 168 0000006A 4F dec edi 169 0000006B C7072E4D4F44 mov dword [edi], '.MOD' 170 00000071 C6470400 mov byte [edi+4], 0 171 PrintMesg: 172 ; Prints the Credits Text. 173 sys _msg, Credits, 255, 0Fh 173 <1> 173 <1> 173 <1> 173 <1> 173 <1> %if %0 >= 2 173 00000075 BB[CD0E0000] <1> mov ebx, %2 173 <1> %if %0 >= 3 173 0000007A B9FF000000 <1> mov ecx, %3 173 <1> %if %0 = 4 173 0000007F BA0F000000 <1> mov edx, %4 173 <1> %endif 173 <1> %endif 173 <1> %endif 173 00000084 B823000000 <1> mov eax, %1 173 <1> 173 00000089 CD40 <1> int 40h 174 _1: 175 ; 19/06/2017 176 ; Allocate Audio Buffer (for user) 177 sys _audio, 0200h, BUFFERSIZE, Audio_Buffer 177 <1> 177 <1> 177 <1> 177 <1> 177 <1> %if %0 >= 2 177 0000008B BB00020000 <1> mov ebx, %2 177 <1> %if %0 >= 3 177 00000090 B900800000 <1> mov ecx, %3 177 <1> %if %0 = 4 177 00000095 BA[00900000] <1> mov edx, %4 177 <1> %endif 177 <1> %endif 177 <1> %endif 177 0000009A B820000000 <1> mov eax, %1 177 <1> 177 0000009F CD40 <1> int 40h 178 000000A1 727D jc error_exit 179 _2: 180 ; Initialize Audio Device (bl = 1 -> Interrupt method) 181 sys _audio, 0301h, 0, ac97_int_handler ; 09/10/2017 181 <1> 181 <1> 181 <1> 181 <1> 181 <1> %if %0 >= 2 181 000000A3 BB01030000 <1> mov ebx, %2 181 <1> %if %0 >= 3 181 000000A8 B900000000 <1> mov ecx, %3 181 <1> %if %0 = 4 181 000000AD BA[6D020000] <1> mov edx, %4 181 <1> %endif 181 <1> %endif 181 <1> %endif 181 000000B2 B820000000 <1> mov eax, %1 181 <1> 181 000000B7 CD40 <1> int 40h 182 000000B9 7265 jc error_exit 183 184 ; Initialize Audio Device (bl = 0 -> SRB method) 185 ;sys _audio, 0300h, 1, srb ; 09/10/2017 186 ;jc error_exit 187 188 LoadMod: 189 000000BB BF[AE820000] mov edi, mod_file_name 190 000000C0 E863020000 call LoadModule ; Load the MODule... 191 ; 08/10/2017 192 000000C5 731B jnc short _3 ; any error loading? 193 194 ; yes, print error and Exit. 195 196 sys _msg, ErrorMesg, 255, 0Fh 196 <1> 196 <1> 196 <1> 196 <1> 196 <1> %if %0 >= 2 196 000000C7 BB[010F0000] <1> mov ebx, %2 196 <1> %if %0 >= 3 196 000000CC B9FF000000 <1> mov ecx, %3 196 <1> %if %0 = 4 196 000000D1 BA0F000000 <1> mov edx, %4 196 <1> %endif 196 <1> %endif 196 <1> %endif 196 000000D6 B823000000 <1> mov eax, %1 196 <1> 196 000000DB CD40 <1> int 40h 197 198 000000DD E926010000 jmp Exit 199 200 _3: 201 ; 10/06/2017 202 sys _audio, 0E00h ; get audio controller info 202 <1> 202 <1> 202 <1> 202 <1> 202 <1> %if %0 >= 2 202 000000E2 BB000E0000 <1> mov ebx, %2 202 <1> %if %0 >= 3 202 <1> mov ecx, %3 202 <1> %if %0 = 4 202 <1> mov edx, %4 202 <1> %endif 202 <1> %endif 202 <1> %endif 202 000000E7 B820000000 <1> mov eax, %1 202 <1> 202 000000EC CD40 <1> int 40h 203 000000EE 7230 jc error_exit 204 205 ;cmp ah, 3 ; VT 8233? (VIA AC'97 Audio Controller) 206 ;jne _dev_not_ready 207 208 ; EAX = IRQ Number in AL 209 ; Audio Device Number in AH 210 ; EBX = DEV/VENDOR ID 211 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 212 ; ECX = BUS/DEV/FN 213 ; (00000000BBBBBBBBDDDDDFFF00000000) 214 ; EDX = Base IO Addr (DX) for SB16 & VT8233 215 ; EDX = NABMBAR/NAMBAR (for AC97) 216 ; (Low word, DX = NAMBAR address) 217 218 000000F0 A2[6A0F0000] mov [ac97_int_ln_reg], al 219 000000F5 891D[5C0F0000] mov [dev_vendor], ebx 220 000000FB 890D[600F0000] mov [bus_dev_fn], ecx 221 00000101 668915[680F0000] mov [ac97_io_base], dx 222 223 00000108 E8E1090000 call write_audio_dev_info 224 225 PlayNow: 226 ; 30/07/2020 227 228 ; 06/10/2017 229 230 ; DIRECT CGA MEMORY ACCESS 231 ; bl = 0, bh = 4 232 ; Direct access/map to CGA memory (0B8000h) 233 234 sys _video, 0400h 234 <1> 234 <1> 234 <1> 234 <1> 234 <1> %if %0 >= 2 234 0000010D BB00040000 <1> mov ebx, %2 234 <1> %if %0 >= 3 234 <1> mov ecx, %3 234 <1> %if %0 = 4 234 <1> mov edx, %4 234 <1> %endif 234 <1> %endif 234 <1> %endif 234 00000112 B81F000000 <1> mov eax, %1 234 <1> 234 00000117 CD40 <1> int 40h 235 00000119 3D00800B00 cmp eax, 0B8000h 236 0000011E 741B je short _4 237 error_exit: 238 sys _msg, trdos386_err_msg, 255, 0Eh 238 <1> 238 <1> 238 <1> 238 <1> 238 <1> %if %0 >= 2 238 00000120 BB[1E0F0000] <1> mov ebx, %2 238 <1> %if %0 >= 3 238 00000125 B9FF000000 <1> mov ecx, %3 238 <1> %if %0 = 4 238 0000012A BA0E000000 <1> mov edx, %4 238 <1> %endif 238 <1> %endif 238 <1> %endif 238 0000012F B823000000 <1> mov eax, %1 238 <1> 238 00000134 CD40 <1> int 40h 239 00000136 E9CD000000 jmp Exit 240 241 _4: 242 0000013B E8CE080000 call StartPlaying 243 244 ; 14/10/2017 245 246 ; load 32768 bytes into audio buffer 247 ;mov edi, Audio_Buffer 248 ;mov ebx, BUFFERSIZE 249 ; 24/06/2017 250 ; load 8192 bytes into audio buffer 251 00000140 BF[00100100] mov edi, temp_buffer 252 00000145 BB00200000 mov ebx, BUFFERSIZE / 4 253 0000014A E840080000 call GetSamples 254 0000014F 72CF jc short error_exit 255 256 ; 24/06/2017 257 ; 8 bit to 16 bit (*2) 258 ; mono to stereo (*2) 259 ; 4* (BUFFERSIZE/4) 260 ; source = temp_buffer 261 ; destination = Audio_Buffer 262 00000151 E8AE010000 call ConvertSamples 263 264 ; bh = 16 : update (current) dma half buffer 265 ; bl = 0 : then switch to the next half buffer 266 sys _audio, 1000h ; 29/07/2020 266 <1> 266 <1> 266 <1> 266 <1> 266 <1> %if %0 >= 2 266 00000156 BB00100000 <1> mov ebx, %2 266 <1> %if %0 >= 3 266 <1> mov ecx, %3 266 <1> %if %0 = 4 266 <1> mov edx, %4 266 <1> %endif 266 <1> %endif 266 <1> %endif 266 0000015B B820000000 <1> mov eax, %1 266 <1> 266 00000160 CD40 <1> int 40h 267 ; 14/10/2017 268 ;sys _audio, 1002h ; update dma half buffer 2 269 270 ; 30/07/2020 271 272 ; load 32768 bytes into audio buffer 273 ;mov edi, Audio_Buffer 274 ;mov ebx, BUFFERSIZE 275 ; load 8192 bytes into audio buffer 276 00000162 BF[00100100] mov edi, temp_buffer 277 00000167 BB00200000 mov ebx, BUFFERSIZE / 4 278 0000016C E81E080000 call GetSamples 279 00000171 72AD jc short error_exit 280 281 ; 8 bit to 16 bit (*2) 282 ; mono to stereo (*2) 283 ; 4* (BUFFERSIZE/4) 284 ; source = temp_buffer 285 ; destination = Audio_Buffer 286 00000173 E88C010000 call ConvertSamples 287 288 ; Set Master Volume Level 289 sys _audio, 0B00h, 1D1Dh 289 <1> 289 <1> 289 <1> 289 <1> 289 <1> %if %0 >= 2 289 00000178 BB000B0000 <1> mov ebx, %2 289 <1> %if %0 >= 3 289 0000017D B91D1D0000 <1> mov ecx, %3 289 <1> %if %0 = 4 289 <1> mov edx, %4 289 <1> %endif 289 <1> %endif 289 <1> %endif 289 00000182 B820000000 <1> mov eax, %1 289 <1> 289 00000187 CD40 <1> int 40h 290 291 ; 30/07/2020 292 ;mov byte [volume_level], 1Dh ; 29 293 00000189 880D[FF820000] mov [volume_level], cl 294 295 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 296 297 ; 07/10/2017 298 ;mov word [MixSpeed], 22222 ; Mixing at 22 kHz 299 300 ; Start to play 301 0000018F A0[BB0D0000] mov al, [bps] 302 00000194 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 303 00000197 D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 304 00000199 8A1D[BA0D0000] mov bl, [stmo] 305 0000019F FECB dec bl 306 000001A1 08C3 or bl, al 307 000001A3 668B0D[BC0D0000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 308 000001AA B704 mov bh, 4 ; start to play 309 sys _audio 309 <1> 309 <1> 309 <1> 309 <1> 309 <1> %if %0 >= 2 309 <1> mov ebx, %2 309 <1> %if %0 >= 3 309 <1> mov ecx, %3 309 <1> %if %0 = 4 309 <1> mov edx, %4 309 <1> %endif 309 <1> %endif 309 <1> %endif 309 000001AC B820000000 <1> mov eax, %1 309 <1> 309 000001B1 CD40 <1> int 40h 310 311 ;mov byte [srb], 0 ; 14/10/2017 312 313 ;; SETUP SIGNAL RESPONSE BYTE 314 ;; 06/03/2017 315 ;mov bl, [ac97_int_ln_reg] ; IRQ number 316 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 317 ;mov edx, srb ; Signal Response/Return Byte address 318 ;mov ecx, 0FFh ; Signal Response/Return Byte value 319 ;sys _calbac 320 ;jc short error_exit 321 322 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 323 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 324 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 325 ; second, or the module will sound "looped". 326 ; Because we need better sync with the ModPlayer to draw the scope, 327 ; the polling is called from my routine, and then the irq 0 must be 328 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 329 ; samples played by the Sound Blaster. Note that some samples are 330 ; discarded in the next code, just for fun! 331 332 _a3: 333 ; 02/10/2017 334 ; Print "Playing..." message. 335 sys _msg, PlayMsg, 255, 0Fh 335 <1> 335 <1> 335 <1> 335 <1> 335 <1> %if %0 >= 2 335 000001B3 BB[3E0F0000] <1> mov ebx, %2 335 <1> %if %0 >= 3 335 000001B8 B9FF000000 <1> mov ecx, %3 335 <1> %if %0 = 4 335 000001BD BA0F000000 <1> mov edx, %4 335 <1> %endif 335 <1> %endif 335 <1> %endif 335 000001C2 B823000000 <1> mov eax, %1 335 <1> 335 000001C7 CD40 <1> int 40h 336 337 ; 30/07/2020 338 339 ; Print (GoTo) NextLine. 340 sys _msg, NextLine, 3, 07h 340 <1> 340 <1> 340 <1> 340 <1> 340 <1> %if %0 >= 2 340 000001C9 BB[550F0000] <1> mov ebx, %2 340 <1> %if %0 >= 3 340 000001CE B903000000 <1> mov ecx, %3 340 <1> %if %0 = 4 340 000001D3 BA07000000 <1> mov edx, %4 340 <1> %endif 340 <1> %endif 340 <1> %endif 340 000001D8 B823000000 <1> mov eax, %1 340 <1> 340 000001DD CD40 <1> int 40h 341 ; 342 343 ; 30/07/2020 344 000001DF 66C70500800B00304E mov word [0B8000h], 4E30h ; Red '0' 345 346 000001E8 E89C000000 call ModPlay ; 13/02/2017 347 348 _s_exit: 349 000001ED E8CB080000 call StopPlaying ; STOP! 350 351 ; 02/10/2017 352 ; Print "OK." message. 353 sys _msg, OkMsg, 255, 0Fh 353 <1> 353 <1> 353 <1> 353 <1> 353 <1> %if %0 >= 2 353 000001F2 BB[520F0000] <1> mov ebx, %2 353 <1> %if %0 >= 3 353 000001F7 B9FF000000 <1> mov ecx, %3 353 <1> %if %0 = 4 353 000001FC BA0F000000 <1> mov edx, %4 353 <1> %endif 353 <1> %endif 353 <1> %endif 353 00000201 B823000000 <1> mov eax, %1 353 <1> 353 00000206 CD40 <1> int 40h 354 Exit: 355 ;call FreeModule ; Free MODule core. 356 357 sys _exit ; Bye ! 357 <1> 357 <1> 357 <1> 357 <1> 357 <1> %if %0 >= 2 357 <1> mov ebx, %2 357 <1> %if %0 >= 3 357 <1> mov ecx, %3 357 <1> %if %0 = 4 357 <1> mov edx, %4 357 <1> %endif 357 <1> %endif 357 <1> %endif 357 00000208 B801000000 <1> mov eax, %1 357 <1> 357 0000020D CD40 <1> int 40h 358 here: 359 0000020F EBFE jmp short here 360 361 pmsg_usage: 362 sys _msg, msg_usage, 255, 0Fh 362 <1> 362 <1> 362 <1> 362 <1> 362 <1> %if %0 >= 2 362 00000211 BB[5E0E0000] <1> mov ebx, %2 362 <1> %if %0 >= 3 362 00000216 B9FF000000 <1> mov ecx, %3 362 <1> %if %0 = 4 362 0000021B BA0F000000 <1> mov edx, %4 362 <1> %endif 362 <1> %endif 362 <1> %endif 362 00000220 B823000000 <1> mov eax, %1 362 <1> 362 00000225 CD40 <1> int 40h 363 00000227 EBDF jmp short Exit 364 365 DetectVT8233: 366 ; Detect (BH=1) VT8233 (BL=3) Audio Controller 367 sys _audio, 0103h 367 <1> 367 <1> 367 <1> 367 <1> 367 <1> %if %0 >= 2 367 00000229 BB03010000 <1> mov ebx, %2 367 <1> %if %0 >= 3 367 <1> mov ecx, %3 367 <1> %if %0 = 4 367 <1> mov edx, %4 367 <1> %endif 367 <1> %endif 367 <1> %endif 367 0000022E B820000000 <1> mov eax, %1 367 <1> 367 00000233 CD40 <1> int 40h 368 00000235 C3 retn 369 370 noDevMsg: 371 00000236 4572726F723A20556E- db "Error: Unable to find VIA VT8233 based audio device!",13,10,0 371 0000023F 61626C6520746F2066- 371 00000248 696E64205649412056- 371 00000251 543832333320626173- 371 0000025A 656420617564696F20- 371 00000263 646576696365210D0A- 371 0000026C 00 372 373 ac97_int_handler: ; 14/10/2017 374 ; 09/10/2017 375 376 ; 19/06/2017 377 0000026D C605[6B0F0000]01 mov byte [srb], 1 ; interrupt (or signal response byte) 378 379 ; 30/07/2020 380 00000274 8035[FE820000]01 xor byte [half_buff], 1 ; 0 --> 1, 1 --> 0 381 382 ; 30/07/2020 383 ; (Following code has been moved to 'p_loop' for fast return 384 ; from user's interrupt handler.) 385 386 ;; 14/10/2017 387 ;; load 8192 bytes into audio buffer 388 ;mov edi, temp_buffer 389 ;mov ebx, BUFFERSIZE / 4 390 ;call GetSamples 391 ;jc error_exit 392 393 ;; 8 bit to 16 bit (*2) 394 ;; mono to stereo (*2) 395 ;; 4* (BUFFERSIZE/4) 396 ;; source = temp_buffer 397 ;; destination = Audio_Buffer 398 ;call ConvertSamples 399 400 sys _rele ; return from callback service 400 <1> 400 <1> 400 <1> 400 <1> 400 <1> %if %0 >= 2 400 <1> mov ebx, %2 400 <1> %if %0 >= 3 400 <1> mov ecx, %3 400 <1> %if %0 = 4 400 <1> mov edx, %4 400 <1> %endif 400 <1> %endif 400 <1> %endif 400 0000027B B827000000 <1> mov eax, %1 400 <1> 400 00000280 CD40 <1> int 40h 401 ; we must not come here ! 402 sys _exit 402 <1> 402 <1> 402 <1> 402 <1> 402 <1> %if %0 >= 2 402 <1> mov ebx, %2 402 <1> %if %0 >= 3 402 <1> mov ecx, %3 402 <1> %if %0 = 4 402 <1> mov edx, %4 402 <1> %endif 402 <1> %endif 402 <1> %endif 402 00000282 B801000000 <1> mov eax, %1 402 <1> 402 00000287 CD40 <1> int 40h 403 404 ;============================================================================= 405 ; 406 ;============================================================================= 407 408 ModPlay: 409 ; 30/07/2020 410 ; 14/10/2017 411 ; 13/10/2017 412 ; 06/10/2017, 09/10/2017 413 ; 19/06/2017, 21/06/2017, 23/06/2017 414 415 ; 05/03/2017 (TRDOS 386) 416 ; 28/11/2016, 08/12/2016, 13/02/2017, 14/02/2017 417 418 ; 30/07/2020 419 p_loop: 420 00000289 803D[6B0F0000]00 cmp byte [srb], 0 421 00000290 762D jna short q_loop 422 423 00000292 C605[6B0F0000]00 mov byte [srb], 0 424 425 ; 30/07/2020 426 ; (Following code has been moved here from 'ac97_int_handler') 427 ; ('GetSamples', 'ConvertSamples') 428 429 ; 14/10/2017 430 ; load 8192 bytes into audio buffer 431 00000299 BF[00100100] mov edi, temp_buffer 432 0000029E BB00200000 mov ebx, BUFFERSIZE / 4 433 000002A3 E8E7060000 call GetSamples 434 000002A8 0F8272FEFFFF jc error_exit 435 436 ; 8 bit to 16 bit (*2) 437 ; mono to stereo (*2) 438 ; 4* (BUFFERSIZE/4) 439 ; source = temp_buffer 440 ; destination = Audio_Buffer 441 000002AE E851000000 call ConvertSamples 442 443 ; 30/07/2020 444 000002B3 A0[FE820000] mov al, [half_buff] 445 000002B8 0431 add al, 31h ; '1' or '2' 446 000002BA A200800B00 mov [0B8000h], al 447 q_loop: 448 000002BF B401 mov ah, 1 ; any key pressed? 449 000002C1 CD32 int 32h ; no, Loop. 450 000002C3 74C4 jz short p_loop 451 452 000002C5 B400 mov ah, 0 ; flush key buffer... 453 000002C7 CD32 int 32h 454 455 ; 09/10/2017 456 000002C9 3C2B cmp al, '+' ; increase sound volume 457 000002CB 7405 je short inc_volume_level 458 000002CD 3C2D cmp al, '-' 459 000002CF 7424 je short dec_volume_level 460 q_return: 461 000002D1 C3 retn 462 463 ; 09/10/2017 (playmod5.s) 464 ; 24/06/2017 (wavplay2.s) 465 inc_volume_level: 466 000002D2 8A0D[FF820000] mov cl, [volume_level] 467 000002D8 80F91F cmp cl, 1Fh ; 31 468 000002DB 73E2 jnb short q_loop 469 000002DD FEC1 inc cl 470 change_volume_level: 471 000002DF 880D[FF820000] mov [volume_level], cl 472 000002E5 88CD mov ch, cl 473 ; Set Master Volume Level 474 sys _audio, 0B00h 474 <1> 474 <1> 474 <1> 474 <1> 474 <1> %if %0 >= 2 474 000002E7 BB000B0000 <1> mov ebx, %2 474 <1> %if %0 >= 3 474 <1> mov ecx, %3 474 <1> %if %0 = 4 474 <1> mov edx, %4 474 <1> %endif 474 <1> %endif 474 <1> %endif 474 000002EC B820000000 <1> mov eax, %1 474 <1> 474 000002F1 CD40 <1> int 40h 475 000002F3 EBCA jmp short q_loop 476 dec_volume_level: 477 000002F5 8A0D[FF820000] mov cl, [volume_level] 478 000002FB 80F901 cmp cl, 1 ; 1 479 000002FE 76BF jna short q_loop 480 00000300 FEC9 dec cl 481 00000302 EBDB jmp short change_volume_level 482 483 ; 15/10/2017 484 ; 14/10/2017 485 ; 24/06/2017 ('modplay3.s') 486 ;-------------------------------------------------------------------------- 487 ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples 488 ;-------------------------------------------------------------------------- 489 ; This Conversion is needed for AC'97 hardware 490 ; which ony supports 16 bit stereo samples ! 491 492 ; source = temp_buffer (8192 bytes) 493 ; destination = Audio_Buffer (32768 bytes) 494 495 ConvertSamples: 496 ; 24/06/2017 497 00000304 B900200000 mov ecx, BUFFERSIZE /4 ; 8192 498 00000309 BE[00100100] mov esi, temp_buffer 499 0000030E BF[00900000] mov edi, Audio_Buffer 500 c_smpl_1: 501 00000313 AC lodsb ; get 8 bit mono sample 502 ; 15/10/2017 503 ;sub al, 80h 504 ;shl ax, 8 505 00000314 88C4 mov ah, al 506 00000316 80EC80 sub ah, 80h 507 00000319 30C0 xor al, al 508 ; 509 0000031B 6689C2 mov dx, ax 510 0000031E C1E010 shl eax, 16 511 00000321 6689D0 mov ax, dx 512 00000324 AB stosd ; save 16 bit stereo sample 513 00000325 E2EC loop c_smpl_1 514 515 00000327 C3 retn 516 517 ;============================================================================= 518 ; MODLOAD.ASM 519 ;============================================================================= 520 521 ; Amiga Module Loader v0.1b by Carlos Hasan. 522 ; July 10th, 1993. 523 524 ; STRUCTURES 525 526 struc ModSample 527 00000000 .msName: resb 22 528 00000016 .msLength: resw 1 529 00000018 .msFinetune: resb 1 530 00000019 .msVolume: resb 1 531 0000001A .msRepeat: resw 1 532 0000001C .msRepLen: resw 1 533 .size: ; 30 bytes 534 endstruc 535 536 struc ModHeader 537 00000000 .mhName: resb 20 538 00000014 .mhSamples: resb ModSample.size*31 539 000003B6 .mhOrderLen: resb 1 540 000003B7 .mhReStart: resb 1 541 000003B8 .mhOrder: resb 128 542 00000438 .mhSign: resw 2 543 .size: ; 1084 bytes 544 endstruc 545 546 struc ModInfoRec 547 00000000 .OrderLen: resb 1 548 00000001 .ReStart: resb 1 549 00000002 .Order: resb 128 550 00000082 .Patterns: resd 1 551 00000086 .SampOfs: resw 31 552 000000C4 .SampSeg: resw 31 553 00000102 .SampLen: resw 31 554 00000140 .SampRep: resw 31 555 0000017E .SampRepLen: resw 31 556 000001BC .SampVol: resw 31 557 .size: ; 506 bytes 558 endstruc 559 560 ; CODE 561 562 ; 06/10/2017 563 ; 04/10/2017 564 ; /* MOD FileFormat */ 565 566 ID_MK equ 2E4B2E4Dh ; "M.K." 567 ID_FLT4 equ 34544C46h ; "FLT4" 568 ID_8CHN equ 4E484338h ; "8CHN" 569 ID_FLT8 equ 34544C46h ; "FLT8" 570 571 ; CODE 572 573 LoadModule: 574 ; edi = file name address 575 576 00000328 60 pushad 577 578 ;call ClearModInfo 579 OpenFile: 580 ; ebx = ASCIIZ file name address 581 ; ecx = open mode (0 = open for read) 582 sys _open, edi, 0 ; open for reading 582 <1> 582 <1> 582 <1> 582 <1> 582 <1> %if %0 >= 2 582 00000329 89FB <1> mov ebx, %2 582 <1> %if %0 >= 3 582 0000032B B900000000 <1> mov ecx, %3 582 <1> %if %0 = 4 582 <1> mov edx, %4 582 <1> %endif 582 <1> %endif 582 <1> %endif 582 00000330 B805000000 <1> mov eax, %1 582 <1> 582 00000335 CD40 <1> int 40h 583 00000337 0F8262010000 jc Failed 584 0000033D A3[6C0F0000] mov [FileHandle], eax 585 ReadHeader: 586 ; ebx = File handle 587 ; ecx = Buffer address 588 ; edx = Byte count 589 sys _read, [FileHandle], Header, ModHeader.size 589 <1> 589 <1> 589 <1> 589 <1> 589 <1> %if %0 >= 2 589 00000342 8B1D[6C0F0000] <1> mov ebx, %2 589 <1> %if %0 >= 3 589 00000348 B9[700F0000] <1> mov ecx, %3 589 <1> %if %0 = 4 589 0000034D BA3C040000 <1> mov edx, %4 589 <1> %endif 589 <1> %endif 589 <1> %endif 589 00000352 B803000000 <1> mov eax, %1 589 <1> 589 00000357 CD40 <1> int 40h 590 00000359 0F8231010000 jc CloseFile 591 CheckMK: 592 ; 04/10/2017 593 0000035F A1[A8130000] mov eax, [Header+ModHeader.mhSign] 594 595 00000364 3D4D2E4B2E cmp eax, ID_MK ; cmp eax, '.K.M' 596 ;je short Is4chnMod 597 00000369 742B je short IsModFile 598 CheckFLT4: 599 0000036B 3D464C5434 cmp eax, ID_FLT4 ; cmp eax, '4TLF' 600 ;je short Is4chnMod 601 00000370 7424 je short IsModFile 602 Check8CHN: 603 00000372 3D3843484E cmp eax, ID_8CHN ; cmp eax, 'NHC8' 604 00000377 740D je short Is8chnMod 605 CheckFLT8: 606 00000379 3D464C5434 cmp eax, ID_FLT8 ; cmp eax, '8TLF' 607 ; 06/10/2017 608 0000037E 7406 je short Is8chnMod 609 00000380 F9 stc 610 00000381 E90A010000 jmp CloseFile 611 Is8chnMod: 612 00000386 C605[590F0000]08 mov byte [numtracks], 8 ; 8-CHANNEL-MOD 613 0000038D C605[580F0000]0B mov byte [pattern_shift], 11 ; Pattern Size = 2048 bytes 614 00000394 EB00 jmp short IsModFile 615 ;Is4chnMod: 616 ; mov byte [numtracks], 4 ; 4-CHANNEL-MOD 617 ; mov byte [pattern_shift], 11 ; Pattern Size = 1024 bytes 618 619 IsModFile: 620 00000396 A0[26130000] mov al, [Header+ModHeader.mhOrderLen] 621 0000039B A2[AC130000] mov [ModInfo.OrderLen], al 622 623 000003A0 A0[27130000] mov al, [Header+ModHeader.mhReStart] 624 000003A5 3A05[26130000] cmp al, [Header+ModHeader.mhOrderLen] 625 000003AB 7202 jb short SetReStart 626 000003AD B07F mov al, 7Fh 627 SetReStart: 628 000003AF A2[AD130000] mov [ModInfo.ReStart], al 629 630 ;mov ecx, 128 631 000003B4 66B98000 mov cx, 128 632 000003B8 31D2 xor edx, edx 633 000003BA 31DB xor ebx, ebx 634 CopyOrder: 635 000003BC 8AB3[28130000] mov dh, [Header+ModHeader.mhOrder+ebx] 636 000003C2 88B3[AE130000] mov [ModInfo.Order+ebx], dh 637 000003C8 38D6 cmp dh, dl 638 000003CA 7202 jb short NextOrder 639 000003CC 88F2 mov dl, dh ; Max. pattern number ; 04/10/2017 640 NextOrder: 641 000003CE 43 inc ebx 642 000003CF E2EB loop CopyOrder 643 AllocPatterns: 644 000003D1 81E2FF000000 and edx, 0FFh 645 ; 04/10/2017 646 ;inx dx ; 12/03/2017 647 000003D7 FEC2 inc dl 648 ; dl = number of patterns (04/07/2017) 649 000003D9 8A0D[580F0000] mov cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels 650 000003DF D3E2 shl edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4) 651 ; *2048 ; (byte count of patterns *64*8*4) 652 ; 653 000003E1 89D5 mov ebp, edx ; offset of samples (04/07/2017) 654 ;mov ecx, 10000h ; next 64K (4096*16) 655 000003E3 B9[00000200] mov ecx, file_buffer ; 12/03/2017 656 ; 657 000003E8 890D[2E140000] mov [ModInfo.Patterns], ecx 658 ; 659 000003EE 01CD add ebp, ecx ; next offset for samples 660 ReadPatterns: 661 ;mov ebx, [FileHandle] 662 ; ebx = File handle 663 ; ecx = Buffer address 664 ; edx = Byte count 665 sys _read, [FileHandle] 665 <1> 665 <1> 665 <1> 665 <1> 665 <1> %if %0 >= 2 665 000003F0 8B1D[6C0F0000] <1> mov ebx, %2 665 <1> %if %0 >= 3 665 <1> mov ecx, %3 665 <1> %if %0 = 4 665 <1> mov edx, %4 665 <1> %endif 665 <1> %endif 665 <1> %endif 665 000003F6 B803000000 <1> mov eax, %1 665 <1> 665 000003FB CD40 <1> int 40h 666 000003FD 0F828D000000 jc CloseFile 667 668 ; patterns have been loaded here... (04/07/2017) 669 670 00000403 BE[840F0000] mov esi, Header+ModHeader.mhSamples 671 00000408 31FF xor edi, edi 672 CopySamples: 673 0000040A 668B4616 mov ax, [esi+ModSample.msLength] 674 0000040E 86C4 xchg al, ah 675 00000410 66D1E0 shl ax, 1 676 00000413 668987[AE140000] mov [ModInfo.SampLen+edi], ax 677 0000041A 8A4619 mov al, [esi+ModSample.msVolume] 678 0000041D 30E4 xor ah, ah 679 0000041F 668987[68150000] mov [ModInfo.SampVol+edi], ax 680 00000426 668B461A mov ax, [esi+ModSample.msRepeat] 681 0000042A 86C4 xchg al, ah 682 0000042C 66D1E0 shl ax, 1 683 0000042F 668987[EC140000] mov [ModInfo.SampRep+edi], ax 684 00000436 668B461C mov ax, [esi+ModSample.msRepLen] 685 0000043A 86C4 xchg al, ah 686 0000043C 66D1E0 shl ax, 1 687 0000043F 668987[2A150000] mov [ModInfo.SampRepLen+edi], ax 688 00000446 83C61E add esi, ModSample.size 689 00000449 6683C702 add di, 2 690 0000044D 6683FF3E cmp di, 2*31 691 00000451 72B7 jb short CopySamples 692 693 00000453 31F6 xor esi, esi 694 AllocSamples: 695 00000455 0FB796[AE140000] movzx edx, word [ModInfo.SampLen+esi] 696 ; 07/10/2017 697 ;shr dx, 4 ; *** 698 0000045C 21D2 and edx, edx 699 0000045E 7426 jz short NextSample 700 ;inc dx ; number of paragraphs ; *** 701 ;shl dx, 4 ; *** 702 00000460 89E8 mov eax, ebp 703 00000462 668986[32140000] mov [ModInfo.SampOfs+esi], ax 704 00000469 C1E810 shr eax, 16 705 0000046C 668986[70140000] mov [ModInfo.SampSeg+esi], ax 706 00000473 89E9 mov ecx, ebp 707 00000475 01D5 add ebp, edx ; next offset for sample 708 ReadSample: 709 ;mov ebx, [FileHandle] 710 ;movzx edx, [ModInfo.SampLen+esi] 711 ;mov ecx, [ModInfo.SampOfs+esi] 712 713 ; ebx = File handle 714 ; ecx = Buffer address 715 ; edx = Byte count 716 sys _read, [FileHandle] 716 <1> 716 <1> 716 <1> 716 <1> 716 <1> %if %0 >= 2 716 00000477 8B1D[6C0F0000] <1> mov ebx, %2 716 <1> %if %0 >= 3 716 <1> mov ecx, %3 716 <1> %if %0 = 4 716 <1> mov edx, %4 716 <1> %endif 716 <1> %endif 716 <1> %endif 716 0000047D B803000000 <1> mov eax, %1 716 <1> 716 00000482 CD40 <1> int 40h 717 00000484 720A jc short CloseFile 718 719 NextSample: 720 00000486 6683C602 add si, 2 721 0000048A 6683FE3E cmp si, 2*31 722 0000048E 72C5 jb short AllocSamples 723 CloseFile: 724 00000490 9C pushf 725 sys _close, [FileHandle] 725 <1> 725 <1> 725 <1> 725 <1> 725 <1> %if %0 >= 2 725 00000491 8B1D[6C0F0000] <1> mov ebx, %2 725 <1> %if %0 >= 3 725 <1> mov ecx, %3 725 <1> %if %0 = 4 725 <1> mov edx, %4 725 <1> %endif 725 <1> %endif 725 <1> %endif 725 00000497 B806000000 <1> mov eax, %1 725 <1> 725 0000049C CD40 <1> int 40h 726 0000049E 9D popf 727 Failed: 728 0000049F 61 popad 729 000004A0 C3 retn 730 731 ;============================================================================= 732 ; MODPLAY.ASM 733 ;============================================================================= 734 735 ; Amiga Module Loader v0.3b by Carlos Hasan. 736 ; July 23th, 1993. 737 738 ; EQUATES 739 740 ;NumTracks equ 4 ; 06/10/2017 ([numtracks]) 741 DefTempo equ 6 742 DefBpm equ 125 743 MidCRate equ 8448 744 MixBufSize equ 4096 745 746 ; STRUCTURES 747 748 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 749 00000000 .Samples: resd 1 750 ;.Position: resw 1 751 00000004 .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 752 00000008 .Len: resw 1 753 0000000A .Repeat: resw 1 754 0000000C .RepLen: resw 1 755 0000000E .Volume: resb 1 ; Volume 756 0000000F .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 757 ;.Error: resb 1 758 ;.Reserved: resb 1 ; 01/10/2017 759 00000010 .Period: resw 1 ; Period 760 00000012 .Pitch: resw 1 761 00000014 .Effect: resw 1 ; Effect 762 00000016 .PortTo: resw 1 ; Toneporta wanted period 763 00000018 .PortParm: resb 1 ; Toneporta speed 764 00000019 .VibPos: resb 1 ; Vibrato wave position 765 0000001A .VibParm: resb 1 ; Vibrato depth/rate 766 0000001B .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 767 0000001C .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 768 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 769 0000001D .Error: resb 1 ; 01/10/2017 770 0000001E .Arp: resw 3 771 00000024 .ArpIndex: resw 1 772 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 773 endstruc 774 775 ; CODE 776 777 ;-------------------------------------------------------------------------- 778 ; updatechannel - update the track using the current effect 779 ;-------------------------------------------------------------------------- 780 ; 781 ;-------------------------------------------------------------------------- 782 ; BeatTrack: Process the next beat in one track. 783 ; In: 784 ; ds:di - Track info Address. 785 ;-------------------------------------------------------------------------- 786 787 ; edi = Track info address 788 789 updatechannel: 790 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 791 792 000004A1 668B5714 mov dx, [edi+TrackInfo.Effect] 793 794 ;test dx, dx 795 ;je short None 796 ;cmp dh, 00h 797 ;je short Arpeggio 798 ;cmp dh, 01h 799 ;je short PortUp 800 ;cmp dh, 02h 801 ;je short PortDown 802 ;cmp dh, 03h 803 ;je TonePort 804 ;cmp dh, 04h 805 ;je Vibrato 806 ;cmp dh, 05h 807 ;je PortSlide 808 ;cmp dh, 06h 809 ;je VibSlide 810 ;cmp dh, 0Ah 811 ;je VolSlide 812 ;retn 813 814 000004A5 0FB6C6 movzx eax, dh 815 000004A8 240F and al, 0Fh 816 000004AA FF2485[B00C0000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 817 efxnull: 818 None: 819 000004B1 C3 retn 820 efxarpeggio2: 821 ; 01/10/2017 822 000004B2 84D2 test dl, dl 823 000004B4 74FB jz short efxnull 824 Arpeggio: 825 000004B6 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 826 000004BA 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 827 000004BF 66894712 mov [edi+TrackInfo.Pitch], ax 828 000004C3 6683C302 add bx, 2 829 000004C7 6683FB06 cmp bx, 6 830 000004CB 7202 jb short SetArpIndex 831 000004CD 31DB xor ebx, ebx 832 SetArpIndex: 833 000004CF 66895F24 mov [edi+TrackInfo.ArpIndex], bx 834 000004D3 C3 retn 835 efxportaup: 836 PortUp: 837 000004D4 30F6 xor dh, dh 838 ;mov bx, [edi+TrackInfo.Period] 839 000004D6 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 840 000004DA 6629D3 sub bx, dx 841 ;cmp bx, 113 842 000004DD 6683FB1C cmp bx, 28 ; 01/10/2017 843 000004E1 7D04 jge short NotSmall 844 ;mov bx, 113 845 000004E3 66BB1C00 mov bx, 28 ; 01/10/2017 846 NotSmall: 847 000004E7 66895F10 mov [edi+TrackInfo.Period], bx 848 000004EB 6601DB add bx, bx 849 ;mov ax, [PitchTable+bx] 850 000004EE 668B83[A6150000] mov ax, [PitchTable+ebx] ; 02/10/2017 851 000004F5 66894712 mov [edi+TrackInfo.Pitch], ax 852 000004F9 C3 retn 853 efxportadown: 854 PortDown: 855 000004FA 30F6 xor dh, dh 856 ;mov bx, [edi+TrackInfo.Period] 857 000004FC 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 858 00000500 6601D3 add bx, dx 859 00000503 6681FB600D cmp bx, 3424 ; 01/10/2017 860 ;cmp bx, 856 861 00000508 7E04 jle short NotBig 862 ;mov bx, 856 863 0000050A 66BB600D mov bx, 3424 ; 01/10/2017 864 NotBig: 865 0000050E 66895F10 mov [edi+TrackInfo.Period], bx 866 00000512 6601DB add bx, bx 867 ;mov ax, [PitchTable+bx] 868 00000515 668B83[A6150000] mov ax, [PitchTable+ebx] ; 02/10/2017 869 0000051C 66894712 mov [edi+TrackInfo.Pitch], ax 870 00000520 C3 retn 871 efxtoneporta2: 872 TonePort: 873 00000521 30F6 xor dh, dh 874 00000523 668B4716 mov ax, [edi+TrackInfo.PortTo] 875 ;mov bx, [edi+TrackInfo.Period] 876 00000527 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 877 0000052B 6639C3 cmp bx, ax 878 0000052E 7429 je short NoPort 879 00000530 7F0D jg short PortToUp 880 PortToDown: 881 00000532 6601D3 add bx, dx 882 00000535 6639C3 cmp bx, ax 883 00000538 7E0D jle short SetPort 884 FixPort: 885 0000053A 6689C3 mov bx, ax 886 0000053D EB08 jmp short SetPort 887 PortToUp: 888 0000053F 6629D3 sub bx, dx 889 00000542 6639C3 cmp bx, ax 890 00000545 7CF3 jl short FixPort 891 SetPort: 892 00000547 66895F10 mov [edi+TrackInfo.Period], bx 893 0000054B 6601DB add bx, bx 894 ;mov ax, [PitchTable+bx] 895 0000054E 668B83[A6150000] mov ax, [PitchTable+ebx] ; 02/10/2017 896 00000555 66894712 mov [edi+TrackInfo.Pitch], ax 897 NoPort: 898 00000559 C3 retn 899 efxvibrato2: 900 ; 01/10/2017 901 Vibrato: 902 0000055A 88D6 mov dh, dl 903 ;and dl, 0Fh 904 ;shr dh, 4 905 ;shl dh, 2 906 0000055C 6681E20FF0 and dx, 0F00Fh 907 00000561 C0EE02 shr dh, 2 908 ;add [edi+TrackInfo.VibPos], dh 909 ;mov dh, [edi+TrackInfo.VibPos] 910 ;mov bl, dh 911 00000564 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 912 00000567 007719 add [edi+TrackInfo.VibPos], dh 913 0000056A 88DE mov dh, bl ; 01/10/2017 914 0000056C C0EB02 shr bl, 2 915 ;and bx, 1Fh 916 ;mov al, [SinTable+bx] 917 0000056F 83E31F and ebx, 1Fh 918 00000572 8A83[980D0000] mov al, [SinTable+ebx] 919 00000578 F6E2 mul dl 920 ;rol ax, 1 921 ;xchg al, ah 922 ;and ah, 1 923 0000057A 66C1E807 shr ax, 7 924 0000057E 84F6 test dh, dh 925 00000580 7903 jns short VibUp 926 00000582 66F7D8 neg ax 927 VibUp: 928 00000585 66034710 add ax, [edi+TrackInfo.Period] 929 00000589 6689C3 mov bx, ax 930 ;movzx ebx, ax 931 0000058C 6683FB71 cmp bx, 113 932 ;cmp bx, 113 933 00000590 6683FB1C cmp bx, 28 ; 01/10/2017 934 00000594 7D06 jge short NoLoVib 935 ;mov bx, 113 936 00000596 66BB1C00 mov bx, 28 ; 01/10/2017 937 0000059A EB0B jmp short NoHiVib ; 01/10/2017 938 NoLoVib: 939 0000059C 6681FB600D cmp bx, 3424 ; 01/10/2017 940 ;cmp bx, 856 941 000005A1 7E04 jle short NoHiVib 942 ;mov bx, 856 943 000005A3 66BB600D mov bx, 3424 ; 01/10/2017 944 NoHiVib: 945 000005A7 6601DB add bx, bx 946 ;mov ax, [PitchTable+bx] 947 000005AA 668B83[A6150000] mov ax, [PitchTable+ebx] ; 01/10/2017 948 000005B1 66894712 mov [edi+TrackInfo.Pitch], ax 949 000005B5 C3 retn 950 efxtoneslide: 951 PortSlide: 952 000005B6 E812000000 call VolSlide 953 000005BB 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 954 000005BE E95EFFFFFF jmp TonePort ; efxtoneporta2 955 efxvibslide: 956 VibSlide: 957 000005C3 E805000000 call VolSlide 958 000005C8 8A571A mov dl, [edi+TrackInfo.VibParm] 959 000005CB EB8D jmp short Vibrato ; efxvibrato2 960 efxvolslide: 961 VolSlide: 962 000005CD 88D6 mov dh, dl 963 000005CF 80E20F and dl, 0Fh 964 000005D2 C0EE04 shr dh, 4 965 000005D5 8A470E mov al, [edi+TrackInfo.Volume] 966 000005D8 28D0 sub al, dl 967 000005DA 7D02 jge short NoLoVol 968 000005DC 30C0 xor al, al 969 NoLoVol: 970 000005DE 00F0 add al, dh 971 000005E0 3C40 cmp al, 64 972 000005E2 7602 jbe short NoHiVol 973 000005E4 B040 mov al, 64 974 NoHiVol: 975 000005E6 88470E mov [edi+TrackInfo.Volume], al 976 000005E9 C3 retn 977 978 efxtremolo2: 979 ; 01/10/2017 (TMODPLAY.ASM) 980 Tremolo: 981 000005EA 88D6 mov dh, dl 982 000005EC 6681E20FF0 and dx, 0F00Fh 983 000005F1 C0EE02 shr dh, 2 984 000005F4 8A5F1B mov bl, [edi+TrackInfo.TremPos] 985 000005F7 00771B add [edi+TrackInfo.TremPos], dh 986 000005FA 88DE mov dh, bl 987 000005FC C0EB02 shr bl, 2 988 ; 01/10/2017 - TRDOS 386 989 ;and bx, 1Fh 990 000005FF 83E31F and ebx, 1Fh 991 ;mov al, [SinTable+bx] 992 00000602 8A83[980D0000] mov al, [SinTable+ebx] 993 00000608 F6E2 mul dl 994 0000060A 66C1E806 shr ax, 6 995 0000060E 84F6 test dh, dh 996 00000610 7D03 jge short Tremolo_1 ; efxtremolof2 997 00000612 66F7D8 neg ax 998 efxtremolof2: 999 Tremolo_1: 1000 00000615 8A670E mov ah, [edi+TrackInfo.Volume] 1001 00000618 00E0 add al, ah 1002 0000061A 7D02 jge short Tremolo_2 ; efxtremolof3 1003 0000061C 30C0 xor al, al 1004 efxtremolof3: 1005 Tremolo_2: 1006 0000061E 3C40 cmp al, 64 ; 40h 1007 00000620 7E02 jle short Tremolo_3 ; efxtremolof4 1008 00000622 B040 mov al, 64 ; 40h 1009 efxtremolof4: 1010 Tremolo_3: 1011 00000624 28E0 sub al, ah ; ****** 1012 00000626 88470F mov [edi+TrackInfo.VolDiff], al 1013 00000629 C3 retn 1014 1015 ;-------------------------------------------------------------------------- 1016 ; readchannel - read the next note event from the pattern sheet 1017 ;-------------------------------------------------------------------------- 1018 ; 1019 ;-------------------------------------------------------------------------- 1020 ; GetTrack: Get the next Note from a pattern. 1021 ; In: 1022 ; ds:di - Track info Address. 1023 ; es:si - Pattern Note Address. 1024 ; Out: 1025 ; es:si - The Next Pattern Note address. 1026 ;-------------------------------------------------------------------------- 1027 1028 ; esi = Pattern note address 1029 ; edi = Track info address 1030 1031 readchannel: 1032 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1033 0000062A 66AD lodsw 1034 0000062C 86C4 xchg al, ah 1035 0000062E 88E3 mov bl, ah 1036 00000630 80E40F and ah, 0Fh 1037 00000633 6689C1 mov cx, ax 1038 00000636 66AD lodsw 1039 00000638 86C4 xchg al, ah 1040 0000063A 88E7 mov bh, ah 1041 0000063C 80E40F and ah, 0Fh 1042 0000063F 6689C2 mov dx, ax 1043 00000642 66895714 mov [edi+TrackInfo.Effect], dx 1044 ; 01/10/2017 - TRDOS 386 1045 ;and bl, 0F0h 1046 00000646 81E3F0FF0000 and ebx, 0FFF0h 1047 0000064C C0EF04 shr bh, 4 1048 0000064F 08FB or bl, bh 1049 00000651 7446 je short SetPeriod 1050 SetSample: 1051 00000653 30FF xor bh, bh 1052 ;and ebx, 0FFh 1053 00000655 FECB dec bl 1054 00000657 01DB add ebx, ebx 1055 00000659 668B83[68150000] mov ax, [ModInfo.SampVol+ebx] 1056 00000660 88470E mov [edi+TrackInfo.Volume], al 1057 00000663 668B83[32140000] mov ax, [ModInfo.SampOfs+ebx] 1058 0000066A 668907 mov [edi+TrackInfo.Samples], ax 1059 0000066D 668B83[70140000] mov ax, [ModInfo.SampSeg+ebx] 1060 00000674 66894702 mov [edi+TrackInfo.Samples+2], ax 1061 00000678 668B83[AE140000] mov ax, [ModInfo.SampLen+ebx] 1062 0000067F 66894708 mov [edi+TrackInfo.Len], ax 1063 00000683 668B83[EC140000] mov ax, [ModInfo.SampRep+ebx] 1064 0000068A 6689470A mov [edi+TrackInfo.Repeat], ax 1065 0000068E 668B83[2A150000] mov ax, [ModInfo.SampRepLen+ebx] 1066 00000695 6689470C mov [edi+TrackInfo.RepLen], ax 1067 SetPeriod: 1068 00000699 6685C9 test cx, cx 1069 0000069C 7425 jz short SetEffect 1070 1071 0000069E 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1072 1073 000006A2 80FE03 cmp dh, 03h 1074 ;je short SetEffect 1075 000006A5 7428 je short efxtoneporta ; 01/10/2017 1076 1077 000006A7 66894F10 mov [edi+TrackInfo.Period], cx 1078 ;movzx ebx, cx 1079 000006AB 6689CB mov bx, cx 1080 000006AE 6601DB add bx, bx 1081 ;mov ax, [PitchTable+bx] 1082 000006B1 668B83[A6150000] mov ax, [PitchTable+ebx] ; 01/10/2017 1083 000006B8 66894712 mov [edi+TrackInfo.Pitch], ax 1084 000006BC C7470400000000 mov dword [edi+TrackInfo.Position], 0 1085 SetEffect: 1086 ;test dx, dx 1087 ;je short InitNone 1088 ;cmp dh, 00h 1089 ;je InitArpeggio 1090 ;cmp dh, 03h 1091 ;je short InitTonePort 1092 ;cmp dh, 04h 1093 ;je short InitVibrato 1094 ;cmp dh, 09h 1095 ;je short SampleOfs 1096 ;cmp dh, 0Bh 1097 ;je short PosJump 1098 ;cmp dh, 0Ch 1099 ;je short SetVolume 1100 ;cmp dh, 0Dh 1101 ;je short Break 1102 ;cmp dh, 0Fh 1103 ;je SetSpeed 1104 ;retn 1105 1106 ; 01/10/2017 (TMODPLAY.ASM) 1107 1108 ; dx = [di+TrackInfo.Effect] 1109 1110 000006C3 0FB6C6 movzx eax, dh 1111 000006C6 240F and al, 0Fh 1112 000006C8 FF2485[700C0000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1113 ;efxnull: 1114 ;InitNone: 1115 ; retn 1116 efxtoneporta: 1117 ; 01/10/2017 1118 ; cx = period 1119 ;mov [edi+TrackInfo.PortTo], cx ; * 1120 InitTonePort: 1121 000006CF 84D2 test dl, dl 1122 000006D1 7503 jnz short SetPortParm 1123 000006D3 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1124 SetPortParm: 1125 000006D6 885718 mov [edi+TrackInfo.PortParm], dl 1126 000006D9 66895714 mov [edi+TrackInfo.Effect], dx 1127 000006DD C3 retn 1128 efxvibrato: 1129 InitVibrato: 1130 000006DE 8A471A mov al, [edi+TrackInfo.VibParm] 1131 000006E1 88C4 mov ah, al 1132 ;and al, 0Fh 1133 ;and ah, 0F0h 1134 000006E3 66250FF0 and ax, 0F00Fh 1135 000006E7 F6C20F test dl, 0Fh 1136 000006EA 7502 jne short OkDepth 1137 000006EC 08C2 or dl, al 1138 OkDepth: 1139 000006EE F6C2F0 test dl, 0F0h 1140 000006F1 7502 jnz short OkRate 1141 000006F3 08E2 or dl, ah 1142 OkRate: 1143 000006F5 88571A mov [edi+TrackInfo.VibParm], dl 1144 000006F8 66895714 mov [edi+TrackInfo.Effect], dx 1145 000006FC 6685C9 test cx, cx 1146 000006FF 7404 jz short OkPos 1147 00000701 C6471900 mov byte [edi+TrackInfo.VibPos], 0 1148 OkPos: 1149 00000705 C3 retn 1150 efxsampoffset: 1151 ; 01/10/2017 ; ******* 1152 SampleOfs: 1153 ; test dl, dl 1154 ; jnz short SetSampleOfs 1155 ; mov dl, [edi+TrackInfo.OldSampOfs] 1156 ;SetSampleOfs: 1157 ; mov [edi+TrackInfo.OldSampOfs], dl 1158 00000706 88D6 mov dh, dl 1159 00000708 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1160 0000070E 895704 mov [edi+TrackInfo.Position], edx 1161 00000711 C3 retn 1162 efxpattjump: 1163 PosJump: 1164 00000712 8815[68810000] mov [OrderPos], dl 1165 00000718 C605[6C810000]40 mov byte [Row], 64 1166 0000071F C3 retn 1167 efxsetvolume: 1168 SetVolume: 1169 00000720 80FA40 cmp dl, 64 1170 00000723 7602 jbe short OkVol 1171 00000725 B240 mov dl, 64 1172 OkVol: 1173 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1174 00000727 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1175 ;mov [edi+TrackInfo.Volume], dl 1176 00000729 6689570E mov [edi+TrackInfo.Volume], dx 1177 0000072D C3 retn 1178 efxbreak: 1179 Break: 1180 0000072E 88D6 mov dh, dl 1181 00000730 80E20F and dl, 0Fh 1182 00000733 C0EE04 shr dh, 4 1183 00000736 00F6 add dh, dh 1184 00000738 00F2 add dl, dh 1185 0000073A C0E602 shl dh, 2 1186 0000073D 00F2 add dl, dh 1187 0000073F 8815[6D810000] mov [BreakRow], dl 1188 00000745 C605[6C810000]40 mov byte [Row], 64 1189 0000074C C3 retn 1190 efxsetspeed: 1191 SetSpeed: 1192 0000074D 84D2 test dl,dl 1193 0000074F 7432 je Skip 1194 00000751 80FA1F cmp dl,31 1195 00000754 770D ja short SetBpm 1196 SetTempo: 1197 00000756 8815[69810000] mov [Tempo], dl 1198 0000075C 8815[6A810000] mov [TempoWait], dl 1199 00000762 C3 retn 1200 SetBpm: 1201 00000763 8815[6B810000] mov [Bpm], dl 1202 00000769 B067 mov al, 103 1203 0000076B F6E2 mul dl 1204 0000076D 88E3 mov bl, ah 1205 0000076F 30FF xor bh, bh 1206 00000771 66A1[BC0D0000] mov ax, [MixSpeed] 1207 00000777 6631D2 xor dx, dx 1208 0000077A 66F7F3 div bx 1209 0000077D 66A3[6E810000] mov [BpmSamples], ax 1210 Skip: 1211 00000783 C3 retn 1212 efxarpeggio: 1213 ; 01/10/2017 1214 00000784 84D2 test dl, dl 1215 ;je efxnull 1216 00000786 74FB je short Skip 1217 InitArpeggio: 1218 00000788 88D6 mov dh, dl 1219 0000078A 80E20F and dl, 0Fh 1220 0000078D C0EE04 shr dh, 4 1221 ; 01/10/2017 1222 ;mov cx, 36 1223 00000790 66B95400 mov cx, 84 ; 84 notes/periods 1224 00000794 31DB xor ebx, ebx 1225 00000796 668B4710 mov ax, [edi+TrackInfo.Period] 1226 gt_ScanPeriod: 1227 ;cmp ax, [PeriodTable+bx] 1228 0000079A 663B83[F00C0000] cmp ax, [PeriodTable+ebx] 1229 000007A1 7306 jae short SetArp 1230 000007A3 6683C302 add bx, 2 1231 000007A7 E2F1 loop gt_ScanPeriod 1232 SetArp: 1233 000007A9 6601D2 add dx, dx 1234 000007AC 00DE add dh, bl 1235 000007AE 00DA add dl, bl 1236 ; 01/10/2017 1237 ;mov bx, [PeriodTable+bx] 1238 000007B0 668B9B[F00C0000] mov bx, [PeriodTable+ebx] 1239 ;add bx, bx 1240 000007B7 01DB add ebx, ebx 1241 ;mov ax, [PitchTable+bx] 1242 000007B9 668B83[A6150000] mov ax, [PitchTable+ebx] 1243 000007C0 6689471E mov [edi+TrackInfo.Arp], ax 1244 000007C4 88F3 mov bl, dh 1245 000007C6 30FF xor bh, bh 1246 000007C8 668B9B[F00C0000] mov bx, [PeriodTable+ebx] 1247 ;add bx, bx 1248 000007CF 01DB add ebx, ebx 1249 ;mov ax, [PitchTable+bx] 1250 000007D1 668B83[A6150000] mov ax, [PitchTable+ebx] 1251 000007D8 66894720 mov [edi+TrackInfo.Arp+2], ax 1252 000007DC 88D3 mov bl, dl 1253 000007DE 30FF xor bh, bh 1254 000007E0 668B9B[F00C0000] mov bx, [PeriodTable+ebx] 1255 ;add bx, bx 1256 000007E7 01DB add ebx, ebx 1257 ;mov ax, [PitchTable+bx] 1258 000007E9 668B83[A6150000] mov ax, [PitchTable+ebx] 1259 000007F0 66894722 mov [edi+TrackInfo.Arp+4], ax 1260 000007F4 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1261 000007FA C3 retn 1262 1263 efxtremolo: 1264 ; 01/10/2017 (TMODPLAY.ASM) 1265 InitTremolo: 1266 000007FB 8A471C mov al, [edi+TrackInfo.TremParm] 1267 000007FE 88C4 mov ah, al 1268 00000800 66250FF0 and ax, 0F00Fh 1269 00000804 F6C20F test dl, 0Fh 1270 00000807 7502 jnz short InitTremolo_1 ; efxtremolof0 1271 00000809 08C2 or dl, al 1272 efxtremolof0: 1273 InitTremolo_1: 1274 0000080B F6C2F0 test dl, 0F0h 1275 0000080E 7502 jnz short InitTremolo_2 ; efxtremolof1 1276 00000810 08E2 or dl, ah 1277 efxtremolof1: 1278 InitTremolo_2: 1279 00000812 88571C mov [edi+TrackInfo.TremParm], dl 1280 00000815 66895714 mov [edi+TrackInfo.Effect], dx 1281 00000819 C3 retn 1282 1283 ;-------------------------------------------------------------------------- 1284 ; pollmodule - polls the module player 1285 ;-------------------------------------------------------------------------- 1286 ;-------------------------------------------------------------------------- 1287 ; UpdateTracks: Main code to process the next tick to be played. 1288 ;-------------------------------------------------------------------------- 1289 1290 pollmodule: 1291 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1292 0000081A FE0D[6A810000] dec byte [TempoWait] 1293 00000820 7417 jz short GetTracks 1294 1295 ;mov ecx, NumTracks 1296 00000822 0FB70D[590F0000] movzx ecx, word [numtracks] ; 06/10/2017 1297 00000829 BF[7E810000] mov edi, Tracks 1298 BeatTracks: 1299 0000082E E86EFCFFFF call BeatTrack 1300 00000833 83C726 add edi, TrackInfo.size 1301 00000836 E2F6 loop BeatTracks 1302 00000838 C3 retn 1303 GetTracks: 1304 00000839 A0[69810000] mov al, [Tempo] 1305 0000083E A2[6A810000] mov [TempoWait], al 1306 1307 00000843 8B35[7A810000] mov esi, [Note] 1308 00000849 803D[6C810000]40 cmp byte [Row], 64 1309 00000850 7268 jb short NoPattWrap 1310 1311 00000852 8B35[2E140000] mov esi, [ModInfo.Patterns] 1312 00000858 8A1D[68810000] mov bl, [OrderPos] 1313 0000085E 3A1D[AC130000] cmp bl, [ModInfo.OrderLen] 1314 00000864 7214 jb short NoOrderWrap 1315 00000866 8A1D[AD130000] mov bl, [ModInfo.ReStart] 1316 0000086C 881D[68810000] mov [OrderPos], bl 1317 00000872 3A1D[AC130000] cmp bl, [ModInfo.OrderLen] 1318 00000878 7364 jae short NoUpdate 1319 NoOrderWrap: 1320 ;xor bh, bh 1321 0000087A 81E3FF000000 and ebx, 0FFh 1322 00000880 8A9B[AE130000] mov bl, [ModInfo.Order+ebx] 1323 ; 05/10/2017 1324 ;shl ebx, 10 ; *1024 1325 00000886 8A0D[580F0000] mov cl, [pattern_shift] ; 10 or 11 1326 0000088C D3E3 shl ebx, cl ; *1024 or *2048 1327 ; 1328 0000088E 01DE add esi, ebx 1329 00000890 8A1D[6D810000] mov bl, [BreakRow] 1330 00000896 881D[6C810000] mov [Row], bl 1331 ;xor bh, bh 1332 0000089C 81E3FF000000 and ebx, 0FFh 1333 000008A2 883D[6D810000] mov [BreakRow], bh ; 0 1334 000008A8 66C1E304 shl bx, 4 1335 000008AC 01DE add esi, ebx 1336 000008AE 8935[7A810000] mov [Note], esi 1337 000008B4 FE05[68810000] inc byte [OrderPos] 1338 NoPattWrap: 1339 000008BA FE05[6C810000] inc byte [Row] 1340 1341 ;cld 1342 ;mov ecx, NumTracks 1343 000008C0 0FB70D[590F0000] movzx ecx, word [numtracks] ; 06/10/2017 1344 000008C7 BF[7E810000] mov edi, Tracks 1345 GetTracks_next: 1346 000008CC 51 push ecx 1347 000008CD E858FDFFFF call GetTrack 1348 000008D2 59 pop ecx 1349 000008D3 83C726 add edi, TrackInfo.size 1350 000008D6 E2F4 loop GetTracks_next 1351 1352 000008D8 8935[7A810000] mov [Note], esi 1353 NoUpdate: 1354 000008DE C3 retn 1355 1356 ;-------------------------------------------------------------------------- 1357 ; MixTrack: Mixes one track into a CLEAN buffer. 1358 ; In: 1359 ; ds:si - Track Info Address. 1360 ; ds:di - Buffer Address. 1361 ; cx - Buffer Size. 1362 ;-------------------------------------------------------------------------- 1363 1364 ; esi = Track info address 1365 ; edi = Buffer address 1366 ; ecx = Buffer size 1367 1368 MixTrack: 1369 000008DF 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1370 000008E4 7752 ja short MixLooped 1371 MixNonLooped: 1372 000008E6 8B16 mov edx, [esi+TrackInfo.Samples] 1373 000008E8 8B5E04 mov ebx, [esi+TrackInfo.Position] 1374 000008EB 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1375 000008EF 52 push edx 1376 000008F0 56 push esi 1377 000008F1 01D3 add ebx, edx 1378 000008F3 01D5 add ebp, edx 1379 000008F5 668B5612 mov dx, [esi+TrackInfo.Pitch] 1380 ; 01/10/2017 1381 ;mov al, [esi+TrackInfo.Volume] 1382 000008F9 668B460E mov ax, [esi+TrackInfo.Volume] 1383 ; ah = [esi+TrackInfo.VolDiff] 1384 000008FD 00E0 add al, ah ; ****** 1385 000008FF C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1386 00000903 8A661D mov ah, [esi+TrackInfo.Error] 1387 00000906 89DE mov esi, ebx 1388 00000908 31DB xor ebx, ebx ; 01/10/2017 ; * 1389 0000090A 88C7 mov bh, al 1390 0000090C 88D0 mov al, dl 1391 0000090E 88F2 mov dl, dh 1392 ;xor dh, dh 1393 00000910 81E2FF000000 and edx, 0FFh 1394 nlMixSamp: 1395 00000916 39EE cmp esi, ebp 1396 00000918 7311 jae short nlMixBye 1397 0000091A 8A1E mov bl, [esi] 1398 ;mov bl, [VolTable+bx] 1399 0000091C 8A9B[68300000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1400 00000922 001F add [edi], bl 1401 00000924 47 inc edi 1402 00000925 00C4 add ah, al 1403 00000927 11D6 adc esi, edx 1404 00000929 E2EB loop nlMixSamp 1405 nlMixBye: 1406 0000092B 89F3 mov ebx, esi 1407 0000092D 5E pop esi 1408 0000092E 5A pop edx 1409 0000092F 29D3 sub ebx, edx 1410 00000931 895E04 mov [esi+TrackInfo.Position], ebx 1411 00000934 88661D mov [esi+TrackInfo.Error], ah 1412 00000937 C3 retn 1413 MixLooped: 1414 00000938 8B16 mov edx, [esi+TrackInfo.Samples] 1415 0000093A 8B5E04 mov ebx, [esi+TrackInfo.Position] 1416 0000093D 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1417 00000941 892D[76810000] mov [BufRep], ebp 1418 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1419 00000947 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1420 0000094B 52 push edx 1421 0000094C 56 push esi 1422 0000094D 01D3 add ebx, edx 1423 0000094F 01D5 add ebp, edx 1424 00000951 668B5612 mov dx, [esi+TrackInfo.Pitch] 1425 ; 01/10/2017 1426 ;mov al, [esi+TrackInfo.Volume] 1427 00000955 668B460E mov ax, [esi+TrackInfo.Volume] 1428 ; ah = [esi+TrackInfo.VolDiff] 1429 00000959 00E0 add al, ah ; ****** 1430 0000095B C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1431 0000095F 8A661D mov ah, [esi+TrackInfo.Error] 1432 ;mov si, bx 1433 00000962 89DE mov esi, ebx ; 04/09/2017 1434 00000964 31DB xor ebx, ebx ; 01/10/2017 ; * 1435 00000966 88C7 mov bh, al 1436 00000968 88D0 mov al, dl 1437 0000096A 88F2 mov dl, dh 1438 ;xor dh, dh 1439 0000096C 81E2FF000000 and edx, 0FFh 1440 lpMixSamp: 1441 00000972 39EE cmp esi, ebp 1442 00000974 7206 jb short lpMixNow 1443 00000976 2B35[76810000] sub esi, [BufRep] 1444 lpMixNow: 1445 0000097C 8A1E mov bl, [esi] 1446 ;mov bl, [VolTable+bx] 1447 0000097E 8A9B[68300000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1448 00000984 001F add [edi], bl 1449 00000986 47 inc edi 1450 00000987 00C4 add ah, al 1451 00000989 11D6 adc esi, edx 1452 0000098B E2E5 loop lpMixSamp 1453 lpMixBye: 1454 ; mov ebx, esi 1455 ; pop esi 1456 ; pop edx 1457 ; sub ebx, edx 1458 ; mov [esi+TrackInfo.Position], ebx 1459 ; mov [esi+TrackInfo.Error], ah 1460 ; retn 1461 0000098D EB9C jmp short nlMixBye 1462 1463 ;-------------------------------------------------------------------------- 1464 ; GetSamples: Returns the next chunk of samples to be played. 1465 ; In: 1466 ; Buffer - Buffer Address. 1467 ; Count - Buffer Size. 1468 ;-------------------------------------------------------------------------- 1469 1470 mixpoll: 1471 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1472 ; edi = buffer address 1473 ; ebx = count 1474 1475 0000098F 60 pushad 1476 1477 ;cld 1478 NextChunk: 1479 00000990 66833D[74810000]00 cmp word [BufLen], 0 1480 00000998 754A jne short CopyChunk 1481 1482 0000099A 53 push ebx 1483 0000099B 57 push edi 1484 MixChunk: 1485 0000099C BF[68710000] mov edi, MixBuffer 1486 000009A1 0FB70D[6E810000] movzx ecx, word [BpmSamples] 1487 ;mov cx, [BpmSamples] 1488 000009A8 893D[70810000] mov [BufPtr], edi 1489 000009AE 66890D[74810000] mov [BufLen], cx 1490 1491 000009B5 B080 mov al, 80h 1492 000009B7 F3AA rep stosb 1493 1494 ;mov cx, NumTracks 1495 ;mov cl, NumTracks ; 01/10/2017 1496 000009B9 8A0D[590F0000] mov cl, [numtracks] ; 06/10/2017 1497 000009BF BE[58810000] mov esi, Tracks - TrackInfo.size 1498 GetSamples_next: 1499 000009C4 51 push ecx 1500 000009C5 83C626 add esi, TrackInfo.size 1501 000009C8 668B0D[74810000] mov cx, [BufLen] 1502 000009CF 8B3D[70810000] mov edi, [BufPtr] 1503 000009D5 E805FFFFFF call MixTrack 1504 000009DA 59 pop ecx 1505 000009DB E2E7 loop GetSamples_next 1506 1507 000009DD E838FEFFFF call UpdateTracks 1508 1509 000009E2 5F pop edi 1510 000009E3 5B pop ebx 1511 CopyChunk: 1512 ;mov cx, [BufLen] 1513 000009E4 0FB70D[74810000] movzx ecx, word [BufLen] 1514 000009EB 39D9 cmp ecx, ebx 1515 ;cmp cx, bx 1516 000009ED 7602 jbe short MoveChunk 1517 ;mov cx, bx 1518 000009EF 89D9 mov ecx, ebx 1519 MoveChunk: 1520 000009F1 8B35[70810000] mov esi, [BufPtr] 1521 000009F7 010D[70810000] add [BufPtr], ecx 1522 000009FD 66290D[74810000] sub [BufLen], cx 1523 00000A04 29CB sub ebx, ecx 1524 00000A06 F3A4 rep movsb 1525 00000A08 85DB test ebx, ebx 1526 00000A0A 7584 jnz short NextChunk 1527 1528 00000A0C 61 popad 1529 00000A0D C3 retn 1530 1531 ;-------------------------------------------------------------------------- 1532 ; StartPlaying: Initializes the Sound System. 1533 ; In: 1534 ; Module Information Resources. 1535 ;-------------------------------------------------------------------------- 1536 1537 StartPlaying: 1538 00000A0E 60 pushad 1539 SetModParms: 1540 00000A0F C605[68810000]00 mov byte [OrderPos], 0 1541 00000A16 C605[69810000]06 mov byte [Tempo], DefTempo 1542 00000A1D C605[6A810000]06 mov byte [TempoWait], DefTempo 1543 00000A24 C605[6B810000]7D mov byte [Bpm], DefBpm 1544 00000A2B C605[6C810000]40 mov byte [Row], 64 1545 00000A32 C605[6D810000]00 mov byte [BreakRow], 0 1546 00000A39 66A1[BC0D0000] mov ax, [MixSpeed] 1547 00000A3F 31D2 xor edx, edx 1548 00000A41 66BB3200 mov bx, 24*DefBpm/60 1549 00000A45 66F7F3 div bx 1550 00000A48 66A3[6E810000] mov [BpmSamples], ax 1551 ClearTracks: 1552 00000A4E BF[7E810000] mov edi, Tracks 1553 ; 06/10/2017 1554 ;mov ecx, NumTracks*TrackInfo.size 1555 00000A53 B826000000 mov eax, TrackInfo.size 1556 00000A58 0FB70D[590F0000] movzx ecx, word [numtracks] 1557 00000A5F F7E1 mul ecx 1558 00000A61 89C1 mov ecx, eax 1559 00000A63 31C0 xor eax, eax 1560 ;cld 1561 00000A65 F3AA rep stosb 1562 1563 00000A67 A3[70810000] mov [BufPtr], eax 1564 00000A6C 66A3[74810000] mov [BufLen], ax 1565 MakePitch: 1566 00000A72 66B80021 mov ax, MidCRate 1567 00000A76 66BBAC01 mov bx, 428 1568 00000A7A 66F7E3 mul bx 1569 00000A7D 66F735[BC0D0000] div word [MixSpeed] 1570 00000A84 30F6 xor dh, dh 1571 00000A86 88E2 mov dl, ah 1572 00000A88 88C4 mov ah, al 1573 00000A8A 30C0 xor al, al 1574 ;mov cx, 857 1575 00000A8C 66B9610D mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1576 00000A90 31DB xor ebx, ebx 1577 00000A92 BF[A6150000] mov edi, PitchTable 1578 PitchLoop: 1579 00000A97 50 push eax 1580 00000A98 52 push edx 1581 00000A99 6639DA cmp dx, bx 1582 00000A9C 7303 jae short NoDiv 1583 00000A9E 66F7F3 div bx 1584 NoDiv: 1585 00000AA1 66AB stosw 1586 00000AA3 5A pop edx 1587 00000AA4 58 pop eax 1588 00000AA5 43 inc ebx 1589 00000AA6 E2EF loop PitchLoop 1590 MakeVolume: 1591 00000AA8 66B90041 mov cx, 16640 1592 00000AAC 89CB mov ebx, ecx 1593 VolLoop: 1594 00000AAE 4B dec ebx 1595 00000AAF 88D8 mov al, bl 1596 00000AB1 F6EF imul bh 1597 00000AB3 88A3[68300000] mov [VolTable+ebx], ah 1598 00000AB9 E2F3 loop VolLoop 1599 1600 00000ABB 61 popad 1601 00000ABC C3 retn 1602 1603 ;-------------------------------------------------------------------------- 1604 ; StopPlaying: ShutDown the Sound System. 1605 ;-------------------------------------------------------------------------- 1606 1607 StopPlaying: 1608 ; 19/06/2017 1609 ; Stop Playing 1610 sys _audio, 0700h 1610 <1> 1610 <1> 1610 <1> 1610 <1> 1610 <1> %if %0 >= 2 1610 00000ABD BB00070000 <1> mov ebx, %2 1610 <1> %if %0 >= 3 1610 <1> mov ecx, %3 1610 <1> %if %0 = 4 1610 <1> mov edx, %4 1610 <1> %endif 1610 <1> %endif 1610 <1> %endif 1610 00000AC2 B820000000 <1> mov eax, %1 1610 <1> 1610 00000AC7 CD40 <1> int 40h 1611 ; Cancel callback service (for user) 1612 sys _audio, 0900h 1612 <1> 1612 <1> 1612 <1> 1612 <1> 1612 <1> %if %0 >= 2 1612 00000AC9 BB00090000 <1> mov ebx, %2 1612 <1> %if %0 >= 3 1612 <1> mov ecx, %3 1612 <1> %if %0 = 4 1612 <1> mov edx, %4 1612 <1> %endif 1612 <1> %endif 1612 <1> %endif 1612 00000ACE B820000000 <1> mov eax, %1 1612 <1> 1612 00000AD3 CD40 <1> int 40h 1613 ; Deallocate Audio Buffer (for user) 1614 sys _audio, 0A00h 1614 <1> 1614 <1> 1614 <1> 1614 <1> 1614 <1> %if %0 >= 2 1614 00000AD5 BB000A0000 <1> mov ebx, %2 1614 <1> %if %0 >= 3 1614 <1> mov ecx, %3 1614 <1> %if %0 = 4 1614 <1> mov edx, %4 1614 <1> %endif 1614 <1> %endif 1614 <1> %endif 1614 00000ADA B820000000 <1> mov eax, %1 1614 <1> 1614 00000ADF CD40 <1> int 40h 1615 ; Disable Audio Device 1616 sys _audio, 0C00h 1616 <1> 1616 <1> 1616 <1> 1616 <1> 1616 <1> %if %0 >= 2 1616 00000AE1 BB000C0000 <1> mov ebx, %2 1616 <1> %if %0 >= 3 1616 <1> mov ecx, %3 1616 <1> %if %0 = 4 1616 <1> mov edx, %4 1616 <1> %endif 1616 <1> %endif 1616 <1> %endif 1616 00000AE6 B820000000 <1> mov eax, %1 1616 <1> 1616 00000AEB CD40 <1> int 40h 1617 1618 00000AED C3 retn 1619 1620 ;============================================================================= 1621 ; 1622 ;============================================================================= 1623 1624 ;dword2str: 1625 ; ; 13/11/2016 - Erdogan Tan 1626 ; ; eax = dword value 1627 ; ; 1628 ; call dwordtohex 1629 ; mov [dword_str], edx 1630 ; mov [dword_str+4], eax 1631 ; mov si, dword_str 1632 ; retn 1633 1634 ; 05/03/2017 (TRDOS 386) 1635 ; trdos386.s (unix386.s) - 10/05/2015 1636 ; Convert binary number to hexadecimal string 1637 1638 ;bytetohex: 1639 ; ; INPUT -> 1640 ; ; AL = byte (binary number) 1641 ; ; OUTPUT -> 1642 ; ; AX = hexadecimal string 1643 ; ; 1644 ; push ebx 1645 ; movzx ebx, al 1646 ; shr bl, 4 1647 ; mov bl, [ebx+hex_chars] 1648 ; xchg bl, al 1649 ; and bl, 0Fh 1650 ; mov ah, [ebx+hex_chars] 1651 ; pop ebx 1652 ; retn 1653 1654 ;wordtohex: 1655 ; ; INPUT -> 1656 ; ; AX = word (binary number) 1657 ; ; OUTPUT -> 1658 ; ; EAX = hexadecimal string 1659 ; ; 1660 ; push ebx 1661 ; xor ebx, ebx 1662 ; xchg ah, al 1663 ; push eax 1664 ; mov bl, ah 1665 ; shr bl, 4 1666 ; mov al, [ebx+hex_chars] 1667 ; mov bl, ah 1668 ; and bl, 0Fh 1669 ; mov ah, [ebx+hex_chars] 1670 ; shl eax, 16 1671 ; pop eax 1672 ; pop ebx 1673 ; jmp short bytetohex 1674 1675 ;dwordtohex: 1676 ; ; INPUT -> 1677 ; ; EAX = dword (binary number) 1678 ; ; OUTPUT -> 1679 ; ; EDX:EAX = hexadecimal string 1680 ; ; 1681 ; push eax 1682 ; shr eax, 16 1683 ; call wordtohex 1684 ; mov edx, eax 1685 ; pop eax 1686 ; call wordtohex 1687 ; retn 1688 1689 ; 19/06/2017 1690 ; 05/03/2017 (TRDOS 386) 1691 ; 13/11/2016 - Erdogan Tan 1692 write_audio_dev_info: 1693 ; BUS/DEV/FN 1694 ; 00000000BBBBBBBBDDDDDFFF00000000 1695 ; DEV/VENDOR 1696 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1697 1698 00000AEE 8B35[5C0F0000] mov esi, [dev_vendor] 1699 00000AF4 6689F0 mov ax, si 1700 00000AF7 0FB6D8 movzx ebx, al 1701 00000AFA 88DA mov dl, bl 1702 00000AFC 80E30F and bl, 0Fh 1703 00000AFF 8A83[BE0D0000] mov al, [ebx+hex_chars] 1704 00000B05 A2[030E0000] mov [msgVendorId+3], al 1705 00000B0A 88D3 mov bl, dl 1706 00000B0C C0EB04 shr bl, 4 1707 00000B0F 8A83[BE0D0000] mov al, [ebx+hex_chars] 1708 00000B15 A2[020E0000] mov [msgVendorId+2], al 1709 00000B1A 88E3 mov bl, ah 1710 00000B1C 88DA mov dl, bl 1711 00000B1E 80E30F and bl, 0Fh 1712 00000B21 8A83[BE0D0000] mov al, [ebx+hex_chars] 1713 00000B27 A2[010E0000] mov [msgVendorId+1], al 1714 00000B2C 88D3 mov bl, dl 1715 00000B2E C0EB04 shr bl, 4 1716 00000B31 8A83[BE0D0000] mov al, [ebx+hex_chars] 1717 00000B37 A2[000E0000] mov [msgVendorId], al 1718 00000B3C C1EE10 shr esi, 16 1719 00000B3F 6689F0 mov ax, si 1720 00000B42 88C3 mov bl, al 1721 00000B44 88DA mov dl, bl 1722 00000B46 80E30F and bl, 0Fh 1723 00000B49 8A83[BE0D0000] mov al, [ebx+hex_chars] 1724 00000B4F A2[140E0000] mov [msgDevId+3], al 1725 00000B54 88D3 mov bl, dl 1726 00000B56 C0EB04 shr bl, 4 1727 00000B59 8A83[BE0D0000] mov al, [ebx+hex_chars] 1728 00000B5F A2[130E0000] mov [msgDevId+2], al 1729 00000B64 88E3 mov bl, ah 1730 00000B66 88DA mov dl, bl 1731 00000B68 80E30F and bl, 0Fh 1732 00000B6B 8A83[BE0D0000] mov al, [ebx+hex_chars] 1733 00000B71 A2[120E0000] mov [msgDevId+1], al 1734 00000B76 88D3 mov bl, dl 1735 00000B78 C0EB04 shr bl, 4 1736 00000B7B 8A83[BE0D0000] mov al, [ebx+hex_chars] 1737 00000B81 A2[110E0000] mov [msgDevId], al 1738 1739 00000B86 8B35[600F0000] mov esi, [bus_dev_fn] 1740 00000B8C C1EE08 shr esi, 8 1741 00000B8F 6689F0 mov ax, si 1742 00000B92 88C3 mov bl, al 1743 00000B94 88DA mov dl, bl 1744 00000B96 80E307 and bl, 7 ; bit 0,1,2 1745 00000B99 8A83[BE0D0000] mov al, [ebx+hex_chars] 1746 00000B9F A2[380E0000] mov [msgFncNo+1], al 1747 00000BA4 88D3 mov bl, dl 1748 00000BA6 C0EB03 shr bl, 3 1749 00000BA9 88DA mov dl, bl 1750 00000BAB 80E30F and bl, 0Fh 1751 00000BAE 8A83[BE0D0000] mov al, [ebx+hex_chars] 1752 00000BB4 A2[2A0E0000] mov [msgDevNo+1], al 1753 00000BB9 88D3 mov bl, dl 1754 00000BBB C0EB04 shr bl, 4 1755 00000BBE 8A83[BE0D0000] mov al, [ebx+hex_chars] 1756 00000BC4 A2[290E0000] mov [msgDevNo], al 1757 00000BC9 88E3 mov bl, ah 1758 00000BCB 88DA mov dl, bl 1759 00000BCD 80E30F and bl, 0Fh 1760 00000BD0 8A83[BE0D0000] mov al, [ebx+hex_chars] 1761 00000BD6 A2[1E0E0000] mov [msgBusNo+1], al 1762 00000BDB 88D3 mov bl, dl 1763 00000BDD C0EB04 shr bl, 4 1764 00000BE0 8A83[BE0D0000] mov al, [ebx+hex_chars] 1765 00000BE6 A2[1D0E0000] mov [msgBusNo], al 1766 1767 00000BEB 66A1[680F0000] mov ax, [ac97_io_base] 1768 00000BF1 88C3 mov bl, al 1769 00000BF3 88DA mov dl, bl 1770 00000BF5 80E30F and bl, 0Fh 1771 00000BF8 8A83[BE0D0000] mov al, [ebx+hex_chars] 1772 00000BFE A2[510E0000] mov [msgIOBaseAddr+3], al 1773 00000C03 88D3 mov bl, dl 1774 00000C05 C0EB04 shr bl, 4 1775 00000C08 8A83[BE0D0000] mov al, [ebx+hex_chars] 1776 00000C0E A2[500E0000] mov [msgIOBaseAddr+2], al 1777 00000C13 88E3 mov bl, ah 1778 00000C15 88DA mov dl, bl 1779 00000C17 80E30F and bl, 0Fh 1780 00000C1A 8A83[BE0D0000] mov al, [ebx+hex_chars] 1781 00000C20 A2[4F0E0000] mov [msgIOBaseAddr+1], al 1782 00000C25 88D3 mov bl, dl 1783 00000C27 C0EB04 shr bl, 4 1784 00000C2A 8A83[BE0D0000] mov al, [ebx+hex_chars] 1785 00000C30 A2[4E0E0000] mov [msgIOBaseAddr], al 1786 1787 ; 24/11/2016 1788 00000C35 30E4 xor ah, ah 1789 00000C37 A0[6A0F0000] mov al, [ac97_int_ln_reg] 1790 00000C3C B10A mov cl, 10 1791 00000C3E F6F1 div cl 1792 00000C40 660105[590E0000] add [msgIRQ], ax 1793 00000C47 20C0 and al, al 1794 00000C49 750D jnz short _w_ac97imsg_ ; 19/06/2017 1795 00000C4B A0[5A0E0000] mov al, [msgIRQ+1] 1796 00000C50 B420 mov ah, ' ' 1797 00000C52 66A3[590E0000] mov [msgIRQ], ax 1798 _w_ac97imsg_: 1799 ; EBX = Message address 1800 ; ECX = Max. message length (or stop on ZERO character) 1801 ; (1 to 255) 1802 ; DL = Message color (07h = light gray, 0Fh = white) 1803 sys _msg, msgAC97Info, 255, 07h 1803 <1> 1803 <1> 1803 <1> 1803 <1> 1803 <1> %if %0 >= 2 1803 00000C58 BB[CF0D0000] <1> mov ebx, %2 1803 <1> %if %0 >= 3 1803 00000C5D B9FF000000 <1> mov ecx, %3 1803 <1> %if %0 = 4 1803 00000C62 BA07000000 <1> mov edx, %4 1803 <1> %endif 1803 <1> %endif 1803 <1> %endif 1803 00000C67 B823000000 <1> mov eax, %1 1803 <1> 1803 00000C6C CD40 <1> int 40h 1804 00000C6E C3 retn 1805 1806 ;============================================================================= 1807 ; preinitialized data 1808 ;============================================================================= 1809 1810 ;============================================================================= 1811 ; Protracker effects stuff 1812 ;============================================================================= 1813 1814 ;----------------------------------------------------------------------------- 1815 ; Effect jump tables 1816 ;----------------------------------------------------------------------------- 1817 1818 00000C6F 90 align 4 1819 1820 efxtable: 1821 00000C70 [84070000] dd efxarpeggio ; 0 - arpeggio 1822 00000C74 [B1040000] dd efxnull ; 1 - porta up 1823 00000C78 [B1040000] dd efxnull ; 2 - porta down 1824 00000C7C [CF060000] dd efxtoneporta ; 3 - tone porta 1825 00000C80 [DE060000] dd efxvibrato ; 4 - vibrato 1826 00000C84 [B1040000] dd efxnull ; 5 - tone+slide 1827 00000C88 [B1040000] dd efxnull ; 6 - vibrato+slide 1828 00000C8C [FB070000] dd efxtremolo ; 7 - tremolo 1829 00000C90 [B1040000] dd efxnull ; 8 - unused 1830 00000C94 [06070000] dd efxsampoffset ; 9 - sample offset 1831 00000C98 [B1040000] dd efxnull ; A - volume slide 1832 00000C9C [12070000] dd efxpattjump ; B - pattern jump 1833 00000CA0 [20070000] dd efxsetvolume ; C - set volume 1834 00000CA4 [2E070000] dd efxbreak ; D - break pattern 1835 00000CA8 [B1040000] dd efxnull ; E - extra effects 1836 00000CAC [4D070000] dd efxsetspeed ; F - set speed 1837 1838 efxtable2: 1839 00000CB0 [B2040000] dd efxarpeggio2 ; 0 - arpeggio 1840 00000CB4 [D4040000] dd efxportaup ; 1 - porta up 1841 00000CB8 [FA040000] dd efxportadown ; 2 - porta down 1842 00000CBC [21050000] dd efxtoneporta2 ; 3 - tone porta 1843 00000CC0 [5A050000] dd efxvibrato2 ; 4 - vibrato 1844 00000CC4 [B6050000] dd efxtoneslide ; 5 - tone+slide 1845 00000CC8 [C3050000] dd efxvibslide ; 6 - vibrato+slide 1846 00000CCC [EA050000] dd efxtremolo2 ; 7 - tremolo 1847 00000CD0 [B1040000] dd efxnull ; 8 - unused 1848 00000CD4 [B1040000] dd efxnull ; 9 - sample offset 1849 00000CD8 [CD050000] dd efxvolslide ; A - volume slide 1850 00000CDC [B1040000] dd efxnull ; B - pattern jump 1851 00000CE0 [B1040000] dd efxnull ; C - set volume 1852 00000CE4 [B1040000] dd efxnull ; D - break pattern 1853 00000CE8 [B1040000] dd efxnull ; E - extra effects 1854 00000CEC [B1040000] dd efxnull ; F - set speed 1855 1856 ;----------------------------------------------------------------------------- 1857 ; Amiga period table 1858 ;----------------------------------------------------------------------------- 1859 1860 ;PeriodTable0: 1861 ; dw 0 1862 PeriodTable: 1863 00000CF0 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 1863 00000CF9 0A000A7009E8086808- 1863 00000D02 F00780071407 1864 00000D08 B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 1864 00000D11 050005B80474043404- 1864 00000D1A F803C0038A03 1865 00000D20 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 1865 00000D29 0280025C023A021A02- 1865 00000D32 FC01E001C501 1866 00000D38 AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 1866 00000D41 0140012E011D010D01- 1866 00000D4A FE00F000E200 1867 00000D50 D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 1867 00000D59 00A00097008F008700- 1867 00000D62 7F0078007100 1868 00000D68 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 1868 00000D71 0050004B0047004300- 1868 00000D7A 3F003C003800 1869 00000D80 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 1869 00000D89 002800250023002100- 1869 00000D92 1F001E001C00 1870 1871 ;----------------------------------------------------------------------------- 1872 ; Sinus wave table 1873 ;----------------------------------------------------------------------------- 1874 1875 SinTable: 1876 00000D98 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 1876 00000DA1 C5D4E1 1877 00000DA4 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 1877 00000DAD E1 1878 00000DAE D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 1878 00000DB7 19 1879 1880 00000DB8 0000 dw 0 1881 1882 ;============================================================================= 1883 ; AC'97 data 1884 ;============================================================================= 1885 1886 ;stmo: db 1 ; stereo (2) or mono (1) 1887 ;bps: db 8 ; bits per sample (8 or 16) 1888 00000DBA 02 stmo: db 2 ; stereo (2) or mono (1) ; 14/10/2017 (stereo) 1889 00000DBB 10 bps: db 16 ; bits per sample (8 or 16) ; 14/10/2017 (16 bits) 1890 Sample_Rate: 1891 ;MixSpeed: dw 22050 ; Hz 1892 00000DBC 112B MixSpeed: dw 11025 ; Hz ; 13/10/2017 1893 ;MixSpeed: dw 16000 ; Hz ; 30/07/2020 1894 1895 ; 13/11/2016 1896 00000DBE 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 1896 00000DC7 3941424344454600 1897 msgAC97Info: 1898 00000DCF 0D0A db 0Dh, 0Ah 1899 00000DD1 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 1899 00000DDA 6F20436F6E74726F6C- 1899 00000DE3 6C6572202620436F64- 1899 00000DEC 656320496E666F0D0A 1900 00000DF5 56656E646F72204944- db "Vendor ID: " 1900 00000DFE 3A20 1901 00000E00 303030306820446576- msgVendorId: db "0000h Device ID: " 1901 00000E09 6963652049443A20 1902 00000E11 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 1903 00000E18 4275733A20 db "Bus: " 1904 00000E1D 303068204465766963- msgBusNo: db "00h Device: " 1904 00000E26 653A20 1905 00000E29 3030682046756E6374- msgDevNo: db "00h Function: " 1905 00000E32 696F6E3A20 1906 00000E37 303068 msgFncNo: db "00h" 1907 00000E3A 0D0A db 0Dh, 0Ah 1908 00000E3C 492F4F204261736520- db "I/O Base Address: " 1908 00000E45 416464726573733A20 1909 00000E4E 303030306820495251- msgIOBaseAddr: db "0000h IRQ: " 1909 00000E57 3A20 1910 00000E59 3030 msgIRQ: dw 3030h 1911 00000E5B 0D0A00 db 0Dh, 0Ah, 0 1912 ;msgSampleRate: db "Sample Rate: " 1913 ;msgHertz: db "00000 Hz ", 0 1914 ;msg8Bits: db "8 bits ", 0 1915 ;msgMono: db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0 1916 ;msg16Bits: db "16 bits ", 0 1917 ;msgStereo: db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0 1918 1919 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 1920 ;codec_id: dd 0 1921 ;codec_chip_id: dd 0 1922 ;codec_vendor_ids: dw 0 1923 ;codec_chip_ids: dw 0 1924 1925 ;dword_str: dd 30303030h, 30303030h 1926 ; db 'h', 0Dh, 0Ah, 0 1927 1928 ;============================================================================= 1929 ; Copyright Strings & Messages 1930 ;============================================================================= 1931 1932 msg_usage: 1933 00000E5E 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 1933 00000E67 506C6179657220666F- 1933 00000E70 72205452444F532033- 1933 00000E79 383620627920457264- 1933 00000E82 6F67616E2054616E2E- 1933 00000E8B 20 1934 00000E8C 4A756C792032303230- db 'July 2020.',10,13 1934 00000E95 2E0A0D 1935 00000E98 75736167653A207469- db 'usage: tinyplay filename.mod', 10, 13,0 1935 00000EA1 6E79706C6179206669- 1935 00000EAA 6C656E616D652E6D6F- 1935 00000EB3 640A0D00 1936 00000EB7 31352F31302F323031- db '15/10/2017',0 1936 00000EC0 3700 1937 00000EC2 33302F30372F323032- db '30/07/2020',0 1937 00000ECB 3000 1938 1939 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 1940 1941 00000ECD 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 1941 00000ED6 506C61796572207630- 1941 00000EDF 2E3162206279204361- 1941 00000EE8 726C6F732048617361- 1941 00000EF1 6E2E204A756C792031- 1941 00000EFA 3939332E 1942 00000EFE 0A0D00 db 10,13,0 1943 00000F01 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 1943 00000F0A 64696E67204D6F6475- 1943 00000F13 6C652066696C652E0A- 1943 00000F1C 0D00 1944 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 1945 ;MsgFound: db 'Sound Blaster found at Address 2' 1946 ;PortText: db 'x0h, IRQ ' 1947 ;IrqText: db 'x.',10,13,0 1948 1949 trdos386_err_msg: 1950 00000F1E 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 1950 00000F27 2053797374656D2063- 1950 00000F30 616C6C206572726F72- 1950 00000F39 20210A0D00 1951 1952 PlayMsg: 1953 00000F3E 0D0A db 0Dh, 0Ah 1954 00000F40 506C6179696E67206D- db "Playing music... " 1954 00000F49 757369632E2E2E20 1955 00000F51 00 db 0 1956 OkMsg: 1957 00000F52 4F4B2E db "OK." 1958 NextLine: 1959 00000F55 0D0A00 db 0Dh, 0Ah, 0 1960 1961 ; 04/10/2017 1962 00000F58 0A pattern_shift: db 10 1963 00000F59 0400 numtracks: dw 4 1964 1965 ;============================================================================= 1966 ; uninitialized data 1967 ;============================================================================= 1968 1969 bss_start: 1970 1971 ; 30/07/2020 1972 1973 ABSOLUTE bss_start 1974 1975 00000F5B alignb 4 1976 1977 00000F5C dev_vendor: resd 1 1978 00000F60 bus_dev_fn: resd 1 1979 00000F64 stats_cmd: resd 1 1980 00000F68 ac97_io_base: resw 1 1981 00000F6A ac97_int_ln_reg: resb 1 1982 00000F6B srb: resb 1 1983 1984 ; MODLOAD.ASM 1985 00000F6C FileHandle: resd 1 1986 00000F70 Header: resb ModHeader.size 1987 1988 ; MODPLAY.ASM 1989 ;MixSpeed: resw 1 1990 1991 ModInfo: 1992 000013AC ModInfo.OrderLen: resb 1 1993 000013AD ModInfo.ReStart: resb 1 1994 000013AE ModInfo.Order: resb 128 1995 0000142E ModInfo.Patterns: resd 1 1996 1997 00001432 ModInfo.SampOfs: resw 31 1998 00001470 ModInfo.SampSeg: resw 31 1999 000014AE ModInfo.SampLen: resw 31 2000 000014EC ModInfo.SampRep: resw 31 2001 0000152A ModInfo.SampRepLen: resw 31 2002 00001568 ModInfo.SampVol: resw 31 2003 2004 ; MODPLAY.ASM 2005 PitchTable: ;resw 857 2006 000015A6 resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 2007 00003068 VolTable: resb 16640 2008 00007168 MixBuffer resb MixBufSize 2009 2010 ; MODPLAY.ASM 2011 00008168 OrderPos: resb 1 2012 00008169 Tempo: resb 1 2013 0000816A TempoWait: resb 1 2014 0000816B Bpm: resb 1 2015 0000816C Row: resb 1 2016 0000816D BreakRow: resb 1 2017 0000816E BpmSamples: resw 1 2018 00008170 BufPtr: resd 1 2019 00008174 BufLen: resw 1 2020 00008176 BufRep: resd 1 2021 0000817A Note: resd 1 2022 ;Tracks: resb TrackInfo.size*NumTracks 2023 2024 ; 06/10/2017 2025 0000817E Tracks: resb TrackInfo.size*8 2026 2027 mod_file_name: 2028 000082AE resb 80 2029 2030 ; 30/07/2020 2031 000082FE half_buff: resb 1 2032 2033 ; 09/10/2017 2034 000082FF volume_level: resb 1 2035 2036 00008300 alignb 4096 2037 2038 Audio_Buffer: 2039 00009000 resb BUFFERSIZE ; DMA Buffer Size / 2 (32768) 2040 temp_buffer: 2041 00011000 resb BUFFERSIZE / 4 ; 8192 2042 2043 00013000 alignb 65536 2044 2045 ; 30/07/2020 2046 2047 file_buffer: 2048 00020000 resb 65536*6 ; 06/10/2017 2049 EOF: