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