1 ; **************************************************************************** 2 ; playmod7.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; PLAYMOD7.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN 5 ; 6 ; 05/03/2017 7 ; 8 ; [ Last Modification: 23/08/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 bit, stereo conversion code: 'modplay3.s' (13/10/2017) 30 31 ; 22/08/2020 32 ; 16 bit, stereo playing code modification : modplay7.s (20/10/2017) 33 34 ; 01/03/2017 35 ; 16/10/2016 36 ; 29/04/2016 37 ; TRDOS 386 system calls (temporary list!) 38 _ver equ 0 39 _exit equ 1 40 _fork equ 2 41 _read equ 3 42 _write equ 4 43 _open equ 5 44 _close equ 6 45 _wait equ 7 46 _creat equ 8 47 _link equ 9 48 _unlink equ 10 49 _exec equ 11 50 _chdir equ 12 51 _time equ 13 52 _mkdir equ 14 53 _chmod equ 15 54 _chown equ 16 55 _break equ 17 56 _stat equ 18 57 _seek equ 19 58 _tell equ 20 59 _mount equ 21 60 _umount equ 22 61 _setuid equ 23 62 _getuid equ 24 63 _stime equ 25 64 _quit equ 26 65 _intr equ 27 66 _fstat equ 28 67 _emt equ 29 68 _mdate equ 30 69 _video equ 31 70 _audio equ 32 71 _timer equ 33 72 _sleep equ 34 73 _msg equ 35 74 _geterr equ 36 75 _fpsave equ 37 76 _pri equ 38 77 _rele equ 39 78 _fff equ 40 79 _fnf equ 41 80 _alloc equ 42 81 _dalloc equ 43 82 _calbac equ 44 83 84 %macro sys 1-4 85 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 86 ; 03/09/2015 87 ; 13/04/2015 88 ; Retro UNIX 386 v1 system call. 89 %if %0 >= 2 90 mov ebx, %2 91 %if %0 >= 3 92 mov ecx, %3 93 %if %0 = 4 94 mov edx, %4 95 %endif 96 %endif 97 %endif 98 mov eax, %1 99 ;int 30h 100 int 40h ; TRDOS 386 (TRDOS v2.0) 101 %endmacro 102 103 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 104 ; sys systemcall (eax) , , 105 106 ;; 19/06/2017 107 ;;BUFFERSIZE equ 2*32768 ; 25/06/2017 108 ; 22/08/2020 109 BUFFERSIZE equ 32768 ; 09/10/2017 110 ;BUFFERSIZE equ 65536 ; 01/08/2020 111 112 ; ---------------------------------------------------------------------------- 113 ; Tiny MOD Player v0.1b by Carlos Hasan. 114 ; July 14th, 1993. 115 116 ;============================================================================= 117 ; 118 ;============================================================================= 119 120 [BITS 32] 121 [org 0] 122 123 Start: 124 ; clear bss 125 00000000 B9[00200700] mov ecx, EOF 126 00000005 BF[15100000] mov edi, bss_start 127 0000000A 29F9 sub ecx, edi 128 0000000C D1E9 shr ecx, 1 129 0000000E 31C0 xor eax, eax 130 00000010 F366AB rep stosw 131 132 ; Detect (& Enable) VT8233 Audio Device 133 00000013 E8F3010000 call DetectVT8233 134 00000018 731B jnc short GetFileName 135 136 _dev_not_ready: 137 ; couldn't find the audio device! 138 sys _msg, noDevMsg, 255, 0Fh 138 <1> 138 <1> 138 <1> 138 <1> 138 <1> %if %0 >= 2 138 0000001A BB[18020000] <1> mov ebx, %2 138 <1> %if %0 >= 3 138 0000001F B9FF000000 <1> mov ecx, %3 138 <1> %if %0 = 4 138 00000024 BA0F000000 <1> mov edx, %4 138 <1> %endif 138 <1> %endif 138 <1> %endif 138 00000029 B823000000 <1> mov eax, %1 138 <1> 138 0000002E CD40 <1> int 40h 139 00000030 E9B5010000 jmp Exit 140 141 GetFileName: 142 00000035 89E6 mov esi, esp 143 00000037 AD lodsd 144 00000038 83F802 cmp eax, 2 ; two arguments 145 ; (program file name & mod file name) 146 0000003B 0F82B2010000 jb pmsg_usage ; nothing to do 147 148 00000041 AD lodsd ; program file name address 149 00000042 AD lodsd ; mod file name address (file to be read) 150 00000043 89C6 mov esi, eax 151 00000045 BF[56930000] mov edi, mod_file_name 152 ScanName: 153 0000004A AC lodsb 154 0000004B 84C0 test al, al 155 0000004D 0F84A0010000 je pmsg_usage 156 00000053 3C20 cmp al, 20h 157 00000055 74F3 je short ScanName ; scan start of name. 158 00000057 AA stosb 159 00000058 B4FF mov ah, 0FFh 160 a_0: 161 0000005A FEC4 inc ah 162 a_1: 163 0000005C AC lodsb 164 0000005D AA stosb 165 0000005E 3C2E cmp al, '.' 166 00000060 74F8 je short a_0 167 00000062 20C0 and al, al 168 00000064 75F6 jnz short a_1 169 170 00000066 08E4 or ah, ah ; if period NOT found, 171 00000068 750B jnz short PrintMesg ; then add a .MOD extension. 172 SetExt: 173 0000006A 4F dec edi 174 0000006B C7072E4D4F44 mov dword [edi], '.MOD' 175 00000071 C6470400 mov byte [edi+4], 0 176 PrintMesg: 177 ; Prints the Credits Text. 178 sys _msg, Credits, 255, 0Fh 178 <1> 178 <1> 178 <1> 178 <1> 178 <1> %if %0 >= 2 178 00000075 BB[870F0000] <1> mov ebx, %2 178 <1> %if %0 >= 3 178 0000007A B9FF000000 <1> mov ecx, %3 178 <1> %if %0 = 4 178 0000007F BA0F000000 <1> mov edx, %4 178 <1> %endif 178 <1> %endif 178 <1> %endif 178 00000084 B823000000 <1> mov eax, %1 178 <1> 178 00000089 CD40 <1> int 40h 179 _1: 180 ; 19/06/2017 181 ; Allocate Audio Buffer (for user) 182 sys _audio, 0200h, BUFFERSIZE, Audio_Buffer 182 <1> 182 <1> 182 <1> 182 <1> 182 <1> %if %0 >= 2 182 0000008B BB00020000 <1> mov ebx, %2 182 <1> %if %0 >= 3 182 00000090 B900800000 <1> mov ecx, %3 182 <1> %if %0 = 4 182 00000095 BA[00A00000] <1> mov edx, %4 182 <1> %endif 182 <1> %endif 182 <1> %endif 182 0000009A B820000000 <1> mov eax, %1 182 <1> 182 0000009F CD40 <1> int 40h 183 000000A1 727D jc error_exit 184 _2: 185 ; 03/08/2020 186 ; Initialize Audio Device (bl = 1 -> Interrupt method) 187 ;sys _audio, 0301h, 0, ac97_int_handler ; 09/10/2017 188 ;jc error_exit 189 190 ; 03/08/2020 191 ; Initialize Audio Device (bl = 0 -> SRB method) 192 sys _audio, 0300h, 1, srb ; 09/10/2017 192 <1> 192 <1> 192 <1> 192 <1> 192 <1> %if %0 >= 2 192 000000A3 BB00030000 <1> mov ebx, %2 192 <1> %if %0 >= 3 192 000000A8 B901000000 <1> mov ecx, %3 192 <1> %if %0 = 4 192 000000AD BA[27100000] <1> mov edx, %4 192 <1> %endif 192 <1> %endif 192 <1> %endif 192 000000B2 B820000000 <1> mov eax, %1 192 <1> 192 000000B7 CD40 <1> int 40h 193 000000B9 7265 jc error_exit 194 195 LoadMod: 196 000000BB BF[56930000] mov edi, mod_file_name 197 000000C0 E822020000 call LoadModule ; Load the MODule... 198 ; 08/10/2017 199 000000C5 731B jnc short _3 ; any error loading? 200 201 ; yes, print error and Exit. 202 203 sys _msg, ErrorMesg, 255, 0Fh 203 <1> 203 <1> 203 <1> 203 <1> 203 <1> %if %0 >= 2 203 000000C7 BB[BB0F0000] <1> mov ebx, %2 203 <1> %if %0 >= 3 203 000000CC B9FF000000 <1> mov ecx, %3 203 <1> %if %0 = 4 203 000000D1 BA0F000000 <1> mov edx, %4 203 <1> %endif 203 <1> %endif 203 <1> %endif 203 000000D6 B823000000 <1> mov eax, %1 203 <1> 203 000000DB CD40 <1> int 40h 204 205 000000DD E908010000 jmp Exit 206 207 _3: 208 ; 10/06/2017 209 sys _audio, 0E00h ; get audio controller info 209 <1> 209 <1> 209 <1> 209 <1> 209 <1> %if %0 >= 2 209 000000E2 BB000E0000 <1> mov ebx, %2 209 <1> %if %0 >= 3 209 <1> mov ecx, %3 209 <1> %if %0 = 4 209 <1> mov edx, %4 209 <1> %endif 209 <1> %endif 209 <1> %endif 209 000000E7 B820000000 <1> mov eax, %1 209 <1> 209 000000EC CD40 <1> int 40h 210 000000EE 7230 jc error_exit 211 212 ;cmp ah, 3 ; VT 8233? (VIA AC'97 Audio Controller) 213 ;jne _dev_not_ready 214 215 ; EAX = IRQ Number in AL 216 ; Audio Device Number in AH 217 ; EBX = DEV/VENDOR ID 218 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 219 ; ECX = BUS/DEV/FN 220 ; (00000000BBBBBBBBDDDDDFFF00000000) 221 ; EDX = Base IO Addr (DX) for SB16 & VT8233 222 ; EDX = NABMBAR/NAMBAR (for AC97) 223 ; (Low word, DX = NAMBAR address) 224 225 000000F0 A2[26100000] mov [ac97_int_ln_reg], al 226 000000F5 891D[18100000] mov [dev_vendor], ebx 227 000000FB 890D[1C100000] mov [bus_dev_fn], ecx 228 00000101 668915[24100000] mov [ac97_io_base], dx 229 230 00000108 E8970A0000 call write_audio_dev_info 231 232 PlayNow: 233 ; 30/07/2020 234 235 ; 06/10/2017 236 237 ; DIRECT CGA MEMORY ACCESS 238 ; bl = 0, bh = 4 239 ; Direct access/map to CGA memory (0B8000h) 240 241 sys _video, 0400h 241 <1> 241 <1> 241 <1> 241 <1> 241 <1> %if %0 >= 2 241 0000010D BB00040000 <1> mov ebx, %2 241 <1> %if %0 >= 3 241 <1> mov ecx, %3 241 <1> %if %0 = 4 241 <1> mov edx, %4 241 <1> %endif 241 <1> %endif 241 <1> %endif 241 00000112 B81F000000 <1> mov eax, %1 241 <1> 241 00000117 CD40 <1> int 40h 242 00000119 3D00800B00 cmp eax, 0B8000h 243 0000011E 741B je short _4 244 error_exit: 245 sys _msg, trdos386_err_msg, 255, 0Eh 245 <1> 245 <1> 245 <1> 245 <1> 245 <1> %if %0 >= 2 245 00000120 BB[D80F0000] <1> mov ebx, %2 245 <1> %if %0 >= 3 245 00000125 B9FF000000 <1> mov ecx, %3 245 <1> %if %0 = 4 245 0000012A BA0E000000 <1> mov edx, %4 245 <1> %endif 245 <1> %endif 245 <1> %endif 245 0000012F B823000000 <1> mov eax, %1 245 <1> 245 00000134 CD40 <1> int 40h 246 00000136 E9AF000000 jmp Exit 247 248 _4: 249 0000013B E884090000 call StartPlaying 250 251 ; 23/08/2020 252 253 ; 14/10/2017 254 255 ; load 32768 bytes into audio buffer 256 ;mov edi, Audio_Buffer 257 ;mov ebx, BUFFERSIZE / 4 258 00000140 E813080000 call GetSamples 259 00000145 72D9 jc short error_exit 260 261 ; bh = 16 : update (current) dma half buffer 262 ; bl = 0 : then switch to the next half buffer 263 sys _audio, 1000h ; 29/07/2020 263 <1> 263 <1> 263 <1> 263 <1> 263 <1> %if %0 >= 2 263 00000147 BB00100000 <1> mov ebx, %2 263 <1> %if %0 >= 3 263 <1> mov ecx, %3 263 <1> %if %0 = 4 263 <1> mov edx, %4 263 <1> %endif 263 <1> %endif 263 <1> %endif 263 0000014C B820000000 <1> mov eax, %1 263 <1> 263 00000151 CD40 <1> int 40h 264 ; 14/10/2017 265 ;sys _audio, 1002h ; update dma half buffer 2 266 267 ; 30/07/2020 268 269 ; load 32768 bytes into audio buffer 270 ;mov edi, Audio_Buffer 271 ;mov ebx, BUFFERSIZE / 4 272 00000153 E800080000 call GetSamples 273 00000158 72C6 jc short error_exit 274 275 ; Set Master Volume Level 276 sys _audio, 0B00h, 1D1Dh 276 <1> 276 <1> 276 <1> 276 <1> 276 <1> %if %0 >= 2 276 0000015A BB000B0000 <1> mov ebx, %2 276 <1> %if %0 >= 3 276 0000015F B91D1D0000 <1> mov ecx, %3 276 <1> %if %0 = 4 276 <1> mov edx, %4 276 <1> %endif 276 <1> %endif 276 <1> %endif 276 00000164 B820000000 <1> mov eax, %1 276 <1> 276 00000169 CD40 <1> int 40h 277 278 ; 30/07/2020 279 ;mov byte [volume_level], 1Dh ; 29 280 0000016B 880D[A7930000] mov [volume_level], cl 281 282 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 283 284 ; 07/10/2017 285 ;mov word [MixSpeed], 22222 ; Mixing at 22 kHz 286 287 ; Start to play 288 00000171 A0[730E0000] mov al, [bps] 289 00000176 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 290 00000179 D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 291 0000017B 8A1D[720E0000] mov bl, [stmo] 292 00000181 FECB dec bl 293 00000183 08C3 or bl, al 294 00000185 668B0D[740E0000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 295 0000018C B704 mov bh, 4 ; start to play 296 sys _audio 296 <1> 296 <1> 296 <1> 296 <1> 296 <1> %if %0 >= 2 296 <1> mov ebx, %2 296 <1> %if %0 >= 3 296 <1> mov ecx, %3 296 <1> %if %0 = 4 296 <1> mov edx, %4 296 <1> %endif 296 <1> %endif 296 <1> %endif 296 0000018E B820000000 <1> mov eax, %1 296 <1> 296 00000193 CD40 <1> int 40h 297 298 ;mov byte [srb], 0 ; 14/10/2017 299 300 ;; SETUP SIGNAL RESPONSE BYTE 301 ;; 06/03/2017 302 ;mov bl, [ac97_int_ln_reg] ; IRQ number 303 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 304 ;mov edx, srb ; Signal Response/Return Byte address 305 ;mov ecx, 0FFh ; Signal Response/Return Byte value 306 ;sys _calbac 307 ;jc short error_exit 308 309 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 310 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 311 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 312 ; second, or the module will sound "looped". 313 ; Because we need better sync with the ModPlayer to draw the scope, 314 ; the polling is called from my routine, and then the irq 0 must be 315 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 316 ; samples played by the Sound Blaster. Note that some samples are 317 ; discarded in the next code, just for fun! 318 319 _a3: 320 ; 02/10/2017 321 ; Print "Playing..." message. 322 sys _msg, PlayMsg, 255, 0Fh 322 <1> 322 <1> 322 <1> 322 <1> 322 <1> %if %0 >= 2 322 00000195 BB[F80F0000] <1> mov ebx, %2 322 <1> %if %0 >= 3 322 0000019A B9FF000000 <1> mov ecx, %3 322 <1> %if %0 = 4 322 0000019F BA0F000000 <1> mov edx, %4 322 <1> %endif 322 <1> %endif 322 <1> %endif 322 000001A4 B823000000 <1> mov eax, %1 322 <1> 322 000001A9 CD40 <1> int 40h 323 324 ; 30/07/2020 325 326 ; Print (GoTo) NextLine. 327 sys _msg, NextLine, 3, 07h 327 <1> 327 <1> 327 <1> 327 <1> 327 <1> %if %0 >= 2 327 000001AB BB[0F100000] <1> mov ebx, %2 327 <1> %if %0 >= 3 327 000001B0 B903000000 <1> mov ecx, %3 327 <1> %if %0 = 4 327 000001B5 BA07000000 <1> mov edx, %4 327 <1> %endif 327 <1> %endif 327 <1> %endif 327 000001BA B823000000 <1> mov eax, %1 327 <1> 327 000001BF CD40 <1> int 40h 328 ; 329 330 ; 30/07/2020 331 000001C1 66C70500800B00304E mov word [0B8000h], 4E30h ; Red '0' 332 333 000001CA E880000000 call ModPlay ; 13/02/2017 334 335 _s_exit: 336 000001CF E89F090000 call StopPlaying ; STOP! 337 338 ; 02/10/2017 339 ; Print "OK." message. 340 sys _msg, OkMsg, 255, 0Fh 340 <1> 340 <1> 340 <1> 340 <1> 340 <1> %if %0 >= 2 340 000001D4 BB[0C100000] <1> mov ebx, %2 340 <1> %if %0 >= 3 340 000001D9 B9FF000000 <1> mov ecx, %3 340 <1> %if %0 = 4 340 000001DE BA0F000000 <1> mov edx, %4 340 <1> %endif 340 <1> %endif 340 <1> %endif 340 000001E3 B823000000 <1> mov eax, %1 340 <1> 340 000001E8 CD40 <1> int 40h 341 Exit: 342 ;call FreeModule ; Free MODule core. 343 344 sys _exit ; Bye ! 344 <1> 344 <1> 344 <1> 344 <1> 344 <1> %if %0 >= 2 344 <1> mov ebx, %2 344 <1> %if %0 >= 3 344 <1> mov ecx, %3 344 <1> %if %0 = 4 344 <1> mov edx, %4 344 <1> %endif 344 <1> %endif 344 <1> %endif 344 000001EA B801000000 <1> mov eax, %1 344 <1> 344 000001EF CD40 <1> int 40h 345 here: 346 000001F1 EBFE jmp short here 347 348 pmsg_usage: 349 sys _msg, msg_usage, 255, 0Fh 349 <1> 349 <1> 349 <1> 349 <1> 349 <1> %if %0 >= 2 349 000001F3 BB[160F0000] <1> mov ebx, %2 349 <1> %if %0 >= 3 349 000001F8 B9FF000000 <1> mov ecx, %3 349 <1> %if %0 = 4 349 000001FD BA0F000000 <1> mov edx, %4 349 <1> %endif 349 <1> %endif 349 <1> %endif 349 00000202 B823000000 <1> mov eax, %1 349 <1> 349 00000207 CD40 <1> int 40h 350 00000209 EBDF jmp short Exit 351 352 DetectVT8233: 353 ; Detect (BH=1) VT8233 (BL=3) Audio Controller 354 sys _audio, 0103h 354 <1> 354 <1> 354 <1> 354 <1> 354 <1> %if %0 >= 2 354 0000020B BB03010000 <1> mov ebx, %2 354 <1> %if %0 >= 3 354 <1> mov ecx, %3 354 <1> %if %0 = 4 354 <1> mov edx, %4 354 <1> %endif 354 <1> %endif 354 <1> %endif 354 00000210 B820000000 <1> mov eax, %1 354 <1> 354 00000215 CD40 <1> int 40h 355 00000217 C3 retn 356 357 noDevMsg: 358 00000218 4572726F723A20556E- db "Error: Unable to find VIA VT8233 based audio device!",13,10,0 358 00000221 61626C6520746F2066- 358 0000022A 696E64205649412056- 358 00000233 543832333320626173- 358 0000023C 656420617564696F20- 358 00000245 646576696365210D0A- 358 0000024E 00 359 360 ;ac97_int_handler: ; 14/10/2017 361 ; ; 09/10/2017 362 ; 363 ; ; 19/06/2017 364 ; mov byte [srb], 1 ; interrupt (or signal response byte) 365 ; 366 ; ; 30/07/2020 367 ; xor byte [half_buff], 1 ; 0 --> 1, 1 --> 0 368 ; 369 ; ; 30/07/2020 370 ; ; (Following code has been moved to 'p_loop' for fast return 371 ; ; from user's interrupt handler.) 372 ; 373 ; ;; 14/10/2017 374 ; ;; load 8192 bytes into audio buffer 375 ; ;mov edi, temp_buffer 376 ; ;mov ebx, BUFFERSIZE / 4 377 ; ;call GetSamples 378 ; ;jc error_exit 379 ; 380 ; ;; 8 bit to 16 bit (*2) 381 ; ;; mono to stereo (*2) 382 ; ;; 4* (BUFFERSIZE/4) 383 ; ;; source = temp_buffer 384 ; ;; destination = Audio_Buffer 385 ; ;call ConvertSamples 386 ; 387 ; sys _rele ; return from callback service 388 ; ; we must not come here ! 389 ; sys _exit 390 391 ;============================================================================= 392 ; 393 ;============================================================================= 394 395 ModPlay: 396 ; 23/08/2020 397 ; 22/08/2020 398 ; 03/08/2020 399 ; 30/07/2020 400 ; 14/10/2017 401 ; 13/10/2017 402 ; 06/10/2017, 09/10/2017 403 ; 19/06/2017, 21/06/2017, 23/06/2017 404 405 ; 05/03/2017 (TRDOS 386) 406 ; 28/11/2016, 08/12/2016, 13/02/2017, 14/02/2017 407 408 ; 30/07/2020 409 p_loop: 410 0000024F 803D[27100000]00 cmp byte [srb], 0 411 00000256 7625 jna short q_loop 412 413 00000258 C605[27100000]00 mov byte [srb], 0 414 415 ; 30/07/2020 416 ; (Following code has been moved here from 'ac97_int_handler') 417 ; ('GetSamples', 'ConvertSamples') 418 419 ; 22/08/2020 420 421 ; 14/10/2017 422 ; load 8192 bytes into audio buffer 423 ; 03/08/2020 424 ;mov edi, temp_buffer 425 ;mov ebx, BUFFERSIZE / 4 426 0000025F E8F4060000 call GetSamples 427 00000264 0F82B6FEFFFF jc error_exit 428 429 ; 30/07/2020 430 0000026A A0[A6930000] mov al, [half_buff] 431 0000026F 0431 add al, 31h ; '1' or '2' 432 00000271 A200800B00 mov [0B8000h], al 433 434 ; 23/08/2020 435 00000276 8035[A6930000]01 xor byte [half_buff], 1 436 q_loop: 437 ; 23/08/2020 438 0000027D FE0D[A9930000] dec byte [counter] 439 00000283 75CA jnz short p_loop 440 441 00000285 B401 mov ah, 1 ; any key pressed? 442 00000287 CD32 int 32h ; no, Loop. 443 00000289 74C4 jz short p_loop 444 445 0000028B B400 mov ah, 0 ; flush key buffer... 446 0000028D CD32 int 32h 447 448 ; 23/08/2020 449 450 ; 20/10/2017 (modplay7.s) 451 0000028F 3C20 cmp al, 20h 452 00000291 740E je short change_pan 453 ; 09/10/2017 (playmod5.s) 454 00000293 3C2B cmp al, '+' ; increase sound volume 455 00000295 741D je short inc_volume_level 456 00000297 3C2D cmp al, '-' 457 00000299 743C je short dec_volume_level 458 459 ; 20/10/2017 (modplay6.s) 460 0000029B 24DF and al, 0DFh 461 0000029D 3C50 cmp al, 'P' 462 0000029F 7545 jne short q_return 463 464 change_pan: 465 ; 20/10/2017 (modplay7.s) 466 000002A1 8A0D[A8930000] mov cl, [pan_shift] 467 000002A7 FEC1 inc cl 468 000002A9 80E103 and cl, 3 469 000002AC 880D[A8930000] mov [pan_shift], cl 470 000002B2 EBC9 jmp short q_loop 471 472 ; 09/10/2017 (playmod5.s) 473 ; 24/06/2017 (wavplay2.s) 474 inc_volume_level: 475 000002B4 8A0D[A7930000] mov cl, [volume_level] 476 000002BA 80F91F cmp cl, 1Fh ; 31 477 000002BD 73BE jnb short q_loop 478 000002BF FEC1 inc cl 479 change_volume_level: 480 000002C1 880D[A7930000] mov [volume_level], cl 481 000002C7 88CD mov ch, cl 482 ; Set Master Volume Level 483 sys _audio, 0B00h 483 <1> 483 <1> 483 <1> 483 <1> 483 <1> %if %0 >= 2 483 000002C9 BB000B0000 <1> mov ebx, %2 483 <1> %if %0 >= 3 483 <1> mov ecx, %3 483 <1> %if %0 = 4 483 <1> mov edx, %4 483 <1> %endif 483 <1> %endif 483 <1> %endif 483 000002CE B820000000 <1> mov eax, %1 483 <1> 483 000002D3 CD40 <1> int 40h 484 000002D5 EBA6 jmp short q_loop 485 dec_volume_level: 486 000002D7 8A0D[A7930000] mov cl, [volume_level] 487 000002DD 80F901 cmp cl, 1 ; 1 488 000002E0 769B jna short q_loop 489 000002E2 FEC9 dec cl 490 000002E4 EBDB jmp short change_volume_level 491 492 q_return: 493 000002E6 C3 retn 494 495 ;============================================================================= 496 ; MODLOAD.ASM 497 ;============================================================================= 498 499 ; Amiga Module Loader v0.1b by Carlos Hasan. 500 ; July 10th, 1993. 501 502 ; STRUCTURES 503 504 struc ModSample 505 00000000 .msName: resb 22 506 00000016 .msLength: resw 1 507 00000018 .msFinetune: resb 1 508 00000019 .msVolume: resb 1 509 0000001A .msRepeat: resw 1 510 0000001C .msRepLen: resw 1 511 .size: ; 30 bytes 512 endstruc 513 514 struc ModHeader 515 00000000 .mhName: resb 20 516 00000014 .mhSamples: resb ModSample.size*31 517 000003B6 .mhOrderLen: resb 1 518 000003B7 .mhReStart: resb 1 519 000003B8 .mhOrder: resb 128 520 00000438 .mhSign: resw 2 521 .size: ; 1084 bytes 522 endstruc 523 524 struc ModInfoRec 525 00000000 .OrderLen: resb 1 526 00000001 .ReStart: resb 1 527 00000002 .Order: resb 128 528 00000082 .Patterns: resd 1 529 00000086 .SampOfs: resw 31 530 000000C4 .SampSeg: resw 31 531 00000102 .SampLen: resw 31 532 00000140 .SampRep: resw 31 533 0000017E .SampRepLen: resw 31 534 000001BC .SampVol: resw 31 535 .size: ; 506 bytes 536 endstruc 537 538 ; CODE 539 540 ; 06/10/2017 541 ; 04/10/2017 542 ; /* MOD FileFormat */ 543 544 ID_MK equ 2E4B2E4Dh ; "M.K." 545 ID_FLT4 equ 34544C46h ; "FLT4" 546 ID_8CHN equ 4E484338h ; "8CHN" 547 ID_FLT8 equ 34544C46h ; "FLT8" 548 549 ; CODE 550 551 LoadModule: 552 ; edi = file name address 553 554 000002E7 60 pushad 555 556 ;call ClearModInfo 557 OpenFile: 558 ; ebx = ASCIIZ file name address 559 ; ecx = open mode (0 = open for read) 560 sys _open, edi, 0 ; open for reading 560 <1> 560 <1> 560 <1> 560 <1> 560 <1> %if %0 >= 2 560 000002E8 89FB <1> mov ebx, %2 560 <1> %if %0 >= 3 560 000002EA B900000000 <1> mov ecx, %3 560 <1> %if %0 = 4 560 <1> mov edx, %4 560 <1> %endif 560 <1> %endif 560 <1> %endif 560 000002EF B805000000 <1> mov eax, %1 560 <1> 560 000002F4 CD40 <1> int 40h 561 000002F6 0F8262010000 jc Failed 562 000002FC A3[28100000] mov [FileHandle], eax 563 ReadHeader: 564 ; ebx = File handle 565 ; ecx = Buffer address 566 ; edx = Byte count 567 sys _read, [FileHandle], Header, ModHeader.size 567 <1> 567 <1> 567 <1> 567 <1> 567 <1> %if %0 >= 2 567 00000301 8B1D[28100000] <1> mov ebx, %2 567 <1> %if %0 >= 3 567 00000307 B9[2C100000] <1> mov ecx, %3 567 <1> %if %0 = 4 567 0000030C BA3C040000 <1> mov edx, %4 567 <1> %endif 567 <1> %endif 567 <1> %endif 567 00000311 B803000000 <1> mov eax, %1 567 <1> 567 00000316 CD40 <1> int 40h 568 00000318 0F8231010000 jc CloseFile 569 CheckMK: 570 ; 04/10/2017 571 0000031E A1[64140000] mov eax, [Header+ModHeader.mhSign] 572 573 00000323 3D4D2E4B2E cmp eax, ID_MK ; cmp eax, '.K.M' 574 ;je short Is4chnMod 575 00000328 742B je short IsModFile 576 CheckFLT4: 577 0000032A 3D464C5434 cmp eax, ID_FLT4 ; cmp eax, '4TLF' 578 ;je short Is4chnMod 579 0000032F 7424 je short IsModFile 580 Check8CHN: 581 00000331 3D3843484E cmp eax, ID_8CHN ; cmp eax, 'NHC8' 582 00000336 740D je short Is8chnMod 583 CheckFLT8: 584 00000338 3D464C5434 cmp eax, ID_FLT8 ; cmp eax, '8TLF' 585 ; 06/10/2017 586 0000033D 7406 je short Is8chnMod 587 0000033F F9 stc 588 00000340 E90A010000 jmp CloseFile 589 Is8chnMod: 590 00000345 C605[13100000]08 mov byte [numtracks], 8 ; 8-CHANNEL-MOD 591 0000034C C605[12100000]0B mov byte [pattern_shift], 11 ; Pattern Size = 2048 bytes 592 00000353 EB00 jmp short IsModFile 593 ;Is4chnMod: 594 ; mov byte [numtracks], 4 ; 4-CHANNEL-MOD 595 ; mov byte [pattern_shift], 11 ; Pattern Size = 1024 bytes 596 597 IsModFile: 598 00000355 A0[E2130000] mov al, [Header+ModHeader.mhOrderLen] 599 0000035A A2[68140000] mov [ModInfo.OrderLen], al 600 601 0000035F A0[E3130000] mov al, [Header+ModHeader.mhReStart] 602 00000364 3A05[E2130000] cmp al, [Header+ModHeader.mhOrderLen] 603 0000036A 7202 jb short SetReStart 604 0000036C B07F mov al, 7Fh 605 SetReStart: 606 0000036E A2[69140000] mov [ModInfo.ReStart], al 607 608 ;mov ecx, 128 609 00000373 66B98000 mov cx, 128 610 00000377 31D2 xor edx, edx 611 00000379 31DB xor ebx, ebx 612 CopyOrder: 613 0000037B 8AB3[E4130000] mov dh, [Header+ModHeader.mhOrder+ebx] 614 00000381 88B3[6A140000] mov [ModInfo.Order+ebx], dh 615 00000387 38D6 cmp dh, dl 616 00000389 7202 jb short NextOrder 617 0000038B 88F2 mov dl, dh ; Max. pattern number ; 04/10/2017 618 NextOrder: 619 0000038D 43 inc ebx 620 0000038E E2EB loop CopyOrder 621 AllocPatterns: 622 00000390 81E2FF000000 and edx, 0FFh 623 ; 04/10/2017 624 ;inx dx ; 12/03/2017 625 00000396 FEC2 inc dl 626 ; dl = number of patterns (04/07/2017) 627 00000398 8A0D[12100000] mov cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels 628 0000039E D3E2 shl edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4) 629 ; *2048 ; (byte count of patterns *64*8*4) 630 ; 631 000003A0 89D5 mov ebp, edx ; offset of samples (04/07/2017) 632 ;mov ecx, 10000h ; next 64K (4096*16) 633 000003A2 B9[00200100] mov ecx, file_buffer ; 12/03/2017 634 ; 635 000003A7 890D[EA140000] mov [ModInfo.Patterns], ecx 636 ; 637 000003AD 01CD add ebp, ecx ; next offset for samples 638 ReadPatterns: 639 ;mov ebx, [FileHandle] 640 ; ebx = File handle 641 ; ecx = Buffer address 642 ; edx = Byte count 643 sys _read, [FileHandle] 643 <1> 643 <1> 643 <1> 643 <1> 643 <1> %if %0 >= 2 643 000003AF 8B1D[28100000] <1> mov ebx, %2 643 <1> %if %0 >= 3 643 <1> mov ecx, %3 643 <1> %if %0 = 4 643 <1> mov edx, %4 643 <1> %endif 643 <1> %endif 643 <1> %endif 643 000003B5 B803000000 <1> mov eax, %1 643 <1> 643 000003BA CD40 <1> int 40h 644 000003BC 0F828D000000 jc CloseFile 645 646 ; patterns have been loaded here... (04/07/2017) 647 648 000003C2 BE[40100000] mov esi, Header+ModHeader.mhSamples 649 000003C7 31FF xor edi, edi 650 CopySamples: 651 000003C9 668B4616 mov ax, [esi+ModSample.msLength] 652 000003CD 86C4 xchg al, ah 653 000003CF 66D1E0 shl ax, 1 654 000003D2 668987[6A150000] mov [ModInfo.SampLen+edi], ax 655 000003D9 8A4619 mov al, [esi+ModSample.msVolume] 656 000003DC 30E4 xor ah, ah 657 000003DE 668987[24160000] mov [ModInfo.SampVol+edi], ax 658 000003E5 668B461A mov ax, [esi+ModSample.msRepeat] 659 000003E9 86C4 xchg al, ah 660 000003EB 66D1E0 shl ax, 1 661 000003EE 668987[A8150000] mov [ModInfo.SampRep+edi], ax 662 000003F5 668B461C mov ax, [esi+ModSample.msRepLen] 663 000003F9 86C4 xchg al, ah 664 000003FB 66D1E0 shl ax, 1 665 000003FE 668987[E6150000] mov [ModInfo.SampRepLen+edi], ax 666 00000405 83C61E add esi, ModSample.size 667 00000408 6683C702 add di, 2 668 0000040C 6683FF3E cmp di, 2*31 669 00000410 72B7 jb short CopySamples 670 671 00000412 31F6 xor esi, esi 672 AllocSamples: 673 00000414 0FB796[6A150000] movzx edx, word [ModInfo.SampLen+esi] 674 ; 07/10/2017 675 ;shr dx, 4 ; *** 676 0000041B 21D2 and edx, edx 677 0000041D 7426 jz short NextSample 678 ;inc dx ; number of paragraphs ; *** 679 ;shl dx, 4 ; *** 680 0000041F 89E8 mov eax, ebp 681 00000421 668986[EE140000] mov [ModInfo.SampOfs+esi], ax 682 00000428 C1E810 shr eax, 16 683 0000042B 668986[2C150000] mov [ModInfo.SampSeg+esi], ax 684 00000432 89E9 mov ecx, ebp 685 00000434 01D5 add ebp, edx ; next offset for sample 686 ReadSample: 687 ;mov ebx, [FileHandle] 688 ;movzx edx, [ModInfo.SampLen+esi] 689 ;mov ecx, [ModInfo.SampOfs+esi] 690 691 ; ebx = File handle 692 ; ecx = Buffer address 693 ; edx = Byte count 694 sys _read, [FileHandle] 694 <1> 694 <1> 694 <1> 694 <1> 694 <1> %if %0 >= 2 694 00000436 8B1D[28100000] <1> mov ebx, %2 694 <1> %if %0 >= 3 694 <1> mov ecx, %3 694 <1> %if %0 = 4 694 <1> mov edx, %4 694 <1> %endif 694 <1> %endif 694 <1> %endif 694 0000043C B803000000 <1> mov eax, %1 694 <1> 694 00000441 CD40 <1> int 40h 695 00000443 720A jc short CloseFile 696 697 NextSample: 698 00000445 6683C602 add si, 2 699 00000449 6683FE3E cmp si, 2*31 700 0000044D 72C5 jb short AllocSamples 701 CloseFile: 702 0000044F 9C pushf 703 sys _close, [FileHandle] 703 <1> 703 <1> 703 <1> 703 <1> 703 <1> %if %0 >= 2 703 00000450 8B1D[28100000] <1> mov ebx, %2 703 <1> %if %0 >= 3 703 <1> mov ecx, %3 703 <1> %if %0 = 4 703 <1> mov edx, %4 703 <1> %endif 703 <1> %endif 703 <1> %endif 703 00000456 B806000000 <1> mov eax, %1 703 <1> 703 0000045B CD40 <1> int 40h 704 0000045D 9D popf 705 Failed: 706 0000045E 61 popad 707 0000045F C3 retn 708 709 ;============================================================================= 710 ; MODPLAY.ASM 711 ;============================================================================= 712 713 ; Amiga Module Loader v0.3b by Carlos Hasan. 714 ; July 23th, 1993. 715 716 ; EQUATES 717 718 ;NumTracks equ 4 ; 06/10/2017 ([numtracks]) 719 DefTempo equ 6 720 DefBpm equ 125 721 MidCRate equ 8448 722 ;MixBufSize equ 4096 723 MixBufSize equ 8172 ; 22/08/2020 724 725 ; STRUCTURES 726 727 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 728 00000000 .Samples: resd 1 729 ;.Position: resw 1 730 00000004 .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 731 00000008 .Len: resw 1 732 0000000A .Repeat: resw 1 733 0000000C .RepLen: resw 1 734 0000000E .Volume: resb 1 ; Volume 735 0000000F .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 736 ;.Error: resb 1 737 ;.Reserved: resb 1 ; 01/10/2017 738 00000010 .Period: resw 1 ; Period 739 00000012 .Pitch: resw 1 740 00000014 .Effect: resw 1 ; Effect 741 00000016 .PortTo: resw 1 ; Toneporta wanted period 742 00000018 .PortParm: resb 1 ; Toneporta speed 743 00000019 .VibPos: resb 1 ; Vibrato wave position 744 0000001A .VibParm: resb 1 ; Vibrato depth/rate 745 0000001B .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 746 0000001C .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 747 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 748 0000001D .Error: resb 1 ; 01/10/2017 749 0000001E .Arp: resw 3 750 00000024 .ArpIndex: resw 1 751 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 752 endstruc 753 754 ; CODE 755 756 ;-------------------------------------------------------------------------- 757 ; updatechannel - update the track using the current effect 758 ;-------------------------------------------------------------------------- 759 ; 760 ;-------------------------------------------------------------------------- 761 ; BeatTrack: Process the next beat in one track. 762 ; In: 763 ; ds:di - Track info Address. 764 ;-------------------------------------------------------------------------- 765 766 ; edi = Track info address 767 768 updatechannel: 769 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 770 771 00000460 668B5714 mov dx, [edi+TrackInfo.Effect] 772 773 ;test dx, dx 774 ;je short None 775 ;cmp dh, 00h 776 ;je short Arpeggio 777 ;cmp dh, 01h 778 ;je short PortUp 779 ;cmp dh, 02h 780 ;je short PortDown 781 ;cmp dh, 03h 782 ;je TonePort 783 ;cmp dh, 04h 784 ;je Vibrato 785 ;cmp dh, 05h 786 ;je PortSlide 787 ;cmp dh, 06h 788 ;je VibSlide 789 ;cmp dh, 0Ah 790 ;je VolSlide 791 ;retn 792 793 00000464 0FB6C6 movzx eax, dh 794 00000467 240F and al, 0Fh 795 00000469 FF2485[680D0000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 796 efxnull: 797 None: 798 00000470 C3 retn 799 efxarpeggio2: 800 ; 01/10/2017 801 00000471 84D2 test dl, dl 802 00000473 74FB jz short efxnull 803 Arpeggio: 804 00000475 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 805 00000479 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 806 0000047E 66894712 mov [edi+TrackInfo.Pitch], ax 807 00000482 6683C302 add bx, 2 808 00000486 6683FB06 cmp bx, 6 809 0000048A 7202 jb short SetArpIndex 810 0000048C 31DB xor ebx, ebx 811 SetArpIndex: 812 0000048E 66895F24 mov [edi+TrackInfo.ArpIndex], bx 813 00000492 C3 retn 814 efxportaup: 815 PortUp: 816 00000493 30F6 xor dh, dh 817 ;mov bx, [edi+TrackInfo.Period] 818 00000495 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 819 00000499 6629D3 sub bx, dx 820 ;cmp bx, 113 821 0000049C 6683FB1C cmp bx, 28 ; 01/10/2017 822 000004A0 7D04 jge short NotSmall 823 ;mov bx, 113 824 000004A2 66BB1C00 mov bx, 28 ; 01/10/2017 825 NotSmall: 826 000004A6 66895F10 mov [edi+TrackInfo.Period], bx 827 000004AA 6601DB add bx, bx 828 ;mov ax, [PitchTable+bx] 829 000004AD 668B83[62160000] mov ax, [PitchTable+ebx] ; 02/10/2017 830 000004B4 66894712 mov [edi+TrackInfo.Pitch], ax 831 000004B8 C3 retn 832 efxportadown: 833 PortDown: 834 000004B9 30F6 xor dh, dh 835 ;mov bx, [edi+TrackInfo.Period] 836 000004BB 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 837 000004BF 6601D3 add bx, dx 838 000004C2 6681FB600D cmp bx, 3424 ; 01/10/2017 839 ;cmp bx, 856 840 000004C7 7E04 jle short NotBig 841 ;mov bx, 856 842 000004C9 66BB600D mov bx, 3424 ; 01/10/2017 843 NotBig: 844 000004CD 66895F10 mov [edi+TrackInfo.Period], bx 845 000004D1 6601DB add bx, bx 846 ;mov ax, [PitchTable+bx] 847 000004D4 668B83[62160000] mov ax, [PitchTable+ebx] ; 02/10/2017 848 000004DB 66894712 mov [edi+TrackInfo.Pitch], ax 849 000004DF C3 retn 850 efxtoneporta2: 851 TonePort: 852 000004E0 30F6 xor dh, dh 853 000004E2 668B4716 mov ax, [edi+TrackInfo.PortTo] 854 ;mov bx, [edi+TrackInfo.Period] 855 000004E6 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 856 000004EA 6639C3 cmp bx, ax 857 000004ED 7429 je short NoPort 858 000004EF 7F0D jg short PortToUp 859 PortToDown: 860 000004F1 6601D3 add bx, dx 861 000004F4 6639C3 cmp bx, ax 862 000004F7 7E0D jle short SetPort 863 FixPort: 864 000004F9 6689C3 mov bx, ax 865 000004FC EB08 jmp short SetPort 866 PortToUp: 867 000004FE 6629D3 sub bx, dx 868 00000501 6639C3 cmp bx, ax 869 00000504 7CF3 jl short FixPort 870 SetPort: 871 00000506 66895F10 mov [edi+TrackInfo.Period], bx 872 0000050A 6601DB add bx, bx 873 ;mov ax, [PitchTable+bx] 874 0000050D 668B83[62160000] mov ax, [PitchTable+ebx] ; 02/10/2017 875 00000514 66894712 mov [edi+TrackInfo.Pitch], ax 876 NoPort: 877 00000518 C3 retn 878 efxvibrato2: 879 ; 01/10/2017 880 Vibrato: 881 00000519 88D6 mov dh, dl 882 ;and dl, 0Fh 883 ;shr dh, 4 884 ;shl dh, 2 885 0000051B 6681E20FF0 and dx, 0F00Fh 886 00000520 C0EE02 shr dh, 2 887 ;add [edi+TrackInfo.VibPos], dh 888 ;mov dh, [edi+TrackInfo.VibPos] 889 ;mov bl, dh 890 00000523 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 891 00000526 007719 add [edi+TrackInfo.VibPos], dh 892 00000529 88DE mov dh, bl ; 01/10/2017 893 0000052B C0EB02 shr bl, 2 894 ;and bx, 1Fh 895 ;mov al, [SinTable+bx] 896 0000052E 83E31F and ebx, 1Fh 897 00000531 8A83[500E0000] mov al, [SinTable+ebx] 898 00000537 F6E2 mul dl 899 ;rol ax, 1 900 ;xchg al, ah 901 ;and ah, 1 902 00000539 66C1E807 shr ax, 7 903 0000053D 84F6 test dh, dh 904 0000053F 7903 jns short VibUp 905 00000541 66F7D8 neg ax 906 VibUp: 907 00000544 66034710 add ax, [edi+TrackInfo.Period] 908 00000548 6689C3 mov bx, ax 909 ;movzx ebx, ax 910 0000054B 6683FB71 cmp bx, 113 911 ;cmp bx, 113 912 0000054F 6683FB1C cmp bx, 28 ; 01/10/2017 913 00000553 7D06 jge short NoLoVib 914 ;mov bx, 113 915 00000555 66BB1C00 mov bx, 28 ; 01/10/2017 916 00000559 EB0B jmp short NoHiVib ; 01/10/2017 917 NoLoVib: 918 0000055B 6681FB600D cmp bx, 3424 ; 01/10/2017 919 ;cmp bx, 856 920 00000560 7E04 jle short NoHiVib 921 ;mov bx, 856 922 00000562 66BB600D mov bx, 3424 ; 01/10/2017 923 NoHiVib: 924 00000566 6601DB add bx, bx 925 ;mov ax, [PitchTable+bx] 926 00000569 668B83[62160000] mov ax, [PitchTable+ebx] ; 01/10/2017 927 00000570 66894712 mov [edi+TrackInfo.Pitch], ax 928 00000574 C3 retn 929 efxtoneslide: 930 PortSlide: 931 00000575 E812000000 call VolSlide 932 0000057A 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 933 0000057D E95EFFFFFF jmp TonePort ; efxtoneporta2 934 efxvibslide: 935 VibSlide: 936 00000582 E805000000 call VolSlide 937 00000587 8A571A mov dl, [edi+TrackInfo.VibParm] 938 0000058A EB8D jmp short Vibrato ; efxvibrato2 939 efxvolslide: 940 VolSlide: 941 0000058C 88D6 mov dh, dl 942 0000058E 80E20F and dl, 0Fh 943 00000591 C0EE04 shr dh, 4 944 00000594 8A470E mov al, [edi+TrackInfo.Volume] 945 00000597 28D0 sub al, dl 946 00000599 7D02 jge short NoLoVol 947 0000059B 30C0 xor al, al 948 NoLoVol: 949 0000059D 00F0 add al, dh 950 0000059F 3C40 cmp al, 64 951 000005A1 7602 jbe short NoHiVol 952 000005A3 B040 mov al, 64 953 NoHiVol: 954 000005A5 88470E mov [edi+TrackInfo.Volume], al 955 000005A8 C3 retn 956 957 efxtremolo2: 958 ; 01/10/2017 (TMODPLAY.ASM) 959 Tremolo: 960 000005A9 88D6 mov dh, dl 961 000005AB 6681E20FF0 and dx, 0F00Fh 962 000005B0 C0EE02 shr dh, 2 963 000005B3 8A5F1B mov bl, [edi+TrackInfo.TremPos] 964 000005B6 00771B add [edi+TrackInfo.TremPos], dh 965 000005B9 88DE mov dh, bl 966 000005BB C0EB02 shr bl, 2 967 ; 01/10/2017 - TRDOS 386 968 ;and bx, 1Fh 969 000005BE 83E31F and ebx, 1Fh 970 ;mov al, [SinTable+bx] 971 000005C1 8A83[500E0000] mov al, [SinTable+ebx] 972 000005C7 F6E2 mul dl 973 000005C9 66C1E806 shr ax, 6 974 000005CD 84F6 test dh, dh 975 000005CF 7D03 jge short Tremolo_1 ; efxtremolof2 976 000005D1 66F7D8 neg ax 977 efxtremolof2: 978 Tremolo_1: 979 000005D4 8A670E mov ah, [edi+TrackInfo.Volume] 980 000005D7 00E0 add al, ah 981 000005D9 7D02 jge short Tremolo_2 ; efxtremolof3 982 000005DB 30C0 xor al, al 983 efxtremolof3: 984 Tremolo_2: 985 000005DD 3C40 cmp al, 64 ; 40h 986 000005DF 7E02 jle short Tremolo_3 ; efxtremolof4 987 000005E1 B040 mov al, 64 ; 40h 988 efxtremolof4: 989 Tremolo_3: 990 000005E3 28E0 sub al, ah ; ****** 991 000005E5 88470F mov [edi+TrackInfo.VolDiff], al 992 000005E8 C3 retn 993 994 ;-------------------------------------------------------------------------- 995 ; readchannel - read the next note event from the pattern sheet 996 ;-------------------------------------------------------------------------- 997 ; 998 ;-------------------------------------------------------------------------- 999 ; GetTrack: Get the next Note from a pattern. 1000 ; In: 1001 ; ds:di - Track info Address. 1002 ; es:si - Pattern Note Address. 1003 ; Out: 1004 ; es:si - The Next Pattern Note address. 1005 ;-------------------------------------------------------------------------- 1006 1007 ; esi = Pattern note address 1008 ; edi = Track info address 1009 1010 readchannel: 1011 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1012 000005E9 66AD lodsw 1013 000005EB 86C4 xchg al, ah 1014 000005ED 88E3 mov bl, ah 1015 000005EF 80E40F and ah, 0Fh 1016 000005F2 6689C1 mov cx, ax 1017 000005F5 66AD lodsw 1018 000005F7 86C4 xchg al, ah 1019 000005F9 88E7 mov bh, ah 1020 000005FB 80E40F and ah, 0Fh 1021 000005FE 6689C2 mov dx, ax 1022 00000601 66895714 mov [edi+TrackInfo.Effect], dx 1023 ; 01/10/2017 - TRDOS 386 1024 ;and bl, 0F0h 1025 00000605 81E3F0FF0000 and ebx, 0FFF0h 1026 0000060B C0EF04 shr bh, 4 1027 0000060E 08FB or bl, bh 1028 00000610 7446 je short SetPeriod 1029 SetSample: 1030 00000612 30FF xor bh, bh 1031 ;and ebx, 0FFh 1032 00000614 FECB dec bl 1033 00000616 01DB add ebx, ebx 1034 00000618 668B83[24160000] mov ax, [ModInfo.SampVol+ebx] 1035 0000061F 88470E mov [edi+TrackInfo.Volume], al 1036 00000622 668B83[EE140000] mov ax, [ModInfo.SampOfs+ebx] 1037 00000629 668907 mov [edi+TrackInfo.Samples], ax 1038 0000062C 668B83[2C150000] mov ax, [ModInfo.SampSeg+ebx] 1039 00000633 66894702 mov [edi+TrackInfo.Samples+2], ax 1040 00000637 668B83[6A150000] mov ax, [ModInfo.SampLen+ebx] 1041 0000063E 66894708 mov [edi+TrackInfo.Len], ax 1042 00000642 668B83[A8150000] mov ax, [ModInfo.SampRep+ebx] 1043 00000649 6689470A mov [edi+TrackInfo.Repeat], ax 1044 0000064D 668B83[E6150000] mov ax, [ModInfo.SampRepLen+ebx] 1045 00000654 6689470C mov [edi+TrackInfo.RepLen], ax 1046 SetPeriod: 1047 00000658 6685C9 test cx, cx 1048 0000065B 7425 jz short SetEffect 1049 1050 0000065D 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1051 1052 00000661 80FE03 cmp dh, 03h 1053 ;je short SetEffect 1054 00000664 7428 je short efxtoneporta ; 01/10/2017 1055 1056 00000666 66894F10 mov [edi+TrackInfo.Period], cx 1057 ;movzx ebx, cx 1058 0000066A 6689CB mov bx, cx 1059 0000066D 6601DB add bx, bx 1060 ;mov ax, [PitchTable+bx] 1061 00000670 668B83[62160000] mov ax, [PitchTable+ebx] ; 01/10/2017 1062 00000677 66894712 mov [edi+TrackInfo.Pitch], ax 1063 0000067B C7470400000000 mov dword [edi+TrackInfo.Position], 0 1064 SetEffect: 1065 ;test dx, dx 1066 ;je short InitNone 1067 ;cmp dh, 00h 1068 ;je InitArpeggio 1069 ;cmp dh, 03h 1070 ;je short InitTonePort 1071 ;cmp dh, 04h 1072 ;je short InitVibrato 1073 ;cmp dh, 09h 1074 ;je short SampleOfs 1075 ;cmp dh, 0Bh 1076 ;je short PosJump 1077 ;cmp dh, 0Ch 1078 ;je short SetVolume 1079 ;cmp dh, 0Dh 1080 ;je short Break 1081 ;cmp dh, 0Fh 1082 ;je SetSpeed 1083 ;retn 1084 1085 ; 01/10/2017 (TMODPLAY.ASM) 1086 1087 ; dx = [di+TrackInfo.Effect] 1088 1089 00000682 0FB6C6 movzx eax, dh 1090 00000685 240F and al, 0Fh 1091 00000687 FF2485[280D0000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1092 ;efxnull: 1093 ;InitNone: 1094 ; retn 1095 efxtoneporta: 1096 ; 01/10/2017 1097 ; cx = period 1098 ;mov [edi+TrackInfo.PortTo], cx ; * 1099 InitTonePort: 1100 0000068E 84D2 test dl, dl 1101 00000690 7503 jnz short SetPortParm 1102 00000692 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1103 SetPortParm: 1104 00000695 885718 mov [edi+TrackInfo.PortParm], dl 1105 00000698 66895714 mov [edi+TrackInfo.Effect], dx 1106 0000069C C3 retn 1107 efxvibrato: 1108 InitVibrato: 1109 0000069D 8A471A mov al, [edi+TrackInfo.VibParm] 1110 000006A0 88C4 mov ah, al 1111 ;and al, 0Fh 1112 ;and ah, 0F0h 1113 000006A2 66250FF0 and ax, 0F00Fh 1114 000006A6 F6C20F test dl, 0Fh 1115 000006A9 7502 jne short OkDepth 1116 000006AB 08C2 or dl, al 1117 OkDepth: 1118 000006AD F6C2F0 test dl, 0F0h 1119 000006B0 7502 jnz short OkRate 1120 000006B2 08E2 or dl, ah 1121 OkRate: 1122 000006B4 88571A mov [edi+TrackInfo.VibParm], dl 1123 000006B7 66895714 mov [edi+TrackInfo.Effect], dx 1124 000006BB 6685C9 test cx, cx 1125 000006BE 7404 jz short OkPos 1126 000006C0 C6471900 mov byte [edi+TrackInfo.VibPos], 0 1127 OkPos: 1128 000006C4 C3 retn 1129 efxsampoffset: 1130 ; 01/10/2017 ; ******* 1131 SampleOfs: 1132 ; test dl, dl 1133 ; jnz short SetSampleOfs 1134 ; mov dl, [edi+TrackInfo.OldSampOfs] 1135 ;SetSampleOfs: 1136 ; mov [edi+TrackInfo.OldSampOfs], dl 1137 000006C5 88D6 mov dh, dl 1138 000006C7 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1139 000006CD 895704 mov [edi+TrackInfo.Position], edx 1140 000006D0 C3 retn 1141 efxpattjump: 1142 PosJump: 1143 000006D1 8815[10920000] mov [OrderPos], dl 1144 000006D7 C605[14920000]40 mov byte [Row], 64 1145 000006DE C3 retn 1146 efxsetvolume: 1147 SetVolume: 1148 000006DF 80FA40 cmp dl, 64 1149 000006E2 7602 jbe short OkVol 1150 000006E4 B240 mov dl, 64 1151 OkVol: 1152 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1153 000006E6 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1154 ;mov [edi+TrackInfo.Volume], dl 1155 000006E8 6689570E mov [edi+TrackInfo.Volume], dx 1156 000006EC C3 retn 1157 efxbreak: 1158 Break: 1159 000006ED 88D6 mov dh, dl 1160 000006EF 80E20F and dl, 0Fh 1161 000006F2 C0EE04 shr dh, 4 1162 000006F5 00F6 add dh, dh 1163 000006F7 00F2 add dl, dh 1164 000006F9 C0E602 shl dh, 2 1165 000006FC 00F2 add dl, dh 1166 000006FE 8815[15920000] mov [BreakRow], dl 1167 00000704 C605[14920000]40 mov byte [Row], 64 1168 0000070B C3 retn 1169 efxsetspeed: 1170 SetSpeed: 1171 0000070C 84D2 test dl,dl 1172 0000070E 7432 je short Skip 1173 00000710 80FA1F cmp dl,31 1174 00000713 770D ja short SetBpm 1175 SetTempo: 1176 00000715 8815[11920000] mov [Tempo], dl 1177 0000071B 8815[12920000] mov [TempoWait], dl 1178 00000721 C3 retn 1179 SetBpm: 1180 00000722 8815[13920000] mov [Bpm], dl 1181 00000728 B067 mov al, 103 1182 0000072A F6E2 mul dl 1183 0000072C 88E3 mov bl, ah 1184 0000072E 30FF xor bh, bh 1185 00000730 66A1[740E0000] mov ax, [MixSpeed] 1186 00000736 6631D2 xor dx, dx 1187 00000739 66F7F3 div bx 1188 0000073C 66A3[16920000] mov [BpmSamples], ax 1189 Skip: 1190 00000742 C3 retn 1191 efxarpeggio: 1192 ; 01/10/2017 1193 00000743 84D2 test dl, dl 1194 ;je efxnull 1195 00000745 74FB je short Skip 1196 InitArpeggio: 1197 00000747 88D6 mov dh, dl 1198 00000749 80E20F and dl, 0Fh 1199 0000074C C0EE04 shr dh, 4 1200 ; 01/10/2017 1201 ;mov cx, 36 1202 0000074F 66B95400 mov cx, 84 ; 84 notes/periods 1203 00000753 31DB xor ebx, ebx 1204 00000755 668B4710 mov ax, [edi+TrackInfo.Period] 1205 gt_ScanPeriod: 1206 ;cmp ax, [PeriodTable+bx] 1207 00000759 663B83[A80D0000] cmp ax, [PeriodTable+ebx] 1208 00000760 7306 jae short SetArp 1209 00000762 6683C302 add bx, 2 1210 00000766 E2F1 loop gt_ScanPeriod 1211 SetArp: 1212 00000768 6601D2 add dx, dx 1213 0000076B 00DE add dh, bl 1214 0000076D 00DA add dl, bl 1215 ; 01/10/2017 1216 ;mov bx, [PeriodTable+bx] 1217 0000076F 668B9B[A80D0000] mov bx, [PeriodTable+ebx] 1218 ;add bx, bx 1219 00000776 01DB add ebx, ebx 1220 ;mov ax, [PitchTable+bx] 1221 00000778 668B83[62160000] mov ax, [PitchTable+ebx] 1222 0000077F 6689471E mov [edi+TrackInfo.Arp], ax 1223 00000783 88F3 mov bl, dh 1224 00000785 30FF xor bh, bh 1225 00000787 668B9B[A80D0000] mov bx, [PeriodTable+ebx] 1226 ;add bx, bx 1227 0000078E 01DB add ebx, ebx 1228 ;mov ax, [PitchTable+bx] 1229 00000790 668B83[62160000] mov ax, [PitchTable+ebx] 1230 00000797 66894720 mov [edi+TrackInfo.Arp+2], ax 1231 0000079B 88D3 mov bl, dl 1232 0000079D 30FF xor bh, bh 1233 0000079F 668B9B[A80D0000] mov bx, [PeriodTable+ebx] 1234 ;add bx, bx 1235 000007A6 01DB add ebx, ebx 1236 ;mov ax, [PitchTable+bx] 1237 000007A8 668B83[62160000] mov ax, [PitchTable+ebx] 1238 000007AF 66894722 mov [edi+TrackInfo.Arp+4], ax 1239 000007B3 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1240 000007B9 C3 retn 1241 1242 efxtremolo: 1243 ; 01/10/2017 (TMODPLAY.ASM) 1244 InitTremolo: 1245 000007BA 8A471C mov al, [edi+TrackInfo.TremParm] 1246 000007BD 88C4 mov ah, al 1247 000007BF 66250FF0 and ax, 0F00Fh 1248 000007C3 F6C20F test dl, 0Fh 1249 000007C6 7502 jnz short InitTremolo_1 ; efxtremolof0 1250 000007C8 08C2 or dl, al 1251 efxtremolof0: 1252 InitTremolo_1: 1253 000007CA F6C2F0 test dl, 0F0h 1254 000007CD 7502 jnz short InitTremolo_2 ; efxtremolof1 1255 000007CF 08E2 or dl, ah 1256 efxtremolof1: 1257 InitTremolo_2: 1258 000007D1 88571C mov [edi+TrackInfo.TremParm], dl 1259 000007D4 66895714 mov [edi+TrackInfo.Effect], dx 1260 000007D8 C3 retn 1261 1262 ;-------------------------------------------------------------------------- 1263 ; pollmodule - polls the module player 1264 ;-------------------------------------------------------------------------- 1265 ;-------------------------------------------------------------------------- 1266 ; UpdateTracks: Main code to process the next tick to be played. 1267 ;-------------------------------------------------------------------------- 1268 1269 pollmodule: 1270 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1271 000007D9 FE0D[12920000] dec byte [TempoWait] 1272 000007DF 7417 jz short GetTracks 1273 1274 ;mov ecx, NumTracks 1275 000007E1 0FB70D[13100000] movzx ecx, word [numtracks] ; 06/10/2017 1276 000007E8 BF[26920000] mov edi, Tracks 1277 BeatTracks: 1278 000007ED E86EFCFFFF call BeatTrack 1279 000007F2 83C726 add edi, TrackInfo.size 1280 000007F5 E2F6 loop BeatTracks 1281 000007F7 C3 retn 1282 GetTracks: 1283 000007F8 A0[11920000] mov al, [Tempo] 1284 000007FD A2[12920000] mov [TempoWait], al 1285 1286 00000802 8B35[22920000] mov esi, [Note] 1287 00000808 803D[14920000]40 cmp byte [Row], 64 1288 0000080F 7268 jb short NoPattWrap 1289 1290 00000811 8B35[EA140000] mov esi, [ModInfo.Patterns] 1291 00000817 8A1D[10920000] mov bl, [OrderPos] 1292 0000081D 3A1D[68140000] cmp bl, [ModInfo.OrderLen] 1293 00000823 7214 jb short NoOrderWrap 1294 00000825 8A1D[69140000] mov bl, [ModInfo.ReStart] 1295 0000082B 881D[10920000] mov [OrderPos], bl 1296 00000831 3A1D[68140000] cmp bl, [ModInfo.OrderLen] 1297 00000837 7364 jae short NoUpdate 1298 NoOrderWrap: 1299 ;xor bh, bh 1300 00000839 81E3FF000000 and ebx, 0FFh 1301 0000083F 8A9B[6A140000] mov bl, [ModInfo.Order+ebx] 1302 ; 05/10/2017 1303 ;shl ebx, 10 ; *1024 1304 00000845 8A0D[12100000] mov cl, [pattern_shift] ; 10 or 11 1305 0000084B D3E3 shl ebx, cl ; *1024 or *2048 1306 ; 1307 0000084D 01DE add esi, ebx 1308 0000084F 8A1D[15920000] mov bl, [BreakRow] 1309 00000855 881D[14920000] mov [Row], bl 1310 ;xor bh, bh 1311 0000085B 81E3FF000000 and ebx, 0FFh 1312 00000861 883D[15920000] mov [BreakRow], bh ; 0 1313 00000867 66C1E304 shl bx, 4 1314 0000086B 01DE add esi, ebx 1315 0000086D 8935[22920000] mov [Note], esi 1316 00000873 FE05[10920000] inc byte [OrderPos] 1317 NoPattWrap: 1318 00000879 FE05[14920000] inc byte [Row] 1319 1320 ;cld 1321 ;mov ecx, NumTracks 1322 0000087F 0FB70D[13100000] movzx ecx, word [numtracks] ; 06/10/2017 1323 00000886 BF[26920000] mov edi, Tracks 1324 GetTracks_next: 1325 0000088B 51 push ecx 1326 0000088C E858FDFFFF call GetTrack 1327 00000891 59 pop ecx 1328 00000892 83C726 add edi, TrackInfo.size 1329 00000895 E2F4 loop GetTracks_next 1330 1331 00000897 8935[22920000] mov [Note], esi 1332 NoUpdate: 1333 0000089D C3 retn 1334 1335 ;-------------------------------------------------------------------------- 1336 ; MixTrack: Mixes one track into a CLEAN buffer. 1337 ; In: 1338 ; ds:si - Track Info Address. 1339 ; ds:di - Buffer Address. 1340 ; cx - Buffer Size. 1341 ;-------------------------------------------------------------------------- 1342 1343 ; esi = Track info address 1344 ; edi = Buffer address 1345 ; ecx = Buffer size 1346 1347 ; 23/08/2020 1348 MixTrack: 1349 0000089E 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1350 000008A3 7757 ja short MixLooped 1351 MixNonLooped: 1352 000008A5 8B16 mov edx, [esi+TrackInfo.Samples] 1353 000008A7 8B5E04 mov ebx, [esi+TrackInfo.Position] 1354 000008AA 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1355 000008AE 52 push edx 1356 000008AF 56 push esi 1357 000008B0 01D3 add ebx, edx 1358 000008B2 01D5 add ebp, edx 1359 000008B4 668B5612 mov dx, [esi+TrackInfo.Pitch] 1360 ; 01/10/2017 1361 ;mov al, [esi+TrackInfo.Volume] 1362 000008B8 668B460E mov ax, [esi+TrackInfo.Volume] 1363 ; ah = [esi+TrackInfo.VolDiff] 1364 000008BC 00E0 add al, ah ; ****** 1365 000008BE C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1366 000008C2 8A661D mov ah, [esi+TrackInfo.Error] 1367 000008C5 89DE mov esi, ebx 1368 000008C7 31DB xor ebx, ebx ; 01/10/2017 ; * 1369 000008C9 88C7 mov bh, al 1370 000008CB 88D0 mov al, dl 1371 000008CD 88F2 mov dl, dh 1372 ;xor dh, dh 1373 000008CF 81E2FF000000 and edx, 0FFh 1374 nlMixSamp: 1375 000008D5 39EE cmp esi, ebp 1376 000008D7 7316 jae short nlMixBye 1377 000008D9 8A1E mov bl, [esi] 1378 ;mov bl, [VolTable+bx] 1379 000008DB 8A9B[24310000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1380 000008E1 001F add [edi], bl 1381 ;inc edi 1382 000008E3 00C4 add ah, al 1383 000008E5 11D6 adc esi, edx 1384 ; 23/08/2020 1385 000008E7 033D[13100000] add edi, [numtracks] 1386 000008ED E2E6 loop nlMixSamp 1387 nlMixBye: 1388 000008EF 89F3 mov ebx, esi 1389 000008F1 5E pop esi 1390 000008F2 5A pop edx 1391 000008F3 29D3 sub ebx, edx 1392 000008F5 895E04 mov [esi+TrackInfo.Position], ebx 1393 000008F8 88661D mov [esi+TrackInfo.Error], ah 1394 000008FB C3 retn 1395 MixLooped: 1396 000008FC 8B16 mov edx, [esi+TrackInfo.Samples] 1397 000008FE 8B5E04 mov ebx, [esi+TrackInfo.Position] 1398 00000901 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1399 00000905 892D[1E920000] mov [BufRep], ebp 1400 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1401 0000090B 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1402 0000090F 52 push edx 1403 00000910 56 push esi 1404 00000911 01D3 add ebx, edx 1405 00000913 01D5 add ebp, edx 1406 00000915 668B5612 mov dx, [esi+TrackInfo.Pitch] 1407 ; 01/10/2017 1408 ;mov al, [esi+TrackInfo.Volume] 1409 00000919 668B460E mov ax, [esi+TrackInfo.Volume] 1410 ; ah = [esi+TrackInfo.VolDiff] 1411 0000091D 00E0 add al, ah ; ****** 1412 0000091F C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1413 00000923 8A661D mov ah, [esi+TrackInfo.Error] 1414 ;mov si, bx 1415 00000926 89DE mov esi, ebx ; 04/09/2017 1416 00000928 31DB xor ebx, ebx ; 01/10/2017 ; * 1417 0000092A 88C7 mov bh, al 1418 0000092C 88D0 mov al, dl 1419 0000092E 88F2 mov dl, dh 1420 ;xor dh, dh 1421 00000930 81E2FF000000 and edx, 0FFh 1422 lpMixSamp: 1423 00000936 39EE cmp esi, ebp 1424 00000938 7206 jb short lpMixNow 1425 0000093A 2B35[1E920000] sub esi, [BufRep] 1426 lpMixNow: 1427 00000940 8A1E mov bl, [esi] 1428 ;mov bl, [VolTable+bx] 1429 00000942 8A9B[24310000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1430 00000948 001F add [edi], bl 1431 ;inc edi 1432 0000094A 00C4 add ah, al 1433 0000094C 11D6 adc esi, edx 1434 ; 23/08/2020 1435 0000094E 033D[13100000] add edi, [numtracks] 1436 00000954 E2E0 loop lpMixSamp 1437 lpMixBye: 1438 ; mov ebx, esi 1439 ; pop esi 1440 ; pop edx 1441 ; sub ebx, edx 1442 ; mov [esi+TrackInfo.Position], ebx 1443 ; mov [esi+TrackInfo.Error], ah 1444 ; retn 1445 00000956 EB97 jmp short nlMixBye 1446 1447 ;-------------------------------------------------------------------------- 1448 ; GetSamples: Returns the next chunk of samples to be played. 1449 ; In: 1450 ; Buffer - Buffer Address. 1451 ; Count - Buffer Size. 1452 ;-------------------------------------------------------------------------- 1453 1454 ; 23/08/2020 1455 ; tmodply3.s (03/08/2020, 28/10/2017) 1456 mixpoll: 1457 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1458 ; edi = buffer address 1459 ; ebx = count 1460 1461 ; 22/08/2020 1462 00000958 BF[00A00000] mov edi, Audio_Buffer 1463 0000095D BB00200000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 1464 1465 00000962 60 pushad 1466 1467 ;cld 1468 1469 ; 03/08/2020 1470 ; clear audio buffer 1471 00000963 89FE mov esi, edi 1472 00000965 B900080000 mov ecx, BUFFERSIZE/16 1473 0000096A B880808080 mov eax, 80808080h 1474 0000096F F3AB rep stosd 1475 00000971 89F7 mov edi, esi 1476 1477 NextChunk: 1478 00000973 66833D[1C920000]00 cmp word [BufLen], 0 1479 0000097B 756B jne short CopyChunk 1480 1481 0000097D 53 push ebx 1482 0000097E 57 push edi 1483 MixChunk: 1484 0000097F BF[24720000] mov edi, MixBuffer 1485 ; 17/10/2017 1486 00000984 0FB70D[16920000] movzx ecx, word [BpmSamples] 1487 ;mov cx, [BpmSamples] 1488 0000098B 893D[18920000] mov [BufPtr], edi 1489 00000991 66890D[1C920000] mov [BufLen], cx 1490 1491 00000998 803D[13100000]04 cmp byte [numtracks], 4 1492 0000099F 7603 jna short ch_silence 1493 000009A1 66D1E1 shl cx, 1 1494 ch_silence: 1495 000009A4 B880808080 mov eax, 80808080h 1496 000009A9 F3AB rep stosd 1497 1498 ;mov cx, NumTracks 1499 ;mov cl, NumTracks ; 01/10/2017 1500 ;mov cx, [numtracks] ; 18/10/2017 1501 000009AB 8A0D[13100000] mov cl, [numtracks] ; 19/10/2017 1502 000009B1 BE[00920000] mov esi, Tracks - TrackInfo.size 1503 GetSamples_next: 1504 000009B6 51 push ecx 1505 000009B7 83C626 add esi, TrackInfo.size 1506 000009BA 668B0D[1C920000] mov cx, [BufLen] 1507 000009C1 8B3D[18920000] mov edi, [BufPtr] 1508 000009C7 E8D2FEFFFF call MixTrack 1509 000009CC 59 pop ecx 1510 000009CD FF05[18920000] inc dword [BufPtr] ; 18/10/2017 1511 000009D3 E2E1 loop GetSamples_next 1512 1513 ; 18/10/2017 1514 000009D5 8B1D[13100000] mov ebx, [numtracks] 1515 000009DB 291D[18920000] sub dword [BufPtr], ebx 1516 1517 000009E1 E8F3FDFFFF call UpdateTracks 1518 1519 000009E6 5F pop edi 1520 000009E7 5B pop ebx 1521 CopyChunk: 1522 ;mov cx, [BufLen] 1523 000009E8 0FB70D[1C920000] movzx ecx, word [BufLen] 1524 000009EF 39D9 cmp ecx, ebx 1525 ;cmp cx, bx 1526 000009F1 7602 jbe short MoveChunk 1527 ;mov cx, bx 1528 000009F3 89D9 mov ecx, ebx 1529 MoveChunk: 1530 000009F5 8B35[18920000] mov esi, [BufPtr] 1531 000009FB 010D[18920000] add [BufPtr], ecx 1532 00000A01 66290D[1C920000] sub [BufLen], cx 1533 00000A08 29CB sub ebx, ecx 1534 ; 17/10/2017 ; STEREO MIXING 1535 ;rep movsb 1536 ; 18/10/2017 1537 00000A0A 803D[13100000]04 cmp byte [numtracks], 4 1538 ;jna short _4_channels_mix 1539 00000A11 762F jna _4_channels_mix 1540 1541 _8_channels_mix: 1542 ; 18/10/2017 1543 00000A13 AD lodsd 1544 00000A14 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1545 00000A16 C1EA10 shr edx, 16 ; ch3 (dl), ch4 (dh) 1546 00000A19 00C6 add dh, al ; ch1 + ch4 1547 00000A1B 00E2 add dl, ah ; ch2 + ch3 1548 1549 00000A1D AD lodsd 1550 00000A1E 00C6 add dh, al ; ch1 + ch4 + ch5 1551 00000A20 00E2 add dl, ah ; ch2 + ch3 + ch6 1552 00000A22 C1E810 shr eax, 16 ; ch7 (al), ch8 (ah) 1553 ; 19/10/2017 1554 00000A25 00E6 add dh, ah ; ch1 + ch4 + ch5 + ch8 1555 00000A27 00C2 add dl, al ; ch2 + ch3 + ch6 + ch7 1556 1557 ; L = ch1 + ch4 + ch5 + ch8 1558 ; R = ch2 + ch3 + ch6 + ch7 1559 1560 00000A29 6681C28080 add dx, 8080h 1561 1562 ; 19/10/2017 1563 00000A2E 88F4 mov ah, dh 1564 00000A30 80EC80 sub ah, 80h 1565 00000A33 30C0 xor al, al 1566 00000A35 66AB stosw ; Left Channel 1567 00000A37 88D4 mov ah, dl 1568 00000A39 80EC80 sub ah, 80h 1569 00000A3C 66AB stosw ; Right Channel 1570 1571 00000A3E E2D3 loop _8_channels_mix 1572 1573 00000A40 EB21 jmp short channel_mix_ok 1574 1575 _4_channels_mix: 1576 ; 18/10/2017 1577 00000A42 AD lodsd 1578 00000A43 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1579 ; 19/10/2017 1580 00000A45 C1E810 shr eax, 16 ; ch3 (al), ch4 (ah) 1581 00000A48 00E2 add dl, ah ; ch1 + ch4 1582 00000A4A 00C6 add dh, al ; ch2 + ch3 1583 1584 ; L = ch1 + ch4 1585 ; R = ch2 + ch3 1586 1587 ; 19/10/2017 1588 00000A4C 6681C28080 add dx, 8080h 1589 1590 ; 19/10/2017 1591 00000A51 88D4 mov ah, dl 1592 00000A53 80EC80 sub ah, 80h 1593 00000A56 30C0 xor al, al 1594 00000A58 66AB stosw ; Left Channel 1595 00000A5A 88F4 mov ah, dh 1596 00000A5C 80EC80 sub ah, 80h 1597 00000A5F 66AB stosw ; Right Channel 1598 1599 00000A61 E2DF loop _4_channels_mix 1600 1601 channel_mix_ok: 1602 00000A63 85DB test ebx, ebx 1603 ;jnz short NextChunk 1604 00000A65 0F8508FFFFFF jnz NextChunk ; 17/10/2017 1605 1606 ; 20/10/2017 1607 ; 19/10/2017 1608 ; Pan Control 1609 00000A6B 8A0D[A8930000] mov cl, [pan_shift] 1610 00000A71 08C9 or cl, cl 1611 00000A73 744D jz short c_smpl_2 1612 1613 ; 20/10/2017 1614 00000A75 BB00200000 mov ebx, BUFFERSIZE/4 ; 8192 1615 00000A7A BF[00A00000] mov edi, Audio_Buffer 1616 1617 00000A7F B508 mov ch, 8 1618 00000A81 D2E5 shl ch, cl 1619 c_smpl_1: 1620 00000A83 8B17 mov edx, [edi] 1621 00000A85 6689D0 mov ax, dx 1622 00000A88 80FC80 cmp ah, 80h 1623 00000A8B 7208 jb short _cs1 1624 00000A8D 00EC add ah, ch 1625 00000A8F 730A jnc short _cs2 1626 00000A91 B4FF mov ah, 255 1627 00000A93 EB06 jmp short _cs2 1628 _cs1: 1629 00000A95 28EC sub ah, ch 1630 00000A97 7302 jnc short _cs2 1631 00000A99 B400 mov ah, 0 1632 _cs2: 1633 00000A9B C1CA10 ror edx, 16 ; dx = [edi+2] 1634 00000A9E 00F4 add ah, dh 1635 00000AA0 6692 xchg dx, ax ; xchg [edi+2], ax 1636 00000AA2 80FC80 cmp ah, 80h 1637 00000AA5 7208 jb short _cs3 1638 00000AA7 00EC add ah, ch 1639 00000AA9 730A jnc short _cs4 1640 00000AAB B4FF mov ah, 255 1641 00000AAD EB06 jmp short _cs4 1642 _cs3: 1643 00000AAF 28EC sub ah, ch 1644 00000AB1 7302 jnc short _cs4 1645 00000AB3 B400 mov ah, 0 1646 _cs4: 1647 00000AB5 C1CA10 ror edx, 16 ; dx = [edi] 1648 00000AB8 00E6 add dh, ah 1649 00000ABA 8917 mov [edi], edx 1650 _cs5: 1651 ; 20/10/2017 1652 00000ABC 83C704 add edi, 4 1653 00000ABF 4B dec ebx 1654 00000AC0 75C1 jnz short c_smpl_1 1655 c_smpl_2: 1656 00000AC2 61 popad 1657 00000AC3 C3 retn 1658 1659 ;-------------------------------------------------------------------------- 1660 ; StartPlaying: Initializes the Sound System. 1661 ; In: 1662 ; Module Information Resources. 1663 ;-------------------------------------------------------------------------- 1664 1665 StartPlaying: 1666 00000AC4 60 pushad 1667 SetModParms: 1668 00000AC5 C605[10920000]00 mov byte [OrderPos], 0 1669 00000ACC C605[11920000]06 mov byte [Tempo], DefTempo 1670 00000AD3 C605[12920000]06 mov byte [TempoWait], DefTempo 1671 00000ADA C605[13920000]7D mov byte [Bpm], DefBpm 1672 00000AE1 C605[14920000]40 mov byte [Row], 64 1673 00000AE8 C605[15920000]00 mov byte [BreakRow], 0 1674 00000AEF 66A1[740E0000] mov ax, [MixSpeed] 1675 00000AF5 31D2 xor edx, edx 1676 00000AF7 66BB3200 mov bx, 24*DefBpm/60 1677 00000AFB 66F7F3 div bx 1678 00000AFE 66A3[16920000] mov [BpmSamples], ax 1679 ClearTracks: 1680 00000B04 BF[26920000] mov edi, Tracks 1681 ; 06/10/2017 1682 ;mov ecx, NumTracks*TrackInfo.size 1683 00000B09 B826000000 mov eax, TrackInfo.size 1684 00000B0E 0FB70D[13100000] movzx ecx, word [numtracks] 1685 00000B15 F7E1 mul ecx 1686 00000B17 89C1 mov ecx, eax 1687 00000B19 31C0 xor eax, eax 1688 ;cld 1689 00000B1B F3AA rep stosb 1690 1691 00000B1D A3[18920000] mov [BufPtr], eax 1692 00000B22 66A3[1C920000] mov [BufLen], ax 1693 MakePitch: 1694 00000B28 66B80021 mov ax, MidCRate 1695 00000B2C 66BBAC01 mov bx, 428 1696 00000B30 66F7E3 mul bx 1697 00000B33 66F735[740E0000] div word [MixSpeed] 1698 00000B3A 30F6 xor dh, dh 1699 00000B3C 88E2 mov dl, ah 1700 00000B3E 88C4 mov ah, al 1701 00000B40 30C0 xor al, al 1702 ;mov cx, 857 1703 00000B42 66B9610D mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1704 00000B46 31DB xor ebx, ebx 1705 00000B48 BF[62160000] mov edi, PitchTable 1706 PitchLoop: 1707 00000B4D 50 push eax 1708 00000B4E 52 push edx 1709 00000B4F 6639DA cmp dx, bx 1710 00000B52 7303 jae short NoDiv 1711 00000B54 66F7F3 div bx 1712 NoDiv: 1713 00000B57 66AB stosw 1714 00000B59 5A pop edx 1715 00000B5A 58 pop eax 1716 00000B5B 43 inc ebx 1717 00000B5C E2EF loop PitchLoop 1718 MakeVolume: 1719 00000B5E 66B90041 mov cx, 16640 1720 00000B62 89CB mov ebx, ecx 1721 VolLoop: 1722 00000B64 4B dec ebx 1723 00000B65 88D8 mov al, bl 1724 00000B67 F6EF imul bh 1725 00000B69 88A3[24310000] mov [VolTable+ebx], ah 1726 00000B6F E2F3 loop VolLoop 1727 1728 00000B71 61 popad 1729 00000B72 C3 retn 1730 1731 ;-------------------------------------------------------------------------- 1732 ; StopPlaying: ShutDown the Sound System. 1733 ;-------------------------------------------------------------------------- 1734 1735 StopPlaying: 1736 ; 19/06/2017 1737 ; Stop Playing 1738 sys _audio, 0700h 1738 <1> 1738 <1> 1738 <1> 1738 <1> 1738 <1> %if %0 >= 2 1738 00000B73 BB00070000 <1> mov ebx, %2 1738 <1> %if %0 >= 3 1738 <1> mov ecx, %3 1738 <1> %if %0 = 4 1738 <1> mov edx, %4 1738 <1> %endif 1738 <1> %endif 1738 <1> %endif 1738 00000B78 B820000000 <1> mov eax, %1 1738 <1> 1738 00000B7D CD40 <1> int 40h 1739 ; Cancel callback service (for user) 1740 sys _audio, 0900h 1740 <1> 1740 <1> 1740 <1> 1740 <1> 1740 <1> %if %0 >= 2 1740 00000B7F BB00090000 <1> mov ebx, %2 1740 <1> %if %0 >= 3 1740 <1> mov ecx, %3 1740 <1> %if %0 = 4 1740 <1> mov edx, %4 1740 <1> %endif 1740 <1> %endif 1740 <1> %endif 1740 00000B84 B820000000 <1> mov eax, %1 1740 <1> 1740 00000B89 CD40 <1> int 40h 1741 ; Deallocate Audio Buffer (for user) 1742 sys _audio, 0A00h 1742 <1> 1742 <1> 1742 <1> 1742 <1> 1742 <1> %if %0 >= 2 1742 00000B8B BB000A0000 <1> mov ebx, %2 1742 <1> %if %0 >= 3 1742 <1> mov ecx, %3 1742 <1> %if %0 = 4 1742 <1> mov edx, %4 1742 <1> %endif 1742 <1> %endif 1742 <1> %endif 1742 00000B90 B820000000 <1> mov eax, %1 1742 <1> 1742 00000B95 CD40 <1> int 40h 1743 ; Disable Audio Device 1744 sys _audio, 0C00h 1744 <1> 1744 <1> 1744 <1> 1744 <1> 1744 <1> %if %0 >= 2 1744 00000B97 BB000C0000 <1> mov ebx, %2 1744 <1> %if %0 >= 3 1744 <1> mov ecx, %3 1744 <1> %if %0 = 4 1744 <1> mov edx, %4 1744 <1> %endif 1744 <1> %endif 1744 <1> %endif 1744 00000B9C B820000000 <1> mov eax, %1 1744 <1> 1744 00000BA1 CD40 <1> int 40h 1745 1746 00000BA3 C3 retn 1747 1748 ;============================================================================= 1749 ; 1750 ;============================================================================= 1751 1752 ;dword2str: 1753 ; ; 13/11/2016 - Erdogan Tan 1754 ; ; eax = dword value 1755 ; ; 1756 ; call dwordtohex 1757 ; mov [dword_str], edx 1758 ; mov [dword_str+4], eax 1759 ; mov si, dword_str 1760 ; retn 1761 1762 ; 05/03/2017 (TRDOS 386) 1763 ; trdos386.s (unix386.s) - 10/05/2015 1764 ; Convert binary number to hexadecimal string 1765 1766 ;bytetohex: 1767 ; ; INPUT -> 1768 ; ; AL = byte (binary number) 1769 ; ; OUTPUT -> 1770 ; ; AX = hexadecimal string 1771 ; ; 1772 ; push ebx 1773 ; movzx ebx, al 1774 ; shr bl, 4 1775 ; mov bl, [ebx+hex_chars] 1776 ; xchg bl, al 1777 ; and bl, 0Fh 1778 ; mov ah, [ebx+hex_chars] 1779 ; pop ebx 1780 ; retn 1781 1782 ;wordtohex: 1783 ; ; INPUT -> 1784 ; ; AX = word (binary number) 1785 ; ; OUTPUT -> 1786 ; ; EAX = hexadecimal string 1787 ; ; 1788 ; push ebx 1789 ; xor ebx, ebx 1790 ; xchg ah, al 1791 ; push eax 1792 ; mov bl, ah 1793 ; shr bl, 4 1794 ; mov al, [ebx+hex_chars] 1795 ; mov bl, ah 1796 ; and bl, 0Fh 1797 ; mov ah, [ebx+hex_chars] 1798 ; shl eax, 16 1799 ; pop eax 1800 ; pop ebx 1801 ; jmp short bytetohex 1802 1803 ;dwordtohex: 1804 ; ; INPUT -> 1805 ; ; EAX = dword (binary number) 1806 ; ; OUTPUT -> 1807 ; ; EDX:EAX = hexadecimal string 1808 ; ; 1809 ; push eax 1810 ; shr eax, 16 1811 ; call wordtohex 1812 ; mov edx, eax 1813 ; pop eax 1814 ; call wordtohex 1815 ; retn 1816 1817 ; 19/06/2017 1818 ; 05/03/2017 (TRDOS 386) 1819 ; 13/11/2016 - Erdogan Tan 1820 write_audio_dev_info: 1821 ; BUS/DEV/FN 1822 ; 00000000BBBBBBBBDDDDDFFF00000000 1823 ; DEV/VENDOR 1824 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1825 1826 00000BA4 8B35[18100000] mov esi, [dev_vendor] 1827 00000BAA 6689F0 mov ax, si 1828 00000BAD 0FB6D8 movzx ebx, al 1829 00000BB0 88DA mov dl, bl 1830 00000BB2 80E30F and bl, 0Fh 1831 00000BB5 8A83[760E0000] mov al, [ebx+hex_chars] 1832 00000BBB A2[BB0E0000] mov [msgVendorId+3], al 1833 00000BC0 88D3 mov bl, dl 1834 00000BC2 C0EB04 shr bl, 4 1835 00000BC5 8A83[760E0000] mov al, [ebx+hex_chars] 1836 00000BCB A2[BA0E0000] mov [msgVendorId+2], al 1837 00000BD0 88E3 mov bl, ah 1838 00000BD2 88DA mov dl, bl 1839 00000BD4 80E30F and bl, 0Fh 1840 00000BD7 8A83[760E0000] mov al, [ebx+hex_chars] 1841 00000BDD A2[B90E0000] mov [msgVendorId+1], al 1842 00000BE2 88D3 mov bl, dl 1843 00000BE4 C0EB04 shr bl, 4 1844 00000BE7 8A83[760E0000] mov al, [ebx+hex_chars] 1845 00000BED A2[B80E0000] mov [msgVendorId], al 1846 00000BF2 C1EE10 shr esi, 16 1847 00000BF5 6689F0 mov ax, si 1848 00000BF8 88C3 mov bl, al 1849 00000BFA 88DA mov dl, bl 1850 00000BFC 80E30F and bl, 0Fh 1851 00000BFF 8A83[760E0000] mov al, [ebx+hex_chars] 1852 00000C05 A2[CC0E0000] mov [msgDevId+3], al 1853 00000C0A 88D3 mov bl, dl 1854 00000C0C C0EB04 shr bl, 4 1855 00000C0F 8A83[760E0000] mov al, [ebx+hex_chars] 1856 00000C15 A2[CB0E0000] mov [msgDevId+2], al 1857 00000C1A 88E3 mov bl, ah 1858 00000C1C 88DA mov dl, bl 1859 00000C1E 80E30F and bl, 0Fh 1860 00000C21 8A83[760E0000] mov al, [ebx+hex_chars] 1861 00000C27 A2[CA0E0000] mov [msgDevId+1], al 1862 00000C2C 88D3 mov bl, dl 1863 00000C2E C0EB04 shr bl, 4 1864 00000C31 8A83[760E0000] mov al, [ebx+hex_chars] 1865 00000C37 A2[C90E0000] mov [msgDevId], al 1866 1867 00000C3C 8B35[1C100000] mov esi, [bus_dev_fn] 1868 00000C42 C1EE08 shr esi, 8 1869 00000C45 6689F0 mov ax, si 1870 00000C48 88C3 mov bl, al 1871 00000C4A 88DA mov dl, bl 1872 00000C4C 80E307 and bl, 7 ; bit 0,1,2 1873 00000C4F 8A83[760E0000] mov al, [ebx+hex_chars] 1874 00000C55 A2[F00E0000] mov [msgFncNo+1], al 1875 00000C5A 88D3 mov bl, dl 1876 00000C5C C0EB03 shr bl, 3 1877 00000C5F 88DA mov dl, bl 1878 00000C61 80E30F and bl, 0Fh 1879 00000C64 8A83[760E0000] mov al, [ebx+hex_chars] 1880 00000C6A A2[E20E0000] mov [msgDevNo+1], al 1881 00000C6F 88D3 mov bl, dl 1882 00000C71 C0EB04 shr bl, 4 1883 00000C74 8A83[760E0000] mov al, [ebx+hex_chars] 1884 00000C7A A2[E10E0000] mov [msgDevNo], al 1885 00000C7F 88E3 mov bl, ah 1886 00000C81 88DA mov dl, bl 1887 00000C83 80E30F and bl, 0Fh 1888 00000C86 8A83[760E0000] mov al, [ebx+hex_chars] 1889 00000C8C A2[D60E0000] mov [msgBusNo+1], al 1890 00000C91 88D3 mov bl, dl 1891 00000C93 C0EB04 shr bl, 4 1892 00000C96 8A83[760E0000] mov al, [ebx+hex_chars] 1893 00000C9C A2[D50E0000] mov [msgBusNo], al 1894 1895 00000CA1 66A1[24100000] mov ax, [ac97_io_base] 1896 00000CA7 88C3 mov bl, al 1897 00000CA9 88DA mov dl, bl 1898 00000CAB 80E30F and bl, 0Fh 1899 00000CAE 8A83[760E0000] mov al, [ebx+hex_chars] 1900 00000CB4 A2[090F0000] mov [msgIOBaseAddr+3], al 1901 00000CB9 88D3 mov bl, dl 1902 00000CBB C0EB04 shr bl, 4 1903 00000CBE 8A83[760E0000] mov al, [ebx+hex_chars] 1904 00000CC4 A2[080F0000] mov [msgIOBaseAddr+2], al 1905 00000CC9 88E3 mov bl, ah 1906 00000CCB 88DA mov dl, bl 1907 00000CCD 80E30F and bl, 0Fh 1908 00000CD0 8A83[760E0000] mov al, [ebx+hex_chars] 1909 00000CD6 A2[070F0000] mov [msgIOBaseAddr+1], al 1910 00000CDB 88D3 mov bl, dl 1911 00000CDD C0EB04 shr bl, 4 1912 00000CE0 8A83[760E0000] mov al, [ebx+hex_chars] 1913 00000CE6 A2[060F0000] mov [msgIOBaseAddr], al 1914 1915 ; 24/11/2016 1916 00000CEB 30E4 xor ah, ah 1917 00000CED A0[26100000] mov al, [ac97_int_ln_reg] 1918 00000CF2 B10A mov cl, 10 1919 00000CF4 F6F1 div cl 1920 00000CF6 660105[110F0000] add [msgIRQ], ax 1921 00000CFD 20C0 and al, al 1922 00000CFF 750D jnz short _w_ac97imsg_ ; 19/06/2017 1923 00000D01 A0[120F0000] mov al, [msgIRQ+1] 1924 00000D06 B420 mov ah, ' ' 1925 00000D08 66A3[110F0000] mov [msgIRQ], ax 1926 _w_ac97imsg_: 1927 ; EBX = Message address 1928 ; ECX = Max. message length (or stop on ZERO character) 1929 ; (1 to 255) 1930 ; DL = Message color (07h = light gray, 0Fh = white) 1931 sys _msg, msgAC97Info, 255, 07h 1931 <1> 1931 <1> 1931 <1> 1931 <1> 1931 <1> %if %0 >= 2 1931 00000D0E BB[870E0000] <1> mov ebx, %2 1931 <1> %if %0 >= 3 1931 00000D13 B9FF000000 <1> mov ecx, %3 1931 <1> %if %0 = 4 1931 00000D18 BA07000000 <1> mov edx, %4 1931 <1> %endif 1931 <1> %endif 1931 <1> %endif 1931 00000D1D B823000000 <1> mov eax, %1 1931 <1> 1931 00000D22 CD40 <1> int 40h 1932 00000D24 C3 retn 1933 1934 ;============================================================================= 1935 ; preinitialized data 1936 ;============================================================================= 1937 1938 ;============================================================================= 1939 ; Protracker effects stuff 1940 ;============================================================================= 1941 1942 ;----------------------------------------------------------------------------- 1943 ; Effect jump tables 1944 ;----------------------------------------------------------------------------- 1945 1946 00000D25 90 align 4 1947 1948 efxtable: 1949 00000D28 [43070000] dd efxarpeggio ; 0 - arpeggio 1950 00000D2C [70040000] dd efxnull ; 1 - porta up 1951 00000D30 [70040000] dd efxnull ; 2 - porta down 1952 00000D34 [8E060000] dd efxtoneporta ; 3 - tone porta 1953 00000D38 [9D060000] dd efxvibrato ; 4 - vibrato 1954 00000D3C [70040000] dd efxnull ; 5 - tone+slide 1955 00000D40 [70040000] dd efxnull ; 6 - vibrato+slide 1956 00000D44 [BA070000] dd efxtremolo ; 7 - tremolo 1957 00000D48 [70040000] dd efxnull ; 8 - unused 1958 00000D4C [C5060000] dd efxsampoffset ; 9 - sample offset 1959 00000D50 [70040000] dd efxnull ; A - volume slide 1960 00000D54 [D1060000] dd efxpattjump ; B - pattern jump 1961 00000D58 [DF060000] dd efxsetvolume ; C - set volume 1962 00000D5C [ED060000] dd efxbreak ; D - break pattern 1963 00000D60 [70040000] dd efxnull ; E - extra effects 1964 00000D64 [0C070000] dd efxsetspeed ; F - set speed 1965 1966 efxtable2: 1967 00000D68 [71040000] dd efxarpeggio2 ; 0 - arpeggio 1968 00000D6C [93040000] dd efxportaup ; 1 - porta up 1969 00000D70 [B9040000] dd efxportadown ; 2 - porta down 1970 00000D74 [E0040000] dd efxtoneporta2 ; 3 - tone porta 1971 00000D78 [19050000] dd efxvibrato2 ; 4 - vibrato 1972 00000D7C [75050000] dd efxtoneslide ; 5 - tone+slide 1973 00000D80 [82050000] dd efxvibslide ; 6 - vibrato+slide 1974 00000D84 [A9050000] dd efxtremolo2 ; 7 - tremolo 1975 00000D88 [70040000] dd efxnull ; 8 - unused 1976 00000D8C [70040000] dd efxnull ; 9 - sample offset 1977 00000D90 [8C050000] dd efxvolslide ; A - volume slide 1978 00000D94 [70040000] dd efxnull ; B - pattern jump 1979 00000D98 [70040000] dd efxnull ; C - set volume 1980 00000D9C [70040000] dd efxnull ; D - break pattern 1981 00000DA0 [70040000] dd efxnull ; E - extra effects 1982 00000DA4 [70040000] dd efxnull ; F - set speed 1983 1984 ;----------------------------------------------------------------------------- 1985 ; Amiga period table 1986 ;----------------------------------------------------------------------------- 1987 1988 ;PeriodTable0: 1989 ; dw 0 1990 PeriodTable: 1991 00000DA8 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 1991 00000DB1 0A000A7009E8086808- 1991 00000DBA F00780071407 1992 00000DC0 B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 1992 00000DC9 050005B80474043404- 1992 00000DD2 F803C0038A03 1993 00000DD8 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 1993 00000DE1 0280025C023A021A02- 1993 00000DEA FC01E001C501 1994 00000DF0 AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 1994 00000DF9 0140012E011D010D01- 1994 00000E02 FE00F000E200 1995 00000E08 D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 1995 00000E11 00A00097008F008700- 1995 00000E1A 7F0078007100 1996 00000E20 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 1996 00000E29 0050004B0047004300- 1996 00000E32 3F003C003800 1997 00000E38 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 1997 00000E41 002800250023002100- 1997 00000E4A 1F001E001C00 1998 1999 ;----------------------------------------------------------------------------- 2000 ; Sinus wave table 2001 ;----------------------------------------------------------------------------- 2002 2003 SinTable: 2004 00000E50 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 2004 00000E59 C5D4E1 2005 00000E5C ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 2005 00000E65 E1 2006 00000E66 D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 2006 00000E6F 19 2007 2008 00000E70 0000 dw 0 2009 2010 ;============================================================================= 2011 ; AC'97 data 2012 ;============================================================================= 2013 2014 ;stmo: db 1 ; stereo (2) or mono (1) 2015 ;bps: db 8 ; bits per sample (8 or 16) 2016 00000E72 02 stmo: db 2 ; stereo (2) or mono (1) ; 14/10/2017 (stereo) 2017 00000E73 10 bps: db 16 ; bits per sample (8 or 16) ; 14/10/2017 (16 bits) 2018 Sample_Rate: 2019 ;MixSpeed: dw 22050 ; Hz 2020 ;;MixSpeed: dw 11025 ; Hz ; 13/10/2017 2021 00000E74 CE56 MixSpeed: dw 22222 ; Hz ; 01/08/2020 2022 2023 ; 13/11/2016 2024 00000E76 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 2024 00000E7F 3941424344454600 2025 msgAC97Info: 2026 00000E87 0D0A db 0Dh, 0Ah 2027 00000E89 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 2027 00000E92 6F20436F6E74726F6C- 2027 00000E9B 6C6572202620436F64- 2027 00000EA4 656320496E666F0D0A 2028 00000EAD 56656E646F72204944- db "Vendor ID: " 2028 00000EB6 3A20 2029 00000EB8 303030306820446576- msgVendorId: db "0000h Device ID: " 2029 00000EC1 6963652049443A20 2030 00000EC9 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 2031 00000ED0 4275733A20 db "Bus: " 2032 00000ED5 303068204465766963- msgBusNo: db "00h Device: " 2032 00000EDE 653A20 2033 00000EE1 3030682046756E6374- msgDevNo: db "00h Function: " 2033 00000EEA 696F6E3A20 2034 00000EEF 303068 msgFncNo: db "00h" 2035 00000EF2 0D0A db 0Dh, 0Ah 2036 00000EF4 492F4F204261736520- db "I/O Base Address: " 2036 00000EFD 416464726573733A20 2037 00000F06 303030306820495251- msgIOBaseAddr: db "0000h IRQ: " 2037 00000F0F 3A20 2038 00000F11 3030 msgIRQ: dw 3030h 2039 00000F13 0D0A00 db 0Dh, 0Ah, 0 2040 ;msgSampleRate: db "Sample Rate: " 2041 ;msgHertz: db "00000 Hz ", 0 2042 ;msg8Bits: db "8 bits ", 0 2043 ;msgMono: db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0 2044 ;msg16Bits: db "16 bits ", 0 2045 ;msgStereo: db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0 2046 2047 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 2048 ;codec_id: dd 0 2049 ;codec_chip_id: dd 0 2050 ;codec_vendor_ids: dw 0 2051 ;codec_chip_ids: dw 0 2052 2053 ;dword_str: dd 30303030h, 30303030h 2054 ; db 'h', 0Dh, 0Ah, 0 2055 2056 ;============================================================================= 2057 ; Copyright Strings & Messages 2058 ;============================================================================= 2059 2060 msg_usage: 2061 00000F16 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 2061 00000F1F 506C6179657220666F- 2061 00000F28 72205452444F532033- 2061 00000F31 383620627920457264- 2061 00000F3A 6F67616E2054616E2E- 2061 00000F43 20 2062 00000F44 417567757374203230- db 'August 2020.',10,13 2062 00000F4D 32302E0A0D 2063 00000F52 75736167653A207469- db 'usage: tinyplay filename.mod', 10, 13,0 2063 00000F5B 6E79706C6179206669- 2063 00000F64 6C656E616D652E6D6F- 2063 00000F6D 640A0D00 2064 00000F71 31352F31302F323031- db '15/10/2017',0 2064 00000F7A 3700 2065 00000F7C 32332F30382F323032- db '23/08/2020',0 2065 00000F85 3000 2066 2067 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 2068 2069 00000F87 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 2069 00000F90 506C61796572207630- 2069 00000F99 2E3162206279204361- 2069 00000FA2 726C6F732048617361- 2069 00000FAB 6E2E204A756C792031- 2069 00000FB4 3939332E 2070 00000FB8 0A0D00 db 10,13,0 2071 00000FBB 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 2071 00000FC4 64696E67204D6F6475- 2071 00000FCD 6C652066696C652E0A- 2071 00000FD6 0D00 2072 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 2073 ;MsgFound: db 'Sound Blaster found at Address 2' 2074 ;PortText: db 'x0h, IRQ ' 2075 ;IrqText: db 'x.',10,13,0 2076 2077 trdos386_err_msg: 2078 00000FD8 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 2078 00000FE1 2053797374656D2063- 2078 00000FEA 616C6C206572726F72- 2078 00000FF3 20210A0D00 2079 2080 PlayMsg: 2081 00000FF8 0D0A db 0Dh, 0Ah 2082 00000FFA 506C6179696E67206D- db "Playing music... " 2082 00001003 757369632E2E2E20 2083 0000100B 00 db 0 2084 OkMsg: 2085 0000100C 4F4B2E db "OK." 2086 NextLine: 2087 0000100F 0D0A00 db 0Dh, 0Ah, 0 2088 2089 ; 04/10/2017 2090 00001012 0A pattern_shift: db 10 2091 00001013 0400 numtracks: dw 4 2092 2093 ;============================================================================= 2094 ; uninitialized data 2095 ;============================================================================= 2096 2097 bss_start: 2098 2099 ; 30/07/2020 2100 2101 ABSOLUTE bss_start 2102 2103 00001015 alignb 4 2104 2105 00001018 dev_vendor: resd 1 2106 0000101C bus_dev_fn: resd 1 2107 00001020 stats_cmd: resd 1 2108 00001024 ac97_io_base: resw 1 2109 00001026 ac97_int_ln_reg: resb 1 2110 00001027 srb: resb 1 2111 2112 ; MODLOAD.ASM 2113 00001028 FileHandle: resd 1 2114 0000102C Header: resb ModHeader.size 2115 2116 ; MODPLAY.ASM 2117 ;MixSpeed: resw 1 2118 2119 ModInfo: 2120 00001468 ModInfo.OrderLen: resb 1 2121 00001469 ModInfo.ReStart: resb 1 2122 0000146A ModInfo.Order: resb 128 2123 000014EA ModInfo.Patterns: resd 1 2124 2125 000014EE ModInfo.SampOfs: resw 31 2126 0000152C ModInfo.SampSeg: resw 31 2127 0000156A ModInfo.SampLen: resw 31 2128 000015A8 ModInfo.SampRep: resw 31 2129 000015E6 ModInfo.SampRepLen: resw 31 2130 00001624 ModInfo.SampVol: resw 31 2131 2132 ; MODPLAY.ASM 2133 PitchTable: ;resw 857 2134 00001662 resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 2135 00003124 VolTable: resb 16640 2136 00007224 MixBuffer resb MixBufSize ; 8172 ; 22/08/2020 2137 2138 ; MODPLAY.ASM 2139 00009210 OrderPos: resb 1 2140 00009211 Tempo: resb 1 2141 00009212 TempoWait: resb 1 2142 00009213 Bpm: resb 1 2143 00009214 Row: resb 1 2144 00009215 BreakRow: resb 1 2145 00009216 BpmSamples: resw 1 2146 00009218 BufPtr: resd 1 2147 0000921C BufLen: resw 1 2148 0000921E BufRep: resd 1 2149 00009222 Note: resd 1 2150 ;Tracks: resb TrackInfo.size*NumTracks 2151 2152 ; 06/10/2017 2153 00009226 Tracks: resb TrackInfo.size*8 2154 2155 mod_file_name: 2156 00009356 resb 80 2157 2158 ; 30/07/2020 2159 000093A6 half_buff: resb 1 2160 2161 ; 09/10/2017 2162 000093A7 volume_level: resb 1 2163 2164 ; 22/08/2020 (playmod8.s, VT8233) 2165 ; 20/10/2017 (modplay7.s, SB16) 2166 ; 19/10/2017 (modplay6.s, AC97) 2167 000093A8 pan_shift: resb 1 2168 2169 ; 23/08/2020 2170 000093A9 counter: resb 1 2171 2172 ; 22/08/2020 2173 2174 000093AA alignb 4096 2175 2176 Audio_Buffer: 2177 0000A000 resb BUFFERSIZE ; DMA Buffer Size / 2 (32768) 2178 2179 ;alignb 65536 2180 2181 ; 30/07/2020 2182 2183 file_buffer: 2184 00012000 resb 65536*6 ; 06/10/2017 2185 EOF: