1 ; **************************************************************************** 2 ; tmodply3.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; TMODPLY3.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN 5 ; 6 ; 28/10/2017 7 ; 8 ; [ Last Modification: 24/08/2020 ] !!! STEREO MOD PLAYING !!! 9 ; 10 ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan 11 ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...)) 12 ; 13 ; note: 14 ; 15 ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM' 16 ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s') 17 ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 18 ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 19 ; dma buffer for immediate -synchronized- displaying of sound waves. 20 ; So, stereo wave display -two waves, two scopes- is normally applicable.) 21 ; 22 ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993) 23 ; PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM 24 ; 25 ; Stereophonic mod playing code prototype: 26 ; 'modplay6.s' (AC97) by Erdogan Tan (20/10/2017) 27 ; 28 ; Modified by using the source code of 'playmod6.s' ('PLAYMOD6.PRG') 29 ; by Erdogan Tan (15/10/2017) 30 ; 31 ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') 32 ; by Erdogan Tan (04/03/2017) 33 ; 34 ; Assembler: NASM 2.11 35 ; ---------------------------------------------------------------------------- 36 ; nasm tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG 37 ; **************************************************************************** 38 ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017) 39 ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017) 40 41 ; 01/03/2017 42 ; 16/10/2016 43 ; 29/04/2016 44 ; TRDOS 386 system calls (temporary list!) 45 _ver equ 0 46 _exit equ 1 47 _fork equ 2 48 _read equ 3 49 _write equ 4 50 _open equ 5 51 _close equ 6 52 _wait equ 7 53 _creat equ 8 54 _link equ 9 55 _unlink equ 10 56 _exec equ 11 57 _chdir equ 12 58 _time equ 13 59 _mkdir equ 14 60 _chmod equ 15 61 _chown equ 16 62 _break equ 17 63 _stat equ 18 64 _seek equ 19 65 _tell equ 20 66 _mount equ 21 67 _umount equ 22 68 _setuid equ 23 69 _getuid equ 24 70 _stime equ 25 71 _quit equ 26 72 _intr equ 27 73 _fstat equ 28 74 _emt equ 29 75 _mdate equ 30 76 _video equ 31 77 _audio equ 32 78 _timer equ 33 79 _sleep equ 34 80 _msg equ 35 81 _geterr equ 36 82 _fpsave equ 37 83 _pri equ 38 84 _rele equ 39 85 _fff equ 40 86 _fnf equ 41 87 _alloc equ 42 88 _dalloc equ 43 89 _calbac equ 44 90 91 %macro sys 1-4 92 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 93 ; 03/09/2015 94 ; 13/04/2015 95 ; Retro UNIX 386 v1 system call. 96 %if %0 >= 2 97 mov ebx, %2 98 %if %0 >= 3 99 mov ecx, %3 100 %if %0 = 4 101 mov edx, %4 102 %endif 103 %endif 104 %endif 105 mov eax, %1 106 ;int 30h 107 int 40h ; TRDOS 386 (TRDOS v2.0) 108 %endmacro 109 110 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 111 ; sys systemcall (eax) , , 112 113 ; 19/06/2017 114 BUFFERSIZE equ 32768 115 116 ; ---------------------------------------------------------------------------- 117 ; Tiny MOD Player v0.1b by Carlos Hasan. 118 ; July 14th, 1993. 119 120 ;============================================================================= 121 ; 122 ;============================================================================= 123 124 [BITS 32] 125 [org 0] 126 127 Start: 128 ; clear bss 129 00000000 B9[00000900] mov ecx, EOF 130 00000005 BF[94520000] mov edi, bss_start 131 0000000A 29F9 sub ecx, edi 132 0000000C D1E9 shr ecx, 1 133 0000000E 31C0 xor eax, eax 134 00000010 F366AB rep stosw 135 136 ; Detect (& Enable) VT8233 Audio Device 137 00000013 E81A020000 call DetectVT8233 138 00000018 731B jnc short GetFileName 139 140 _dev_not_ready: 141 ; couldn't find the audio device! 142 sys _msg, noDevMsg, 255, 0Fh 142 <1> 142 <1> 142 <1> 142 <1> 142 <1> %if %0 >= 2 142 0000001A BB[3F020000] <1> mov ebx, %2 142 <1> %if %0 >= 3 142 0000001F B9FF000000 <1> mov ecx, %3 142 <1> %if %0 = 4 142 00000024 BA0F000000 <1> mov edx, %4 142 <1> %endif 142 <1> %endif 142 <1> %endif 142 00000029 B823000000 <1> mov eax, %1 142 <1> 142 0000002E CD40 <1> int 40h 143 00000030 E9DC010000 jmp Exit 144 145 GetFileName: 146 00000035 89E6 mov esi, esp 147 00000037 AD lodsd 148 00000038 83F802 cmp eax, 2 ; two arguments 149 ; (program file name & mod file name) 150 0000003B 0F82D9010000 jb pmsg_usage ; nothing to do 151 152 00000041 AD lodsd ; program file name address 153 00000042 AD lodsd ; mod file name address (file to be read) 154 00000043 89C6 mov esi, eax 155 00000045 BF[D8C10000] mov edi, mod_file_name 156 ScanName: 157 0000004A AC lodsb 158 0000004B 84C0 test al, al 159 0000004D 0F84C7010000 je pmsg_usage 160 00000053 3C20 cmp al, 20h 161 00000055 74F3 je short ScanName ; scan start of name. 162 00000057 AA stosb 163 00000058 B4FF mov ah, 0FFh 164 a_0: 165 0000005A FEC4 inc ah 166 a_1: 167 0000005C AC lodsb 168 0000005D AA stosb 169 0000005E 3C2E cmp al, '.' 170 00000060 74F8 je short a_0 171 00000062 20C0 and al, al 172 00000064 75F6 jnz short a_1 173 174 00000066 08E4 or ah, ah ; if period NOT found, 175 00000068 750B jnz short PrintPMesg ; then add a .MOD extension. 176 SetExt: 177 0000006A 4F dec edi 178 0000006B C7072E4D4F44 mov dword [edi], '.MOD' 179 00000071 C6470400 mov byte [edi+4], 0 180 PrintPMesg: 181 ; Prints the Credits Text. 182 sys _msg, Credits, 255, 0Fh 182 <1> 182 <1> 182 <1> 182 <1> 182 <1> %if %0 >= 2 182 00000075 BB[7A510000] <1> mov ebx, %2 182 <1> %if %0 >= 3 182 0000007A B9FF000000 <1> mov ecx, %3 182 <1> %if %0 = 4 182 0000007F BA0F000000 <1> mov edx, %4 182 <1> %endif 182 <1> %endif 182 <1> %endif 182 00000084 B823000000 <1> mov eax, %1 182 <1> 182 00000089 CD40 <1> int 40h 183 _1: 184 ; 19/06/2017 185 ; Allocate Audio Buffer (for user) 186 sys _audio, 0200h, BUFFERSIZE, Audio_Buffer 186 <1> 186 <1> 186 <1> 186 <1> 186 <1> %if %0 >= 2 186 0000008B BB00020000 <1> mov ebx, %2 186 <1> %if %0 >= 3 186 00000090 B900800000 <1> mov ecx, %3 186 <1> %if %0 = 4 186 00000095 BA[00D00000] <1> mov edx, %4 186 <1> %endif 186 <1> %endif 186 <1> %endif 186 0000009A B820000000 <1> mov eax, %1 186 <1> 186 0000009F CD40 <1> int 40h 187 000000A1 0F8213010000 jc error_exit 188 _2: 189 ; 23/08/2020 190 ; Initialize Audio Device (bl = 1 -> Interrupt method) 191 sys _audio, 0301h, 0, ac97_int_handler 191 <1> 191 <1> 191 <1> 191 <1> 191 <1> %if %0 >= 2 191 000000A7 BB01030000 <1> mov ebx, %2 191 <1> %if %0 >= 3 191 000000AC B900000000 <1> mov ecx, %3 191 <1> %if %0 = 4 191 000000B1 BA[76020000] <1> mov edx, %4 191 <1> %endif 191 <1> %endif 191 <1> %endif 191 000000B6 B820000000 <1> mov eax, %1 191 <1> 191 000000BB CD40 <1> int 40h 192 000000BD 0F82F7000000 jc error_exit 193 194 ; 20/10/2017 195 ; Initialize Audio Device (bl = 0 -> SRB method) 196 ;sys _audio, 0300h, 1, srb 197 ;jc error_exit 198 199 LoadMod: 200 000000C3 BF[D8C10000] mov edi, mod_file_name 201 000000C8 E87D020000 call LoadModule ; Load the MODule... 202 ; 08/10/2017 203 000000CD 731B jnc short _3 ; any error loading? 204 205 ; yes, print error and Exit. 206 207 sys _msg, ErrorMesg, 255, 0Fh 207 <1> 207 <1> 207 <1> 207 <1> 207 <1> %if %0 >= 2 207 000000CF BB[AE510000] <1> mov ebx, %2 207 <1> %if %0 >= 3 207 000000D4 B9FF000000 <1> mov ecx, %3 207 <1> %if %0 = 4 207 000000D9 BA0F000000 <1> mov edx, %4 207 <1> %endif 207 <1> %endif 207 <1> %endif 207 000000DE B823000000 <1> mov eax, %1 207 <1> 207 000000E3 CD40 <1> int 40h 208 000000E5 E927010000 jmp Exit 209 _3: 210 ; 10/06/2017 211 sys _audio, 0E00h ; get audio controller info 211 <1> 211 <1> 211 <1> 211 <1> 211 <1> %if %0 >= 2 211 000000EA BB000E0000 <1> mov ebx, %2 211 <1> %if %0 >= 3 211 <1> mov ecx, %3 211 <1> %if %0 = 4 211 <1> mov edx, %4 211 <1> %endif 211 <1> %endif 211 <1> %endif 211 000000EF B820000000 <1> mov eax, %1 211 <1> 211 000000F4 CD40 <1> int 40h 212 000000F6 0F82BE000000 jc error_exit 213 214 ;cmp ah, 3 ; VT 8233? (VIA AC'97 Audio Controller) 215 ;jne _dev_not_ready 216 217 ; EAX = IRQ Number in AL 218 ; Audio Device Number in AH 219 ; EBX = DEV/VENDOR ID 220 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 221 ; ECX = BUS/DEV/FN 222 ; (00000000BBBBBBBBDDDDDFFF00000000) 223 ; EDX = Base IO Addr (DX) for SB16 & VT8233 224 ; EDX = NABMBAR/NAMBAR (for AC97) 225 ; (Low word, DX = NAMBAR address) 226 227 000000FC A2[B2520000] mov [ac97_int_ln_reg], al 228 00000101 891D[A4520000] mov [dev_vendor], ebx 229 00000107 890D[A8520000] mov [bus_dev_fn], ecx 230 0000010D 668915[B0520000] mov [ac97_io_base], dx 231 232 00000114 E8050B0000 call write_audio_dev_info 233 234 PlayNow: 235 00000119 E81F0A0000 call StartPlaying 236 237 ; 03/08/2020 238 ; load 32768 bytes into audio buffer 239 ;mov edi, Audio_Buffer 240 ; 19/10/2017 241 ;;mov ebx, BUFFERSIZE 242 ;mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 243 0000011E E8AE080000 call GetSamples 244 00000123 0F8291000000 jc error_exit 245 246 ; ;mov ecx, 128 ; Make a lookup table 247 ; mov cl, 128 248 ; xor ebx, ebx ; for fastest pixel 249 ; mov edx, 320*(100-64) ; addressing. 250 ;MakeOfs: 251 ; mov [RowOfs+ebx], dx 252 ; mov [RowOfs+ebx+2], dx 253 ; add dx, 320 254 ; add ebx, 4 255 ; loop MakeOfs 256 257 ; 03/08/2020 258 ; bh = 16 : update (current) dma half buffer 259 ; bl = 0 : then switch to the next half buffer 260 sys _audio, 1000h ; 29/07/2020 260 <1> 260 <1> 260 <1> 260 <1> 260 <1> %if %0 >= 2 260 00000129 BB00100000 <1> mov ebx, %2 260 <1> %if %0 >= 3 260 <1> mov ecx, %3 260 <1> %if %0 = 4 260 <1> mov edx, %4 260 <1> %endif 260 <1> %endif 260 <1> %endif 260 0000012E B820000000 <1> mov eax, %1 260 <1> 260 00000133 CD40 <1> int 40h 261 262 ; 03/08/2020 263 ; load 32768 bytes into audio buffer 264 ;mov edi, Audio_Buffer 265 ; 19/10/2017 266 ;mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 267 00000135 E897080000 call GetSamples 268 0000013A 727E jc error_exit 269 270 ; 27/10/2017 271 0000013C 66B90001 mov cx, 256 272 00000140 31DB xor ebx, ebx 273 00000142 BF[30C20000] mov edi, RowOfs 274 MakeOfs: 275 ; 29/10/2017 276 ;mov ax, 128 277 ;mul bx 278 ;mov al, ah 279 ;mov ah, 80 280 ;mul ah 281 00000147 89D8 mov eax, ebx 282 00000149 66C1E007 shl ax, 7 ; * 128 283 0000014D B050 mov al, 80 284 0000014F F6E4 mul ah 285 00000151 66AB stosw 286 00000153 43 inc ebx 287 00000154 E2F1 loop MakeOfs 288 289 ; 09/10/2017 (2*BUFFERSIZE, 64K) 290 ; 23/06/2017 291 ; Map DMA buffer to user's memory space 292 sys _audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer 292 <1> 292 <1> 292 <1> 292 <1> 292 <1> %if %0 >= 2 292 00000156 BB000D0000 <1> mov ebx, %2 292 <1> %if %0 >= 3 292 0000015B B900000100 <1> mov ecx, %3 292 <1> %if %0 = 4 292 00000160 BA[00000200] <1> mov edx, %4 292 <1> %endif 292 <1> %endif 292 <1> %endif 292 00000165 B820000000 <1> mov eax, %1 292 <1> 292 0000016A CD40 <1> int 40h 293 ;jc error_exit 294 295 ; 24/06/2017 296 ; Set Master Volume Level (BL=0 or 80h) 297 ; for next playing (BL>=80h) 298 ;sys _audio, 0B80h, 1D1Dh 299 300 ; 23/08/2020 301 ; Set Master Volume Level (BL=0 or 80h) 302 sys _audio, 0B00h, 1D1Dh 302 <1> 302 <1> 302 <1> 302 <1> 302 <1> %if %0 >= 2 302 0000016C BB000B0000 <1> mov ebx, %2 302 <1> %if %0 >= 3 302 00000171 B91D1D0000 <1> mov ecx, %3 302 <1> %if %0 = 4 302 <1> mov edx, %4 302 <1> %endif 302 <1> %endif 302 <1> %endif 302 00000176 B820000000 <1> mov eax, %1 302 <1> 302 0000017B CD40 <1> int 40h 303 304 ; 20/10/2017 305 ;mov byte [volume_level], 1Dh 306 0000017D 880D[31CC0000] mov [volume_level], cl ; 03/08/2020 307 308 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 309 310 ; Start to play 311 00000183 A0[F1510000] mov al, [bps] 312 00000188 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 313 0000018B D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 314 0000018D 8A1D[F0510000] mov bl, [stmo] 315 00000193 FECB dec bl 316 00000195 08C3 or bl, al 317 00000197 668B0D[F2510000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 318 0000019E B704 mov bh, 4 ; start to play 319 sys _audio 319 <1> 319 <1> 319 <1> 319 <1> 319 <1> %if %0 >= 2 319 <1> mov ebx, %2 319 <1> %if %0 >= 3 319 <1> mov ecx, %3 319 <1> %if %0 = 4 319 <1> mov edx, %4 319 <1> %endif 319 <1> %endif 319 <1> %endif 319 000001A0 B820000000 <1> mov eax, %1 319 <1> 319 000001A5 CD40 <1> int 40h 320 321 ;; SETUP SIGNAL RESPONSE BYTE 322 ;; 06/03/2017 323 ;mov bl, [ac97_int_ln_reg] ; IRQ number 324 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 325 ;mov edx, srb ; Signal Response/Return Byte address 326 ;mov ecx, 0FFh ; Signal Response/Return Byte value 327 ;sys _calbac 328 ;jc short error_exit 329 330 ; DIRECT VGA MEMORY ACCESS 331 ; bl = 0, bh = 5 332 ; Direct access/map to VGA memory (0A0000h) 333 334 sys _video, 0500h 334 <1> 334 <1> 334 <1> 334 <1> 334 <1> %if %0 >= 2 334 000001A7 BB00050000 <1> mov ebx, %2 334 <1> %if %0 >= 3 334 <1> mov ecx, %3 334 <1> %if %0 = 4 334 <1> mov edx, %4 334 <1> %endif 334 <1> %endif 334 <1> %endif 334 000001AC B81F000000 <1> mov eax, %1 334 <1> 334 000001B1 CD40 <1> int 40h 335 000001B3 3D00000A00 cmp eax, 0A0000h 336 000001B8 7418 je short _a3 337 error_exit: 338 sys _msg, trdos386_err_msg, 255, 0Eh 338 <1> 338 <1> 338 <1> 338 <1> 338 <1> %if %0 >= 2 338 000001BA BB[CB510000] <1> mov ebx, %2 338 <1> %if %0 >= 3 338 000001BF B9FF000000 <1> mov ecx, %3 338 <1> %if %0 = 4 338 000001C4 BA0E000000 <1> mov edx, %4 338 <1> %endif 338 <1> %endif 338 <1> %endif 338 000001C9 B823000000 <1> mov eax, %1 338 <1> 338 000001CE CD40 <1> int 40h 339 000001D0 EB3F jmp short Exit 340 341 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 342 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 343 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 344 ; second, or the module will sound "looped". 345 ; Because we need better sync with the ModPlayer to draw the scope, 346 ; the polling is called from my routine, and then the irq 0 must be 347 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 348 ; samples played by the Sound Blaster. Note that some samples are 349 ; discarded in the next code, just for fun! 350 351 _a3: 352 ;mov ax, 0013h ; Set Mode 320x200x256 353 ;int 31h 354 355 ; 21/10/2017 356 ;mov ax, 0012h ; Set Mode 640x480x16 357 ;int 31h 358 359 ; 22/10/2017 360 000001D2 E8C80B0000 call setgraphmode ; Set video mode to 640*480x16 361 362 ; 22/10/2017 363 ;call loadlbm 364 ;jc short loadlbm_err 365 366 000001D7 BE[CC0F0000] mov esi, LOGO_ADDRESS 367 000001DC E8B00C0000 call putlbm 368 ;jnc short loadlbm_ok 369 000001E1 731F jnc short _a4 ; 370 371 ;mov byte [error_color], 0Eh ; Yellow 372 373 loadlbm_err: 374 ; 21/10/2017 375 ;mov ax, 0003h ; Set Text Mode 80x25x16 376 ;int 31h 377 ; 22/10/2017 378 000001E3 E8D40B0000 call settextmode 379 380 sys _msg, LOGO_ERROR_MSG, 255, [error_color] 380 <1> 380 <1> 380 <1> 380 <1> 380 <1> %if %0 >= 2 380 000001E8 BB[9F0F0000] <1> mov ebx, %2 380 <1> %if %0 >= 3 380 000001ED B9FF000000 <1> mov ecx, %3 380 <1> %if %0 = 4 380 000001F2 8B15[01020000] <1> mov edx, %4 380 <1> %endif 380 <1> %endif 380 <1> %endif 380 000001F8 B823000000 <1> mov eax, %1 380 <1> 380 000001FD CD40 <1> int 40h 381 000001FF EB10 jmp short Exit 382 383 ; 21/10/2017 384 error_color: 385 00000201 0C db 0Ch ; Light Red 386 387 loadlbm_ok: 388 ; 21/10/2017 389 _a4: 390 ; 24/06/2017 391 00000202 E889000000 call PlayMod ; 13/02/2017 (ModPlay) 392 393 _s_exit: 394 00000207 E8E1090000 call StopPlaying ; STOP! 395 396 ; 22/10/2017 397 ;mov ax, 0003h ; Set Text Mode 80x25x16 398 ;int 31h 399 0000020C E8AB0B0000 call settextmode 400 Exit: 401 ;call FreeModule ; Free MODule core. 402 403 sys _exit ; Bye ! 403 <1> 403 <1> 403 <1> 403 <1> 403 <1> %if %0 >= 2 403 <1> mov ebx, %2 403 <1> %if %0 >= 3 403 <1> mov ecx, %3 403 <1> %if %0 = 4 403 <1> mov edx, %4 403 <1> %endif 403 <1> %endif 403 <1> %endif 403 00000211 B801000000 <1> mov eax, %1 403 <1> 403 00000216 CD40 <1> int 40h 404 here: 405 00000218 EBFE jmp short here 406 407 pmsg_usage: 408 sys _msg, msg_usage, 255, 0Fh 408 <1> 408 <1> 408 <1> 408 <1> 408 <1> %if %0 >= 2 408 0000021A BB[05510000] <1> mov ebx, %2 408 <1> %if %0 >= 3 408 0000021F B9FF000000 <1> mov ecx, %3 408 <1> %if %0 = 4 408 00000224 BA0F000000 <1> mov edx, %4 408 <1> %endif 408 <1> %endif 408 <1> %endif 408 00000229 B823000000 <1> mov eax, %1 408 <1> 408 0000022E CD40 <1> int 40h 409 00000230 EBDF jmp short Exit 410 411 DetectVT8233: 412 ; Detect (BH=1) VT8233 (BL=3) Audio Controller 413 sys _audio, 0103h 413 <1> 413 <1> 413 <1> 413 <1> 413 <1> %if %0 >= 2 413 00000232 BB03010000 <1> mov ebx, %2 413 <1> %if %0 >= 3 413 <1> mov ecx, %3 413 <1> %if %0 = 4 413 <1> mov edx, %4 413 <1> %endif 413 <1> %endif 413 <1> %endif 413 00000237 B820000000 <1> mov eax, %1 413 <1> 413 0000023C CD40 <1> int 40h 414 0000023E C3 retn 415 416 noDevMsg: 417 0000023F 4572726F723A20556E- db "Error: Unable to find VIA VT8233 based audio device!",13,10,0 417 00000248 61626C6520746F2066- 417 00000251 696E64205649412056- 417 0000025A 543832333320626173- 417 00000263 656420617564696F20- 417 0000026C 646576696365210D0A- 417 00000275 00 418 419 ac97_int_handler: 420 ; 23/08/2020 421 ; 28/10/2017 422 ; 14/10/2017 423 ; 09/10/2017 424 ; 19/06/2017 425 00000276 C605[B3520000]01 mov byte [srb], 1 ; interrupt (or signal response byte) 426 427 ;;mov ebx, BUFFERSIZE 428 ;mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 429 0000027D E84F070000 call GetSamples 430 ;jc error_exit 431 432 sys _rele ; return from callback service 432 <1> 432 <1> 432 <1> 432 <1> 432 <1> %if %0 >= 2 432 <1> mov ebx, %2 432 <1> %if %0 >= 3 432 <1> mov ecx, %3 432 <1> %if %0 = 4 432 <1> mov edx, %4 432 <1> %endif 432 <1> %endif 432 <1> %endif 432 00000282 B827000000 <1> mov eax, %1 432 <1> 432 00000287 CD40 <1> int 40h 433 ; we must not come here ! 434 sys _exit 434 <1> 434 <1> 434 <1> 434 <1> 434 <1> %if %0 >= 2 434 <1> mov ebx, %2 434 <1> %if %0 >= 3 434 <1> mov ecx, %3 434 <1> %if %0 = 4 434 <1> mov edx, %4 434 <1> %endif 434 <1> %endif 434 <1> %endif 434 00000289 B801000000 <1> mov eax, %1 434 <1> 434 0000028E CD40 <1> int 40h 435 436 ;============================================================================= 437 ; 438 ;============================================================================= 439 440 PlayMod: 441 ; 24/08/2020 442 ; 03/08/2020 443 ; 27/10/2017 444 ; 19/10/2017 445 ; 23/06/2017 446 ; 21/06/2017 447 ; 19/06/2017 448 449 ; 05/03/2017 (TRDOS 386) 450 ; 14/02/2017 451 ; 13/02/2017 452 ; 08/12/2016 453 ; 28/11/2016 454 455 ; 03/08/2020 456 ;jmp short modp_gs ; 23/06/2017 457 458 ; 24/08/2020 459 00000290 FE05[28C20000] inc byte [counter] 460 p_loop: 461 00000296 803D[B3520000]00 cmp byte [srb], 0 462 0000029D 7609 jna short q_loop 463 464 0000029F C605[B3520000]00 mov byte [srb], 0 465 modp_gs: 466 ; 23/08/2020 467 ; 03/08/2020 468 ;mov edi, Audio_Buffer 469 ; 19/10/2017 470 ;;;mov ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017 471 ;;mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 472 ;call GetSamples 473 ;jc error_exit 474 475 ; 23/08/2020 476 000002A6 EB6B jmp r_loop 477 q_loop: 478 ; 24/08/2020 479 000002A8 F605[28C20000]3F test byte [counter], 63 480 000002AF 7562 jnz short r_loop 481 k_loop: 482 000002B1 B401 mov ah, 1 ; any key pressed? 483 000002B3 CD32 int 32h ; no, Loop. 484 000002B5 745C jz short r_loop 485 486 000002B7 B400 mov ah, 0 ; flush key buffer... 487 000002B9 CD32 int 32h 488 489 ; 19/10/2017 (modplay6.s) 490 000002BB 3C20 cmp al, 20h 491 000002BD 740E je short change_pan 492 ; 09/10/2017 (playmod5.s) 493 000002BF 3C2B cmp al, '+' ; increase sound volume 494 000002C1 741D je short inc_volume_level 495 000002C3 3C2D cmp al, '-' 496 000002C5 743C je short dec_volume_level 497 498 ; 19/10/2017 (modplay6.s) 499 000002C7 24DF and al, 0DFh 500 000002C9 3C50 cmp al, 'P' 501 000002CB 7545 jne short q_return 502 503 change_pan: 504 ; 19/10/2017 (modplay6.s) 505 000002CD 8A0D[30CC0000] mov cl, [pan_shift] 506 000002D3 FEC1 inc cl 507 000002D5 80E103 and cl, 3 508 000002D8 880D[30CC0000] mov [pan_shift], cl 509 000002DE EB33 jmp short r_loop 510 511 ; 09/10/2017 (playmod5.s) 512 ; 24/06/2017 (wavplay2.s) 513 inc_volume_level: 514 000002E0 8A0D[31CC0000] mov cl, [volume_level] 515 000002E6 80F91F cmp cl, 1Fh ; 31 516 000002E9 7328 jnb short r_loop 517 000002EB FEC1 inc cl 518 change_volume_level: 519 000002ED 880D[31CC0000] mov [volume_level], cl 520 000002F3 88CD mov ch, cl 521 ; Set Master Volume Level 522 sys _audio, 0B00h 522 <1> 522 <1> 522 <1> 522 <1> 522 <1> %if %0 >= 2 522 000002F5 BB000B0000 <1> mov ebx, %2 522 <1> %if %0 >= 3 522 <1> mov ecx, %3 522 <1> %if %0 = 4 522 <1> mov edx, %4 522 <1> %endif 522 <1> %endif 522 <1> %endif 522 000002FA B820000000 <1> mov eax, %1 522 <1> 522 000002FF CD40 <1> int 40h 523 00000301 EB10 jmp short r_loop 524 dec_volume_level: 525 00000303 8A0D[31CC0000] mov cl, [volume_level] 526 00000309 80F901 cmp cl, 1 ; 1 527 0000030C 7605 jna short r_loop 528 0000030E FEC9 dec cl 529 00000310 EBDB jmp short change_volume_level 530 q_return: 531 00000312 C3 retn 532 r_loop: 533 ; 24/08/2020 534 00000313 FE05[28C20000] inc byte [counter] 535 00000319 758D jnz short q_loop 536 537 ; 27/10/2017 538 ; Get Current DMA buffer Pointer 539 ; 23/06/2017 ('modplay6.s') 540 ; bh = 15, get current pointer (DMA buffer offset) 541 ; bl = 0, for PCM OUT 542 ; ecx = 0 543 ; 544 sys _audio, 0F00h, 0 544 <1> 544 <1> 544 <1> 544 <1> 544 <1> %if %0 >= 2 544 0000031B BB000F0000 <1> mov ebx, %2 544 <1> %if %0 >= 3 544 00000320 B900000000 <1> mov ecx, %3 544 <1> %if %0 = 4 544 <1> mov edx, %4 544 <1> %endif 544 <1> %endif 544 <1> %endif 544 00000325 B820000000 <1> mov eax, %1 544 <1> 544 0000032A CD40 <1> int 40h 545 546 ; 28/10/2017 547 0000032C 24FC and al, 0FCh ; dword alignment (stereo, 16 bit) 548 ; 23/06/2017 549 0000032E BE[00000200] mov esi, DMA_Buffer 550 00000333 01C6 add esi, eax ; add offset value 551 ; 24/06/2017 552 00000335 B9[00FC0200] mov ecx, DMA_Buffer + (65536 - (256*4)) 553 0000033A 39CE cmp esi, ecx 554 0000033C 7602 jna short _4 555 0000033E 89CE mov esi, ecx 556 _4: 557 ; 23/10/2017 ('tmodplay.s') 558 00000340 E87E0A0000 call drawscopes 559 560 00000345 E94CFFFFFF jmp p_loop 561 562 ;============================================================================= 563 ; MODLOAD.ASM 564 ;============================================================================= 565 566 ; Amiga Module Loader v0.1b by Carlos Hasan. 567 ; July 10th, 1993. 568 569 ; STRUCTURES 570 571 struc ModSample 572 00000000 .msName: resb 22 573 00000016 .msLength: resw 1 574 00000018 .msFinetune: resb 1 575 00000019 .msVolume: resb 1 576 0000001A .msRepeat: resw 1 577 0000001C .msRepLen: resw 1 578 .size: ; 30 bytes 579 endstruc 580 581 struc ModHeader 582 00000000 .mhName: resb 20 583 00000014 .mhSamples: resb ModSample.size*31 584 000003B6 .mhOrderLen: resb 1 585 000003B7 .mhReStart: resb 1 586 000003B8 .mhOrder: resb 128 587 00000438 .mhSign: resw 2 588 .size: ; 1084 bytes 589 endstruc 590 591 struc ModInfoRec 592 00000000 .OrderLen: resb 1 593 00000001 .ReStart: resb 1 594 00000002 .Order: resb 128 595 00000082 .Patterns: resd 1 596 00000086 .SampOfs: resw 31 597 000000C4 .SampSeg: resw 31 598 00000102 .SampLen: resw 31 599 00000140 .SampRep: resw 31 600 0000017E .SampRepLen: resw 31 601 000001BC .SampVol: resw 31 602 .size: ; 506 bytes 603 endstruc 604 605 ; CODE 606 607 ; modplay5.s 608 ; 07/10/2017 609 ; tinyply3.s 610 ; 06/10/2017 611 ; 04/10/2017 612 ; /* MOD FileFormat */ 613 614 ID_MK equ 2E4B2E4Dh ; "M.K." 615 ID_FLT4 equ 34544C46h ; "FLT4" 616 ID_8CHN equ 4E484338h ; "8CHN" 617 ID_FLT8 equ 34544C46h ; "FLT8" 618 619 ; CODE 620 621 LoadModule: 622 ; edi = file name address 623 624 0000034A 60 pushad 625 626 0000034B E878010000 call ClearModInfo 627 OpenFile: 628 ; ebx = ASCIIZ file name address 629 ; ecx = open mode (0 = open for read) 630 sys _open, edi, 0 ; open for reading 630 <1> 630 <1> 630 <1> 630 <1> 630 <1> %if %0 >= 2 630 00000350 89FB <1> mov ebx, %2 630 <1> %if %0 >= 3 630 00000352 B900000000 <1> mov ecx, %3 630 <1> %if %0 = 4 630 <1> mov edx, %4 630 <1> %endif 630 <1> %endif 630 <1> %endif 630 00000357 B805000000 <1> mov eax, %1 630 <1> 630 0000035C CD40 <1> int 40h 631 0000035E 0F8262010000 jc Failed 632 00000364 A3[B4520000] mov [FileHandle], eax 633 ReadHeader: 634 ; ebx = File handle 635 ; ecx = Buffer address 636 ; edx = Byte count 637 sys _read, [FileHandle], Header, ModHeader.size 637 <1> 637 <1> 637 <1> 637 <1> 637 <1> %if %0 >= 2 637 00000369 8B1D[B4520000] <1> mov ebx, %2 637 <1> %if %0 >= 3 637 0000036F B9[B8520000] <1> mov ecx, %3 637 <1> %if %0 = 4 637 00000374 BA3C040000 <1> mov edx, %4 637 <1> %endif 637 <1> %endif 637 <1> %endif 637 00000379 B803000000 <1> mov eax, %1 637 <1> 637 0000037E CD40 <1> int 40h 638 00000380 0F8231010000 jc CloseFile 639 CheckMK: 640 ; 04/10/2017 641 00000386 A1[F0560000] mov eax, [Header+ModHeader.mhSign] 642 643 0000038B 3D4D2E4B2E cmp eax, ID_MK ; cmp eax, '.K.M' 644 ;je short Is4chnMod 645 00000390 742B je short IsModFile 646 CheckFLT4: 647 00000392 3D464C5434 cmp eax, ID_FLT4 ; cmp eax, '4TLF' 648 ;je short Is4chnMod 649 00000397 7424 je short IsModFile 650 Check8CHN: 651 00000399 3D3843484E cmp eax, ID_8CHN ; cmp eax, 'NHC8' 652 0000039E 740D je short Is8chnMod 653 CheckFLT8: 654 000003A0 3D464C5434 cmp eax, ID_FLT8 ; cmp eax, '8TLF' 655 ; 06/10/2017 656 000003A5 7406 je short Is8chnMod 657 000003A7 F9 stc 658 000003A8 E90A010000 jmp CloseFile 659 Is8chnMod: 660 000003AD C605[EC510000]08 mov byte [numtracks], 8 ; 8-CHANNEL-MOD 661 000003B4 C605[EB510000]0B mov byte [pattern_shift], 11 ; Pattern Size = 2048 bytes 662 000003BB EB00 jmp short IsModFile 663 ;Is4chnMod: 664 ; mov byte [numtracks], 4 ; 4-CHANNEL-MOD 665 ; mov byte [pattern_shift], 11 ; Pattern Size = 1024 bytes 666 667 IsModFile: 668 000003BD A0[6E560000] mov al, [Header+ModHeader.mhOrderLen] 669 000003C2 A2[F4560000] mov [ModInfo.OrderLen], al 670 671 000003C7 A0[6F560000] mov al, [Header+ModHeader.mhReStart] 672 000003CC 3A05[6E560000] cmp al, [Header+ModHeader.mhOrderLen] 673 000003D2 7202 jb short SetReStart 674 000003D4 B07F mov al, 7Fh 675 SetReStart: 676 000003D6 A2[F5560000] mov [ModInfo.ReStart], al 677 678 ;mov ecx, 128 679 000003DB 66B98000 mov cx, 128 680 000003DF 31D2 xor edx, edx 681 000003E1 31DB xor ebx, ebx 682 CopyOrder: 683 000003E3 8AB3[70560000] mov dh, [Header+ModHeader.mhOrder+ebx] 684 000003E9 88B3[F6560000] mov [ModInfo.Order+ebx], dh 685 000003EF 38D6 cmp dh, dl 686 000003F1 7202 jb short NextOrder 687 000003F3 88F2 mov dl, dh ; Max. pattern number ; 04/10/2017 688 NextOrder: 689 000003F5 43 inc ebx 690 000003F6 E2EB loop CopyOrder 691 AllocPatterns: 692 000003F8 81E2FF000000 and edx, 0FFh 693 ; 04/10/2017 694 ;inx dx ; 12/03/2017 695 000003FE FEC2 inc dl 696 ; dl = number of patterns (04/07/2017) 697 00000400 8A0D[EB510000] mov cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels 698 00000406 D3E2 shl edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4) 699 ; *2048 ; (byte count of patterns *64*8*4) 700 ; 701 00000408 89D5 mov ebp, edx ; offset of samples (04/07/2017) 702 ;mov ecx, 10000h ; next 64K (4096*16) 703 0000040A B9[00000300] mov ecx, file_buffer ; 12/03/2017 704 ; 705 0000040F 890D[76570000] mov [ModInfo.Patterns], ecx 706 ; 707 00000415 01CD add ebp, ecx ; next offset for samples 708 ReadPatterns: 709 ;mov ebx, [FileHandle] 710 ; ebx = File handle 711 ; ecx = Buffer address 712 ; edx = Byte count 713 sys _read, [FileHandle] 713 <1> 713 <1> 713 <1> 713 <1> 713 <1> %if %0 >= 2 713 00000417 8B1D[B4520000] <1> mov ebx, %2 713 <1> %if %0 >= 3 713 <1> mov ecx, %3 713 <1> %if %0 = 4 713 <1> mov edx, %4 713 <1> %endif 713 <1> %endif 713 <1> %endif 713 0000041D B803000000 <1> mov eax, %1 713 <1> 713 00000422 CD40 <1> int 40h 714 00000424 0F828D000000 jc CloseFile 715 716 ; patterns have been loaded here... (04/07/2017) 717 718 0000042A BE[CC520000] mov esi, Header+ModHeader.mhSamples 719 0000042F 31FF xor edi, edi 720 CopySamples: 721 00000431 668B4616 mov ax, [esi+ModSample.msLength] 722 00000435 86C4 xchg al, ah 723 00000437 66D1E0 shl ax, 1 724 0000043A 668987[F6570000] mov [ModInfo.SampLen+edi], ax 725 00000441 8A4619 mov al, [esi+ModSample.msVolume] 726 00000444 30E4 xor ah, ah 727 00000446 668987[B0580000] mov [ModInfo.SampVol+edi], ax 728 0000044D 668B461A mov ax, [esi+ModSample.msRepeat] 729 00000451 86C4 xchg al, ah 730 00000453 66D1E0 shl ax, 1 731 00000456 668987[34580000] mov [ModInfo.SampRep+edi], ax 732 0000045D 668B461C mov ax, [esi+ModSample.msRepLen] 733 00000461 86C4 xchg al, ah 734 00000463 66D1E0 shl ax, 1 735 00000466 668987[72580000] mov [ModInfo.SampRepLen+edi], ax 736 0000046D 83C61E add esi, ModSample.size 737 00000470 6683C702 add di, 2 738 00000474 6683FF3E cmp di, 2*31 739 00000478 72B7 jb short CopySamples 740 741 0000047A 31F6 xor esi, esi 742 AllocSamples: 743 0000047C 0FB796[F6570000] movzx edx, word [ModInfo.SampLen+esi] 744 ; 07/10/2017 745 ;shr dx, 4 ; *** 746 00000483 21D2 and edx, edx 747 00000485 7426 jz short NextSample 748 ;inc dx ; number of paragraphs ; *** 749 ;shl dx, 4 ; *** 750 00000487 89E8 mov eax, ebp 751 00000489 668986[7A570000] mov [ModInfo.SampOfs+esi], ax 752 00000490 C1E810 shr eax, 16 753 00000493 668986[B8570000] mov [ModInfo.SampSeg+esi], ax 754 0000049A 89E9 mov ecx, ebp 755 0000049C 01D5 add ebp, edx ; next offset for sample 756 ReadSample: 757 ;mov ebx, [FileHandle] 758 ;movzx edx, [ModInfo.SampLen+esi] 759 ;mov ecx, [ModInfo.SampOfs+esi] 760 761 ; ebx = File handle 762 ; ecx = Buffer address 763 ; edx = Byte count 764 sys _read, [FileHandle] 764 <1> 764 <1> 764 <1> 764 <1> 764 <1> %if %0 >= 2 764 0000049E 8B1D[B4520000] <1> mov ebx, %2 764 <1> %if %0 >= 3 764 <1> mov ecx, %3 764 <1> %if %0 = 4 764 <1> mov edx, %4 764 <1> %endif 764 <1> %endif 764 <1> %endif 764 000004A4 B803000000 <1> mov eax, %1 764 <1> 764 000004A9 CD40 <1> int 40h 765 000004AB 720A jc short CloseFile 766 767 NextSample: 768 000004AD 6683C602 add si, 2 769 000004B1 6683FE3E cmp si, 2*31 770 000004B5 72C5 jb short AllocSamples 771 CloseFile: 772 000004B7 9C pushf 773 sys _close, [FileHandle] 773 <1> 773 <1> 773 <1> 773 <1> 773 <1> %if %0 >= 2 773 000004B8 8B1D[B4520000] <1> mov ebx, %2 773 <1> %if %0 >= 3 773 <1> mov ecx, %3 773 <1> %if %0 = 4 773 <1> mov edx, %4 773 <1> %endif 773 <1> %endif 773 <1> %endif 773 000004BE B806000000 <1> mov eax, %1 773 <1> 773 000004C3 CD40 <1> int 40h 774 000004C5 9D popf 775 Failed: 776 000004C6 61 popad 777 000004C7 C3 retn 778 779 FreeModule: 780 ; Erdogan Tan (13/02/2017) 781 ; nothing to do here for memory de-allocation 782 ClearModInfo: 783 000004C8 57 push edi 784 000004C9 BF[F4560000] mov edi, ModInfo 785 000004CE B9FA010000 mov ecx, ModInfoRec.size 786 ;cld 787 000004D3 30C0 xor al, al 788 000004D5 F3AA rep stosb 789 000004D7 5F pop edi 790 000004D8 C3 retn 791 792 ;============================================================================= 793 ; MODPLAY.ASM 794 ;============================================================================= 795 796 ; Amiga Module Loader v0.3b by Carlos Hasan. 797 ; July 23th, 1993. 798 799 ; EQUATES 800 801 ;NumTracks equ 4 ; 07/10/2017 ([numtracks]) 802 DefTempo equ 6 803 DefBpm equ 125 804 MidCRate equ 8448 805 ;MixBufSize equ 4096 806 ;;MixBufSize equ 7680 ; 17/10/2017 ; ((48000/50)*8) 807 808 ; STRUCTURES 809 810 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 811 00000000 .Samples: resd 1 812 ;.Position: resw 1 813 00000004 .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 814 00000008 .Len: resw 1 815 0000000A .Repeat: resw 1 816 0000000C .RepLen: resw 1 817 0000000E .Volume: resb 1 ; Volume 818 0000000F .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 819 ;.Error: resb 1 820 ;.Reserved: resb 1 ; 01/10/2017 821 00000010 .Period: resw 1 ; Period 822 00000012 .Pitch: resw 1 823 00000014 .Effect: resw 1 ; Effect 824 00000016 .PortTo: resw 1 ; Toneporta wanted period 825 00000018 .PortParm: resb 1 ; Toneporta speed 826 00000019 .VibPos: resb 1 ; Vibrato wave position 827 0000001A .VibParm: resb 1 ; Vibrato depth/rate 828 0000001B .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 829 0000001C .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 830 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 831 0000001D .Error: resb 1 ; 01/10/2017 832 0000001E .Arp: resw 3 833 00000024 .ArpIndex: resw 1 834 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 835 endstruc 836 837 ; CODE 838 839 ;-------------------------------------------------------------------------- 840 ; updatechannel - update the track using the current effect 841 ;-------------------------------------------------------------------------- 842 ; 843 ;-------------------------------------------------------------------------- 844 ; Track: Process the next in one track. 845 ; In: 846 ; ds:di - Track info Address. 847 ;-------------------------------------------------------------------------- 848 849 ; edi = Track info address 850 851 updatechannel: 852 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 853 854 000004D9 668B5714 mov dx, [edi+TrackInfo.Effect] 855 856 ;test dx, dx 857 ;je short None 858 ;cmp dh, 00h 859 ;je short Arpeggio 860 ;cmp dh, 01h 861 ;je short PortUp 862 ;cmp dh, 02h 863 ;je short PortDown 864 ;cmp dh, 03h 865 ;je TonePort 866 ;cmp dh, 04h 867 ;je Vibrato 868 ;cmp dh, 05h 869 ;je PortSlide 870 ;cmp dh, 06h 871 ;je VibSlide 872 ;cmp dh, 0Ah 873 ;je VolSlide 874 ;retn 875 876 000004DD 0FB6C6 movzx eax, dh 877 000004E0 240F and al, 0Fh 878 000004E2 FF2485[FC4F0000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 879 efxnull: 880 None: 881 000004E9 C3 retn 882 efxarpeggio2: 883 ; 01/10/2017 884 000004EA 84D2 test dl, dl 885 000004EC 74FB jz short efxnull 886 Arpeggio: 887 000004EE 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 888 000004F2 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 889 000004F7 66894712 mov [edi+TrackInfo.Pitch], ax 890 000004FB 6683C302 add bx, 2 891 000004FF 6683FB06 cmp bx, 6 892 00000503 7202 jb short SetArpIndex 893 00000505 31DB xor ebx, ebx 894 SetArpIndex: 895 00000507 66895F24 mov [edi+TrackInfo.ArpIndex], bx 896 0000050B C3 retn 897 efxportaup: 898 PortUp: 899 0000050C 30F6 xor dh, dh 900 ;mov bx, [edi+TrackInfo.Period] 901 0000050E 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 902 00000512 6629D3 sub bx, dx 903 ;cmp bx, 113 904 00000515 6683FB1C cmp bx, 28 ; 01/10/2017 905 00000519 7D04 jge short NotSmall 906 ;mov bx, 113 907 0000051B 66BB1C00 mov bx, 28 ; 01/10/2017 908 NotSmall: 909 0000051F 66895F10 mov [edi+TrackInfo.Period], bx 910 00000523 6601DB add bx, bx 911 ;mov ax, [PitchTable+bx] 912 00000526 668B83[EE580000] mov ax, [PitchTable+ebx] ; 02/10/2017 913 0000052D 66894712 mov [edi+TrackInfo.Pitch], ax 914 00000531 C3 retn 915 efxportadown: 916 PortDown: 917 00000532 30F6 xor dh, dh 918 ;mov bx, [edi+TrackInfo.Period] 919 00000534 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 920 00000538 6601D3 add bx, dx 921 0000053B 6681FB600D cmp bx, 3424 ; 01/10/2017 922 ;cmp bx, 856 923 00000540 7E04 jle short NotBig 924 ;mov bx, 856 925 00000542 66BB600D mov bx, 3424 ; 01/10/2017 926 NotBig: 927 00000546 66895F10 mov [edi+TrackInfo.Period], bx 928 0000054A 6601DB add bx, bx 929 ;mov ax, [PitchTable+bx] 930 0000054D 668B83[EE580000] mov ax, [PitchTable+ebx] ; 02/10/2017 931 00000554 66894712 mov [edi+TrackInfo.Pitch], ax 932 00000558 C3 retn 933 efxtoneporta2: 934 TonePort: 935 00000559 30F6 xor dh, dh 936 0000055B 668B4716 mov ax, [edi+TrackInfo.PortTo] 937 ;mov bx, [edi+TrackInfo.Period] 938 0000055F 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 939 00000563 6639C3 cmp bx, ax 940 00000566 7429 je short NoPort 941 00000568 7F0D jg short PortToUp 942 PortToDown: 943 0000056A 6601D3 add bx, dx 944 0000056D 6639C3 cmp bx, ax 945 00000570 7E0D jle short SetPort 946 FixPort: 947 00000572 6689C3 mov bx, ax 948 00000575 EB08 jmp short SetPort 949 PortToUp: 950 00000577 6629D3 sub bx, dx 951 0000057A 6639C3 cmp bx, ax 952 0000057D 7CF3 jl short FixPort 953 SetPort: 954 0000057F 66895F10 mov [edi+TrackInfo.Period], bx 955 00000583 6601DB add bx, bx 956 ;mov ax, [PitchTable+bx] 957 00000586 668B83[EE580000] mov ax, [PitchTable+ebx] ; 02/10/2017 958 0000058D 66894712 mov [edi+TrackInfo.Pitch], ax 959 NoPort: 960 00000591 C3 retn 961 efxvibrato2: 962 ; 01/10/2017 963 Vibrato: 964 00000592 88D6 mov dh, dl 965 ;and dl, 0Fh 966 ;shr dh, 4 967 ;shl dh, 2 968 00000594 6681E20FF0 and dx, 0F00Fh 969 00000599 C0EE02 shr dh, 2 970 ;add [edi+TrackInfo.VibPos], dh 971 ;mov dh, [edi+TrackInfo.VibPos] 972 ;mov bl, dh 973 0000059C 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 974 0000059F 007719 add [edi+TrackInfo.VibPos], dh 975 000005A2 88DE mov dh, bl ; 01/10/2017 976 000005A4 C0EB02 shr bl, 2 977 ;and bx, 1Fh 978 ;mov al, [SinTable+bx] 979 000005A7 83E31F and ebx, 1Fh 980 000005AA 8A83[E4500000] mov al, [SinTable+ebx] 981 000005B0 F6E2 mul dl 982 ;rol ax, 1 983 ;xchg al, ah 984 ;and ah, 1 985 000005B2 66C1E807 shr ax, 7 986 000005B6 84F6 test dh, dh 987 000005B8 7903 jns short VibUp 988 000005BA 66F7D8 neg ax 989 VibUp: 990 000005BD 66034710 add ax, [edi+TrackInfo.Period] 991 000005C1 6689C3 mov bx, ax 992 ;movzx ebx, ax 993 000005C4 6683FB71 cmp bx, 113 994 ;cmp bx, 113 995 000005C8 6683FB1C cmp bx, 28 ; 01/10/2017 996 000005CC 7D06 jge short NoLoVib 997 ;mov bx, 113 998 000005CE 66BB1C00 mov bx, 28 ; 01/10/2017 999 000005D2 EB0B jmp short NoHiVib ; 01/10/2017 1000 NoLoVib: 1001 000005D4 6681FB600D cmp bx, 3424 ; 01/10/2017 1002 ;cmp bx, 856 1003 000005D9 7E04 jle short NoHiVib 1004 ;mov bx, 856 1005 000005DB 66BB600D mov bx, 3424 ; 01/10/2017 1006 NoHiVib: 1007 000005DF 6601DB add bx, bx 1008 ;mov ax, [PitchTable+bx] 1009 000005E2 668B83[EE580000] mov ax, [PitchTable+ebx] ; 01/10/2017 1010 000005E9 66894712 mov [edi+TrackInfo.Pitch], ax 1011 000005ED C3 retn 1012 efxtoneslide: 1013 PortSlide: 1014 000005EE E812000000 call VolSlide 1015 000005F3 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1016 000005F6 E95EFFFFFF jmp TonePort ; efxtoneporta2 1017 efxvibslide: 1018 VibSlide: 1019 000005FB E805000000 call VolSlide 1020 00000600 8A571A mov dl, [edi+TrackInfo.VibParm] 1021 00000603 EB8D jmp short Vibrato ; efxvibrato2 1022 efxvolslide: 1023 VolSlide: 1024 00000605 88D6 mov dh, dl 1025 00000607 80E20F and dl, 0Fh 1026 0000060A C0EE04 shr dh, 4 1027 0000060D 8A470E mov al, [edi+TrackInfo.Volume] 1028 00000610 28D0 sub al, dl 1029 00000612 7D02 jge short NoLoVol 1030 00000614 30C0 xor al, al 1031 NoLoVol: 1032 00000616 00F0 add al, dh 1033 00000618 3C40 cmp al, 64 1034 0000061A 7602 jbe short NoHiVol 1035 0000061C B040 mov al, 64 1036 NoHiVol: 1037 0000061E 88470E mov [edi+TrackInfo.Volume], al 1038 00000621 C3 retn 1039 1040 efxtremolo2: 1041 ; 01/10/2017 (TMODPLAY.ASM) 1042 Tremolo: 1043 00000622 88D6 mov dh, dl 1044 00000624 6681E20FF0 and dx, 0F00Fh 1045 00000629 C0EE02 shr dh, 2 1046 0000062C 8A5F1B mov bl, [edi+TrackInfo.TremPos] 1047 0000062F 00771B add [edi+TrackInfo.TremPos], dh 1048 00000632 88DE mov dh, bl 1049 00000634 C0EB02 shr bl, 2 1050 ; 01/10/2017 - TRDOS 386 1051 ;and bx, 1Fh 1052 00000637 83E31F and ebx, 1Fh 1053 ;mov al, [SinTable+bx] 1054 0000063A 8A83[E4500000] mov al, [SinTable+ebx] 1055 00000640 F6E2 mul dl 1056 00000642 66C1E806 shr ax, 6 1057 00000646 84F6 test dh, dh 1058 00000648 7D03 jge short Tremolo_1 ; efxtremolof2 1059 0000064A 66F7D8 neg ax 1060 efxtremolof2: 1061 Tremolo_1: 1062 0000064D 8A670E mov ah, [edi+TrackInfo.Volume] 1063 00000650 00E0 add al, ah 1064 00000652 7D02 jge short Tremolo_2 ; efxtremolof3 1065 00000654 30C0 xor al, al 1066 efxtremolof3: 1067 Tremolo_2: 1068 00000656 3C40 cmp al, 64 ; 40h 1069 00000658 7E02 jle short Tremolo_3 ; efxtremolof4 1070 0000065A B040 mov al, 64 ; 40h 1071 efxtremolof4: 1072 Tremolo_3: 1073 0000065C 28E0 sub al, ah ; ****** 1074 0000065E 88470F mov [edi+TrackInfo.VolDiff], al 1075 00000661 C3 retn 1076 1077 ;-------------------------------------------------------------------------- 1078 ; readchannel - read the next note event from the pattern sheet 1079 ;-------------------------------------------------------------------------- 1080 ; 1081 ;-------------------------------------------------------------------------- 1082 ; GetTrack: Get the next Note from a pattern. 1083 ; In: 1084 ; ds:di - Track info Address. 1085 ; es:si - Pattern Note Address. 1086 ; Out: 1087 ; es:si - The Next Pattern Note address. 1088 ;-------------------------------------------------------------------------- 1089 1090 ; esi = Pattern note address 1091 ; edi = Track info address 1092 1093 readchannel: 1094 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1095 00000662 66AD lodsw 1096 00000664 86C4 xchg al, ah 1097 00000666 88E3 mov bl, ah 1098 00000668 80E40F and ah, 0Fh 1099 0000066B 6689C1 mov cx, ax 1100 0000066E 66AD lodsw 1101 00000670 86C4 xchg al, ah 1102 00000672 88E7 mov bh, ah 1103 00000674 80E40F and ah, 0Fh 1104 00000677 6689C2 mov dx, ax 1105 0000067A 66895714 mov [edi+TrackInfo.Effect], dx 1106 ; 01/10/2017 - TRDOS 386 1107 ;and bl, 0F0h 1108 0000067E 81E3F0FF0000 and ebx, 0FFF0h 1109 00000684 C0EF04 shr bh, 4 1110 00000687 08FB or bl, bh 1111 00000689 7446 jz short SetPeriod 1112 SetSample: 1113 0000068B 30FF xor bh, bh 1114 ;and ebx, 0FFh 1115 0000068D FECB dec bl 1116 0000068F 01DB add ebx, ebx 1117 00000691 668B83[B0580000] mov ax, [ModInfo.SampVol+ebx] 1118 00000698 88470E mov [edi+TrackInfo.Volume], al 1119 0000069B 668B83[7A570000] mov ax, [ModInfo.SampOfs+ebx] 1120 000006A2 668907 mov [edi+TrackInfo.Samples], ax 1121 000006A5 668B83[B8570000] mov ax, [ModInfo.SampSeg+ebx] 1122 000006AC 66894702 mov [edi+TrackInfo.Samples+2], ax 1123 000006B0 668B83[F6570000] mov ax, [ModInfo.SampLen+ebx] 1124 000006B7 66894708 mov [edi+TrackInfo.Len], ax 1125 000006BB 668B83[34580000] mov ax, [ModInfo.SampRep+ebx] 1126 000006C2 6689470A mov [edi+TrackInfo.Repeat], ax 1127 000006C6 668B83[72580000] mov ax, [ModInfo.SampRepLen+ebx] 1128 000006CD 6689470C mov [edi+TrackInfo.RepLen], ax 1129 SetPeriod: 1130 000006D1 6685C9 test cx, cx 1131 000006D4 7425 jz short SetEffect 1132 1133 000006D6 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1134 1135 000006DA 80FE03 cmp dh, 03h 1136 ;je short SetEffect 1137 000006DD 7428 je short efxtoneporta ; 01/10/2017 1138 1139 000006DF 66894F10 mov [edi+TrackInfo.Period], cx 1140 ;movzx ebx, cx 1141 000006E3 6689CB mov bx, cx 1142 000006E6 6601DB add bx, bx 1143 ;mov ax, [PitchTable+bx] 1144 000006E9 668B83[EE580000] mov ax, [PitchTable+ebx] ; 01/10/2017 1145 000006F0 66894712 mov [edi+TrackInfo.Pitch], ax 1146 000006F4 C7470400000000 mov dword [edi+TrackInfo.Position], 0 1147 SetEffect: 1148 ;test dx, dx 1149 ;je short InitNone 1150 ;cmp dh, 00h 1151 ;je InitArpeggio 1152 ;cmp dh, 03h 1153 ;je short InitTonePort 1154 ;cmp dh, 04h 1155 ;je short InitVibrato 1156 ;cmp dh, 09h 1157 ;je short SampleOfs 1158 ;cmp dh, 0Bh 1159 ;je short PosJump 1160 ;cmp dh, 0Ch 1161 ;je short SetVolume 1162 ;cmp dh, 0Dh 1163 ;je short Break 1164 ;cmp dh, 0Fh 1165 ;je SetSpeed 1166 ;retn 1167 1168 ; 01/10/2017 (TMODPLAY.ASM) 1169 1170 ; dx = [di+TrackInfo.Effect] 1171 1172 000006FB 0FB6C6 movzx eax, dh 1173 000006FE 240F and al, 0Fh 1174 00000700 FF2485[BC4F0000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1175 ;efxnull: 1176 ;InitNone: 1177 ; retn 1178 efxtoneporta: 1179 ; 01/10/2017 1180 ; cx = period 1181 ;mov [edi+TrackInfo.PortTo], cx ; * 1182 InitTonePort: 1183 00000707 84D2 test dl, dl 1184 00000709 7503 jnz short SetPortParm 1185 0000070B 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1186 SetPortParm: 1187 0000070E 885718 mov [edi+TrackInfo.PortParm], dl 1188 00000711 66895714 mov [edi+TrackInfo.Effect], dx 1189 00000715 C3 retn 1190 efxvibrato: 1191 InitVibrato: 1192 00000716 8A471A mov al, [edi+TrackInfo.VibParm] 1193 00000719 88C4 mov ah, al 1194 ;and al, 0Fh 1195 ;and ah, 0F0h 1196 0000071B 66250FF0 and ax, 0F00Fh 1197 0000071F F6C20F test dl, 0Fh 1198 00000722 7502 jne short OkDepth 1199 00000724 08C2 or dl, al 1200 OkDepth: 1201 00000726 F6C2F0 test dl, 0F0h 1202 00000729 7502 jnz short OkRate 1203 0000072B 08E2 or dl, ah 1204 OkRate: 1205 0000072D 88571A mov [edi+TrackInfo.VibParm], dl 1206 00000730 66895714 mov [edi+TrackInfo.Effect], dx 1207 00000734 6685C9 test cx, cx 1208 00000737 7404 jz short OkPos 1209 00000739 C6471900 mov byte [edi+TrackInfo.VibPos], 0 1210 OkPos: 1211 0000073D C3 retn 1212 efxsampoffset: 1213 ; 01/10/2017 ; ******* 1214 SampleOfs: 1215 ; test dl, dl 1216 ; jnz short SetSampleOfs 1217 ; mov dl, [edi+TrackInfo.OldSampOfs] 1218 ;SetSampleOfs: 1219 ; mov [edi+TrackInfo.OldSampOfs], dl 1220 0000073E 88D6 mov dh, dl 1221 00000740 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1222 00000746 895704 mov [edi+TrackInfo.Position], edx 1223 00000749 C3 retn 1224 efxpattjump: 1225 PosJump: 1226 0000074A 8815[92C00000] mov [OrderPos], dl 1227 00000750 C605[96C00000]40 mov byte [Row], 64 1228 00000757 C3 retn 1229 efxsetvolume: 1230 SetVolume: 1231 00000758 80FA40 cmp dl, 64 1232 0000075B 7602 jbe short OkVol 1233 0000075D B240 mov dl, 64 1234 OkVol: 1235 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1236 0000075F 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1237 ;mov [edi+TrackInfo.Volume], dl 1238 00000761 6689570E mov [edi+TrackInfo.Volume], dx 1239 00000765 C3 retn 1240 efxbreak: 1241 Break: 1242 00000766 88D6 mov dh, dl 1243 00000768 80E20F and dl, 0Fh 1244 0000076B C0EE04 shr dh, 4 1245 0000076E 00F6 add dh, dh 1246 00000770 00F2 add dl, dh 1247 00000772 C0E602 shl dh, 2 1248 00000775 00F2 add dl, dh 1249 00000777 8815[97C00000] mov [BreakRow], dl 1250 0000077D C605[96C00000]40 mov byte [Row], 64 1251 00000784 C3 retn 1252 efxsetspeed: 1253 SetSpeed: 1254 00000785 84D2 test dl,dl 1255 00000787 7432 je Skip 1256 00000789 80FA1F cmp dl,31 1257 0000078C 770D ja short SetBpm 1258 SetTempo: 1259 0000078E 8815[93C00000] mov [Tempo], dl 1260 00000794 8815[94C00000] mov [TempoWait], dl 1261 0000079A C3 retn 1262 SetBpm: 1263 0000079B 8815[95C00000] mov [Bpm], dl 1264 000007A1 B067 mov al, 103 1265 000007A3 F6E2 mul dl 1266 000007A5 88E3 mov bl, ah 1267 000007A7 30FF xor bh, bh 1268 000007A9 66A1[F2510000] mov ax, [MixSpeed] 1269 000007AF 6631D2 xor dx, dx 1270 000007B2 66F7F3 div bx 1271 000007B5 66A3[98C00000] mov [BpmSamples], ax 1272 Skip: 1273 000007BB C3 retn 1274 efxarpeggio: 1275 ; 01/10/2017 1276 000007BC 84D2 test dl, dl 1277 ;je efxnull 1278 000007BE 74FB je short Skip 1279 InitArpeggio: 1280 000007C0 88D6 mov dh, dl 1281 000007C2 80E20F and dl, 0Fh 1282 000007C5 C0EE04 shr dh, 4 1283 ; 01/10/2017 1284 ;mov cx, 36 1285 000007C8 66B95400 mov cx, 84 ; 84 notes/periods 1286 000007CC 31DB xor ebx, ebx 1287 000007CE 668B4710 mov ax, [edi+TrackInfo.Period] 1288 gt_ScanPeriod: 1289 ;cmp ax, [PeriodTable+bx] 1290 000007D2 663B83[3C500000] cmp ax, [PeriodTable+ebx] 1291 000007D9 7306 jae short SetArp 1292 000007DB 6683C302 add bx, 2 1293 000007DF E2F1 loop gt_ScanPeriod 1294 SetArp: 1295 000007E1 6601D2 add dx, dx 1296 000007E4 00DE add dh, bl 1297 000007E6 00DA add dl, bl 1298 ; 01/10/2017 1299 ;mov bx, [PeriodTable+bx] 1300 000007E8 668B9B[3C500000] mov bx, [PeriodTable+ebx] 1301 ;add bx, bx 1302 000007EF 01DB add ebx, ebx 1303 ;mov ax, [PitchTable+bx] 1304 000007F1 668B83[EE580000] mov ax, [PitchTable+ebx] 1305 000007F8 6689471E mov [edi+TrackInfo.Arp], ax 1306 000007FC 88F3 mov bl, dh 1307 000007FE 30FF xor bh, bh 1308 00000800 668B9B[3C500000] mov bx, [PeriodTable+ebx] 1309 ;add bx, bx 1310 00000807 01DB add ebx, ebx 1311 ;mov ax, [PitchTable+bx] 1312 00000809 668B83[EE580000] mov ax, [PitchTable+ebx] 1313 00000810 66894720 mov [edi+TrackInfo.Arp+2], ax 1314 00000814 88D3 mov bl, dl 1315 00000816 30FF xor bh, bh 1316 00000818 668B9B[3C500000] mov bx, [PeriodTable+ebx] 1317 ;add bx, bx 1318 0000081F 01DB add ebx, ebx 1319 ;mov ax, [PitchTable+bx] 1320 00000821 668B83[EE580000] mov ax, [PitchTable+ebx] 1321 00000828 66894722 mov [edi+TrackInfo.Arp+4], ax 1322 0000082C 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1323 00000832 C3 retn 1324 1325 efxtremolo: 1326 ; 01/10/2017 (TMODPLAY.ASM) 1327 InitTremolo: 1328 00000833 8A471C mov al, [edi+TrackInfo.TremParm] 1329 00000836 88C4 mov ah, al 1330 00000838 66250FF0 and ax, 0F00Fh 1331 0000083C F6C20F test dl, 0Fh 1332 0000083F 7502 jnz short InitTremolo_1 ; efxtremolof0 1333 00000841 08C2 or dl, al 1334 efxtremolof0: 1335 InitTremolo_1: 1336 00000843 F6C2F0 test dl, 0F0h 1337 00000846 7502 jnz short InitTremolo_2 ; efxtremolof1 1338 00000848 08E2 or dl, ah 1339 efxtremolof1: 1340 InitTremolo_2: 1341 0000084A 88571C mov [edi+TrackInfo.TremParm], dl 1342 0000084D 66895714 mov [edi+TrackInfo.Effect], dx 1343 00000851 C3 retn 1344 1345 ;-------------------------------------------------------------------------- 1346 ; pollmodule - polls the module player 1347 ;-------------------------------------------------------------------------- 1348 ;-------------------------------------------------------------------------- 1349 ; UpdateTracks: Main code to process the next tick to be played. 1350 ;-------------------------------------------------------------------------- 1351 1352 pollmodule: 1353 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1354 00000852 FE0D[94C00000] dec byte [TempoWait] 1355 00000858 7417 jz short GetTracks 1356 1357 ;mov ecx, NumTracks 1358 0000085A 0FB70D[EC510000] movzx ecx, word [numtracks] ; 06/10/2017 1359 00000861 BF[A8C00000] mov edi, Tracks 1360 BeatTracks: 1361 00000866 E86EFCFFFF call BeatTrack 1362 0000086B 83C726 add edi, TrackInfo.size 1363 0000086E E2F6 loop BeatTracks 1364 00000870 C3 retn 1365 GetTracks: 1366 00000871 A0[93C00000] mov al, [Tempo] 1367 00000876 A2[94C00000] mov [TempoWait], al 1368 1369 0000087B 8B35[A4C00000] mov esi, [Note] 1370 00000881 803D[96C00000]40 cmp byte [Row], 64 1371 00000888 7268 jb short NoPattWrap 1372 1373 0000088A 8B35[76570000] mov esi, [ModInfo.Patterns] 1374 00000890 8A1D[92C00000] mov bl, [OrderPos] 1375 00000896 3A1D[F4560000] cmp bl, [ModInfo.OrderLen] 1376 0000089C 7214 jb short NoOrderWrap 1377 0000089E 8A1D[F5560000] mov bl, [ModInfo.ReStart] 1378 000008A4 881D[92C00000] mov [OrderPos], bl 1379 000008AA 3A1D[F4560000] cmp bl, [ModInfo.OrderLen] 1380 000008B0 7364 jae short NoUpdate 1381 NoOrderWrap: 1382 ;xor bh, bh 1383 000008B2 81E3FF000000 and ebx, 0FFh 1384 000008B8 8A9B[F6560000] mov bl, [ModInfo.Order+ebx] 1385 ; 05/10/2017 1386 ;shl ebx, 10 ; *1024 1387 000008BE 8A0D[EB510000] mov cl, [pattern_shift] ; 10 or 11 1388 000008C4 D3E3 shl ebx, cl ; *1024 or *2048 1389 ; 1390 000008C6 01DE add esi, ebx 1391 000008C8 8A1D[97C00000] mov bl, [BreakRow] 1392 000008CE 881D[96C00000] mov [Row], bl 1393 ;xor bh, bh 1394 000008D4 81E3FF000000 and ebx, 0FFh 1395 000008DA 883D[97C00000] mov [BreakRow], bh ; 0 1396 000008E0 66C1E304 shl bx, 4 1397 000008E4 01DE add esi, ebx 1398 000008E6 8935[A4C00000] mov [Note], esi 1399 000008EC FE05[92C00000] inc byte [OrderPos] 1400 NoPattWrap: 1401 000008F2 FE05[96C00000] inc byte [Row] 1402 1403 ;cld 1404 ;mov ecx, NumTracks 1405 000008F8 0FB70D[EC510000] movzx ecx, word [numtracks] ; 06/10/2017 1406 000008FF BF[A8C00000] mov edi, Tracks 1407 GetTracks_next: 1408 00000904 51 push ecx 1409 00000905 E858FDFFFF call GetTrack ; readchannel 1410 0000090A 59 pop ecx 1411 0000090B 83C726 add edi, TrackInfo.size 1412 0000090E E2F4 loop GetTracks_next 1413 1414 00000910 8935[A4C00000] mov [Note], esi 1415 NoUpdate: 1416 00000916 C3 retn 1417 1418 ;-------------------------------------------------------------------------- 1419 ; MixTrack: Mixes one track into a CLEAN buffer. 1420 ; In: 1421 ; ds:si - Track Info Address. 1422 ; ds:di - Buffer Address. 1423 ; cx - Buffer Size. 1424 ;-------------------------------------------------------------------------- 1425 1426 ; esi = Track info address 1427 ; edi = Buffer address 1428 ; ecx = Buffer size 1429 1430 MixTrack: 1431 00000917 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1432 0000091C 7757 ja short MixLooped 1433 MixNonLooped: 1434 0000091E 8B16 mov edx, [esi+TrackInfo.Samples] 1435 00000920 8B5E04 mov ebx, [esi+TrackInfo.Position] 1436 00000923 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1437 00000927 52 push edx 1438 00000928 56 push esi 1439 00000929 01D3 add ebx, edx 1440 0000092B 01D5 add ebp, edx 1441 0000092D 668B5612 mov dx, [esi+TrackInfo.Pitch] 1442 ; 01/10/2017 1443 ;mov al, [esi+TrackInfo.Volume] 1444 00000931 668B460E mov ax, [esi+TrackInfo.Volume] 1445 ; ah = [esi+TrackInfo.VolDiff] 1446 00000935 00E0 add al, ah ; ****** 1447 00000937 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1448 0000093B 8A661D mov ah, [esi+TrackInfo.Error] 1449 0000093E 89DE mov esi, ebx 1450 00000940 31DB xor ebx, ebx ; 01/10/2017 ; * 1451 00000942 88C7 mov bh, al 1452 00000944 88D0 mov al, dl 1453 00000946 88F2 mov dl, dh 1454 ;xor dh, dh 1455 00000948 81E2FF000000 and edx, 0FFh 1456 nlMixSamp: 1457 0000094E 39EE cmp esi, ebp 1458 00000950 7316 jae short nlMixBye 1459 00000952 8A1E mov bl, [esi] 1460 ;mov bl, [VolTable+bx] 1461 00000954 8A9B[A65F0000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1462 ; 17/10/2017 1463 0000095A 001F add [edi], bl 1464 ; 18/10/2017 1465 0000095C 00C4 add ah, al 1466 0000095E 11D6 adc esi, edx 1467 00000960 033D[EC510000] add edi, [numtracks] 1468 00000966 E2E6 loop nlMixSamp 1469 nlMixBye: 1470 00000968 89F3 mov ebx, esi 1471 0000096A 5E pop esi 1472 0000096B 5A pop edx 1473 0000096C 29D3 sub ebx, edx 1474 0000096E 895E04 mov [esi+TrackInfo.Position], ebx 1475 00000971 88661D mov [esi+TrackInfo.Error], ah 1476 00000974 C3 retn 1477 MixLooped: 1478 00000975 8B16 mov edx, [esi+TrackInfo.Samples] 1479 00000977 8B5E04 mov ebx, [esi+TrackInfo.Position] 1480 0000097A 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1481 0000097E 892D[A0C00000] mov [BufRep], ebp 1482 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1483 00000984 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1484 00000988 52 push edx 1485 00000989 56 push esi 1486 0000098A 01D3 add ebx, edx 1487 0000098C 01D5 add ebp, edx 1488 0000098E 668B5612 mov dx, [esi+TrackInfo.Pitch] 1489 ; 01/10/2017 1490 ;mov al, [esi+TrackInfo.Volume] 1491 00000992 668B460E mov ax, [esi+TrackInfo.Volume] 1492 ; ah = [esi+TrackInfo.VolDiff] 1493 00000996 00E0 add al, ah ; ****** 1494 00000998 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1495 0000099C 8A661D mov ah, [esi+TrackInfo.Error] 1496 ;mov si, bx 1497 0000099F 89DE mov esi, ebx ; 04/09/2017 1498 000009A1 31DB xor ebx, ebx ; 01/10/2017 ; * 1499 000009A3 88C7 mov bh, al 1500 000009A5 88D0 mov al, dl 1501 000009A7 88F2 mov dl, dh 1502 ;xor dh, dh 1503 000009A9 81E2FF000000 and edx, 0FFh 1504 lpMixSamp: 1505 000009AF 39EE cmp esi, ebp 1506 000009B1 7206 jb short lpMixNow 1507 000009B3 2B35[A0C00000] sub esi, [BufRep] 1508 lpMixNow: 1509 000009B9 8A1E mov bl, [esi] 1510 ;mov bl, [VolTable+bx] 1511 000009BB 8A9B[A65F0000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1512 ; 17/10/2017 1513 000009C1 001F add [edi], bl 1514 ; 18/10/2017 1515 000009C3 00C4 add ah, al 1516 000009C5 11D6 adc esi, edx 1517 000009C7 033D[EC510000] add edi, [numtracks] 1518 000009CD E2E0 loop lpMixSamp 1519 lpMixBye: 1520 ; mov ebx, esi 1521 ; pop esi 1522 ; pop edx 1523 ; sub ebx, edx 1524 ; mov [esi+TrackInfo.Position], ebx 1525 ; mov [esi+TrackInfo.Error], ah 1526 ; retn 1527 000009CF EB97 jmp short nlMixBye 1528 1529 ;-------------------------------------------------------------------------- 1530 ; mixpoll - updates the output buffer 1531 ;-------------------------------------------------------------------------- 1532 ; 1533 ;-------------------------------------------------------------------------- 1534 ; GetSamples: Returns the next chunk of samples to be played. 1535 ; In: 1536 ; Buffer - Buffer Address. 1537 ; Count - Buffer Size. 1538 ;-------------------------------------------------------------------------- 1539 1540 mixpoll: 1541 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1542 1543 ; 03/08/2020 1544 000009D1 BF[00D00000] mov edi, Audio_Buffer 1545 000009D6 BB00200000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 1546 1547 ; edi = buffer address 1548 ; ebx = count 1549 1550 000009DB 60 pushad 1551 1552 ;cld 1553 1554 ; 03/08/2020 1555 ; clear audio buffer 1556 000009DC 89FE mov esi, edi 1557 000009DE B900080000 mov ecx, BUFFERSIZE/16 1558 000009E3 B880808080 mov eax, 80808080h 1559 000009E8 F3AB rep stosd 1560 000009EA 89F7 mov edi, esi 1561 1562 NextChunk: 1563 000009EC 66833D[9EC00000]00 cmp word [BufLen], 0 1564 000009F4 756B jne short CopyChunk 1565 1566 000009F6 53 push ebx 1567 000009F7 57 push edi 1568 MixChunk: 1569 000009F8 BF[A6A00000] mov edi, MixBuffer 1570 1571 ; 17/10/2017 1572 000009FD 0FB70D[98C00000] movzx ecx, word [BpmSamples] 1573 ;mov cx, [BpmSamples] 1574 00000A04 893D[9AC00000] mov [BufPtr], edi 1575 00000A0A 66890D[9EC00000] mov [BufLen], cx 1576 1577 00000A11 803D[EC510000]04 cmp byte [numtracks], 4 1578 00000A18 7603 jna short ch_silence 1579 00000A1A 66D1E1 shl cx, 1 1580 ch_silence: 1581 00000A1D B880808080 mov eax, 80808080h 1582 00000A22 F3AB rep stosd 1583 1584 ;mov cx, NumTracks 1585 ;mov cl, NumTracks ; 01/10/2017 1586 00000A24 8A0D[EC510000] mov cl, [numtracks] ; 06/10/2017 1587 00000A2A BE[82C00000] mov esi, Tracks - TrackInfo.size 1588 GetSamples_next: 1589 00000A2F 51 push ecx 1590 00000A30 83C626 add esi, TrackInfo.size 1591 00000A33 668B0D[9EC00000] mov cx, [BufLen] 1592 00000A3A 8B3D[9AC00000] mov edi, [BufPtr] 1593 00000A40 E8D2FEFFFF call MixTrack 1594 00000A45 59 pop ecx 1595 00000A46 FF05[9AC00000] inc dword [BufPtr] ; 18/10/2017 1596 00000A4C E2E1 loop GetSamples_next 1597 1598 ; 18/10/2017 1599 00000A4E 8B1D[EC510000] mov ebx, [numtracks] 1600 00000A54 291D[9AC00000] sub dword [BufPtr], ebx 1601 1602 00000A5A E8F3FDFFFF call UpdateTracks 1603 1604 00000A5F 5F pop edi 1605 00000A60 5B pop ebx 1606 CopyChunk: 1607 ;mov cx, [BufLen] 1608 00000A61 0FB70D[9EC00000] movzx ecx, word [BufLen] 1609 00000A68 39D9 cmp ecx, ebx 1610 ;cmp cx, bx 1611 00000A6A 7602 jbe short MoveChunk 1612 ;mov cx, bx 1613 00000A6C 89D9 mov ecx, ebx 1614 MoveChunk: 1615 00000A6E 8B35[9AC00000] mov esi, [BufPtr] 1616 00000A74 010D[9AC00000] add [BufPtr], ecx 1617 00000A7A 66290D[9EC00000] sub [BufLen], cx 1618 00000A81 29CB sub ebx, ecx 1619 ; 17/10/2017 ; STEREO MIXING 1620 ;rep movsb 1621 ; 18/10/2017 1622 00000A83 803D[EC510000]04 cmp byte [numtracks], 4 1623 ;jna short _4_channels_mix 1624 00000A8A 762F jna short _4_channels_mix 1625 1626 _8_channels_mix: 1627 ; 18/10/2017 1628 00000A8C AD lodsd 1629 00000A8D 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1630 00000A8F C1EA10 shr edx, 16 ; ch3 (dl), ch4 (dh) 1631 00000A92 00C6 add dh, al ; ch1 + ch4 1632 00000A94 00E2 add dl, ah ; ch2 + ch3 1633 1634 00000A96 AD lodsd 1635 00000A97 00C6 add dh, al ; ch1 + ch4 + ch5 1636 00000A99 00E2 add dl, ah ; ch2 + ch3 + ch6 1637 00000A9B C1E810 shr eax, 16 ; ch7 (al), ch8 (ah) 1638 ; 19/10/2017 1639 00000A9E 00E6 add dh, ah ; ch1 + ch4 + ch5 + ch8 1640 00000AA0 00C2 add dl, al ; ch2 + ch3 + ch6 + ch7 1641 1642 ; L = ch1 + ch4 + ch5 + ch8 1643 ; R = ch2 + ch3 + ch6 + ch7 1644 1645 00000AA2 6681C28080 add dx, 8080h 1646 1647 ; 19/10/2017 1648 00000AA7 88F4 mov ah, dh 1649 00000AA9 80EC80 sub ah, 80h 1650 00000AAC 30C0 xor al, al 1651 00000AAE 66AB stosw ; Left Channel 1652 00000AB0 88D4 mov ah, dl 1653 00000AB2 80EC80 sub ah, 80h 1654 00000AB5 66AB stosw ; Right Channel 1655 1656 00000AB7 E2D3 loop _8_channels_mix 1657 1658 00000AB9 EB21 jmp short channel_mix_ok 1659 1660 _4_channels_mix: 1661 ; 18/10/2017 1662 00000ABB AD lodsd 1663 00000ABC 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1664 ; 19/10/2017 1665 00000ABE C1E810 shr eax, 16 ; ch3 (al), ch4 (ah) 1666 00000AC1 00E2 add dl, ah ; ch1 + ch4 1667 00000AC3 00C6 add dh, al ; ch2 + ch3 1668 1669 ; L = ch1 + ch4 1670 ; R = ch2 + ch3 1671 1672 ; 19/10/2017 1673 00000AC5 6681C28080 add dx, 8080h 1674 1675 ; 19/10/2017 1676 00000ACA 88D4 mov ah, dl 1677 00000ACC 80EC80 sub ah, 80h 1678 00000ACF 30C0 xor al, al 1679 00000AD1 66AB stosw ; Left Channel 1680 00000AD3 88F4 mov ah, dh 1681 00000AD5 80EC80 sub ah, 80h 1682 00000AD8 66AB stosw ; Right Channel 1683 1684 00000ADA E2DF loop _4_channels_mix 1685 1686 channel_mix_ok: 1687 00000ADC 85DB test ebx, ebx 1688 ;jnz short NextChunk 1689 00000ADE 0F8508FFFFFF jnz NextChunk ; 17/10/2017 1690 1691 ; 20/10/2017 1692 ; 19/10/2017 1693 ; Pan Control 1694 00000AE4 8A0D[30CC0000] mov cl, [pan_shift] 1695 00000AEA 08C9 or cl, cl 1696 00000AEC 744D jz short c_smpl_2 1697 1698 ; 20/10/2017 1699 00000AEE BB00200000 mov ebx, BUFFERSIZE/4 ; 8192 1700 00000AF3 BF[00D00000] mov edi, Audio_Buffer 1701 1702 00000AF8 B508 mov ch, 8 1703 00000AFA D2E5 shl ch, cl 1704 c_smpl_1: 1705 00000AFC 8B17 mov edx, [edi] 1706 00000AFE 6689D0 mov ax, dx 1707 00000B01 80FC80 cmp ah, 80h 1708 00000B04 7208 jb short _cs1 1709 00000B06 00EC add ah, ch 1710 00000B08 730A jnc short _cs2 1711 00000B0A B4FF mov ah, 255 1712 00000B0C EB06 jmp short _cs2 1713 _cs1: 1714 00000B0E 28EC sub ah, ch 1715 00000B10 7302 jnc short _cs2 1716 00000B12 B400 mov ah, 0 1717 _cs2: 1718 00000B14 C1CA10 ror edx, 16 ; dx = [edi+2] 1719 00000B17 00F4 add ah, dh 1720 00000B19 6692 xchg dx, ax ; xchg [edi+2], ax 1721 00000B1B 80FC80 cmp ah, 80h 1722 00000B1E 7208 jb short _cs3 1723 00000B20 00EC add ah, ch 1724 00000B22 730A jnc short _cs4 1725 00000B24 B4FF mov ah, 255 1726 00000B26 EB06 jmp short _cs4 1727 _cs3: 1728 00000B28 28EC sub ah, ch 1729 00000B2A 7302 jnc short _cs4 1730 00000B2C B400 mov ah, 0 1731 _cs4: 1732 00000B2E C1CA10 ror edx, 16 ; dx = [edi] 1733 00000B31 00E6 add dh, ah 1734 00000B33 8917 mov [edi], edx 1735 _cs5: 1736 ; 20/10/2017 1737 00000B35 83C704 add edi, 4 1738 00000B38 4B dec ebx 1739 00000B39 75C1 jnz short c_smpl_1 1740 c_smpl_2: 1741 00000B3B 61 popad 1742 00000B3C C3 retn 1743 1744 ;-------------------------------------------------------------------------- 1745 ; StartPlaying: Initializes the Sound System. 1746 ; In: 1747 ; Module Information Resources. 1748 ;-------------------------------------------------------------------------- 1749 1750 StartPlaying: 1751 00000B3D 60 pushad 1752 SetModParms: 1753 00000B3E C605[92C00000]00 mov byte [OrderPos], 0 1754 00000B45 C605[93C00000]06 mov byte [Tempo], DefTempo 1755 00000B4C C605[94C00000]06 mov byte [TempoWait], DefTempo 1756 00000B53 C605[95C00000]7D mov byte [Bpm], DefBpm 1757 00000B5A C605[96C00000]40 mov byte [Row], 64 1758 00000B61 C605[97C00000]00 mov byte [BreakRow], 0 1759 00000B68 66A1[F2510000] mov ax, [MixSpeed] 1760 00000B6E 31D2 xor edx, edx 1761 00000B70 66BB3200 mov bx, 24*DefBpm/60 1762 00000B74 66F7F3 div bx 1763 00000B77 66A3[98C00000] mov [BpmSamples], ax 1764 ClearTracks: 1765 00000B7D BF[A8C00000] mov edi, Tracks 1766 ; 07/10/2017 1767 ;mov ecx, NumTracks*TrackInfo.size 1768 00000B82 B826000000 mov eax, TrackInfo.size 1769 00000B87 0FB70D[EC510000] movzx ecx, word [numtracks] 1770 00000B8E F7E1 mul ecx 1771 00000B90 89C1 mov ecx, eax 1772 00000B92 31C0 xor eax, eax 1773 ;cld 1774 00000B94 F3AA rep stosb 1775 1776 00000B96 A3[9AC00000] mov [BufPtr], eax 1777 00000B9B 66A3[9EC00000] mov [BufLen], ax 1778 MakePitch: 1779 00000BA1 66B80021 mov ax, MidCRate 1780 00000BA5 66BBAC01 mov bx, 428 1781 00000BA9 66F7E3 mul bx 1782 00000BAC 66F735[F2510000] div word [MixSpeed] 1783 00000BB3 30F6 xor dh, dh 1784 00000BB5 88E2 mov dl, ah 1785 00000BB7 88C4 mov ah, al 1786 00000BB9 30C0 xor al, al 1787 00000BBB 66B95903 mov cx, 857 ; 23/08/2020 1788 ;mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1789 00000BBF 31DB xor ebx, ebx 1790 00000BC1 BF[EE580000] mov edi, PitchTable 1791 PitchLoop: 1792 00000BC6 50 push eax 1793 00000BC7 52 push edx 1794 00000BC8 6639DA cmp dx, bx 1795 00000BCB 7303 jae short NoDiv 1796 00000BCD 66F7F3 div bx 1797 NoDiv: 1798 00000BD0 66AB stosw 1799 00000BD2 5A pop edx 1800 00000BD3 58 pop eax 1801 ;inc bx 1802 00000BD4 43 inc ebx 1803 00000BD5 E2EF loop PitchLoop 1804 MakeVolume: 1805 00000BD7 66B90041 mov cx, 16640 1806 00000BDB 89CB mov ebx, ecx 1807 VolLoop: 1808 00000BDD 664B dec bx 1809 00000BDF 88D8 mov al, bl 1810 00000BE1 F6EF imul bh 1811 ;mov [VolTable+bx], ah 1812 00000BE3 88A3[A65F0000] mov [VolTable+ebx], ah 1813 00000BE9 E2F2 loop VolLoop 1814 1815 00000BEB 61 popad 1816 00000BEC C3 retn 1817 1818 ;-------------------------------------------------------------------------- 1819 ; StopPlaying: ShutDown the Sound System. 1820 ;-------------------------------------------------------------------------- 1821 1822 StopPlaying: 1823 ; 19/06/2017 1824 ; Stop Playing 1825 sys _audio, 0700h 1825 <1> 1825 <1> 1825 <1> 1825 <1> 1825 <1> %if %0 >= 2 1825 00000BED BB00070000 <1> mov ebx, %2 1825 <1> %if %0 >= 3 1825 <1> mov ecx, %3 1825 <1> %if %0 = 4 1825 <1> mov edx, %4 1825 <1> %endif 1825 <1> %endif 1825 <1> %endif 1825 00000BF2 B820000000 <1> mov eax, %1 1825 <1> 1825 00000BF7 CD40 <1> int 40h 1826 ; Cancel callback service (for user) 1827 sys _audio, 0900h 1827 <1> 1827 <1> 1827 <1> 1827 <1> 1827 <1> %if %0 >= 2 1827 00000BF9 BB00090000 <1> mov ebx, %2 1827 <1> %if %0 >= 3 1827 <1> mov ecx, %3 1827 <1> %if %0 = 4 1827 <1> mov edx, %4 1827 <1> %endif 1827 <1> %endif 1827 <1> %endif 1827 00000BFE B820000000 <1> mov eax, %1 1827 <1> 1827 00000C03 CD40 <1> int 40h 1828 ; Deallocate Audio Buffer (for user) 1829 sys _audio, 0A00h 1829 <1> 1829 <1> 1829 <1> 1829 <1> 1829 <1> %if %0 >= 2 1829 00000C05 BB000A0000 <1> mov ebx, %2 1829 <1> %if %0 >= 3 1829 <1> mov ecx, %3 1829 <1> %if %0 = 4 1829 <1> mov edx, %4 1829 <1> %endif 1829 <1> %endif 1829 <1> %endif 1829 00000C0A B820000000 <1> mov eax, %1 1829 <1> 1829 00000C0F CD40 <1> int 40h 1830 ; Disable Audio Device 1831 sys _audio, 0C00h 1831 <1> 1831 <1> 1831 <1> 1831 <1> 1831 <1> %if %0 >= 2 1831 00000C11 BB000C0000 <1> mov ebx, %2 1831 <1> %if %0 >= 3 1831 <1> mov ecx, %3 1831 <1> %if %0 = 4 1831 <1> mov edx, %4 1831 <1> %endif 1831 <1> %endif 1831 <1> %endif 1831 00000C16 B820000000 <1> mov eax, %1 1831 <1> 1831 00000C1B CD40 <1> int 40h 1832 1833 00000C1D C3 retn 1834 1835 ;============================================================================= 1836 ; 1837 ;============================================================================= 1838 1839 ;dword2str: 1840 ; ; 13/11/2016 - Erdogan Tan 1841 ; ; eax = dword value 1842 ; ; 1843 ; call dwordtohex 1844 ; mov [dword_str], edx 1845 ; mov [dword_str+4], eax 1846 ; mov si, dword_str 1847 ; retn 1848 1849 ; 05/03/2017 (TRDOS 386) 1850 ; trdos386.s (unix386.s) - 10/05/2015 1851 ; Convert binary number to hexadecimal string 1852 1853 ;bytetohex: 1854 ; ; INPUT -> 1855 ; ; AL = byte (binary number) 1856 ; ; OUTPUT -> 1857 ; ; AX = hexadecimal string 1858 ; ; 1859 ; push ebx 1860 ; movzx ebx, al 1861 ; shr bl, 4 1862 ; mov bl, [ebx+hex_chars] 1863 ; xchg bl, al 1864 ; and bl, 0Fh 1865 ; mov ah, [ebx+hex_chars] 1866 ; pop ebx 1867 ; retn 1868 1869 ;wordtohex: 1870 ; ; INPUT -> 1871 ; ; AX = word (binary number) 1872 ; ; OUTPUT -> 1873 ; ; EAX = hexadecimal string 1874 ; ; 1875 ; push ebx 1876 ; xor ebx, ebx 1877 ; xchg ah, al 1878 ; push eax 1879 ; mov bl, ah 1880 ; shr bl, 4 1881 ; mov al, [ebx+hex_chars] 1882 ; mov bl, ah 1883 ; and bl, 0Fh 1884 ; mov ah, [ebx+hex_chars] 1885 ; shl eax, 16 1886 ; pop eax 1887 ; pop ebx 1888 ; jmp short bytetohex 1889 1890 ;dwordtohex: 1891 ; ; INPUT -> 1892 ; ; EAX = dword (binary number) 1893 ; ; OUTPUT -> 1894 ; ; EDX:EAX = hexadecimal string 1895 ; ; 1896 ; push eax 1897 ; shr eax, 16 1898 ; call wordtohex 1899 ; mov edx, eax 1900 ; pop eax 1901 ; call wordtohex 1902 ; retn 1903 1904 ; 19/06/2017 1905 ; 05/03/2017 (TRDOS 386) 1906 ; 13/11/2016 - Erdogan Tan 1907 write_audio_dev_info: 1908 ; BUS/DEV/FN 1909 ; 00000000BBBBBBBBDDDDDFFF00000000 1910 ; DEV/VENDOR 1911 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1912 1913 00000C1E 8B35[A4520000] mov esi, [dev_vendor] 1914 00000C24 6689F0 mov ax, si 1915 00000C27 0FB6D8 movzx ebx, al 1916 00000C2A 88DA mov dl, bl 1917 00000C2C 80E30F and bl, 0Fh 1918 00000C2F 8A83[F4510000] mov al, [ebx+hex_chars] 1919 00000C35 A2[39520000] mov [msgVendorId+3], al 1920 00000C3A 88D3 mov bl, dl 1921 00000C3C C0EB04 shr bl, 4 1922 00000C3F 8A83[F4510000] mov al, [ebx+hex_chars] 1923 00000C45 A2[38520000] mov [msgVendorId+2], al 1924 00000C4A 88E3 mov bl, ah 1925 00000C4C 88DA mov dl, bl 1926 00000C4E 80E30F and bl, 0Fh 1927 00000C51 8A83[F4510000] mov al, [ebx+hex_chars] 1928 00000C57 A2[37520000] mov [msgVendorId+1], al 1929 00000C5C 88D3 mov bl, dl 1930 00000C5E C0EB04 shr bl, 4 1931 00000C61 8A83[F4510000] mov al, [ebx+hex_chars] 1932 00000C67 A2[36520000] mov [msgVendorId], al 1933 00000C6C C1EE10 shr esi, 16 1934 00000C6F 6689F0 mov ax, si 1935 00000C72 88C3 mov bl, al 1936 00000C74 88DA mov dl, bl 1937 00000C76 80E30F and bl, 0Fh 1938 00000C79 8A83[F4510000] mov al, [ebx+hex_chars] 1939 00000C7F A2[4A520000] mov [msgDevId+3], al 1940 00000C84 88D3 mov bl, dl 1941 00000C86 C0EB04 shr bl, 4 1942 00000C89 8A83[F4510000] mov al, [ebx+hex_chars] 1943 00000C8F A2[49520000] mov [msgDevId+2], al 1944 00000C94 88E3 mov bl, ah 1945 00000C96 88DA mov dl, bl 1946 00000C98 80E30F and bl, 0Fh 1947 00000C9B 8A83[F4510000] mov al, [ebx+hex_chars] 1948 00000CA1 A2[48520000] mov [msgDevId+1], al 1949 00000CA6 88D3 mov bl, dl 1950 00000CA8 C0EB04 shr bl, 4 1951 00000CAB 8A83[F4510000] mov al, [ebx+hex_chars] 1952 00000CB1 A2[47520000] mov [msgDevId], al 1953 1954 00000CB6 8B35[A8520000] mov esi, [bus_dev_fn] 1955 00000CBC C1EE08 shr esi, 8 1956 00000CBF 6689F0 mov ax, si 1957 00000CC2 88C3 mov bl, al 1958 00000CC4 88DA mov dl, bl 1959 00000CC6 80E307 and bl, 7 ; bit 0,1,2 1960 00000CC9 8A83[F4510000] mov al, [ebx+hex_chars] 1961 00000CCF A2[6E520000] mov [msgFncNo+1], al 1962 00000CD4 88D3 mov bl, dl 1963 00000CD6 C0EB03 shr bl, 3 1964 00000CD9 88DA mov dl, bl 1965 00000CDB 80E30F and bl, 0Fh 1966 00000CDE 8A83[F4510000] mov al, [ebx+hex_chars] 1967 00000CE4 A2[60520000] mov [msgDevNo+1], al 1968 00000CE9 88D3 mov bl, dl 1969 00000CEB C0EB04 shr bl, 4 1970 00000CEE 8A83[F4510000] mov al, [ebx+hex_chars] 1971 00000CF4 A2[5F520000] mov [msgDevNo], al 1972 00000CF9 88E3 mov bl, ah 1973 00000CFB 88DA mov dl, bl 1974 00000CFD 80E30F and bl, 0Fh 1975 00000D00 8A83[F4510000] mov al, [ebx+hex_chars] 1976 00000D06 A2[54520000] mov [msgBusNo+1], al 1977 00000D0B 88D3 mov bl, dl 1978 00000D0D C0EB04 shr bl, 4 1979 00000D10 8A83[F4510000] mov al, [ebx+hex_chars] 1980 00000D16 A2[53520000] mov [msgBusNo], al 1981 1982 00000D1B 66A1[B0520000] mov ax, [ac97_io_base] 1983 00000D21 88C3 mov bl, al 1984 00000D23 88DA mov dl, bl 1985 00000D25 80E30F and bl, 0Fh 1986 00000D28 8A83[F4510000] mov al, [ebx+hex_chars] 1987 00000D2E A2[87520000] mov [msgIOBaseAddr+3], al 1988 00000D33 88D3 mov bl, dl 1989 00000D35 C0EB04 shr bl, 4 1990 00000D38 8A83[F4510000] mov al, [ebx+hex_chars] 1991 00000D3E A2[86520000] mov [msgIOBaseAddr+2], al 1992 00000D43 88E3 mov bl, ah 1993 00000D45 88DA mov dl, bl 1994 00000D47 80E30F and bl, 0Fh 1995 00000D4A 8A83[F4510000] mov al, [ebx+hex_chars] 1996 00000D50 A2[85520000] mov [msgIOBaseAddr+1], al 1997 00000D55 88D3 mov bl, dl 1998 00000D57 C0EB04 shr bl, 4 1999 00000D5A 8A83[F4510000] mov al, [ebx+hex_chars] 2000 00000D60 A2[84520000] mov [msgIOBaseAddr], al 2001 2002 ; 24/11/2016 2003 00000D65 30E4 xor ah, ah 2004 00000D67 A0[B2520000] mov al, [ac97_int_ln_reg] 2005 00000D6C B10A mov cl, 10 2006 00000D6E F6F1 div cl 2007 00000D70 660105[8F520000] add [msgIRQ], ax 2008 00000D77 20C0 and al, al 2009 00000D79 750D jnz short _w_ac97imsg_ ; 19/06/2017 2010 00000D7B A0[90520000] mov al, [msgIRQ+1] 2011 00000D80 B420 mov ah, ' ' 2012 00000D82 66A3[8F520000] mov [msgIRQ], ax 2013 _w_ac97imsg_: 2014 ; EBX = Message address 2015 ; ECX = Max. message length (or stop on ZERO character) 2016 ; (1 to 255) 2017 ; DL = Message color (07h = light gray, 0Fh = white) 2018 sys _msg, msgAC97Info, 255, 07h 2018 <1> 2018 <1> 2018 <1> 2018 <1> 2018 <1> %if %0 >= 2 2018 00000D88 BB[05520000] <1> mov ebx, %2 2018 <1> %if %0 >= 3 2018 00000D8D B9FF000000 <1> mov ecx, %3 2018 <1> %if %0 = 4 2018 00000D92 BA07000000 <1> mov edx, %4 2018 <1> %endif 2018 <1> %endif 2018 <1> %endif 2018 00000D97 B823000000 <1> mov eax, %1 2018 <1> 2018 00000D9C CD40 <1> int 40h 2019 00000D9E C3 retn 2020 2021 ;============================================================================= 2022 ; gfx.asm - draw scopes in VGA 640x480x16 mode 2023 ;============================================================================= 2024 2025 ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 2026 2027 ;----------------------------------------------------------------------------- 2028 ; setgraphmode - setup the VGA 640x480x16 graphics mode 2029 ;----------------------------------------------------------------------------- 2030 ; 22/10/2017 2031 setgraphmode: 2032 ;pushad 2033 00000D9F 66B81200 mov ax,0012h 2034 ;int 10h 2035 00000DA3 CD31 int 31h 2036 00000DA5 66BAC003 mov dx,3C0h 2037 00000DA9 30C0 xor al,al 2038 setgraphmodel0: 2039 ;out dx,al 2040 00000DAB B401 mov ah, 1 ; outb 2041 00000DAD CD34 int 34h 2042 ;out dx, al 2043 ;mov ah, 1 2044 00000DAF CD34 int 34h 2045 00000DB1 FEC0 inc al 2046 00000DB3 3C10 cmp al, 10h 2047 00000DB5 72F4 jb short setgraphmodel0 2048 00000DB7 B020 mov al, 20h 2049 ;out dx, al 2050 ;mov ah, 1 2051 00000DB9 CD34 int 34h 2052 ;popad 2053 00000DBB C3 retn 2054 2055 ;----------------------------------------------------------------------------- 2056 ; settextmode - restore the VGA 80x25x16 text mode 2057 ;----------------------------------------------------------------------------- 2058 ; 22/10/2017 2059 settextmode: 2060 ;pushad 2061 00000DBC 66B80300 mov ax, 0003h 2062 ;int 10h 2063 00000DC0 CD31 int 31h 2064 ;popad 2065 00000DC2 C3 retn 2066 2067 ;----------------------------------------------------------------------------- 2068 ; drawscopes - draw the track voices sample scopes 2069 ; In: 2070 ; ESI = (current) sample buffer 2071 ;----------------------------------------------------------------------------- 2072 ; 29/10/2017 2073 ; 28/10/2017 2074 ; (ESI = Current DMA buffer offset) 2075 ; 27/10/2017 2076 ; 26/10/2017 2077 ; 23/10/2017 2078 drawscopes: 2079 ;pushad 2080 ;mov esi, g_buff 2081 ;mov esi, edx 2082 00000DC3 31C9 xor ecx, ecx 2083 00000DC5 31D2 xor edx, edx 2084 00000DC7 31FF xor edi, edi 2085 drawscope0: 2086 00000DC9 66AD lodsw 2087 00000DCB 80F480 xor ah, 80h 2088 00000DCE 0FB6DC movzx ebx, ah ; Left Channel 2089 00000DD1 66D1E3 shl bx, 1 2090 00000DD4 668B83[30C20000] mov ax, [RowOfs+ebx] 2091 00000DDB 668987[30C40000] mov [NewScope_L+edi], ax 2092 00000DE2 30FF xor bh, bh 2093 00000DE4 66AD lodsw 2094 00000DE6 80F480 xor ah, 80h 2095 00000DE9 88E3 mov bl, ah ; Right Channel 2096 00000DEB 66D1E3 shl bx, 1 2097 00000DEE 668B83[30C20000] mov ax, [RowOfs+ebx] 2098 00000DF5 668987[30C60000] mov [NewScope_R+edi], ax 2099 00000DFC 6683C702 add di, 2 2100 00000E00 FEC1 inc cl 2101 00000E02 75C5 jnz short drawscope0 2102 2103 00000E04 66BAC403 mov dx, 3C4h 2104 ;mov ax, 0802h 2105 ;out dx, ax 2106 00000E08 66BB0208 mov bx, 0802h 2107 00000E0C B403 mov ah, 3 ; outw 2108 00000E0E CD34 int 34h 2109 00000E10 66BACE03 mov dx, 3CEh 2110 00000E14 B008 mov al, 08h 2111 ;out dx, al 2112 00000E16 B401 mov ah, 1 ; outb 2113 00000E18 CD34 int 34h 2114 00000E1A 6642 inc dx 2115 2116 ; 26/10/2017 2117 00000E1C 31F6 xor esi, esi 2118 ;xor edi, edi 2119 00000E1E BB45060A00 mov ebx, 0A0645h 2120 drawscopel4: 2121 00000E23 B080 mov al, 80h 2122 drawscopel2: 2123 00000E25 50 push eax ; * 2124 00000E26 52 push edx ; ** 2125 ;out dx, al 2126 00000E27 B401 mov ah, 1 ; outb 2127 00000E29 CD34 int 34h 2128 2129 00000E2B B4FF mov ah, 0FFh 2130 ;mov ecx, 32 2131 00000E2D B120 mov cl, 32 2132 00000E2F 28C0 sub al, al 2133 drawscopel3: 2134 ; 23/10/2017 2135 00000E31 668B96[30C80000] mov dx, [OldScope_L+esi] 2136 00000E38 663B96[30C40000] cmp dx, [NewScope_L+esi] 2137 00000E3F 7414 je short drawscopef3 2138 00000E41 88041A mov [edx+ebx], al ; L 2139 00000E44 668B96[30C40000] mov dx, [NewScope_L+esi] 2140 00000E4B 88241A mov [edx+ebx], ah ; L 2141 00000E4E 668996[30C80000] mov [OldScope_L+esi], dx 2142 drawscopef3: 2143 ; 27/10/2017 2144 00000E55 668B96[30CA0000] mov dx, [OldScope_R+esi] 2145 00000E5C 663B96[30C60000] cmp dx, [NewScope_R+esi] 2146 00000E63 7416 je short drawscopef4 2147 00000E65 88441A26 mov [edx+ebx+38], al ; R 2148 00000E69 668B96[30C60000] mov dx, [NewScope_R+esi] 2149 00000E70 88641A26 mov [edx+ebx+38], ah ; R 2150 00000E74 668996[30CA0000] mov [OldScope_R+esi], dx 2151 drawscopef4: 2152 00000E7B 83C610 add esi, 2*8 2153 00000E7E 43 inc ebx 2154 00000E7F E2B0 loop drawscopel3 2155 2156 00000E81 5A pop edx ; ** 2157 00000E82 58 pop eax ; * 2158 00000E83 81EEFE010000 sub esi, 2*256-2 2159 00000E89 83EB20 sub ebx, 32 2160 00000E8C D0E8 shr al, 1 2161 00000E8E 7595 jnz short drawscopel2 2162 ;popad 2163 00000E90 C3 retn 2164 2165 ;============================================================================= 2166 ; Load IFF/ILBM files for VGA 640x480x16 graphics mode 2167 ;============================================================================= 2168 2169 ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 2170 2171 ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax) 2172 2173 ;----------------------------------------------------------------------------- 2174 ; EQUATES AND STRUCTURES 2175 ;----------------------------------------------------------------------------- 2176 2177 ID_FORM equ 4D524F46h ; IFF/ILBM chunk IDs 2178 ID_ILBM equ 4D424C49h 2179 ID_BMHD equ 44484D42h 2180 ID_CMAP equ 50414D43h 2181 ID_BODY equ 59444F42h 2182 2183 struc Form ; IFF/ILBM header file format 2184 00000000 .ID: resd 1 2185 00000004 .Length: resd 1 2186 00000008 .Type: resd 1 2187 .size: 2188 endstruc 2189 2190 struc Chunk ; IFF/ILBM header chunk format 2191 00000000 .ID: resd 1 2192 00000004 .Length: resd 1 2193 .size: 2194 endstruc 2195 2196 struc BMHD ; IFF/ILBM BMHD chunk format 2197 00000000 .Width: resw 1 2198 00000002 .Height: resw 1 2199 00000004 .PosX: resw 1 2200 00000006 .PosY: resw 1 2201 00000008 .Planes: resb 1 2202 00000009 .Masking: resb 1 2203 0000000A .Compression: resb 1 2204 0000000B .Pad: resb 1 2205 0000000C .Transparent: resw 1 2206 0000000E .AspectX resb 1 2207 0000000F .AspectY: resb 1 2208 00000010 .PageWidth: resw 1 2209 00000012 .PageHeight: resw 1 2210 .size: 2211 endstruc 2212 2213 struc CMAP ; IFF/ILBM CMAP chunk format 2214 00000000 .Colors: resb 768 2215 .size: 2216 endstruc 2217 2218 ;LOGO_ADDRESS equ 100000h ; virtual address at the end of the 1st 1MB 2219 2220 ;------------------------------------------------------------------------------ 2221 ; bswap - macro to reverse the byte order of a 32-bit register, converting 2222 ; a value in little/big endian form to big/little endian form. 2223 ;------------------------------------------------------------------------------ 2224 %macro bswap 1 2225 xchg al, ah 2226 rol eax, 16 2227 xchg al, ah 2228 %endmacro 2229 2230 ;------------------------------------------------------------------------------ 2231 ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode 2232 ; In: 2233 ; ESI = IFF/ILBM image file address 2234 ;------------------------------------------------------------------------------ 2235 putlbm: 2236 00000E91 60 pushad 2237 2238 ; check if this is a valid IFF/ILBM Deluxe Paint file 2239 2240 00000E92 813E464F524D cmp dword [esi+Form.ID], ID_FORM 2241 00000E98 7551 jne short putlbmd0 2242 00000E9A 817E08494C424D cmp dword [esi+Form.Type], ID_ILBM 2243 00000EA1 7548 jne short putlbmd0 2244 2245 ; get the IFF/ILBM file length in bytes 2246 2247 00000EA3 8B4604 mov eax, [esi+Form.Length] 2248 bswap eax 2248 00000EA6 86C4 <1> xchg al, ah 2248 00000EA8 C1C010 <1> rol eax, 16 2248 00000EAB 86C4 <1> xchg al, ah 2249 00000EAD 89C1 mov ecx, eax 2250 2251 ; decrease the file length and update the file pointer 2252 2253 00000EAF 83E904 sub ecx, 4 2254 00000EB2 83C60C add esi, Form.size 2255 2256 ; IFF/ILBM main parser body loop 2257 2258 putlbml0: 2259 00000EB5 85C9 test ecx, ecx 2260 00000EB7 7E64 jle short putlbmd1 2261 2262 ; get the next chunk ID and length in bytes 2263 2264 00000EB9 8B1E mov ebx, [esi+Chunk.ID] 2265 00000EBB 8B4604 mov eax, [esi+Chunk.Length] 2266 bswap eax 2266 00000EBE 86C4 <1> xchg al, ah 2266 00000EC0 C1C010 <1> rol eax, 16 2266 00000EC3 86C4 <1> xchg al, ah 2267 00000EC5 93 xchg ebx, eax 2268 00000EC6 83C608 add esi, Chunk.size 2269 2270 ; word align the chunk length and decrease the file length counter 2271 2272 00000EC9 43 inc ebx 2273 00000ECA 80E3FE and bl, 0FEh ; ~1 2274 00000ECD 83E908 sub ecx, Chunk.size 2275 00000ED0 29D9 sub ecx, ebx 2276 2277 ; check for the BMHD/CMAP/BODY chunk headers 2278 2279 00000ED2 3D424D4844 cmp eax, ID_BMHD 2280 00000ED7 7415 je short putlbmf0 2281 00000ED9 3D434D4150 cmp eax, ID_CMAP 2282 00000EDE 7440 je short putlbmf1 2283 00000EE0 3D424F4459 cmp eax, ID_BODY 2284 00000EE5 7455 je short putlbmf2 2285 2286 ; advance to the next IFF/ILBM chunk structure 2287 2288 putlbmc0: 2289 00000EE7 01DE add esi, ebx 2290 00000EE9 EBCA jmp short putlbml0 2291 2292 putlbmd0: 2293 00000EEB F9 stc 2294 00000EEC 61 popad 2295 00000EED C3 retn 2296 2297 ; process the BMHD bitmap header chunk 2298 2299 putlbmf0: 2300 00000EEE 807E0804 cmp byte [esi+BMHD.Planes], 4 2301 00000EF2 75F7 jne short putlbmd0 2302 00000EF4 807E0A01 cmp byte [esi+BMHD.Compression], 1 2303 00000EF8 75F1 jne short putlbmd0 2304 00000EFA 807E0B00 cmp byte [esi+BMHD.Pad], 0 2305 00000EFE 75EB jne short putlbmd0 2306 00000F00 0FB706 movzx eax, word [esi+BMHD.Width] 2307 00000F03 86C4 xchg al, ah 2308 00000F05 83C007 add eax, 7 2309 00000F08 C1E803 shr eax, 3 2310 00000F0B A3[9C520000] mov [picture.width], eax 2311 00000F10 0FB74602 movzx eax, word [esi+BMHD.Height] 2312 00000F14 86C4 xchg al, ah 2313 00000F16 A3[A0520000] mov [picture.height], eax 2314 00000F1B EBCA jmp short putlbmc0 2315 2316 putlbmd1: 2317 00000F1D F8 clc 2318 00000F1E 61 popad 2319 00000F1F C3 retn 2320 2321 ; process the CMAP colormap chunk 2322 2323 putlbmf1: 2324 00000F20 66BAC803 mov dx, 3C8h 2325 00000F24 30C0 xor al, al 2326 ;out dx, al 2327 00000F26 B401 mov ah, 1 ; outb 2328 00000F28 CD34 int 34h 2329 00000F2A 6642 inc dx 2330 putlbml1: 2331 00000F2C 8A06 mov al, [esi] 2332 00000F2E C0E802 shr al, 2 2333 ;out dx, al 2334 ;mov ah, 1 ; outb 2335 00000F31 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2336 00000F33 46 inc esi 2337 00000F34 4B dec ebx 2338 00000F35 7FF5 jg short putlbml1 2339 00000F37 E979FFFFFF jmp putlbml0 2340 2341 ; process the BODY bitmap body chunk 2342 2343 putlbmf2: 2344 00000F3C 60 pushad 2345 00000F3D BF00000A00 mov edi, 0A0000h 2346 ;cld 2347 00000F42 66BACE03 mov dx, 3CEh 2348 ;mov ax, 0FF08h 2349 ;out dx, ax 2350 00000F46 66BB08FF mov bx, 0FF08h 2351 00000F4A B403 mov ah, 3 ; outw 2352 00000F4C CD34 int 34h ; IOCTL interrupt (IN/OUT) 2353 00000F4E 66BAC403 mov dx, 3C4h 2354 00000F52 B002 mov al, 02h 2355 ;out dx, al 2356 00000F54 B401 mov ah, 1 ; outb 2357 00000F56 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2358 00000F58 6642 inc dx 2359 00000F5A 8B0D[A0520000] mov ecx, [picture.height] 2360 putlbml2: 2361 00000F60 51 push ecx 2362 00000F61 B011 mov al, 11h 2363 putlbml3: 2364 00000F63 50 push eax 2365 00000F64 57 push edi 2366 ;out dx, al 2367 00000F65 B401 mov ah, 1 ; outb 2368 00000F67 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2369 00000F69 8B1D[9C520000] mov ebx, [picture.width] 2370 putlbml4: 2371 00000F6F AC lodsb 2372 00000F70 84C0 test al, al 2373 00000F72 7C0A jl short putlbmf3 2374 00000F74 0FB6C8 movzx ecx, al 2375 00000F77 41 inc ecx 2376 00000F78 29CB sub ebx, ecx 2377 00000F7A F3A4 rep movsb 2378 00000F7C EB0B jmp short putlbmc4 2379 putlbmf3: 2380 00000F7E F6D8 neg al 2381 00000F80 0FB6C8 movzx ecx, al 2382 00000F83 41 inc ecx 2383 00000F84 29CB sub ebx, ecx 2384 00000F86 AC lodsb 2385 00000F87 F3AA rep stosb 2386 putlbmc4: 2387 00000F89 85DB test ebx, ebx 2388 00000F8B 7FE2 jg short putlbml4 2389 00000F8D 5F pop edi 2390 00000F8E 58 pop eax 2391 00000F8F 00C0 add al, al 2392 00000F91 73D0 jnc short putlbml3 2393 00000F93 83C750 add edi, 80 2394 00000F96 59 pop ecx 2395 00000F97 E2C7 loop putlbml2 2396 00000F99 61 popad 2397 00000F9A E948FFFFFF jmp putlbmc0 2398 2399 ; EX1.C (Carlos Hasan, 21/06/1994) 2400 ;------------------------------------------------------------------------------ 2401 ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory 2402 ; ESI = IFF/ILBM image file address 2403 ;------------------------------------------------------------------------------ 2404 2405 ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) { 2406 ; printf("Error loading the IFF/ILBM logo picture\n"); 2407 ; MODStopModule(); 2408 ; MODFreeModule(Song); 2409 ; return; 2410 ; } 2411 ; setgraphmode(); 2412 ; putlbm(Logo); 2413 ; while (!kbhit()) 2414 ; drawscopes(Song->NumTracks); 2415 ; settextmode(); 2416 ; free(Logo); 2417 ; MODStopModule(); 2418 ; MODFreeModule(Song); 2419 2420 ;loadlbm: 2421 ; ; ebx = ASCIIZ file name address 2422 ; ; ecx = open mode (0 = open for read) 2423 ; sys _open, LOGO_FILE_NAME, 0 ; open for reading 2424 ; jc short loadlbm_retn 2425 ; 2426 ; mov [LBM_FileHandle], eax 2427 ; 2428 ; ; get file size by moving file pointer to the end of file 2429 ; ; ebx = file handle/number 2430 ; ; ecx : offset = 0 2431 ; ; edx : switch = 2 (move fp to end of file + offset) 2432 ; sys _seek, eax, 0, 2 2433 ; jc short loadlbm_cf 2434 ; 2435 ; mov [LBM_FileSize], eax 2436 ; 2437 ; ; move file pointer to the beginning of the file 2438 ; ; ecx = 0 2439 ; ; edx = 0 2440 ; ;xor ecx, ecx 2441 ; xor dl, dl 2442 ; ; ebx = [LBM_FileHandle] 2443 ; sys _seek 2444 ; ;jc short loadlbm_cf 2445 ; 2446 ; ; ebx = File handle 2447 ; ; ecx = Buffer address 2448 ; ; edx = Byte count 2449 ; ;sys _read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize] 2450 ; mov ecx, LOGO_ADDRESS 2451 ; mov edx, [LBM_FileSize] 2452 ; sys _read 2453 ; jc short loadlbm_cf 2454 ; 2455 ; cmp eax, edx ; read count = file size ? 2456 ; ;jb short loadlbm_cf 2457 ;loadlbm_cf: 2458 ; pushf 2459 ; sys _close, [LBM_FileHandle] 2460 ; popf 2461 ;loadlbm_retn: 2462 ; retn 2463 ; 2464 ;LOGO_FILE_NAME: 2465 ; db "LOGO.LBM", 0 2466 2467 LOGO_ERROR_MSG: 2468 00000F9F 4572726F72206C6F61- db "Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 2468 00000FA8 64696E672074686520- 2468 00000FB1 4946462F494C424D20- 2468 00000FBA 6C6F676F2070696374- 2468 00000FC3 75726520210D0A00 2469 2470 00000FCB 90 align 2 2471 ; 22/10/2017 2472 LOGO_ADDRESS: 2473 ;incbin "LOGO.LBM" 2474 ; 27/10/2017 2475 00000FCC incbin "TINYPLAY.LBM" 2476 2477 ;============================================================================= 2478 ; preinitialized data 2479 ;============================================================================= 2480 2481 ;============================================================================= 2482 ; Protracker effects stuff 2483 ;============================================================================= 2484 2485 ;----------------------------------------------------------------------------- 2486 ; Effect jump tables 2487 ;----------------------------------------------------------------------------- 2488 2489 align 4 2490 2491 efxtable: 2492 00004FBC [BC070000] dd efxarpeggio ; 0 - arpeggio 2493 00004FC0 [E9040000] dd efxnull ; 1 - porta up 2494 00004FC4 [E9040000] dd efxnull ; 2 - porta down 2495 00004FC8 [07070000] dd efxtoneporta ; 3 - tone porta 2496 00004FCC [16070000] dd efxvibrato ; 4 - vibrato 2497 00004FD0 [E9040000] dd efxnull ; 5 - tone+slide 2498 00004FD4 [E9040000] dd efxnull ; 6 - vibrato+slide 2499 00004FD8 [33080000] dd efxtremolo ; 7 - tremolo 2500 00004FDC [E9040000] dd efxnull ; 8 - unused 2501 00004FE0 [3E070000] dd efxsampoffset ; 9 - sample offset 2502 00004FE4 [E9040000] dd efxnull ; A - volume slide 2503 00004FE8 [4A070000] dd efxpattjump ; B - pattern jump 2504 00004FEC [58070000] dd efxsetvolume ; C - set volume 2505 00004FF0 [66070000] dd efxbreak ; D - break pattern 2506 00004FF4 [E9040000] dd efxnull ; E - extra effects 2507 00004FF8 [85070000] dd efxsetspeed ; F - set speed 2508 2509 efxtable2: 2510 00004FFC [EA040000] dd efxarpeggio2 ; 0 - arpeggio 2511 00005000 [0C050000] dd efxportaup ; 1 - porta up 2512 00005004 [32050000] dd efxportadown ; 2 - porta down 2513 00005008 [59050000] dd efxtoneporta2 ; 3 - tone porta 2514 0000500C [92050000] dd efxvibrato2 ; 4 - vibrato 2515 00005010 [EE050000] dd efxtoneslide ; 5 - tone+slide 2516 00005014 [FB050000] dd efxvibslide ; 6 - vibrato+slide 2517 00005018 [22060000] dd efxtremolo2 ; 7 - tremolo 2518 0000501C [E9040000] dd efxnull ; 8 - unused 2519 00005020 [E9040000] dd efxnull ; 9 - sample offset 2520 00005024 [05060000] dd efxvolslide ; A - volume slide 2521 00005028 [E9040000] dd efxnull ; B - pattern jump 2522 0000502C [E9040000] dd efxnull ; C - set volume 2523 00005030 [E9040000] dd efxnull ; D - break pattern 2524 00005034 [E9040000] dd efxnull ; E - extra effects 2525 00005038 [E9040000] dd efxnull ; F - set speed 2526 2527 ;----------------------------------------------------------------------------- 2528 ; Amiga period table 2529 ;----------------------------------------------------------------------------- 2530 2531 ;PeriodTable0: 2532 ; dw 0 2533 PeriodTable: 2534 0000503C 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 2534 00005045 0A000A7009E8086808- 2534 0000504E F00780071407 2535 00005054 B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 2535 0000505D 050005B80474043404- 2535 00005066 F803C0038A03 2536 0000506C 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 2536 00005075 0280025C023A021A02- 2536 0000507E FC01E001C501 2537 00005084 AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 2537 0000508D 0140012E011D010D01- 2537 00005096 FE00F000E200 2538 0000509C D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 2538 000050A5 00A00097008F008700- 2538 000050AE 7F0078007100 2539 000050B4 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 2539 000050BD 0050004B0047004300- 2539 000050C6 3F003C003800 2540 000050CC 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 2540 000050D5 002800250023002100- 2540 000050DE 1F001E001C00 2541 2542 ;----------------------------------------------------------------------------- 2543 ; Sinus wave table 2544 ;----------------------------------------------------------------------------- 2545 2546 SinTable: 2547 000050E4 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 2547 000050ED C5D4E1 2548 000050F0 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 2548 000050F9 E1 2549 000050FA D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 2549 00005103 19 2550 2551 ;============================================================================= 2552 ; PLAY.ASM - DATA 2553 ;============================================================================= 2554 00005104 00 db 0 2555 msg_usage: 2556 00005105 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 2556 0000510E 506C6179657220666F- 2556 00005117 72205452444F532033- 2556 00005120 383620627920457264- 2556 00005129 6F67616E2054616E2E- 2556 00005132 20 2557 00005133 417567757374203230- db 'August 2020.',10,13 2557 0000513C 32302E0A0D 2558 00005141 75736167653A20746D- db 'usage: tmodplay filename.mod', 10,13,0 2558 0000514A 6F64706C6179206669- 2558 00005153 6C656E616D652E6D6F- 2558 0000515C 640A0D00 2559 00005160 32392F31302F323031- db '29/10/2017',10,13,0 2559 00005169 370A0D00 2560 0000516D 32342F30382F323032- db '24/08/2020',10,13,0 2560 00005176 300A0D00 2561 2562 Credits: 2563 0000517A 54696E79204D4F4420- db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 2563 00005183 506C61796572207630- 2563 0000518C 2E3162206279204361- 2563 00005195 726C6F732048617361- 2563 0000519E 6E2E204A756C792031- 2563 000051A7 3939332E 2564 000051AB 0A0D00 db 10,13,0 2565 ErrorMesg: 2566 000051AE 4572726F72206C6F61- db 'Error loading Module file.',10,13,0 2566 000051B7 64696E67204D6F6475- 2566 000051C0 6C652066696C652E0A- 2566 000051C9 0D00 2567 2568 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 2569 ;MsgFound: db 'Sound Blaster found at Address 2' 2570 ;PortText: db 'x0h, IRQ ' 2571 ;IrqText: db 'x.',10,13,0 2572 2573 trdos386_err_msg: 2574 000051CB 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 2574 000051D4 2053797374656D2063- 2574 000051DD 616C6C206572726F72- 2574 000051E6 20210A0D00 2575 2576 ; 07/10/2017 2577 000051EB 0A pattern_shift: db 10 2578 ;numtracks: dw 4 2579 ; 18/10/2017 2580 000051EC 04000000 numtracks: dd 4 2581 2582 ;============================================================================= 2583 ; PLAYER.ASM - DATA 2584 ;============================================================================= 2585 2586 ;stmo: db 1 ; stereo (2) or mono (1) 2587 ;bps: db 8 ; bits per sample (8 or 16) 2588 2589 ;19/10/2017 2590 000051F0 02 stmo: db 2 ; stereo (2) or mono (1) 2591 000051F1 10 bps: db 16 ; bits per sample (8 or 16) 2592 2593 Sample_Rate: 2594 000051F2 2256 MixSpeed: dw 22050 ; Hz 2595 2596 ; 13/11/2016 2597 000051F4 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 2597 000051FD 3941424344454600 2598 ; 2599 msgAC97Info: 2600 00005205 0D0A db 0Dh, 0Ah 2601 00005207 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 2601 00005210 6F20436F6E74726F6C- 2601 00005219 6C6572202620436F64- 2601 00005222 656320496E666F0D0A 2602 0000522B 56656E646F72204944- db "Vendor ID: " 2602 00005234 3A20 2603 00005236 303030306820446576- msgVendorId: db "0000h Device ID: " 2603 0000523F 6963652049443A20 2604 00005247 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 2605 0000524E 4275733A20 db "Bus: " 2606 00005253 303068204465766963- msgBusNo: db "00h Device: " 2606 0000525C 653A20 2607 0000525F 3030682046756E6374- msgDevNo: db "00h Function: " 2607 00005268 696F6E3A20 2608 0000526D 303068 msgFncNo db "00h" 2609 00005270 0D0A db 0Dh, 0Ah 2610 00005272 492F4F204261736520- db "I/O Base Address: " 2610 0000527B 416464726573733A20 2611 00005284 303030306820495251- msgIOBaseAddr: db "0000h IRQ: " 2611 0000528D 3A20 2612 0000528F 3030 msgIRQ: dw 3030h 2613 00005291 0D0A00 db 0Dh, 0Ah, 0 2614 ;msgSampleRate: db "Sample Rate: " 2615 ;msgHertz: db "00000 Hz ", 0 2616 ;msg8Bits: db "8 bits ", 0 2617 ;msgMono: db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0 2618 ;msg16Bits: db "16 bits ", 0 2619 ;msgStereo: db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0 2620 ; 2621 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 2622 ;codec_id: dd 0 2623 ;codec_chip_id: dd 0 2624 ;codec_vendor_ids: dw 0 2625 ;codec_chip_ids: dw 0 2626 2627 ;dword_str: dd 30303030h, 30303030h 2628 ; db 'h', 0Dh, 0Ah, 0 2629 2630 ;============================================================================= 2631 ; uninitialized data 2632 ;============================================================================= 2633 2634 bss_start: 2635 2636 ABSOLUTE bss_start 2637 2638 alignb 4 2639 2640 ;------------------------------------------------------------------------------ 2641 ; IFF/ILBM DATA 2642 ;------------------------------------------------------------------------------ 2643 2644 00005294 LBM_FileHandle: resd 1 2645 00005298 LBM_FileSize: resd 1 2646 ; 2647 0000529C picture.width: resd 1 ; current picture width and height 2648 000052A0 picture.height: resd 1 2649 2650 ;------------------------------------------------------------------------------ 2651 2652 000052A4 dev_vendor: resd 1 2653 000052A8 bus_dev_fn: resd 1 2654 000052AC stats_cmd: resd 1 2655 000052B0 ac97_io_base: resw 1 2656 000052B2 ac97_int_ln_reg: resb 1 2657 000052B3 srb: resb 1 2658 2659 ; MODLOAD.ASM 2660 000052B4 FileHandle: resd 1 2661 000052B8 Header: resb ModHeader.size 2662 2663 ; MODPLAY.ASM 2664 ;MixSpeed: resw 1 2665 2666 ModInfo: 2667 000056F4 ModInfo.OrderLen: resb 1 2668 000056F5 ModInfo.ReStart: resb 1 2669 000056F6 ModInfo.Order: resb 128 2670 00005776 ModInfo.Patterns: resd 1 2671 2672 0000577A ModInfo.SampOfs: resw 31 2673 000057B8 ModInfo.SampSeg: resw 31 2674 000057F6 ModInfo.SampLen: resw 31 2675 00005834 ModInfo.SampRep: resw 31 2676 00005872 ModInfo.SampRepLen: resw 31 2677 000058B0 ModInfo.SampVol: resw 31 2678 2679 ; MODPLAY.ASM 2680 000058EE PitchTable: resw 857 ; 23/08/2020 2681 ;resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 2682 00005FA0 resw 3 ; 23/08/2020 2683 00005FA6 VolTable: resb 16640 2684 0000A0A6 MixBuffer resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017 2685 2686 ; MODPLAY.ASM 2687 0000C092 OrderPos: resb 1 2688 0000C093 Tempo: resb 1 2689 0000C094 TempoWait: resb 1 2690 0000C095 Bpm: resb 1 2691 0000C096 Row: resb 1 2692 0000C097 BreakRow: resb 1 2693 0000C098 BpmSamples: resw 1 2694 0000C09A BufPtr: resd 1 2695 0000C09E BufLen: resw 1 2696 0000C0A0 BufRep: resd 1 2697 0000C0A4 Note: resd 1 2698 ;Tracks: resb TrackInfo.size*NumTracks 2699 ; 07/10/2017 2700 0000C0A8 Tracks: resb TrackInfo.size*8 2701 2702 mod_file_name: 2703 0000C1D8 resb 80 2704 2705 ; 24/08/2020 2706 0000C228 counter: resb 1 2707 2708 ; 23/08/2020 2709 0000C229 alignb 16 2710 2711 ; PLAY.ASM 2712 ;Scope: resw 320 2713 0000C230 RowOfs: resw 256 2714 2715 ; 23/10/2017 2716 0000C430 NewScope_L: resw 256 2717 0000C630 NewScope_R: resw 256 2718 0000C830 OldScope_L: resw 256 2719 0000CA30 OldScope_R: resw 256 2720 2721 ; 20/10/2017 (modplay7.s, SB16) 2722 ; 19/10/2017 (modplay6.s, AC97) 2723 0000CC30 pan_shift: resb 1 2724 0000CC31 volume_level: resb 1 2725 2726 0000CC32 alignb 4096 2727 2728 Audio_Buffer: 2729 0000D000 resb BUFFERSIZE ; DMA Buffer Size / 2 (32768) 2730 ;temp_buffer: 2731 ; ;resb BUFFERSIZE / 4 ; 8192 2732 ; resb BUFFERSIZE / 2 ; 17/10/2017 2733 2734 00015000 alignb 65536 2735 2736 DMA_Buffer: 2737 00020000 resb 2*BUFFERSIZE ; 65536 ; 09/10/2017 2738 file_buffer: 2739 00030000 resb 65536*6 2740 EOF: