1 ; **************************************************************************** 2 ; tmodply2.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; TMODPLY2.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN 5 ; 6 ; 27/10/2017 7 ; 8 ; [ Last Modification: 27/12/2024 ] !!! 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 'tinyply3.s' ('TINYPLY3.PRG') 29 ; by Erdogan Tan (07/10/2017) 30 ; 31 ; Modified from 'playwav3.s' (13/06/2017) 32 ; 33 ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan 34 ; (23/06/2017) 35 ; 36 ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan 37 ; (04/03/2017) 38 ; Assembler: NASM 2.11 39 ; ---------------------------------------------------------------------------- 40 ; nasm tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG 41 ; **************************************************************************** 42 ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017) 43 ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017) 44 45 ; 01/03/2017 46 ; 16/10/2016 47 ; 29/04/2016 48 ; TRDOS 386 system calls (temporary list!) 49 _ver equ 0 50 _exit equ 1 51 _fork equ 2 52 _read equ 3 53 _write equ 4 54 _open equ 5 55 _close equ 6 56 _wait equ 7 57 _creat equ 8 58 _link equ 9 59 _unlink equ 10 60 _exec equ 11 61 _chdir equ 12 62 _time equ 13 63 _mkdir equ 14 64 _chmod equ 15 65 _chown equ 16 66 _break equ 17 67 _stat equ 18 68 _seek equ 19 69 _tell equ 20 70 _mount equ 21 71 _umount equ 22 72 _setuid equ 23 73 _getuid equ 24 74 _stime equ 25 75 _quit equ 26 76 _intr equ 27 77 _fstat equ 28 78 _emt equ 29 79 _mdate equ 30 80 _video equ 31 81 _audio equ 32 82 _timer equ 33 83 _sleep equ 34 84 _msg equ 35 85 _geterr equ 36 86 _fpsave equ 37 87 _pri equ 38 88 _rele equ 39 89 _fff equ 40 90 _fnf equ 41 91 _alloc equ 42 92 _dalloc equ 43 93 _calbac equ 44 94 95 %macro sys 1-4 96 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 97 ; 03/09/2015 98 ; 13/04/2015 99 ; Retro UNIX 386 v1 system call. 100 %if %0 >= 2 101 mov ebx, %2 102 %if %0 >= 3 103 mov ecx, %3 104 %if %0 = 4 105 mov edx, %4 106 %endif 107 %endif 108 %endif 109 mov eax, %1 110 ;int 30h 111 int 40h ; TRDOS 386 (TRDOS v2.0) 112 %endmacro 113 114 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 115 ; sys systemcall (eax) , , 116 117 ; 19/06/2017 118 BUFFERSIZE equ 32768 119 120 ; ---------------------------------------------------------------------------- 121 ; Tiny MOD Player v0.1b by Carlos Hasan. 122 ; July 14th, 1993. 123 124 ;============================================================================= 125 ; 126 ;============================================================================= 127 128 [BITS 32] 129 [org 0] 130 131 Start: 132 ; clear bss 133 00000000 B9[00000900] mov ecx, EOF 134 00000005 BF[74550000] mov edi, bss_start 135 0000000A 29F9 sub ecx, edi 136 0000000C D1E9 shr ecx, 1 137 0000000E 31C0 xor eax, eax 138 00000010 F366AB rep stosw 139 140 ; Detect (& Enable) AC'97 (ICH) Audio Device 141 00000013 E830020000 call DetectICH 142 00000018 731B jnc short GetFileName 143 144 _dev_not_ready: 145 ; couldn't find the audio device! 146 sys _msg, noDevMsg, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 0000001A BB[55020000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000001F B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 00000024 BA0F000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000029 B823000000 <1> mov eax, %1 110 <1> 111 0000002E CD40 <1> int 40h 147 00000030 E9F2010000 jmp Exit 148 149 GetFileName: 150 ;cmp ah, 1 ; SB16 Sound card 151 ;jne _dev_not_ready 152 153 00000035 89E6 mov esi, esp 154 00000037 AD lodsd 155 00000038 83F802 cmp eax, 2 ; two arguments 156 ; (program file name & mod file name) 157 0000003B 0F82EF010000 jb pmsg_usage ; nothing to do 158 159 00000041 AD lodsd ; program file name address 160 00000042 AD lodsd ; mod file name address (file to be read) 161 00000043 89C6 mov esi, eax 162 00000045 BF[D4E20000] mov edi, mod_file_name 163 ScanName: 164 0000004A AC lodsb 165 0000004B 84C0 test al, al 166 0000004D 0F84DD010000 je pmsg_usage 167 00000053 3C20 cmp al, 20h 168 00000055 74F3 je short ScanName ; scan start of name. 169 00000057 AA stosb 170 00000058 B4FF mov ah, 0FFh 171 a_0: 172 0000005A FEC4 inc ah 173 a_1: 174 0000005C AC lodsb 175 0000005D AA stosb 176 0000005E 3C2E cmp al, '.' 177 00000060 74F8 je short a_0 178 00000062 20C0 and al, al 179 00000064 75F6 jnz short a_1 180 181 00000066 08E4 or ah, ah ; if period NOT found, 182 00000068 750B jnz short PrintPMesg ; then add a .MOD extension. 183 SetExt: 184 0000006A 4F dec edi 185 0000006B C7072E4D4F44 mov dword [edi], '.MOD' 186 00000071 C6470400 mov byte [edi+4], 0 187 PrintPMesg: 188 ; Prints the Credits Text. 189 sys _msg, Credits, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000075 BB[53540000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000007A B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 0000007F BA0F000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000084 B823000000 <1> mov eax, %1 110 <1> 111 00000089 CD40 <1> int 40h 190 _1: 191 ; 19/06/2017 192 ; Allocate Audio Buffer (for user) 193 sys _audio, 0200h, BUFFERSIZE, Audio_Buffer 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 0000008B BB00020000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000090 B900800000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 00000095 BA[00F00000] <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000009A B820000000 <1> mov eax, %1 110 <1> 111 0000009F CD40 <1> int 40h 194 000000A1 0F8205010000 jc error_exit 195 _2: 196 ;; Initialize Audio Device (bl = 1 -> Interrupt method) 197 ;sys _audio, 0301h, 0, sb16_int_handler 198 ;jc error_exit 199 200 ; 20/10/2017 201 ; Initialize Audio Device (bl = 0 -> SRB method) 202 sys _audio, 0300h, 1, srb 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000000A7 BB00030000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 000000AC B901000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 000000B1 BA[95550000] <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000000B6 B820000000 <1> mov eax, %1 110 <1> 111 000000BB CD40 <1> int 40h 203 000000BD 0F82E9000000 jc error_exit 204 205 LoadMod: 206 000000C3 BF[D4E20000] mov edi, mod_file_name 207 000000C8 E888020000 call LoadModule ; Load the MODule... 208 ; 08/10/2017 209 000000CD 731B jnc short _3 ; any error loading? 210 211 ; yes, print error and Exit. 212 213 sys _msg, ErrorMesg, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000000CF BB[87540000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 000000D4 B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 000000D9 BA0F000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000000DE B823000000 <1> mov eax, %1 110 <1> 111 000000E3 CD40 <1> int 40h 214 000000E5 E93D010000 jmp Exit 215 _3: 216 ; 10/06/2017 217 sys _audio, 0E00h ; get audio controller info 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000000EA BB000E0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000000EF B820000000 <1> mov eax, %1 110 <1> 111 000000F4 CD40 <1> int 40h 218 000000F6 0F82B0000000 jc error_exit 219 220 ;cmp ah, 2 ; AC'97 (Intel ICH) Audio Controller 221 ;jne _dev_not_ready 222 223 ; EAX = IRQ Number in AL 224 ; Audio Device Number in AH 225 ; EBX = DEV/VENDOR ID 226 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 227 ; ECX = BUS/DEV/FN 228 ; (00000000BBBBBBBBDDDDDFFF00000000) 229 ; EDX = Base IO Addr (DX) for SB16 & VT8233 230 ; EDX = NABMBAR/NAMBAR (for AC97) 231 ; (Low word, DX = NAMBAR address) 232 233 000000FC A2[94550000] mov [ac97_int_ln_reg], al 234 00000101 891D[84550000] mov [dev_vendor], ebx 235 00000107 890D[88550000] mov [bus_dev_fn], ecx 236 0000010D 668915[90550000] mov [ac97_NamBar], dx 237 ;mov [ac97_NamBar], dx 238 ;shr dx, 16 239 ;mov [ac97_NabmBar], dx 240 00000114 8915[90550000] mov [ac97_NamBar], edx 241 242 0000011A E8F00A0000 call write_audio_dev_info 243 244 PlayNow: 245 0000011F E80A0A0000 call StartPlaying 246 247 ; load 32768 bytes into audio buffer 248 00000124 BF[00F00000] mov edi, Audio_Buffer 249 ; 19/10/2017 250 ;mov ebx, BUFFERSIZE 251 00000129 BB00200000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 252 0000012E E8A9080000 call GetSamples 253 00000133 7277 jc error_exit 254 255 ; 27/12/2024 256 ; bh = 16 : update (current, first) dma half buffer 257 ; bl = 0 : then switch to the next (second) half buffer 258 sys _audio, 1000h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000135 BB00100000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000013A B820000000 <1> mov eax, %1 110 <1> 111 0000013F CD40 <1> int 40h 259 260 ; 27/12/2024 261 ; load 32768 bytes into audio buffer 262 00000141 BF[00F00000] mov edi, Audio_Buffer 263 00000146 BB00200000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 264 0000014B E88C080000 call GetSamples 265 ;jc error_exit 266 267 ; ;mov ecx, 128 ; Make a lookup table 268 ; mov cl, 128 269 ; xor ebx, ebx ; for fastest pixel 270 ; mov edx, 320*(100-64) ; addressing. 271 ;MakeOfs: 272 ; mov [RowOfs+ebx], dx 273 ; mov [RowOfs+ebx+2], dx 274 ; add dx, 320 275 ; add ebx, 4 276 ; loop MakeOfs 277 278 ; 27/12/2024 279 00000150 B900010000 mov ecx, 256 280 ; 27/10/2017 281 ;mov cx, 256 282 00000155 31DB xor ebx, ebx 283 00000157 BF[D0D80000] mov edi, RowOfs 284 MakeOfs: 285 ; 29/10/2017 286 ;mov ax, 128 287 ;mul bx 288 ;mov al, ah 289 ;mov ah, 80 290 ;mul ah 291 0000015C 89D8 mov eax, ebx 292 0000015E 66C1E007 shl ax, 7 ; * 128 293 00000162 B050 mov al, 80 294 00000164 F6E4 mul ah 295 00000166 66AB stosw 296 00000168 43 inc ebx 297 00000169 E2F1 loop MakeOfs 298 299 ; 23/06/2017 300 ; Map DMA buffer to user's memory space 301 sys _audio, 0D00h, 65536, DMA_Buffer 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 0000016B BB000D0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000170 B900000100 <1> mov ecx, %3 104 <1> %if %0 = 4 105 00000175 BA[00000200] <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000017A B820000000 <1> mov eax, %1 110 <1> 111 0000017F CD40 <1> int 40h 302 ;jc error_exit 303 304 ; 24/06/2017 305 ; Set Master Volume Level (BL=0 or 80h) 306 ; for next playing (BL>=80h) 307 sys _audio, 0B80h, 1D1Dh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000181 BB800B0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000186 B91D1D0000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000018B B820000000 <1> mov eax, %1 110 <1> 111 00000190 CD40 <1> int 40h 308 309 ; 20/10/2017 310 00000192 C605[25E30000]1D mov byte [volume_level], 1Dh 311 312 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 313 314 ; 27/12/2024 315 ; Start to play 316 ;mov al, [bps] 317 ;shr al, 4 ; 8 -> 0, 16 -> 1 318 ;shl al, 1 ; 16 -> 2, 8 -> 0 319 ;mov bl, [stmo] 320 ;dec bl 321 ;or bl, al 322 ;mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 323 ;mov bh, 4 ; start to play 324 ;sys _audio 325 326 ;; SETUP SIGNAL RESPONSE BYTE 327 ;; 06/03/2017 328 ;mov bl, [ac97_int_ln_reg] ; IRQ number 329 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 330 ;mov edx, srb ; Signal Response/Return Byte address 331 ;mov ecx, 0FFh ; Signal Response/Return Byte value 332 ;sys _calbac 333 ;jc short error_exit 334 335 ; DIRECT VGA MEMORY ACCESS 336 ; bl = 0, bh = 5 337 ; Direct access/map to VGA memory (0A0000h) 338 339 sys _video, 0500h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000199 BB00050000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000019E B81F000000 <1> mov eax, %1 110 <1> 111 000001A3 CD40 <1> int 40h 340 000001A5 3D00000A00 cmp eax, 0A0000h 341 000001AA 7418 je short _a3 342 error_exit: 343 sys _msg, trdos386_err_msg, 255, 0Eh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000001AC BB[A4540000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 000001B1 B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 000001B6 BA0E000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000001BB B823000000 <1> mov eax, %1 110 <1> 111 000001C0 CD40 <1> int 40h 344 000001C2 EB63 jmp short Exit 345 346 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 347 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 348 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 349 ; second, or the module will sound "looped". 350 ; Because we need better sync with the ModPlayer to draw the scope, 351 ; the polling is called from my routine, and then the irq 0 must be 352 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 353 ; samples played by the Sound Blaster. Note that some samples are 354 ; discarded in the next code, just for fun! 355 356 _a3: 357 ;mov ax, 0013h ; Set Mode 320x200x256 358 ;int 31h 359 360 ; 21/10/2017 361 ;mov ax, 0012h ; Set Mode 640x480x16 362 ;int 31h 363 364 ; 22/10/2017 365 000001C4 E8060C0000 call setgraphmode ; Set video mode to 640*480x16 366 367 ; 22/10/2017 368 ;call loadlbm 369 ;jc short loadlbm_err 370 371 000001C9 BE[FC0F0000] mov esi, LOGO_ADDRESS 372 000001CE E8EE0C0000 call putlbm 373 ;jnc short loadlbm_ok 374 000001D3 731F jnc short _a4 ; 375 376 ;mov byte [error_color], 0Eh ; Yellow 377 378 loadlbm_err: 379 ; 21/10/2017 380 ;mov ax, 0003h ; Set Text Mode 80x25x16 381 ;int 31h 382 ; 22/10/2017 383 000001D5 E8120C0000 call settextmode 384 385 sys _msg, LOGO_ERROR_MSG, 255, [error_color] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000001DA BB[CF0F0000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 000001DF B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 000001E4 8B15[F3010000] <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000001EA B823000000 <1> mov eax, %1 110 <1> 111 000001EF CD40 <1> int 40h 386 000001F1 EB34 jmp short Exit 387 388 ; 21/10/2017 389 error_color: 390 000001F3 0C db 0Ch ; Light Red 391 392 loadlbm_ok: 393 ; 21/10/2017 394 _a4: 395 ; 27/12/2024 396 ; Start to play 397 000001F4 A0[CA540000] mov al, [bps] 398 000001F9 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 399 000001FC D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 400 000001FE 8A1D[C9540000] mov bl, [stmo] 401 00000204 FECB dec bl 402 00000206 08C3 or bl, al 403 00000208 668B0D[CB540000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 404 0000020F B704 mov bh, 4 ; start to play 405 sys _audio 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000211 B820000000 <1> mov eax, %1 110 <1> 111 00000216 CD40 <1> int 40h 406 407 ; 24/06/2017 408 00000218 E863000000 call PlayMod ; 13/02/2017 (ModPlay) 409 410 _s_exit: 411 0000021D E8BC090000 call StopPlaying ; STOP! 412 413 ; 22/10/2017 414 ;mov ax, 0003h ; Set Text Mode 80x25x16 415 ;int 31h 416 00000222 E8C50B0000 call settextmode 417 Exit: 418 ;call FreeModule ; Free MODule core. 419 420 sys _exit ; Bye ! 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000227 B801000000 <1> mov eax, %1 110 <1> 111 0000022C CD40 <1> int 40h 421 here: 422 0000022E EBFE jmp short here 423 424 pmsg_usage: 425 sys _msg, msg_usage, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000230 BB[DD530000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000235 B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 0000023A BA0F000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000023F B823000000 <1> mov eax, %1 110 <1> 111 00000244 CD40 <1> int 40h 426 00000246 EBDF jmp short Exit 427 428 DetectICH: 429 ; 24/06/2017 430 ; Detect (BH=1) AC97 (BL=2) Audio Controller 431 sys _audio, 0102h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000248 BB02010000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000024D B820000000 <1> mov eax, %1 110 <1> 111 00000252 CD40 <1> int 40h 432 00000254 C3 retn 433 434 noDevMsg: 435 00000255 4572726F723A20556E- db "Error: Unable to find AC97 audio device!",13,10,0 435 0000025E 61626C6520746F2066- 435 00000267 696E64204143393720- 435 00000270 617564696F20646576- 435 00000279 696365210D0A00 436 437 ;ac97_int_handler: 438 ; ; 19/06/2017 439 ; mov byte [srb], 1 ; interrupt (or signal response byte) 440 ; 441 ; sys _rele ; return from callback service 442 ; ; we must not come here ! 443 ; sys _exit 444 445 ;============================================================================= 446 ; 447 ;============================================================================= 448 449 ; 27/12/2024 450 PlayMod: 451 ; 27/10/2017 452 ; 19/10/2017 453 ; 23/06/2017 454 ; 21/06/2017 455 ; 19/06/2017 456 457 ; 05/03/2017 (TRDOS 386) 458 ; 14/02/2017 459 ; 13/02/2017 460 ; 08/12/2016 461 ; 28/11/2016 462 463 00000280 EB10 jmp short modp_gs ; 23/06/2017 464 p_loop: 465 00000282 803D[95550000]00 cmp byte [srb], 0 466 00000289 761C jna short q_loop 467 0000028B C605[95550000]00 mov byte [srb], 0 468 modp_gs: 469 00000292 BF[00F00000] mov edi, Audio_Buffer 470 ; 19/10/2017 471 ;mov ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017 472 00000297 BB00200000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 473 0000029C E83B070000 call GetSamples 474 000002A1 0F8205FFFFFF jc error_exit 475 q_loop: 476 000002A7 B401 mov ah, 1 ; any key pressed? 477 000002A9 CD32 int 32h ; no, Loop. 478 000002AB 745C jz short r_loop 479 480 000002AD B400 mov ah, 0 ; flush key buffer... 481 000002AF CD32 int 32h 482 483 ; 19/10/2017 (modplay6.s) 484 000002B1 3C20 cmp al, 20h 485 000002B3 740E je short change_pan 486 ; 09/10/2017 (playmod5.s) 487 000002B5 3C2B cmp al, '+' ; increase sound volume 488 000002B7 741D je short inc_volume_level 489 000002B9 3C2D cmp al, '-' 490 000002BB 743C je short dec_volume_level 491 492 ; 19/10/2017 (modplay6.s) 493 000002BD 24DF and al, 0DFh 494 000002BF 3C50 cmp al, 'P' 495 000002C1 7545 jne short q_return 496 497 change_pan: 498 ; 19/10/2017 (modplay6.s) 499 000002C3 8A0D[24E30000] mov cl, [pan_shift] 500 000002C9 FEC1 inc cl 501 000002CB 80E103 and cl, 3 502 000002CE 880D[24E30000] mov [pan_shift], cl 503 000002D4 EB33 jmp short r_loop 504 505 ; 09/10/2017 (playmod5.s) 506 ; 24/06/2017 (wavplay2.s) 507 inc_volume_level: 508 000002D6 8A0D[25E30000] mov cl, [volume_level] 509 000002DC 80F91F cmp cl, 1Fh ; 31 510 000002DF 7328 jnb short r_loop 511 000002E1 FEC1 inc cl 512 change_volume_level: 513 000002E3 880D[25E30000] mov [volume_level], cl 514 000002E9 88CD mov ch, cl 515 ; Set Master Volume Level 516 sys _audio, 0B00h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000002EB BB000B0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000002F0 B820000000 <1> mov eax, %1 110 <1> 111 000002F5 CD40 <1> int 40h 517 000002F7 EB10 jmp short r_loop 518 dec_volume_level: 519 000002F9 8A0D[25E30000] mov cl, [volume_level] 520 000002FF 80F901 cmp cl, 1 ; 1 521 00000302 7605 jna short r_loop 522 00000304 FEC9 dec cl 523 00000306 EBDB jmp short change_volume_level 524 525 q_return: 526 00000308 C3 retn 527 r_loop: 528 ;;; 529 ; 27/12/2024 530 sys _time, 4 ; get timer ticks (18.2 ticks/second) 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000309 BB04000000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 0000030E B80D000000 <1> mov eax, %1 110 <1> 111 00000313 CD40 <1> int 40h 531 00000315 3B05[D0E20000] cmp eax, [timerticks] 532 0000031B 0F8461FFFFFF je p_loop 533 00000321 A3[D0E20000] mov [timerticks], eax 534 ;;; 535 536 ; 27/10/2017 537 ; Get Current DMA buffer Pointer 538 ; 23/06/2017 ('modplay6.s') 539 ; bh = 15, get current pointer (DMA buffer offset) 540 ; bl = 0, for PCM OUT 541 ; ecx = 0 542 ; 543 sys _audio, 0F00h, 0 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000326 BB000F0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000032B B900000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000330 B820000000 <1> mov eax, %1 110 <1> 111 00000335 CD40 <1> int 40h 544 545 ; 28/10/2017 546 00000337 24FC and al, 0FCh ; dword alignment (stereo, 16 bit) 547 ; 23/06/2017 548 00000339 BE[00000200] mov esi, DMA_Buffer 549 0000033E 01C6 add esi, eax ; add offset value 550 ; 24/06/2017 551 00000340 B9[00FC0200] mov ecx, DMA_Buffer + (65536 - (256*4)) 552 00000345 39CE cmp esi, ecx 553 00000347 7602 jna short _4 554 00000349 89CE mov esi, ecx 555 _4: 556 ; 23/10/2017 ('tmodplay.s') 557 0000034B E8A30A0000 call drawscopes 558 559 00000350 E92DFFFFFF jmp p_loop 560 561 ;============================================================================= 562 ; MODLOAD.ASM 563 ;============================================================================= 564 565 ; Amiga Module Loader v0.1b by Carlos Hasan. 566 ; July 10th, 1993. 567 568 ; STRUCTURES 569 570 struc ModSample 571 00000000 .msName: resb 22 572 00000016 ???? .msLength: resw 1 573 00000018 ?? .msFinetune: resb 1 574 00000019 ?? .msVolume: resb 1 575 0000001A ???? .msRepeat: resw 1 576 0000001C ???? .msRepLen: resw 1 577 .size: ; 30 bytes 578 endstruc 579 580 struc ModHeader 581 00000000 .mhName: resb 20 582 00000014 .mhSamples: resb ModSample.size*31 583 000003B6 ?? .mhOrderLen: resb 1 584 000003B7 ?? .mhReStart: resb 1 585 000003B8 .mhOrder: resb 128 586 00000438 ???????? .mhSign: resw 2 587 .size: ; 1084 bytes 588 endstruc 589 590 struc ModInfoRec 591 00000000 ?? .OrderLen: resb 1 592 00000001 ?? .ReStart: resb 1 593 00000002 .Order: resb 128 594 00000082 ???????? .Patterns: resd 1 595 00000086 .SampOfs: resw 31 596 000000C4 .SampSeg: resw 31 597 00000102 .SampLen: resw 31 598 00000140 .SampRep: resw 31 599 0000017E .SampRepLen: resw 31 600 000001BC .SampVol: resw 31 601 .size: ; 506 bytes 602 endstruc 603 604 ; CODE 605 606 ; modplay5.s 607 ; 07/10/2017 608 ; tinyply3.s 609 ; 06/10/2017 610 ; 04/10/2017 611 ; /* MOD FileFormat */ 612 613 ID_MK equ 2E4B2E4Dh ; "M.K." 614 ID_FLT4 equ 34544C46h ; "FLT4" 615 ID_8CHN equ 4E484338h ; "8CHN" 616 ID_FLT8 equ 34544C46h ; "FLT8" 617 618 ; CODE 619 620 LoadModule: 621 ; edi = file name address 622 623 00000355 60 pushad 624 625 00000356 E878010000 call ClearModInfo 626 OpenFile: 627 ; ebx = ASCIIZ file name address 628 ; ecx = open mode (0 = open for read) 629 sys _open, edi, 0 ; open for reading 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 0000035B 89FB <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000035D B900000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000362 B805000000 <1> mov eax, %1 110 <1> 111 00000367 CD40 <1> int 40h 630 00000369 0F8262010000 jc Failed 631 0000036F A3[96550000] mov [FileHandle], eax 632 ReadHeader: 633 ; ebx = File handle 634 ; ecx = Buffer address 635 ; edx = Byte count 636 sys _read, [FileHandle], Header, ModHeader.size 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000374 8B1D[96550000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000037A B9[9A550000] <1> mov ecx, %3 104 <1> %if %0 = 4 105 0000037F BA3C040000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000384 B803000000 <1> mov eax, %1 110 <1> 111 00000389 CD40 <1> int 40h 637 0000038B 0F8231010000 jc CloseFile 638 CheckMK: 639 ; 04/10/2017 640 00000391 A1[D2590000] mov eax, [Header+ModHeader.mhSign] 641 642 00000396 3D4D2E4B2E cmp eax, ID_MK ; cmp eax, '.K.M' 643 ;je short Is4chnMod 644 0000039B 742B je short IsModFile 645 CheckFLT4: 646 0000039D 3D464C5434 cmp eax, ID_FLT4 ; cmp eax, '4TLF' 647 ;je short Is4chnMod 648 000003A2 7424 je short IsModFile 649 Check8CHN: 650 000003A4 3D3843484E cmp eax, ID_8CHN ; cmp eax, 'NHC8' 651 000003A9 740D je short Is8chnMod 652 CheckFLT8: 653 000003AB 3D464C5434 cmp eax, ID_FLT8 ; cmp eax, '8TLF' 654 ; 06/10/2017 655 000003B0 7406 je short Is8chnMod 656 000003B2 F9 stc 657 000003B3 E90A010000 jmp CloseFile 658 Is8chnMod: 659 000003B8 C605[C5540000]08 mov byte [numtracks], 8 ; 8-CHANNEL-MOD 660 000003BF C605[C4540000]0B mov byte [pattern_shift], 11 ; Pattern Size = 2048 bytes 661 000003C6 EB00 jmp short IsModFile 662 ;Is4chnMod: 663 ; mov byte [numtracks], 4 ; 4-CHANNEL-MOD 664 ; mov byte [pattern_shift], 11 ; Pattern Size = 1024 bytes 665 666 IsModFile: 667 000003C8 A0[50590000] mov al, [Header+ModHeader.mhOrderLen] 668 000003CD A2[D6590000] mov [ModInfo.OrderLen], al 669 670 000003D2 A0[51590000] mov al, [Header+ModHeader.mhReStart] 671 000003D7 3A05[50590000] cmp al, [Header+ModHeader.mhOrderLen] 672 000003DD 7202 jb short SetReStart 673 000003DF B07F mov al, 7Fh 674 SetReStart: 675 000003E1 A2[D7590000] mov [ModInfo.ReStart], al 676 677 ;mov ecx, 128 678 000003E6 66B98000 mov cx, 128 679 000003EA 31D2 xor edx, edx 680 000003EC 31DB xor ebx, ebx 681 CopyOrder: 682 000003EE 8AB3[52590000] mov dh, [Header+ModHeader.mhOrder+ebx] 683 000003F4 88B3[D8590000] mov [ModInfo.Order+ebx], dh 684 000003FA 38D6 cmp dh, dl 685 000003FC 7202 jb short NextOrder 686 000003FE 88F2 mov dl, dh ; Max. pattern number ; 04/10/2017 687 NextOrder: 688 00000400 43 inc ebx 689 00000401 E2EB loop CopyOrder 690 AllocPatterns: 691 00000403 81E2FF000000 and edx, 0FFh 692 ; 04/10/2017 693 ;inx dx ; 12/03/2017 694 00000409 FEC2 inc dl 695 ; dl = number of patterns (04/07/2017) 696 0000040B 8A0D[C4540000] mov cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels 697 00000411 D3E2 shl edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4) 698 ; *2048 ; (byte count of patterns *64*8*4) 699 ; 700 00000413 89D5 mov ebp, edx ; offset of samples (04/07/2017) 701 ;mov ecx, 10000h ; next 64K (4096*16) 702 00000415 B9[00000300] mov ecx, file_buffer ; 12/03/2017 703 ; 704 0000041A 890D[585A0000] mov [ModInfo.Patterns], ecx 705 ; 706 00000420 01CD add ebp, ecx ; next offset for samples 707 ReadPatterns: 708 ;mov ebx, [FileHandle] 709 ; ebx = File handle 710 ; ecx = Buffer address 711 ; edx = Byte count 712 sys _read, [FileHandle] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000422 8B1D[96550000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000428 B803000000 <1> mov eax, %1 110 <1> 111 0000042D CD40 <1> int 40h 713 0000042F 0F828D000000 jc CloseFile 714 715 ; patterns have been loaded here... (04/07/2017) 716 717 00000435 BE[AE550000] mov esi, Header+ModHeader.mhSamples 718 0000043A 31FF xor edi, edi 719 CopySamples: 720 0000043C 668B4616 mov ax, [esi+ModSample.msLength] 721 00000440 86E0 xchg al, ah 722 00000442 66D1E0 shl ax, 1 723 00000445 668987[D85A0000] mov [ModInfo.SampLen+edi], ax 724 0000044C 8A4619 mov al, [esi+ModSample.msVolume] 725 0000044F 30E4 xor ah, ah 726 00000451 668987[925B0000] mov [ModInfo.SampVol+edi], ax 727 00000458 668B461A mov ax, [esi+ModSample.msRepeat] 728 0000045C 86E0 xchg al, ah 729 0000045E 66D1E0 shl ax, 1 730 00000461 668987[165B0000] mov [ModInfo.SampRep+edi], ax 731 00000468 668B461C mov ax, [esi+ModSample.msRepLen] 732 0000046C 86E0 xchg al, ah 733 0000046E 66D1E0 shl ax, 1 734 00000471 668987[545B0000] mov [ModInfo.SampRepLen+edi], ax 735 00000478 83C61E add esi, ModSample.size 736 0000047B 6683C702 add di, 2 737 0000047F 6683FF3E cmp di, 2*31 738 00000483 72B7 jb short CopySamples 739 740 00000485 31F6 xor esi, esi 741 AllocSamples: 742 00000487 0FB796[D85A0000] movzx edx, word [ModInfo.SampLen+esi] 743 ; 07/10/2017 744 ;shr dx, 4 ; *** 745 0000048E 21D2 and edx, edx 746 00000490 7426 jz short NextSample 747 ;inc dx ; number of paragraphs ; *** 748 ;shl dx, 4 ; *** 749 00000492 89E8 mov eax, ebp 750 00000494 668986[5C5A0000] mov [ModInfo.SampOfs+esi], ax 751 0000049B C1E810 shr eax, 16 752 0000049E 668986[9A5A0000] mov [ModInfo.SampSeg+esi], ax 753 000004A5 89E9 mov ecx, ebp 754 000004A7 01D5 add ebp, edx ; next offset for sample 755 ReadSample: 756 ;mov ebx, [FileHandle] 757 ;movzx edx, [ModInfo.SampLen+esi] 758 ;mov ecx, [ModInfo.SampOfs+esi] 759 760 ; ebx = File handle 761 ; ecx = Buffer address 762 ; edx = Byte count 763 sys _read, [FileHandle] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000004A9 8B1D[96550000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000004AF B803000000 <1> mov eax, %1 110 <1> 111 000004B4 CD40 <1> int 40h 764 000004B6 720A jc short CloseFile 765 766 NextSample: 767 000004B8 6683C602 add si, 2 768 000004BC 6683FE3E cmp si, 2*31 769 000004C0 72C5 jb short AllocSamples 770 CloseFile: 771 000004C2 9C pushf 772 sys _close, [FileHandle] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000004C3 8B1D[96550000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 000004C9 B806000000 <1> mov eax, %1 110 <1> 111 000004CE CD40 <1> int 40h 773 000004D0 9D popf 774 Failed: 775 000004D1 61 popad 776 000004D2 C3 retn 777 778 FreeModule: 779 ; Erdogan Tan (13/02/2017) 780 ; nothing to do here for memory de-allocation 781 ClearModInfo: 782 000004D3 57 push edi 783 000004D4 BF[D6590000] mov edi, ModInfo 784 000004D9 B9FA010000 mov ecx, ModInfoRec.size 785 ;cld 786 000004DE 30C0 xor al, al 787 000004E0 F3AA rep stosb 788 000004E2 5F pop edi 789 000004E3 C3 retn 790 791 ;============================================================================= 792 ; MODPLAY.ASM 793 ;============================================================================= 794 795 ; Amiga Module Loader v0.3b by Carlos Hasan. 796 ; July 23th, 1993. 797 798 ; EQUATES 799 800 ;NumTracks equ 4 ; 07/10/2017 ([numtracks]) 801 DefTempo equ 6 802 DefBpm equ 125 803 MidCRate equ 8448 804 MixBufSize equ 4096 805 ;MixBufSize equ 7680 ; 17/10/2017 ; ((48000/50)*8) 806 807 ; STRUCTURES 808 809 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 810 00000000 ???????? .Samples: resd 1 811 ;.Position: resw 1 812 00000004 ???????? .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 813 00000008 ???? .Len: resw 1 814 0000000A ???? .Repeat: resw 1 815 0000000C ???? .RepLen: resw 1 816 0000000E ?? .Volume: resb 1 ; Volume 817 0000000F ?? .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 818 ;.Error: resb 1 819 ;.Reserved: resb 1 ; 01/10/2017 820 00000010 ???? .Period: resw 1 ; Period 821 00000012 ???? .Pitch: resw 1 822 00000014 ???? .Effect: resw 1 ; Effect 823 00000016 ???? .PortTo: resw 1 ; Toneporta wanted period 824 00000018 ?? .PortParm: resb 1 ; Toneporta speed 825 00000019 ?? .VibPos: resb 1 ; Vibrato wave position 826 0000001A ?? .VibParm: resb 1 ; Vibrato depth/rate 827 0000001B ?? .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 828 0000001C ?? .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 829 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 830 0000001D ?? .Error: resb 1 ; 01/10/2017 831 0000001E ???????????? .Arp: resw 3 832 00000024 ???? .ArpIndex: resw 1 833 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 834 endstruc 835 836 ; CODE 837 838 ;-------------------------------------------------------------------------- 839 ; updatechannel - update the track using the current effect 840 ;-------------------------------------------------------------------------- 841 ; 842 ;-------------------------------------------------------------------------- 843 ; Track: Process the next in one track. 844 ; In: 845 ; ds:di - Track info Address. 846 ;-------------------------------------------------------------------------- 847 848 ; edi = Track info address 849 850 updatechannel: 851 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 852 853 000004E4 668B5714 mov dx, [edi+TrackInfo.Effect] 854 855 ;test dx, dx 856 ;je short None 857 ;cmp dh, 00h 858 ;je short Arpeggio 859 ;cmp dh, 01h 860 ;je short PortUp 861 ;cmp dh, 02h 862 ;je short PortDown 863 ;cmp dh, 03h 864 ;je TonePort 865 ;cmp dh, 04h 866 ;je Vibrato 867 ;cmp dh, 05h 868 ;je PortSlide 869 ;cmp dh, 06h 870 ;je VibSlide 871 ;cmp dh, 0Ah 872 ;je VolSlide 873 ;retn 874 875 000004E8 0FB6C6 movzx eax, dh 876 000004EB 240F and al, 0Fh 877 000004ED FF2485[D4520000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 878 efxnull: 879 None: 880 000004F4 C3 retn 881 efxarpeggio2: 882 ; 01/10/2017 883 000004F5 84D2 test dl, dl 884 000004F7 74FB jz short efxnull 885 Arpeggio: 886 000004F9 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 887 000004FD 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 888 00000502 66894712 mov [edi+TrackInfo.Pitch], ax 889 00000506 6683C302 add bx, 2 890 0000050A 6683FB06 cmp bx, 6 891 0000050E 7202 jb short SetArpIndex 892 00000510 31DB xor ebx, ebx 893 SetArpIndex: 894 00000512 66895F24 mov [edi+TrackInfo.ArpIndex], bx 895 00000516 C3 retn 896 efxportaup: 897 PortUp: 898 00000517 30F6 xor dh, dh 899 ;mov bx, [edi+TrackInfo.Period] 900 00000519 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 901 0000051D 6629D3 sub bx, dx 902 ;cmp bx, 113 903 00000520 6683FB1C cmp bx, 28 ; 01/10/2017 904 00000524 7D04 jge short NotSmall 905 ;mov bx, 113 906 00000526 66BB1C00 mov bx, 28 ; 01/10/2017 907 NotSmall: 908 0000052A 66895F10 mov [edi+TrackInfo.Period], bx 909 0000052E 6601DB add bx, bx 910 ;mov ax, [PitchTable+bx] 911 00000531 668B83[D05B0000] mov ax, [PitchTable+ebx] ; 02/10/2017 912 00000538 66894712 mov [edi+TrackInfo.Pitch], ax 913 0000053C C3 retn 914 efxportadown: 915 PortDown: 916 0000053D 30F6 xor dh, dh 917 ;mov bx, [edi+TrackInfo.Period] 918 0000053F 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 919 00000543 6601D3 add bx, dx 920 00000546 6681FB600D cmp bx, 3424 ; 01/10/2017 921 ;cmp bx, 856 922 0000054B 7E04 jle short NotBig 923 ;mov bx, 856 924 0000054D 66BB600D mov bx, 3424 ; 01/10/2017 925 NotBig: 926 00000551 66895F10 mov [edi+TrackInfo.Period], bx 927 00000555 6601DB add bx, bx 928 ;mov ax, [PitchTable+bx] 929 00000558 668B83[D05B0000] mov ax, [PitchTable+ebx] ; 02/10/2017 930 0000055F 66894712 mov [edi+TrackInfo.Pitch], ax 931 00000563 C3 retn 932 efxtoneporta2: 933 TonePort: 934 00000564 30F6 xor dh, dh 935 00000566 668B4716 mov ax, [edi+TrackInfo.PortTo] 936 ;mov bx, [edi+TrackInfo.Period] 937 0000056A 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 938 0000056E 6639C3 cmp bx, ax 939 00000571 7429 je short NoPort 940 00000573 7F0D jg short PortToUp 941 PortToDown: 942 00000575 6601D3 add bx, dx 943 00000578 6639C3 cmp bx, ax 944 0000057B 7E0D jle short SetPort 945 FixPort: 946 0000057D 6689C3 mov bx, ax 947 00000580 EB08 jmp short SetPort 948 PortToUp: 949 00000582 6629D3 sub bx, dx 950 00000585 6639C3 cmp bx, ax 951 00000588 7CF3 jl short FixPort 952 SetPort: 953 0000058A 66895F10 mov [edi+TrackInfo.Period], bx 954 0000058E 6601DB add bx, bx 955 ;mov ax, [PitchTable+bx] 956 00000591 668B83[D05B0000] mov ax, [PitchTable+ebx] ; 02/10/2017 957 00000598 66894712 mov [edi+TrackInfo.Pitch], ax 958 NoPort: 959 0000059C C3 retn 960 efxvibrato2: 961 ; 01/10/2017 962 Vibrato: 963 0000059D 88D6 mov dh, dl 964 ;and dl, 0Fh 965 ;shr dh, 4 966 ;shl dh, 2 967 0000059F 6681E20FF0 and dx, 0F00Fh 968 000005A4 C0EE02 shr dh, 2 969 ;add [edi+TrackInfo.VibPos], dh 970 ;mov dh, [edi+TrackInfo.VibPos] 971 ;mov bl, dh 972 000005A7 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 973 000005AA 007719 add [edi+TrackInfo.VibPos], dh 974 000005AD 88DE mov dh, bl ; 01/10/2017 975 000005AF C0EB02 shr bl, 2 976 ;and bx, 1Fh 977 ;mov al, [SinTable+bx] 978 000005B2 83E31F and ebx, 1Fh 979 000005B5 8A83[BC530000] mov al, [SinTable+ebx] 980 000005BB F6E2 mul dl 981 ;rol ax, 1 982 ;xchg al, ah 983 ;and ah, 1 984 000005BD 66C1E807 shr ax, 7 985 000005C1 84F6 test dh, dh 986 000005C3 7903 jns short VibUp 987 000005C5 66F7D8 neg ax 988 VibUp: 989 000005C8 66034710 add ax, [edi+TrackInfo.Period] 990 000005CC 6689C3 mov bx, ax 991 ;movzx ebx, ax 992 000005CF 6683FB71 cmp bx, 113 993 ;cmp bx, 113 994 000005D3 6683FB1C cmp bx, 28 ; 01/10/2017 995 000005D7 7D06 jge short NoLoVib 996 ;mov bx, 113 997 000005D9 66BB1C00 mov bx, 28 ; 01/10/2017 998 000005DD EB0B jmp short NoHiVib ; 01/10/2017 999 NoLoVib: 1000 000005DF 6681FB600D cmp bx, 3424 ; 01/10/2017 1001 ;cmp bx, 856 1002 000005E4 7E04 jle short NoHiVib 1003 ;mov bx, 856 1004 000005E6 66BB600D mov bx, 3424 ; 01/10/2017 1005 NoHiVib: 1006 000005EA 6601DB add bx, bx 1007 ;mov ax, [PitchTable+bx] 1008 000005ED 668B83[D05B0000] mov ax, [PitchTable+ebx] ; 01/10/2017 1009 000005F4 66894712 mov [edi+TrackInfo.Pitch], ax 1010 000005F8 C3 retn 1011 efxtoneslide: 1012 PortSlide: 1013 000005F9 E812000000 call VolSlide 1014 000005FE 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1015 00000601 E95EFFFFFF jmp TonePort ; efxtoneporta2 1016 efxvibslide: 1017 VibSlide: 1018 00000606 E805000000 call VolSlide 1019 0000060B 8A571A mov dl, [edi+TrackInfo.VibParm] 1020 0000060E EB8D jmp short Vibrato ; efxvibrato2 1021 efxvolslide: 1022 VolSlide: 1023 00000610 88D6 mov dh, dl 1024 00000612 80E20F and dl, 0Fh 1025 00000615 C0EE04 shr dh, 4 1026 00000618 8A470E mov al, [edi+TrackInfo.Volume] 1027 0000061B 28D0 sub al, dl 1028 0000061D 7D02 jge short NoLoVol 1029 0000061F 30C0 xor al, al 1030 NoLoVol: 1031 00000621 00F0 add al, dh 1032 00000623 3C40 cmp al, 64 1033 00000625 7602 jbe short NoHiVol 1034 00000627 B040 mov al, 64 1035 NoHiVol: 1036 00000629 88470E mov [edi+TrackInfo.Volume], al 1037 0000062C C3 retn 1038 1039 efxtremolo2: 1040 ; 01/10/2017 (TMODPLAY.ASM) 1041 Tremolo: 1042 0000062D 88D6 mov dh, dl 1043 0000062F 6681E20FF0 and dx, 0F00Fh 1044 00000634 C0EE02 shr dh, 2 1045 00000637 8A5F1B mov bl, [edi+TrackInfo.TremPos] 1046 0000063A 00771B add [edi+TrackInfo.TremPos], dh 1047 0000063D 88DE mov dh, bl 1048 0000063F C0EB02 shr bl, 2 1049 ; 01/10/2017 - TRDOS 386 1050 ;and bx, 1Fh 1051 00000642 83E31F and ebx, 1Fh 1052 ;mov al, [SinTable+bx] 1053 00000645 8A83[BC530000] mov al, [SinTable+ebx] 1054 0000064B F6E2 mul dl 1055 0000064D 66C1E806 shr ax, 6 1056 00000651 84F6 test dh, dh 1057 00000653 7D03 jge short Tremolo_1 ; efxtremolof2 1058 00000655 66F7D8 neg ax 1059 efxtremolof2: 1060 Tremolo_1: 1061 00000658 8A670E mov ah, [edi+TrackInfo.Volume] 1062 0000065B 00E0 add al, ah 1063 0000065D 7D02 jge short Tremolo_2 ; efxtremolof3 1064 0000065F 30C0 xor al, al 1065 efxtremolof3: 1066 Tremolo_2: 1067 00000661 3C40 cmp al, 64 ; 40h 1068 00000663 7E02 jle short Tremolo_3 ; efxtremolof4 1069 00000665 B040 mov al, 64 ; 40h 1070 efxtremolof4: 1071 Tremolo_3: 1072 00000667 28E0 sub al, ah ; ****** 1073 00000669 88470F mov [edi+TrackInfo.VolDiff], al 1074 0000066C C3 retn 1075 1076 ;-------------------------------------------------------------------------- 1077 ; readchannel - read the next note event from the pattern sheet 1078 ;-------------------------------------------------------------------------- 1079 ; 1080 ;-------------------------------------------------------------------------- 1081 ; GetTrack: Get the next Note from a pattern. 1082 ; In: 1083 ; ds:di - Track info Address. 1084 ; es:si - Pattern Note Address. 1085 ; Out: 1086 ; es:si - The Next Pattern Note address. 1087 ;-------------------------------------------------------------------------- 1088 1089 ; esi = Pattern note address 1090 ; edi = Track info address 1091 1092 readchannel: 1093 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1094 0000066D 66AD lodsw 1095 0000066F 86E0 xchg al, ah 1096 00000671 88E3 mov bl, ah 1097 00000673 80E40F and ah, 0Fh 1098 00000676 6689C1 mov cx, ax 1099 00000679 66AD lodsw 1100 0000067B 86E0 xchg al, ah 1101 0000067D 88E7 mov bh, ah 1102 0000067F 80E40F and ah, 0Fh 1103 00000682 6689C2 mov dx, ax 1104 00000685 66895714 mov [edi+TrackInfo.Effect], dx 1105 ; 01/10/2017 - TRDOS 386 1106 ;and bl, 0F0h 1107 00000689 81E3F0FF0000 and ebx, 0FFF0h 1108 0000068F C0EF04 shr bh, 4 1109 00000692 08FB or bl, bh 1110 00000694 7446 jz short SetPeriod 1111 SetSample: 1112 00000696 30FF xor bh, bh 1113 ;and ebx, 0FFh 1114 00000698 FECB dec bl 1115 0000069A 01DB add ebx, ebx 1116 0000069C 668B83[925B0000] mov ax, [ModInfo.SampVol+ebx] 1117 000006A3 88470E mov [edi+TrackInfo.Volume], al 1118 000006A6 668B83[5C5A0000] mov ax, [ModInfo.SampOfs+ebx] 1119 000006AD 668907 mov [edi+TrackInfo.Samples], ax 1120 000006B0 668B83[9A5A0000] mov ax, [ModInfo.SampSeg+ebx] 1121 000006B7 66894702 mov [edi+TrackInfo.Samples+2], ax 1122 000006BB 668B83[D85A0000] mov ax, [ModInfo.SampLen+ebx] 1123 000006C2 66894708 mov [edi+TrackInfo.Len], ax 1124 000006C6 668B83[165B0000] mov ax, [ModInfo.SampRep+ebx] 1125 000006CD 6689470A mov [edi+TrackInfo.Repeat], ax 1126 000006D1 668B83[545B0000] mov ax, [ModInfo.SampRepLen+ebx] 1127 000006D8 6689470C mov [edi+TrackInfo.RepLen], ax 1128 SetPeriod: 1129 000006DC 6685C9 test cx, cx 1130 000006DF 7425 jz short SetEffect 1131 1132 000006E1 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1133 1134 000006E5 80FE03 cmp dh, 03h 1135 ;je short SetEffect 1136 000006E8 7428 je short efxtoneporta ; 01/10/2017 1137 1138 000006EA 66894F10 mov [edi+TrackInfo.Period], cx 1139 ;movzx ebx, cx 1140 000006EE 6689CB mov bx, cx 1141 000006F1 6601DB add bx, bx 1142 ;mov ax, [PitchTable+bx] 1143 000006F4 668B83[D05B0000] mov ax, [PitchTable+ebx] ; 01/10/2017 1144 000006FB 66894712 mov [edi+TrackInfo.Pitch], ax 1145 000006FF C7470400000000 mov dword [edi+TrackInfo.Position], 0 1146 SetEffect: 1147 ;test dx, dx 1148 ;je short InitNone 1149 ;cmp dh, 00h 1150 ;je InitArpeggio 1151 ;cmp dh, 03h 1152 ;je short InitTonePort 1153 ;cmp dh, 04h 1154 ;je short InitVibrato 1155 ;cmp dh, 09h 1156 ;je short SampleOfs 1157 ;cmp dh, 0Bh 1158 ;je short PosJump 1159 ;cmp dh, 0Ch 1160 ;je short SetVolume 1161 ;cmp dh, 0Dh 1162 ;je short Break 1163 ;cmp dh, 0Fh 1164 ;je SetSpeed 1165 ;retn 1166 1167 ; 01/10/2017 (TMODPLAY.ASM) 1168 1169 ; dx = [di+TrackInfo.Effect] 1170 1171 00000706 0FB6C6 movzx eax, dh 1172 00000709 240F and al, 0Fh 1173 0000070B FF2485[94520000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1174 ;efxnull: 1175 ;InitNone: 1176 ; retn 1177 efxtoneporta: 1178 ; 01/10/2017 1179 ; cx = period 1180 ;mov [edi+TrackInfo.PortTo], cx ; * 1181 InitTonePort: 1182 00000712 84D2 test dl, dl 1183 00000714 7503 jnz short SetPortParm 1184 00000716 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1185 SetPortParm: 1186 00000719 885718 mov [edi+TrackInfo.PortParm], dl 1187 0000071C 66895714 mov [edi+TrackInfo.Effect], dx 1188 00000720 C3 retn 1189 efxvibrato: 1190 InitVibrato: 1191 00000721 8A471A mov al, [edi+TrackInfo.VibParm] 1192 00000724 88C4 mov ah, al 1193 ;and al, 0Fh 1194 ;and ah, 0F0h 1195 00000726 66250FF0 and ax, 0F00Fh 1196 0000072A F6C20F test dl, 0Fh 1197 0000072D 7502 jne short OkDepth 1198 0000072F 08C2 or dl, al 1199 OkDepth: 1200 00000731 F6C2F0 test dl, 0F0h 1201 00000734 7502 jnz short OkRate 1202 00000736 08E2 or dl, ah 1203 OkRate: 1204 00000738 88571A mov [edi+TrackInfo.VibParm], dl 1205 0000073B 66895714 mov [edi+TrackInfo.Effect], dx 1206 0000073F 6685C9 test cx, cx 1207 00000742 7404 jz short OkPos 1208 00000744 C6471900 mov byte [edi+TrackInfo.VibPos], 0 1209 OkPos: 1210 00000748 C3 retn 1211 efxsampoffset: 1212 ; 01/10/2017 ; ******* 1213 SampleOfs: 1214 ; test dl, dl 1215 ; jnz short SetSampleOfs 1216 ; mov dl, [edi+TrackInfo.OldSampOfs] 1217 ;SetSampleOfs: 1218 ; mov [edi+TrackInfo.OldSampOfs], dl 1219 00000749 88D6 mov dh, dl 1220 0000074B 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1221 00000751 895704 mov [edi+TrackInfo.Position], edx 1222 00000754 C3 retn 1223 efxpattjump: 1224 PosJump: 1225 00000755 8815[7ED70000] mov [OrderPos], dl 1226 0000075B C605[82D70000]40 mov byte [Row], 64 1227 00000762 C3 retn 1228 efxsetvolume: 1229 SetVolume: 1230 00000763 80FA40 cmp dl, 64 1231 00000766 7602 jbe short OkVol 1232 00000768 B240 mov dl, 64 1233 OkVol: 1234 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1235 0000076A 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1236 ;mov [edi+TrackInfo.Volume], dl 1237 0000076C 6689570E mov [edi+TrackInfo.Volume], dx 1238 00000770 C3 retn 1239 efxbreak: 1240 Break: 1241 00000771 88D6 mov dh, dl 1242 00000773 80E20F and dl, 0Fh 1243 00000776 C0EE04 shr dh, 4 1244 00000779 00F6 add dh, dh 1245 0000077B 00F2 add dl, dh 1246 0000077D C0E602 shl dh, 2 1247 00000780 00F2 add dl, dh 1248 00000782 8815[83D70000] mov [BreakRow], dl 1249 00000788 C605[82D70000]40 mov byte [Row], 64 1250 0000078F C3 retn 1251 efxsetspeed: 1252 SetSpeed: 1253 00000790 84D2 test dl,dl 1254 00000792 7432 je Skip 1255 00000794 80FA1F cmp dl,31 1256 00000797 770D ja short SetBpm 1257 SetTempo: 1258 00000799 8815[7FD70000] mov [Tempo], dl 1259 0000079F 8815[80D70000] mov [TempoWait], dl 1260 000007A5 C3 retn 1261 SetBpm: 1262 000007A6 8815[81D70000] mov [Bpm], dl 1263 000007AC B067 mov al, 103 1264 000007AE F6E2 mul dl 1265 000007B0 88E3 mov bl, ah 1266 000007B2 30FF xor bh, bh 1267 000007B4 66A1[CB540000] mov ax, [MixSpeed] 1268 000007BA 6631D2 xor dx, dx 1269 000007BD 66F7F3 div bx 1270 000007C0 66A3[84D70000] mov [BpmSamples], ax 1271 Skip: 1272 000007C6 C3 retn 1273 efxarpeggio: 1274 ; 01/10/2017 1275 000007C7 84D2 test dl, dl 1276 ;je efxnull 1277 000007C9 74FB je short Skip 1278 InitArpeggio: 1279 000007CB 88D6 mov dh, dl 1280 000007CD 80E20F and dl, 0Fh 1281 000007D0 C0EE04 shr dh, 4 1282 ; 01/10/2017 1283 ;mov cx, 36 1284 000007D3 66B95400 mov cx, 84 ; 84 notes/periods 1285 000007D7 31DB xor ebx, ebx 1286 000007D9 668B4710 mov ax, [edi+TrackInfo.Period] 1287 gt_ScanPeriod: 1288 ;cmp ax, [PeriodTable+bx] 1289 000007DD 663B83[14530000] cmp ax, [PeriodTable+ebx] 1290 000007E4 7306 jae short SetArp 1291 000007E6 6683C302 add bx, 2 1292 000007EA E2F1 loop gt_ScanPeriod 1293 SetArp: 1294 000007EC 6601D2 add dx, dx 1295 000007EF 00DE add dh, bl 1296 000007F1 00DA add dl, bl 1297 ; 01/10/2017 1298 ;mov bx, [PeriodTable+bx] 1299 000007F3 668B9B[14530000] mov bx, [PeriodTable+ebx] 1300 ;add bx, bx 1301 000007FA 01DB add ebx, ebx 1302 ;mov ax, [PitchTable+bx] 1303 000007FC 668B83[D05B0000] mov ax, [PitchTable+ebx] 1304 00000803 6689471E mov [edi+TrackInfo.Arp], ax 1305 00000807 88F3 mov bl, dh 1306 00000809 30FF xor bh, bh 1307 0000080B 668B9B[14530000] mov bx, [PeriodTable+ebx] 1308 ;add bx, bx 1309 00000812 01DB add ebx, ebx 1310 ;mov ax, [PitchTable+bx] 1311 00000814 668B83[D05B0000] mov ax, [PitchTable+ebx] 1312 0000081B 66894720 mov [edi+TrackInfo.Arp+2], ax 1313 0000081F 88D3 mov bl, dl 1314 00000821 30FF xor bh, bh 1315 00000823 668B9B[14530000] mov bx, [PeriodTable+ebx] 1316 ;add bx, bx 1317 0000082A 01DB add ebx, ebx 1318 ;mov ax, [PitchTable+bx] 1319 0000082C 668B83[D05B0000] mov ax, [PitchTable+ebx] 1320 00000833 66894722 mov [edi+TrackInfo.Arp+4], ax 1321 00000837 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1322 0000083D C3 retn 1323 1324 efxtremolo: 1325 ; 01/10/2017 (TMODPLAY.ASM) 1326 InitTremolo: 1327 0000083E 8A471C mov al, [edi+TrackInfo.TremParm] 1328 00000841 88C4 mov ah, al 1329 00000843 66250FF0 and ax, 0F00Fh 1330 00000847 F6C20F test dl, 0Fh 1331 0000084A 7502 jnz short InitTremolo_1 ; efxtremolof0 1332 0000084C 08C2 or dl, al 1333 efxtremolof0: 1334 InitTremolo_1: 1335 0000084E F6C2F0 test dl, 0F0h 1336 00000851 7502 jnz short InitTremolo_2 ; efxtremolof1 1337 00000853 08E2 or dl, ah 1338 efxtremolof1: 1339 InitTremolo_2: 1340 00000855 88571C mov [edi+TrackInfo.TremParm], dl 1341 00000858 66895714 mov [edi+TrackInfo.Effect], dx 1342 0000085C C3 retn 1343 1344 ;-------------------------------------------------------------------------- 1345 ; pollmodule - polls the module player 1346 ;-------------------------------------------------------------------------- 1347 ;-------------------------------------------------------------------------- 1348 ; UpdateTracks: Main code to process the next tick to be played. 1349 ;-------------------------------------------------------------------------- 1350 1351 pollmodule: 1352 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1353 0000085D FE0D[80D70000] dec byte [TempoWait] 1354 00000863 7417 jz short GetTracks 1355 1356 ;mov ecx, NumTracks 1357 00000865 0FB70D[C5540000] movzx ecx, word [numtracks] ; 06/10/2017 1358 0000086C BF[94D70000] mov edi, Tracks 1359 BeatTracks: 1360 00000871 E86EFCFFFF call BeatTrack 1361 00000876 83C726 add edi, TrackInfo.size 1362 00000879 E2F6 loop BeatTracks 1363 0000087B C3 retn 1364 GetTracks: 1365 0000087C A0[7FD70000] mov al, [Tempo] 1366 00000881 A2[80D70000] mov [TempoWait], al 1367 1368 00000886 8B35[90D70000] mov esi, [Note] 1369 0000088C 803D[82D70000]40 cmp byte [Row], 64 1370 00000893 7268 jb short NoPattWrap 1371 1372 00000895 8B35[585A0000] mov esi, [ModInfo.Patterns] 1373 0000089B 8A1D[7ED70000] mov bl, [OrderPos] 1374 000008A1 3A1D[D6590000] cmp bl, [ModInfo.OrderLen] 1375 000008A7 7214 jb short NoOrderWrap 1376 000008A9 8A1D[D7590000] mov bl, [ModInfo.ReStart] 1377 000008AF 881D[7ED70000] mov [OrderPos], bl 1378 000008B5 3A1D[D6590000] cmp bl, [ModInfo.OrderLen] 1379 000008BB 7364 jae short NoUpdate 1380 NoOrderWrap: 1381 ;xor bh, bh 1382 000008BD 81E3FF000000 and ebx, 0FFh 1383 000008C3 8A9B[D8590000] mov bl, [ModInfo.Order+ebx] 1384 ; 05/10/2017 1385 ;shl ebx, 10 ; *1024 1386 000008C9 8A0D[C4540000] mov cl, [pattern_shift] ; 10 or 11 1387 000008CF D3E3 shl ebx, cl ; *1024 or *2048 1388 ; 1389 000008D1 01DE add esi, ebx 1390 000008D3 8A1D[83D70000] mov bl, [BreakRow] 1391 000008D9 881D[82D70000] mov [Row], bl 1392 ;xor bh, bh 1393 000008DF 81E3FF000000 and ebx, 0FFh 1394 000008E5 883D[83D70000] mov [BreakRow], bh ; 0 1395 000008EB 66C1E304 shl bx, 4 1396 000008EF 01DE add esi, ebx 1397 000008F1 8935[90D70000] mov [Note], esi 1398 000008F7 FE05[7ED70000] inc byte [OrderPos] 1399 NoPattWrap: 1400 000008FD FE05[82D70000] inc byte [Row] 1401 1402 ;cld 1403 ;mov ecx, NumTracks 1404 00000903 0FB70D[C5540000] movzx ecx, word [numtracks] ; 06/10/2017 1405 0000090A BF[94D70000] mov edi, Tracks 1406 GetTracks_next: 1407 0000090F 51 push ecx 1408 00000910 E858FDFFFF call GetTrack ; readchannel 1409 00000915 59 pop ecx 1410 00000916 83C726 add edi, TrackInfo.size 1411 00000919 E2F4 loop GetTracks_next 1412 1413 0000091B 8935[90D70000] mov [Note], esi 1414 NoUpdate: 1415 00000921 C3 retn 1416 1417 ;-------------------------------------------------------------------------- 1418 ; MixTrack: Mixes one track into a CLEAN buffer. 1419 ; In: 1420 ; ds:si - Track Info Address. 1421 ; ds:di - Buffer Address. 1422 ; cx - Buffer Size. 1423 ;-------------------------------------------------------------------------- 1424 1425 ; esi = Track info address 1426 ; edi = Buffer address 1427 ; ecx = Buffer size 1428 1429 MixTrack: 1430 00000922 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1431 00000927 7757 ja short MixLooped 1432 MixNonLooped: 1433 00000929 8B16 mov edx, [esi+TrackInfo.Samples] 1434 0000092B 8B5E04 mov ebx, [esi+TrackInfo.Position] 1435 0000092E 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1436 00000932 52 push edx 1437 00000933 56 push esi 1438 00000934 01D3 add ebx, edx 1439 00000936 01D5 add ebp, edx 1440 00000938 668B5612 mov dx, [esi+TrackInfo.Pitch] 1441 ; 01/10/2017 1442 ;mov al, [esi+TrackInfo.Volume] 1443 0000093C 668B460E mov ax, [esi+TrackInfo.Volume] 1444 ; ah = [esi+TrackInfo.VolDiff] 1445 00000940 00E0 add al, ah ; ****** 1446 00000942 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1447 00000946 8A661D mov ah, [esi+TrackInfo.Error] 1448 00000949 89DE mov esi, ebx 1449 0000094B 31DB xor ebx, ebx ; 01/10/2017 ; * 1450 0000094D 88C7 mov bh, al 1451 0000094F 88D0 mov al, dl 1452 00000951 88F2 mov dl, dh 1453 ;xor dh, dh 1454 00000953 81E2FF000000 and edx, 0FFh 1455 nlMixSamp: 1456 00000959 39EE cmp esi, ebp 1457 0000095B 7316 jae short nlMixBye 1458 0000095D 8A1E mov bl, [esi] 1459 ;mov bl, [VolTable+bx] 1460 0000095F 8A9B[92760000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1461 ; 17/10/2017 1462 00000965 001F add [edi], bl 1463 ; 18/10/2017 1464 00000967 00C4 add ah, al 1465 00000969 11D6 adc esi, edx 1466 0000096B 033D[C5540000] add edi, [numtracks] 1467 00000971 E2E6 loop nlMixSamp 1468 nlMixBye: 1469 00000973 89F3 mov ebx, esi 1470 00000975 5E pop esi 1471 00000976 5A pop edx 1472 00000977 29D3 sub ebx, edx 1473 00000979 895E04 mov [esi+TrackInfo.Position], ebx 1474 0000097C 88661D mov [esi+TrackInfo.Error], ah 1475 0000097F C3 retn 1476 MixLooped: 1477 00000980 8B16 mov edx, [esi+TrackInfo.Samples] 1478 00000982 8B5E04 mov ebx, [esi+TrackInfo.Position] 1479 00000985 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1480 00000989 892D[8CD70000] mov [BufRep], ebp 1481 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1482 0000098F 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1483 00000993 52 push edx 1484 00000994 56 push esi 1485 00000995 01D3 add ebx, edx 1486 00000997 01D5 add ebp, edx 1487 00000999 668B5612 mov dx, [esi+TrackInfo.Pitch] 1488 ; 01/10/2017 1489 ;mov al, [esi+TrackInfo.Volume] 1490 0000099D 668B460E mov ax, [esi+TrackInfo.Volume] 1491 ; ah = [esi+TrackInfo.VolDiff] 1492 000009A1 00E0 add al, ah ; ****** 1493 000009A3 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1494 000009A7 8A661D mov ah, [esi+TrackInfo.Error] 1495 ;mov si, bx 1496 000009AA 89DE mov esi, ebx ; 04/09/2017 1497 000009AC 31DB xor ebx, ebx ; 01/10/2017 ; * 1498 000009AE 88C7 mov bh, al 1499 000009B0 88D0 mov al, dl 1500 000009B2 88F2 mov dl, dh 1501 ;xor dh, dh 1502 000009B4 81E2FF000000 and edx, 0FFh 1503 lpMixSamp: 1504 000009BA 39EE cmp esi, ebp 1505 000009BC 7206 jb short lpMixNow 1506 000009BE 2B35[8CD70000] sub esi, [BufRep] 1507 lpMixNow: 1508 000009C4 8A1E mov bl, [esi] 1509 ;mov bl, [VolTable+bx] 1510 000009C6 8A9B[92760000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1511 ; 17/10/2017 1512 000009CC 001F add [edi], bl 1513 ; 18/10/2017 1514 000009CE 00C4 add ah, al 1515 000009D0 11D6 adc esi, edx 1516 000009D2 033D[C5540000] add edi, [numtracks] 1517 000009D8 E2E0 loop lpMixSamp 1518 lpMixBye: 1519 ; mov ebx, esi 1520 ; pop esi 1521 ; pop edx 1522 ; sub ebx, edx 1523 ; mov [esi+TrackInfo.Position], ebx 1524 ; mov [esi+TrackInfo.Error], ah 1525 ; retn 1526 000009DA EB97 jmp short nlMixBye 1527 1528 ;-------------------------------------------------------------------------- 1529 ; mixpoll - updates the output buffer 1530 ;-------------------------------------------------------------------------- 1531 ; 1532 ;-------------------------------------------------------------------------- 1533 ; GetSamples: Returns the next chunk of samples to be played. 1534 ; In: 1535 ; Buffer - Buffer Address. 1536 ; Count - Buffer Size. 1537 ;-------------------------------------------------------------------------- 1538 1539 mixpoll: 1540 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1541 ; edi = buffer address 1542 ; ebx = count 1543 1544 000009DC 60 pushad 1545 1546 ;cld 1547 NextChunk: 1548 000009DD 66833D[8AD70000]00 cmp word [BufLen], 0 1549 000009E5 756B jne short CopyChunk 1550 1551 000009E7 53 push ebx 1552 000009E8 57 push edi 1553 MixChunk: 1554 000009E9 BF[92B70000] mov edi, MixBuffer 1555 1556 ; 17/10/2017 1557 000009EE 0FB70D[84D70000] movzx ecx, word [BpmSamples] 1558 ;mov cx, [BpmSamples] 1559 000009F5 893D[86D70000] mov [BufPtr], edi 1560 000009FB 66890D[8AD70000] mov [BufLen], cx 1561 1562 00000A02 803D[C5540000]04 cmp byte [numtracks], 4 1563 00000A09 7603 jna short ch_silence 1564 00000A0B 66D1E1 shl cx, 1 1565 ch_silence: 1566 00000A0E B880808080 mov eax, 80808080h 1567 00000A13 F3AB rep stosd 1568 1569 ;mov cx, NumTracks 1570 ;mov cl, NumTracks ; 01/10/2017 1571 00000A15 8A0D[C5540000] mov cl, [numtracks] ; 06/10/2017 1572 00000A1B BE[6ED70000] mov esi, Tracks - TrackInfo.size 1573 GetSamples_next: 1574 00000A20 51 push ecx 1575 00000A21 83C626 add esi, TrackInfo.size 1576 00000A24 668B0D[8AD70000] mov cx, [BufLen] 1577 00000A2B 8B3D[86D70000] mov edi, [BufPtr] 1578 00000A31 E8ECFEFFFF call MixTrack 1579 00000A36 59 pop ecx 1580 00000A37 FF05[86D70000] inc dword [BufPtr] ; 18/10/2017 1581 00000A3D E2E1 loop GetSamples_next 1582 1583 ; 18/10/2017 1584 00000A3F 8B1D[C5540000] mov ebx, [numtracks] 1585 00000A45 291D[86D70000] sub dword [BufPtr], ebx 1586 1587 00000A4B E80DFEFFFF call UpdateTracks 1588 1589 00000A50 5F pop edi 1590 00000A51 5B pop ebx 1591 CopyChunk: 1592 ;mov cx, [BufLen] 1593 00000A52 0FB70D[8AD70000] movzx ecx, word [BufLen] 1594 00000A59 39D9 cmp ecx, ebx 1595 ;cmp cx, bx 1596 00000A5B 7602 jbe short MoveChunk 1597 ;mov cx, bx 1598 00000A5D 89D9 mov ecx, ebx 1599 MoveChunk: 1600 00000A5F 8B35[86D70000] mov esi, [BufPtr] 1601 00000A65 010D[86D70000] add [BufPtr], ecx 1602 00000A6B 66290D[8AD70000] sub [BufLen], cx 1603 00000A72 29CB sub ebx, ecx 1604 ; 17/10/2017 ; STEREO MIXING 1605 ;rep movsb 1606 ; 18/10/2017 1607 00000A74 803D[C5540000]04 cmp byte [numtracks], 4 1608 ;jna short _4_channels_mix 1609 00000A7B 762F jna _4_channels_mix 1610 1611 _8_channels_mix: 1612 ; 18/10/2017 1613 00000A7D AD lodsd 1614 00000A7E 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1615 00000A80 C1EA10 shr edx, 16 ; ch3 (dl), ch4 (dh) 1616 00000A83 00C6 add dh, al ; ch1 + ch4 1617 00000A85 00E2 add dl, ah ; ch2 + ch3 1618 1619 00000A87 AD lodsd 1620 00000A88 00C6 add dh, al ; ch1 + ch4 + ch5 1621 00000A8A 00E2 add dl, ah ; ch2 + ch3 + ch6 1622 00000A8C C1E810 shr eax, 16 ; ch7 (al), ch8 (ah) 1623 ; 19/10/2017 1624 00000A8F 00E6 add dh, ah ; ch1 + ch4 + ch5 + ch8 1625 00000A91 00C2 add dl, al ; ch2 + ch3 + ch6 + ch7 1626 1627 ; L = ch1 + ch4 + ch5 + ch8 1628 ; R = ch2 + ch3 + ch6 + ch7 1629 1630 00000A93 6681C28080 add dx, 8080h 1631 1632 ; 19/10/2017 1633 00000A98 88F4 mov ah, dh 1634 00000A9A 80EC80 sub ah, 80h 1635 00000A9D 30C0 xor al, al 1636 00000A9F 66AB stosw ; Left Channel 1637 00000AA1 88D4 mov ah, dl 1638 00000AA3 80EC80 sub ah, 80h 1639 00000AA6 66AB stosw ; Right Channel 1640 1641 00000AA8 E2D3 loop _8_channels_mix 1642 1643 00000AAA EB21 jmp short channel_mix_ok 1644 1645 _4_channels_mix: 1646 ; 18/10/2017 1647 00000AAC AD lodsd 1648 00000AAD 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1649 ; 19/10/2017 1650 00000AAF C1E810 shr eax, 16 ; ch3 (al), ch4 (ah) 1651 00000AB2 00E2 add dl, ah ; ch1 + ch4 1652 00000AB4 00C6 add dh, al ; ch2 + ch3 1653 1654 ; L = ch1 + ch4 1655 ; R = ch2 + ch3 1656 1657 ; 19/10/2017 1658 00000AB6 6681C28080 add dx, 8080h 1659 1660 ; 19/10/2017 1661 00000ABB 88D4 mov ah, dl 1662 00000ABD 80EC80 sub ah, 80h 1663 00000AC0 30C0 xor al, al 1664 00000AC2 66AB stosw ; Left Channel 1665 00000AC4 88F4 mov ah, dh 1666 00000AC6 80EC80 sub ah, 80h 1667 00000AC9 66AB stosw ; Right Channel 1668 1669 00000ACB E2DF loop _4_channels_mix 1670 1671 channel_mix_ok: 1672 00000ACD 85DB test ebx, ebx 1673 ;jnz short NextChunk 1674 00000ACF 0F8508FFFFFF jnz NextChunk ; 17/10/2017 1675 1676 ; 20/10/2017 1677 ; 19/10/2017 1678 ; Pan Control 1679 00000AD5 8A0D[24E30000] mov cl, [pan_shift] 1680 00000ADB 08C9 or cl, cl 1681 00000ADD 744D jz short c_smpl_2 1682 1683 ; 20/10/2017 1684 00000ADF BB00200000 mov ebx, BUFFERSIZE/4 ; 8192 1685 00000AE4 BF[00F00000] mov edi, Audio_Buffer 1686 1687 00000AE9 B508 mov ch, 8 1688 00000AEB D2E5 shl ch, cl 1689 c_smpl_1: 1690 00000AED 8B17 mov edx, [edi] 1691 00000AEF 6689D0 mov ax, dx 1692 00000AF2 80FC80 cmp ah, 80h 1693 00000AF5 7208 jb short _cs1 1694 00000AF7 00EC add ah, ch 1695 00000AF9 730A jnc short _cs2 1696 00000AFB B4FF mov ah, 255 1697 00000AFD EB06 jmp short _cs2 1698 _cs1: 1699 00000AFF 28EC sub ah, ch 1700 00000B01 7302 jnc short _cs2 1701 00000B03 B400 mov ah, 0 1702 _cs2: 1703 00000B05 C1CA10 ror edx, 16 ; dx = [edi+2] 1704 00000B08 00F4 add ah, dh 1705 00000B0A 6692 xchg dx, ax ; xchg [edi+2], ax 1706 00000B0C 80FC80 cmp ah, 80h 1707 00000B0F 7208 jb short _cs3 1708 00000B11 00EC add ah, ch 1709 00000B13 730A jnc short _cs4 1710 00000B15 B4FF mov ah, 255 1711 00000B17 EB06 jmp short _cs4 1712 _cs3: 1713 00000B19 28EC sub ah, ch 1714 00000B1B 7302 jnc short _cs4 1715 00000B1D B400 mov ah, 0 1716 _cs4: 1717 00000B1F C1CA10 ror edx, 16 ; dx = [edi] 1718 00000B22 00E6 add dh, ah 1719 00000B24 8917 mov [edi], edx 1720 _cs5: 1721 ; 20/10/2017 1722 00000B26 83C704 add edi, 4 1723 00000B29 4B dec ebx 1724 00000B2A 75C1 jnz short c_smpl_1 1725 c_smpl_2: 1726 00000B2C 61 popad 1727 00000B2D C3 retn 1728 1729 ;-------------------------------------------------------------------------- 1730 ; StartPlaying: Initializes the Sound System. 1731 ; In: 1732 ; Module Information Resources. 1733 ;-------------------------------------------------------------------------- 1734 1735 StartPlaying: 1736 00000B2E 60 pushad 1737 SetModParms: 1738 00000B2F C605[7ED70000]00 mov byte [OrderPos], 0 1739 00000B36 C605[7FD70000]06 mov byte [Tempo], DefTempo 1740 00000B3D C605[80D70000]06 mov byte [TempoWait], DefTempo 1741 00000B44 C605[81D70000]7D mov byte [Bpm], DefBpm 1742 00000B4B C605[82D70000]40 mov byte [Row], 64 1743 00000B52 C605[83D70000]00 mov byte [BreakRow], 0 1744 00000B59 66A1[CB540000] mov ax, [MixSpeed] 1745 00000B5F 31D2 xor edx, edx 1746 00000B61 66BB3200 mov bx, 24*DefBpm/60 1747 00000B65 66F7F3 div bx 1748 00000B68 66A3[84D70000] mov [BpmSamples], ax 1749 ClearTracks: 1750 00000B6E BF[94D70000] mov edi, Tracks 1751 ; 07/10/2017 1752 ;mov ecx, NumTracks*TrackInfo.size 1753 00000B73 B826000000 mov eax, TrackInfo.size 1754 00000B78 0FB70D[C5540000] movzx ecx, word [numtracks] 1755 00000B7F F7E1 mul ecx 1756 00000B81 89C1 mov ecx, eax 1757 00000B83 31C0 xor eax, eax 1758 ;cld 1759 00000B85 F3AA rep stosb 1760 1761 00000B87 A3[86D70000] mov [BufPtr], eax 1762 00000B8C 66A3[8AD70000] mov [BufLen], ax 1763 MakePitch: 1764 00000B92 66B80021 mov ax, MidCRate 1765 00000B96 66BBAC01 mov bx, 428 1766 00000B9A 66F7E3 mul bx 1767 00000B9D 66F735[CB540000] div word [MixSpeed] 1768 00000BA4 30F6 xor dh, dh 1769 00000BA6 88E2 mov dl, ah 1770 00000BA8 88C4 mov ah, al 1771 00000BAA 30C0 xor al, al 1772 ;mov cx, 857 1773 00000BAC 66B9610D mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1774 00000BB0 31DB xor ebx, ebx 1775 00000BB2 BF[D05B0000] mov edi, PitchTable 1776 PitchLoop: 1777 00000BB7 50 push eax 1778 00000BB8 52 push edx 1779 00000BB9 6639DA cmp dx, bx 1780 00000BBC 7303 jae short NoDiv 1781 00000BBE 66F7F3 div bx 1782 NoDiv: 1783 00000BC1 66AB stosw 1784 00000BC3 5A pop edx 1785 00000BC4 58 pop eax 1786 ;inc bx 1787 00000BC5 43 inc ebx 1788 00000BC6 E2EF loop PitchLoop 1789 MakeVolume: 1790 00000BC8 66B90041 mov cx, 16640 1791 00000BCC 89CB mov ebx, ecx 1792 VolLoop: 1793 00000BCE 664B dec bx 1794 00000BD0 88D8 mov al, bl 1795 00000BD2 F6EF imul bh 1796 ;mov [VolTable+bx], ah 1797 00000BD4 88A3[92760000] mov [VolTable+ebx], ah 1798 00000BDA E2F2 loop VolLoop 1799 1800 00000BDC 61 popad 1801 00000BDD C3 retn 1802 1803 ;-------------------------------------------------------------------------- 1804 ; StopPlaying: ShutDown the Sound System. 1805 ;-------------------------------------------------------------------------- 1806 1807 StopPlaying: 1808 ; 19/06/2017 1809 ; Stop Playing 1810 sys _audio, 0700h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BDE BB00070000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000BE3 B820000000 <1> mov eax, %1 110 <1> 111 00000BE8 CD40 <1> int 40h 1811 ; Cancel callback service (for user) 1812 sys _audio, 0900h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BEA BB00090000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000BEF B820000000 <1> mov eax, %1 110 <1> 111 00000BF4 CD40 <1> int 40h 1813 ; Deallocate Audio Buffer (for user) 1814 sys _audio, 0A00h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BF6 BB000A0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000BFB B820000000 <1> mov eax, %1 110 <1> 111 00000C00 CD40 <1> int 40h 1815 ; Disable Audio Device 1816 sys _audio, 0C00h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000C02 BB000C0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 <1> mov ecx, %3 104 <1> %if %0 = 4 105 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000C07 B820000000 <1> mov eax, %1 110 <1> 111 00000C0C CD40 <1> int 40h 1817 1818 00000C0E C3 retn 1819 1820 ;============================================================================= 1821 ; 1822 ;============================================================================= 1823 1824 ;dword2str: 1825 ; ; 13/11/2016 - Erdogan Tan 1826 ; ; eax = dword value 1827 ; ; 1828 ; call dwordtohex 1829 ; mov [dword_str], edx 1830 ; mov [dword_str+4], eax 1831 ; mov si, dword_str 1832 ; retn 1833 1834 ; 05/03/2017 (TRDOS 386) 1835 ; trdos386.s (unix386.s) - 10/05/2015 1836 ; Convert binary number to hexadecimal string 1837 1838 ;bytetohex: 1839 ; ; INPUT -> 1840 ; ; AL = byte (binary number) 1841 ; ; OUTPUT -> 1842 ; ; AX = hexadecimal string 1843 ; ; 1844 ; push ebx 1845 ; movzx ebx, al 1846 ; shr bl, 4 1847 ; mov bl, [ebx+hex_chars] 1848 ; xchg bl, al 1849 ; and bl, 0Fh 1850 ; mov ah, [ebx+hex_chars] 1851 ; pop ebx 1852 ; retn 1853 1854 ;wordtohex: 1855 ; ; INPUT -> 1856 ; ; AX = word (binary number) 1857 ; ; OUTPUT -> 1858 ; ; EAX = hexadecimal string 1859 ; ; 1860 ; push ebx 1861 ; xor ebx, ebx 1862 ; xchg ah, al 1863 ; push eax 1864 ; mov bl, ah 1865 ; shr bl, 4 1866 ; mov al, [ebx+hex_chars] 1867 ; mov bl, ah 1868 ; and bl, 0Fh 1869 ; mov ah, [ebx+hex_chars] 1870 ; shl eax, 16 1871 ; pop eax 1872 ; pop ebx 1873 ; jmp short bytetohex 1874 1875 ;dwordtohex: 1876 ; ; INPUT -> 1877 ; ; EAX = dword (binary number) 1878 ; ; OUTPUT -> 1879 ; ; EDX:EAX = hexadecimal string 1880 ; ; 1881 ; push eax 1882 ; shr eax, 16 1883 ; call wordtohex 1884 ; mov edx, eax 1885 ; pop eax 1886 ; call wordtohex 1887 ; retn 1888 1889 ; 27/12/2024 1890 ; 04/06/2024 (BugFix) 1891 ; 24/06/2017 1892 ; 19/06/2017 1893 ; 05/03/2017 (TRDOS 386) 1894 ; 13/11/2016 - Erdogan Tan 1895 write_audio_dev_info: 1896 ; BUS/DEV/FN 1897 ; 00000000BBBBBBBBDDDDDFFF00000000 1898 ; DEV/VENDOR 1899 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1900 1901 ;mov esi, [dev_vendor] 1902 ; 04/06/2024 1903 00000C0F A1[84550000] mov eax, [dev_vendor] 1904 00000C14 0FB6D8 movzx ebx, al 1905 00000C17 88DA mov dl, bl 1906 00000C19 80E30F and bl, 0Fh 1907 00000C1C 8A83[CD540000] mov al, [ebx+hex_chars] 1908 00000C22 A2[12550000] mov [msgVendorId+3], al 1909 00000C27 88D3 mov bl, dl 1910 00000C29 C0EB04 shr bl, 4 1911 00000C2C 8A83[CD540000] mov al, [ebx+hex_chars] 1912 00000C32 A2[11550000] mov [msgVendorId+2], al 1913 00000C37 88E3 mov bl, ah 1914 00000C39 88DA mov dl, bl 1915 00000C3B 80E30F and bl, 0Fh 1916 00000C3E 8A83[CD540000] mov al, [ebx+hex_chars] 1917 00000C44 A2[10550000] mov [msgVendorId+1], al 1918 00000C49 88D3 mov bl, dl 1919 00000C4B C0EB04 shr bl, 4 1920 00000C4E 8A83[CD540000] mov al, [ebx+hex_chars] 1921 00000C54 A2[0F550000] mov [msgVendorId], al 1922 ;shr esi, 16 1923 ; 04/06/2024 1924 00000C59 C1E810 shr eax, 16 1925 00000C5C 88C3 mov bl, al 1926 00000C5E 88DA mov dl, bl 1927 00000C60 80E30F and bl, 0Fh 1928 00000C63 8A83[CD540000] mov al, [ebx+hex_chars] 1929 00000C69 A2[23550000] mov [msgDevId+3], al 1930 00000C6E 88D3 mov bl, dl 1931 00000C70 C0EB04 shr bl, 4 1932 00000C73 8A83[CD540000] mov al, [ebx+hex_chars] 1933 00000C79 A2[22550000] mov [msgDevId+2], al 1934 00000C7E 88E3 mov bl, ah 1935 00000C80 88DA mov dl, bl 1936 00000C82 80E30F and bl, 0Fh 1937 00000C85 8A83[CD540000] mov al, [ebx+hex_chars] 1938 00000C8B A2[21550000] mov [msgDevId+1], al 1939 00000C90 88D3 mov bl, dl 1940 00000C92 C0EB04 shr bl, 4 1941 00000C95 8A83[CD540000] mov al, [ebx+hex_chars] 1942 00000C9B A2[20550000] mov [msgDevId], al 1943 1944 ;mov esi, [bus_dev_fn] 1945 ;shr esi, 8 1946 ;mov ax, si 1947 ; 04/06/2024 1948 00000CA0 A1[88550000] mov eax, [bus_dev_fn] 1949 00000CA5 C1E808 shr eax, 8 1950 00000CA8 88C3 mov bl, al 1951 00000CAA 88DA mov dl, bl 1952 00000CAC 80E307 and bl, 7 ; bit 0,1,2 1953 00000CAF 8A83[CD540000] mov al, [ebx+hex_chars] 1954 00000CB5 A2[47550000] mov [msgFncNo+1], al 1955 00000CBA 88D3 mov bl, dl 1956 00000CBC C0EB03 shr bl, 3 1957 00000CBF 88DA mov dl, bl 1958 00000CC1 80E30F and bl, 0Fh 1959 00000CC4 8A83[CD540000] mov al, [ebx+hex_chars] 1960 00000CCA A2[39550000] mov [msgDevNo+1], al 1961 00000CCF 88D3 mov bl, dl 1962 00000CD1 C0EB04 shr bl, 4 1963 00000CD4 8A83[CD540000] mov al, [ebx+hex_chars] 1964 00000CDA A2[38550000] mov [msgDevNo], al 1965 00000CDF 88E3 mov bl, ah 1966 00000CE1 88DA mov dl, bl 1967 00000CE3 80E30F and bl, 0Fh 1968 00000CE6 8A83[CD540000] mov al, [ebx+hex_chars] 1969 00000CEC A2[2D550000] mov [msgBusNo+1], al 1970 00000CF1 88D3 mov bl, dl 1971 00000CF3 C0EB04 shr bl, 4 1972 00000CF6 8A83[CD540000] mov al, [ebx+hex_chars] 1973 00000CFC A2[2C550000] mov [msgBusNo], al 1974 1975 ; 24/06/2017 1976 00000D01 66A1[90550000] mov ax, [ac97_NamBar] 1977 00000D07 88C3 mov bl, al 1978 00000D09 88DA mov dl, bl 1979 00000D0B 80E30F and bl, 0Fh 1980 00000D0E 8A83[CD540000] mov al, [ebx+hex_chars] 1981 00000D14 A2[56550000] mov [msgNamBar+3], al 1982 00000D19 88D3 mov bl, dl 1983 00000D1B C0EB04 shr bl, 4 1984 00000D1E 8A83[CD540000] mov al, [ebx+hex_chars] 1985 00000D24 A2[55550000] mov [msgNamBar+2], al 1986 00000D29 88E3 mov bl, ah 1987 00000D2B 88DA mov dl, bl 1988 00000D2D 80E30F and bl, 0Fh 1989 00000D30 8A83[CD540000] mov al, [ebx+hex_chars] 1990 00000D36 A2[54550000] mov [msgNamBar+1], al 1991 00000D3B 88D3 mov bl, dl 1992 00000D3D C0EB04 shr bl, 4 1993 00000D40 8A83[CD540000] mov al, [ebx+hex_chars] 1994 00000D46 A2[53550000] mov [msgNamBar], al 1995 1996 00000D4B 66A1[92550000] mov ax, [ac97_NabmBar] 1997 00000D51 88C3 mov bl, al 1998 00000D53 88DA mov dl, bl 1999 00000D55 80E30F and bl, 0Fh 2000 00000D58 8A83[CD540000] mov al, [ebx+hex_chars] 2001 00000D5E A2[66550000] mov [msgNabmBar+3], al 2002 00000D63 88D3 mov bl, dl 2003 00000D65 C0EB04 shr bl, 4 2004 00000D68 8A83[CD540000] mov al, [ebx+hex_chars] 2005 00000D6E A2[65550000] mov [msgNabmBar+2], al 2006 00000D73 88E3 mov bl, ah 2007 00000D75 88DA mov dl, bl 2008 00000D77 80E30F and bl, 0Fh 2009 00000D7A 8A83[CD540000] mov al, [ebx+hex_chars] 2010 00000D80 A2[64550000] mov [msgNabmBar+1], al 2011 00000D85 88D3 mov bl, dl 2012 00000D87 C0EB04 shr bl, 4 2013 00000D8A 8A83[CD540000] mov al, [ebx+hex_chars] 2014 00000D90 A2[63550000] mov [msgNabmBar], al 2015 2016 ; 24/11/2016 2017 00000D95 30E4 xor ah, ah 2018 00000D97 A0[94550000] mov al, [ac97_int_ln_reg] 2019 00000D9C B10A mov cl, 10 2020 00000D9E F6F1 div cl 2021 00000DA0 660105[6F550000] add [msgIRQ], ax 2022 00000DA7 20C0 and al, al 2023 00000DA9 750D jnz short _w_ac97imsg_ ; 19/06/2017 2024 00000DAB A0[70550000] mov al, [msgIRQ+1] 2025 00000DB0 B420 mov ah, ' ' 2026 00000DB2 66A3[6F550000] mov [msgIRQ], ax 2027 _w_ac97imsg_: 2028 ; EBX = Message address 2029 ; ECX = Max. message length (or stop on ZERO character) 2030 ; (1 to 255) 2031 ; DL = Message color (07h = light gray, 0Fh = white) 2032 sys _msg, msgAC97Info, 255, 07h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000DB8 BB[DE540000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000DBD B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 00000DC2 BA07000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000DC7 B823000000 <1> mov eax, %1 110 <1> 111 00000DCC CD40 <1> int 40h 2033 00000DCE C3 retn 2034 2035 ;============================================================================= 2036 ; gfx.asm - draw scopes in VGA 640x480x16 mode 2037 ;============================================================================= 2038 2039 ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 2040 2041 ;----------------------------------------------------------------------------- 2042 ; setgraphmode - setup the VGA 640x480x16 graphics mode 2043 ;----------------------------------------------------------------------------- 2044 ; 22/10/2017 2045 setgraphmode: 2046 ;pushad 2047 00000DCF 66B81200 mov ax,0012h 2048 ;int 10h 2049 00000DD3 CD31 int 31h 2050 00000DD5 66BAC003 mov dx,3C0h 2051 00000DD9 30C0 xor al,al 2052 setgraphmodel0: 2053 ;out dx,al 2054 00000DDB B401 mov ah, 1 ; outb 2055 00000DDD CD34 int 34h 2056 ;out dx, al 2057 ;mov ah, 1 2058 00000DDF CD34 int 34h 2059 00000DE1 FEC0 inc al 2060 00000DE3 3C10 cmp al, 10h 2061 00000DE5 72F4 jb short setgraphmodel0 2062 00000DE7 B020 mov al, 20h 2063 ;out dx, al 2064 ;mov ah, 1 2065 00000DE9 CD34 int 34h 2066 ;popad 2067 00000DEB C3 retn 2068 2069 ;----------------------------------------------------------------------------- 2070 ; settextmode - restore the VGA 80x25x16 text mode 2071 ;----------------------------------------------------------------------------- 2072 ; 22/10/2017 2073 settextmode: 2074 ;pushad 2075 00000DEC 66B80300 mov ax, 0003h 2076 ;int 10h 2077 00000DF0 CD31 int 31h 2078 ;popad 2079 00000DF2 C3 retn 2080 2081 ;----------------------------------------------------------------------------- 2082 ; drawscopes - draw the track voices sample scopes 2083 ; In: 2084 ; ESI = (current) sample buffer 2085 ;----------------------------------------------------------------------------- 2086 ; 29/10/2017 2087 ; 28/10/2017 2088 ; (ESI = Current DMA buffer offset) 2089 ; 27/10/2017 2090 ; 26/10/2017 2091 ; 23/10/2017 2092 drawscopes: 2093 ;pushad 2094 ;mov esi, g_buff 2095 ;mov esi, edx 2096 00000DF3 31C9 xor ecx, ecx 2097 00000DF5 31D2 xor edx, edx 2098 00000DF7 31FF xor edi, edi 2099 drawscope0: 2100 00000DF9 66AD lodsw 2101 00000DFB 80F480 xor ah, 80h 2102 00000DFE 0FB6DC movzx ebx, ah ; Left Channel 2103 00000E01 66D1E3 shl bx, 1 2104 00000E04 668B83[D0D80000] mov ax, [RowOfs+ebx] 2105 00000E0B 668987[D0DA0000] mov [NewScope_L+edi], ax 2106 00000E12 30FF xor bh, bh 2107 00000E14 66AD lodsw 2108 00000E16 80F480 xor ah, 80h 2109 00000E19 88E3 mov bl, ah ; Right Channel 2110 00000E1B 66D1E3 shl bx, 1 2111 00000E1E 668B83[D0D80000] mov ax, [RowOfs+ebx] 2112 00000E25 668987[D0DC0000] mov [NewScope_R+edi], ax 2113 00000E2C 6683C702 add di, 2 2114 00000E30 FEC1 inc cl 2115 00000E32 75C5 jnz short drawscope0 2116 2117 00000E34 66BAC403 mov dx, 3C4h 2118 ;mov ax, 0802h 2119 ;out dx, ax 2120 00000E38 66BB0208 mov bx, 0802h 2121 00000E3C B403 mov ah, 3 ; outw 2122 00000E3E CD34 int 34h 2123 00000E40 66BACE03 mov dx, 3CEh 2124 00000E44 B008 mov al, 08h 2125 ;out dx, al 2126 00000E46 B401 mov ah, 1 ; outb 2127 00000E48 CD34 int 34h 2128 00000E4A 6642 inc dx 2129 2130 ; 26/10/2017 2131 00000E4C 31F6 xor esi, esi 2132 ;xor edi, edi 2133 00000E4E BB45060A00 mov ebx, 0A0645h 2134 drawscopel4: 2135 00000E53 B080 mov al, 80h 2136 drawscopel2: 2137 00000E55 50 push eax ; * 2138 00000E56 52 push edx ; ** 2139 ;out dx, al 2140 00000E57 B401 mov ah, 1 ; outb 2141 00000E59 CD34 int 34h 2142 2143 00000E5B B4FF mov ah, 0FFh 2144 ;mov ecx, 32 2145 00000E5D B120 mov cl, 32 2146 00000E5F 28C0 sub al, al 2147 drawscopel3: 2148 ; 23/10/2017 2149 00000E61 668B96[D0DE0000] mov dx, [OldScope_L+esi] 2150 00000E68 663B96[D0DA0000] cmp dx, [NewScope_L+esi] 2151 00000E6F 7414 je short drawscopef3 2152 00000E71 88041A mov [edx+ebx], al ; L 2153 00000E74 668B96[D0DA0000] mov dx, [NewScope_L+esi] 2154 00000E7B 88241A mov [edx+ebx], ah ; L 2155 00000E7E 668996[D0DE0000] mov [OldScope_L+esi], dx 2156 drawscopef3: 2157 ; 27/10/2017 2158 00000E85 668B96[D0E00000] mov dx, [OldScope_R+esi] 2159 00000E8C 663B96[D0DC0000] cmp dx, [NewScope_R+esi] 2160 00000E93 7416 je short drawscopef4 2161 00000E95 88441A26 mov [edx+ebx+38], al ; R 2162 00000E99 668B96[D0DC0000] mov dx, [NewScope_R+esi] 2163 00000EA0 88641A26 mov [edx+ebx+38], ah ; R 2164 00000EA4 668996[D0E00000] mov [OldScope_R+esi], dx 2165 drawscopef4: 2166 00000EAB 83C610 add esi, 2*8 2167 00000EAE 43 inc ebx 2168 00000EAF E2B0 loop drawscopel3 2169 2170 00000EB1 5A pop edx ; ** 2171 00000EB2 58 pop eax ; * 2172 00000EB3 81EEFE010000 sub esi, 2*256-2 2173 00000EB9 83EB20 sub ebx, 32 2174 00000EBC D0E8 shr al, 1 2175 00000EBE 7595 jnz short drawscopel2 2176 ;popad 2177 00000EC0 C3 retn 2178 2179 ;============================================================================= 2180 ; Load IFF/ILBM files for VGA 640x480x16 graphics mode 2181 ;============================================================================= 2182 2183 ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 2184 2185 ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax) 2186 2187 ;----------------------------------------------------------------------------- 2188 ; EQUATES AND STRUCTURES 2189 ;----------------------------------------------------------------------------- 2190 2191 ID_FORM equ 4D524F46h ; IFF/ILBM chunk IDs 2192 ID_ILBM equ 4D424C49h 2193 ID_BMHD equ 44484D42h 2194 ID_CMAP equ 50414D43h 2195 ID_BODY equ 59444F42h 2196 2197 struc Form ; IFF/ILBM header file format 2198 00000000 ???????? .ID: resd 1 2199 00000004 ???????? .Length: resd 1 2200 00000008 ???????? .Type: resd 1 2201 .size: 2202 endstruc 2203 2204 struc Chunk ; IFF/ILBM header chunk format 2205 00000000 ???????? .ID: resd 1 2206 00000004 ???????? .Length: resd 1 2207 .size: 2208 endstruc 2209 2210 struc BMHD ; IFF/ILBM BMHD chunk format 2211 00000000 ???? .Width: resw 1 2212 00000002 ???? .Height: resw 1 2213 00000004 ???? .PosX: resw 1 2214 00000006 ???? .PosY: resw 1 2215 00000008 ?? .Planes: resb 1 2216 00000009 ?? .Masking: resb 1 2217 0000000A ?? .Compression: resb 1 2218 0000000B ?? .Pad: resb 1 2219 0000000C ???? .Transparent: resw 1 2220 0000000E ?? .AspectX resb 1 2221 0000000F ?? .AspectY: resb 1 2222 00000010 ???? .PageWidth: resw 1 2223 00000012 ???? .PageHeight: resw 1 2224 .size: 2225 endstruc 2226 2227 struc CMAP ; IFF/ILBM CMAP chunk format 2228 00000000 .Colors: resb 768 2229 .size: 2230 endstruc 2231 2232 ;LOGO_ADDRESS equ 100000h ; virtual address at the end of the 1st 1MB 2233 2234 ;------------------------------------------------------------------------------ 2235 ; bswap - macro to reverse the byte order of a 32-bit register, converting 2236 ; a value in little/big endian form to big/little endian form. 2237 ;------------------------------------------------------------------------------ 2238 %macro bswap 1 2239 xchg al, ah 2240 rol eax, 16 2241 xchg al, ah 2242 %endmacro 2243 2244 ;------------------------------------------------------------------------------ 2245 ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode 2246 ; In: 2247 ; ESI = IFF/ILBM image file address 2248 ;------------------------------------------------------------------------------ 2249 putlbm: 2250 00000EC1 60 pushad 2251 2252 ; check if this is a valid IFF/ILBM Deluxe Paint file 2253 2254 00000EC2 813E464F524D cmp dword [esi+Form.ID], ID_FORM 2255 00000EC8 7551 jne short putlbmd0 2256 00000ECA 817E08494C424D cmp dword [esi+Form.Type], ID_ILBM 2257 00000ED1 7548 jne short putlbmd0 2258 2259 ; get the IFF/ILBM file length in bytes 2260 2261 00000ED3 8B4604 mov eax, [esi+Form.Length] 2262 bswap eax 2239 00000ED6 86E0 <1> xchg al, ah 2240 00000ED8 C1C010 <1> rol eax, 16 2241 00000EDB 86E0 <1> xchg al, ah 2263 00000EDD 89C1 mov ecx, eax 2264 2265 ; decrease the file length and updates the file pointer 2266 2267 00000EDF 83E904 sub ecx, 4 2268 00000EE2 83C60C add esi, Form.size 2269 2270 ; IFF/ILBM main parser body loop 2271 2272 putlbml0: 2273 00000EE5 85C9 test ecx, ecx 2274 00000EE7 7E64 jle short putlbmd1 2275 2276 ; get the next chunk ID and length in bytes 2277 2278 00000EE9 8B1E mov ebx, [esi+Chunk.ID] 2279 00000EEB 8B4604 mov eax, [esi+Chunk.Length] 2280 bswap eax 2239 00000EEE 86E0 <1> xchg al, ah 2240 00000EF0 C1C010 <1> rol eax, 16 2241 00000EF3 86E0 <1> xchg al, ah 2281 00000EF5 93 xchg ebx, eax 2282 00000EF6 83C608 add esi, Chunk.size 2283 2284 ; word align the chunk length and decrease the file length counter 2285 2286 00000EF9 43 inc ebx 2287 00000EFA 80E3FE and bl, 0FEh ; ~1 2288 00000EFD 83E908 sub ecx, Chunk.size 2289 00000F00 29D9 sub ecx, ebx 2290 2291 ; check for the BMHD/CMAP/BODY chunk headers 2292 2293 00000F02 3D424D4844 cmp eax, ID_BMHD 2294 00000F07 7415 je short putlbmf0 2295 00000F09 3D434D4150 cmp eax, ID_CMAP 2296 00000F0E 7440 je short putlbmf1 2297 00000F10 3D424F4459 cmp eax, ID_BODY 2298 00000F15 7455 je short putlbmf2 2299 2300 ; advance to the next IFF/ILBM chunk structure 2301 2302 putlbmc0: 2303 00000F17 01DE add esi, ebx 2304 00000F19 EBCA jmp short putlbml0 2305 2306 putlbmd0: 2307 00000F1B F9 stc 2308 00000F1C 61 popad 2309 00000F1D C3 retn 2310 2311 ; process the BMHD bitmap header chunk 2312 2313 putlbmf0: 2314 00000F1E 807E0804 cmp byte [esi+BMHD.Planes], 4 2315 00000F22 75F7 jne short putlbmd0 2316 00000F24 807E0A01 cmp byte [esi+BMHD.Compression], 1 2317 00000F28 75F1 jne short putlbmd0 2318 00000F2A 807E0B00 cmp byte [esi+BMHD.Pad], 0 2319 00000F2E 75EB jne short putlbmd0 2320 00000F30 0FB706 movzx eax, word [esi+BMHD.Width] 2321 00000F33 86E0 xchg al, ah 2322 00000F35 83C007 add eax, 7 2323 00000F38 C1E803 shr eax, 3 2324 00000F3B A3[7C550000] mov [picture.width], eax 2325 00000F40 0FB74602 movzx eax, word [esi+BMHD.Height] 2326 00000F44 86E0 xchg al, ah 2327 00000F46 A3[80550000] mov [picture.height], eax 2328 00000F4B EBCA jmp short putlbmc0 2329 2330 putlbmd1: 2331 00000F4D F8 clc 2332 00000F4E 61 popad 2333 00000F4F C3 retn 2334 2335 ; process the CMAP colormap chunk 2336 2337 putlbmf1: 2338 00000F50 66BAC803 mov dx, 3C8h 2339 00000F54 30C0 xor al, al 2340 ;out dx, al 2341 00000F56 B401 mov ah, 1 ; outb 2342 00000F58 CD34 int 34h 2343 00000F5A 6642 inc dx 2344 putlbml1: 2345 00000F5C 8A06 mov al, [esi] 2346 00000F5E C0E802 shr al, 2 2347 ;out dx, al 2348 ;mov ah, 1 ; outb 2349 00000F61 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2350 00000F63 46 inc esi 2351 00000F64 4B dec ebx 2352 00000F65 7FF5 jg short putlbml1 2353 00000F67 E979FFFFFF jmp putlbml0 2354 2355 ; process the BODY bitmap body chunk 2356 2357 putlbmf2: 2358 00000F6C 60 pushad 2359 00000F6D BF00000A00 mov edi, 0A0000h 2360 ;cld 2361 00000F72 66BACE03 mov dx, 3CEh 2362 ;mov ax, 0FF08h 2363 ;out dx, ax 2364 00000F76 66BB08FF mov bx, 0FF08h 2365 00000F7A B403 mov ah, 3 ; outw 2366 00000F7C CD34 int 34h ; IOCTL interrupt (IN/OUT) 2367 00000F7E 66BAC403 mov dx, 3C4h 2368 00000F82 B002 mov al, 02h 2369 ;out dx, al 2370 00000F84 B401 mov ah, 1 ; outb 2371 00000F86 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2372 00000F88 6642 inc dx 2373 00000F8A 8B0D[80550000] mov ecx, [picture.height] 2374 putlbml2: 2375 00000F90 51 push ecx 2376 00000F91 B011 mov al, 11h 2377 putlbml3: 2378 00000F93 50 push eax 2379 00000F94 57 push edi 2380 ;out dx, al 2381 00000F95 B401 mov ah, 1 ; outb 2382 00000F97 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2383 00000F99 8B1D[7C550000] mov ebx, [picture.width] 2384 putlbml4: 2385 00000F9F AC lodsb 2386 00000FA0 84C0 test al, al 2387 00000FA2 7C0A jl short putlbmf3 2388 00000FA4 0FB6C8 movzx ecx, al 2389 00000FA7 41 inc ecx 2390 00000FA8 29CB sub ebx, ecx 2391 00000FAA F3A4 rep movsb 2392 00000FAC EB0B jmp short putlbmc4 2393 putlbmf3: 2394 00000FAE F6D8 neg al 2395 00000FB0 0FB6C8 movzx ecx, al 2396 00000FB3 41 inc ecx 2397 00000FB4 29CB sub ebx, ecx 2398 00000FB6 AC lodsb 2399 00000FB7 F3AA rep stosb 2400 putlbmc4: 2401 00000FB9 85DB test ebx, ebx 2402 00000FBB 7FE2 jg short putlbml4 2403 00000FBD 5F pop edi 2404 00000FBE 58 pop eax 2405 00000FBF 00C0 add al, al 2406 00000FC1 73D0 jnc short putlbml3 2407 00000FC3 83C750 add edi, 80 2408 00000FC6 59 pop ecx 2409 00000FC7 E2C7 loop putlbml2 2410 00000FC9 61 popad 2411 00000FCA E948FFFFFF jmp putlbmc0 2412 2413 ; EX1.C (Carlos Hasan, 21/06/1994) 2414 ;------------------------------------------------------------------------------ 2415 ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory 2416 ; ESI = IFF/ILBM image file address 2417 ;------------------------------------------------------------------------------ 2418 2419 ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) { 2420 ; printf("Error loading the IFF/ILBM logo picture\n"); 2421 ; MODStopModule(); 2422 ; MODFreeModule(Song); 2423 ; return; 2424 ; } 2425 ; setgraphmode(); 2426 ; putlbm(Logo); 2427 ; while (!kbhit()) 2428 ; drawscopes(Song->NumTracks); 2429 ; settextmode(); 2430 ; free(Logo); 2431 ; MODStopModule(); 2432 ; MODFreeModule(Song); 2433 2434 ;loadlbm: 2435 ; ; ebx = ASCIIZ file name address 2436 ; ; ecx = open mode (0 = open for read) 2437 ; sys _open, LOGO_FILE_NAME, 0 ; open for reading 2438 ; jc short loadlbm_retn 2439 ; 2440 ; mov [LBM_FileHandle], eax 2441 ; 2442 ; ; get file size by moving file pointer to the end of file 2443 ; ; ebx = file handle/number 2444 ; ; ecx : offset = 0 2445 ; ; edx : switch = 2 (move fp to end of file + offset) 2446 ; sys _seek, eax, 0, 2 2447 ; jc short loadlbm_cf 2448 ; 2449 ; mov [LBM_FileSize], eax 2450 ; 2451 ; ; move file pointer to the beginning of the file 2452 ; ; ecx = 0 2453 ; ; edx = 0 2454 ; ;xor ecx, ecx 2455 ; xor dl, dl 2456 ; ; ebx = [LBM_FileHandle] 2457 ; sys _seek 2458 ; ;jc short loadlbm_cf 2459 ; 2460 ; ; ebx = File handle 2461 ; ; ecx = Buffer address 2462 ; ; edx = Byte count 2463 ; ;sys _read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize] 2464 ; mov ecx, LOGO_ADDRESS 2465 ; mov edx, [LBM_FileSize] 2466 ; sys _read 2467 ; jc short loadlbm_cf 2468 ; 2469 ; cmp eax, edx ; read count = file size ? 2470 ; ;jb short loadlbm_cf 2471 ;loadlbm_cf: 2472 ; pushf 2473 ; sys _close, [LBM_FileHandle] 2474 ; popf 2475 ;loadlbm_retn: 2476 ; retn 2477 ; 2478 ;LOGO_FILE_NAME: 2479 ; db "LOGO.LBM", 0 2480 2481 LOGO_ERROR_MSG: 2482 00000FCF 4572726F72206C6F61- db "Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 2482 00000FD8 64696E672074686520- 2482 00000FE1 4946462F494C424D20- 2482 00000FEA 6C6F676F2070696374- 2482 00000FF3 75726520210D0A00 2483 2484 00000FFB 90 align 2 2485 ; 22/10/2017 2486 LOGO_ADDRESS: 2487 ;incbin "LOGO.LBM" 2488 ; 27/10/2017 2489 00000FFC incbin "TINYPLAY.LBM" 2490 2491 ;============================================================================= 2492 ; preinitialized data 2493 ;============================================================================= 2494 2495 ;============================================================================= 2496 ; Protracker effects stuff 2497 ;============================================================================= 2498 2499 ;----------------------------------------------------------------------------- 2500 ; Effect jump tables 2501 ;----------------------------------------------------------------------------- 2502 2503 align 4 2504 2505 efxtable: 2506 00005294 [C7070000] dd efxarpeggio ; 0 - arpeggio 2507 00005298 [F4040000] dd efxnull ; 1 - porta up 2508 0000529C [F4040000] dd efxnull ; 2 - porta down 2509 000052A0 [12070000] dd efxtoneporta ; 3 - tone porta 2510 000052A4 [21070000] dd efxvibrato ; 4 - vibrato 2511 000052A8 [F4040000] dd efxnull ; 5 - tone+slide 2512 000052AC [F4040000] dd efxnull ; 6 - vibrato+slide 2513 000052B0 [3E080000] dd efxtremolo ; 7 - tremolo 2514 000052B4 [F4040000] dd efxnull ; 8 - unused 2515 000052B8 [49070000] dd efxsampoffset ; 9 - sample offset 2516 000052BC [F4040000] dd efxnull ; A - volume slide 2517 000052C0 [55070000] dd efxpattjump ; B - pattern jump 2518 000052C4 [63070000] dd efxsetvolume ; C - set volume 2519 000052C8 [71070000] dd efxbreak ; D - break pattern 2520 000052CC [F4040000] dd efxnull ; E - extra effects 2521 000052D0 [90070000] dd efxsetspeed ; F - set speed 2522 2523 efxtable2: 2524 000052D4 [F5040000] dd efxarpeggio2 ; 0 - arpeggio 2525 000052D8 [17050000] dd efxportaup ; 1 - porta up 2526 000052DC [3D050000] dd efxportadown ; 2 - porta down 2527 000052E0 [64050000] dd efxtoneporta2 ; 3 - tone porta 2528 000052E4 [9D050000] dd efxvibrato2 ; 4 - vibrato 2529 000052E8 [F9050000] dd efxtoneslide ; 5 - tone+slide 2530 000052EC [06060000] dd efxvibslide ; 6 - vibrato+slide 2531 000052F0 [2D060000] dd efxtremolo2 ; 7 - tremolo 2532 000052F4 [F4040000] dd efxnull ; 8 - unused 2533 000052F8 [F4040000] dd efxnull ; 9 - sample offset 2534 000052FC [10060000] dd efxvolslide ; A - volume slide 2535 00005300 [F4040000] dd efxnull ; B - pattern jump 2536 00005304 [F4040000] dd efxnull ; C - set volume 2537 00005308 [F4040000] dd efxnull ; D - break pattern 2538 0000530C [F4040000] dd efxnull ; E - extra effects 2539 00005310 [F4040000] dd efxnull ; F - set speed 2540 2541 ;----------------------------------------------------------------------------- 2542 ; Amiga period table 2543 ;----------------------------------------------------------------------------- 2544 2545 ;PeriodTable0: 2546 ; dw 0 2547 PeriodTable: 2548 00005314 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 2548 0000531D 0A000A7009E8086808- 2548 00005326 F00780071407 2549 0000532C B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 2549 00005335 050005B80474043404- 2549 0000533E F803C0038A03 2550 00005344 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 2550 0000534D 0280025C023A021A02- 2550 00005356 FC01E001C501 2551 0000535C AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 2551 00005365 0140012E011D010D01- 2551 0000536E FE00F000E200 2552 00005374 D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 2552 0000537D 00A00097008F008700- 2552 00005386 7F0078007100 2553 0000538C 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 2553 00005395 0050004B0047004300- 2553 0000539E 3F003C003800 2554 000053A4 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 2554 000053AD 002800250023002100- 2554 000053B6 1F001E001C00 2555 2556 ;----------------------------------------------------------------------------- 2557 ; Sinus wave table 2558 ;----------------------------------------------------------------------------- 2559 2560 SinTable: 2561 000053BC 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 2561 000053C5 C5D4E1 2562 000053C8 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 2562 000053D1 E1 2563 000053D2 D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 2563 000053DB 19 2564 2565 ;============================================================================= 2566 ; PLAY.ASM - DATA 2567 ;============================================================================= 2568 000053DC 00 db 0 2569 msg_usage: 2570 000053DD 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 2570 000053E6 506C6179657220666F- 2570 000053EF 72205452444F532033- 2570 000053F8 383620627920457264- 2570 00005401 6F67616E2054616E2E- 2570 0000540A 20 2571 ;;db 'October 2017.',10,13 2572 ;db 'June 2024.',10,13 2573 0000540B 446563656D62657220- db 'December 2024',10,13 2573 00005414 323032340A0D 2574 0000541A 75736167653A20746D- db 'usage: tmodplay filename.mod', 10,13,0 2574 00005423 6F64706C6179206669- 2574 0000542C 6C656E616D652E6D6F- 2574 00005435 640A0D00 2575 00005439 32392F31302F323031- db '29/10/2017',10,13,0 2575 00005442 370A0D00 2576 ;db '02/06/2024',10,13,0 2577 00005446 32372F31322F323032- db '27/12/2024',10,13,0 2577 0000544F 340A0D00 2578 2579 Credits: 2580 00005453 54696E79204D4F4420- db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 2580 0000545C 506C61796572207630- 2580 00005465 2E3162206279204361- 2580 0000546E 726C6F732048617361- 2580 00005477 6E2E204A756C792031- 2580 00005480 3939332E 2581 00005484 0A0D00 db 10,13,0 2582 ErrorMesg: 2583 00005487 4572726F72206C6F61- db 'Error loading Module file.',10,13,0 2583 00005490 64696E67204D6F6475- 2583 00005499 6C652066696C652E0A- 2583 000054A2 0D00 2584 2585 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 2586 ;MsgFound: db 'Sound Blaster found at Address 2' 2587 ;PortText: db 'x0h, IRQ ' 2588 ;IrqText: db 'x.',10,13,0 2589 2590 trdos386_err_msg: 2591 000054A4 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 2591 000054AD 2053797374656D2063- 2591 000054B6 616C6C206572726F72- 2591 000054BF 20210A0D00 2592 2593 ; 07/10/2017 2594 000054C4 0A pattern_shift: db 10 2595 ;numtracks: dw 4 2596 ; 18/10/2017 2597 000054C5 04000000 numtracks: dd 4 2598 2599 ;============================================================================= 2600 ; PLAYER.ASM - DATA 2601 ;============================================================================= 2602 2603 ;stmo: db 1 ; stereo (2) or mono (1) 2604 ;bps: db 8 ; bits per sample (8 or 16) 2605 2606 ;19/10/2017 2607 000054C9 02 stmo: db 2 ; stereo (2) or mono (1) 2608 000054CA 10 bps: db 16 ; bits per sample (8 or 16) 2609 2610 Sample_Rate: 2611 MixSpeed: ;dw 22050 ; Hz 2612 ; 02/06/2024 2613 000054CB 80BB dw 48000 ; Hz 2614 2615 ; 13/11/2016 2616 000054CD 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 2616 000054D6 3941424344454600 2617 ; 2618 msgAC97Info: 2619 000054DE 0D0A db 0Dh, 0Ah 2620 000054E0 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 2620 000054E9 6F20436F6E74726F6C- 2620 000054F2 6C6572202620436F64- 2620 000054FB 656320496E666F0D0A 2621 00005504 56656E646F72204944- db "Vendor ID: " 2621 0000550D 3A20 2622 0000550F 303030306820446576- msgVendorId: db "0000h Device ID: " 2622 00005518 6963652049443A20 2623 00005520 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 2624 00005527 4275733A20 db "Bus: " 2625 0000552C 303068204465766963- msgBusNo: db "00h Device: " 2625 00005535 653A20 2626 00005538 3030682046756E6374- msgDevNo: db "00h Function: " 2626 00005541 696F6E3A20 2627 00005546 303068 msgFncNo db "00h" 2628 00005549 0D0A db 0Dh, 0Ah 2629 0000554B 4E414D4241523A20 db "NAMBAR: " 2630 00005553 30303030682020 msgNamBar db "0000h " 2631 0000555A 4E41424D4241523A20 db "NABMBAR: " 2632 00005563 303030306820204952- msgNabmBar db "0000h IRQ: " 2632 0000556C 513A20 2633 0000556F 3030 msgIRQ: dw 3030h 2634 00005571 0D0A00 db 0Dh, 0Ah, 0 2635 ; 2636 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 2637 ;codec_id: dd 0 2638 ;codec_chip_id: dd 0 2639 ;codec_vendor_ids: dw 0 2640 ;codec_chip_ids: dw 0 2641 2642 ;dword_str: dd 30303030h, 30303030h 2643 ; db 'h', 0Dh, 0Ah, 0 2644 2645 ;============================================================================= 2646 ; uninitialized data 2647 ;============================================================================= 2648 2649 bss_start: 2650 2651 ABSOLUTE bss_start 2652 2653 alignb 4 2654 2655 ;------------------------------------------------------------------------------ 2656 ; IFF/ILBM DATA 2657 ;------------------------------------------------------------------------------ 2658 2659 00005574 ???????? LBM_FileHandle: resd 1 2660 00005578 ???????? LBM_FileSize: resd 1 2661 ; 2662 0000557C ???????? picture.width: resd 1 ; current picture width and height 2663 00005580 ???????? picture.height: resd 1 2664 2665 ;------------------------------------------------------------------------------ 2666 2667 00005584 ???????? dev_vendor: resd 1 2668 00005588 ???????? bus_dev_fn: resd 1 2669 0000558C ???????? stats_cmd: resd 1 2670 00005590 ???? ac97_NamBar: resw 1 2671 00005592 ???? ac97_NabmBar: resw 1 2672 00005594 ?? ac97_int_ln_reg: resb 1 2673 00005595 ?? srb: resb 1 2674 2675 ; MODLOAD.ASM 2676 00005596 ???????? FileHandle: resd 1 2677 0000559A Header: resb ModHeader.size 2678 2679 ; MODPLAY.ASM 2680 ;MixSpeed: resw 1 2681 2682 ModInfo: 2683 000059D6 ?? ModInfo.OrderLen: resb 1 2684 000059D7 ?? ModInfo.ReStart: resb 1 2685 000059D8 ModInfo.Order: resb 128 2686 00005A58 ???????? ModInfo.Patterns: resd 1 2687 2688 00005A5C ModInfo.SampOfs: resw 31 2689 00005A9A ModInfo.SampSeg: resw 31 2690 00005AD8 ModInfo.SampLen: resw 31 2691 00005B16 ModInfo.SampRep: resw 31 2692 00005B54 ModInfo.SampRepLen: resw 31 2693 00005B92 ModInfo.SampVol: resw 31 2694 2695 ; MODPLAY.ASM 2696 PitchTable: ;resw 857 2697 00005BD0 resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 2698 00007692 VolTable: resb 16640 2699 0000B792 MixBuffer resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017 2700 2701 ; MODPLAY.ASM 2702 0000D77E ?? OrderPos: resb 1 2703 0000D77F ?? Tempo: resb 1 2704 0000D780 ?? TempoWait: resb 1 2705 0000D781 ?? Bpm: resb 1 2706 0000D782 ?? Row: resb 1 2707 0000D783 ?? BreakRow: resb 1 2708 0000D784 ???? BpmSamples: resw 1 2709 0000D786 ???????? BufPtr: resd 1 2710 0000D78A ???? BufLen: resw 1 2711 0000D78C ???????? BufRep: resd 1 2712 0000D790 ???????? Note: resd 1 2713 ;Tracks: resb TrackInfo.size*NumTracks 2714 ; 07/10/2017 2715 0000D794 Tracks: resb TrackInfo.size*8 2716 2717 0000D8C4 alignb 16 2718 2719 ; PLAY.ASM 2720 ;Scope: resw 320 2721 0000D8D0 RowOfs: resw 256 2722 2723 ; 23/10/2017 2724 0000DAD0 NewScope_L: resw 256 2725 0000DCD0 NewScope_R: resw 256 2726 0000DED0 OldScope_L: resw 256 2727 0000E0D0 OldScope_R: resw 256 2728 2729 ; 27/12/2024 2730 0000E2D0 ???????? timerticks: resd 1 2731 2732 mod_file_name: 2733 0000E2D4 resb 80 2734 2735 ; 20/10/2017 (modplay7.s, SB16) 2736 ; 19/10/2017 (modplay6.s, AC97) 2737 0000E324 ?? pan_shift: resb 1 2738 0000E325 ?? volume_level: resb 1 2739 2740 0000E326 alignb 4096 2741 2742 Audio_Buffer: 2743 0000F000 resb BUFFERSIZE ; DMA Buffer Size / 2 (32768) 2744 ;temp_buffer: 2745 ; ;resb BUFFERSIZE / 4 ; 8192 2746 ; resb BUFFERSIZE / 2 ; 17/10/2017 2747 2748 00017000 alignb 65536 2749 2750 DMA_Buffer: 2751 00020000 resb 65536 2752 file_buffer: 2753 00030000 resb 65536*6 2754 EOF: