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 ; 14/07/2020 46 ; 31/12/2017 47 ; TRDOS 386 (v2.0) system calls 48 _ver equ 0 49 _exit equ 1 50 _fork equ 2 51 _read equ 3 52 _write equ 4 53 _open equ 5 54 _close equ 6 55 _wait equ 7 56 _create equ 8 57 _rename equ 9 58 _delete equ 10 59 _exec equ 11 60 _chdir equ 12 61 _time equ 13 62 _mkdir equ 14 63 _chmod equ 15 64 _rmdir equ 16 65 _break equ 17 66 _drive equ 18 67 _seek equ 19 68 _tell equ 20 69 _memory equ 21 70 _prompt equ 22 71 _path equ 23 72 _env equ 24 73 _stime equ 25 74 _quit equ 26 75 _intr equ 27 76 _dir equ 28 77 _emt equ 29 78 _ldrvt equ 30 79 _video equ 31 80 _audio equ 32 81 _timer equ 33 82 _sleep equ 34 83 _msg equ 35 84 _geterr equ 36 85 _fpstat equ 37 86 _pri equ 38 87 _rele equ 39 88 _fff equ 40 89 _fnf equ 41 90 _alloc equ 42 91 _dalloc equ 43 92 _calbac equ 44 93 _dma equ 45 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 ; 27/11/2023 120 BUFFERSIZE equ 65536 121 122 ; ---------------------------------------------------------------------------- 123 ; Tiny MOD Player v0.1b by Carlos Hasan. 124 ; July 14th, 1993. 125 126 ;============================================================================= 127 ; 128 ;============================================================================= 129 130 [BITS 32] 131 [org 0] 132 133 Start: 134 ; 27/11/2023 135 ; clear bss 136 00000000 B9[03000A00] mov ecx, EOF+3 137 00000005 BF[69550000] mov edi, bss_start 138 0000000A 29F9 sub ecx, edi 139 0000000C C1E902 shr ecx, 2 140 0000000F 31C0 xor eax, eax 141 00000011 F3AB rep stosd 142 143 ; Detect (& Enable) AC'97 (ICH) Audio Device 144 00000013 E830020000 call DetectICH 145 00000018 731B jnc short GetFileName 146 147 _dev_not_ready: 148 ; couldn't find the audio device! 149 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 150 00000030 E9F2010000 jmp Exit 151 152 GetFileName: 153 ;cmp ah, 1 ; SB16 Sound card 154 ;jne _dev_not_ready 155 156 00000035 89E6 mov esi, esp 157 00000037 AD lodsd 158 00000038 83F802 cmp eax, 2 ; two arguments 159 ; (program file name & mod file name) 160 0000003B 0F82EF010000 jb pmsg_usage ; nothing to do 161 162 00000041 AD lodsd ; program file name address 163 00000042 AD lodsd ; mod file name address (file to be read) 164 00000043 89C6 mov esi, eax 165 00000045 BF[D4E20000] mov edi, mod_file_name 166 ScanName: 167 0000004A AC lodsb 168 0000004B 84C0 test al, al 169 0000004D 0F84DD010000 je pmsg_usage 170 00000053 3C20 cmp al, 20h 171 00000055 74F3 je short ScanName ; scan start of name. 172 00000057 AA stosb 173 00000058 B4FF mov ah, 0FFh 174 a_0: 175 0000005A FEC4 inc ah 176 a_1: 177 0000005C AC lodsb 178 0000005D AA stosb 179 0000005E 3C2E cmp al, '.' 180 00000060 74F8 je short a_0 181 00000062 20C0 and al, al 182 00000064 75F6 jnz short a_1 183 184 00000066 08E4 or ah, ah ; if period NOT found, 185 00000068 750B jnz short PrintPMesg ; then add a .MOD extension. 186 SetExt: 187 0000006A 4F dec edi 188 0000006B C7072E4D4F44 mov dword [edi], '.MOD' 189 00000071 C6470400 mov byte [edi+4], 0 190 PrintPMesg: 191 ; Prints the Credits Text. 192 sys _msg, Credits, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000075 BB[48540000] <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 193 _1: 194 ; 19/06/2017 195 ; Allocate Audio Buffer (for user) 196 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 B900000100 <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 197 000000A1 0F8205010000 jc error_exit 198 _2: 199 ;; Initialize Audio Device (bl = 1 -> Interrupt method) 200 ;sys _audio, 0301h, 0, sb16_int_handler 201 ;jc error_exit 202 203 ; 20/10/2017 204 ; Initialize Audio Device (bl = 0 -> SRB method) 205 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[8D550000] <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 206 000000BD 0F82E9000000 jc error_exit 207 208 LoadMod: 209 000000C3 BF[D4E20000] mov edi, mod_file_name 210 000000C8 E887020000 call LoadModule ; Load the MODule... 211 ; 08/10/2017 212 000000CD 731B jnc short _3 ; any error loading? 213 214 ; yes, print error and Exit. 215 216 sys _msg, ErrorMesg, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000000CF BB[7C540000] <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 217 000000E5 E93D010000 jmp Exit 218 _3: 219 ; 10/06/2017 220 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 221 000000F6 0F82B0000000 jc error_exit 222 223 ;cmp ah, 2 ; AC'97 (Intel ICH) Audio Controller 224 ;jne _dev_not_ready 225 226 ; EAX = IRQ Number in AL 227 ; Audio Device Number in AH 228 ; EBX = DEV/VENDOR ID 229 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 230 ; ECX = BUS/DEV/FN 231 ; (00000000BBBBBBBBDDDDDFFF00000000) 232 ; EDX = Base IO Addr (DX) for SB16 & VT8233 233 ; EDX = NABMBAR/NAMBAR (for AC97) 234 ; (Low word, DX = NAMBAR address) 235 236 000000FC A2[8C550000] mov [ac97_int_ln_reg], al 237 00000101 891D[7C550000] mov [dev_vendor], ebx 238 00000107 890D[80550000] mov [bus_dev_fn], ecx 239 0000010D 668915[88550000] mov [ac97_NamBar], dx 240 ;mov [ac97_NamBar], dx 241 ;shr dx, 16 242 ;mov [ac97_NabmBar], dx 243 00000114 8915[88550000] mov [ac97_NamBar], edx 244 245 0000011A E8E40A0000 call write_audio_dev_info 246 247 PlayNow: 248 0000011F E8FF090000 call StartPlaying 249 250 ; load 32768 bytes into audio buffer 251 00000124 BF[00F00000] mov edi, Audio_Buffer 252 ; 19/10/2017 253 ;mov ebx, BUFFERSIZE 254 00000129 BB00400000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 255 0000012E E89F080000 call GetSamples 256 00000133 7277 jc error_exit 257 258 ; 27/11/2023 259 ; bh = 16 : update (current, first) dma half buffer 260 ; bl = 0 : then switch to the next (second) half buffer 261 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 262 263 ; 27/11/2023 264 ; load 32768 bytes into audio buffer 265 00000141 BF[00F00000] mov edi, Audio_Buffer 266 ; 19/10/2017 267 ;mov ebx, BUFFERSIZE 268 00000146 BB00400000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 269 0000014B E882080000 call GetSamples 270 ; 27/12/2024 271 ;jc error_exit 272 273 ; ;mov ecx, 128 ; Make a lookup table 274 ; mov cl, 128 275 ; xor ebx, ebx ; for fastest pixel 276 ; mov edx, 320*(100-64) ; addressing. 277 ;MakeOfs: 278 ; mov [RowOfs+ebx], dx 279 ; mov [RowOfs+ebx+2], dx 280 ; add dx, 320 281 ; add ebx, 4 282 ; loop MakeOfs 283 284 ; 27/12/2024 285 00000150 B900010000 mov ecx, 256 286 ; 27/10/2017 287 ;mov cx, 256 288 00000155 31DB xor ebx, ebx 289 00000157 BF[D0D80000] mov edi, RowOfs 290 MakeOfs: 291 ; 29/10/2017 292 ;mov ax, 128 293 ;mul bx 294 ;mov al, ah 295 ;mov ah, 80 296 ;mul ah 297 0000015C 89D8 mov eax, ebx 298 0000015E 66C1E007 shl ax, 7 ; * 128 299 00000162 B050 mov al, 80 300 00000164 F6E4 mul ah 301 00000166 66AB stosw 302 00000168 43 inc ebx 303 00000169 E2F1 loop MakeOfs 304 305 ; 23/06/2017 306 ; Map DMA buffer to user's memory space 307 ;sys _audio, 0D00h, 65536, DMA_Buffer 308 ;;jc error_exit 309 ; 27/11/2023 310 sys _audio, 0D00h, 131072, 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 B900000200 <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 311 312 ; 24/06/2017 313 ; Set Master Volume Level (BL=0 or 80h) 314 ; for next playing (BL>=80h) 315 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 316 317 ; 20/10/2017 318 00000192 C605[25E30000]1D mov byte [volume_level], 1Dh 319 320 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 321 322 ; 27/11/2023 323 ; Start to play 324 ;mov al, [bps] 325 ;shr al, 4 ; 8 -> 0, 16 -> 1 326 ;shl al, 1 ; 16 -> 2, 8 -> 0 327 ;mov bl, [stmo] 328 ;dec bl 329 ;or bl, al 330 ;mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 331 ;mov bh, 4 ; start to play 332 ;sys _audio 333 334 ;; SETUP SIGNAL RESPONSE BYTE 335 ;; 06/03/2017 336 ;mov bl, [ac97_int_ln_reg] ; IRQ number 337 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 338 ;mov edx, srb ; Signal Response/Return Byte address 339 ;mov ecx, 0FFh ; Signal Response/Return Byte value 340 ;sys _calbac 341 ;jc short error_exit 342 343 ; DIRECT VGA MEMORY ACCESS 344 ; bl = 0, bh = 5 345 ; Direct access/map to VGA memory (0A0000h) 346 347 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 348 000001A5 3D00000A00 cmp eax, 0A0000h 349 000001AA 7418 je short _a3 350 error_exit: 351 sys _msg, trdos386_err_msg, 255, 0Eh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000001AC BB[99540000] <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 352 000001C2 EB63 jmp short Exit 353 354 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 355 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 356 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 357 ; second, or the module will sound "looped". 358 ; Because we need better sync with the ModPlayer to draw the scope, 359 ; the polling is called from my routine, and then the irq 0 must be 360 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 361 ; samples played by the Sound Blaster. Note that some samples are 362 ; discarded in the next code, just for fun! 363 364 _a3: 365 ;mov ax, 0013h ; Set Mode 320x200x256 366 ;int 31h 367 368 ; 21/10/2017 369 ;mov ax, 0012h ; Set Mode 640x480x16 370 ;int 31h 371 372 ; 22/10/2017 373 000001C4 E8FA0B0000 call setgraphmode ; Set video mode to 640*480x16 374 375 ; 22/10/2017 376 ;call loadlbm 377 ;jc short loadlbm_err 378 379 000001C9 BE[E40F0000] mov esi, LOGO_ADDRESS 380 000001CE E8DB0C0000 call putlbm 381 ;jnc short loadlbm_ok 382 000001D3 731F jnc short _a4 ; 383 384 ;mov byte [error_color], 0Eh ; Yellow 385 386 loadlbm_err: 387 ; 21/10/2017 388 ;mov ax, 0003h ; Set Text Mode 80x25x16 389 ;int 31h 390 ; 22/10/2017 391 000001D5 E8060C0000 call settextmode 392 393 sys _msg, LOGO_ERROR_MSG, 255, [error_color] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000001DA BB[B80F0000] <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 394 000001F1 EB34 jmp short Exit 395 396 ; 21/10/2017 397 error_color: 398 000001F3 0C db 0Ch ; Light Red 399 400 loadlbm_ok: 401 ; 21/10/2017 402 _a4: 403 ; 27/11/2023 404 ; Start to play 405 000001F4 A0[BF540000] mov al, [bps] 406 000001F9 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 407 000001FC D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 408 000001FE 8A1D[BE540000] mov bl, [stmo] 409 00000204 FECB dec bl 410 00000206 08C3 or bl, al 411 00000208 668B0D[C0540000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 412 0000020F B704 mov bh, 4 ; start to play 413 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 414 415 ; 24/06/2017 416 00000218 E863000000 call PlayMod ; 13/02/2017 (ModPlay) 417 418 _s_exit: 419 0000021D E8B0090000 call StopPlaying ; STOP! 420 421 ; 22/10/2017 422 ;mov ax, 0003h ; Set Text Mode 80x25x16 423 ;int 31h 424 00000222 E8B90B0000 call settextmode 425 Exit: 426 ;call FreeModule ; Free MODule core. 427 428 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 429 here: 430 0000022E EBFE jmp short here 431 432 pmsg_usage: 433 sys _msg, msg_usage, 255, 0Fh 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000230 BB[C5530000] <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 434 00000246 EBDF jmp short Exit 435 436 DetectICH: 437 ; 24/06/2017 438 ; Detect (BH=1) AC97 (BL=2) Audio Controller 439 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 440 00000254 C3 retn 441 442 noDevMsg: 443 00000255 4572726F723A20556E- db "Error: Unable to find AC97 audio device!",13,10,0 443 0000025E 61626C6520746F2066- 443 00000267 696E64204143393720- 443 00000270 617564696F20646576- 443 00000279 696365210D0A00 444 445 ;ac97_int_handler: 446 ; ; 19/06/2017 447 ; mov byte [srb], 1 ; interrupt (or signal response byte) 448 ; 449 ; sys _rele ; return from callback service 450 ; ; we must not come here ! 451 ; sys _exit 452 453 ;============================================================================= 454 ; 455 ;============================================================================= 456 457 ; 27/12/2024 458 PlayMod: 459 ; 27/11/2023 460 ; 27/10/2017 461 ; 19/10/2017 462 ; 23/06/2017 463 ; 21/06/2017 464 ; 19/06/2017 465 466 ; 05/03/2017 (TRDOS 386) 467 ; 14/02/2017 468 ; 13/02/2017 469 ; 08/12/2016 470 ; 28/11/2016 471 472 ; 27/11/2023 473 ;jmp short modp_gs 474 p_loop: 475 00000280 803D[8D550000]00 cmp byte [srb], 0 476 00000287 761D jna short q_loop 477 00000289 C605[8D550000]00 mov byte [srb], 0 478 modp_gs: 479 00000290 BF[00F00000] mov edi, Audio_Buffer 480 ; 19/10/2017 481 ;mov ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017 482 00000295 BB00400000 mov ebx, BUFFERSIZE/4 ; 16 bits, stereo sound buffer 483 0000029A E833070000 call GetSamples 484 ;jc error_exit 485 ; 27/11/2023 486 0000029F 73DF jnc short p_loop 487 000002A1 E906FFFFFF jmp error_exit 488 q_loop: 489 000002A6 B401 mov ah, 1 ; any key pressed? 490 000002A8 CD32 int 32h ; no, Loop. 491 000002AA 745C jz short r_loop 492 493 000002AC B400 mov ah, 0 ; flush key buffer... 494 000002AE CD32 int 32h 495 496 ; 19/10/2017 (modplay6.s) 497 000002B0 3C20 cmp al, 20h 498 000002B2 740E je short change_pan 499 ; 09/10/2017 (playmod5.s) 500 000002B4 3C2B cmp al, '+' ; increase sound volume 501 000002B6 741D je short inc_volume_level 502 000002B8 3C2D cmp al, '-' 503 000002BA 743C je short dec_volume_level 504 505 ; 19/10/2017 (modplay6.s) 506 000002BC 24DF and al, 0DFh 507 000002BE 3C50 cmp al, 'P' 508 000002C0 7545 jne short q_return 509 510 change_pan: 511 ; 19/10/2017 (modplay6.s) 512 000002C2 8A0D[24E30000] mov cl, [pan_shift] 513 000002C8 FEC1 inc cl 514 000002CA 80E103 and cl, 3 515 000002CD 880D[24E30000] mov [pan_shift], cl 516 000002D3 EB33 jmp short r_loop 517 518 ; 09/10/2017 (playmod5.s) 519 ; 24/06/2017 (wavplay2.s) 520 inc_volume_level: 521 000002D5 8A0D[25E30000] mov cl, [volume_level] 522 000002DB 80F91F cmp cl, 1Fh ; 31 523 000002DE 7328 jnb short r_loop 524 000002E0 FEC1 inc cl 525 change_volume_level: 526 000002E2 880D[25E30000] mov [volume_level], cl 527 000002E8 88CD mov ch, cl 528 ; Set Master Volume Level 529 sys _audio, 0B00h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000002EA 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 000002EF B820000000 <1> mov eax, %1 110 <1> 111 000002F4 CD40 <1> int 40h 530 000002F6 EB10 jmp short r_loop 531 dec_volume_level: 532 000002F8 8A0D[25E30000] mov cl, [volume_level] 533 000002FE 80F901 cmp cl, 1 ; 1 534 00000301 7605 jna short r_loop 535 00000303 FEC9 dec cl 536 00000305 EBDB jmp short change_volume_level 537 538 q_return: 539 00000307 C3 retn 540 r_loop: 541 ;;; 542 ; 27/12/2024 543 sys _time, 4 ; get timer ticks (18.2 ticks/second) 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000308 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 0000030D B80D000000 <1> mov eax, %1 110 <1> 111 00000312 CD40 <1> int 40h 544 00000314 3B05[D0E20000] cmp eax, [timerticks] 545 0000031A 0F8460FFFFFF je p_loop 546 00000320 A3[D0E20000] mov [timerticks], eax 547 ;;; 548 549 ; 27/10/2017 550 ; Get Current DMA buffer Pointer 551 ; 23/06/2017 ('modplay6.s') 552 ; bh = 15, get current pointer (DMA buffer offset) 553 ; bl = 0, for PCM OUT 554 ; ecx = 0 555 ; 556 sys _audio, 0F00h, 0 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000325 BB000F0000 <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000032A 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 0000032F B820000000 <1> mov eax, %1 110 <1> 111 00000334 CD40 <1> int 40h 557 558 ; 28/10/2017 559 00000336 24FC and al, 0FCh ; dword alignment (stereo, 16 bit) 560 ; 23/06/2017 561 00000338 BE[00000200] mov esi, DMA_Buffer 562 0000033D 01C6 add esi, eax ; add offset value 563 ; 24/06/2017 564 ;mov ecx, DMA_Buffer + (65536 - (256*4)) 565 ; 27/11/2023 566 0000033F B9[00FC0300] mov ecx, DMA_Buffer + (131072 - (256*4)) 567 00000344 39CE cmp esi, ecx 568 00000346 7602 jna short _4 569 00000348 89CE mov esi, ecx 570 _4: 571 ; 23/10/2017 ('tmodplay.s') 572 0000034A E8980A0000 call drawscopes 573 574 0000034F E92CFFFFFF jmp p_loop 575 576 ;============================================================================= 577 ; MODLOAD.ASM 578 ;============================================================================= 579 580 ; Amiga Module Loader v0.1b by Carlos Hasan. 581 ; July 10th, 1993. 582 583 ; STRUCTURES 584 585 struc ModSample 586 00000000 .msName: resb 22 587 00000016 ???? .msLength: resw 1 588 00000018 ?? .msFinetune: resb 1 589 00000019 ?? .msVolume: resb 1 590 0000001A ???? .msRepeat: resw 1 591 0000001C ???? .msRepLen: resw 1 592 .size: ; 30 bytes 593 endstruc 594 595 struc ModHeader 596 00000000 .mhName: resb 20 597 00000014 .mhSamples: resb ModSample.size*31 598 000003B6 ?? .mhOrderLen: resb 1 599 000003B7 ?? .mhReStart: resb 1 600 000003B8 .mhOrder: resb 128 601 00000438 ???????? .mhSign: resw 2 602 .size: ; 1084 bytes 603 endstruc 604 605 struc ModInfoRec 606 00000000 ?? .OrderLen: resb 1 607 00000001 ?? .ReStart: resb 1 608 00000002 .Order: resb 128 609 00000082 ???????? .Patterns: resd 1 610 00000086 .SampOfs: resw 31 611 000000C4 .SampSeg: resw 31 612 00000102 .SampLen: resw 31 613 00000140 .SampRep: resw 31 614 0000017E .SampRepLen: resw 31 615 000001BC .SampVol: resw 31 616 .size: ; 506 bytes 617 endstruc 618 619 ; CODE 620 621 ; modplay5.s 622 ; 07/10/2017 623 ; tinyply3.s 624 ; 06/10/2017 625 ; 04/10/2017 626 ; /* MOD FileFormat */ 627 628 ID_MK equ 2E4B2E4Dh ; "M.K." 629 ID_FLT4 equ 34544C46h ; "FLT4" 630 ID_8CHN equ 4E484338h ; "8CHN" 631 ID_FLT8 equ 34544C46h ; "FLT8" 632 633 ; CODE 634 635 LoadModule: 636 ; edi = file name address 637 638 00000354 60 pushad 639 640 00000355 E871010000 call ClearModInfo 641 OpenFile: 642 ; ebx = ASCIIZ file name address 643 ; ecx = open mode (0 = open for read) 644 sys _open, edi, 0 ; open for reading 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 0000035A 89FB <1> mov ebx, %2 102 <1> %if %0 >= 3 103 0000035C 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 00000361 B805000000 <1> mov eax, %1 110 <1> 111 00000366 CD40 <1> int 40h 645 00000368 0F825B010000 jc Failed 646 0000036E A3[8E550000] mov [FileHandle], eax 647 ReadHeader: 648 ; ebx = File handle 649 ; ecx = Buffer address 650 ; edx = Byte count 651 sys _read, [FileHandle], Header, ModHeader.size 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000373 8B1D[8E550000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000379 B9[92550000] <1> mov ecx, %3 104 <1> %if %0 = 4 105 0000037E BA3C040000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000383 B803000000 <1> mov eax, %1 110 <1> 111 00000388 CD40 <1> int 40h 652 0000038A 0F822A010000 jc CloseFile 653 CheckMK: 654 ; 04/10/2017 655 00000390 A1[CA590000] mov eax, [Header+ModHeader.mhSign] 656 657 00000395 3D4D2E4B2E cmp eax, ID_MK ; cmp eax, '.K.M' 658 ;je short Is4chnMod 659 0000039A 742B je short IsModFile 660 CheckFLT4: 661 0000039C 3D464C5434 cmp eax, ID_FLT4 ; cmp eax, '4TLF' 662 ;je short Is4chnMod 663 000003A1 7424 je short IsModFile 664 Check8CHN: 665 000003A3 3D3843484E cmp eax, ID_8CHN ; cmp eax, 'NHC8' 666 000003A8 740D je short Is8chnMod 667 CheckFLT8: 668 000003AA 3D464C5434 cmp eax, ID_FLT8 ; cmp eax, '8TLF' 669 ; 06/10/2017 670 000003AF 7406 je short Is8chnMod 671 000003B1 F9 stc 672 000003B2 E903010000 jmp CloseFile 673 Is8chnMod: 674 000003B7 C605[BA540000]08 mov byte [numtracks], 8 ; 8-CHANNEL-MOD 675 000003BE C605[B9540000]0B mov byte [pattern_shift], 11 ; Pattern Size = 2048 bytes 676 000003C5 EB00 jmp short IsModFile 677 ;Is4chnMod: 678 ; mov byte [numtracks], 4 ; 4-CHANNEL-MOD 679 ; mov byte [pattern_shift], 11 ; Pattern Size = 1024 bytes 680 681 IsModFile: 682 000003C7 A0[48590000] mov al, [Header+ModHeader.mhOrderLen] 683 000003CC A2[CE590000] mov [ModInfo.OrderLen], al 684 685 000003D1 A0[49590000] mov al, [Header+ModHeader.mhReStart] 686 000003D6 3A05[48590000] cmp al, [Header+ModHeader.mhOrderLen] 687 000003DC 7202 jb short SetReStart 688 000003DE B07F mov al, 7Fh 689 SetReStart: 690 000003E0 A2[CF590000] mov [ModInfo.ReStart], al 691 692 ;mov ecx, 128 693 000003E5 66B98000 mov cx, 128 694 000003E9 31D2 xor edx, edx 695 000003EB 31DB xor ebx, ebx 696 CopyOrder: 697 000003ED 8AB3[4A590000] mov dh, [Header+ModHeader.mhOrder+ebx] 698 000003F3 88B3[D0590000] mov [ModInfo.Order+ebx], dh 699 000003F9 38D6 cmp dh, dl 700 000003FB 7202 jb short NextOrder 701 000003FD 88F2 mov dl, dh ; Max. pattern number ; 04/10/2017 702 NextOrder: 703 000003FF 43 inc ebx 704 00000400 E2EB loop CopyOrder 705 AllocPatterns: 706 00000402 81E2FF000000 and edx, 0FFh 707 ; 04/10/2017 708 ;inx dx ; 12/03/2017 709 00000408 FEC2 inc dl 710 ; dl = number of patterns (04/07/2017) 711 0000040A 8A0D[B9540000] mov cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels 712 00000410 D3E2 shl edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4) 713 ; *2048 ; (byte count of patterns *64*8*4) 714 ; 715 00000412 89D5 mov ebp, edx ; offset of samples (04/07/2017) 716 ;mov ecx, 10000h ; next 64K (4096*16) 717 00000414 B9[00000400] mov ecx, file_buffer ; 12/03/2017 718 ; 719 00000419 890D[505A0000] mov [ModInfo.Patterns], ecx 720 ; 721 0000041F 01CD add ebp, ecx ; next offset for samples 722 ReadPatterns: 723 ;mov ebx, [FileHandle] 724 ; ebx = File handle 725 ; ecx = Buffer address 726 ; edx = Byte count 727 sys _read, [FileHandle] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000421 8B1D[8E550000] <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 00000427 B803000000 <1> mov eax, %1 110 <1> 111 0000042C CD40 <1> int 40h 728 0000042E 0F8286000000 jc CloseFile 729 730 ; patterns have been loaded here... (04/07/2017) 731 732 00000434 BE[A6550000] mov esi, Header+ModHeader.mhSamples 733 00000439 31FF xor edi, edi 734 CopySamples: 735 0000043B 668B4616 mov ax, [esi+ModSample.msLength] 736 0000043F 86E0 xchg al, ah 737 ;shl ax, 1 738 ; 27/11/2023 739 00000441 D1E0 shl eax, 1 740 00000443 668987[D05A0000] mov [ModInfo.SampLen+edi], ax 741 ; 27/11/2023 742 0000044A 31C0 xor eax, eax 743 0000044C 8A4619 mov al, [esi+ModSample.msVolume] 744 ;xor ah, ah 745 0000044F 668987[8A5B0000] mov [ModInfo.SampVol+edi], ax 746 00000456 668B461A mov ax, [esi+ModSample.msRepeat] 747 0000045A 86E0 xchg al, ah 748 ;shl ax, 1 749 ; 27/11/2023 750 0000045C D1E0 shl eax, 1 751 0000045E 668987[0E5B0000] mov [ModInfo.SampRep+edi], ax 752 00000465 668B461C mov ax, [esi+ModSample.msRepLen] 753 00000469 86E0 xchg al, ah 754 ;shl ax, 1 755 ; 27/11/2023 756 0000046B D1E0 shl eax, 1 757 0000046D 668987[4C5B0000] mov [ModInfo.SampRepLen+edi], ax 758 00000474 83C61E add esi, ModSample.size 759 ;add di, 2 760 ; 27/11/2023 761 00000477 47 inc edi 762 00000478 47 inc edi 763 00000479 6683FF3E cmp di, 2*31 764 0000047D 72BC jb short CopySamples 765 766 0000047F 31F6 xor esi, esi 767 AllocSamples: 768 00000481 0FB796[D05A0000] movzx edx, word [ModInfo.SampLen+esi] 769 ; 07/10/2017 770 ;shr dx, 4 ; *** 771 00000488 21D2 and edx, edx 772 0000048A 7426 jz short NextSample 773 ;inc dx ; number of paragraphs ; *** 774 ;shl dx, 4 ; *** 775 0000048C 89E8 mov eax, ebp 776 0000048E 668986[545A0000] mov [ModInfo.SampOfs+esi], ax 777 00000495 C1E810 shr eax, 16 778 00000498 668986[925A0000] mov [ModInfo.SampSeg+esi], ax 779 0000049F 89E9 mov ecx, ebp 780 000004A1 01D5 add ebp, edx ; next offset for sample 781 ReadSample: 782 ;mov ebx, [FileHandle] 783 ;movzx edx, [ModInfo.SampLen+esi] 784 ;mov ecx, [ModInfo.SampOfs+esi] 785 786 ; ebx = File handle 787 ; ecx = Buffer address 788 ; edx = Byte count 789 sys _read, [FileHandle] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000004A3 8B1D[8E550000] <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 000004A9 B803000000 <1> mov eax, %1 110 <1> 111 000004AE CD40 <1> int 40h 790 000004B0 7208 jc short CloseFile 791 792 NextSample: 793 ;add si, 2 794 ; 27/11/2023 795 000004B2 46 inc esi 796 000004B3 46 inc esi 797 000004B4 6683FE3E cmp si, 2*31 798 000004B8 72C7 jb short AllocSamples 799 CloseFile: 800 000004BA 9C pushf 801 sys _close, [FileHandle] 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 000004BB 8B1D[8E550000] <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 000004C1 B806000000 <1> mov eax, %1 110 <1> 111 000004C6 CD40 <1> int 40h 802 000004C8 9D popf 803 Failed: 804 000004C9 61 popad 805 000004CA C3 retn 806 807 FreeModule: 808 ; Erdogan Tan (13/02/2017) 809 ; nothing to do here for memory de-allocation 810 ClearModInfo: 811 000004CB 57 push edi 812 000004CC BF[CE590000] mov edi, ModInfo 813 000004D1 B9FA010000 mov ecx, ModInfoRec.size 814 ;cld 815 000004D6 30C0 xor al, al 816 000004D8 F3AA rep stosb 817 000004DA 5F pop edi 818 000004DB C3 retn 819 820 ;============================================================================= 821 ; MODPLAY.ASM 822 ;============================================================================= 823 824 ; Amiga Module Loader v0.3b by Carlos Hasan. 825 ; July 23th, 1993. 826 827 ; EQUATES 828 829 ;NumTracks equ 4 ; 07/10/2017 ([numtracks]) 830 DefTempo equ 6 831 DefBpm equ 125 832 MidCRate equ 8448 833 MixBufSize equ 4096 834 ;MixBufSize equ 7680 ; 17/10/2017 ; ((48000/50)*8) 835 836 ; STRUCTURES 837 838 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 839 00000000 ???????? .Samples: resd 1 840 ;.Position: resw 1 841 00000004 ???????? .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 842 00000008 ???? .Len: resw 1 843 0000000A ???? .Repeat: resw 1 844 0000000C ???? .RepLen: resw 1 845 0000000E ?? .Volume: resb 1 ; Volume 846 0000000F ?? .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 847 ;.Error: resb 1 848 ;.Reserved: resb 1 ; 01/10/2017 849 00000010 ???? .Period: resw 1 ; Period 850 00000012 ???? .Pitch: resw 1 851 00000014 ???? .Effect: resw 1 ; Effect 852 00000016 ???? .PortTo: resw 1 ; Toneporta wanted period 853 00000018 ?? .PortParm: resb 1 ; Toneporta speed 854 00000019 ?? .VibPos: resb 1 ; Vibrato wave position 855 0000001A ?? .VibParm: resb 1 ; Vibrato depth/rate 856 0000001B ?? .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 857 0000001C ?? .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 858 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 859 0000001D ?? .Error: resb 1 ; 01/10/2017 860 0000001E ???????????? .Arp: resw 3 861 00000024 ???? .ArpIndex: resw 1 862 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 863 endstruc 864 865 ; CODE 866 867 ;-------------------------------------------------------------------------- 868 ; updatechannel - update the track using the current effect 869 ;-------------------------------------------------------------------------- 870 ; 871 ;-------------------------------------------------------------------------- 872 ; Track: Process the next in one track. 873 ; In: 874 ; ds:di - Track info Address. 875 ;-------------------------------------------------------------------------- 876 877 ; edi = Track info address 878 879 updatechannel: 880 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 881 882 000004DC 668B5714 mov dx, [edi+TrackInfo.Effect] 883 884 ;test dx, dx 885 ;je short None 886 ;cmp dh, 00h 887 ;je short Arpeggio 888 ;cmp dh, 01h 889 ;je short PortUp 890 ;cmp dh, 02h 891 ;je short PortDown 892 ;cmp dh, 03h 893 ;je TonePort 894 ;cmp dh, 04h 895 ;je Vibrato 896 ;cmp dh, 05h 897 ;je PortSlide 898 ;cmp dh, 06h 899 ;je VibSlide 900 ;cmp dh, 0Ah 901 ;je VolSlide 902 ;retn 903 904 000004E0 0FB6C6 movzx eax, dh 905 000004E3 240F and al, 0Fh 906 000004E5 FF2485[BC520000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 907 efxnull: 908 None: 909 000004EC C3 retn 910 efxarpeggio2: 911 ; 01/10/2017 912 000004ED 84D2 test dl, dl 913 000004EF 74FB jz short efxnull 914 Arpeggio: 915 000004F1 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 916 000004F5 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 917 000004FA 66894712 mov [edi+TrackInfo.Pitch], ax 918 000004FE 6683C302 add bx, 2 919 00000502 6683FB06 cmp bx, 6 920 00000506 7202 jb short SetArpIndex 921 00000508 31DB xor ebx, ebx 922 SetArpIndex: 923 0000050A 66895F24 mov [edi+TrackInfo.ArpIndex], bx 924 0000050E C3 retn 925 efxportaup: 926 PortUp: 927 0000050F 30F6 xor dh, dh 928 ;mov bx, [edi+TrackInfo.Period] 929 00000511 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 930 00000515 6629D3 sub bx, dx 931 ;cmp bx, 113 932 00000518 6683FB1C cmp bx, 28 ; 01/10/2017 933 0000051C 7D04 jge short NotSmall 934 ;mov bx, 113 935 0000051E 66BB1C00 mov bx, 28 ; 01/10/2017 936 NotSmall: 937 00000522 66895F10 mov [edi+TrackInfo.Period], bx 938 00000526 6601DB add bx, bx 939 ;mov ax, [PitchTable+bx] 940 00000529 668B83[C85B0000] mov ax, [PitchTable+ebx] ; 02/10/2017 941 00000530 66894712 mov [edi+TrackInfo.Pitch], ax 942 00000534 C3 retn 943 efxportadown: 944 PortDown: 945 00000535 30F6 xor dh, dh 946 ;mov bx, [edi+TrackInfo.Period] 947 00000537 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 948 0000053B 6601D3 add bx, dx 949 0000053E 6681FB600D cmp bx, 3424 ; 01/10/2017 950 ;cmp bx, 856 951 00000543 7E04 jle short NotBig 952 ;mov bx, 856 953 00000545 66BB600D mov bx, 3424 ; 01/10/2017 954 NotBig: 955 00000549 66895F10 mov [edi+TrackInfo.Period], bx 956 0000054D 6601DB add bx, bx 957 ;mov ax, [PitchTable+bx] 958 00000550 668B83[C85B0000] mov ax, [PitchTable+ebx] ; 02/10/2017 959 00000557 66894712 mov [edi+TrackInfo.Pitch], ax 960 0000055B C3 retn 961 efxtoneporta2: 962 TonePort: 963 0000055C 30F6 xor dh, dh 964 0000055E 668B4716 mov ax, [edi+TrackInfo.PortTo] 965 ;mov bx, [edi+TrackInfo.Period] 966 00000562 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 967 00000566 6639C3 cmp bx, ax 968 00000569 7429 je short NoPort 969 0000056B 7F0D jg short PortToUp 970 PortToDown: 971 0000056D 6601D3 add bx, dx 972 00000570 6639C3 cmp bx, ax 973 00000573 7E0D jle short SetPort 974 FixPort: 975 00000575 6689C3 mov bx, ax 976 00000578 EB08 jmp short SetPort 977 PortToUp: 978 0000057A 6629D3 sub bx, dx 979 0000057D 6639C3 cmp bx, ax 980 00000580 7CF3 jl short FixPort 981 SetPort: 982 00000582 66895F10 mov [edi+TrackInfo.Period], bx 983 00000586 6601DB add bx, bx 984 ;mov ax, [PitchTable+bx] 985 00000589 668B83[C85B0000] mov ax, [PitchTable+ebx] ; 02/10/2017 986 00000590 66894712 mov [edi+TrackInfo.Pitch], ax 987 NoPort: 988 00000594 C3 retn 989 efxvibrato2: 990 ; 01/10/2017 991 Vibrato: 992 00000595 88D6 mov dh, dl 993 ;and dl, 0Fh 994 ;shr dh, 4 995 ;shl dh, 2 996 00000597 6681E20FF0 and dx, 0F00Fh 997 0000059C C0EE02 shr dh, 2 998 ;add [edi+TrackInfo.VibPos], dh 999 ;mov dh, [edi+TrackInfo.VibPos] 1000 ;mov bl, dh 1001 0000059F 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 1002 000005A2 007719 add [edi+TrackInfo.VibPos], dh 1003 000005A5 88DE mov dh, bl ; 01/10/2017 1004 000005A7 C0EB02 shr bl, 2 1005 ;and bx, 1Fh 1006 ;mov al, [SinTable+bx] 1007 000005AA 83E31F and ebx, 1Fh 1008 000005AD 8A83[A4530000] mov al, [SinTable+ebx] 1009 000005B3 F6E2 mul dl 1010 ;rol ax, 1 1011 ;xchg al, ah 1012 ;and ah, 1 1013 000005B5 66C1E807 shr ax, 7 1014 000005B9 84F6 test dh, dh 1015 000005BB 7903 jns short VibUp 1016 000005BD 66F7D8 neg ax 1017 VibUp: 1018 000005C0 66034710 add ax, [edi+TrackInfo.Period] 1019 000005C4 6689C3 mov bx, ax 1020 ;movzx ebx, ax 1021 000005C7 6683FB71 cmp bx, 113 1022 ;cmp bx, 113 1023 000005CB 6683FB1C cmp bx, 28 ; 01/10/2017 1024 000005CF 7D06 jge short NoLoVib 1025 ;mov bx, 113 1026 000005D1 66BB1C00 mov bx, 28 ; 01/10/2017 1027 000005D5 EB0B jmp short NoHiVib ; 01/10/2017 1028 NoLoVib: 1029 000005D7 6681FB600D cmp bx, 3424 ; 01/10/2017 1030 ;cmp bx, 856 1031 000005DC 7E04 jle short NoHiVib 1032 ;mov bx, 856 1033 000005DE 66BB600D mov bx, 3424 ; 01/10/2017 1034 NoHiVib: 1035 000005E2 6601DB add bx, bx 1036 ;mov ax, [PitchTable+bx] 1037 000005E5 668B83[C85B0000] mov ax, [PitchTable+ebx] ; 01/10/2017 1038 000005EC 66894712 mov [edi+TrackInfo.Pitch], ax 1039 000005F0 C3 retn 1040 efxtoneslide: 1041 PortSlide: 1042 000005F1 E812000000 call VolSlide 1043 000005F6 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1044 000005F9 E95EFFFFFF jmp TonePort ; efxtoneporta2 1045 efxvibslide: 1046 VibSlide: 1047 000005FE E805000000 call VolSlide 1048 00000603 8A571A mov dl, [edi+TrackInfo.VibParm] 1049 00000606 EB8D jmp short Vibrato ; efxvibrato2 1050 efxvolslide: 1051 VolSlide: 1052 00000608 88D6 mov dh, dl 1053 0000060A 80E20F and dl, 0Fh 1054 0000060D C0EE04 shr dh, 4 1055 00000610 8A470E mov al, [edi+TrackInfo.Volume] 1056 00000613 28D0 sub al, dl 1057 00000615 7D02 jge short NoLoVol 1058 00000617 30C0 xor al, al 1059 NoLoVol: 1060 00000619 00F0 add al, dh 1061 0000061B 3C40 cmp al, 64 1062 0000061D 7602 jbe short NoHiVol 1063 0000061F B040 mov al, 64 1064 NoHiVol: 1065 00000621 88470E mov [edi+TrackInfo.Volume], al 1066 00000624 C3 retn 1067 1068 efxtremolo2: 1069 ; 01/10/2017 (TMODPLAY.ASM) 1070 Tremolo: 1071 00000625 88D6 mov dh, dl 1072 00000627 6681E20FF0 and dx, 0F00Fh 1073 0000062C C0EE02 shr dh, 2 1074 0000062F 8A5F1B mov bl, [edi+TrackInfo.TremPos] 1075 00000632 00771B add [edi+TrackInfo.TremPos], dh 1076 00000635 88DE mov dh, bl 1077 00000637 C0EB02 shr bl, 2 1078 ; 01/10/2017 - TRDOS 386 1079 ;and bx, 1Fh 1080 0000063A 83E31F and ebx, 1Fh 1081 ;mov al, [SinTable+bx] 1082 0000063D 8A83[A4530000] mov al, [SinTable+ebx] 1083 00000643 F6E2 mul dl 1084 00000645 66C1E806 shr ax, 6 1085 00000649 84F6 test dh, dh 1086 0000064B 7D03 jge short Tremolo_1 ; efxtremolof2 1087 0000064D 66F7D8 neg ax 1088 efxtremolof2: 1089 Tremolo_1: 1090 00000650 8A670E mov ah, [edi+TrackInfo.Volume] 1091 00000653 00E0 add al, ah 1092 00000655 7D02 jge short Tremolo_2 ; efxtremolof3 1093 00000657 30C0 xor al, al 1094 efxtremolof3: 1095 Tremolo_2: 1096 00000659 3C40 cmp al, 64 ; 40h 1097 0000065B 7E02 jle short Tremolo_3 ; efxtremolof4 1098 0000065D B040 mov al, 64 ; 40h 1099 efxtremolof4: 1100 Tremolo_3: 1101 0000065F 28E0 sub al, ah ; ****** 1102 00000661 88470F mov [edi+TrackInfo.VolDiff], al 1103 00000664 C3 retn 1104 1105 ;-------------------------------------------------------------------------- 1106 ; readchannel - read the next note event from the pattern sheet 1107 ;-------------------------------------------------------------------------- 1108 ; 1109 ;-------------------------------------------------------------------------- 1110 ; GetTrack: Get the next Note from a pattern. 1111 ; In: 1112 ; ds:di - Track info Address. 1113 ; es:si - Pattern Note Address. 1114 ; Out: 1115 ; es:si - The Next Pattern Note address. 1116 ;-------------------------------------------------------------------------- 1117 1118 ; esi = Pattern note address 1119 ; edi = Track info address 1120 1121 readchannel: 1122 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1123 00000665 66AD lodsw 1124 00000667 86E0 xchg al, ah 1125 00000669 88E3 mov bl, ah 1126 0000066B 80E40F and ah, 0Fh 1127 0000066E 6689C1 mov cx, ax 1128 00000671 66AD lodsw 1129 00000673 86E0 xchg al, ah 1130 00000675 88E7 mov bh, ah 1131 00000677 80E40F and ah, 0Fh 1132 0000067A 6689C2 mov dx, ax 1133 0000067D 66895714 mov [edi+TrackInfo.Effect], dx 1134 ; 01/10/2017 - TRDOS 386 1135 ;and bl, 0F0h 1136 00000681 81E3F0FF0000 and ebx, 0FFF0h 1137 00000687 C0EF04 shr bh, 4 1138 0000068A 08FB or bl, bh 1139 0000068C 7446 jz short SetPeriod 1140 SetSample: 1141 0000068E 30FF xor bh, bh 1142 ;and ebx, 0FFh 1143 00000690 FECB dec bl 1144 00000692 01DB add ebx, ebx 1145 00000694 668B83[8A5B0000] mov ax, [ModInfo.SampVol+ebx] 1146 0000069B 88470E mov [edi+TrackInfo.Volume], al 1147 0000069E 668B83[545A0000] mov ax, [ModInfo.SampOfs+ebx] 1148 000006A5 668907 mov [edi+TrackInfo.Samples], ax 1149 000006A8 668B83[925A0000] mov ax, [ModInfo.SampSeg+ebx] 1150 000006AF 66894702 mov [edi+TrackInfo.Samples+2], ax 1151 000006B3 668B83[D05A0000] mov ax, [ModInfo.SampLen+ebx] 1152 000006BA 66894708 mov [edi+TrackInfo.Len], ax 1153 000006BE 668B83[0E5B0000] mov ax, [ModInfo.SampRep+ebx] 1154 000006C5 6689470A mov [edi+TrackInfo.Repeat], ax 1155 000006C9 668B83[4C5B0000] mov ax, [ModInfo.SampRepLen+ebx] 1156 000006D0 6689470C mov [edi+TrackInfo.RepLen], ax 1157 SetPeriod: 1158 000006D4 6685C9 test cx, cx 1159 000006D7 7425 jz short SetEffect 1160 1161 000006D9 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1162 1163 000006DD 80FE03 cmp dh, 03h 1164 ;je short SetEffect 1165 000006E0 7428 je short efxtoneporta ; 01/10/2017 1166 1167 000006E2 66894F10 mov [edi+TrackInfo.Period], cx 1168 ;movzx ebx, cx 1169 000006E6 6689CB mov bx, cx 1170 000006E9 6601DB add bx, bx 1171 ;mov ax, [PitchTable+bx] 1172 000006EC 668B83[C85B0000] mov ax, [PitchTable+ebx] ; 01/10/2017 1173 000006F3 66894712 mov [edi+TrackInfo.Pitch], ax 1174 000006F7 C7470400000000 mov dword [edi+TrackInfo.Position], 0 1175 SetEffect: 1176 ;test dx, dx 1177 ;je short InitNone 1178 ;cmp dh, 00h 1179 ;je InitArpeggio 1180 ;cmp dh, 03h 1181 ;je short InitTonePort 1182 ;cmp dh, 04h 1183 ;je short InitVibrato 1184 ;cmp dh, 09h 1185 ;je short SampleOfs 1186 ;cmp dh, 0Bh 1187 ;je short PosJump 1188 ;cmp dh, 0Ch 1189 ;je short SetVolume 1190 ;cmp dh, 0Dh 1191 ;je short Break 1192 ;cmp dh, 0Fh 1193 ;je SetSpeed 1194 ;retn 1195 1196 ; 01/10/2017 (TMODPLAY.ASM) 1197 1198 ; dx = [di+TrackInfo.Effect] 1199 1200 000006FE 0FB6C6 movzx eax, dh 1201 00000701 240F and al, 0Fh 1202 00000703 FF2485[7C520000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1203 ;efxnull: 1204 ;InitNone: 1205 ; retn 1206 efxtoneporta: 1207 ; 01/10/2017 1208 ; cx = period 1209 ;mov [edi+TrackInfo.PortTo], cx ; * 1210 InitTonePort: 1211 0000070A 84D2 test dl, dl 1212 0000070C 7503 jnz short SetPortParm 1213 0000070E 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1214 SetPortParm: 1215 00000711 885718 mov [edi+TrackInfo.PortParm], dl 1216 00000714 66895714 mov [edi+TrackInfo.Effect], dx 1217 00000718 C3 retn 1218 efxvibrato: 1219 InitVibrato: 1220 00000719 8A471A mov al, [edi+TrackInfo.VibParm] 1221 0000071C 88C4 mov ah, al 1222 ;and al, 0Fh 1223 ;and ah, 0F0h 1224 0000071E 66250FF0 and ax, 0F00Fh 1225 00000722 F6C20F test dl, 0Fh 1226 00000725 7502 jne short OkDepth 1227 00000727 08C2 or dl, al 1228 OkDepth: 1229 00000729 F6C2F0 test dl, 0F0h 1230 0000072C 7502 jnz short OkRate 1231 0000072E 08E2 or dl, ah 1232 OkRate: 1233 00000730 88571A mov [edi+TrackInfo.VibParm], dl 1234 00000733 66895714 mov [edi+TrackInfo.Effect], dx 1235 00000737 6685C9 test cx, cx 1236 0000073A 7404 jz short OkPos 1237 0000073C C6471900 mov byte [edi+TrackInfo.VibPos], 0 1238 OkPos: 1239 00000740 C3 retn 1240 efxsampoffset: 1241 ; 01/10/2017 ; ******* 1242 SampleOfs: 1243 ; test dl, dl 1244 ; jnz short SetSampleOfs 1245 ; mov dl, [edi+TrackInfo.OldSampOfs] 1246 ;SetSampleOfs: 1247 ; mov [edi+TrackInfo.OldSampOfs], dl 1248 00000741 88D6 mov dh, dl 1249 00000743 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1250 00000749 895704 mov [edi+TrackInfo.Position], edx 1251 0000074C C3 retn 1252 efxpattjump: 1253 PosJump: 1254 0000074D 8815[8AD70000] mov [OrderPos], dl 1255 00000753 C605[8ED70000]40 mov byte [Row], 64 1256 0000075A C3 retn 1257 efxsetvolume: 1258 SetVolume: 1259 0000075B 80FA40 cmp dl, 64 1260 0000075E 7602 jbe short OkVol 1261 00000760 B240 mov dl, 64 1262 OkVol: 1263 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1264 00000762 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1265 ;mov [edi+TrackInfo.Volume], dl 1266 00000764 6689570E mov [edi+TrackInfo.Volume], dx 1267 00000768 C3 retn 1268 efxbreak: 1269 Break: 1270 00000769 88D6 mov dh, dl 1271 0000076B 80E20F and dl, 0Fh 1272 0000076E C0EE04 shr dh, 4 1273 00000771 00F6 add dh, dh 1274 00000773 00F2 add dl, dh 1275 00000775 C0E602 shl dh, 2 1276 00000778 00F2 add dl, dh 1277 0000077A 8815[8FD70000] mov [BreakRow], dl 1278 00000780 C605[8ED70000]40 mov byte [Row], 64 1279 00000787 C3 retn 1280 efxsetspeed: 1281 SetSpeed: 1282 00000788 84D2 test dl,dl 1283 0000078A 7431 je Skip 1284 0000078C 80FA1F cmp dl,31 1285 0000078F 770D ja short SetBpm 1286 SetTempo: 1287 00000791 8815[8BD70000] mov [Tempo], dl 1288 00000797 8815[8CD70000] mov [TempoWait], dl 1289 0000079D C3 retn 1290 SetBpm: 1291 0000079E 8815[8DD70000] mov [Bpm], dl 1292 000007A4 B067 mov al, 103 1293 000007A6 F6E2 mul dl 1294 000007A8 88E3 mov bl, ah 1295 000007AA 30FF xor bh, bh 1296 000007AC 66A1[C0540000] mov ax, [MixSpeed] 1297 ;xor dx, dx 1298 ; 27/11/2023 1299 000007B2 31D2 xor edx, edx 1300 000007B4 66F7F3 div bx 1301 000007B7 66A3[90D70000] mov [BpmSamples], ax 1302 Skip: 1303 000007BD C3 retn 1304 efxarpeggio: 1305 ; 01/10/2017 1306 000007BE 84D2 test dl, dl 1307 ;je efxnull 1308 000007C0 74FB je short Skip 1309 InitArpeggio: 1310 000007C2 88D6 mov dh, dl 1311 000007C4 80E20F and dl, 0Fh 1312 000007C7 C0EE04 shr dh, 4 1313 ; 01/10/2017 1314 ;mov cx, 36 1315 000007CA 66B95400 mov cx, 84 ; 84 notes/periods 1316 000007CE 31DB xor ebx, ebx 1317 000007D0 668B4710 mov ax, [edi+TrackInfo.Period] 1318 gt_ScanPeriod: 1319 ;cmp ax, [PeriodTable+bx] 1320 000007D4 663B83[FC520000] cmp ax, [PeriodTable+ebx] 1321 000007DB 7306 jae short SetArp 1322 000007DD 6683C302 add bx, 2 1323 000007E1 E2F1 loop gt_ScanPeriod 1324 SetArp: 1325 000007E3 6601D2 add dx, dx 1326 000007E6 00DE add dh, bl 1327 000007E8 00DA add dl, bl 1328 ; 01/10/2017 1329 ;mov bx, [PeriodTable+bx] 1330 000007EA 668B9B[FC520000] mov bx, [PeriodTable+ebx] 1331 ;add bx, bx 1332 000007F1 01DB add ebx, ebx 1333 ;mov ax, [PitchTable+bx] 1334 000007F3 668B83[C85B0000] mov ax, [PitchTable+ebx] 1335 000007FA 6689471E mov [edi+TrackInfo.Arp], ax 1336 000007FE 88F3 mov bl, dh 1337 00000800 30FF xor bh, bh 1338 00000802 668B9B[FC520000] mov bx, [PeriodTable+ebx] 1339 ;add bx, bx 1340 00000809 01DB add ebx, ebx 1341 ;mov ax, [PitchTable+bx] 1342 0000080B 668B83[C85B0000] mov ax, [PitchTable+ebx] 1343 00000812 66894720 mov [edi+TrackInfo.Arp+2], ax 1344 00000816 88D3 mov bl, dl 1345 00000818 30FF xor bh, bh 1346 0000081A 668B9B[FC520000] mov bx, [PeriodTable+ebx] 1347 ;add bx, bx 1348 00000821 01DB add ebx, ebx 1349 ;mov ax, [PitchTable+bx] 1350 00000823 668B83[C85B0000] mov ax, [PitchTable+ebx] 1351 0000082A 66894722 mov [edi+TrackInfo.Arp+4], ax 1352 0000082E 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1353 00000834 C3 retn 1354 1355 efxtremolo: 1356 ; 01/10/2017 (TMODPLAY.ASM) 1357 InitTremolo: 1358 00000835 8A471C mov al, [edi+TrackInfo.TremParm] 1359 00000838 88C4 mov ah, al 1360 0000083A 66250FF0 and ax, 0F00Fh 1361 0000083E F6C20F test dl, 0Fh 1362 00000841 7502 jnz short InitTremolo_1 ; efxtremolof0 1363 00000843 08C2 or dl, al 1364 efxtremolof0: 1365 InitTremolo_1: 1366 00000845 F6C2F0 test dl, 0F0h 1367 00000848 7502 jnz short InitTremolo_2 ; efxtremolof1 1368 0000084A 08E2 or dl, ah 1369 efxtremolof1: 1370 InitTremolo_2: 1371 0000084C 88571C mov [edi+TrackInfo.TremParm], dl 1372 0000084F 66895714 mov [edi+TrackInfo.Effect], dx 1373 00000853 C3 retn 1374 1375 ;-------------------------------------------------------------------------- 1376 ; pollmodule - polls the module player 1377 ;-------------------------------------------------------------------------- 1378 ;-------------------------------------------------------------------------- 1379 ; UpdateTracks: Main code to process the next tick to be played. 1380 ;-------------------------------------------------------------------------- 1381 1382 pollmodule: 1383 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1384 00000854 FE0D[8CD70000] dec byte [TempoWait] 1385 0000085A 7417 jz short GetTracks 1386 1387 ;mov ecx, NumTracks 1388 0000085C 0FB70D[BA540000] movzx ecx, word [numtracks] ; 06/10/2017 1389 00000863 BF[A0D70000] mov edi, Tracks 1390 BeatTracks: 1391 00000868 E86FFCFFFF call BeatTrack 1392 0000086D 83C726 add edi, TrackInfo.size 1393 00000870 E2F6 loop BeatTracks 1394 00000872 C3 retn 1395 GetTracks: 1396 00000873 A0[8BD70000] mov al, [Tempo] 1397 00000878 A2[8CD70000] mov [TempoWait], al 1398 1399 0000087D 8B35[9CD70000] mov esi, [Note] 1400 00000883 803D[8ED70000]40 cmp byte [Row], 64 1401 0000088A 7267 jb short NoPattWrap 1402 1403 0000088C 8B35[505A0000] mov esi, [ModInfo.Patterns] 1404 00000892 8A1D[8AD70000] mov bl, [OrderPos] 1405 00000898 3A1D[CE590000] cmp bl, [ModInfo.OrderLen] 1406 0000089E 7214 jb short NoOrderWrap 1407 000008A0 8A1D[CF590000] mov bl, [ModInfo.ReStart] 1408 000008A6 881D[8AD70000] mov [OrderPos], bl 1409 000008AC 3A1D[CE590000] cmp bl, [ModInfo.OrderLen] 1410 000008B2 7363 jae short NoUpdate 1411 NoOrderWrap: 1412 ;xor bh, bh 1413 000008B4 81E3FF000000 and ebx, 0FFh 1414 000008BA 8A9B[D0590000] mov bl, [ModInfo.Order+ebx] 1415 ; 05/10/2017 1416 ;shl ebx, 10 ; *1024 1417 000008C0 8A0D[B9540000] mov cl, [pattern_shift] ; 10 or 11 1418 000008C6 D3E3 shl ebx, cl ; *1024 or *2048 1419 ; 1420 000008C8 01DE add esi, ebx 1421 000008CA 8A1D[8FD70000] mov bl, [BreakRow] 1422 000008D0 881D[8ED70000] mov [Row], bl 1423 ;xor bh, bh 1424 000008D6 81E3FF000000 and ebx, 0FFh 1425 000008DC 883D[8FD70000] mov [BreakRow], bh ; 0 1426 ;shl bx, 4 1427 ; 27/11/2023 1428 000008E2 C1E304 shl ebx, 4 1429 000008E5 01DE add esi, ebx 1430 000008E7 8935[9CD70000] mov [Note], esi 1431 000008ED FE05[8AD70000] inc byte [OrderPos] 1432 NoPattWrap: 1433 000008F3 FE05[8ED70000] inc byte [Row] 1434 1435 ;cld 1436 ;mov ecx, NumTracks 1437 000008F9 0FB70D[BA540000] movzx ecx, word [numtracks] ; 06/10/2017 1438 00000900 BF[A0D70000] mov edi, Tracks 1439 GetTracks_next: 1440 00000905 51 push ecx 1441 00000906 E85AFDFFFF call GetTrack ; readchannel 1442 0000090B 59 pop ecx 1443 0000090C 83C726 add edi, TrackInfo.size 1444 0000090F E2F4 loop GetTracks_next 1445 1446 00000911 8935[9CD70000] mov [Note], esi 1447 NoUpdate: 1448 00000917 C3 retn 1449 1450 ;-------------------------------------------------------------------------- 1451 ; MixTrack: Mixes one track into a CLEAN buffer. 1452 ; In: 1453 ; ds:si - Track Info Address. 1454 ; ds:di - Buffer Address. 1455 ; cx - Buffer Size. 1456 ;-------------------------------------------------------------------------- 1457 1458 ; esi = Track info address 1459 ; edi = Buffer address 1460 ; ecx = Buffer size 1461 1462 MixTrack: 1463 00000918 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1464 0000091D 7757 ja short MixLooped 1465 MixNonLooped: 1466 0000091F 8B16 mov edx, [esi+TrackInfo.Samples] 1467 00000921 8B5E04 mov ebx, [esi+TrackInfo.Position] 1468 00000924 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1469 00000928 52 push edx 1470 00000929 56 push esi 1471 0000092A 01D3 add ebx, edx 1472 0000092C 01D5 add ebp, edx 1473 0000092E 668B5612 mov dx, [esi+TrackInfo.Pitch] 1474 ; 01/10/2017 1475 ;mov al, [esi+TrackInfo.Volume] 1476 00000932 668B460E mov ax, [esi+TrackInfo.Volume] 1477 ; ah = [esi+TrackInfo.VolDiff] 1478 00000936 00E0 add al, ah ; ****** 1479 00000938 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1480 0000093C 8A661D mov ah, [esi+TrackInfo.Error] 1481 0000093F 89DE mov esi, ebx 1482 00000941 31DB xor ebx, ebx ; 01/10/2017 ; * 1483 00000943 88C7 mov bh, al 1484 00000945 88D0 mov al, dl 1485 00000947 88F2 mov dl, dh 1486 ;xor dh, dh 1487 00000949 81E2FF000000 and edx, 0FFh 1488 nlMixSamp: 1489 0000094F 39EE cmp esi, ebp 1490 00000951 7316 jae short nlMixBye 1491 00000953 8A1E mov bl, [esi] 1492 ;mov bl, [VolTable+bx] 1493 00000955 8A9B[8A760000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1494 ; 17/10/2017 1495 0000095B 001F add [edi], bl 1496 ; 18/10/2017 1497 0000095D 00C4 add ah, al 1498 0000095F 11D6 adc esi, edx 1499 00000961 033D[BA540000] add edi, [numtracks] 1500 00000967 E2E6 loop nlMixSamp 1501 nlMixBye: 1502 00000969 89F3 mov ebx, esi 1503 0000096B 5E pop esi 1504 0000096C 5A pop edx 1505 0000096D 29D3 sub ebx, edx 1506 0000096F 895E04 mov [esi+TrackInfo.Position], ebx 1507 00000972 88661D mov [esi+TrackInfo.Error], ah 1508 00000975 C3 retn 1509 MixLooped: 1510 00000976 8B16 mov edx, [esi+TrackInfo.Samples] 1511 00000978 8B5E04 mov ebx, [esi+TrackInfo.Position] 1512 0000097B 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1513 0000097F 892D[98D70000] mov [BufRep], ebp 1514 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1515 00000985 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1516 00000989 52 push edx 1517 0000098A 56 push esi 1518 0000098B 01D3 add ebx, edx 1519 0000098D 01D5 add ebp, edx 1520 0000098F 668B5612 mov dx, [esi+TrackInfo.Pitch] 1521 ; 01/10/2017 1522 ;mov al, [esi+TrackInfo.Volume] 1523 00000993 668B460E mov ax, [esi+TrackInfo.Volume] 1524 ; ah = [esi+TrackInfo.VolDiff] 1525 00000997 00E0 add al, ah ; ****** 1526 00000999 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1527 0000099D 8A661D mov ah, [esi+TrackInfo.Error] 1528 ;mov si, bx 1529 000009A0 89DE mov esi, ebx ; 04/09/2017 1530 000009A2 31DB xor ebx, ebx ; 01/10/2017 ; * 1531 000009A4 88C7 mov bh, al 1532 000009A6 88D0 mov al, dl 1533 000009A8 88F2 mov dl, dh 1534 ;xor dh, dh 1535 000009AA 81E2FF000000 and edx, 0FFh 1536 lpMixSamp: 1537 000009B0 39EE cmp esi, ebp 1538 000009B2 7206 jb short lpMixNow 1539 000009B4 2B35[98D70000] sub esi, [BufRep] 1540 lpMixNow: 1541 000009BA 8A1E mov bl, [esi] 1542 ;mov bl, [VolTable+bx] 1543 000009BC 8A9B[8A760000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1544 ; 17/10/2017 1545 000009C2 001F add [edi], bl 1546 ; 18/10/2017 1547 000009C4 00C4 add ah, al 1548 000009C6 11D6 adc esi, edx 1549 000009C8 033D[BA540000] add edi, [numtracks] 1550 000009CE E2E0 loop lpMixSamp 1551 lpMixBye: 1552 ; mov ebx, esi 1553 ; pop esi 1554 ; pop edx 1555 ; sub ebx, edx 1556 ; mov [esi+TrackInfo.Position], ebx 1557 ; mov [esi+TrackInfo.Error], ah 1558 ; retn 1559 000009D0 EB97 jmp short nlMixBye 1560 1561 ;-------------------------------------------------------------------------- 1562 ; mixpoll - updates the output buffer 1563 ;-------------------------------------------------------------------------- 1564 ; 1565 ;-------------------------------------------------------------------------- 1566 ; GetSamples: Returns the next chunk of samples to be played. 1567 ; In: 1568 ; Buffer - Buffer Address. 1569 ; Count - Buffer Size. 1570 ;-------------------------------------------------------------------------- 1571 1572 mixpoll: 1573 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1574 ; edi = buffer address 1575 ; ebx = count 1576 1577 000009D2 60 pushad 1578 1579 ;cld 1580 NextChunk: 1581 000009D3 66833D[96D70000]00 cmp word [BufLen], 0 1582 000009DB 756A jne short CopyChunk 1583 1584 000009DD 53 push ebx 1585 000009DE 57 push edi 1586 MixChunk: 1587 000009DF BF[8AB70000] mov edi, MixBuffer 1588 1589 ; 17/10/2017 1590 000009E4 0FB70D[90D70000] movzx ecx, word [BpmSamples] 1591 ;mov cx, [BpmSamples] 1592 000009EB 893D[92D70000] mov [BufPtr], edi 1593 000009F1 66890D[96D70000] mov [BufLen], cx 1594 1595 000009F8 803D[BA540000]04 cmp byte [numtracks], 4 1596 000009FF 7602 jna short ch_silence 1597 ;shl cx, 1 1598 ; 27/11/2023 1599 00000A01 D1E1 shl ecx, 1 1600 ch_silence: 1601 00000A03 B880808080 mov eax, 80808080h 1602 00000A08 F3AB rep stosd 1603 1604 ;mov cx, NumTracks 1605 ;mov cl, NumTracks ; 01/10/2017 1606 00000A0A 8A0D[BA540000] mov cl, [numtracks] ; 06/10/2017 1607 00000A10 BE[7AD70000] mov esi, Tracks - TrackInfo.size 1608 GetSamples_next: 1609 00000A15 51 push ecx 1610 00000A16 83C626 add esi, TrackInfo.size 1611 00000A19 668B0D[96D70000] mov cx, [BufLen] 1612 00000A20 8B3D[92D70000] mov edi, [BufPtr] 1613 00000A26 E8EDFEFFFF call MixTrack 1614 00000A2B 59 pop ecx 1615 00000A2C FF05[92D70000] inc dword [BufPtr] ; 18/10/2017 1616 00000A32 E2E1 loop GetSamples_next 1617 1618 ; 18/10/2017 1619 00000A34 8B1D[BA540000] mov ebx, [numtracks] 1620 00000A3A 291D[92D70000] sub dword [BufPtr], ebx 1621 1622 00000A40 E80FFEFFFF call UpdateTracks 1623 1624 00000A45 5F pop edi 1625 00000A46 5B pop ebx 1626 CopyChunk: 1627 ;mov cx, [BufLen] 1628 00000A47 0FB70D[96D70000] movzx ecx, word [BufLen] 1629 00000A4E 39D9 cmp ecx, ebx 1630 ;cmp cx, bx 1631 00000A50 7602 jbe short MoveChunk 1632 ;mov cx, bx 1633 00000A52 89D9 mov ecx, ebx 1634 MoveChunk: 1635 00000A54 8B35[92D70000] mov esi, [BufPtr] 1636 00000A5A 010D[92D70000] add [BufPtr], ecx 1637 00000A60 66290D[96D70000] sub [BufLen], cx 1638 00000A67 29CB sub ebx, ecx 1639 ; 17/10/2017 ; STEREO MIXING 1640 ;rep movsb 1641 ; 18/10/2017 1642 00000A69 803D[BA540000]04 cmp byte [numtracks], 4 1643 00000A70 762F jna short _4_channels_mix ; 27/11/2023 1644 1645 _8_channels_mix: 1646 ; 18/10/2017 1647 00000A72 AD lodsd 1648 00000A73 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1649 00000A75 C1EA10 shr edx, 16 ; ch3 (dl), ch4 (dh) 1650 00000A78 00C6 add dh, al ; ch1 + ch4 1651 00000A7A 00E2 add dl, ah ; ch2 + ch3 1652 1653 00000A7C AD lodsd 1654 00000A7D 00C6 add dh, al ; ch1 + ch4 + ch5 1655 00000A7F 00E2 add dl, ah ; ch2 + ch3 + ch6 1656 00000A81 C1E810 shr eax, 16 ; ch7 (al), ch8 (ah) 1657 ; 19/10/2017 1658 00000A84 00E6 add dh, ah ; ch1 + ch4 + ch5 + ch8 1659 00000A86 00C2 add dl, al ; ch2 + ch3 + ch6 + ch7 1660 1661 ; L = ch1 + ch4 + ch5 + ch8 1662 ; R = ch2 + ch3 + ch6 + ch7 1663 1664 00000A88 6681C28080 add dx, 8080h 1665 1666 ; 19/10/2017 1667 00000A8D 88F4 mov ah, dh 1668 00000A8F 80EC80 sub ah, 80h 1669 00000A92 30C0 xor al, al 1670 00000A94 66AB stosw ; Left Channel 1671 00000A96 88D4 mov ah, dl 1672 00000A98 80EC80 sub ah, 80h 1673 00000A9B 66AB stosw ; Right Channel 1674 1675 00000A9D E2D3 loop _8_channels_mix 1676 1677 00000A9F EB21 jmp short channel_mix_ok 1678 1679 _4_channels_mix: 1680 ; 18/10/2017 1681 00000AA1 AD lodsd 1682 00000AA2 89C2 mov edx, eax ; ch1 (al), ch2 (ah) 1683 ; 19/10/2017 1684 00000AA4 C1E810 shr eax, 16 ; ch3 (al), ch4 (ah) 1685 00000AA7 00E2 add dl, ah ; ch1 + ch4 1686 00000AA9 00C6 add dh, al ; ch2 + ch3 1687 1688 ; L = ch1 + ch4 1689 ; R = ch2 + ch3 1690 1691 ; 19/10/2017 1692 00000AAB 6681C28080 add dx, 8080h 1693 1694 ; 19/10/2017 1695 00000AB0 88D4 mov ah, dl 1696 00000AB2 80EC80 sub ah, 80h 1697 00000AB5 30C0 xor al, al 1698 00000AB7 66AB stosw ; Left Channel 1699 00000AB9 88F4 mov ah, dh 1700 00000ABB 80EC80 sub ah, 80h 1701 00000ABE 66AB stosw ; Right Channel 1702 1703 00000AC0 E2DF loop _4_channels_mix 1704 1705 channel_mix_ok: 1706 00000AC2 85DB test ebx, ebx 1707 ;jnz short NextChunk 1708 00000AC4 0F8509FFFFFF jnz NextChunk ; 17/10/2017 1709 1710 ; 20/10/2017 1711 ; 19/10/2017 1712 ; Pan Control 1713 00000ACA 8A0D[24E30000] mov cl, [pan_shift] 1714 00000AD0 08C9 or cl, cl 1715 00000AD2 744D jz short c_smpl_2 1716 1717 ; 20/10/2017 1718 00000AD4 BB00400000 mov ebx, BUFFERSIZE/4 ; 8192 1719 00000AD9 BF[00F00000] mov edi, Audio_Buffer 1720 1721 00000ADE B508 mov ch, 8 1722 00000AE0 D2E5 shl ch, cl 1723 c_smpl_1: 1724 00000AE2 8B17 mov edx, [edi] 1725 00000AE4 6689D0 mov ax, dx 1726 00000AE7 80FC80 cmp ah, 80h 1727 00000AEA 7208 jb short _cs1 1728 00000AEC 00EC add ah, ch 1729 00000AEE 730A jnc short _cs2 1730 00000AF0 B4FF mov ah, 255 1731 00000AF2 EB06 jmp short _cs2 1732 _cs1: 1733 00000AF4 28EC sub ah, ch 1734 00000AF6 7302 jnc short _cs2 1735 00000AF8 B400 mov ah, 0 1736 _cs2: 1737 00000AFA C1CA10 ror edx, 16 ; dx = [edi+2] 1738 00000AFD 00F4 add ah, dh 1739 00000AFF 6692 xchg dx, ax ; xchg [edi+2], ax 1740 00000B01 80FC80 cmp ah, 80h 1741 00000B04 7208 jb short _cs3 1742 00000B06 00EC add ah, ch 1743 00000B08 730A jnc short _cs4 1744 00000B0A B4FF mov ah, 255 1745 00000B0C EB06 jmp short _cs4 1746 _cs3: 1747 00000B0E 28EC sub ah, ch 1748 00000B10 7302 jnc short _cs4 1749 00000B12 B400 mov ah, 0 1750 _cs4: 1751 00000B14 C1CA10 ror edx, 16 ; dx = [edi] 1752 00000B17 00E6 add dh, ah 1753 00000B19 8917 mov [edi], edx 1754 _cs5: 1755 ; 20/10/2017 1756 00000B1B 83C704 add edi, 4 1757 00000B1E 4B dec ebx 1758 00000B1F 75C1 jnz short c_smpl_1 1759 c_smpl_2: 1760 00000B21 61 popad 1761 00000B22 C3 retn 1762 1763 ;-------------------------------------------------------------------------- 1764 ; StartPlaying: Initializes the Sound System. 1765 ; In: 1766 ; Module Information Resources. 1767 ;-------------------------------------------------------------------------- 1768 1769 StartPlaying: 1770 00000B23 60 pushad 1771 SetModParms: 1772 00000B24 C605[8AD70000]00 mov byte [OrderPos], 0 1773 00000B2B C605[8BD70000]06 mov byte [Tempo], DefTempo 1774 00000B32 C605[8CD70000]06 mov byte [TempoWait], DefTempo 1775 00000B39 C605[8DD70000]7D mov byte [Bpm], DefBpm 1776 00000B40 C605[8ED70000]40 mov byte [Row], 64 1777 00000B47 C605[8FD70000]00 mov byte [BreakRow], 0 1778 00000B4E 66A1[C0540000] mov ax, [MixSpeed] 1779 00000B54 31D2 xor edx, edx 1780 00000B56 66BB3200 mov bx, 24*DefBpm/60 1781 00000B5A 66F7F3 div bx 1782 00000B5D 66A3[90D70000] mov [BpmSamples], ax 1783 ClearTracks: 1784 00000B63 BF[A0D70000] mov edi, Tracks 1785 ; 07/10/2017 1786 ;mov ecx, NumTracks*TrackInfo.size 1787 00000B68 B826000000 mov eax, TrackInfo.size 1788 00000B6D 0FB70D[BA540000] movzx ecx, word [numtracks] 1789 00000B74 F7E1 mul ecx 1790 00000B76 89C1 mov ecx, eax 1791 00000B78 31C0 xor eax, eax 1792 ;cld 1793 00000B7A F3AA rep stosb 1794 1795 00000B7C A3[92D70000] mov [BufPtr], eax 1796 00000B81 66A3[96D70000] mov [BufLen], ax 1797 MakePitch: 1798 00000B87 66B80021 mov ax, MidCRate 1799 00000B8B 66BBAC01 mov bx, 428 1800 00000B8F 66F7E3 mul bx 1801 00000B92 66F735[C0540000] div word [MixSpeed] 1802 00000B99 30F6 xor dh, dh 1803 00000B9B 88E2 mov dl, ah 1804 00000B9D 88C4 mov ah, al 1805 00000B9F 30C0 xor al, al 1806 ;mov cx, 857 1807 00000BA1 66B9610D mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1808 00000BA5 31DB xor ebx, ebx 1809 00000BA7 BF[C85B0000] mov edi, PitchTable 1810 PitchLoop: 1811 00000BAC 50 push eax 1812 00000BAD 52 push edx 1813 00000BAE 6639DA cmp dx, bx 1814 00000BB1 7303 jae short NoDiv 1815 00000BB3 66F7F3 div bx 1816 NoDiv: 1817 00000BB6 66AB stosw 1818 00000BB8 5A pop edx 1819 00000BB9 58 pop eax 1820 ;inc bx 1821 00000BBA 43 inc ebx 1822 00000BBB E2EF loop PitchLoop 1823 MakeVolume: 1824 00000BBD 66B90041 mov cx, 16640 1825 00000BC1 89CB mov ebx, ecx 1826 VolLoop: 1827 ;dec bx 1828 ; 27/11/2023 1829 00000BC3 4B dec ebx 1830 00000BC4 88D8 mov al, bl 1831 00000BC6 F6EF imul bh 1832 ;mov [VolTable+bx], ah 1833 00000BC8 88A3[8A760000] mov [VolTable+ebx], ah 1834 00000BCE E2F3 loop VolLoop 1835 1836 00000BD0 61 popad 1837 00000BD1 C3 retn 1838 1839 ;-------------------------------------------------------------------------- 1840 ; StopPlaying: ShutDown the Sound System. 1841 ;-------------------------------------------------------------------------- 1842 1843 StopPlaying: 1844 ; 19/06/2017 1845 ; Stop Playing 1846 sys _audio, 0700h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BD2 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 00000BD7 B820000000 <1> mov eax, %1 110 <1> 111 00000BDC CD40 <1> int 40h 1847 ; Cancel callback service (for user) 1848 sys _audio, 0900h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BDE 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 00000BE3 B820000000 <1> mov eax, %1 110 <1> 111 00000BE8 CD40 <1> int 40h 1849 ; Deallocate Audio Buffer (for user) 1850 sys _audio, 0A00h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BEA 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 00000BEF B820000000 <1> mov eax, %1 110 <1> 111 00000BF4 CD40 <1> int 40h 1851 ; Disable Audio Device 1852 sys _audio, 0C00h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000BF6 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 00000BFB B820000000 <1> mov eax, %1 110 <1> 111 00000C00 CD40 <1> int 40h 1853 1854 00000C02 C3 retn 1855 1856 ;============================================================================= 1857 ; 1858 ;============================================================================= 1859 1860 ;dword2str: 1861 ; ; 13/11/2016 - Erdogan Tan 1862 ; ; eax = dword value 1863 ; ; 1864 ; call dwordtohex 1865 ; mov [dword_str], edx 1866 ; mov [dword_str+4], eax 1867 ; mov si, dword_str 1868 ; retn 1869 1870 ; 05/03/2017 (TRDOS 386) 1871 ; trdos386.s (unix386.s) - 10/05/2015 1872 ; Convert binary number to hexadecimal string 1873 1874 ;bytetohex: 1875 ; ; INPUT -> 1876 ; ; AL = byte (binary number) 1877 ; ; OUTPUT -> 1878 ; ; AX = hexadecimal string 1879 ; ; 1880 ; push ebx 1881 ; movzx ebx, al 1882 ; shr bl, 4 1883 ; mov bl, [ebx+hex_chars] 1884 ; xchg bl, al 1885 ; and bl, 0Fh 1886 ; mov ah, [ebx+hex_chars] 1887 ; pop ebx 1888 ; retn 1889 1890 ;wordtohex: 1891 ; ; INPUT -> 1892 ; ; AX = word (binary number) 1893 ; ; OUTPUT -> 1894 ; ; EAX = hexadecimal string 1895 ; ; 1896 ; push ebx 1897 ; xor ebx, ebx 1898 ; xchg ah, al 1899 ; push eax 1900 ; mov bl, ah 1901 ; shr bl, 4 1902 ; mov al, [ebx+hex_chars] 1903 ; mov bl, ah 1904 ; and bl, 0Fh 1905 ; mov ah, [ebx+hex_chars] 1906 ; shl eax, 16 1907 ; pop eax 1908 ; pop ebx 1909 ; jmp short bytetohex 1910 1911 ;dwordtohex: 1912 ; ; INPUT -> 1913 ; ; EAX = dword (binary number) 1914 ; ; OUTPUT -> 1915 ; ; EDX:EAX = hexadecimal string 1916 ; ; 1917 ; push eax 1918 ; shr eax, 16 1919 ; call wordtohex 1920 ; mov edx, eax 1921 ; pop eax 1922 ; call wordtohex 1923 ; retn 1924 1925 ; 04/06/2024 (BugFix) 1926 ; 24/06/2017 1927 ; 19/06/2017 1928 ; 05/03/2017 (TRDOS 386) 1929 ; 13/11/2016 - Erdogan Tan 1930 write_audio_dev_info: 1931 ; BUS/DEV/FN 1932 ; 00000000BBBBBBBBDDDDDFFF00000000 1933 ; DEV/VENDOR 1934 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1935 1936 ;mov esi, [dev_vendor] 1937 ; 04/06/2024 1938 00000C03 A1[7C550000] mov eax, [dev_vendor] 1939 00000C08 0FB6D8 movzx ebx, al 1940 00000C0B 88DA mov dl, bl 1941 00000C0D 80E30F and bl, 0Fh 1942 00000C10 8A83[C2540000] mov al, [ebx+hex_chars] 1943 00000C16 A2[07550000] mov [msgVendorId+3], al 1944 00000C1B 88D3 mov bl, dl 1945 00000C1D C0EB04 shr bl, 4 1946 00000C20 8A83[C2540000] mov al, [ebx+hex_chars] 1947 00000C26 A2[06550000] mov [msgVendorId+2], al 1948 00000C2B 88E3 mov bl, ah 1949 00000C2D 88DA mov dl, bl 1950 00000C2F 80E30F and bl, 0Fh 1951 00000C32 8A83[C2540000] mov al, [ebx+hex_chars] 1952 00000C38 A2[05550000] mov [msgVendorId+1], al 1953 00000C3D 88D3 mov bl, dl 1954 00000C3F C0EB04 shr bl, 4 1955 00000C42 8A83[C2540000] mov al, [ebx+hex_chars] 1956 00000C48 A2[04550000] mov [msgVendorId], al 1957 ;shr esi, 16 1958 ; 04/06/2024 1959 00000C4D C1E810 shr eax, 16 1960 00000C50 88C3 mov bl, al 1961 00000C52 88DA mov dl, bl 1962 00000C54 80E30F and bl, 0Fh 1963 00000C57 8A83[C2540000] mov al, [ebx+hex_chars] 1964 00000C5D A2[18550000] mov [msgDevId+3], al 1965 00000C62 88D3 mov bl, dl 1966 00000C64 C0EB04 shr bl, 4 1967 00000C67 8A83[C2540000] mov al, [ebx+hex_chars] 1968 00000C6D A2[17550000] mov [msgDevId+2], al 1969 00000C72 88E3 mov bl, ah 1970 00000C74 88DA mov dl, bl 1971 00000C76 80E30F and bl, 0Fh 1972 00000C79 8A83[C2540000] mov al, [ebx+hex_chars] 1973 00000C7F A2[16550000] mov [msgDevId+1], al 1974 00000C84 88D3 mov bl, dl 1975 00000C86 C0EB04 shr bl, 4 1976 00000C89 8A83[C2540000] mov al, [ebx+hex_chars] 1977 00000C8F A2[15550000] mov [msgDevId], al 1978 1979 ;mov esi, [bus_dev_fn] 1980 ;shr esi, 8 1981 ;mov ax, si 1982 ; 04/06/2024 1983 00000C94 A1[80550000] mov eax, [bus_dev_fn] 1984 00000C99 C1E808 shr eax, 8 1985 00000C9C 88C3 mov bl, al 1986 00000C9E 88DA mov dl, bl 1987 00000CA0 80E307 and bl, 7 ; bit 0,1,2 1988 00000CA3 8A83[C2540000] mov al, [ebx+hex_chars] 1989 00000CA9 A2[3C550000] mov [msgFncNo+1], al 1990 00000CAE 88D3 mov bl, dl 1991 00000CB0 C0EB03 shr bl, 3 1992 00000CB3 88DA mov dl, bl 1993 00000CB5 80E30F and bl, 0Fh 1994 00000CB8 8A83[C2540000] mov al, [ebx+hex_chars] 1995 00000CBE A2[2E550000] mov [msgDevNo+1], al 1996 00000CC3 88D3 mov bl, dl 1997 00000CC5 C0EB04 shr bl, 4 1998 00000CC8 8A83[C2540000] mov al, [ebx+hex_chars] 1999 00000CCE A2[2D550000] mov [msgDevNo], al 2000 00000CD3 88E3 mov bl, ah 2001 00000CD5 88DA mov dl, bl 2002 00000CD7 80E30F and bl, 0Fh 2003 00000CDA 8A83[C2540000] mov al, [ebx+hex_chars] 2004 00000CE0 A2[22550000] mov [msgBusNo+1], al 2005 00000CE5 88D3 mov bl, dl 2006 00000CE7 C0EB04 shr bl, 4 2007 00000CEA 8A83[C2540000] mov al, [ebx+hex_chars] 2008 00000CF0 A2[21550000] mov [msgBusNo], al 2009 2010 ; 24/06/2017 2011 00000CF5 66A1[88550000] mov ax, [ac97_NamBar] 2012 00000CFB 88C3 mov bl, al 2013 00000CFD 88DA mov dl, bl 2014 00000CFF 80E30F and bl, 0Fh 2015 00000D02 8A83[C2540000] mov al, [ebx+hex_chars] 2016 00000D08 A2[4B550000] mov [msgNamBar+3], al 2017 00000D0D 88D3 mov bl, dl 2018 00000D0F C0EB04 shr bl, 4 2019 00000D12 8A83[C2540000] mov al, [ebx+hex_chars] 2020 00000D18 A2[4A550000] mov [msgNamBar+2], al 2021 00000D1D 88E3 mov bl, ah 2022 00000D1F 88DA mov dl, bl 2023 00000D21 80E30F and bl, 0Fh 2024 00000D24 8A83[C2540000] mov al, [ebx+hex_chars] 2025 00000D2A A2[49550000] mov [msgNamBar+1], al 2026 00000D2F 88D3 mov bl, dl 2027 00000D31 C0EB04 shr bl, 4 2028 00000D34 8A83[C2540000] mov al, [ebx+hex_chars] 2029 00000D3A A2[48550000] mov [msgNamBar], al 2030 2031 00000D3F 66A1[8A550000] mov ax, [ac97_NabmBar] 2032 00000D45 88C3 mov bl, al 2033 00000D47 88DA mov dl, bl 2034 00000D49 80E30F and bl, 0Fh 2035 00000D4C 8A83[C2540000] mov al, [ebx+hex_chars] 2036 00000D52 A2[5B550000] mov [msgNabmBar+3], al 2037 00000D57 88D3 mov bl, dl 2038 00000D59 C0EB04 shr bl, 4 2039 00000D5C 8A83[C2540000] mov al, [ebx+hex_chars] 2040 00000D62 A2[5A550000] mov [msgNabmBar+2], al 2041 00000D67 88E3 mov bl, ah 2042 00000D69 88DA mov dl, bl 2043 00000D6B 80E30F and bl, 0Fh 2044 00000D6E 8A83[C2540000] mov al, [ebx+hex_chars] 2045 00000D74 A2[59550000] mov [msgNabmBar+1], al 2046 00000D79 88D3 mov bl, dl 2047 00000D7B C0EB04 shr bl, 4 2048 00000D7E 8A83[C2540000] mov al, [ebx+hex_chars] 2049 00000D84 A2[58550000] mov [msgNabmBar], al 2050 2051 ; 24/11/2016 2052 00000D89 30E4 xor ah, ah 2053 00000D8B A0[8C550000] mov al, [ac97_int_ln_reg] 2054 00000D90 B10A mov cl, 10 2055 00000D92 F6F1 div cl 2056 00000D94 660105[64550000] add [msgIRQ], ax 2057 00000D9B 20C0 and al, al 2058 00000D9D 750D jnz short _w_ac97imsg_ ; 19/06/2017 2059 00000D9F A0[65550000] mov al, [msgIRQ+1] 2060 00000DA4 B420 mov ah, ' ' 2061 00000DA6 66A3[64550000] mov [msgIRQ], ax 2062 _w_ac97imsg_: 2063 ; EBX = Message address 2064 ; ECX = Max. message length (or stop on ZERO character) 2065 ; (1 to 255) 2066 ; DL = Message color (07h = light gray, 0Fh = white) 2067 sys _msg, msgAC97Info, 255, 07h 96 <1> 97 <1> 98 <1> 99 <1> 100 <1> %if %0 >= 2 101 00000DAC BB[D3540000] <1> mov ebx, %2 102 <1> %if %0 >= 3 103 00000DB1 B9FF000000 <1> mov ecx, %3 104 <1> %if %0 = 4 105 00000DB6 BA07000000 <1> mov edx, %4 106 <1> %endif 107 <1> %endif 108 <1> %endif 109 00000DBB B823000000 <1> mov eax, %1 110 <1> 111 00000DC0 CD40 <1> int 40h 2068 00000DC2 C3 retn 2069 2070 ;============================================================================= 2071 ; gfx.asm - draw scopes in VGA 640x480x16 mode 2072 ;============================================================================= 2073 2074 ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 2075 2076 ;----------------------------------------------------------------------------- 2077 ; setgraphmode - setup the VGA 640x480x16 graphics mode 2078 ;----------------------------------------------------------------------------- 2079 ; 22/10/2017 2080 setgraphmode: 2081 ;pushad 2082 00000DC3 66B81200 mov ax,0012h 2083 ;int 10h 2084 00000DC7 CD31 int 31h 2085 00000DC9 66BAC003 mov dx,3C0h 2086 00000DCD 30C0 xor al,al 2087 setgraphmodel0: 2088 ;out dx,al 2089 00000DCF B401 mov ah,1 ; outb 2090 00000DD1 CD34 int 34h 2091 ;out dx,al 2092 ;mov ah,1 2093 00000DD3 CD34 int 34h 2094 00000DD5 FEC0 inc al 2095 00000DD7 3C10 cmp al,10h 2096 00000DD9 72F4 jb short setgraphmodel0 2097 00000DDB B020 mov al,20h 2098 ;out dx,al 2099 ;mov ah,1 2100 00000DDD CD34 int 34h 2101 ;popad 2102 00000DDF C3 retn 2103 2104 ;----------------------------------------------------------------------------- 2105 ; settextmode - restore the VGA 80x25x16 text mode 2106 ;----------------------------------------------------------------------------- 2107 ; 22/10/2017 2108 settextmode: 2109 ;pushad 2110 00000DE0 66B80300 mov ax, 0003h 2111 ;int 10h 2112 00000DE4 CD31 int 31h 2113 ;popad 2114 00000DE6 C3 retn 2115 2116 ;----------------------------------------------------------------------------- 2117 ; drawscopes - draw the track voices sample scopes 2118 ; In: 2119 ; ESI = (current) sample buffer 2120 ;----------------------------------------------------------------------------- 2121 ; 27/11/2023 2122 ; 29/10/2017 2123 ; 28/10/2017 2124 ; (ESI = Current DMA buffer offset) 2125 ; 27/10/2017 2126 ; 26/10/2017 2127 ; 23/10/2017 2128 drawscopes: 2129 ;pushad 2130 ;mov esi, g_buff 2131 ;mov esi, edx 2132 00000DE7 31C9 xor ecx, ecx 2133 00000DE9 31D2 xor edx, edx 2134 00000DEB 31FF xor edi, edi 2135 drawscope0: 2136 00000DED 66AD lodsw 2137 00000DEF 80F480 xor ah, 80h 2138 00000DF2 0FB6DC movzx ebx, ah ; Left Channel 2139 ;shl bx, 1 2140 ; 27/11/2023 2141 00000DF5 D1E3 shl ebx, 1 2142 00000DF7 668B83[D0D80000] mov ax, [RowOfs+ebx] 2143 00000DFE 668987[D0DA0000] mov [NewScope_L+edi], ax 2144 00000E05 30FF xor bh, bh 2145 00000E07 66AD lodsw 2146 00000E09 80F480 xor ah, 80h 2147 00000E0C 88E3 mov bl, ah ; Right Channel 2148 ;shl bx, 1 2149 ; 27/11/2023 2150 00000E0E D1E3 shl ebx, 1 2151 00000E10 668B83[D0D80000] mov ax, [RowOfs+ebx] 2152 00000E17 668987[D0DC0000] mov [NewScope_R+edi], ax 2153 ;add di, 2 2154 ; 27/11/2023 2155 00000E1E 47 inc edi 2156 00000E1F 47 inc edi 2157 00000E20 FEC1 inc cl 2158 00000E22 75C9 jnz short drawscope0 2159 2160 00000E24 66BAC403 mov dx, 3C4h 2161 ;mov ax, 0802h 2162 ;out dx, ax 2163 00000E28 66BB0208 mov bx, 0802h 2164 00000E2C B403 mov ah, 3 ; outw 2165 00000E2E CD34 int 34h 2166 ;mov dx, 3CEh 2167 ; 27/11/2023 2168 00000E30 B2CE mov dl, 0CEh 2169 00000E32 B008 mov al, 08h 2170 ;out dx, al 2171 00000E34 B401 mov ah, 1 ; outb 2172 00000E36 CD34 int 34h 2173 ;inc dx 2174 ; 27/11/2023 2175 00000E38 42 inc edx 2176 2177 ; 26/10/2017 2178 00000E39 31F6 xor esi, esi 2179 ;xor edi, edi 2180 00000E3B BB45060A00 mov ebx, 0A0645h 2181 drawscopel4: 2182 00000E40 B080 mov al, 80h 2183 drawscopel2: 2184 00000E42 50 push eax ; * 2185 00000E43 52 push edx ; ** 2186 ;out dx, al 2187 00000E44 B401 mov ah, 1 ; outb 2188 00000E46 CD34 int 34h 2189 2190 00000E48 B4FF mov ah, 0FFh 2191 ;mov ecx, 32 2192 00000E4A B120 mov cl, 32 2193 00000E4C 28C0 sub al, al 2194 drawscopel3: 2195 ; 23/10/2017 2196 00000E4E 668B96[D0DE0000] mov dx, [OldScope_L+esi] 2197 00000E55 663B96[D0DA0000] cmp dx, [NewScope_L+esi] 2198 00000E5C 7414 je short drawscopef3 2199 00000E5E 88041A mov [edx+ebx], al ; L 2200 00000E61 668B96[D0DA0000] mov dx, [NewScope_L+esi] 2201 00000E68 88241A mov [edx+ebx], ah ; L 2202 00000E6B 668996[D0DE0000] mov [OldScope_L+esi], dx 2203 drawscopef3: 2204 ; 27/10/2017 2205 00000E72 668B96[D0E00000] mov dx, [OldScope_R+esi] 2206 00000E79 663B96[D0DC0000] cmp dx, [NewScope_R+esi] 2207 00000E80 7416 je short drawscopef4 2208 00000E82 88441A26 mov [edx+ebx+38], al ; R 2209 00000E86 668B96[D0DC0000] mov dx, [NewScope_R+esi] 2210 00000E8D 88641A26 mov [edx+ebx+38], ah ; R 2211 00000E91 668996[D0E00000] mov [OldScope_R+esi], dx 2212 drawscopef4: 2213 00000E98 83C610 add esi, 2*8 2214 00000E9B 43 inc ebx 2215 00000E9C E2B0 loop drawscopel3 2216 2217 00000E9E 5A pop edx ; ** 2218 00000E9F 58 pop eax ; * 2219 00000EA0 81EEFE010000 sub esi, 2*256-2 2220 00000EA6 83EB20 sub ebx, 32 2221 00000EA9 D0E8 shr al, 1 2222 00000EAB 7595 jnz short drawscopel2 2223 ;popad 2224 00000EAD C3 retn 2225 2226 ;============================================================================= 2227 ; Load IFF/ILBM files for VGA 640x480x16 graphics mode 2228 ;============================================================================= 2229 2230 ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211') 2231 2232 ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax) 2233 2234 ;----------------------------------------------------------------------------- 2235 ; EQUATES AND STRUCTURES 2236 ;----------------------------------------------------------------------------- 2237 2238 ID_FORM equ 4D524F46h ; IFF/ILBM chunk IDs 2239 ID_ILBM equ 4D424C49h 2240 ID_BMHD equ 44484D42h 2241 ID_CMAP equ 50414D43h 2242 ID_BODY equ 59444F42h 2243 2244 struc Form ; IFF/ILBM header file format 2245 00000000 ???????? .ID: resd 1 2246 00000004 ???????? .Length: resd 1 2247 00000008 ???????? .Type: resd 1 2248 .size: 2249 endstruc 2250 2251 struc Chunk ; IFF/ILBM header chunk format 2252 00000000 ???????? .ID: resd 1 2253 00000004 ???????? .Length: resd 1 2254 .size: 2255 endstruc 2256 2257 struc BMHD ; IFF/ILBM BMHD chunk format 2258 00000000 ???? .Width: resw 1 2259 00000002 ???? .Height: resw 1 2260 00000004 ???? .PosX: resw 1 2261 00000006 ???? .PosY: resw 1 2262 00000008 ?? .Planes: resb 1 2263 00000009 ?? .Masking: resb 1 2264 0000000A ?? .Compression: resb 1 2265 0000000B ?? .Pad: resb 1 2266 0000000C ???? .Transparent: resw 1 2267 0000000E ?? .AspectX resb 1 2268 0000000F ?? .AspectY: resb 1 2269 00000010 ???? .PageWidth: resw 1 2270 00000012 ???? .PageHeight: resw 1 2271 .size: 2272 endstruc 2273 2274 struc CMAP ; IFF/ILBM CMAP chunk format 2275 00000000 .Colors: resb 768 2276 .size: 2277 endstruc 2278 2279 ;LOGO_ADDRESS equ 100000h ; virtual address at the end of the 1st 1MB 2280 2281 ;------------------------------------------------------------------------------ 2282 ; bswap - macro to reverse the byte order of a 32-bit register, converting 2283 ; a value in little/big endian form to big/little endian form. 2284 ;------------------------------------------------------------------------------ 2285 %macro bswap 1 2286 xchg al, ah 2287 rol eax, 16 2288 xchg al, ah 2289 %endmacro 2290 2291 ;------------------------------------------------------------------------------ 2292 ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode 2293 ; In: 2294 ; ESI = IFF/ILBM image file address 2295 ;------------------------------------------------------------------------------ 2296 putlbm: 2297 00000EAE 60 pushad 2298 2299 ; check if this is a valid IFF/ILBM Deluxe Paint file 2300 2301 00000EAF 813E464F524D cmp dword [esi+Form.ID], ID_FORM 2302 00000EB5 7551 jne short putlbmd0 2303 00000EB7 817E08494C424D cmp dword [esi+Form.Type], ID_ILBM 2304 00000EBE 7548 jne short putlbmd0 2305 2306 ; get the IFF/ILBM file length in bytes 2307 2308 00000EC0 8B4604 mov eax, [esi+Form.Length] 2309 bswap eax 2286 00000EC3 86E0 <1> xchg al, ah 2287 00000EC5 C1C010 <1> rol eax, 16 2288 00000EC8 86E0 <1> xchg al, ah 2310 00000ECA 89C1 mov ecx, eax 2311 2312 ; decrease the file length and updates the file pointer 2313 2314 00000ECC 83E904 sub ecx, 4 2315 00000ECF 83C60C add esi, Form.size 2316 2317 ; IFF/ILBM main parser body loop 2318 2319 putlbml0: 2320 00000ED2 85C9 test ecx, ecx 2321 00000ED4 7E64 jle short putlbmd1 2322 2323 ; get the next chunk ID and length in bytes 2324 2325 00000ED6 8B1E mov ebx, [esi+Chunk.ID] 2326 00000ED8 8B4604 mov eax, [esi+Chunk.Length] 2327 bswap eax 2286 00000EDB 86E0 <1> xchg al, ah 2287 00000EDD C1C010 <1> rol eax, 16 2288 00000EE0 86E0 <1> xchg al, ah 2328 00000EE2 93 xchg ebx, eax 2329 00000EE3 83C608 add esi, Chunk.size 2330 2331 ; word align the chunk length and decrease the file length counter 2332 2333 00000EE6 43 inc ebx 2334 00000EE7 80E3FE and bl, 0FEh ; ~1 2335 00000EEA 83E908 sub ecx, Chunk.size 2336 00000EED 29D9 sub ecx, ebx 2337 2338 ; check for the BMHD/CMAP/BODY chunk headers 2339 2340 00000EEF 3D424D4844 cmp eax, ID_BMHD 2341 00000EF4 7415 je short putlbmf0 2342 00000EF6 3D434D4150 cmp eax, ID_CMAP 2343 00000EFB 7440 je short putlbmf1 2344 00000EFD 3D424F4459 cmp eax, ID_BODY 2345 00000F02 7454 je short putlbmf2 2346 2347 ; advance to the next IFF/ILBM chunk structure 2348 2349 putlbmc0: 2350 00000F04 01DE add esi, ebx 2351 00000F06 EBCA jmp short putlbml0 2352 2353 putlbmd0: 2354 00000F08 F9 stc 2355 00000F09 61 popad 2356 00000F0A C3 retn 2357 2358 ; process the BMHD bitmap header chunk 2359 2360 putlbmf0: 2361 00000F0B 807E0804 cmp byte [esi+BMHD.Planes], 4 2362 00000F0F 75F7 jne short putlbmd0 2363 00000F11 807E0A01 cmp byte [esi+BMHD.Compression], 1 2364 00000F15 75F1 jne short putlbmd0 2365 00000F17 807E0B00 cmp byte [esi+BMHD.Pad], 0 2366 00000F1B 75EB jne short putlbmd0 2367 00000F1D 0FB706 movzx eax, word [esi+BMHD.Width] 2368 00000F20 86E0 xchg al, ah 2369 00000F22 83C007 add eax, 7 2370 00000F25 C1E803 shr eax, 3 2371 00000F28 A3[74550000] mov [picture.width], eax 2372 00000F2D 0FB74602 movzx eax, word [esi+BMHD.Height] 2373 00000F31 86E0 xchg al, ah 2374 00000F33 A3[78550000] mov [picture.height], eax 2375 00000F38 EBCA jmp short putlbmc0 2376 2377 putlbmd1: 2378 00000F3A F8 clc 2379 00000F3B 61 popad 2380 00000F3C C3 retn 2381 2382 ; process the CMAP colormap chunk 2383 2384 putlbmf1: 2385 00000F3D 66BAC803 mov dx, 3C8h 2386 00000F41 30C0 xor al, al 2387 ;out dx, al 2388 00000F43 B401 mov ah, 1 ; outb 2389 00000F45 CD34 int 34h 2390 ;inc dx 2391 ; 27/11/2023 2392 00000F47 42 inc edx 2393 putlbml1: 2394 00000F48 8A06 mov al, [esi] 2395 00000F4A C0E802 shr al, 2 2396 ;out dx, al 2397 ;mov ah, 1 ; outb 2398 00000F4D CD34 int 34h ; IOCTL interrupt (IN/OUT) 2399 00000F4F 46 inc esi 2400 00000F50 4B dec ebx 2401 00000F51 7FF5 jg short putlbml1 2402 00000F53 E97AFFFFFF jmp putlbml0 2403 2404 ; process the BODY bitmap body chunk 2405 2406 putlbmf2: 2407 00000F58 60 pushad 2408 00000F59 BF00000A00 mov edi, 0A0000h 2409 ;cld 2410 00000F5E 66BACE03 mov dx, 3CEh 2411 ;mov ax, 0FF08h 2412 ;out dx, ax 2413 00000F62 66BB08FF mov bx, 0FF08h 2414 00000F66 B403 mov ah, 3 ; outw 2415 00000F68 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2416 ;mov dx, 3C4h 2417 ; 27/11/2023 2418 00000F6A B2C4 mov dl, 0C4h 2419 00000F6C B002 mov al, 02h 2420 ;out dx, al 2421 00000F6E B401 mov ah, 1 ; outb 2422 00000F70 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2423 ;inc dx 2424 ; 27/11/2023 2425 00000F72 42 inc edx 2426 00000F73 8B0D[78550000] mov ecx, [picture.height] 2427 putlbml2: 2428 00000F79 51 push ecx 2429 00000F7A B011 mov al, 11h 2430 putlbml3: 2431 00000F7C 50 push eax 2432 00000F7D 57 push edi 2433 ;out dx, al 2434 00000F7E B401 mov ah, 1 ; outb 2435 00000F80 CD34 int 34h ; IOCTL interrupt (IN/OUT) 2436 00000F82 8B1D[74550000] mov ebx, [picture.width] 2437 putlbml4: 2438 00000F88 AC lodsb 2439 00000F89 84C0 test al, al 2440 00000F8B 7C0A jl short putlbmf3 2441 00000F8D 0FB6C8 movzx ecx, al 2442 00000F90 41 inc ecx 2443 00000F91 29CB sub ebx, ecx 2444 00000F93 F3A4 rep movsb 2445 00000F95 EB0B jmp short putlbmc4 2446 putlbmf3: 2447 00000F97 F6D8 neg al 2448 00000F99 0FB6C8 movzx ecx, al 2449 00000F9C 41 inc ecx 2450 00000F9D 29CB sub ebx, ecx 2451 00000F9F AC lodsb 2452 00000FA0 F3AA rep stosb 2453 putlbmc4: 2454 00000FA2 85DB test ebx, ebx 2455 00000FA4 7FE2 jg short putlbml4 2456 00000FA6 5F pop edi 2457 00000FA7 58 pop eax 2458 00000FA8 00C0 add al, al 2459 00000FAA 73D0 jnc short putlbml3 2460 00000FAC 83C750 add edi, 80 2461 00000FAF 59 pop ecx 2462 00000FB0 E2C7 loop putlbml2 2463 00000FB2 61 popad 2464 00000FB3 E94CFFFFFF jmp putlbmc0 2465 2466 ; EX1.C (Carlos Hasan, 21/06/1994) 2467 ;------------------------------------------------------------------------------ 2468 ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory 2469 ; ESI = IFF/ILBM image file address 2470 ;------------------------------------------------------------------------------ 2471 2472 ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) { 2473 ; printf("Error loading the IFF/ILBM logo picture\n"); 2474 ; MODStopModule(); 2475 ; MODFreeModule(Song); 2476 ; return; 2477 ; } 2478 ; setgraphmode(); 2479 ; putlbm(Logo); 2480 ; while (!kbhit()) 2481 ; drawscopes(Song->NumTracks); 2482 ; settextmode(); 2483 ; free(Logo); 2484 ; MODStopModule(); 2485 ; MODFreeModule(Song); 2486 2487 ;loadlbm: 2488 ; ; ebx = ASCIIZ file name address 2489 ; ; ecx = open mode (0 = open for read) 2490 ; sys _open, LOGO_FILE_NAME, 0 ; open for reading 2491 ; jc short loadlbm_retn 2492 ; 2493 ; mov [LBM_FileHandle], eax 2494 ; 2495 ; ; get file size by moving file pointer to the end of file 2496 ; ; ebx = file handle/number 2497 ; ; ecx : offset = 0 2498 ; ; edx : switch = 2 (move fp to end of file + offset) 2499 ; sys _seek, eax, 0, 2 2500 ; jc short loadlbm_cf 2501 ; 2502 ; mov [LBM_FileSize], eax 2503 ; 2504 ; ; move file pointer to the beginning of the file 2505 ; ; ecx = 0 2506 ; ; edx = 0 2507 ; ;xor ecx, ecx 2508 ; xor dl, dl 2509 ; ; ebx = [LBM_FileHandle] 2510 ; sys _seek 2511 ; ;jc short loadlbm_cf 2512 ; 2513 ; ; ebx = File handle 2514 ; ; ecx = Buffer address 2515 ; ; edx = Byte count 2516 ; ;sys _read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize] 2517 ; mov ecx, LOGO_ADDRESS 2518 ; mov edx, [LBM_FileSize] 2519 ; sys _read 2520 ; jc short loadlbm_cf 2521 ; 2522 ; cmp eax, edx ; read count = file size ? 2523 ; ;jb short loadlbm_cf 2524 ;loadlbm_cf: 2525 ; pushf 2526 ; sys _close, [LBM_FileHandle] 2527 ; popf 2528 ;loadlbm_retn: 2529 ; retn 2530 ; 2531 ;LOGO_FILE_NAME: 2532 ; db "LOGO.LBM", 0 2533 2534 LOGO_ERROR_MSG: 2535 00000FB8 4572726F72206C6F61- db "Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 2535 00000FC1 64696E672074686520- 2535 00000FCA 4946462F494C424D20- 2535 00000FD3 6C6F676F2070696374- 2535 00000FDC 75726520210D0A00 2536 2537 align 2 2538 ; 22/10/2017 2539 LOGO_ADDRESS: 2540 ;incbin "LOGO.LBM" 2541 ; 27/10/2017 2542 00000FE4 incbin "TINYPLAY.LBM" 2543 2544 ;============================================================================= 2545 ; preinitialized data 2546 ;============================================================================= 2547 2548 ;============================================================================= 2549 ; Protracker effects stuff 2550 ;============================================================================= 2551 2552 ;----------------------------------------------------------------------------- 2553 ; Effect jump tables 2554 ;----------------------------------------------------------------------------- 2555 2556 align 4 2557 2558 efxtable: 2559 0000527C [BE070000] dd efxarpeggio ; 0 - arpeggio 2560 00005280 [EC040000] dd efxnull ; 1 - porta up 2561 00005284 [EC040000] dd efxnull ; 2 - porta down 2562 00005288 [0A070000] dd efxtoneporta ; 3 - tone porta 2563 0000528C [19070000] dd efxvibrato ; 4 - vibrato 2564 00005290 [EC040000] dd efxnull ; 5 - tone+slide 2565 00005294 [EC040000] dd efxnull ; 6 - vibrato+slide 2566 00005298 [35080000] dd efxtremolo ; 7 - tremolo 2567 0000529C [EC040000] dd efxnull ; 8 - unused 2568 000052A0 [41070000] dd efxsampoffset ; 9 - sample offset 2569 000052A4 [EC040000] dd efxnull ; A - volume slide 2570 000052A8 [4D070000] dd efxpattjump ; B - pattern jump 2571 000052AC [5B070000] dd efxsetvolume ; C - set volume 2572 000052B0 [69070000] dd efxbreak ; D - break pattern 2573 000052B4 [EC040000] dd efxnull ; E - extra effects 2574 000052B8 [88070000] dd efxsetspeed ; F - set speed 2575 2576 efxtable2: 2577 000052BC [ED040000] dd efxarpeggio2 ; 0 - arpeggio 2578 000052C0 [0F050000] dd efxportaup ; 1 - porta up 2579 000052C4 [35050000] dd efxportadown ; 2 - porta down 2580 000052C8 [5C050000] dd efxtoneporta2 ; 3 - tone porta 2581 000052CC [95050000] dd efxvibrato2 ; 4 - vibrato 2582 000052D0 [F1050000] dd efxtoneslide ; 5 - tone+slide 2583 000052D4 [FE050000] dd efxvibslide ; 6 - vibrato+slide 2584 000052D8 [25060000] dd efxtremolo2 ; 7 - tremolo 2585 000052DC [EC040000] dd efxnull ; 8 - unused 2586 000052E0 [EC040000] dd efxnull ; 9 - sample offset 2587 000052E4 [08060000] dd efxvolslide ; A - volume slide 2588 000052E8 [EC040000] dd efxnull ; B - pattern jump 2589 000052EC [EC040000] dd efxnull ; C - set volume 2590 000052F0 [EC040000] dd efxnull ; D - break pattern 2591 000052F4 [EC040000] dd efxnull ; E - extra effects 2592 000052F8 [EC040000] dd efxnull ; F - set speed 2593 2594 ;----------------------------------------------------------------------------- 2595 ; Amiga period table 2596 ;----------------------------------------------------------------------------- 2597 2598 ;PeriodTable0: 2599 ; dw 0 2600 PeriodTable: 2601 000052FC 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 2601 00005305 0A000A7009E8086808- 2601 0000530E F00780071407 2602 00005314 B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 2602 0000531D 050005B80474043404- 2602 00005326 F803C0038A03 2603 0000532C 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 2603 00005335 0280025C023A021A02- 2603 0000533E FC01E001C501 2604 00005344 AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 2604 0000534D 0140012E011D010D01- 2604 00005356 FE00F000E200 2605 0000535C D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 2605 00005365 00A00097008F008700- 2605 0000536E 7F0078007100 2606 00005374 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 2606 0000537D 0050004B0047004300- 2606 00005386 3F003C003800 2607 0000538C 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 2607 00005395 002800250023002100- 2607 0000539E 1F001E001C00 2608 2609 ;----------------------------------------------------------------------------- 2610 ; Sinus wave table 2611 ;----------------------------------------------------------------------------- 2612 2613 SinTable: 2614 000053A4 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 2614 000053AD C5D4E1 2615 000053B0 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 2615 000053B9 E1 2616 000053BA D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 2616 000053C3 19 2617 2618 ;============================================================================= 2619 ; PLAY.ASM - DATA 2620 ;============================================================================= 2621 000053C4 00 db 0 2622 msg_usage: 2623 000053C5 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 2623 000053CE 506C6179657220666F- 2623 000053D7 72205452444F532033- 2623 000053E0 383620627920457264- 2623 000053E9 6F67616E2054616E2E- 2623 000053F2 20 2624 ;;;db 'October 2017.',10,13 2625 ;;db 'November 2023.',10,13 ; 27/11/2023 2626 ;db 'June 2024.',10,13 2627 000053F3 446563656D62657220- db 'December 2024',10,13 2627 000053FC 323032340A0D 2628 00005402 75736167653A20746D- db 'usage: tmodplay filename.mod', 10,13,0 2628 0000540B 6F64706C6179206669- 2628 00005414 6C656E616D652E6D6F- 2628 0000541D 640A0D00 2629 00005421 32392F31302F323031- db '29/10/2017',10,13,0 2629 0000542A 370A0D00 2630 0000542E 32372F31312F323032- db '27/11/2023',10,13,0 2630 00005437 330A0D00 2631 ;db '02/06/2024',10,13,0 2632 ;db '04/06/2024',10,13,0 2633 0000543B 32372F31322F323032- db '27/12/2024',10,13,0 2633 00005444 340A0D00 2634 2635 Credits: 2636 00005448 54696E79204D4F4420- db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 2636 00005451 506C61796572207630- 2636 0000545A 2E3162206279204361- 2636 00005463 726C6F732048617361- 2636 0000546C 6E2E204A756C792031- 2636 00005475 3939332E 2637 00005479 0A0D00 db 10,13,0 2638 ErrorMesg: 2639 0000547C 4572726F72206C6F61- db 'Error loading Module file.',10,13,0 2639 00005485 64696E67204D6F6475- 2639 0000548E 6C652066696C652E0A- 2639 00005497 0D00 2640 2641 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 2642 ;MsgFound: db 'Sound Blaster found at Address 2' 2643 ;PortText: db 'x0h, IRQ ' 2644 ;IrqText: db 'x.',10,13,0 2645 2646 trdos386_err_msg: 2647 00005499 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 2647 000054A2 2053797374656D2063- 2647 000054AB 616C6C206572726F72- 2647 000054B4 20210A0D00 2648 2649 ; 07/10/2017 2650 000054B9 0A pattern_shift: db 10 2651 ;numtracks: dw 4 2652 ; 18/10/2017 2653 000054BA 04000000 numtracks: dd 4 2654 2655 ;============================================================================= 2656 ; PLAYER.ASM - DATA 2657 ;============================================================================= 2658 2659 ;stmo: db 1 ; stereo (2) or mono (1) 2660 ;bps: db 8 ; bits per sample (8 or 16) 2661 2662 ;19/10/2017 2663 000054BE 02 stmo: db 2 ; stereo (2) or mono (1) 2664 000054BF 10 bps: db 16 ; bits per sample (8 or 16) 2665 2666 Sample_Rate: 2667 MixSpeed: ;dw 22050 ; Hz 2668 ; 27/11/2023 2669 ;dw 24000 ; Hz 2670 ; 02/06/2024 2671 000054C0 80BB dw 48000 ; Hz 2672 2673 ; 13/11/2016 2674 000054C2 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 2674 000054CB 3941424344454600 2675 ; 2676 msgAC97Info: 2677 000054D3 0D0A db 0Dh, 0Ah 2678 000054D5 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 2678 000054DE 6F20436F6E74726F6C- 2678 000054E7 6C6572202620436F64- 2678 000054F0 656320496E666F0D0A 2679 000054F9 56656E646F72204944- db "Vendor ID: " 2679 00005502 3A20 2680 00005504 303030306820446576- msgVendorId: db "0000h Device ID: " 2680 0000550D 6963652049443A20 2681 00005515 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 2682 0000551C 4275733A20 db "Bus: " 2683 00005521 303068204465766963- msgBusNo: db "00h Device: " 2683 0000552A 653A20 2684 0000552D 3030682046756E6374- msgDevNo: db "00h Function: " 2684 00005536 696F6E3A20 2685 0000553B 303068 msgFncNo db "00h" 2686 0000553E 0D0A db 0Dh, 0Ah 2687 00005540 4E414D4241523A20 db "NAMBAR: " 2688 00005548 30303030682020 msgNamBar db "0000h " 2689 0000554F 4E41424D4241523A20 db "NABMBAR: " 2690 00005558 303030306820204952- msgNabmBar db "0000h IRQ: " 2690 00005561 513A20 2691 00005564 3030 msgIRQ: dw 3030h 2692 00005566 0D0A00 db 0Dh, 0Ah, 0 2693 ; 2694 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 2695 ;codec_id: dd 0 2696 ;codec_chip_id: dd 0 2697 ;codec_vendor_ids: dw 0 2698 ;codec_chip_ids: dw 0 2699 2700 ;dword_str: dd 30303030h, 30303030h 2701 ; db 'h', 0Dh, 0Ah, 0 2702 2703 ;============================================================================= 2704 ; uninitialized data 2705 ;============================================================================= 2706 2707 bss_start: 2708 2709 ABSOLUTE bss_start 2710 2711 00005569 ?????? alignb 4 2712 2713 ;------------------------------------------------------------------------------ 2714 ; IFF/ILBM DATA 2715 ;------------------------------------------------------------------------------ 2716 2717 0000556C ???????? LBM_FileHandle: resd 1 2718 00005570 ???????? LBM_FileSize: resd 1 2719 ; 2720 00005574 ???????? picture.width: resd 1 ; current picture width and height 2721 00005578 ???????? picture.height: resd 1 2722 2723 ;------------------------------------------------------------------------------ 2724 2725 0000557C ???????? dev_vendor: resd 1 2726 00005580 ???????? bus_dev_fn: resd 1 2727 00005584 ???????? stats_cmd: resd 1 2728 00005588 ???? ac97_NamBar: resw 1 2729 0000558A ???? ac97_NabmBar: resw 1 2730 0000558C ?? ac97_int_ln_reg: resb 1 2731 0000558D ?? srb: resb 1 2732 2733 ; MODLOAD.ASM 2734 0000558E ???????? FileHandle: resd 1 2735 00005592 Header: resb ModHeader.size 2736 2737 ; MODPLAY.ASM 2738 ;MixSpeed: resw 1 2739 2740 ModInfo: 2741 000059CE ?? ModInfo.OrderLen: resb 1 2742 000059CF ?? ModInfo.ReStart: resb 1 2743 000059D0 ModInfo.Order: resb 128 2744 00005A50 ???????? ModInfo.Patterns: resd 1 2745 2746 00005A54 ModInfo.SampOfs: resw 31 2747 00005A92 ModInfo.SampSeg: resw 31 2748 00005AD0 ModInfo.SampLen: resw 31 2749 00005B0E ModInfo.SampRep: resw 31 2750 00005B4C ModInfo.SampRepLen: resw 31 2751 00005B8A ModInfo.SampVol: resw 31 2752 2753 ; MODPLAY.ASM 2754 PitchTable: ;resw 857 2755 00005BC8 resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 2756 0000768A VolTable: resb 16640 2757 MixBuffer: ;resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017 2758 0000B78A resb 8192 2759 2760 ; MODPLAY.ASM 2761 0000D78A ?? OrderPos: resb 1 2762 0000D78B ?? Tempo: resb 1 2763 0000D78C ?? TempoWait: resb 1 2764 0000D78D ?? Bpm: resb 1 2765 0000D78E ?? Row: resb 1 2766 0000D78F ?? BreakRow: resb 1 2767 0000D790 ???? BpmSamples: resw 1 2768 0000D792 ???????? BufPtr: resd 1 2769 0000D796 ???? BufLen: resw 1 2770 0000D798 ???????? BufRep: resd 1 2771 0000D79C ???????? Note: resd 1 2772 ;Tracks: resb TrackInfo.size*NumTracks 2773 ; 07/10/2017 2774 0000D7A0 Tracks: resb TrackInfo.size*8 2775 2776 alignb 16 2777 2778 ; PLAY.ASM 2779 ;Scope: resw 320 2780 0000D8D0 RowOfs: resw 256 2781 2782 ; 23/10/2017 2783 0000DAD0 NewScope_L: resw 256 2784 0000DCD0 NewScope_R: resw 256 2785 0000DED0 OldScope_L: resw 256 2786 0000E0D0 OldScope_R: resw 256 2787 2788 ; 27/12/2024 2789 0000E2D0 ???????? timerticks: resd 1 2790 2791 mod_file_name: 2792 0000E2D4 resb 80 2793 2794 ; 20/10/2017 (modplay7.s, SB16) 2795 ; 19/10/2017 (modplay6.s, AC97) 2796 0000E324 ?? pan_shift: resb 1 2797 0000E325 ?? volume_level: resb 1 2798 2799 0000E326 alignb 4096 2800 2801 Audio_Buffer: 2802 0000F000 resb BUFFERSIZE ; DMA Buffer Size / 2 (32768) 2803 ;temp_buffer: 2804 ; ;resb BUFFERSIZE / 4 ; 8192 2805 ; resb BUFFERSIZE / 2 ; 17/10/2017 2806 2807 0001F000 alignb 65536 2808 2809 DMA_Buffer: ;resb 65536 2810 00020000 resb 131072 ; 27/11/2023 2811 file_buffer: 2812 00040000 resb 65536*6 2813 EOF: