1 ; **************************************************************************** 2 ; tinyplay.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; TINYPLAY.PRG ! MOD PLAYER & VGA DEMO program ! by Erdogan TAN 5 ; 6 ; 03/03/2017 7 ; 8 ; [ Last Modification: 07/10/2017 ] 9 ; 10 ; Modified from 'TMODPLAY.COM' (tmodplay.asm) source code (for MSDOS) 11 ; by Erdogan Tan - 01/10/2017 12 ; 13 ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993) 14 ; PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM 15 ; 16 ; Assembler: NASM 2.11 17 ; ---------------------------------------------------------------------------- 18 ; nasm tinyplay.s -l tinyplay.txt -o TINYPLAY.PRG 19 ; **************************************************************************** 20 ; TINYPLAY.ASM by Erdogan Tan (for MSDOS) (13/02/2017) 21 ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017) 22 23 ; 01/03/2017 24 ; 16/10/2016 25 ; 29/04/2016 26 ; TRDOS 386 system calls (temporary list!) 27 _ver equ 0 28 _exit equ 1 29 _fork equ 2 30 _read equ 3 31 _write equ 4 32 _open equ 5 33 _close equ 6 34 _wait equ 7 35 _creat equ 8 36 _link equ 9 37 _unlink equ 10 38 _exec equ 11 39 _chdir equ 12 40 _time equ 13 41 _mkdir equ 14 42 _chmod equ 15 43 _chown equ 16 44 _break equ 17 45 _stat equ 18 46 _seek equ 19 47 _tell equ 20 48 _mount equ 21 49 _umount equ 22 50 _setuid equ 23 51 _getuid equ 24 52 _stime equ 25 53 _quit equ 26 54 _intr equ 27 55 _fstat equ 28 56 _emt equ 29 57 _mdate equ 30 58 _video equ 31 59 _audio equ 32 60 _timer equ 33 61 _sleep equ 34 62 _msg equ 35 63 _geterr equ 36 64 _fpsave equ 37 65 _pri equ 38 66 _rele equ 39 67 _fff equ 40 68 _fnf equ 41 69 _alloc equ 42 70 _dalloc equ 43 71 _calbac equ 44 72 73 %macro sys 1-4 74 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 75 ; 03/09/2015 76 ; 13/04/2015 77 ; Retro UNIX 386 v1 system call. 78 %if %0 >= 2 79 mov ebx, %2 80 %if %0 >= 3 81 mov ecx, %3 82 %if %0 = 4 83 mov edx, %4 84 %endif 85 %endif 86 %endif 87 mov eax, %1 88 ;int 30h 89 int 40h ; TRDOS 386 (TRDOS v2.0) 90 %endmacro 91 92 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 93 ; sys systemcall (eax) , , 94 95 96 ; ---------------------------------------------------------------------------- 97 ; Tiny MOD Player v0.1b by Carlos Hasan. 98 ; July 14th, 1993. 99 100 ;============================================================================= 101 ; PLAY.ASM 102 ;============================================================================= 103 104 [BITS 32] 105 [org 0] 106 107 Start: 108 ; clear bss 109 00000000 B9[00000800] mov ecx, EOF 110 00000005 BF[8F0F0000] mov edi, bss_start 111 0000000A 29F9 sub ecx, edi 112 0000000C C1E902 shr ecx, 2 113 ;xor eax, eax 114 0000000F F3AB rep stosd 115 116 GetFileName: 117 00000011 89E6 mov esi, esp 118 00000013 AD lodsd 119 00000014 83F802 cmp eax, 2 ; two arguments 120 ; (program file name & mod file name) 121 00000017 0F8299010000 jb pmsg_usage ; nothing to do 122 123 0000001D AD lodsd ; program file name address 124 0000001E AD lodsd ; mod file name address (file to be read) 125 0000001F 89C6 mov esi, eax 126 00000021 BF[64870000] mov edi, mod_file_name 127 ScanName: 128 00000026 AC lodsb 129 00000027 84C0 test al, al 130 00000029 0F8487010000 je pmsg_usage 131 0000002F 3C20 cmp al, 20h 132 00000031 74F3 je short ScanName ; scan start of name. 133 00000033 AA stosb 134 00000034 B4FF mov ah, 0FFh 135 a_0: 136 00000036 FEC4 inc ah 137 a_1: 138 00000038 AC lodsb 139 00000039 AA stosb 140 0000003A 3C2E cmp al, '.' 141 0000003C 74F8 je short a_0 142 0000003E 20C0 and al, al 143 00000040 75F6 jnz short a_1 144 145 00000042 08E4 or ah, ah ; if period NOT found, 146 00000044 750B jnz short a_2 ; then add a .MOD extension. 147 SetExt: 148 00000046 4F dec edi 149 00000047 C7072E4D4F44 mov dword [edi], '.MOD' 150 0000004D C6470400 mov byte [edi+4], 0 151 a_2: 152 ; Prints the Credits Text. 153 sys _msg, Credits, 255, 0Ch 153 <1> 153 <1> 153 <1> 153 <1> 153 <1> %if %0 >= 2 153 00000051 BB[C50E0000] <1> mov ebx, %2 153 <1> %if %0 >= 3 153 00000056 B9FF000000 <1> mov ecx, %3 153 <1> %if %0 = 4 153 0000005B BA0C000000 <1> mov edx, %4 153 <1> %endif 153 <1> %endif 153 <1> %endif 153 00000060 B823000000 <1> mov eax, %1 153 <1> 153 00000065 CD40 <1> int 40h 154 155 00000067 E862010000 call DetectSb ; Detect the SB Addr, Irq. 156 LoadMod: 157 0000006C BF[64870000] mov edi, mod_file_name 158 00000071 E8EC040000 call LoadModule ; Load the MODule... 159 ; 06/10/2017 160 00000076 731B jnc short PlayNow ; any error loading? 161 162 ; yes, print error and Exit. 163 164 sys _msg, ErrorMesg, 255, 0Fh 164 <1> 164 <1> 164 <1> 164 <1> 164 <1> %if %0 >= 2 164 00000078 BB[F90E0000] <1> mov ebx, %2 164 <1> %if %0 >= 3 164 0000007D B9FF000000 <1> mov ecx, %3 164 <1> %if %0 = 4 164 00000082 BA0F000000 <1> mov edx, %4 164 <1> %endif 164 <1> %endif 164 <1> %endif 164 00000087 B823000000 <1> mov eax, %1 164 <1> 164 0000008C CD40 <1> int 40h 165 166 0000008E E917010000 jmp Exit 167 168 PlayNow: 169 ;; DIRECT MEMORY ACCESS (for Audio DMA) 170 ;; ebx = DMA buffer address (virtual, user) 171 ;; ecx = buffer size (in bytes) 172 ;; edx = upper limit = 16MB 173 174 ;_16MB equ 1024*1024*16 175 176 ;sys _alloc, DoubleBuffer, DmaBufSize, _16MB 177 ;jc short error_exit 178 179 ; 12/05/2017 180 sys _audio, 0D00h, DmaBufSize, DoubleBuffer 180 <1> 180 <1> 180 <1> 180 <1> 180 <1> %if %0 >= 2 180 00000093 BB000D0000 <1> mov ebx, %2 180 <1> %if %0 >= 3 180 00000098 B900000100 <1> mov ecx, %3 180 <1> %if %0 = 4 180 0000009D BA[00000100] <1> mov edx, %4 180 <1> %endif 180 <1> %endif 180 <1> %endif 180 000000A2 B820000000 <1> mov eax, %1 180 <1> 180 000000A7 CD40 <1> int 40h 181 000000A9 724A jc short error_exit 182 183 000000AB A3[30860000] mov [DMA_phy_buff], eax ; physical address 184 ; of the buffer 185 ; (which is needed 186 ; for DMA controller) 187 ; 11/03/2017 (22000 -> 22050) 188 ;mov word [MixSpeed], 22050 ; Mixing at 22 kHz 189 ; 07/10/2017 190 000000B0 66C705[920F0000]CE- mov word [MixSpeed], 22222 ; Mixing at 22 kHz 190 000000B8 56 191 192 ; call StartPlaying ; PLAY! 193 194 000000B9 E80E030000 call SbInit 195 196 000000BE B980000000 mov ecx, 128 ; Make a lookup table 197 000000C3 31DB xor ebx, ebx ; for fastest pixel 198 000000C5 BA002D0000 mov edx, 320*(100-64) ; addressing. 199 MakeOfs: 200 000000CA 668993[30840000] mov [RowOfs+ebx], dx 201 000000D1 668993[32840000] mov [RowOfs+ebx+2], dx 202 000000D8 6681C24001 add dx, 320 203 000000DD 83C304 add ebx, 4 204 000000E0 E2E8 loop MakeOfs 205 206 ;cld 207 208 ; DIRECT VGA MEMORY ACCESS 209 ; bl = 0, bh = 5 210 ; Direct access/map to VGA memory (0A0000h) 211 212 sys _video, 0500h 212 <1> 212 <1> 212 <1> 212 <1> 212 <1> %if %0 >= 2 212 000000E2 BB00050000 <1> mov ebx, %2 212 <1> %if %0 >= 3 212 <1> mov ecx, %3 212 <1> %if %0 = 4 212 <1> mov edx, %4 212 <1> %endif 212 <1> %endif 212 <1> %endif 212 000000E7 B81F000000 <1> mov eax, %1 212 <1> 212 000000EC CD40 <1> int 40h 213 000000EE 3D00000A00 cmp eax, 0A0000h 214 000000F3 741B je short start_scope 215 216 error_exit: 217 sys _msg, trdos386_err_msg, 255, 0Eh 217 <1> 217 <1> 217 <1> 217 <1> 217 <1> %if %0 >= 2 217 000000F5 BB[6C0F0000] <1> mov ebx, %2 217 <1> %if %0 >= 3 217 000000FA B9FF000000 <1> mov ecx, %3 217 <1> %if %0 = 4 217 000000FF BA0E000000 <1> mov edx, %4 217 <1> %endif 217 <1> %endif 217 <1> %endif 217 00000104 B823000000 <1> mov eax, %1 217 <1> 217 00000109 CD40 <1> int 40h 218 ;jmp short Exit 219 0000010B E99A000000 jmp Exit 220 221 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 222 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 223 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 224 ; second, or the module will sound "looped". 225 ; Because we need better sync with the ModPlayer to draw the scope, 226 ; the polling is called from my routine, and then the irq 0 must be 227 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 228 ; samples played by the Sound Blaster. Note that some samples are 229 ; discarded in the next code, just for fun! 230 231 start_scope: 232 ; mov ax, 0A000h 233 ; mov es, ax 234 00000110 89C7 mov edi, eax ; 0A0000h 235 236 ;mov byte [tLoop], 1 237 238 ; 11/03/2017 239 00000112 66B81300 mov ax, 0013h ; Set Mode 320x200x256 240 00000116 CD31 int 31h 241 ScopeLoop: 242 ; ModPlay Polling! 243 00000118 E882020000 call SbPoll 244 245 ;cmp byte [tLoop], 1 246 ;jb short _StopPlay 247 248 ; 06/10/2017 249 0000011D BE[00000100] mov esi, DmaBuffer ; get current samples 250 ; to be drawed ... 251 ; 12/03/2017 252 ; original tinyplay scope drawing code is for 1K buffer 253 ; but now we have 32K buffer, following code is for that... 254 GetDmaCount: 255 ;in al, 03h 256 00000122 66BA0300 mov dx, 03h 257 00000126 B400 mov ah, 0 ; inb 258 00000128 CD34 int 34h 259 0000012A 88C1 mov cl, al 260 ;in al, 03h 261 ;mov ah, 0 ; inb 262 0000012C CD34 int 34h 263 0000012E 88C5 mov ch, al 264 ; 06/10/2017 265 ;mov dx, 65535 266 00000130 BAFFFF0000 mov edx, DmaBufSize - 1 267 ;mov esi, DmaBufSize - 1 ; <= 65535 268 00000135 6629CA sub dx, cx 269 ;sub si, cx 270 ; 15/03/2017 271 00000138 6681EAA000 sub dx, 160 272 ;add si, dx 273 0000013D 01D6 add esi, edx ; 06/10/2017 274 ; 06/10/2017 275 ;sub si, 160 276 ;and si, DmaBufSize - 1 277 ; 278 0000013F 31C9 xor ecx, ecx 279 00000141 31D2 xor edx, edx 280 DrawLoop: 281 00000143 6689D3 mov bx, dx ; (save Index) 282 00000146 66678BBF[B081] mov di, [Scope+bx] ; get old SCOPE pixel address 283 ;mov byte [es:di], 0 ; erase it! 284 0000014C C60700 mov byte [edi], 0 285 ;lodsb ; get a sample (8-bit) 286 ;mov bl, al 287 ;15/03/2017 288 0000014F 8A1E mov bl, [esi] ; calc new pixel address... 289 00000151 6646 inc si 290 ; 06/10/2017 291 ;and si, DmaBufSize - 1 292 ;mov bl, [esi+DmaBuffer] 293 ;inc si 294 ;;and si, DmaBufSize - 1 295 ; 296 00000153 30FF xor bh, bh 297 00000155 66D1E3 shl bx, 1 298 00000158 66678BBF[3084] mov di, [RowOfs+bx] 299 0000015E 6601CF add di, cx 300 00000161 6689D3 mov bx, dx ; (restore Index) 301 00000164 666789BF[B081] mov [Scope+bx], di ; save new address... 302 ;mov byte [es:di], 10 ; and DRAW. 303 0000016A C6070A mov byte [edi], 10 304 0000016D 6683C202 add dx, 2 ; the next pixel... 305 00000171 6641 inc cx 306 00000173 6681F94001 cmp cx, 320 ; 320 pixels drawed? 307 00000178 72C9 jb short DrawLoop 308 CheckAnyKey: 309 0000017A B401 mov ah, 1 ; any key pressed? 310 0000017C CD32 int 32h ; no, Loop. 311 0000017E 7498 jz short ScopeLoop 312 313 00000180 B400 mov ah, 0 ; flush key buffer... 314 00000182 CD32 int 32h 315 316 00000184 66B80300 mov ax, 0003h ; Set Text Mode 80x25x16 317 00000188 CD31 int 31h 318 319 ;call StopPlaying ; STOP! 320 321 ;mov byte [tLoop], 0 322 _StopPlay: 323 ; 11/03/2017 324 0000018A 30C0 xor al, al 325 ; Stop 8 bit (autoinitialized) DMA process 326 ;out 0Ch, al 327 ;retn 328 0000018C 66BA0C00 mov dx, 0Ch 329 00000190 B401 mov ah, 1 ;outb 330 00000192 CD34 int 34h 331 332 00000194 E88B030000 call SbDone 333 334 ; Deallocate DMA buffer (not necessary just before exit!) 335 sys _dalloc, DoubleBuffer, DmaBufSize 335 <1> 335 <1> 335 <1> 335 <1> 335 <1> %if %0 >= 2 335 00000199 BB[00000100] <1> mov ebx, %2 335 <1> %if %0 >= 3 335 0000019E B900000100 <1> mov ecx, %3 335 <1> %if %0 = 4 335 <1> mov edx, %4 335 <1> %endif 335 <1> %endif 335 <1> %endif 335 000001A3 B82B000000 <1> mov eax, %1 335 <1> 335 000001A8 CD40 <1> int 40h 336 ;jc error_exit 337 Exit: 338 000001AA E831050000 call FreeModule ; Free MODule core. 339 340 sys _exit ; Bye! 340 <1> 340 <1> 340 <1> 340 <1> 340 <1> %if %0 >= 2 340 <1> mov ebx, %2 340 <1> %if %0 >= 3 340 <1> mov ecx, %3 340 <1> %if %0 = 4 340 <1> mov edx, %4 340 <1> %endif 340 <1> %endif 340 <1> %endif 340 000001AF B801000000 <1> mov eax, %1 340 <1> 340 000001B4 CD40 <1> int 40h 341 342 pmsg_usage: 343 sys _msg, msg_usage, 255, 0Ah 343 <1> 343 <1> 343 <1> 343 <1> 343 <1> %if %0 >= 2 343 000001B6 BB[5E0E0000] <1> mov ebx, %2 343 <1> %if %0 >= 3 343 000001BB B9FF000000 <1> mov ecx, %3 343 <1> %if %0 = 4 343 000001C0 BA0A000000 <1> mov edx, %4 343 <1> %endif 343 <1> %endif 343 <1> %endif 343 000001C5 B823000000 <1> mov eax, %1 343 <1> 343 000001CA CD40 <1> int 40h 344 000001CC EBDC jmp short Exit 345 346 DetectSb: 347 000001CE 60 pushad 348 ScanPort: 349 000001CF 66BB1002 mov bx, 210h ; start scanning ports 350 ; 210h, 220h, .. 260h 351 ResetDSP: 352 000001D3 6689DA mov dx, bx ; try to reset the DSP. 353 000001D6 6683C206 add dx, 06h 354 000001DA B001 mov al, 1 355 ;out dx, al 356 000001DC B401 mov ah, 1 ; outb 357 000001DE CD34 int 34h 358 359 ;in al, dx 360 ;in al, dx 361 ;in al, dx 362 ;in al, dx 363 364 000001E0 B400 mov ah, 0 ; inb 365 000001E2 CD34 int 34h 366 ;mov ah, 0 ; inb 367 000001E4 CD34 int 34h 368 369 000001E6 30C0 xor al, al 370 ;out dx, al 371 000001E8 B401 mov ah, 1 ; outb 372 000001EA CD34 int 34h 373 374 000001EC 6683C208 add dx, 08h 375 ;mov cx, 100 376 000001F0 66B92000 mov cx, 32 377 000001F4 28E4 sub ah, ah ; 0 378 WaitID: 379 ;in al, dx 380 000001F6 CD34 int 34h ;ah = 0 ; inb 381 000001F8 08C0 or al, al 382 000001FA 7804 js short GetID 383 000001FC E2F8 loop WaitID 384 000001FE EB10 jmp short NextPort 385 GetID: 386 00000200 6683EA04 sub dx, 04h 387 ;in al, dx 388 00000204 CD34 int 34h ;ah = 0 ; inb 389 00000206 3CAA cmp al, 0AAh 390 00000208 7416 je short Found 391 0000020A 6683C204 add dx, 04h 392 0000020E E2E6 loop WaitID 393 NextPort: 394 00000210 6683C310 add bx, 10h ; if not response, 395 00000214 6681FB6002 cmp bx, 260h ; try the next port. 396 00000219 76B8 jbe short ResetDSP 397 0000021B E934010000 jmp Fail 398 Found: 399 00000220 66891D[0E0D0000] mov [SbAddr], bx ; SB Port Address Found! 400 ScanIRQ: 401 SetIrqs: ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ 402 sys _calbac, 102h, 2, SbIrq ; IRQ 2 402 <1> 402 <1> 402 <1> 402 <1> 402 <1> %if %0 >= 2 402 00000227 BB02010000 <1> mov ebx, %2 402 <1> %if %0 >= 3 402 0000022C B902000000 <1> mov ecx, %3 402 <1> %if %0 = 4 402 00000231 BA[100D0000] <1> mov edx, %4 402 <1> %endif 402 <1> %endif 402 <1> %endif 402 00000236 B82C000000 <1> mov eax, %1 402 <1> 402 0000023B CD40 <1> int 40h 403 ; Signal Response Byte 404 ;jc short error_exit 405 406 sys _calbac, 103h, 3, SbIrq ; IRQ 3 406 <1> 406 <1> 406 <1> 406 <1> 406 <1> %if %0 >= 2 406 0000023D BB03010000 <1> mov ebx, %2 406 <1> %if %0 >= 3 406 00000242 B903000000 <1> mov ecx, %3 406 <1> %if %0 = 4 406 00000247 BA[100D0000] <1> mov edx, %4 406 <1> %endif 406 <1> %endif 406 <1> %endif 406 0000024C B82C000000 <1> mov eax, %1 406 <1> 406 00000251 CD40 <1> int 40h 407 ; Signal Response Byte 408 ;jc short error_exit 409 410 sys _calbac, 104h, 4, SbIrq ; IRQ 4 410 <1> 410 <1> 410 <1> 410 <1> 410 <1> %if %0 >= 2 410 00000253 BB04010000 <1> mov ebx, %2 410 <1> %if %0 >= 3 410 00000258 B904000000 <1> mov ecx, %3 410 <1> %if %0 = 4 410 0000025D BA[100D0000] <1> mov edx, %4 410 <1> %endif 410 <1> %endif 410 <1> %endif 410 00000262 B82C000000 <1> mov eax, %1 410 <1> 410 00000267 CD40 <1> int 40h 411 ; Signal Response Byte 412 ;jc short error_exit 413 414 sys _calbac, 105h, 5, SbIrq ; IRQ 5 414 <1> 414 <1> 414 <1> 414 <1> 414 <1> %if %0 >= 2 414 00000269 BB05010000 <1> mov ebx, %2 414 <1> %if %0 >= 3 414 0000026E B905000000 <1> mov ecx, %3 414 <1> %if %0 = 4 414 00000273 BA[100D0000] <1> mov edx, %4 414 <1> %endif 414 <1> %endif 414 <1> %endif 414 00000278 B82C000000 <1> mov eax, %1 414 <1> 414 0000027D CD40 <1> int 40h 415 ; Signal Response Byte 416 ;jc short error_exit 417 418 sys _calbac, 107h, 7, SbIrq ; IRQ 7 418 <1> 418 <1> 418 <1> 418 <1> 418 <1> %if %0 >= 2 418 0000027F BB07010000 <1> mov ebx, %2 418 <1> %if %0 >= 3 418 00000284 B907000000 <1> mov ecx, %3 418 <1> %if %0 = 4 418 00000289 BA[100D0000] <1> mov edx, %4 418 <1> %endif 418 <1> %endif 418 <1> %endif 418 0000028E B82C000000 <1> mov eax, %1 418 <1> 418 00000293 CD40 <1> int 40h 419 ; Signal Response Byte 420 ;jc short error_exit 421 422 00000295 C605[100D0000]00 mov byte [SbIrq], 0 ; clear the IRQ level. 423 424 0000029C 668B15[0E0D0000] mov dx, [SbAddr] ; tells to the SB to 425 000002A3 6683C20C add dx, 0Ch ; generate a IRQ! 426 WaitSb: ;in al, dx 427 000002A7 B400 mov ah, 0 ; inb 428 000002A9 CD34 int 34h 429 000002AB 08C0 or al, al 430 000002AD 78F8 js short WaitSb 431 000002AF B0F2 mov al, 0F2h 432 ;out dx, al 433 000002B1 B401 mov ah,1 ; outb 434 000002B3 CD34 int 34h 435 436 000002B5 31C9 xor ecx, ecx ; wait until IRQ level 437 WaitIRQ: 438 000002B7 803D[100D0000]00 cmp byte [SbIrq], 0 ; is changed or timeout. 439 000002BE 7506 jne short IrqOk 440 000002C0 6649 dec cx 441 000002C2 75F3 jnz short WaitIRQ 442 000002C4 EB0F jmp short RestoreIrqs 443 IrqOk: 444 000002C6 668B15[0E0D0000] mov dx, [SbAddr] 445 000002CD 6683C20E add dx, 0Eh 446 ;in al, dx ; SB acknowledge. 447 000002D1 B400 mov ah, 0 ; inb 448 000002D3 CD34 int 34h 449 ;mov al, 20h 450 ;;out 20h, al ; Hardware acknowledge. 451 ;mov ah,1 ; outb 452 ;int 34h 453 454 RestoreIrqs: ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ 455 sys _calbac, 2 ; unlink IRQ 2 455 <1> 455 <1> 455 <1> 455 <1> 455 <1> %if %0 >= 2 455 000002D5 BB02000000 <1> mov ebx, %2 455 <1> %if %0 >= 3 455 <1> mov ecx, %3 455 <1> %if %0 = 4 455 <1> mov edx, %4 455 <1> %endif 455 <1> %endif 455 <1> %endif 455 000002DA B82C000000 <1> mov eax, %1 455 <1> 455 000002DF CD40 <1> int 40h 456 ; Signal Response Byte 457 sys _calbac, 3 ; unlink IRQ 3 457 <1> 457 <1> 457 <1> 457 <1> 457 <1> %if %0 >= 2 457 000002E1 BB03000000 <1> mov ebx, %2 457 <1> %if %0 >= 3 457 <1> mov ecx, %3 457 <1> %if %0 = 4 457 <1> mov edx, %4 457 <1> %endif 457 <1> %endif 457 <1> %endif 457 000002E6 B82C000000 <1> mov eax, %1 457 <1> 457 000002EB CD40 <1> int 40h 458 ; Signal Response Byte 459 sys _calbac, 4 ; unlink IRQ 4 459 <1> 459 <1> 459 <1> 459 <1> 459 <1> %if %0 >= 2 459 000002ED BB04000000 <1> mov ebx, %2 459 <1> %if %0 >= 3 459 <1> mov ecx, %3 459 <1> %if %0 = 4 459 <1> mov edx, %4 459 <1> %endif 459 <1> %endif 459 <1> %endif 459 000002F2 B82C000000 <1> mov eax, %1 459 <1> 459 000002F7 CD40 <1> int 40h 460 ; Signal Response Byte 461 sys _calbac, 5 ; unlink IRQ 5 461 <1> 461 <1> 461 <1> 461 <1> 461 <1> %if %0 >= 2 461 000002F9 BB05000000 <1> mov ebx, %2 461 <1> %if %0 >= 3 461 <1> mov ecx, %3 461 <1> %if %0 = 4 461 <1> mov edx, %4 461 <1> %endif 461 <1> %endif 461 <1> %endif 461 000002FE B82C000000 <1> mov eax, %1 461 <1> 461 00000303 CD40 <1> int 40h 462 ; Signal Response Byte 463 sys _calbac, 7 ; unlink IRQ 7 463 <1> 463 <1> 463 <1> 463 <1> 463 <1> %if %0 >= 2 463 00000305 BB07000000 <1> mov ebx, %2 463 <1> %if %0 >= 3 463 <1> mov ecx, %3 463 <1> %if %0 = 4 463 <1> mov edx, %4 463 <1> %endif 463 <1> %endif 463 <1> %endif 463 0000030A B82C000000 <1> mov eax, %1 463 <1> 463 0000030F CD40 <1> int 40h 464 ; Signal Response Byte 465 466 00000311 803D[100D0000]00 cmp byte [SbIrq], 0 ; IRQ level was changed? 467 00000318 743A je short Fail ; no, fail. 468 Success: 469 0000031A 668B15[0E0D0000] mov dx, [SbAddr] ; Print Sucessful message. 470 00000321 8A0D[100D0000] mov cl, [SbIrq] 471 00000327 C0EA04 shr dl, 4 472 0000032A 80C230 add dl, '0' 473 0000032D 8815[5E0F0000] mov [PortText], dl 474 00000333 80C130 add cl, '0' 475 00000336 880D[670F0000] mov [IrqText], cl 476 477 sys _msg, MsgFound, 255, 0Fh 477 <1> 477 <1> 477 <1> 477 <1> 477 <1> %if %0 >= 2 477 0000033C BB[3E0F0000] <1> mov ebx, %2 477 <1> %if %0 >= 3 477 00000341 B9FF000000 <1> mov ecx, %3 477 <1> %if %0 = 4 477 00000346 BA0F000000 <1> mov edx, %4 477 <1> %endif 477 <1> %endif 477 <1> %endif 477 0000034B B823000000 <1> mov eax, %1 477 <1> 477 00000350 CD40 <1> int 40h 478 479 00000352 61 popad ; Return to caller. 480 00000353 C3 retn 481 482 Fail: 483 ; Print Failed Message, 484 ; and exit to MainProg. 485 486 sys _msg, MsgNotFound, 255, 0Fh 486 <1> 486 <1> 486 <1> 486 <1> 486 <1> %if %0 >= 2 486 00000354 BB[160F0000] <1> mov ebx, %2 486 <1> %if %0 >= 3 486 00000359 B9FF000000 <1> mov ecx, %3 486 <1> %if %0 = 4 486 0000035E BA0F000000 <1> mov edx, %4 486 <1> %endif 486 <1> %endif 486 <1> %endif 486 00000363 B823000000 <1> mov eax, %1 486 <1> 486 00000368 CD40 <1> int 40h 487 488 sys _exit 488 <1> 488 <1> 488 <1> 488 <1> 488 <1> %if %0 >= 2 488 <1> mov ebx, %2 488 <1> %if %0 >= 3 488 <1> mov ecx, %3 488 <1> %if %0 = 4 488 <1> mov edx, %4 488 <1> %endif 488 <1> %endif 488 <1> %endif 488 0000036A B801000000 <1> mov eax, %1 488 <1> 488 0000036F CD40 <1> int 40h 489 here: 490 00000371 EBFE jmp short here 491 492 ;============================================================================= 493 ; SB.ASM 494 ;============================================================================= 495 496 ; Sound Blaster DMA Driver v0.1b by Carlos Hasan. 497 ; July 24th, 1993. 498 499 ; EQUATES 500 501 ; 06/10/2017 502 ;DmaBufSize equ 4096 ; 06/10/2017 503 ;DmaBufSize equ 2048 ; 06/10/2017 504 DmaBufSize equ 65536 ; 12/03/2017 505 506 ; MACROS 507 508 %macro SbOut 1 509 %%Wait: 510 ;in al, dx 511 mov ah, 0 512 int 34h 513 or al, al 514 js short %%Wait 515 mov al, %1 516 ;out dx, al 517 mov ah, 1 518 int 34h 519 %endmacro 520 521 ; CODE 522 523 ;-------------------------------------------------------------------------- 524 ; SbIrqHandler: Sound Blaster IRQ handler. 525 ;-------------------------------------------------------------------------- 526 527 SbIrqHandler: ; SoundBlaster IRQ Callback service for TRDOS 386 528 ; 03/03/2017 529 530 ; 12/03/2017 531 ; 11/03/2017 532 533 00000373 668B15[0E0D0000] mov dx, [SbAddr] 534 0000037A 6683C20E add dx, 0Eh 535 ;in al, dx 536 ;mov ah, 0 537 0000037E 28E4 sub ah, ah 538 00000380 CD34 int 34h 539 540 ;test byte [flags], ENDOFFILE ; end of file flag 541 ;jz short a_3 542 543 ;sub dx, 02h ; 0Ch 544 545 ; exit auto-initialize 8 bit transfer 546 ;SbOut 0DAh ; exit auto-initialize transfer command 547 ;jmp short a_5 548 a_3: 549 00000382 30C0 xor al, al ; 0 550 00000384 A2[910F0000] mov [iStatus], al 551 00000389 3805[900F0000] cmp [DmaFlag], al 552 0000038F 7702 ja short a_4 553 00000391 FEC0 inc al 554 a_4: 555 00000393 A2[900F0000] mov [DmaFlag], al ; 556 a_5: 557 sys _rele ; return from callback service 557 <1> 557 <1> 557 <1> 557 <1> 557 <1> %if %0 >= 2 557 <1> mov ebx, %2 557 <1> %if %0 >= 3 557 <1> mov ecx, %3 557 <1> %if %0 = 4 557 <1> mov edx, %4 557 <1> %endif 557 <1> %endif 557 <1> %endif 557 00000398 B827000000 <1> mov eax, %1 557 <1> 557 0000039D CD40 <1> int 40h 558 559 ; ; 07/10/2017 (TMODPLAY.ASM) 560 ; 561 ; mov dx, [SbAddr] 562 ; add dx, 0Eh 563 ; ;in al, dx 564 ; ;mov ah, 0 565 ; sub ah, ah 566 ; int 34h 567 ; 568 ; sub dx, 02h 569 ; SbOut 14h 570 ; SbOut 0FFh 571 ; SbOut 0FFh 572 ; 573 ; sys _rele ; return from callback service 574 575 ;-------------------------------------------------------------------------- 576 ; SbPoll: Sound Blaster Polling. 577 ;-------------------------------------------------------------------------- 578 579 SbPoll: 580 0000039F 60 pushad 581 582 ; 11/03/2017 583 000003A0 803D[910F0000]00 cmp byte [iStatus], 0 584 000003A7 7721 ja short Bye 585 586 000003A9 C605[910F0000]01 mov byte [iStatus], 1 ; 1 = set before interrupt 587 ; (for preventing data load 588 ; without an interrupt) 589 590 ;test byte [flags], ENDOFFILE 591 ;jnz short sbPoll_stop 592 593 000003B0 BF[00000100] mov edi, DmaBuffer 594 000003B5 BB00800000 mov ebx, DmaBufSize/2 595 596 000003BA F605[900F0000]01 test byte [DmaFlag], 1 597 000003C1 7402 jz short FirstHalf 598 SecondHalf: 599 000003C3 01DF add edi, ebx 600 FirstHalf: 601 000003C5 E815080000 call GetSamples 602 Bye: 603 000003CA 61 popad 604 000003CB C3 retn 605 606 ;;sbPoll_stop: ; 11/03/2017 607 ;; ; exit auto-initialize 8 bit transfer 608 ;; SbOut 0DAh ; exit auto-initialize transfer command 609 ;; ;mov byte [tLoop}, 0 610 ;; jmp short Bye 611 612 ; ; 07/10/2017 (TMODPLAY.ASM) 613 ; 614 ; pushad 615 ; 616 ; mov dx, 03h 617 ; ;in al, dx 618 ; ;mov ah, 0 619 ; sub ah, ah 620 ; int 34h 621 ; mov cl, al 622 ; ;in al, dx 623 ; int 34h 624 ; mov ch, al 625 ; 626 ; mov ebx, DmaBufSize/2 627 ; 628 ; mov al, [DmaFlag] 629 ; test al, al 630 ; jz short FirstHalf 631 ;SecondHalf: 632 ; cmp cx, bx ; DmaBufSize/2 633 ; jb short Bye 634 ; mov edi, DmaBuffer + (DmaBufSize/2) 635 ; ;mov edi, DmaBuffer 636 ; ;add edi, ebx 637 ; call GetSamples 638 ; dec byte [DmaFlag] 639 ; jmp short Bye 640 ;FirstHalf: 641 ; cmp cx, bx ; DmaBufSize/2 642 ; jae short Bye 643 ; mov edi, DmaBuffer 644 ; call GetSamples 645 ; inc byte [DmaFlag] 646 ;Bye: 647 ; popad 648 ; retn 649 650 ;-------------------------------------------------------------------------- 651 ; SbInit: Initializes the Sound Blaster Driver. 652 ;-------------------------------------------------------------------------- 653 654 SbInit: 655 000003CC 60 pushad 656 657 000003CD E88C080000 call StartPlaying 658 SetBuffer: 659 ;mov byte [DmaFlag], 0 660 000003D2 8B1D[30860000] mov ebx, [DMA_phy_buff] ; physical addr of DMA buff 661 000003D8 B900000100 mov ecx, DmaBufSize 662 000003DD 49 dec ecx 663 664 ; 8 bit DMA buffer setting (DMA channel 1) 665 000003DE B005 mov al, 05h ; set mask bit for channel 1 (4+1) 666 ;out 0Ah, al 667 000003E0 66BA0A00 mov dx, 0Ah ; DMA mask register 668 000003E4 B401 mov ah, 1 ;outb 669 000003E6 CD34 int 34h 670 671 000003E8 30C0 xor al, al ; stops all DMA processes on selected channel 672 ;out 0Ch, al 673 000003EA B20C mov dl, 0Ch ; clear selected channel register 674 ;mov ah, 1 ;outb 675 000003EC CD34 int 34h 676 677 000003EE 88D8 mov al, bl ; byte 0 of DMA buffer address (physical) 678 ;out 02h, al 679 000003F0 B202 mov dl, 02h ; DMA channel 1 port number 680 ;mov ah, 1 ;outb 681 000003F2 CD34 int 34h 682 683 000003F4 88F8 mov al, bh ; byte 1 of DMA buffer address (physical) 684 ;out 02h, al 685 ;mov dl, 02h ; DMA channel 1 port number 686 ;mov ah, 1 ;outb 687 000003F6 CD34 int 34h 688 689 000003F8 C1EB10 shr ebx, 16 690 691 000003FB 88D8 mov al, bl ; byte 2 of DMA buffer address (physical) 692 ;out 83h, al 693 000003FD B283 mov dl, 83h ; page register port addr for channel 1 694 ;mov ah, 1 ;outb 695 000003FF CD34 int 34h 696 697 00000401 88C8 mov al, cl ; low byte of DMA count - 1 698 ;out 03h, al 699 00000403 B203 mov dl, 03h ; count register port addr for channel 1 700 ;mov ah, 1 ;outb 701 00000405 CD34 int 34h 702 703 00000407 88E8 mov al, ch ; high byte of DMA count - 1 704 ;out 03h, al 705 ;mov dl, 03h ; count register port addr for channel 1 706 ;mov ah, 1 ;outb 707 00000409 CD34 int 34h 708 709 ; channel 1, read, autoinitialized, single mode 710 0000040B B059 mov al, 59h ; 06/10/2017 711 ;mov al, 49h ; 02/10/2017 712 ;out 0Bh, al 713 0000040D B20B mov dl, 0Bh ; DMA mode register port address 714 ;mov ah, 1 ;outb 715 0000040F CD34 int 34h 716 717 00000411 B001 mov al, 01h ; clear mask bit for channel 1 718 ;out 0Ah, al 719 00000413 B20A mov dl, 0Ah ; DMA mask register port address 720 ;mov ah, 1 ;outb 721 00000415 CD34 int 34h 722 ClearBuffer: 723 00000417 BF[00000100] mov edi, DmaBuffer ; virtual addr of DMA buff 724 ;mov ecx, DmaBufSize 725 0000041C 41 inc ecx 726 0000041D B080 mov al, 80h 727 ;cld 728 0000041F F3AA rep stosb 729 SetIrq: 730 ; CALLBACK method 731 00000421 8A1D[100D0000] mov bl, [SbIrq] ; IRQ number 732 00000427 B702 mov bh, 2 ; Link IRQ to user for callback service 733 00000429 BA[73030000] mov edx, SbIrqHandler 734 sys _calbac 734 <1> 734 <1> 734 <1> 734 <1> 734 <1> %if %0 >= 2 734 <1> mov ebx, %2 734 <1> %if %0 >= 3 734 <1> mov ecx, %3 734 <1> %if %0 = 4 734 <1> mov edx, %4 734 <1> %endif 734 <1> %endif 734 <1> %endif 734 0000042E B82C000000 <1> mov eax, %1 734 <1> 734 00000433 CD40 <1> int 40h 735 ; SIGNAL RESPONSE BYTE method ; 04/03/2017 736 ;mov bl, [SbIrq] 737 ;mov bh, 1 ; Signal Response Byte method 738 ;movzx ecx, bl ; S.R.B. value = IRQ Number 739 ;mov edx, SbSrb ; S.R.B. address 740 ;sys _calbac 741 ResetDsp: 742 00000435 668B15[0E0D0000] mov dx, [SbAddr] 743 0000043C 6683C206 add dx, 06h 744 00000440 B001 mov al, 1 745 ;out dx, al 746 00000442 B401 mov ah, 1 ;outb 747 00000444 CD34 int 34h 748 749 ;in al, dx 750 ;in al, dx 751 ;in al, dx 752 ;in al, dx 753 754 00000446 FECC dec ah ; ah = 0 ; inb 755 00000448 CD34 int 34h 756 ;mov ah, 0 757 0000044A CD34 int 34h 758 759 0000044C 30C0 xor al, al 760 ;out dx, al 761 0000044E FEC4 inc ah ; ah = 1 ;outb 762 00000450 CD34 int 34h 763 764 00000452 66B96400 mov cx, 100 765 00000456 28E4 sub ah, ah ; 0 766 WaitId: 767 00000458 668B15[0E0D0000] mov dx, [SbAddr] 768 0000045F 6683C20E add dx, 0Eh 769 ;in al, dx 770 ;mov ah, 0 ;inb 771 00000463 CD34 int 34h 772 00000465 08C0 or al, al 773 00000467 7807 js short sb_GetId 774 00000469 E2ED loop WaitId 775 0000046B E9B2000000 jmp sb_Exit 776 sb_GetId: 777 00000470 668B15[0E0D0000] mov dx, [SbAddr] 778 00000477 6683C20A add dx, 0Ah 779 ;in al, dx 780 ;mov ah, 0 ;inb 781 0000047B CD34 int 34h 782 0000047D 3CAA cmp al, 0AAh 783 0000047F 7407 je short SbOk 784 00000481 E2D5 loop WaitId 785 00000483 E99A000000 jmp sb_Exit 786 SbOk: 787 00000488 668B15[0E0D0000] mov dx, [SbAddr] 788 0000048F 6683C20C add dx, 0Ch 789 SbOut 0D1h 789 <1> %%Wait: 789 <1> 789 00000493 B400 <1> mov ah, 0 789 00000495 CD34 <1> int 34h 789 00000497 08C0 <1> or al, al 789 00000499 78F8 <1> js short %%Wait 789 0000049B B0D1 <1> mov al, %1 789 <1> 789 0000049D B401 <1> mov ah, 1 789 0000049F CD34 <1> int 34h 790 791 ; 11/03/2017 792 SbOut 41h ; 8 bit or 16 bit transfer 792 <1> %%Wait: 792 <1> 792 000004A1 B400 <1> mov ah, 0 792 000004A3 CD34 <1> int 34h 792 000004A5 08C0 <1> or al, al 792 000004A7 78F8 <1> js short %%Wait 792 000004A9 B041 <1> mov al, %1 792 <1> 792 000004AB B401 <1> mov ah, 1 792 000004AD CD34 <1> int 34h 793 000004AF 668B1D[920F0000] mov bx, [sampling_rate] 794 SbOut bh ; sampling rate high byte 794 <1> %%Wait: 794 <1> 794 000004B6 B400 <1> mov ah, 0 794 000004B8 CD34 <1> int 34h 794 000004BA 08C0 <1> or al, al 794 000004BC 78F8 <1> js short %%Wait 794 000004BE 88F8 <1> mov al, %1 794 <1> 794 000004C0 B401 <1> mov ah, 1 794 000004C2 CD34 <1> int 34h 795 SbOut bl ; sampling rate low byte 795 <1> %%Wait: 795 <1> 795 000004C4 B400 <1> mov ah, 0 795 000004C6 CD34 <1> int 34h 795 000004C8 08C0 <1> or al, al 795 000004CA 78F8 <1> js short %%Wait 795 000004CC 88D8 <1> mov al, %1 795 <1> 795 000004CE B401 <1> mov ah, 1 795 000004D0 CD34 <1> int 34h 796 797 ; 22/04/2017 798 ;mov ah, 1 799 ;mov dx, [SbAddr] 800 ;add dx, 4 ; Mixer chip address port 801 000004D2 6683EA08 sub dx, 0Ch-04h 802 000004D6 B022 mov al, 22h ; master volume 803 000004D8 CD34 int 34h 804 000004DA 6642 inc dx 805 000004DC B0FF mov al, 0FFh ; maximum volume level 806 000004DE CD34 int 34h 807 000004E0 6683C207 add dx, 0Ch-05h 808 StartDma: 809 ;; autoinitialized 8 bit DMA transfer mode 810 ;mov bx, 0C6h ; 8 bit output (0C6h) 811 ; PCM output (8 bit mono autoinitialized transfer) 812 ;SbOut bl ; bCommand 813 ;SbOut bh ; bMode 814 SbOut 0C6h ; bCommand (C6h = 8 bit autoinitialized) 814 <1> %%Wait: 814 <1> 814 000004E4 B400 <1> mov ah, 0 814 000004E6 CD34 <1> int 34h 814 000004E8 08C0 <1> or al, al 814 000004EA 78F8 <1> js short %%Wait 814 000004EC B0C6 <1> mov al, %1 814 <1> 814 000004EE B401 <1> mov ah, 1 814 000004F0 CD34 <1> int 34h 815 SbOut 0 ; bMode (0 = 8 bit mono) 815 <1> %%Wait: 815 <1> 815 000004F2 B400 <1> mov ah, 0 815 000004F4 CD34 <1> int 34h 815 000004F6 08C0 <1> or al, al 815 000004F8 78F8 <1> js short %%Wait 815 000004FA B000 <1> mov al, %1 815 <1> 815 000004FC B401 <1> mov ah, 1 815 000004FE CD34 <1> int 34h 816 00000500 66BB0080 mov bx, DmaBufSize / 2 817 00000504 664B dec bx ; wBlkSize is one less than the actual size 818 SbOut bl 818 <1> %%Wait: 818 <1> 818 00000506 B400 <1> mov ah, 0 818 00000508 CD34 <1> int 34h 818 0000050A 08C0 <1> or al, al 818 0000050C 78F8 <1> js short %%Wait 818 0000050E 88D8 <1> mov al, %1 818 <1> 818 00000510 B401 <1> mov ah, 1 818 00000512 CD34 <1> int 34h 819 SbOut bh 819 <1> %%Wait: 819 <1> 819 00000514 B400 <1> mov ah, 0 819 00000516 CD34 <1> int 34h 819 00000518 08C0 <1> or al, al 819 0000051A 78F8 <1> js short %%Wait 819 0000051C 88F8 <1> mov al, %1 819 <1> 819 0000051E B401 <1> mov ah, 1 819 00000520 CD34 <1> int 34h 820 sb_Exit: 821 00000522 61 popad 822 00000523 C3 retn 823 824 ;-------------------------------------------------------------------------- 825 ; SbDone: Shut Down the Sound Blaster Driver. 826 ;-------------------------------------------------------------------------- 827 828 SbDone: 829 00000524 60 pushad 830 831 00000525 8A1D[100D0000] mov bl, [SbIrq] ; IRQ number 832 0000052B 28FF sub bh, bh ; 0 = Unlink IRQ from user 833 sys _calbac 833 <1> 833 <1> 833 <1> 833 <1> 833 <1> %if %0 >= 2 833 <1> mov ebx, %2 833 <1> %if %0 >= 3 833 <1> mov ecx, %3 833 <1> %if %0 = 4 833 <1> mov edx, %4 833 <1> %endif 833 <1> %endif 833 <1> %endif 833 0000052D B82C000000 <1> mov eax, %1 833 <1> 833 00000532 CD40 <1> int 40h 834 835 00000534 668B15[0E0D0000] mov dx, [SbAddr] 836 0000053B 6683C20C add dx, 0Ch 837 SbOut 0D0h 837 <1> %%Wait: 837 <1> 837 0000053F B400 <1> mov ah, 0 837 00000541 CD34 <1> int 34h 837 00000543 08C0 <1> or al, al 837 00000545 78F8 <1> js short %%Wait 837 00000547 B0D0 <1> mov al, %1 837 <1> 837 00000549 B401 <1> mov ah, 1 837 0000054B CD34 <1> int 34h 838 SbOut 0D3h 838 <1> %%Wait: 838 <1> 838 0000054D B400 <1> mov ah, 0 838 0000054F CD34 <1> int 34h 838 00000551 08C0 <1> or al, al 838 00000553 78F8 <1> js short %%Wait 838 00000555 B0D3 <1> mov al, %1 838 <1> 838 00000557 B401 <1> mov ah, 1 838 00000559 CD34 <1> int 34h 839 840 0000055B E8AD070000 call StopPlaying 841 842 00000560 61 popad 843 00000561 C3 retn 844 845 ;============================================================================= 846 ; MODLOAD.ASM 847 ;============================================================================= 848 849 ; Amiga Module Loader v0.1b by Carlos Hasan. 850 ; July 10th, 1993. 851 852 ; STRUCTURES 853 854 struc ModSample 855 00000000 .msName: resb 22 856 00000016 .msLength: resw 1 857 00000018 .msFinetune: resb 1 858 00000019 .msVolume: resb 1 859 0000001A .msRepeat: resw 1 860 0000001C .msRepLen: resw 1 861 .size: ; 30 bytes 862 endstruc 863 864 struc ModHeader 865 00000000 .mhName: resb 20 866 00000014 .mhSamples: resb ModSample.size*31 867 000003B6 .mhOrderLen: resb 1 868 000003B7 .mhReStart: resb 1 869 000003B8 .mhOrder: resb 128 870 00000438 .mhSign: resw 2 871 .size: ; 1084 bytes 872 endstruc 873 874 struc ModInfoRec 875 00000000 .OrderLen: resb 1 876 00000001 .ReStart: resb 1 877 00000002 .Order: resb 128 878 00000082 .Patterns: resd 1 879 00000086 .SampOfs: resw 31 880 000000C4 .SampSeg: resw 31 881 00000102 .SampLen: resw 31 882 00000140 .SampRep: resw 31 883 0000017E .SampRepLen: resw 31 884 000001BC .SampVol: resw 31 885 .size: ; 506 bytes 886 endstruc 887 888 ; 06/10/2017 889 ; 04/10/2017 890 ; /* MOD FileFormat */ 891 892 ID_MK equ 2E4B2E4Dh ; "M.K." 893 ID_FLT4 equ 34544C46h ; "FLT4" 894 ID_8CHN equ 4E484338h ; "8CHN" 895 ID_FLT8 equ 34544C46h ; "FLT8" 896 897 ; CODE 898 899 LoadModule: 900 ; edi = file name address 901 902 00000562 60 pushad 903 904 00000563 E878010000 call ClearModInfo 905 OpenFile: 906 ; ebx = ASCIIZ file name address 907 ; ecx = open mode (0 = open for read) 908 sys _open, edi, 0 ; open for reading 908 <1> 908 <1> 908 <1> 908 <1> 908 <1> %if %0 >= 2 908 00000568 89FB <1> mov ebx, %2 908 <1> %if %0 >= 3 908 0000056A B900000000 <1> mov ecx, %3 908 <1> %if %0 = 4 908 <1> mov edx, %4 908 <1> %endif 908 <1> %endif 908 <1> %endif 908 0000056F B805000000 <1> mov eax, %1 908 <1> 908 00000574 CD40 <1> int 40h 909 00000576 0F8262010000 jc Failed 910 0000057C A3[940F0000] mov [FileHandle], eax 911 ReadHeader: 912 ; ebx = File handle 913 ; ecx = Buffer address 914 ; edx = Byte count 915 sys _read, [FileHandle], Header, ModHeader.size 915 <1> 915 <1> 915 <1> 915 <1> 915 <1> %if %0 >= 2 915 00000581 8B1D[940F0000] <1> mov ebx, %2 915 <1> %if %0 >= 3 915 00000587 B9[980F0000] <1> mov ecx, %3 915 <1> %if %0 = 4 915 0000058C BA3C040000 <1> mov edx, %4 915 <1> %endif 915 <1> %endif 915 <1> %endif 915 00000591 B803000000 <1> mov eax, %1 915 <1> 915 00000596 CD40 <1> int 40h 916 00000598 0F8231010000 jc CloseFile 917 CheckMK: 918 ; 04/10/2017 919 0000059E A1[D0130000] mov eax, [Header+ModHeader.mhSign] 920 921 000005A3 3D4D2E4B2E cmp eax, ID_MK ; cmp eax, '.K.M' 922 ;je short Is4chnMod 923 000005A8 742B je short IsModFile 924 CheckFLT4: 925 000005AA 3D464C5434 cmp eax, ID_FLT4 ; cmp eax, '4TLF' 926 ;je short Is4chnMod 927 000005AF 7424 je short IsModFile 928 Check8CHN: 929 000005B1 3D3843484E cmp eax, ID_8CHN ; cmp eax, 'NHC8' 930 000005B6 740D je short Is8chnMod 931 CheckFLT8: 932 000005B8 3D464C5434 cmp eax, ID_FLT8 ; cmp eax, '8TLF' 933 ; 06/10/2017 934 000005BD 7406 je short Is8chnMod 935 000005BF F9 stc 936 000005C0 E90A010000 jmp CloseFile 937 Is8chnMod: 938 000005C5 C605[8D0F0000]08 mov byte [numtracks], 8 ; 8-CHANNEL-MOD 939 000005CC C605[8C0F0000]0B mov byte [pattern_shift], 11 ; Pattern Size = 2048 bytes 940 000005D3 EB00 jmp short IsModFile 941 ;Is4chnMod: 942 ; mov byte [numtracks], 4 ; 4-CHANNEL-MOD 943 ; mov byte [pattern_shift], 11 ; Pattern Size = 1024 bytes 944 945 IsModFile: 946 000005D5 A0[4E130000] mov al, [Header+ModHeader.mhOrderLen] 947 000005DA A2[D4130000] mov [ModInfo.OrderLen], al 948 949 000005DF A0[4F130000] mov al, [Header+ModHeader.mhReStart] 950 000005E4 3A05[4E130000] cmp al, [Header+ModHeader.mhOrderLen] 951 000005EA 7202 jb short SetReStart 952 000005EC B07F mov al, 7Fh 953 SetReStart: 954 000005EE A2[D5130000] mov [ModInfo.ReStart], al 955 956 ;mov ecx, 128 957 000005F3 66B98000 mov cx, 128 958 000005F7 31D2 xor edx, edx 959 000005F9 31DB xor ebx, ebx 960 CopyOrder: 961 000005FB 8AB3[50130000] mov dh, [Header+ModHeader.mhOrder+ebx] 962 00000601 88B3[D6130000] mov [ModInfo.Order+ebx], dh 963 00000607 38D6 cmp dh, dl 964 00000609 7202 jb short NextOrder 965 0000060B 88F2 mov dl, dh ; Max. pattern number ; 04/10/2017 966 NextOrder: 967 0000060D 43 inc ebx 968 0000060E E2EB loop CopyOrder 969 AllocPatterns: 970 00000610 81E2FF000000 and edx, 0FFh 971 ; 04/10/2017 972 ;inx dx ; 12/03/2017 973 00000616 FEC2 inc dl 974 ; dl = number of patterns (04/07/2017) 975 00000618 8A0D[8C0F0000] mov cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels 976 0000061E D3E2 shl edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4) 977 ; *2048 ; (byte count of patterns *64*8*4) 978 ; 979 00000620 89D5 mov ebp, edx ; offset of samples (04/07/2017) 980 ;mov ecx, 10000h ; next 64K (4096*16) 981 00000622 B9[00000200] mov ecx, file_buffer ; 12/03/2017 982 ; 983 00000627 890D[56140000] mov [ModInfo.Patterns], ecx 984 ; 985 0000062D 01CD add ebp, ecx ; next offset for samples 986 ReadPatterns: 987 ;mov ebx, [FileHandle] 988 ; ebx = File handle 989 ; ecx = Buffer address 990 ; edx = Byte count 991 sys _read, [FileHandle] 991 <1> 991 <1> 991 <1> 991 <1> 991 <1> %if %0 >= 2 991 0000062F 8B1D[940F0000] <1> mov ebx, %2 991 <1> %if %0 >= 3 991 <1> mov ecx, %3 991 <1> %if %0 = 4 991 <1> mov edx, %4 991 <1> %endif 991 <1> %endif 991 <1> %endif 991 00000635 B803000000 <1> mov eax, %1 991 <1> 991 0000063A CD40 <1> int 40h 992 0000063C 0F828D000000 jc CloseFile 993 994 ; patterns have been loaded here... (04/07/2017) 995 996 00000642 BE[AC0F0000] mov esi, Header+ModHeader.mhSamples 997 00000647 31FF xor edi, edi 998 CopySamples: 999 00000649 668B4616 mov ax, [esi+ModSample.msLength] 1000 0000064D 86C4 xchg al, ah 1001 0000064F 66D1E0 shl ax, 1 1002 00000652 668987[D6140000] mov [ModInfo.SampLen+edi], ax 1003 00000659 8A4619 mov al, [esi+ModSample.msVolume] 1004 0000065C 30E4 xor ah, ah 1005 0000065E 668987[90150000] mov [ModInfo.SampVol+edi], ax 1006 00000665 668B461A mov ax, [esi+ModSample.msRepeat] 1007 00000669 86C4 xchg al, ah 1008 0000066B 66D1E0 shl ax, 1 1009 0000066E 668987[14150000] mov [ModInfo.SampRep+edi], ax 1010 00000675 668B461C mov ax, [esi+ModSample.msRepLen] 1011 00000679 86C4 xchg al, ah 1012 0000067B 66D1E0 shl ax, 1 1013 0000067E 668987[52150000] mov [ModInfo.SampRepLen+edi], ax 1014 00000685 83C61E add esi, ModSample.size 1015 00000688 6683C702 add di, 2 1016 0000068C 6683FF3E cmp di, 2*31 1017 00000690 72B7 jb short CopySamples 1018 1019 00000692 31F6 xor esi, esi 1020 AllocSamples: 1021 00000694 0FB796[D6140000] movzx edx, word [ModInfo.SampLen+esi] 1022 ; 07/10/2017 1023 ;shr dx, 4 ; *** 1024 0000069B 21D2 and edx, edx 1025 0000069D 7426 jz short NextSample 1026 ;inc dx ; number of paragraphs ; *** 1027 ;shl dx, 4 ; *** 1028 0000069F 89E8 mov eax, ebp 1029 000006A1 668986[5A140000] mov [ModInfo.SampOfs+esi], ax 1030 000006A8 C1E810 shr eax, 16 1031 000006AB 668986[98140000] mov [ModInfo.SampSeg+esi], ax 1032 000006B2 89E9 mov ecx, ebp 1033 000006B4 01D5 add ebp, edx ; next offset for sample 1034 ReadSample: 1035 ;mov ebx, [FileHandle] 1036 ;movzx edx, [ModInfo.SampLen+esi] 1037 ;mov ecx, [ModInfo.SampOfs+esi] 1038 1039 ; ebx = File handle 1040 ; ecx = Buffer address 1041 ; edx = Byte count 1042 sys _read, [FileHandle] 1042 <1> 1042 <1> 1042 <1> 1042 <1> 1042 <1> %if %0 >= 2 1042 000006B6 8B1D[940F0000] <1> mov ebx, %2 1042 <1> %if %0 >= 3 1042 <1> mov ecx, %3 1042 <1> %if %0 = 4 1042 <1> mov edx, %4 1042 <1> %endif 1042 <1> %endif 1042 <1> %endif 1042 000006BC B803000000 <1> mov eax, %1 1042 <1> 1042 000006C1 CD40 <1> int 40h 1043 000006C3 720A jc short CloseFile 1044 1045 NextSample: 1046 000006C5 6683C602 add si, 2 1047 000006C9 6683FE3E cmp si, 2*31 1048 000006CD 72C5 jb short AllocSamples 1049 CloseFile: 1050 000006CF 9C pushf 1051 sys _close, [FileHandle] 1051 <1> 1051 <1> 1051 <1> 1051 <1> 1051 <1> %if %0 >= 2 1051 000006D0 8B1D[940F0000] <1> mov ebx, %2 1051 <1> %if %0 >= 3 1051 <1> mov ecx, %3 1051 <1> %if %0 = 4 1051 <1> mov edx, %4 1051 <1> %endif 1051 <1> %endif 1051 <1> %endif 1051 000006D6 B806000000 <1> mov eax, %1 1051 <1> 1051 000006DB CD40 <1> int 40h 1052 000006DD 9D popf 1053 Failed: 1054 000006DE 61 popad 1055 000006DF C3 retn 1056 1057 FreeModule: 1058 ; Erdogan Tan (13/02/2017) 1059 ; nothing to do here for memory de-allocation 1060 ClearModInfo: 1061 000006E0 57 push edi 1062 000006E1 BF[D4130000] mov edi, ModInfo 1063 000006E6 B9FA010000 mov ecx, ModInfoRec.size 1064 ;cld 1065 000006EB 30C0 xor al, al 1066 000006ED F3AA rep stosb 1067 000006EF 5F pop edi 1068 000006F0 C3 retn 1069 1070 ;============================================================================= 1071 ; MODPLAY.ASM 1072 ;============================================================================= 1073 1074 ; Amiga Module Loader v0.3b by Carlos Hasan. 1075 ; July 23th, 1993. 1076 1077 ; EQUATES 1078 1079 ;NumTracks equ 4 ; 06/10/2017 ([numtracks]) 1080 DefTempo equ 6 1081 DefBpm equ 125 1082 MidCRate equ 8448 1083 MixBufSize equ 4096 1084 1085 ; STRUCTURES 1086 1087 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 1088 00000000 .Samples: resd 1 1089 ;.Position: resw 1 1090 00000004 .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 1091 00000008 .Len: resw 1 1092 0000000A .Repeat: resw 1 1093 0000000C .RepLen: resw 1 1094 0000000E .Volume: resb 1 ; Volume 1095 0000000F .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 1096 ;.Error: resb 1 1097 ;.Reserved: resb 1 ; 01/10/2017 1098 00000010 .Period: resw 1 ; Period 1099 00000012 .Pitch: resw 1 1100 00000014 .Effect: resw 1 ; Effect 1101 00000016 .PortTo: resw 1 ; Toneporta wanted period 1102 00000018 .PortParm: resb 1 ; Toneporta speed 1103 00000019 .VibPos: resb 1 ; Vibrato wave position 1104 0000001A .VibParm: resb 1 ; Vibrato depth/rate 1105 0000001B .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 1106 0000001C .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 1107 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 1108 0000001D .Error: resb 1 ; 01/10/2017 1109 0000001E .Arp: resw 3 1110 00000024 .ArpIndex: resw 1 1111 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 1112 endstruc 1113 1114 ; CODE 1115 1116 ;-------------------------------------------------------------------------- 1117 ; updatechannel - update the track using the current effect 1118 ;-------------------------------------------------------------------------- 1119 ; 1120 ;-------------------------------------------------------------------------- 1121 ; BeatTrack: Process the next beat in one track. 1122 ; In: 1123 ; ds:di - Track info Address. 1124 ;-------------------------------------------------------------------------- 1125 1126 ; edi = Track info address 1127 1128 updatechannel: 1129 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 1130 1131 000006F1 668B5714 mov dx, [edi+TrackInfo.Effect] 1132 1133 ;test dx, dx 1134 ;je short None 1135 ;cmp dh, 00h 1136 ;je short Arpeggio 1137 ;cmp dh, 01h 1138 ;je short PortUp 1139 ;cmp dh, 02h 1140 ;je short PortDown 1141 ;cmp dh, 03h 1142 ;je TonePort 1143 ;cmp dh, 04h 1144 ;je Vibrato 1145 ;cmp dh, 05h 1146 ;je PortSlide 1147 ;cmp dh, 06h 1148 ;je VibSlide 1149 ;cmp dh, 0Ah 1150 ;je VolSlide 1151 ;retn 1152 1153 000006F5 0FB6C6 movzx eax, dh 1154 000006F8 240F and al, 0Fh 1155 000006FA FF2485[540D0000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 1156 efxnull: 1157 None: 1158 00000701 C3 retn 1159 efxarpeggio2: 1160 ; 01/10/2017 1161 00000702 84D2 test dl, dl 1162 00000704 74FB jz short efxnull 1163 Arpeggio: 1164 00000706 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 1165 0000070A 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 1166 0000070F 66894712 mov [edi+TrackInfo.Pitch], ax 1167 00000713 6683C302 add bx, 2 1168 00000717 6683FB06 cmp bx, 6 1169 0000071B 7202 jb short SetArpIndex 1170 0000071D 31DB xor ebx, ebx 1171 SetArpIndex: 1172 0000071F 66895F24 mov [edi+TrackInfo.ArpIndex], bx 1173 00000723 C3 retn 1174 efxportaup: 1175 PortUp: 1176 00000724 30F6 xor dh, dh 1177 ;mov bx, [edi+TrackInfo.Period] 1178 00000726 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 1179 0000072A 6629D3 sub bx, dx 1180 ;cmp bx, 113 1181 0000072D 6683FB1C cmp bx, 28 ; 01/10/2017 1182 00000731 7D04 jge short NotSmall 1183 ;mov bx, 113 1184 00000733 66BB1C00 mov bx, 28 ; 01/10/2017 1185 NotSmall: 1186 00000737 66895F10 mov [edi+TrackInfo.Period], bx 1187 0000073B 6601DB add bx, bx 1188 ;mov ax, [PitchTable+bx] 1189 0000073E 668B83[CE150000] mov ax, [PitchTable+ebx] ; 02/10/2017 1190 00000745 66894712 mov [edi+TrackInfo.Pitch], ax 1191 00000749 C3 retn 1192 efxportadown: 1193 PortDown: 1194 0000074A 30F6 xor dh, dh 1195 ;mov bx, [edi+TrackInfo.Period] 1196 0000074C 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 1197 00000750 6601D3 add bx, dx 1198 00000753 6681FB600D cmp bx, 3424 ; 01/10/2017 1199 ;cmp bx, 856 1200 00000758 7E04 jle short NotBig 1201 ;mov bx, 856 1202 0000075A 66BB600D mov bx, 3424 ; 01/10/2017 1203 NotBig: 1204 0000075E 66895F10 mov [edi+TrackInfo.Period], bx 1205 00000762 6601DB add bx, bx 1206 ;mov ax, [PitchTable+bx] 1207 00000765 668B83[CE150000] mov ax, [PitchTable+ebx] ; 02/10/2017 1208 0000076C 66894712 mov [edi+TrackInfo.Pitch], ax 1209 00000770 C3 retn 1210 efxtoneporta2: 1211 TonePort: 1212 00000771 30F6 xor dh, dh 1213 00000773 668B4716 mov ax, [edi+TrackInfo.PortTo] 1214 ;mov bx, [edi+TrackInfo.Period] 1215 00000777 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 1216 0000077B 6639C3 cmp bx, ax 1217 0000077E 7429 je short NoPort 1218 00000780 7F0D jg short PortToUp 1219 PortToDown: 1220 00000782 6601D3 add bx, dx 1221 00000785 6639C3 cmp bx, ax 1222 00000788 7E0D jle short SetPort 1223 FixPort: 1224 0000078A 6689C3 mov bx, ax 1225 0000078D EB08 jmp short SetPort 1226 PortToUp: 1227 0000078F 6629D3 sub bx, dx 1228 00000792 6639C3 cmp bx, ax 1229 00000795 7CF3 jl short FixPort 1230 SetPort: 1231 00000797 66895F10 mov [edi+TrackInfo.Period], bx 1232 0000079B 6601DB add bx, bx 1233 ;mov ax, [PitchTable+bx] 1234 0000079E 668B83[CE150000] mov ax, [PitchTable+ebx] ; 02/10/2017 1235 000007A5 66894712 mov [edi+TrackInfo.Pitch], ax 1236 NoPort: 1237 000007A9 C3 retn 1238 efxvibrato2: 1239 ; 01/10/2017 1240 Vibrato: 1241 000007AA 88D6 mov dh, dl 1242 ;and dl, 0Fh 1243 ;shr dh, 4 1244 ;shl dh, 2 1245 000007AC 6681E20FF0 and dx, 0F00Fh 1246 000007B1 C0EE02 shr dh, 2 1247 ;add [edi+TrackInfo.VibPos], dh 1248 ;mov dh, [edi+TrackInfo.VibPos] 1249 ;mov bl, dh 1250 000007B4 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 1251 000007B7 007719 add [edi+TrackInfo.VibPos], dh 1252 000007BA 88DE mov dh, bl ; 01/10/2017 1253 000007BC C0EB02 shr bl, 2 1254 ;and bx, 1Fh 1255 ;mov al, [SinTable+bx] 1256 000007BF 83E31F and ebx, 1Fh 1257 000007C2 8A83[3C0E0000] mov al, [SinTable+ebx] 1258 000007C8 F6E2 mul dl 1259 ;rol ax, 1 1260 ;xchg al, ah 1261 ;and ah, 1 1262 000007CA 66C1E807 shr ax, 7 1263 000007CE 84F6 test dh, dh 1264 000007D0 7903 jns short VibUp 1265 000007D2 66F7D8 neg ax 1266 VibUp: 1267 000007D5 66034710 add ax, [edi+TrackInfo.Period] 1268 000007D9 6689C3 mov bx, ax 1269 ;movzx ebx, ax 1270 000007DC 6683FB71 cmp bx, 113 1271 ;cmp bx, 113 1272 000007E0 6683FB1C cmp bx, 28 ; 01/10/2017 1273 000007E4 7D06 jge short NoLoVib 1274 ;mov bx, 113 1275 000007E6 66BB1C00 mov bx, 28 ; 01/10/2017 1276 000007EA EB0B jmp short NoHiVib ; 01/10/2017 1277 NoLoVib: 1278 000007EC 6681FB600D cmp bx, 3424 ; 01/10/2017 1279 ;cmp bx, 856 1280 000007F1 7E04 jle short NoHiVib 1281 ;mov bx, 856 1282 000007F3 66BB600D mov bx, 3424 ; 01/10/2017 1283 NoHiVib: 1284 000007F7 6601DB add bx, bx 1285 ;mov ax, [PitchTable+bx] 1286 000007FA 668B83[CE150000] mov ax, [PitchTable+ebx] ; 01/10/2017 1287 00000801 66894712 mov [edi+TrackInfo.Pitch], ax 1288 00000805 C3 retn 1289 efxtoneslide: 1290 PortSlide: 1291 00000806 E812000000 call VolSlide 1292 0000080B 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1293 0000080E E95EFFFFFF jmp TonePort ; efxtoneporta2 1294 efxvibslide: 1295 VibSlide: 1296 00000813 E805000000 call VolSlide 1297 00000818 8A571A mov dl, [edi+TrackInfo.VibParm] 1298 0000081B EB8D jmp short Vibrato ; efxvibrato2 1299 efxvolslide: 1300 VolSlide: 1301 0000081D 88D6 mov dh, dl 1302 0000081F 80E20F and dl, 0Fh 1303 00000822 C0EE04 shr dh, 4 1304 00000825 8A470E mov al, [edi+TrackInfo.Volume] 1305 00000828 28D0 sub al, dl 1306 0000082A 7D02 jge short NoLoVol 1307 0000082C 30C0 xor al, al 1308 NoLoVol: 1309 0000082E 00F0 add al, dh 1310 00000830 3C40 cmp al, 64 1311 00000832 7602 jbe short NoHiVol 1312 00000834 B040 mov al, 64 1313 NoHiVol: 1314 00000836 88470E mov [edi+TrackInfo.Volume], al 1315 00000839 C3 retn 1316 1317 efxtremolo2: 1318 ; 01/10/2017 (TMODPLAY.ASM) 1319 Tremolo: 1320 0000083A 88D6 mov dh, dl 1321 0000083C 6681E20FF0 and dx, 0F00Fh 1322 00000841 C0EE02 shr dh, 2 1323 00000844 8A5F1B mov bl, [edi+TrackInfo.TremPos] 1324 00000847 00771B add [edi+TrackInfo.TremPos], dh 1325 0000084A 88DE mov dh, bl 1326 0000084C C0EB02 shr bl, 2 1327 ; 01/10/2017 - TRDOS 386 1328 ;and bx, 1Fh 1329 0000084F 83E31F and ebx, 1Fh 1330 ;mov al, [SinTable+bx] 1331 00000852 8A83[3C0E0000] mov al, [SinTable+ebx] 1332 00000858 F6E2 mul dl 1333 0000085A 66C1E806 shr ax, 6 1334 0000085E 84F6 test dh, dh 1335 00000860 7D03 jge short Tremolo_1 ; efxtremolof2 1336 00000862 66F7D8 neg ax 1337 efxtremolof2: 1338 Tremolo_1: 1339 00000865 8A670E mov ah, [edi+TrackInfo.Volume] 1340 00000868 00E0 add al, ah 1341 0000086A 7D02 jge short Tremolo_2 ; efxtremolof3 1342 0000086C 30C0 xor al, al 1343 efxtremolof3: 1344 Tremolo_2: 1345 0000086E 3C40 cmp al, 64 ; 40h 1346 00000870 7E02 jle short Tremolo_3 ; efxtremolof4 1347 00000872 B040 mov al, 64 ; 40h 1348 efxtremolof4: 1349 Tremolo_3: 1350 00000874 28E0 sub al, ah ; ****** 1351 00000876 88470F mov [edi+TrackInfo.VolDiff], al 1352 00000879 C3 retn 1353 1354 ;-------------------------------------------------------------------------- 1355 ; readchannel - read the next note event from the pattern sheet 1356 ;-------------------------------------------------------------------------- 1357 ; 1358 ;-------------------------------------------------------------------------- 1359 ; GetTrack: Get the next Note from a pattern. 1360 ; In: 1361 ; ds:di - Track info Address. 1362 ; es:si - Pattern Note Address. 1363 ; Out: 1364 ; es:si - The Next Pattern Note address. 1365 ;-------------------------------------------------------------------------- 1366 1367 ; esi = Pattern note address 1368 ; edi = Track info address 1369 1370 readchannel: 1371 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1372 0000087A 66AD lodsw 1373 0000087C 86C4 xchg al, ah 1374 0000087E 88E3 mov bl, ah 1375 00000880 80E40F and ah, 0Fh 1376 00000883 6689C1 mov cx, ax 1377 00000886 66AD lodsw 1378 00000888 86C4 xchg al, ah 1379 0000088A 88E7 mov bh, ah 1380 0000088C 80E40F and ah, 0Fh 1381 0000088F 6689C2 mov dx, ax 1382 00000892 66895714 mov [edi+TrackInfo.Effect], dx 1383 ; 01/10/2017 - TRDOS 386 1384 ;and bl, 0F0h 1385 00000896 81E3F0FF0000 and ebx, 0FFF0h 1386 0000089C C0EF04 shr bh, 4 1387 0000089F 08FB or bl, bh 1388 000008A1 7446 jz short SetPeriod 1389 SetSample: 1390 000008A3 30FF xor bh, bh 1391 ;and ebx, 0FFh 1392 000008A5 FECB dec bl 1393 000008A7 01DB add ebx, ebx 1394 000008A9 668B83[90150000] mov ax, [ModInfo.SampVol+ebx] 1395 000008B0 88470E mov [edi+TrackInfo.Volume], al 1396 000008B3 668B83[5A140000] mov ax, [ModInfo.SampOfs+ebx] 1397 000008BA 668907 mov [edi+TrackInfo.Samples], ax 1398 000008BD 668B83[98140000] mov ax, [ModInfo.SampSeg+ebx] 1399 000008C4 66894702 mov [edi+TrackInfo.Samples+2], ax 1400 000008C8 668B83[D6140000] mov ax, [ModInfo.SampLen+ebx] 1401 000008CF 66894708 mov [edi+TrackInfo.Len], ax 1402 000008D3 668B83[14150000] mov ax, [ModInfo.SampRep+ebx] 1403 000008DA 6689470A mov [edi+TrackInfo.Repeat], ax 1404 000008DE 668B83[52150000] mov ax, [ModInfo.SampRepLen+ebx] 1405 000008E5 6689470C mov [edi+TrackInfo.RepLen], ax 1406 SetPeriod: 1407 000008E9 6685C9 test cx, cx 1408 000008EC 7425 jz short SetEffect 1409 1410 000008EE 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1411 1412 000008F2 80FE03 cmp dh, 03h 1413 ;je short SetEffect 1414 000008F5 7428 je short efxtoneporta ; 01/10/2017 1415 1416 000008F7 66894F10 mov [edi+TrackInfo.Period], cx 1417 ;movzx ebx, cx 1418 000008FB 6689CB mov bx, cx 1419 000008FE 6601DB add bx, bx 1420 ;mov ax, [PitchTable+bx] 1421 00000901 668B83[CE150000] mov ax, [PitchTable+ebx] ; 01/10/2017 1422 00000908 66894712 mov [edi+TrackInfo.Pitch], ax 1423 0000090C C7470400000000 mov dword [edi+TrackInfo.Position], 0 1424 SetEffect: 1425 ;test dx, dx 1426 ;je short InitNone 1427 ;cmp dh, 00h 1428 ;je InitArpeggio 1429 ;cmp dh, 03h 1430 ;je short InitTonePort 1431 ;cmp dh, 04h 1432 ;je short InitVibrato 1433 ;cmp dh, 09h 1434 ;je short SampleOfs 1435 ;cmp dh, 0Bh 1436 ;je short PosJump 1437 ;cmp dh, 0Ch 1438 ;je short SetVolume 1439 ;cmp dh, 0Dh 1440 ;je short Break 1441 ;cmp dh, 0Fh 1442 ;je SetSpeed 1443 ;retn 1444 1445 ; 01/10/2017 (TMODPLAY.ASM) 1446 1447 ; dx = [di+TrackInfo.Effect] 1448 1449 00000913 0FB6C6 movzx eax, dh 1450 00000916 240F and al, 0Fh 1451 00000918 FF2485[140D0000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1452 ;efxnull: 1453 ;InitNone: 1454 ; retn 1455 efxtoneporta: 1456 ; 01/10/2017 1457 ; cx = period 1458 ;mov [edi+TrackInfo.PortTo], cx ; * 1459 InitTonePort: 1460 0000091F 84D2 test dl, dl 1461 00000921 7503 jnz short SetPortParm 1462 00000923 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1463 SetPortParm: 1464 00000926 885718 mov [edi+TrackInfo.PortParm], dl 1465 00000929 66895714 mov [edi+TrackInfo.Effect], dx 1466 0000092D C3 retn 1467 efxvibrato: 1468 InitVibrato: 1469 0000092E 8A471A mov al, [edi+TrackInfo.VibParm] 1470 00000931 88C4 mov ah, al 1471 ;and al, 0Fh 1472 ;and ah, 0F0h 1473 00000933 66250FF0 and ax, 0F00Fh 1474 00000937 F6C20F test dl, 0Fh 1475 0000093A 7502 jne short OkDepth 1476 0000093C 08C2 or dl, al 1477 OkDepth: 1478 0000093E F6C2F0 test dl, 0F0h 1479 00000941 7502 jnz short OkRate 1480 00000943 08E2 or dl, ah 1481 OkRate: 1482 00000945 88571A mov [edi+TrackInfo.VibParm], dl 1483 00000948 66895714 mov [edi+TrackInfo.Effect], dx 1484 0000094C 6685C9 test cx, cx 1485 0000094F 7404 jz short OkPos 1486 00000951 C6471900 mov byte [edi+TrackInfo.VibPos], 0 1487 OkPos: 1488 00000955 C3 retn 1489 efxsampoffset: 1490 ; 01/10/2017 ; ******* 1491 SampleOfs: 1492 ; test dl, dl 1493 ; jnz short SetSampleOfs 1494 ; mov dl, [edi+TrackInfo.OldSampOfs] 1495 ;SetSampleOfs: 1496 ; mov [edi+TrackInfo.OldSampOfs], dl 1497 00000956 88D6 mov dh, dl 1498 00000958 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1499 0000095E 895704 mov [edi+TrackInfo.Position], edx 1500 00000961 C3 retn 1501 efxpattjump: 1502 PosJump: 1503 00000962 8815[90810000] mov [OrderPos], dl 1504 00000968 C605[94810000]40 mov byte [Row], 64 1505 0000096F C3 retn 1506 efxsetvolume: 1507 SetVolume: 1508 00000970 80FA40 cmp dl, 64 1509 00000973 7602 jbe short OkVol 1510 00000975 B240 mov dl, 64 1511 OkVol: 1512 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1513 00000977 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1514 ;mov [edi+TrackInfo.Volume], dl 1515 00000979 6689570E mov [edi+TrackInfo.Volume], dx 1516 0000097D C3 retn 1517 efxbreak: 1518 Break: 1519 0000097E 88D6 mov dh, dl 1520 00000980 80E20F and dl, 0Fh 1521 00000983 C0EE04 shr dh, 4 1522 00000986 00F6 add dh, dh 1523 00000988 00F2 add dl, dh 1524 0000098A C0E602 shl dh, 2 1525 0000098D 00F2 add dl, dh 1526 0000098F 8815[95810000] mov [BreakRow], dl 1527 00000995 C605[94810000]40 mov byte [Row], 64 1528 0000099C C3 retn 1529 efxsetspeed: 1530 SetSpeed: 1531 0000099D 84D2 test dl,dl 1532 0000099F 7432 je Skip 1533 000009A1 80FA1F cmp dl,31 1534 000009A4 770D ja short SetBpm 1535 SetTempo: 1536 000009A6 8815[91810000] mov [Tempo], dl 1537 000009AC 8815[92810000] mov [TempoWait], dl 1538 000009B2 C3 retn 1539 SetBpm: 1540 000009B3 8815[93810000] mov [Bpm], dl 1541 000009B9 B067 mov al, 103 1542 000009BB F6E2 mul dl 1543 000009BD 88E3 mov bl, ah 1544 000009BF 30FF xor bh, bh 1545 000009C1 66A1[920F0000] mov ax, [MixSpeed] 1546 000009C7 6631D2 xor dx, dx 1547 000009CA 66F7F3 div bx 1548 000009CD 66A3[96810000] mov [BpmSamples], ax 1549 Skip: 1550 000009D3 C3 retn 1551 efxarpeggio: 1552 ; 01/10/2017 1553 000009D4 84D2 test dl, dl 1554 ;je efxnull 1555 000009D6 74FB je short Skip 1556 InitArpeggio: 1557 000009D8 88D6 mov dh, dl 1558 000009DA 80E20F and dl, 0Fh 1559 000009DD C0EE04 shr dh, 4 1560 ; 01/10/2017 1561 ;mov cx, 36 1562 000009E0 66B95400 mov cx, 84 ; 84 notes/periods 1563 000009E4 31DB xor ebx, ebx 1564 000009E6 668B4710 mov ax, [edi+TrackInfo.Period] 1565 gt_ScanPeriod: 1566 ;cmp ax, [PeriodTable+bx] 1567 000009EA 663B83[940D0000] cmp ax, [PeriodTable+ebx] 1568 000009F1 7306 jae short SetArp 1569 000009F3 6683C302 add bx, 2 1570 000009F7 E2F1 loop gt_ScanPeriod 1571 SetArp: 1572 000009F9 6601D2 add dx, dx 1573 000009FC 00DE add dh, bl 1574 000009FE 00DA add dl, bl 1575 ; 01/10/2017 1576 ;mov bx, [PeriodTable+bx] 1577 00000A00 668B9B[940D0000] mov bx, [PeriodTable+ebx] 1578 ;add bx, bx 1579 00000A07 01DB add ebx, ebx 1580 ;mov ax, [PitchTable+bx] 1581 00000A09 668B83[CE150000] mov ax, [PitchTable+ebx] 1582 00000A10 6689471E mov [edi+TrackInfo.Arp], ax 1583 00000A14 88F3 mov bl, dh 1584 00000A16 30FF xor bh, bh 1585 00000A18 668B9B[940D0000] mov bx, [PeriodTable+ebx] 1586 ;add bx, bx 1587 00000A1F 01DB add ebx, ebx 1588 ;mov ax, [PitchTable+bx] 1589 00000A21 668B83[CE150000] mov ax, [PitchTable+ebx] 1590 00000A28 66894720 mov [edi+TrackInfo.Arp+2], ax 1591 00000A2C 88D3 mov bl, dl 1592 00000A2E 30FF xor bh, bh 1593 00000A30 668B9B[940D0000] mov bx, [PeriodTable+ebx] 1594 ;add bx, bx 1595 00000A37 01DB add ebx, ebx 1596 ;mov ax, [PitchTable+bx] 1597 00000A39 668B83[CE150000] mov ax, [PitchTable+ebx] 1598 00000A40 66894722 mov [edi+TrackInfo.Arp+4], ax 1599 00000A44 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1600 00000A4A C3 retn 1601 1602 efxtremolo: 1603 ; 01/10/2017 (TMODPLAY.ASM) 1604 InitTremolo: 1605 00000A4B 8A471C mov al, [edi+TrackInfo.TremParm] 1606 00000A4E 88C4 mov ah, al 1607 00000A50 66250FF0 and ax, 0F00Fh 1608 00000A54 F6C20F test dl, 0Fh 1609 00000A57 7502 jnz short InitTremolo_1 ; efxtremolof0 1610 00000A59 08C2 or dl, al 1611 efxtremolof0: 1612 InitTremolo_1: 1613 00000A5B F6C2F0 test dl, 0F0h 1614 00000A5E 7502 jnz short InitTremolo_2 ; efxtremolof1 1615 00000A60 08E2 or dl, ah 1616 efxtremolof1: 1617 InitTremolo_2: 1618 00000A62 88571C mov [edi+TrackInfo.TremParm], dl 1619 00000A65 66895714 mov [edi+TrackInfo.Effect], dx 1620 00000A69 C3 retn 1621 1622 ;-------------------------------------------------------------------------- 1623 ; pollmodule - polls the module player 1624 ;-------------------------------------------------------------------------- 1625 ;-------------------------------------------------------------------------- 1626 ; UpdateTracks: Main code to process the next tick to be played. 1627 ;-------------------------------------------------------------------------- 1628 1629 pollmodule: 1630 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1631 00000A6A FE0D[92810000] dec byte [TempoWait] 1632 00000A70 7417 jz short GetTracks 1633 1634 ;mov ecx, NumTracks 1635 00000A72 0FB70D[8D0F0000] movzx ecx, word [numtracks] ; 06/10/2017 1636 00000A79 BF[34860000] mov edi, Tracks 1637 BeatTracks: 1638 00000A7E E86EFCFFFF call BeatTrack 1639 00000A83 83C726 add edi, TrackInfo.size 1640 00000A86 E2F6 loop BeatTracks 1641 00000A88 C3 retn 1642 GetTracks: 1643 00000A89 A0[91810000] mov al, [Tempo] 1644 00000A8E A2[92810000] mov [TempoWait], al 1645 1646 00000A93 8B35[A2810000] mov esi, [Note] 1647 00000A99 803D[94810000]40 cmp byte [Row], 64 1648 00000AA0 7268 jb short NoPattWrap 1649 1650 00000AA2 8B35[56140000] mov esi, [ModInfo.Patterns] 1651 00000AA8 8A1D[90810000] mov bl, [OrderPos] 1652 00000AAE 3A1D[D4130000] cmp bl, [ModInfo.OrderLen] 1653 00000AB4 7214 jb short NoOrderWrap 1654 00000AB6 8A1D[D5130000] mov bl, [ModInfo.ReStart] 1655 00000ABC 881D[90810000] mov [OrderPos], bl 1656 00000AC2 3A1D[D4130000] cmp bl, [ModInfo.OrderLen] 1657 00000AC8 7364 jae short NoUpdate 1658 NoOrderWrap: 1659 ;xor bh, bh 1660 00000ACA 81E3FF000000 and ebx, 0FFh 1661 00000AD0 8A9B[D6130000] mov bl, [ModInfo.Order+ebx] 1662 ; 05/10/2017 1663 ;shl ebx, 10 ; *1024 1664 00000AD6 8A0D[8C0F0000] mov cl, [pattern_shift] ; 10 or 11 1665 00000ADC D3E3 shl ebx, cl ; *1024 or *2048 1666 ; 1667 00000ADE 01DE add esi, ebx 1668 00000AE0 8A1D[95810000] mov bl, [BreakRow] 1669 00000AE6 881D[94810000] mov [Row], bl 1670 ;xor bh, bh 1671 00000AEC 81E3FF000000 and ebx, 0FFh 1672 00000AF2 883D[95810000] mov [BreakRow], bh ; 0 1673 00000AF8 66C1E304 shl bx, 4 1674 00000AFC 01DE add esi, ebx 1675 00000AFE 8935[A2810000] mov [Note], esi 1676 00000B04 FE05[90810000] inc byte [OrderPos] 1677 NoPattWrap: 1678 00000B0A FE05[94810000] inc byte [Row] 1679 1680 ;cld 1681 ;mov ecx, NumTracks 1682 00000B10 0FB70D[8D0F0000] movzx ecx, word [numtracks] ; 06/10/2017 1683 00000B17 BF[34860000] mov edi, Tracks 1684 GetTracks_next: 1685 00000B1C 51 push ecx 1686 00000B1D E858FDFFFF call GetTrack ; readchannel 1687 00000B22 59 pop ecx 1688 00000B23 83C726 add edi, TrackInfo.size 1689 00000B26 E2F4 loop GetTracks_next 1690 1691 00000B28 8935[A2810000] mov [Note], esi 1692 NoUpdate: 1693 00000B2E C3 retn 1694 1695 ;-------------------------------------------------------------------------- 1696 ; MixTrack: Mixes one track into a CLEAN buffer. 1697 ; In: 1698 ; ds:si - Track Info Address. 1699 ; ds:di - Buffer Address. 1700 ; cx - Buffer Size. 1701 ;-------------------------------------------------------------------------- 1702 1703 ; esi = Track info address 1704 ; edi = Buffer address 1705 ; ecx = Buffer size 1706 1707 MixTrack: 1708 00000B2F 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1709 00000B34 7752 ja short MixLooped 1710 MixNonLooped: 1711 00000B36 8B16 mov edx, [esi+TrackInfo.Samples] 1712 00000B38 8B5E04 mov ebx, [esi+TrackInfo.Position] 1713 00000B3B 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1714 00000B3F 52 push edx 1715 00000B40 56 push esi 1716 00000B41 01D3 add ebx, edx 1717 00000B43 01D5 add ebp, edx 1718 00000B45 668B5612 mov dx, [esi+TrackInfo.Pitch] 1719 ; 01/10/2017 1720 ;mov al, [esi+TrackInfo.Volume] 1721 00000B49 668B460E mov ax, [esi+TrackInfo.Volume] 1722 ; ah = [esi+TrackInfo.VolDiff] 1723 00000B4D 00E0 add al, ah ; ****** 1724 00000B4F C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1725 00000B53 8A661D mov ah, [esi+TrackInfo.Error] 1726 00000B56 89DE mov esi, ebx 1727 00000B58 31DB xor ebx, ebx ; 01/10/2017 ; * 1728 00000B5A 88C7 mov bh, al 1729 00000B5C 88D0 mov al, dl 1730 00000B5E 88F2 mov dl, dh 1731 ;xor dh, dh 1732 00000B60 81E2FF000000 and edx, 0FFh 1733 nlMixSamp: 1734 00000B66 39EE cmp esi, ebp 1735 00000B68 7311 jae short nlMixBye 1736 00000B6A 8A1E mov bl, [esi] 1737 ;mov bl, [VolTable+bx] 1738 00000B6C 8A9B[90300000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1739 00000B72 001F add [edi], bl 1740 00000B74 47 inc edi 1741 00000B75 00C4 add ah, al 1742 00000B77 11D6 adc esi, edx 1743 00000B79 E2EB loop nlMixSamp 1744 nlMixBye: 1745 00000B7B 89F3 mov ebx, esi 1746 00000B7D 5E pop esi 1747 00000B7E 5A pop edx 1748 00000B7F 29D3 sub ebx, edx 1749 00000B81 895E04 mov [esi+TrackInfo.Position], ebx 1750 00000B84 88661D mov [esi+TrackInfo.Error], ah 1751 00000B87 C3 retn 1752 MixLooped: 1753 00000B88 8B16 mov edx, [esi+TrackInfo.Samples] 1754 00000B8A 8B5E04 mov ebx, [esi+TrackInfo.Position] 1755 00000B8D 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1756 00000B91 892D[9E810000] mov [BufRep], ebp 1757 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1758 00000B97 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1759 00000B9B 52 push edx 1760 00000B9C 56 push esi 1761 00000B9D 01D3 add ebx, edx 1762 00000B9F 01D5 add ebp, edx 1763 00000BA1 668B5612 mov dx, [esi+TrackInfo.Pitch] 1764 ; 01/10/2017 1765 ;mov al, [esi+TrackInfo.Volume] 1766 00000BA5 668B460E mov ax, [esi+TrackInfo.Volume] 1767 ; ah = [esi+TrackInfo.VolDiff] 1768 00000BA9 00E0 add al, ah ; ****** 1769 00000BAB C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1770 00000BAF 8A661D mov ah, [esi+TrackInfo.Error] 1771 ;mov si, bx 1772 00000BB2 89DE mov esi, ebx ; 04/09/2017 1773 00000BB4 31DB xor ebx, ebx ; 01/10/2017 ; * 1774 00000BB6 88C7 mov bh, al 1775 00000BB8 88D0 mov al, dl 1776 00000BBA 88F2 mov dl, dh 1777 ;xor dh, dh 1778 00000BBC 81E2FF000000 and edx, 0FFh 1779 lpMixSamp: 1780 00000BC2 39EE cmp esi, ebp 1781 00000BC4 7206 jb short lpMixNow 1782 00000BC6 2B35[9E810000] sub esi, [BufRep] 1783 lpMixNow: 1784 00000BCC 8A1E mov bl, [esi] 1785 ;mov bl, [VolTable+bx] 1786 00000BCE 8A9B[90300000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1787 00000BD4 001F add [edi], bl 1788 00000BD6 47 inc edi 1789 00000BD7 00C4 add ah, al 1790 00000BD9 11D6 adc esi, edx 1791 00000BDB E2E5 loop lpMixSamp 1792 lpMixBye: 1793 ; mov ebx, esi 1794 ; pop esi 1795 ; pop edx 1796 ; sub ebx, edx 1797 ; mov [esi+TrackInfo.Position], ebx 1798 ; mov [esi+TrackInfo.Error], ah 1799 ; retn 1800 00000BDD EB9C jmp short nlMixBye 1801 1802 ;-------------------------------------------------------------------------- 1803 ; mixpoll - updates the output buffer 1804 ;-------------------------------------------------------------------------- 1805 ; 1806 ;-------------------------------------------------------------------------- 1807 ; GetSamples: Returns the next chunk of samples to be played. 1808 ; In: 1809 ; Buffer - Buffer Address. 1810 ; Count - Buffer Size. 1811 ;-------------------------------------------------------------------------- 1812 1813 mixpoll: 1814 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1815 ; edi = buffer address 1816 ; ebx = count 1817 1818 00000BDF 60 pushad 1819 1820 ;cld 1821 NextChunk: 1822 00000BE0 66833D[9C810000]00 cmp word [BufLen], 0 1823 00000BE8 754A jne short CopyChunk 1824 1825 00000BEA 53 push ebx 1826 00000BEB 57 push edi 1827 MixChunk: 1828 00000BEC BF[90710000] mov edi, MixBuffer 1829 00000BF1 0FB70D[96810000] movzx ecx, word [BpmSamples] 1830 ;mov cx, [BpmSamples] 1831 00000BF8 893D[98810000] mov [BufPtr], edi 1832 00000BFE 66890D[9C810000] mov [BufLen], cx 1833 1834 00000C05 B080 mov al, 80h 1835 00000C07 F3AA rep stosb 1836 1837 ;mov cx, NumTracks 1838 ;mov cl, NumTracks ; 01/10/2017 1839 00000C09 8A0D[8D0F0000] mov cl, [numtracks] ; 06/10/2017 1840 00000C0F BE[0E860000] mov esi, Tracks - TrackInfo.size 1841 GetSamples_next: 1842 00000C14 51 push ecx 1843 00000C15 83C626 add esi, TrackInfo.size 1844 00000C18 668B0D[9C810000] mov cx, [BufLen] 1845 00000C1F 8B3D[98810000] mov edi, [BufPtr] 1846 00000C25 E805FFFFFF call MixTrack 1847 00000C2A 59 pop ecx 1848 00000C2B E2E7 loop GetSamples_next 1849 1850 00000C2D E838FEFFFF call UpdateTracks 1851 1852 00000C32 5F pop edi 1853 00000C33 5B pop ebx 1854 CopyChunk: 1855 ;mov cx, [BufLen] 1856 00000C34 0FB70D[9C810000] movzx ecx, word [BufLen] 1857 00000C3B 39D9 cmp ecx, ebx 1858 ;cmp cx, bx 1859 00000C3D 7602 jbe short MoveChunk 1860 ;mov cx, bx 1861 00000C3F 89D9 mov ecx, ebx 1862 MoveChunk: 1863 00000C41 8B35[98810000] mov esi, [BufPtr] 1864 00000C47 010D[98810000] add [BufPtr], ecx 1865 00000C4D 66290D[9C810000] sub [BufLen], cx 1866 00000C54 29CB sub ebx, ecx 1867 00000C56 F3A4 rep movsb 1868 00000C58 85DB test ebx, ebx 1869 00000C5A 7584 jnz short NextChunk 1870 1871 00000C5C 61 popad 1872 00000C5D C3 retn 1873 1874 ;-------------------------------------------------------------------------- 1875 ; StartPlaying: Initializes the Sound System. 1876 ; In: 1877 ; Module Information Resources. 1878 ;-------------------------------------------------------------------------- 1879 1880 StartPlaying: 1881 00000C5E 60 pushad 1882 SetModParms: 1883 00000C5F C605[90810000]00 mov byte [OrderPos], 0 1884 00000C66 C605[91810000]06 mov byte [Tempo], DefTempo 1885 00000C6D C605[92810000]06 mov byte [TempoWait], DefTempo 1886 00000C74 C605[93810000]7D mov byte [Bpm], DefBpm 1887 00000C7B C605[94810000]40 mov byte [Row], 64 1888 00000C82 C605[95810000]00 mov byte [BreakRow], 0 1889 00000C89 66A1[920F0000] mov ax, [MixSpeed] 1890 00000C8F 31D2 xor edx, edx 1891 00000C91 66BB3200 mov bx, 24*DefBpm/60 1892 00000C95 66F7F3 div bx 1893 00000C98 66A3[96810000] mov [BpmSamples], ax 1894 ClearTracks: 1895 00000C9E BF[34860000] mov edi, Tracks 1896 ; 06/10/2017 1897 ;mov ecx, NumTracks*TrackInfo.size 1898 00000CA3 B826000000 mov eax, TrackInfo.size 1899 00000CA8 0FB70D[8D0F0000] movzx ecx, word [numtracks] 1900 00000CAF F7E1 mul ecx 1901 00000CB1 89C1 mov ecx, eax 1902 00000CB3 31C0 xor eax, eax 1903 ;cld 1904 00000CB5 F3AA rep stosb 1905 1906 00000CB7 A3[98810000] mov [BufPtr], eax 1907 00000CBC 66A3[9C810000] mov [BufLen], ax 1908 MakePitch: 1909 00000CC2 66B80021 mov ax, MidCRate 1910 00000CC6 66BBAC01 mov bx, 428 1911 00000CCA 66F7E3 mul bx 1912 00000CCD 66F735[920F0000] div word [MixSpeed] 1913 00000CD4 30F6 xor dh, dh 1914 00000CD6 88E2 mov dl, ah 1915 00000CD8 88C4 mov ah, al 1916 00000CDA 30C0 xor al, al 1917 ;mov cx, 857 1918 00000CDC 66B9610D mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1919 00000CE0 31DB xor ebx, ebx 1920 00000CE2 BF[CE150000] mov edi, PitchTable 1921 PitchLoop: 1922 00000CE7 50 push eax 1923 00000CE8 52 push edx 1924 00000CE9 6639DA cmp dx, bx 1925 00000CEC 7303 jae short NoDiv 1926 00000CEE 66F7F3 div bx 1927 NoDiv: 1928 00000CF1 66AB stosw 1929 00000CF3 5A pop edx 1930 00000CF4 58 pop eax 1931 ;inc bx 1932 00000CF5 43 inc ebx 1933 00000CF6 E2EF loop PitchLoop 1934 MakeVolume: 1935 00000CF8 66B90041 mov cx, 16640 1936 00000CFC 89CB mov ebx, ecx 1937 VolLoop: 1938 00000CFE 664B dec bx 1939 00000D00 88D8 mov al, bl 1940 00000D02 F6EF imul bh 1941 ;mov [VolTable+bx], ah 1942 00000D04 88A3[90300000] mov [VolTable+ebx], ah 1943 00000D0A E2F2 loop VolLoop 1944 1945 00000D0C 61 popad 1946 ;retn 1947 1948 ;-------------------------------------------------------------------------- 1949 ; StopPlaying: ShutDown the Sound System. 1950 ;-------------------------------------------------------------------------- 1951 1952 StopPlaying: 1953 00000D0D C3 retn 1954 1955 ;============================================================================= 1956 ; preinitialized data 1957 ;============================================================================= 1958 1959 ;============================================================================= 1960 ; SB.ASM - DATA 1961 ;============================================================================= 1962 1963 00000D0E 2002 SbAddr: dw 220h 1964 00000D10 07 SbIrq: db 7 1965 ;Srbs: db 0 1966 1967 ;============================================================================= 1968 ; Protracker effects stuff 1969 ;============================================================================= 1970 1971 ;----------------------------------------------------------------------------- 1972 ; Effect jump tables 1973 ;----------------------------------------------------------------------------- 1974 1975 00000D11 90 align 4 1976 1977 efxtable: 1978 00000D14 [D4090000] dd efxarpeggio ; 0 - arpeggio 1979 00000D18 [01070000] dd efxnull ; 1 - porta up 1980 00000D1C [01070000] dd efxnull ; 2 - porta down 1981 00000D20 [1F090000] dd efxtoneporta ; 3 - tone porta 1982 00000D24 [2E090000] dd efxvibrato ; 4 - vibrato 1983 00000D28 [01070000] dd efxnull ; 5 - tone+slide 1984 00000D2C [01070000] dd efxnull ; 6 - vibrato+slide 1985 00000D30 [4B0A0000] dd efxtremolo ; 7 - tremolo 1986 00000D34 [01070000] dd efxnull ; 8 - unused 1987 00000D38 [56090000] dd efxsampoffset ; 9 - sample offset 1988 00000D3C [01070000] dd efxnull ; A - volume slide 1989 00000D40 [62090000] dd efxpattjump ; B - pattern jump 1990 00000D44 [70090000] dd efxsetvolume ; C - set volume 1991 00000D48 [7E090000] dd efxbreak ; D - break pattern 1992 00000D4C [01070000] dd efxnull ; E - extra effects 1993 00000D50 [9D090000] dd efxsetspeed ; F - set speed 1994 1995 efxtable2: 1996 00000D54 [02070000] dd efxarpeggio2 ; 0 - arpeggio 1997 00000D58 [24070000] dd efxportaup ; 1 - porta up 1998 00000D5C [4A070000] dd efxportadown ; 2 - porta down 1999 00000D60 [71070000] dd efxtoneporta2 ; 3 - tone porta 2000 00000D64 [AA070000] dd efxvibrato2 ; 4 - vibrato 2001 00000D68 [06080000] dd efxtoneslide ; 5 - tone+slide 2002 00000D6C [13080000] dd efxvibslide ; 6 - vibrato+slide 2003 00000D70 [3A080000] dd efxtremolo2 ; 7 - tremolo 2004 00000D74 [01070000] dd efxnull ; 8 - unused 2005 00000D78 [01070000] dd efxnull ; 9 - sample offset 2006 00000D7C [1D080000] dd efxvolslide ; A - volume slide 2007 00000D80 [01070000] dd efxnull ; B - pattern jump 2008 00000D84 [01070000] dd efxnull ; C - set volume 2009 00000D88 [01070000] dd efxnull ; D - break pattern 2010 00000D8C [01070000] dd efxnull ; E - extra effects 2011 00000D90 [01070000] dd efxnull ; F - set speed 2012 2013 ;----------------------------------------------------------------------------- 2014 ; Amiga period table 2015 ;----------------------------------------------------------------------------- 2016 2017 ;PeriodTable0: 2018 ; dw 0 2019 PeriodTable: 2020 00000D94 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 2020 00000D9D 0A000A7009E8086808- 2020 00000DA6 F00780071407 2021 00000DAC B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 2021 00000DB5 050005B80474043404- 2021 00000DBE F803C0038A03 2022 00000DC4 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 2022 00000DCD 0280025C023A021A02- 2022 00000DD6 FC01E001C501 2023 00000DDC AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 2023 00000DE5 0140012E011D010D01- 2023 00000DEE FE00F000E200 2024 00000DF4 D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 2024 00000DFD 00A00097008F008700- 2024 00000E06 7F0078007100 2025 00000E0C 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 2025 00000E15 0050004B0047004300- 2025 00000E1E 3F003C003800 2026 00000E24 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 2026 00000E2D 002800250023002100- 2026 00000E36 1F001E001C00 2027 2028 ;----------------------------------------------------------------------------- 2029 ; Sinus wave table 2030 ;----------------------------------------------------------------------------- 2031 2032 SinTable: 2033 00000E3C 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 2033 00000E45 C5D4E1 2034 00000E48 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 2034 00000E51 E1 2035 00000E52 D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 2035 00000E5B 19 2036 2037 ;============================================================================= 2038 ; Copyright Strings & Messages 2039 ;============================================================================= 2040 00000E5C 0000 dw 0 2041 msg_usage: 2042 00000E5E 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 2042 00000E67 506C6179657220666F- 2042 00000E70 72205452444F532033- 2042 00000E79 383620627920457264- 2042 00000E82 6F67616E2054616E2E- 2042 00000E8B 20 2043 00000E8C 4F63746F6265722032- db 'October 2017.',10,13 2043 00000E95 3031372E0A0D 2044 00000E9B 75736167653A207469- db 'usage: tinyplay filename.mod', 10, 13,0 2044 00000EA4 6E79706C6179206669- 2044 00000EAD 6C656E616D652E6D6F- 2044 00000EB6 640A0D00 2045 00000EBA 30372F31302F323031- db '07/10/2017',0 2045 00000EC3 3700 2046 2047 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 2048 2049 00000EC5 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 2049 00000ECE 506C61796572207630- 2049 00000ED7 2E3162206279204361- 2049 00000EE0 726C6F732048617361- 2049 00000EE9 6E2E204A756C792031- 2049 00000EF2 3939332E 2050 00000EF6 0A0D00 db 10,13,0 2051 00000EF9 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 2051 00000F02 64696E67204D6F6475- 2051 00000F0B 6C652066696C652E0A- 2051 00000F14 0D00 2052 00000F16 536F756E6420426C61- MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 2052 00000F1F 73746572206E6F7420- 2052 00000F28 666F756E64206F7220- 2052 00000F31 495251206572726F72- 2052 00000F3A 2E0A0D00 2053 00000F3E 536F756E6420426C61- MsgFound: db 'Sound Blaster found at Address 2' 2053 00000F47 7374657220666F756E- 2053 00000F50 642061742041646472- 2053 00000F59 6573732032 2054 00000F5E 7830682C2049525120 PortText: db 'x0h, IRQ ' 2055 00000F67 782E0A0D00 IrqText: db 'x.',10,13,0 2056 2057 trdos386_err_msg: 2058 00000F6C 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 2058 00000F75 2053797374656D2063- 2058 00000F7E 616C6C206572726F72- 2058 00000F87 20210A0D00 2059 2060 ; 04/10/2017 2061 00000F8C 0A pattern_shift: db 10 2062 00000F8D 0400 numtracks: dw 4 2063 2064 bss_start: 2065 2066 ABSOLUTE bss_start 2067 2068 00000F8F alignb 4 2069 2070 ;============================================================================= 2071 ; uninitialized data 2072 ;============================================================================= 2073 2074 ; SB.ASM 2075 00000F90 DmaFlag resb 1 2076 2077 ; 11/03/2017 2078 00000F91 iStatus: resb 1 2079 2080 ; MODPLAY.ASM 2081 sampling_rate: ; 06/10/2017 2082 00000F92 MixSpeed: resw 1 2083 2084 ; MODLOAD.ASM 2085 00000F94 FileHandle: resd 1 2086 00000F98 Header: resb ModHeader.size 2087 2088 ; MODPLAY.ASM 2089 ;sampling_rate: ; 11/03/2017 2090 ;MixSpeed: resw 1 2091 2092 ModInfo: 2093 000013D4 ModInfo.OrderLen: resb 1 2094 000013D5 ModInfo.ReStart: resb 1 2095 000013D6 ModInfo.Order: resb 128 2096 00001456 ModInfo.Patterns: resd 1 2097 2098 0000145A ModInfo.SampOfs: resw 31 2099 00001498 ModInfo.SampSeg: resw 31 2100 000014D6 ModInfo.SampLen: resw 31 2101 00001514 ModInfo.SampRep: resw 31 2102 00001552 ModInfo.SampRepLen: resw 31 2103 00001590 ModInfo.SampVol: resw 31 2104 2105 ; MODPLAY.ASM 2106 PitchTable: ;resw 857 2107 000015CE resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 2108 00003090 VolTable: resb 16640 2109 00007190 MixBuffer resb MixBufSize 2110 2111 ; MODPLAY.ASM 2112 00008190 OrderPos: resb 1 2113 00008191 Tempo: resb 1 2114 00008192 TempoWait: resb 1 2115 00008193 Bpm: resb 1 2116 00008194 Row: resb 1 2117 00008195 BreakRow: resb 1 2118 00008196 BpmSamples: resw 1 2119 00008198 BufPtr: resd 1 2120 0000819C BufLen: resw 1 2121 0000819E BufRep: resd 1 2122 000081A2 Note: resd 1 2123 ;Tracks resb TrackInfo.size*NumTracks 2124 2125 000081A6 alignb 16 2126 2127 ; PLAY.ASM 2128 000081B0 Scope: resw 320 2129 00008430 RowOfs: resw 256 2130 2131 ;03/03/2017 2132 00008630 DMA_phy_buff: resd 1 2133 2134 ; 06/10/2017 2135 00008634 Tracks: resb TrackInfo.size*8 2136 2137 mod_file_name: 2138 00008764 resb 16 2139 2140 ; 12/03/2017 2141 00008774 alignb 65536 2142 2143 DmaBuffer: 2144 00010000 DoubleBuffer: resb DmaBufSize ; 2048-65536 ; 06/10/2017 2145 2146 alignb 65536 2147 2148 file_buffer: 2149 00020000 resb 65536*6 ; 13/03/2017 2150 EOF: