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 ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993) 11 ; PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM 12 ; 13 ; Assembler: NASM 2.11 14 ; ---------------------------------------------------------------------------- 15 ; nasm tinyplay.s -l tinyplay.txt -o TINYPLAY.PRG 16 ; **************************************************************************** 17 ; TINYPLAY.ASM by Erdogan Tan (for MSDOS) (13/02/2017) 18 ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017) 19 20 ; 01/03/2017 21 ; 16/10/2016 22 ; 29/04/2016 23 ; TRDOS 386 system calls (temporary list!) 24 _ver equ 0 25 _exit equ 1 26 _fork equ 2 27 _read equ 3 28 _write equ 4 29 _open equ 5 30 _close equ 6 31 _wait equ 7 32 _creat equ 8 33 _link equ 9 34 _unlink equ 10 35 _exec equ 11 36 _chdir equ 12 37 _time equ 13 38 _mkdir equ 14 39 _chmod equ 15 40 _chown equ 16 41 _break equ 17 42 _stat equ 18 43 _seek equ 19 44 _tell equ 20 45 _mount equ 21 46 _umount equ 22 47 _setuid equ 23 48 _getuid equ 24 49 _stime equ 25 50 _quit equ 26 51 _intr equ 27 52 _fstat equ 28 53 _emt equ 29 54 _mdate equ 30 55 _video equ 31 56 _audio equ 32 57 _timer equ 33 58 _sleep equ 34 59 _msg equ 35 60 _geterr equ 36 61 _fpsave equ 37 62 _pri equ 38 63 _rele equ 39 64 _fff equ 40 65 _fnf equ 41 66 _alloc equ 42 67 _dalloc equ 43 68 _calbac equ 44 69 70 %macro sys 1-4 71 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 72 ; 03/09/2015 73 ; 13/04/2015 74 ; Retro UNIX 386 v1 system call. 75 %if %0 >= 2 76 mov ebx, %2 77 %if %0 >= 3 78 mov ecx, %3 79 %if %0 = 4 80 mov edx, %4 81 %endif 82 %endif 83 %endif 84 mov eax, %1 85 ;int 30h 86 int 40h ; TRDOS 386 (TRDOS v2.0) 87 %endmacro 88 89 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 90 ; sys systemcall (eax) , , 91 92 93 ; ---------------------------------------------------------------------------- 94 ; Tiny MOD Player v0.1b by Carlos Hasan. 95 ; July 14th, 1993. 96 97 ;============================================================================= 98 ; PLAY.ASM 99 ;============================================================================= 100 101 [BITS 32] 102 [org 0] 103 104 Start: 105 ; clear bss 106 00000000 B9[00000800] mov ecx, EOF 107 00000005 BF[5C0F0000] mov edi, bss_start 108 0000000A 29F9 sub ecx, edi 109 0000000C D1E9 shr ecx, 1 110 0000000E 31C0 xor eax, eax 111 00000010 F366AB rep stosw 112 113 GetFileName: 114 00000013 89E6 mov esi, esp 115 00000015 AD lodsd 116 00000016 83F802 cmp eax, 2 ; two arguments 117 ; (program file name & mod file name) 118 00000019 0F82A4010000 jb pmsg_usage ; nothing to do 119 120 0000001F AD lodsd ; program file name address 121 00000020 AD lodsd ; mod file name address (file to be read) 122 00000021 89C6 mov esi, eax 123 00000023 BF[94860000] mov edi, mod_file_name 124 ScanName: 125 00000028 AC lodsb 126 00000029 84C0 test al, al 127 0000002B 0F8492010000 je pmsg_usage 128 00000031 3C20 cmp al, 20h 129 00000033 74F3 je short ScanName ; scan start of name. 130 00000035 AA stosb 131 00000036 B4FF mov ah, 0FFh 132 a_0: 133 00000038 FEC4 inc ah 134 a_1: 135 0000003A AC lodsb 136 0000003B AA stosb 137 0000003C 3C2E cmp al, '.' 138 0000003E 74F8 je short a_0 139 00000040 20C0 and al, al 140 00000042 75F6 jnz short a_1 141 142 00000044 08E4 or ah, ah ; if period NOT found, 143 00000046 750B jnz short a_2 ; then add a .MOD extension. 144 SetExt: 145 00000048 4F dec edi 146 00000049 C7072E4D4F44 mov dword [edi], '.MOD' 147 0000004F C6470400 mov byte [edi+4], 0 148 a_2: 149 ; Prints the Credits Text. 150 sys _msg, Credits, 255, 0Ch 150 <1> 150 <1> 150 <1> 150 <1> 150 <1> %if %0 >= 2 150 00000053 BB[950E0000] <1> mov ebx, %2 150 <1> %if %0 >= 3 150 00000058 B9FF000000 <1> mov ecx, %3 150 <1> %if %0 = 4 150 0000005D BA0C000000 <1> mov edx, %4 150 <1> %endif 150 <1> %endif 150 <1> %endif 150 00000062 B823000000 <1> mov eax, %1 150 <1> 150 00000067 CD40 <1> int 40h 151 152 00000069 E86D010000 call DetectSb ; Detect the SB Addr, Irq. 153 LoadMod: 154 0000006E BF[94860000] mov edi, mod_file_name 155 00000073 E8F7040000 call LoadModule ; Load the MODule... 156 ; 07/10/2017 157 00000078 731B jnc short PlayNow ; any error loading? 158 159 ; yes, print error and Exit. 160 161 sys _msg, ErrorMesg, 255, 0Fh 161 <1> 161 <1> 161 <1> 161 <1> 161 <1> %if %0 >= 2 161 0000007A BB[C90E0000] <1> mov ebx, %2 161 <1> %if %0 >= 3 161 0000007F B9FF000000 <1> mov ecx, %3 161 <1> %if %0 = 4 161 00000084 BA0F000000 <1> mov edx, %4 161 <1> %endif 161 <1> %endif 161 <1> %endif 161 00000089 B823000000 <1> mov eax, %1 161 <1> 161 0000008E CD40 <1> int 40h 162 163 00000090 E922010000 jmp Exit 164 165 PlayNow: 166 ;; DIRECT MEMORY ACCESS (for Audio DMA) 167 ;; ebx = DMA buffer address (virtual, user) 168 ;; ecx = buffer size (in bytes) 169 ;; edx = upper limit = 16MB 170 171 ;_16MB equ 1024*1024*16 172 173 ;sys _alloc, DoubleBuffer, DmaBufSize, _16MB 174 ;jc short error_exit 175 176 ; 12/05/2017 177 sys _audio, 0D00h, DmaBufSize, DoubleBuffer 177 <1> 177 <1> 177 <1> 177 <1> 177 <1> %if %0 >= 2 177 00000095 BB000D0000 <1> mov ebx, %2 177 <1> %if %0 >= 3 177 0000009A B900000100 <1> mov ecx, %3 177 <1> %if %0 = 4 177 0000009F BA[00000100] <1> mov edx, %4 177 <1> %endif 177 <1> %endif 177 <1> %endif 177 000000A4 B820000000 <1> mov eax, %1 177 <1> 177 000000A9 CD40 <1> int 40h 178 000000AB 7253 jc short error_exit 179 180 000000AD A3[90860000] mov [DMA_phy_buff], eax ; physical address 181 ; of the buffer 182 ; (which is needed 183 ; for DMA controller) 184 185 ; 11/03/2017 (22000 -> 22050) 186 000000B2 66C705[9E130000]22- mov word [MixSpeed], 22050 ; Mixing at 22 kHz 186 000000BA 56 187 188 ; 07/10/2017 189 000000BB 66C705[9E130000]CE- mov word [MixSpeed], 22222 ; Mixing at 22 kHz 189 000000C3 56 190 191 ; call StartPlaying ; PLAY! 192 193 000000C4 E810030000 call SbInit 194 195 000000C9 B980000000 mov ecx, 128 ; Make a lookup table 196 000000CE 31DB xor ebx, ebx ; for fastest pixel 197 000000D0 BA002D0000 mov edx, 320*(100-64) ; addressing. 198 MakeOfs: 199 000000D5 668993[90840000] mov [RowOfs+ebx], dx 200 000000DC 668993[92840000] mov [RowOfs+ebx+2], dx 201 000000E3 6681C24001 add dx, 320 202 000000E8 83C304 add ebx, 4 203 000000EB E2E8 loop MakeOfs 204 205 ;cld 206 207 ; DIRECT VGA MEMORY ACCESS 208 ; bl = 0, bh = 5 209 ; Direct access/map to VGA memory (0A0000h) 210 211 sys _video, 0500h 211 <1> 211 <1> 211 <1> 211 <1> 211 <1> %if %0 >= 2 211 000000ED BB00050000 <1> mov ebx, %2 211 <1> %if %0 >= 3 211 <1> mov ecx, %3 211 <1> %if %0 = 4 211 <1> mov edx, %4 211 <1> %endif 211 <1> %endif 211 <1> %endif 211 000000F2 B81F000000 <1> mov eax, %1 211 <1> 211 000000F7 CD40 <1> int 40h 212 000000F9 3D00000A00 cmp eax, 0A0000h 213 000000FE 741B je short start_scope 214 215 error_exit: 216 sys _msg, trdos386_err_msg, 255, 0Eh 216 <1> 216 <1> 216 <1> 216 <1> 216 <1> %if %0 >= 2 216 00000100 BB[3C0F0000] <1> mov ebx, %2 216 <1> %if %0 >= 3 216 00000105 B9FF000000 <1> mov ecx, %3 216 <1> %if %0 = 4 216 0000010A BA0E000000 <1> mov edx, %4 216 <1> %endif 216 <1> %endif 216 <1> %endif 216 0000010F B823000000 <1> mov eax, %1 216 <1> 216 00000114 CD40 <1> int 40h 217 ;jmp short Exit 218 00000116 E99C000000 jmp Exit 219 220 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 221 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 222 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 223 ; second, or the module will sound "looped". 224 ; Because we need better sync with the ModPlayer to draw the scope, 225 ; the polling is called from my routine, and then the irq 0 must be 226 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 227 ; samples played by the Sound Blaster. Note that some samples are 228 ; discarded in the next code, just for fun! 229 230 start_scope: 231 ; mov ax, 0A000h 232 ; mov es, ax 233 0000011B 89C7 mov edi, eax ; 0A0000h 234 235 ;mov byte [tLoop], 1 236 237 ; 11/03/2017 238 0000011D 66B81300 mov ax, 0013h ; Set Mode 320x200x256 239 00000121 CD31 int 31h 240 ScopeLoop: 241 ; ModPlay Polling! 242 00000123 E884020000 call SbPoll 243 244 ;cmp byte [tLoop], 1 245 ;jb short _StopPlay 246 247 248 00000128 BE[00000100] mov esi, DmaBuffer ; get current samples 249 ; to be drawed ... 250 ; 12/03/2017 251 ; original tinyplay scope drawing code is for 1K buffer 252 ; but now we have 32K buffer, following code is for that... 253 GetDmaCount: 254 ;in al, 03h 255 0000012D 66BA0300 mov dx, 03h 256 00000131 B400 mov ah, 0 ; inb 257 00000133 CD34 int 34h 258 00000135 88C1 mov cl, al 259 ;in al, 03h 260 ;mov ah, 0 ; inb 261 00000137 CD34 int 34h 262 00000139 88C5 mov ch, al 263 0000013B 66BAFFFF mov dx, 65535 264 0000013F 6629CA sub dx, cx 265 ; 15/03/2017 266 00000142 6681EAA000 sub dx, 160 267 00000147 6601D6 add si, dx 268 ; 269 0000014A 6631C9 xor cx, cx 270 0000014D 6631D2 xor dx, dx 271 DrawLoop: 272 00000150 6689D3 mov bx, dx ; (save Index) 273 00000153 66678BBF[1082] mov di, [Scope+bx] ; get old SCOPE pixel address 274 ;mov byte [es:di], 0 ; erase it! 275 00000159 C60700 mov byte [edi], 0 276 ;lodsb ; get a sample (8-bit) 277 ;mov bl, al 278 ;15/03/2017 279 0000015C 8A1E mov bl, [esi] ; calc new pixel address... 280 0000015E 6646 inc si 281 00000160 30FF xor bh, bh 282 00000162 66D1E3 shl bx, 1 283 00000165 66678BBF[9084] mov di, [RowOfs+bx] 284 0000016B 6601CF add di, cx 285 0000016E 6689D3 mov bx, dx ; (restore Index) 286 00000171 666789BF[1082] mov [Scope+bx], di ; save new address... 287 ;mov byte [es:di], 10 ; and DRAW. 288 00000177 C6070A mov byte [edi], 10 289 0000017A 6683C202 add dx, 2 ; the next pixel... 290 0000017E 6641 inc cx 291 00000180 6681F94001 cmp cx, 320 ; 320 pixels drawed? 292 00000185 72C9 jb short DrawLoop 293 CheckAnyKey: 294 00000187 B401 mov ah, 1 ; any key pressed? 295 00000189 CD32 int 32h ; no, Loop. 296 0000018B 7496 jz short ScopeLoop 297 298 0000018D B400 mov ah, 0 ; flush key buffer... 299 0000018F CD32 int 32h 300 301 00000191 66B80300 mov ax, 0003h ; Set Text Mode 80x25x16 302 00000195 CD31 int 31h 303 304 ;call StopPlaying ; STOP! 305 306 ;mov byte [tLoop], 0 307 _StopPlay: 308 ; 11/03/2017 309 00000197 30C0 xor al, al 310 ; Stop 8 bit (autoinitialized) DMA process 311 ;out 0Ch, al 312 ;retn 313 00000199 66BA0C00 mov dx, 0Ch 314 0000019D B401 mov ah, 1 ;outb 315 0000019F CD34 int 34h 316 317 000001A1 E88B030000 call SbDone 318 319 ; Deallocate DMA buffer (not necessary just before exit!) 320 sys _dalloc, DoubleBuffer, 2*DmaBufSize 320 <1> 320 <1> 320 <1> 320 <1> 320 <1> %if %0 >= 2 320 000001A6 BB[00000100] <1> mov ebx, %2 320 <1> %if %0 >= 3 320 000001AB B900000200 <1> mov ecx, %3 320 <1> %if %0 = 4 320 <1> mov edx, %4 320 <1> %endif 320 <1> %endif 320 <1> %endif 320 000001B0 B82B000000 <1> mov eax, %1 320 <1> 320 000001B5 CD40 <1> int 40h 321 ;jc error_exit 322 Exit: 323 000001B7 E80E050000 call FreeModule ; Free MODule core. 324 325 sys _exit ; Bye! 325 <1> 325 <1> 325 <1> 325 <1> 325 <1> %if %0 >= 2 325 <1> mov ebx, %2 325 <1> %if %0 >= 3 325 <1> mov ecx, %3 325 <1> %if %0 = 4 325 <1> mov edx, %4 325 <1> %endif 325 <1> %endif 325 <1> %endif 325 000001BC B801000000 <1> mov eax, %1 325 <1> 325 000001C1 CD40 <1> int 40h 326 327 pmsg_usage: 328 sys _msg, msg_usage, 255, 0Ah 328 <1> 328 <1> 328 <1> 328 <1> 328 <1> %if %0 >= 2 328 000001C3 BB[2E0E0000] <1> mov ebx, %2 328 <1> %if %0 >= 3 328 000001C8 B9FF000000 <1> mov ecx, %3 328 <1> %if %0 = 4 328 000001CD BA0A000000 <1> mov edx, %4 328 <1> %endif 328 <1> %endif 328 <1> %endif 328 000001D2 B823000000 <1> mov eax, %1 328 <1> 328 000001D7 CD40 <1> int 40h 329 000001D9 EBDC jmp short Exit 330 331 DetectSb: 332 000001DB 60 pushad 333 ScanPort: 334 000001DC 66BB1002 mov bx, 210h ; start scanning ports 335 ; 210h, 220h, .. 260h 336 ResetDSP: 337 000001E0 6689DA mov dx, bx ; try to reset the DSP. 338 000001E3 6683C206 add dx, 06h 339 000001E7 B001 mov al, 1 340 ;out dx, al 341 000001E9 B401 mov ah, 1 ; outb 342 000001EB CD34 int 34h 343 344 ;in al, dx 345 ;in al, dx 346 ;in al, dx 347 ;in al, dx 348 349 000001ED B400 mov ah, 0 ; inb 350 000001EF CD34 int 34h 351 ;mov ah, 0 ; inb 352 000001F1 CD34 int 34h 353 354 000001F3 30C0 xor al, al 355 ;out dx, al 356 000001F5 B401 mov ah, 1 ; outb 357 000001F7 CD34 int 34h 358 359 000001F9 6683C208 add dx, 08h 360 ;mov cx, 100 361 000001FD 66B92000 mov cx, 32 362 00000201 28E4 sub ah, ah ; 0 363 WaitID: 364 ;in al, dx 365 00000203 CD34 int 34h ;ah = 0 ; inb 366 00000205 08C0 or al, al 367 00000207 7804 js short GetID 368 00000209 E2F8 loop WaitID 369 0000020B EB10 jmp short NextPort 370 GetID: 371 0000020D 6683EA04 sub dx, 04h 372 ;in al, dx 373 00000211 CD34 int 34h ;ah = 0 ; inb 374 00000213 3CAA cmp al, 0AAh 375 00000215 7416 je short Found 376 00000217 6683C204 add dx, 04h 377 0000021B E2E6 loop WaitID 378 NextPort: 379 0000021D 6683C310 add bx, 10h ; if not response, 380 00000221 6681FB6002 cmp bx, 260h ; try the next port. 381 00000226 76B8 jbe short ResetDSP 382 00000228 E934010000 jmp Fail 383 Found: 384 0000022D 66891D[E00C0000] mov [SbAddr], bx ; SB Port Address Found! 385 ScanIRQ: 386 SetIrqs: ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ 387 sys _calbac, 102h, 2, SbIrq ; IRQ 2 387 <1> 387 <1> 387 <1> 387 <1> 387 <1> %if %0 >= 2 387 00000234 BB02010000 <1> mov ebx, %2 387 <1> %if %0 >= 3 387 00000239 B902000000 <1> mov ecx, %3 387 <1> %if %0 = 4 387 0000023E BA[E20C0000] <1> mov edx, %4 387 <1> %endif 387 <1> %endif 387 <1> %endif 387 00000243 B82C000000 <1> mov eax, %1 387 <1> 387 00000248 CD40 <1> int 40h 388 ; Signal Response Byte 389 ;jc short error_exit 390 391 sys _calbac, 103h, 3, SbIrq ; IRQ 3 391 <1> 391 <1> 391 <1> 391 <1> 391 <1> %if %0 >= 2 391 0000024A BB03010000 <1> mov ebx, %2 391 <1> %if %0 >= 3 391 0000024F B903000000 <1> mov ecx, %3 391 <1> %if %0 = 4 391 00000254 BA[E20C0000] <1> mov edx, %4 391 <1> %endif 391 <1> %endif 391 <1> %endif 391 00000259 B82C000000 <1> mov eax, %1 391 <1> 391 0000025E CD40 <1> int 40h 392 ; Signal Response Byte 393 ;jc short error_exit 394 395 sys _calbac, 104h, 4, SbIrq ; IRQ 4 395 <1> 395 <1> 395 <1> 395 <1> 395 <1> %if %0 >= 2 395 00000260 BB04010000 <1> mov ebx, %2 395 <1> %if %0 >= 3 395 00000265 B904000000 <1> mov ecx, %3 395 <1> %if %0 = 4 395 0000026A BA[E20C0000] <1> mov edx, %4 395 <1> %endif 395 <1> %endif 395 <1> %endif 395 0000026F B82C000000 <1> mov eax, %1 395 <1> 395 00000274 CD40 <1> int 40h 396 ; Signal Response Byte 397 ;jc short error_exit 398 399 sys _calbac, 105h, 5, SbIrq ; IRQ 5 399 <1> 399 <1> 399 <1> 399 <1> 399 <1> %if %0 >= 2 399 00000276 BB05010000 <1> mov ebx, %2 399 <1> %if %0 >= 3 399 0000027B B905000000 <1> mov ecx, %3 399 <1> %if %0 = 4 399 00000280 BA[E20C0000] <1> mov edx, %4 399 <1> %endif 399 <1> %endif 399 <1> %endif 399 00000285 B82C000000 <1> mov eax, %1 399 <1> 399 0000028A CD40 <1> int 40h 400 ; Signal Response Byte 401 ;jc short error_exit 402 403 sys _calbac, 107h, 7, SbIrq ; IRQ 7 403 <1> 403 <1> 403 <1> 403 <1> 403 <1> %if %0 >= 2 403 0000028C BB07010000 <1> mov ebx, %2 403 <1> %if %0 >= 3 403 00000291 B907000000 <1> mov ecx, %3 403 <1> %if %0 = 4 403 00000296 BA[E20C0000] <1> mov edx, %4 403 <1> %endif 403 <1> %endif 403 <1> %endif 403 0000029B B82C000000 <1> mov eax, %1 403 <1> 403 000002A0 CD40 <1> int 40h 404 ; Signal Response Byte 405 ;jc short error_exit 406 407 000002A2 C605[E20C0000]00 mov byte [SbIrq], 0 ; clear the IRQ level. 408 409 000002A9 668B15[E00C0000] mov dx, [SbAddr] ; tells to the SB to 410 000002B0 6683C20C add dx, 0Ch ; generate a IRQ! 411 WaitSb: ;in al, dx 412 000002B4 B400 mov ah, 0 ; inb 413 000002B6 CD34 int 34h 414 000002B8 08C0 or al, al 415 000002BA 78F8 js short WaitSb 416 000002BC B0F2 mov al, 0F2h 417 ;out dx, al 418 000002BE B401 mov ah,1 ; outb 419 000002C0 CD34 int 34h 420 421 000002C2 31C9 xor ecx, ecx ; wait until IRQ level 422 WaitIRQ: 423 000002C4 803D[E20C0000]00 cmp byte [SbIrq], 0 ; is changed or timeout. 424 000002CB 7506 jne short IrqOk 425 000002CD 6649 dec cx 426 000002CF 75F3 jnz short WaitIRQ 427 000002D1 EB0F jmp short RestoreIrqs 428 IrqOk: 429 000002D3 668B15[E00C0000] mov dx, [SbAddr] 430 000002DA 6683C20E add dx, 0Eh 431 ;in al, dx ; SB acknowledge. 432 000002DE B400 mov ah, 0 ; inb 433 000002E0 CD34 int 34h 434 ;mov al, 20h 435 ;;out 20h, al ; Hardware acknowledge. 436 ;mov ah,1 ; outb 437 ;int 34h 438 439 RestoreIrqs: ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ 440 sys _calbac, 2 ; unlink IRQ 2 440 <1> 440 <1> 440 <1> 440 <1> 440 <1> %if %0 >= 2 440 000002E2 BB02000000 <1> mov ebx, %2 440 <1> %if %0 >= 3 440 <1> mov ecx, %3 440 <1> %if %0 = 4 440 <1> mov edx, %4 440 <1> %endif 440 <1> %endif 440 <1> %endif 440 000002E7 B82C000000 <1> mov eax, %1 440 <1> 440 000002EC CD40 <1> int 40h 441 ; Signal Response Byte 442 sys _calbac, 3 ; unlink IRQ 3 442 <1> 442 <1> 442 <1> 442 <1> 442 <1> %if %0 >= 2 442 000002EE BB03000000 <1> mov ebx, %2 442 <1> %if %0 >= 3 442 <1> mov ecx, %3 442 <1> %if %0 = 4 442 <1> mov edx, %4 442 <1> %endif 442 <1> %endif 442 <1> %endif 442 000002F3 B82C000000 <1> mov eax, %1 442 <1> 442 000002F8 CD40 <1> int 40h 443 ; Signal Response Byte 444 sys _calbac, 4 ; unlink IRQ 4 444 <1> 444 <1> 444 <1> 444 <1> 444 <1> %if %0 >= 2 444 000002FA BB04000000 <1> mov ebx, %2 444 <1> %if %0 >= 3 444 <1> mov ecx, %3 444 <1> %if %0 = 4 444 <1> mov edx, %4 444 <1> %endif 444 <1> %endif 444 <1> %endif 444 000002FF B82C000000 <1> mov eax, %1 444 <1> 444 00000304 CD40 <1> int 40h 445 ; Signal Response Byte 446 sys _calbac, 5 ; unlink IRQ 5 446 <1> 446 <1> 446 <1> 446 <1> 446 <1> %if %0 >= 2 446 00000306 BB05000000 <1> mov ebx, %2 446 <1> %if %0 >= 3 446 <1> mov ecx, %3 446 <1> %if %0 = 4 446 <1> mov edx, %4 446 <1> %endif 446 <1> %endif 446 <1> %endif 446 0000030B B82C000000 <1> mov eax, %1 446 <1> 446 00000310 CD40 <1> int 40h 447 ; Signal Response Byte 448 sys _calbac, 7 ; unlink IRQ 7 448 <1> 448 <1> 448 <1> 448 <1> 448 <1> %if %0 >= 2 448 00000312 BB07000000 <1> mov ebx, %2 448 <1> %if %0 >= 3 448 <1> mov ecx, %3 448 <1> %if %0 = 4 448 <1> mov edx, %4 448 <1> %endif 448 <1> %endif 448 <1> %endif 448 00000317 B82C000000 <1> mov eax, %1 448 <1> 448 0000031C CD40 <1> int 40h 449 ; Signal Response Byte 450 451 0000031E 803D[E20C0000]00 cmp byte [SbIrq], 0 ; IRQ level was changed? 452 00000325 743A je short Fail ; no, fail. 453 Success: 454 00000327 668B15[E00C0000] mov dx, [SbAddr] ; Print Sucessful message. 455 0000032E 8A0D[E20C0000] mov cl, [SbIrq] 456 00000334 C0EA04 shr dl, 4 457 00000337 80C230 add dl, '0' 458 0000033A 8815[2E0F0000] mov [PortText], dl 459 00000340 80C130 add cl, '0' 460 00000343 880D[370F0000] mov [IrqText], cl 461 462 sys _msg, MsgFound, 255, 0Fh 462 <1> 462 <1> 462 <1> 462 <1> 462 <1> %if %0 >= 2 462 00000349 BB[0E0F0000] <1> mov ebx, %2 462 <1> %if %0 >= 3 462 0000034E B9FF000000 <1> mov ecx, %3 462 <1> %if %0 = 4 462 00000353 BA0F000000 <1> mov edx, %4 462 <1> %endif 462 <1> %endif 462 <1> %endif 462 00000358 B823000000 <1> mov eax, %1 462 <1> 462 0000035D CD40 <1> int 40h 463 464 0000035F 61 popad ; Return to caller. 465 00000360 C3 retn 466 467 Fail: 468 ; Print Failed Message, 469 ; and exit to MainProg. 470 471 sys _msg, MsgNotFound, 255, 0Fh 471 <1> 471 <1> 471 <1> 471 <1> 471 <1> %if %0 >= 2 471 00000361 BB[E60E0000] <1> mov ebx, %2 471 <1> %if %0 >= 3 471 00000366 B9FF000000 <1> mov ecx, %3 471 <1> %if %0 = 4 471 0000036B BA0F000000 <1> mov edx, %4 471 <1> %endif 471 <1> %endif 471 <1> %endif 471 00000370 B823000000 <1> mov eax, %1 471 <1> 471 00000375 CD40 <1> int 40h 472 473 sys _exit 473 <1> 473 <1> 473 <1> 473 <1> 473 <1> %if %0 >= 2 473 <1> mov ebx, %2 473 <1> %if %0 >= 3 473 <1> mov ecx, %3 473 <1> %if %0 = 4 473 <1> mov edx, %4 473 <1> %endif 473 <1> %endif 473 <1> %endif 473 00000377 B801000000 <1> mov eax, %1 473 <1> 473 0000037C CD40 <1> int 40h 474 here: 475 0000037E EBFE jmp short here 476 477 ;============================================================================= 478 ; SB.ASM 479 ;============================================================================= 480 481 ; Sound Blaster DMA Driver v0.1b by Carlos Hasan. 482 ; July 24th, 1993. 483 484 ; EQUATES 485 486 DmaBufSize equ 65536 ; 12/03/2017 487 488 ; MACROS 489 490 %macro SbOut 1 491 %%Wait: 492 ;in al, dx 493 mov ah, 0 494 int 34h 495 or al, al 496 js short %%Wait 497 mov al, %1 498 ;out dx, al 499 mov ah, 1 500 int 34h 501 %endmacro 502 503 ; CODE 504 505 ;-------------------------------------------------------------------------- 506 ; SbIrqHandler: Sound Blaster IRQ handler. 507 ;-------------------------------------------------------------------------- 508 509 SbIrqHandler: ; SoundBlaster IRQ Callback service for TRDOS 386 510 ; 03/03/2017 511 512 ; 12/03/2017 513 ; 11/03/2017 514 515 00000380 668B15[E00C0000] mov dx, [SbAddr] 516 00000387 6683C20E add dx, 0Eh 517 ;in al, dx 518 ;mov ah, 0 519 0000038B 28E4 sub ah, ah 520 0000038D CD34 int 34h 521 522 ;test byte [flags], ENDOFFILE ; end of file flag 523 ;jz short a_3 524 525 ;sub dx, 02h ; 0Ch 526 527 ; exit auto-initialize 8 bit transfer 528 ;SbOut 0DAh ; exit auto-initialize transfer command 529 ;jmp short a_5 530 531 a_3: 532 0000038F 30C0 xor al, al ; 0 533 00000391 A2[5D0F0000] mov [iStatus], al 534 00000396 3805[5C0F0000] cmp [DmaFlag], al 535 0000039C 7702 ja short a_4 536 0000039E FEC0 inc al 537 a_4: 538 000003A0 A2[5C0F0000] mov [DmaFlag], al ; 539 a_5: 540 sys _rele ; return from callback service 540 <1> 540 <1> 540 <1> 540 <1> 540 <1> %if %0 >= 2 540 <1> mov ebx, %2 540 <1> %if %0 >= 3 540 <1> mov ecx, %3 540 <1> %if %0 = 4 540 <1> mov edx, %4 540 <1> %endif 540 <1> %endif 540 <1> %endif 540 000003A5 B827000000 <1> mov eax, %1 540 <1> 540 000003AA CD40 <1> int 40h 541 542 ;-------------------------------------------------------------------------- 543 ; SbPoll: Sound Blaster Polling. 544 ;-------------------------------------------------------------------------- 545 546 SbPoll: 547 000003AC 60 pushad 548 549 ; 11/03/2017 550 000003AD 803D[5D0F0000]00 cmp byte [iStatus], 0 551 000003B4 7721 ja short Bye 552 553 000003B6 C605[5D0F0000]01 mov byte [iStatus], 1 ; 1 = set before interrupt 554 ; (for preventing data load 555 ; without an interrupt) 556 557 ;test byte [flags], ENDOFFILE 558 ;jnz short sbPoll_stop 559 560 000003BD BF[00000100] mov edi, DmaBuffer 561 000003C2 BB00800000 mov ebx, DmaBufSize/2 562 563 000003C7 F605[5C0F0000]01 test byte [DmaFlag], 1 564 000003CE 7402 jz short FirstHalf 565 SecondHalf: 566 000003D0 01DF add edi, ebx 567 FirstHalf: 568 000003D2 E8E9070000 call GetSamples 569 Bye: 570 000003D7 61 popad 571 000003D8 C3 retn 572 573 ;sbPoll_stop: ; 11/03/2017 574 ; ; exit auto-initialize 8 bit transfer 575 ; SbOut 0DAh ; exit auto-initialize transfer command 576 ; ;mov byte [tLoop}, 0 577 ; jmp short Bye 578 579 ;-------------------------------------------------------------------------- 580 ; SbInit: Initializes the Sound Blaster Driver. 581 ;-------------------------------------------------------------------------- 582 583 SbInit: 584 000003D9 60 pushad 585 586 000003DA E85C080000 call StartPlaying 587 SetBuffer: 588 ;mov byte [DmaFlag], 0 589 000003DF 8B1D[90860000] mov ebx, [DMA_phy_buff] ; physical addr of DMA buff 590 000003E5 B900000100 mov ecx, DmaBufSize 591 000003EA 49 dec ecx 592 593 ; 8 bit DMA buffer setting (DMA channel 1) 594 000003EB B005 mov al, 05h ; set mask bit for channel 1 (4+1) 595 ;out 0Ah, al 596 000003ED 66BA0A00 mov dx, 0Ah ; DMA mask register 597 000003F1 B401 mov ah, 1 ;outb 598 000003F3 CD34 int 34h 599 600 000003F5 30C0 xor al, al ; stops all DMA processes on selected channel 601 ;out 0Ch, al 602 000003F7 B20C mov dl, 0Ch ; clear selected channel register 603 ;mov ah, 1 ;outb 604 000003F9 CD34 int 34h 605 606 000003FB 88D8 mov al, bl ; byte 0 of DMA buffer address (physical) 607 ;out 02h, al 608 000003FD B202 mov dl, 02h ; DMA channel 1 port number 609 ;mov ah, 1 ;outb 610 000003FF CD34 int 34h 611 612 00000401 88F8 mov al, bh ; byte 1 of DMA buffer address (physical) 613 ;out 02h, al 614 ;mov dl, 02h ; DMA channel 1 port number 615 ;mov ah, 1 ;outb 616 00000403 CD34 int 34h 617 618 00000405 C1EB10 shr ebx, 16 619 620 00000408 88D8 mov al, bl ; byte 2 of DMA buffer address (physical) 621 ;out 83h, al 622 0000040A B283 mov dl, 83h ; page register port addr for channel 1 623 ;mov ah, 1 ;outb 624 0000040C CD34 int 34h 625 626 0000040E 88C8 mov al, cl ; low byte of DMA count - 1 627 ;out 03h, al 628 00000410 B203 mov dl, 03h ; count register port addr for channel 1 629 ;mov ah, 1 ;outb 630 00000412 CD34 int 34h 631 632 00000414 88E8 mov al, ch ; high byte of DMA count - 1 633 ;out 03h, al 634 ;mov dl, 03h ; count register port addr for channel 1 635 ;mov ah, 1 ;outb 636 00000416 CD34 int 34h 637 638 ; channel 1, read, autoinitialized, single mode 639 00000418 B059 mov al, 59h ; 07/09/2017 640 ;out 0Bh, al 641 0000041A B20B mov dl, 0Bh ; DMA mode register port address 642 ;mov ah, 1 ;outb 643 0000041C CD34 int 34h 644 645 0000041E B001 mov al, 01h ; clear mask bit for channel 1 646 ;out 0Ah, al 647 00000420 B20A mov dl, 0Ah ; DMA mask register port address 648 ;mov ah, 1 ;outb 649 00000422 CD34 int 34h 650 ClearBuffer: 651 00000424 BF[00000100] mov edi, DmaBuffer ; virtual addr of DMA buff 652 ;mov ecx, DmaBufSize 653 00000429 41 inc ecx 654 0000042A B080 mov al, 80h 655 ;cld 656 0000042C F3AA rep stosb 657 SetIrq: 658 ; CALLBACK method 659 0000042E 8A1D[E20C0000] mov bl, [SbIrq] ; IRQ number 660 00000434 B702 mov bh, 2 ; Link IRQ to user for callback service 661 00000436 BA[80030000] mov edx, SbIrqHandler 662 sys _calbac 662 <1> 662 <1> 662 <1> 662 <1> 662 <1> %if %0 >= 2 662 <1> mov ebx, %2 662 <1> %if %0 >= 3 662 <1> mov ecx, %3 662 <1> %if %0 = 4 662 <1> mov edx, %4 662 <1> %endif 662 <1> %endif 662 <1> %endif 662 0000043B B82C000000 <1> mov eax, %1 662 <1> 662 00000440 CD40 <1> int 40h 663 ; SIGNAL RESPONSE BYTE method ; 04/03/2017 664 ;mov bl, [SbIrq] 665 ;mov bh, 1 ; Signal Response Byte method 666 ;movzx ecx, bl ; S.R.B. value = IRQ Number 667 ;mov edx, SbSrb ; S.R.B. address 668 ;sys _calbac 669 ResetDsp: 670 00000442 668B15[E00C0000] mov dx, [SbAddr] 671 00000449 6683C206 add dx, 06h 672 0000044D B001 mov al, 1 673 ;out dx, al 674 0000044F B401 mov ah, 1 ;outb 675 00000451 CD34 int 34h 676 677 ;in al, dx 678 ;in al, dx 679 ;in al, dx 680 ;in al, dx 681 682 00000453 FECC dec ah ; ah = 0 ; inb 683 00000455 CD34 int 34h 684 ;mov ah, 0 685 00000457 CD34 int 34h 686 687 00000459 30C0 xor al, al 688 ;out dx, al 689 0000045B FEC4 inc ah ; ah = 1 ;outb 690 0000045D CD34 int 34h 691 692 0000045F 66B96400 mov cx, 100 693 00000463 28E4 sub ah, ah ; 0 694 WaitId: 695 00000465 668B15[E00C0000] mov dx, [SbAddr] 696 0000046C 6683C20E add dx, 0Eh 697 ;in al, dx 698 ;mov ah, 0 ;inb 699 00000470 CD34 int 34h 700 00000472 08C0 or al, al 701 00000474 7807 js short sb_GetId 702 00000476 E2ED loop WaitId 703 00000478 E9B2000000 jmp sb_Exit 704 sb_GetId: 705 0000047D 668B15[E00C0000] mov dx, [SbAddr] 706 00000484 6683C20A add dx, 0Ah 707 ;in al, dx 708 ;mov ah, 0 ;inb 709 00000488 CD34 int 34h 710 0000048A 3CAA cmp al, 0AAh 711 0000048C 7407 je short SbOk 712 0000048E E2D5 loop WaitId 713 00000490 E99A000000 jmp sb_Exit 714 SbOk: 715 00000495 668B15[E00C0000] mov dx, [SbAddr] 716 0000049C 6683C20C add dx, 0Ch 717 SbOut 0D1h 717 <1> %%Wait: 717 <1> 717 000004A0 B400 <1> mov ah, 0 717 000004A2 CD34 <1> int 34h 717 000004A4 08C0 <1> or al, al 717 000004A6 78F8 <1> js short %%Wait 717 000004A8 B0D1 <1> mov al, %1 717 <1> 717 000004AA B401 <1> mov ah, 1 717 000004AC CD34 <1> int 34h 718 719 ; 11/03/2017 720 SbOut 41h ; 8 bit or 16 bit transfer 720 <1> %%Wait: 720 <1> 720 000004AE B400 <1> mov ah, 0 720 000004B0 CD34 <1> int 34h 720 000004B2 08C0 <1> or al, al 720 000004B4 78F8 <1> js short %%Wait 720 000004B6 B041 <1> mov al, %1 720 <1> 720 000004B8 B401 <1> mov ah, 1 720 000004BA CD34 <1> int 34h 721 000004BC 668B1D[9E130000] mov bx, [sampling_rate] 722 SbOut bh ; sampling rate high byte 722 <1> %%Wait: 722 <1> 722 000004C3 B400 <1> mov ah, 0 722 000004C5 CD34 <1> int 34h 722 000004C7 08C0 <1> or al, al 722 000004C9 78F8 <1> js short %%Wait 722 000004CB 88F8 <1> mov al, %1 722 <1> 722 000004CD B401 <1> mov ah, 1 722 000004CF CD34 <1> int 34h 723 SbOut bl ; sampling rate low byte 723 <1> %%Wait: 723 <1> 723 000004D1 B400 <1> mov ah, 0 723 000004D3 CD34 <1> int 34h 723 000004D5 08C0 <1> or al, al 723 000004D7 78F8 <1> js short %%Wait 723 000004D9 88D8 <1> mov al, %1 723 <1> 723 000004DB B401 <1> mov ah, 1 723 000004DD CD34 <1> int 34h 724 725 ; 22/04/2017 726 ;mov ah, 1 727 ;mov dx, [SbAddr] 728 ;add dx, 4 ; Mixer chip address port 729 000004DF 6683EA08 sub dx, 0Ch-04h 730 000004E3 B022 mov al, 22h ; master volume 731 000004E5 CD34 int 34h 732 000004E7 6642 inc dx 733 000004E9 B0FF mov al, 0FFh ; maximum volume level 734 000004EB CD34 int 34h 735 000004ED 6683C207 add dx, 0Ch-05h 736 StartDma: 737 ; autoinitialized 8 bit DMA transfer mode 738 ;mov bx, 0C6h ; 8 bit output (0C6h) 739 ; PCM output (8 bit mono autoinitialized transfer) 740 ;SbOut bl ; bCommand 741 ;SbOut bh ; bMode 742 SbOut 0C6h ; bCommand (C6h = 8 bit autoinitialzed) 742 <1> %%Wait: 742 <1> 742 000004F1 B400 <1> mov ah, 0 742 000004F3 CD34 <1> int 34h 742 000004F5 08C0 <1> or al, al 742 000004F7 78F8 <1> js short %%Wait 742 000004F9 B0C6 <1> mov al, %1 742 <1> 742 000004FB B401 <1> mov ah, 1 742 000004FD CD34 <1> int 34h 743 SbOut 0 ; bMode (0 = 8 bit mono) 743 <1> %%Wait: 743 <1> 743 000004FF B400 <1> mov ah, 0 743 00000501 CD34 <1> int 34h 743 00000503 08C0 <1> or al, al 743 00000505 78F8 <1> js short %%Wait 743 00000507 B000 <1> mov al, %1 743 <1> 743 00000509 B401 <1> mov ah, 1 743 0000050B CD34 <1> int 34h 744 0000050D 66BB0080 mov bx, DmaBufSize / 2 745 00000511 664B dec bx ; wBlkSize is one less than the actual size 746 SbOut bl 746 <1> %%Wait: 746 <1> 746 00000513 B400 <1> mov ah, 0 746 00000515 CD34 <1> int 34h 746 00000517 08C0 <1> or al, al 746 00000519 78F8 <1> js short %%Wait 746 0000051B 88D8 <1> mov al, %1 746 <1> 746 0000051D B401 <1> mov ah, 1 746 0000051F CD34 <1> int 34h 747 SbOut bh 747 <1> %%Wait: 747 <1> 747 00000521 B400 <1> mov ah, 0 747 00000523 CD34 <1> int 34h 747 00000525 08C0 <1> or al, al 747 00000527 78F8 <1> js short %%Wait 747 00000529 88F8 <1> mov al, %1 747 <1> 747 0000052B B401 <1> mov ah, 1 747 0000052D CD34 <1> int 34h 748 sb_Exit: 749 0000052F 61 popad 750 00000530 C3 retn 751 752 ;-------------------------------------------------------------------------- 753 ; SbDone: Shut Down the Sound Blaster Driver. 754 ;-------------------------------------------------------------------------- 755 756 SbDone: 757 00000531 60 pushad 758 759 00000532 8A1D[E20C0000] mov bl, [SbIrq] ; IRQ number 760 00000538 28FF sub bh, bh ; 0 = Unlink IRQ from user 761 sys _calbac 761 <1> 761 <1> 761 <1> 761 <1> 761 <1> %if %0 >= 2 761 <1> mov ebx, %2 761 <1> %if %0 >= 3 761 <1> mov ecx, %3 761 <1> %if %0 = 4 761 <1> mov edx, %4 761 <1> %endif 761 <1> %endif 761 <1> %endif 761 0000053A B82C000000 <1> mov eax, %1 761 <1> 761 0000053F CD40 <1> int 40h 762 763 00000541 668B15[E00C0000] mov dx, [SbAddr] 764 00000548 6683C20C add dx, 0Ch 765 SbOut 0D0h 765 <1> %%Wait: 765 <1> 765 0000054C B400 <1> mov ah, 0 765 0000054E CD34 <1> int 34h 765 00000550 08C0 <1> or al, al 765 00000552 78F8 <1> js short %%Wait 765 00000554 B0D0 <1> mov al, %1 765 <1> 765 00000556 B401 <1> mov ah, 1 765 00000558 CD34 <1> int 34h 766 SbOut 0D3h 766 <1> %%Wait: 766 <1> 766 0000055A B400 <1> mov ah, 0 766 0000055C CD34 <1> int 34h 766 0000055E 08C0 <1> or al, al 766 00000560 78F8 <1> js short %%Wait 766 00000562 B0D3 <1> mov al, %1 766 <1> 766 00000564 B401 <1> mov ah, 1 766 00000566 CD34 <1> int 34h 767 768 00000568 E872070000 call StopPlaying 769 770 0000056D 61 popad 771 0000056E C3 retn 772 773 ;============================================================================= 774 ; MODLOAD.ASM 775 ;============================================================================= 776 777 ; Amiga Module Loader v0.1b by Carlos Hasan. 778 ; July 10th, 1993. 779 780 ; STRUCTURES 781 782 struc ModSample 783 00000000 .msName: resb 22 784 00000016 .msLength: resw 1 785 00000018 .msFinetune: resb 1 786 00000019 .msVolume: resb 1 787 0000001A .msRepeat: resw 1 788 0000001C .msRepLen: resw 1 789 .size: 790 endstruc 791 792 struc ModHeader 793 00000000 .mhName: resb 20 794 00000014 .mhSamples: resb ModSample.size*31 795 000003B6 .mhOrderLen: resb 1 796 000003B7 .mhReStart: resb 1 797 000003B8 .mhOrder: resb 128 798 00000438 .mhSign: resw 2 799 .size: 800 endstruc 801 802 struc ModInfoRec 803 00000000 .OrderLen: resb 1 804 00000001 .ReStart: resb 1 805 00000002 .Order: resb 128 806 00000082 .Patterns: resd 1 807 00000086 .SampOfs: resw 31 808 000000C4 .SampSeg: resw 31 809 00000102 .SampLen: resw 31 810 00000140 .SampRep: resw 31 811 0000017E .SampRepLen: resw 31 812 000001BC .SampVol: resw 31 813 .size: 814 endstruc 815 816 ; CODE 817 818 LoadModule: 819 ; edi = file name address 820 821 0000056F 60 pushad 822 823 ;call ClearModInfo ; 07/10/2017 (not necessary.) 824 OpenFile: 825 ; ebx = ASCIIZ file name address 826 ; ecx = open mode (0 = open for read) 827 sys _open, edi, 0 ; open for reading 827 <1> 827 <1> 827 <1> 827 <1> 827 <1> %if %0 >= 2 827 00000570 89FB <1> mov ebx, %2 827 <1> %if %0 >= 3 827 00000572 B900000000 <1> mov ecx, %3 827 <1> %if %0 = 4 827 <1> mov edx, %4 827 <1> %endif 827 <1> %endif 827 <1> %endif 827 00000577 B805000000 <1> mov eax, %1 827 <1> 827 0000057C CD40 <1> int 40h 828 0000057E 0F8244010000 jc Failed 829 00000584 A3[5E0F0000] mov [FileHandle], eax 830 ReadHeader: 831 ; ebx = File handle 832 ; ecx = Buffer address 833 ; edx = Byte count 834 sys _read, [FileHandle], Header, ModHeader.size 834 <1> 834 <1> 834 <1> 834 <1> 834 <1> %if %0 >= 2 834 00000589 8B1D[5E0F0000] <1> mov ebx, %2 834 <1> %if %0 >= 3 834 0000058F B9[620F0000] <1> mov ecx, %3 834 <1> %if %0 = 4 834 00000594 BA3C040000 <1> mov edx, %4 834 <1> %endif 834 <1> %endif 834 <1> %endif 834 00000599 B803000000 <1> mov eax, %1 834 <1> 834 0000059E CD40 <1> int 40h 835 000005A0 0F8213010000 jc CloseFile 836 CheckMK: 837 000005A6 813D[9A130000]4D2E- cmp dword [Header+ModHeader.mhSign], 'M.K.' 837 000005AE 4B2E 838 000005B0 7412 je short IsModFile 839 CheckFLT4: 840 000005B2 813D[9A130000]464C- cmp dword [Header+ModHeader.mhSign], 'FLT4' 840 000005BA 5434 841 000005BC 7406 je short IsModFile 842 ; 07/10/2017 843 000005BE F9 stc 844 000005BF E9F5000000 jmp CloseFile 845 IsModFile: 846 000005C4 A0[18130000] mov al, [Header+ModHeader.mhOrderLen] 847 000005C9 A2[A0130000] mov [ModInfo.OrderLen], al 848 849 000005CE A0[19130000] mov al, [Header+ModHeader.mhReStart] 850 000005D3 3A05[18130000] cmp al, [Header+ModHeader.mhOrderLen] 851 000005D9 7202 jb short SetReStart 852 000005DB B07F mov al, 7Fh 853 SetReStart: 854 000005DD A2[A1130000] mov [ModInfo.ReStart], al 855 856 ;mov ecx, 128 857 000005E2 66B98000 mov cx, 128 858 000005E6 31D2 xor edx, edx 859 000005E8 31DB xor ebx, ebx 860 CopyOrder: 861 000005EA 8AB3[1A130000] mov dh, [Header+ModHeader.mhOrder+ebx] 862 000005F0 88B3[A2130000] mov [ModInfo.Order+ebx], dh 863 000005F6 38D6 cmp dh, dl 864 000005F8 7202 jb short NextOrder 865 000005FA 88F2 mov dl, dh 866 NextOrder: 867 000005FC 43 inc ebx 868 000005FD E2EB loop CopyOrder 869 AllocPatterns: 870 000005FF 81E2FF000000 and edx, 0FFh 871 ;inc dx 872 00000605 FEC2 inc dl ; 07/10/2017 873 ; dl = count of 1024 bytes ; count of patterns (04/07/2017) 874 00000607 C1E20A shl edx, 10 ; *1024 ; (count of patterns *64*16) 875 876 0000060A 89D5 mov ebp, edx ; offset of samples (04/07/2017) 877 ;mov ecx, 10000h ; next 64K (4096*16) 878 0000060C B9[00000200] mov ecx, file_buffer ; 12/03/2017 879 ; 880 00000611 890D[22140000] mov [ModInfo.Patterns], ecx 881 ; 882 00000617 01CD add ebp, ecx ; next offset for samples 883 ReadPatterns: 884 ;mov ebx, [FileHandle] 885 ; ebx = File handle 886 ; ecx = Buffer address 887 ; edx = Byte count 888 sys _read, [FileHandle] 888 <1> 888 <1> 888 <1> 888 <1> 888 <1> %if %0 >= 2 888 00000619 8B1D[5E0F0000] <1> mov ebx, %2 888 <1> %if %0 >= 3 888 <1> mov ecx, %3 888 <1> %if %0 = 4 888 <1> mov edx, %4 888 <1> %endif 888 <1> %endif 888 <1> %endif 888 0000061F B803000000 <1> mov eax, %1 888 <1> 888 00000624 CD40 <1> int 40h 889 00000626 0F828D000000 jc CloseFile 890 891 ; paterns have been loaded here... (04/07/2017) 892 893 0000062C BE[760F0000] mov esi, Header+ModHeader.mhSamples 894 00000631 31FF xor edi, edi 895 CopySamples: 896 00000633 668B4616 mov ax, [esi+ModSample.msLength] 897 00000637 86C4 xchg al, ah 898 00000639 66D1E0 shl ax, 1 899 0000063C 668987[A2140000] mov [ModInfo.SampLen+edi], ax 900 00000643 8A4619 mov al, [esi+ModSample.msVolume] 901 00000646 30E4 xor ah, ah 902 00000648 668987[5C150000] mov [ModInfo.SampVol+edi], ax 903 0000064F 668B461A mov ax, [esi+ModSample.msRepeat] 904 00000653 86C4 xchg al, ah 905 00000655 66D1E0 shl ax, 1 906 00000658 668987[E0140000] mov [ModInfo.SampRep+edi], ax 907 0000065F 668B461C mov ax, [esi+ModSample.msRepLen] 908 00000663 86C4 xchg al, ah 909 00000665 66D1E0 shl ax, 1 910 00000668 668987[1E150000] mov [ModInfo.SampRepLen+edi], ax 911 0000066F 83C61E add esi, ModSample.size 912 00000672 6683C702 add di, 2 913 00000676 6683FF3E cmp di, 2*31 914 0000067A 72B7 jb short CopySamples 915 916 0000067C 31F6 xor esi, esi 917 AllocSamples: 918 0000067E 0FB796[A2140000] movzx edx, word [ModInfo.SampLen+esi] 919 ; 07/10/2017 920 ;shr dx, 4 ; *** 921 00000685 21D2 and edx, edx 922 00000687 7426 jz short NextSample 923 ;inc dx ; number of paragraphs ; *** 924 ;shl dx, 4 ; *** 925 00000689 89E8 mov eax, ebp 926 0000068B 668986[26140000] mov [ModInfo.SampOfs+esi], ax 927 00000692 C1E810 shr eax, 16 928 00000695 668986[64140000] mov [ModInfo.SampSeg+esi], ax 929 0000069C 89E9 mov ecx, ebp 930 0000069E 01D5 add ebp, edx ; next offset for sample 931 ReadSample: 932 ;mov ebx, [FileHandle] 933 ;movzx edx, [ModInfo.SampLen+esi] 934 ;mov ecx, [ModInfo.SampOfs+esi] 935 936 ; ebx = File handle 937 ; ecx = Buffer address 938 ; edx = Byte count 939 sys _read, [FileHandle] 939 <1> 939 <1> 939 <1> 939 <1> 939 <1> %if %0 >= 2 939 000006A0 8B1D[5E0F0000] <1> mov ebx, %2 939 <1> %if %0 >= 3 939 <1> mov ecx, %3 939 <1> %if %0 = 4 939 <1> mov edx, %4 939 <1> %endif 939 <1> %endif 939 <1> %endif 939 000006A6 B803000000 <1> mov eax, %1 939 <1> 939 000006AB CD40 <1> int 40h 940 000006AD 720A jc short CloseFile 941 942 NextSample: 943 000006AF 6683C602 add si, 2 944 000006B3 6683FE3E cmp si, 2*31 945 000006B7 72C5 jb short AllocSamples 946 CloseFile: 947 000006B9 9C pushf 948 sys _close, [FileHandle] 948 <1> 948 <1> 948 <1> 948 <1> 948 <1> %if %0 >= 2 948 000006BA 8B1D[5E0F0000] <1> mov ebx, %2 948 <1> %if %0 >= 3 948 <1> mov ecx, %3 948 <1> %if %0 = 4 948 <1> mov edx, %4 948 <1> %endif 948 <1> %endif 948 <1> %endif 948 000006C0 B806000000 <1> mov eax, %1 948 <1> 948 000006C5 CD40 <1> int 40h 949 000006C7 9D popf 950 Failed: 951 000006C8 61 popad 952 953 000006C9 C3 retn 954 955 FreeModule: 956 ; Erdogan Tan (13/02/2017) 957 ; nothing to do here for memory de-allocation 958 ClearModInfo: 959 000006CA 57 push edi 960 000006CB BF[A0130000] mov edi, ModInfo 961 000006D0 B9FA010000 mov ecx, ModInfoRec.size 962 ;cld 963 000006D5 30C0 xor al, al 964 000006D7 F3AA rep stosb 965 000006D9 5F pop edi 966 000006DA C3 retn 967 968 ;============================================================================= 969 ; MODPLAY.ASM 970 ;============================================================================= 971 972 ; Amiga Module Loader v0.3b by Carlos Hasan. 973 ; July 23th, 1993. 974 975 ; EQUATES 976 977 NumTracks equ 4 978 DefTempo equ 6 979 DefBpm equ 125 980 MidCRate equ 8448 981 MixBufSize equ 4096 982 983 ; STRUCTURES 984 985 struc TrackInfo ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan 986 00000000 .Samples: resd 1 987 ;.Position: resw 1 988 00000004 .Position: resd 1 ; 01/10/2017 - TRDOS 386 modification ! 989 00000008 .Len: resw 1 990 0000000A .Repeat: resw 1 991 0000000C .RepLen: resw 1 992 0000000E .Volume: resb 1 ; Volume 993 0000000F .VolDiff: resb 1 ; 01/10/2017 ; Volume difference (Tremolo) 994 ;.Error: resb 1 995 ;.Reserved: resb 1 ; 01/10/2017 996 00000010 .Period: resw 1 ; Period 997 00000012 .Pitch: resw 1 998 00000014 .Effect: resw 1 ; Effect 999 00000016 .PortTo: resw 1 ; Toneporta wanted period 1000 00000018 .PortParm: resb 1 ; Toneporta speed 1001 00000019 .VibPos: resb 1 ; Vibrato wave position 1002 0000001A .VibParm: resb 1 ; Vibrato depth/rate 1003 0000001B .TremPos: resb 1 ; 01/10/2017 ; Tremolo wave position 1004 0000001C .TremParm: resb 1 ; 01/10/2017 ; Tremolo depth/rate 1005 ;.OldSampOfs: resb 1 ; ******* ; 01/10/2017 1006 0000001D .Error: resb 1 ; 01/10/2017 1007 0000001E .Arp: resw 3 1008 00000024 .ArpIndex: resw 1 1009 .size: ; 38 bytes ; 01/10/2017 - TRDOS 386 1010 endstruc 1011 1012 ; CODE 1013 1014 ;-------------------------------------------------------------------------- 1015 ; updatechannel - update the track using the current effect 1016 ;-------------------------------------------------------------------------- 1017 ; 1018 ;-------------------------------------------------------------------------- 1019 ; BeatTrack: Process the next beat in one track. 1020 ; In: 1021 ; ds:di - Track info Address. 1022 ;-------------------------------------------------------------------------- 1023 1024 ; edi = Track info address 1025 1026 updatechannel: 1027 BeatTrack: ; updatechannel ; 01/10/2017 (TMODPLAY.ASM) 1028 1029 000006DB 668B5714 mov dx, [edi+TrackInfo.Effect] 1030 1031 ;test dx, dx 1032 ;je short None 1033 ;cmp dh, 00h 1034 ;je short Arpeggio 1035 ;cmp dh, 01h 1036 ;je short PortUp 1037 ;cmp dh, 02h 1038 ;je short PortDown 1039 ;cmp dh, 03h 1040 ;je TonePort 1041 ;cmp dh, 04h 1042 ;je Vibrato 1043 ;cmp dh, 05h 1044 ;je PortSlide 1045 ;cmp dh, 06h 1046 ;je VibSlide 1047 ;cmp dh, 0Ah 1048 ;je VolSlide 1049 ;retn 1050 1051 000006DF 0FB6C6 movzx eax, dh 1052 000006E2 240F and al, 0Fh 1053 000006E4 FF2485[240D0000] jmp dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits) 1054 efxnull: 1055 None: 1056 000006EB C3 retn 1057 efxarpeggio2: 1058 ; 01/10/2017 1059 000006EC 84D2 test dl, dl 1060 000006EE 74FB jz short efxnull 1061 Arpeggio: 1062 000006F0 0FB75F24 movzx ebx, word [edi+TrackInfo.ArpIndex] 1063 000006F4 668B441F1E mov ax, [edi+TrackInfo.Arp+ebx] 1064 000006F9 66894712 mov [edi+TrackInfo.Pitch], ax 1065 000006FD 6683C302 add bx, 2 1066 00000701 6683FB06 cmp bx, 6 1067 00000705 7202 jb short SetArpIndex 1068 00000707 31DB xor ebx, ebx 1069 SetArpIndex: 1070 00000709 66895F24 mov [edi+TrackInfo.ArpIndex], bx 1071 0000070D C3 retn 1072 efxportaup: 1073 PortUp: 1074 0000070E 30F6 xor dh, dh 1075 ;mov bx, [edi+TrackInfo.Period] 1076 00000710 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 1077 00000714 6629D3 sub bx, dx 1078 ;cmp bx, 113 1079 00000717 6683FB1C cmp bx, 28 ; 01/10/2017 1080 0000071B 7D04 jge short NotSmall 1081 ;mov bx, 113 1082 0000071D 66BB1C00 mov bx, 28 ; 01/10/2017 1083 NotSmall: 1084 00000721 66895F10 mov [edi+TrackInfo.Period], bx 1085 00000725 6601DB add bx, bx 1086 ;mov ax, [PitchTable+bx] 1087 00000728 668B83[9A150000] mov ax, [PitchTable+ebx] ; 02/10/2017 1088 0000072F 66894712 mov [edi+TrackInfo.Pitch], ax 1089 00000733 C3 retn 1090 efxportadown: 1091 PortDown: 1092 00000734 30F6 xor dh, dh 1093 ;mov bx, [edi+TrackInfo.Period] 1094 00000736 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 1095 0000073A 6601D3 add bx, dx 1096 0000073D 6681FB600D cmp bx, 3424 ; 01/10/2017 1097 ;cmp bx, 856 1098 00000742 7E04 jle short NotBig 1099 ;mov bx, 856 1100 00000744 66BB600D mov bx, 3424 ; 01/10/2017 1101 NotBig: 1102 00000748 66895F10 mov [edi+TrackInfo.Period], bx 1103 0000074C 6601DB add bx, bx 1104 ;mov ax, [PitchTable+bx] 1105 0000074F 668B83[9A150000] mov ax, [PitchTable+ebx] ; 02/10/2017 1106 00000756 66894712 mov [edi+TrackInfo.Pitch], ax 1107 0000075A C3 retn 1108 efxtoneporta2: 1109 TonePort: 1110 0000075B 30F6 xor dh, dh 1111 0000075D 668B4716 mov ax, [edi+TrackInfo.PortTo] 1112 ;mov bx, [edi+TrackInfo.Period] 1113 00000761 0FB75F10 movzx ebx, word [edi+TrackInfo.Period] ; 02/10/2017 1114 00000765 6639C3 cmp bx, ax 1115 00000768 7429 je short NoPort 1116 0000076A 7F0D jg short PortToUp 1117 PortToDown: 1118 0000076C 6601D3 add bx, dx 1119 0000076F 6639C3 cmp bx, ax 1120 00000772 7E0D jle short SetPort 1121 FixPort: 1122 00000774 6689C3 mov bx, ax 1123 00000777 EB08 jmp short SetPort 1124 PortToUp: 1125 00000779 6629D3 sub bx, dx 1126 0000077C 6639C3 cmp bx, ax 1127 0000077F 7CF3 jl short FixPort 1128 SetPort: 1129 00000781 66895F10 mov [edi+TrackInfo.Period], bx 1130 00000785 6601DB add bx, bx 1131 ;mov ax, [PitchTable+bx] 1132 00000788 668B83[9A150000] mov ax, [PitchTable+ebx] ; 02/10/2017 1133 0000078F 66894712 mov [edi+TrackInfo.Pitch], ax 1134 NoPort: 1135 00000793 C3 retn 1136 efxvibrato2: 1137 ; 01/10/2017 1138 Vibrato: 1139 00000794 88D6 mov dh, dl 1140 ;and dl, 0Fh 1141 ;shr dh, 4 1142 ;shl dh, 2 1143 00000796 6681E20FF0 and dx, 0F00Fh 1144 0000079B C0EE02 shr dh, 2 1145 ;add [edi+TrackInfo.VibPos], dh 1146 ;mov dh, [edi+TrackInfo.VibPos] 1147 ;mov bl, dh 1148 0000079E 8A5F19 mov bl, [edi+TrackInfo.VibPos] ; 01/10/2017 1149 000007A1 007719 add [edi+TrackInfo.VibPos], dh 1150 000007A4 88DE mov dh, bl ; 01/10/2017 1151 000007A6 C0EB02 shr bl, 2 1152 ;and bx, 1Fh 1153 ;mov al, [SinTable+bx] 1154 000007A9 83E31F and ebx, 1Fh 1155 000007AC 8A83[0C0E0000] mov al, [SinTable+ebx] 1156 000007B2 F6E2 mul dl 1157 ;rol ax, 1 1158 ;xchg al, ah 1159 ;and ah, 1 1160 000007B4 66C1E807 shr ax, 7 1161 000007B8 84F6 test dh, dh 1162 000007BA 7903 jns short VibUp 1163 000007BC 66F7D8 neg ax 1164 VibUp: 1165 000007BF 66034710 add ax, [edi+TrackInfo.Period] 1166 000007C3 6689C3 mov bx, ax 1167 ;movzx ebx, ax 1168 000007C6 6683FB71 cmp bx, 113 1169 ;cmp bx, 113 1170 000007CA 6683FB1C cmp bx, 28 ; 01/10/2017 1171 000007CE 7D06 jge short NoLoVib 1172 ;mov bx, 113 1173 000007D0 66BB1C00 mov bx, 28 ; 01/10/2017 1174 000007D4 EB0B jmp short NoHiVib ; 01/10/2017 1175 NoLoVib: 1176 000007D6 6681FB600D cmp bx, 3424 ; 01/10/2017 1177 ;cmp bx, 856 1178 000007DB 7E04 jle short NoHiVib 1179 ;mov bx, 856 1180 000007DD 66BB600D mov bx, 3424 ; 01/10/2017 1181 NoHiVib: 1182 000007E1 6601DB add bx, bx 1183 ;mov ax, [PitchTable+bx] 1184 000007E4 668B83[9A150000] mov ax, [PitchTable+ebx] ; 01/10/2017 1185 000007EB 66894712 mov [edi+TrackInfo.Pitch], ax 1186 000007EF C3 retn 1187 efxtoneslide: 1188 PortSlide: 1189 000007F0 E812000000 call VolSlide 1190 000007F5 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1191 000007F8 E95EFFFFFF jmp TonePort ; efxtoneporta2 1192 efxvibslide: 1193 VibSlide: 1194 000007FD E805000000 call VolSlide 1195 00000802 8A571A mov dl, [edi+TrackInfo.VibParm] 1196 00000805 EB8D jmp short Vibrato ; efxvibrato2 1197 efxvolslide: 1198 VolSlide: 1199 00000807 88D6 mov dh, dl 1200 00000809 80E20F and dl, 0Fh 1201 0000080C C0EE04 shr dh, 4 1202 0000080F 8A470E mov al, [edi+TrackInfo.Volume] 1203 00000812 28D0 sub al, dl 1204 00000814 7D02 jge short NoLoVol 1205 00000816 30C0 xor al, al 1206 NoLoVol: 1207 00000818 00F0 add al, dh 1208 0000081A 3C40 cmp al, 64 1209 0000081C 7602 jbe short NoHiVol 1210 0000081E B040 mov al, 64 1211 NoHiVol: 1212 00000820 88470E mov [edi+TrackInfo.Volume], al 1213 00000823 C3 retn 1214 1215 efxtremolo2: 1216 ; 01/10/2017 (TMODPLAY.ASM) 1217 Tremolo: 1218 00000824 88D6 mov dh, dl 1219 00000826 6681E20FF0 and dx, 0F00Fh 1220 0000082B C0EE02 shr dh, 2 1221 0000082E 8A5F1B mov bl, [edi+TrackInfo.TremPos] 1222 00000831 00771B add [edi+TrackInfo.TremPos], dh 1223 00000834 88DE mov dh, bl 1224 00000836 C0EB02 shr bl, 2 1225 ; 01/10/2017 - TRDOS 386 1226 ;and bx, 1Fh 1227 00000839 83E31F and ebx, 1Fh 1228 ;mov al, [SinTable+bx] 1229 0000083C 8A83[0C0E0000] mov al, [SinTable+ebx] 1230 00000842 F6E2 mul dl 1231 00000844 66C1E806 shr ax, 6 1232 00000848 84F6 test dh, dh 1233 0000084A 7D03 jge short Tremolo_1 ; efxtremolof2 1234 0000084C 66F7D8 neg ax 1235 efxtremolof2: 1236 Tremolo_1: 1237 0000084F 8A670E mov ah, [edi+TrackInfo.Volume] 1238 00000852 00E0 add al, ah 1239 00000854 7D02 jge short Tremolo_2 ; efxtremolof3 1240 00000856 30C0 xor al, al 1241 efxtremolof3: 1242 Tremolo_2: 1243 00000858 3C40 cmp al, 64 ; 40h 1244 0000085A 7E02 jle short Tremolo_3 ; efxtremolof4 1245 0000085C B040 mov al, 64 ; 40h 1246 efxtremolof4: 1247 Tremolo_3: 1248 0000085E 28E0 sub al, ah ; ****** 1249 00000860 88470F mov [edi+TrackInfo.VolDiff], al 1250 00000863 C3 retn 1251 1252 ;-------------------------------------------------------------------------- 1253 ; readchannel - read the next note event from the pattern sheet 1254 ;-------------------------------------------------------------------------- 1255 ; 1256 ;-------------------------------------------------------------------------- 1257 ; GetTrack: Get the next Note from a pattern. 1258 ; In: 1259 ; ds:di - Track info Address. 1260 ; es:si - Pattern Note Address. 1261 ; Out: 1262 ; es:si - The Next Pattern Note address. 1263 ;-------------------------------------------------------------------------- 1264 1265 ; esi = Pattern note address 1266 ; edi = Track info address 1267 1268 readchannel: 1269 GetTrack: ; readchannel ; 01/10/2017 (TMODPLAY.ASM) 1270 00000864 66AD lodsw 1271 00000866 86C4 xchg al, ah 1272 00000868 88E3 mov bl, ah 1273 0000086A 80E40F and ah, 0Fh 1274 0000086D 6689C1 mov cx, ax 1275 00000870 66AD lodsw 1276 00000872 86C4 xchg al, ah 1277 00000874 88E7 mov bh, ah 1278 00000876 80E40F and ah, 0Fh 1279 00000879 6689C2 mov dx, ax 1280 0000087C 66895714 mov [edi+TrackInfo.Effect], dx 1281 ; 01/10/2017 - TRDOS 386 1282 ;and bl, 0F0h 1283 00000880 81E3F0FF0000 and ebx, 0FFF0h 1284 00000886 C0EF04 shr bh, 4 1285 00000889 08FB or bl, bh 1286 0000088B 7446 jz short SetPeriod 1287 SetSample: 1288 0000088D 30FF xor bh, bh 1289 ;and ebx, 0FFh 1290 0000088F FECB dec bl 1291 00000891 01DB add ebx, ebx 1292 00000893 668B83[5C150000] mov ax, [ModInfo.SampVol+ebx] 1293 0000089A 88470E mov [edi+TrackInfo.Volume], al 1294 0000089D 668B83[26140000] mov ax, [ModInfo.SampOfs+ebx] 1295 000008A4 668907 mov [edi+TrackInfo.Samples], ax 1296 000008A7 668B83[64140000] mov ax, [ModInfo.SampSeg+ebx] 1297 000008AE 66894702 mov [edi+TrackInfo.Samples+2], ax 1298 000008B2 668B83[A2140000] mov ax, [ModInfo.SampLen+ebx] 1299 000008B9 66894708 mov [edi+TrackInfo.Len], ax 1300 000008BD 668B83[E0140000] mov ax, [ModInfo.SampRep+ebx] 1301 000008C4 6689470A mov [edi+TrackInfo.Repeat], ax 1302 000008C8 668B83[1E150000] mov ax, [ModInfo.SampRepLen+ebx] 1303 000008CF 6689470C mov [edi+TrackInfo.RepLen], ax 1304 SetPeriod: 1305 000008D3 6685C9 test cx, cx 1306 000008D6 7425 jz short SetEffect 1307 1308 000008D8 66894F16 mov [edi+TrackInfo.PortTo], cx ; * 1309 1310 000008DC 80FE03 cmp dh, 03h 1311 ;je short SetEffect 1312 000008DF 7428 je short efxtoneporta ; 01/10/2017 1313 1314 000008E1 66894F10 mov [edi+TrackInfo.Period], cx 1315 ;movzx ebx, cx 1316 000008E5 6689CB mov bx, cx 1317 000008E8 6601DB add bx, bx 1318 ;mov ax, [PitchTable+bx] 1319 000008EB 668B83[9A150000] mov ax, [PitchTable+ebx] ; 01/10/2017 1320 000008F2 66894712 mov [edi+TrackInfo.Pitch], ax 1321 000008F6 C7470400000000 mov dword [edi+TrackInfo.Position], 0 1322 SetEffect: 1323 ;test dx, dx 1324 ;je short InitNone 1325 ;cmp dh, 00h 1326 ;je InitArpeggio 1327 ;cmp dh, 03h 1328 ;je short InitTonePort 1329 ;cmp dh, 04h 1330 ;je short InitVibrato 1331 ;cmp dh, 09h 1332 ;je short SampleOfs 1333 ;cmp dh, 0Bh 1334 ;je short PosJump 1335 ;cmp dh, 0Ch 1336 ;je short SetVolume 1337 ;cmp dh, 0Dh 1338 ;je short Break 1339 ;cmp dh, 0Fh 1340 ;je SetSpeed 1341 ;retn 1342 1343 ; 01/10/2017 (TMODPLAY.ASM) 1344 1345 ; dx = [di+TrackInfo.Effect] 1346 1347 000008FD 0FB6C6 movzx eax, dh 1348 00000900 240F and al, 0Fh 1349 00000902 FF2485[E40C0000] jmp dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits) 1350 ;efxnull: 1351 ;InitNone: 1352 ; retn 1353 efxtoneporta: 1354 ; 01/10/2017 1355 ; cx = period 1356 ;mov [edi+TrackInfo.PortTo], cx ; * 1357 InitTonePort: 1358 00000909 84D2 test dl, dl 1359 0000090B 7503 jnz short SetPortParm 1360 0000090D 8A5718 mov dl, [edi+TrackInfo.PortParm] ; .tonespeed 1361 SetPortParm: 1362 00000910 885718 mov [edi+TrackInfo.PortParm], dl 1363 00000913 66895714 mov [edi+TrackInfo.Effect], dx 1364 00000917 C3 retn 1365 efxvibrato: 1366 InitVibrato: 1367 00000918 8A471A mov al, [edi+TrackInfo.VibParm] 1368 0000091B 88C4 mov ah, al 1369 ;and al, 0Fh 1370 ;and ah, 0F0h 1371 0000091D 66250FF0 and ax, 0F00Fh 1372 00000921 F6C20F test dl, 0Fh 1373 00000924 7502 jne short OkDepth 1374 00000926 08C2 or dl, al 1375 OkDepth: 1376 00000928 F6C2F0 test dl, 0F0h 1377 0000092B 7502 jnz short OkRate 1378 0000092D 08E2 or dl, ah 1379 OkRate: 1380 0000092F 88571A mov [edi+TrackInfo.VibParm], dl 1381 00000932 66895714 mov [edi+TrackInfo.Effect], dx 1382 00000936 6685C9 test cx, cx 1383 00000939 7404 jz short OkPos 1384 0000093B C6471900 mov byte [edi+TrackInfo.VibPos], 0 1385 OkPos: 1386 0000093F C3 retn 1387 efxsampoffset: 1388 ; 01/10/2017 ; ******* 1389 SampleOfs: 1390 ; test dl, dl 1391 ; jnz short SetSampleOfs 1392 ; mov dl, [edi+TrackInfo.OldSampOfs] 1393 ;SetSampleOfs: 1394 ; mov [edi+TrackInfo.OldSampOfs], dl 1395 00000940 88D6 mov dh, dl 1396 00000942 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1397 00000948 895704 mov [edi+TrackInfo.Position], edx 1398 0000094B C3 retn 1399 efxpattjump: 1400 PosJump: 1401 0000094C 8815[5C810000] mov [OrderPos], dl 1402 00000952 C605[60810000]40 mov byte [Row], 64 1403 00000959 C3 retn 1404 efxsetvolume: 1405 SetVolume: 1406 0000095A 80FA40 cmp dl, 64 1407 0000095D 7602 jbe short OkVol 1408 0000095F B240 mov dl, 64 1409 OkVol: 1410 ; 01/10/2017 (TrackInfo.VolDiff, tremolo effect) 1411 00000961 30F6 xor dh, dh ; reset TrackInfo.VolDiff ; Not necessary !? 1412 ;mov [edi+TrackInfo.Volume], dl 1413 00000963 6689570E mov [edi+TrackInfo.Volume], dx 1414 00000967 C3 retn 1415 efxbreak: 1416 Break: 1417 00000968 88D6 mov dh, dl 1418 0000096A 80E20F and dl, 0Fh 1419 0000096D C0EE04 shr dh, 4 1420 00000970 00F6 add dh, dh 1421 00000972 00F2 add dl, dh 1422 00000974 C0E602 shl dh, 2 1423 00000977 00F2 add dl, dh 1424 00000979 8815[61810000] mov [BreakRow], dl 1425 0000097F C605[60810000]40 mov byte [Row], 64 1426 00000986 C3 retn 1427 efxsetspeed: 1428 SetSpeed: 1429 00000987 84D2 test dl,dl 1430 00000989 7432 je Skip 1431 0000098B 80FA1F cmp dl,31 1432 0000098E 770D ja short SetBpm 1433 SetTempo: 1434 00000990 8815[5D810000] mov [Tempo], dl 1435 00000996 8815[5E810000] mov [TempoWait], dl 1436 0000099C C3 retn 1437 SetBpm: 1438 0000099D 8815[5F810000] mov [Bpm], dl 1439 000009A3 B067 mov al, 103 1440 000009A5 F6E2 mul dl 1441 000009A7 88E3 mov bl, ah 1442 000009A9 30FF xor bh, bh 1443 000009AB 66A1[9E130000] mov ax, [MixSpeed] 1444 000009B1 6631D2 xor dx, dx 1445 000009B4 66F7F3 div bx 1446 000009B7 66A3[62810000] mov [BpmSamples], ax 1447 Skip: 1448 000009BD C3 retn 1449 efxarpeggio: 1450 ; 01/10/2017 1451 000009BE 84D2 test dl, dl 1452 ;je efxnull 1453 000009C0 74FB je short Skip 1454 InitArpeggio: 1455 000009C2 88D6 mov dh, dl 1456 000009C4 80E20F and dl, 0Fh 1457 000009C7 C0EE04 shr dh, 4 1458 ; 01/10/2017 1459 ;mov cx, 36 1460 000009CA 66B95400 mov cx, 84 ; 84 notes/periods 1461 000009CE 31DB xor ebx, ebx 1462 000009D0 668B4710 mov ax, [edi+TrackInfo.Period] 1463 gt_ScanPeriod: 1464 ;cmp ax, [PeriodTable+bx] 1465 000009D4 663B83[640D0000] cmp ax, [PeriodTable+ebx] 1466 000009DB 7306 jae short SetArp 1467 000009DD 6683C302 add bx, 2 1468 000009E1 E2F1 loop gt_ScanPeriod 1469 SetArp: 1470 000009E3 6601D2 add dx, dx 1471 000009E6 00DE add dh, bl 1472 000009E8 00DA add dl, bl 1473 ; 01/10/2017 1474 ;mov bx, [PeriodTable+bx] 1475 000009EA 668B9B[640D0000] mov bx, [PeriodTable+ebx] 1476 ;add bx, bx 1477 000009F1 01DB add ebx, ebx 1478 ;mov ax, [PitchTable+bx] 1479 000009F3 668B83[9A150000] mov ax, [PitchTable+ebx] 1480 000009FA 6689471E mov [edi+TrackInfo.Arp], ax 1481 000009FE 88F3 mov bl, dh 1482 00000A00 30FF xor bh, bh 1483 00000A02 668B9B[640D0000] mov bx, [PeriodTable+ebx] 1484 ;add bx, bx 1485 00000A09 01DB add ebx, ebx 1486 ;mov ax, [PitchTable+bx] 1487 00000A0B 668B83[9A150000] mov ax, [PitchTable+ebx] 1488 00000A12 66894720 mov [edi+TrackInfo.Arp+2], ax 1489 00000A16 88D3 mov bl, dl 1490 00000A18 30FF xor bh, bh 1491 00000A1A 668B9B[640D0000] mov bx, [PeriodTable+ebx] 1492 ;add bx, bx 1493 00000A21 01DB add ebx, ebx 1494 ;mov ax, [PitchTable+bx] 1495 00000A23 668B83[9A150000] mov ax, [PitchTable+ebx] 1496 00000A2A 66894722 mov [edi+TrackInfo.Arp+4], ax 1497 00000A2E 66C747240000 mov word [edi+TrackInfo.ArpIndex], 0 1498 00000A34 C3 retn 1499 1500 efxtremolo: 1501 ; 01/10/2017 (TMODPLAY.ASM) 1502 InitTremolo: 1503 00000A35 8A471C mov al, [edi+TrackInfo.TremParm] 1504 00000A38 88C4 mov ah, al 1505 00000A3A 66250FF0 and ax, 0F00Fh 1506 00000A3E F6C20F test dl, 0Fh 1507 00000A41 7502 jnz short InitTremolo_1 ; efxtremolof0 1508 00000A43 08C2 or dl, al 1509 efxtremolof0: 1510 InitTremolo_1: 1511 00000A45 F6C2F0 test dl, 0F0h 1512 00000A48 7502 jnz short InitTremolo_2 ; efxtremolof1 1513 00000A4A 08E2 or dl, ah 1514 efxtremolof1: 1515 InitTremolo_2: 1516 00000A4C 88571C mov [edi+TrackInfo.TremParm], dl 1517 00000A4F 66895714 mov [edi+TrackInfo.Effect], dx 1518 00000A53 C3 retn 1519 1520 ;-------------------------------------------------------------------------- 1521 ; pollmodule - polls the module player 1522 ;-------------------------------------------------------------------------- 1523 ;-------------------------------------------------------------------------- 1524 ; UpdateTracks: Main code to process the next tick to be played. 1525 ;-------------------------------------------------------------------------- 1526 1527 pollmodule: 1528 UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM) 1529 00000A54 FE0D[5E810000] dec byte [TempoWait] 1530 00000A5A 7415 jz short GetTracks 1531 1532 00000A5C B904000000 mov ecx, NumTracks 1533 00000A61 BF[72810000] mov edi, Tracks 1534 BeatTracks: 1535 00000A66 E870FCFFFF call BeatTrack 1536 00000A6B 83C726 add edi, TrackInfo.size 1537 00000A6E E2F6 loop BeatTracks 1538 00000A70 C3 retn 1539 GetTracks: 1540 00000A71 A0[5D810000] mov al, [Tempo] 1541 00000A76 A2[5E810000] mov [TempoWait], al 1542 1543 00000A7B 8B35[6E810000] mov esi, [Note] 1544 00000A81 803D[60810000]40 cmp byte [Row], 64 1545 00000A88 7263 jb short NoPattWrap 1546 1547 00000A8A 8B35[22140000] mov esi, [ModInfo.Patterns] 1548 00000A90 8A1D[5C810000] mov bl, [OrderPos] 1549 00000A96 3A1D[A0130000] cmp bl, [ModInfo.OrderLen] 1550 00000A9C 7214 jb short NoOrderWrap 1551 00000A9E 8A1D[A1130000] mov bl, [ModInfo.ReStart] 1552 00000AA4 881D[5C810000] mov [OrderPos], bl 1553 00000AAA 3A1D[A0130000] cmp bl, [ModInfo.OrderLen] 1554 00000AB0 735D jae short NoUpdate 1555 NoOrderWrap: 1556 ;xor bh, bh 1557 00000AB2 81E3FF000000 and ebx, 0FFh 1558 00000AB8 8A9B[A2130000] mov bl, [ModInfo.Order+ebx] 1559 00000ABE C1E30A shl ebx, 10 ; *1024 1560 00000AC1 01DE add esi, ebx 1561 00000AC3 8A1D[61810000] mov bl, [BreakRow] 1562 00000AC9 881D[60810000] mov [Row], bl 1563 ;xor bh, bh 1564 00000ACF 81E3FF000000 and ebx, 0FFh 1565 00000AD5 883D[61810000] mov [BreakRow], bh ; 0 1566 00000ADB 66C1E304 shl bx, 4 1567 00000ADF 01DE add esi, ebx 1568 00000AE1 8935[6E810000] mov [Note], esi 1569 00000AE7 FE05[5C810000] inc byte [OrderPos] 1570 NoPattWrap: 1571 00000AED FE05[60810000] inc byte [Row] 1572 1573 ;cld 1574 00000AF3 B904000000 mov ecx, NumTracks 1575 00000AF8 BF[72810000] mov edi, Tracks 1576 GetTracks_next: 1577 00000AFD 51 push ecx 1578 00000AFE E861FDFFFF call GetTrack ; readchannel 1579 00000B03 59 pop ecx 1580 00000B04 83C726 add edi, TrackInfo.size 1581 00000B07 E2F4 loop GetTracks_next 1582 1583 00000B09 8935[6E810000] mov [Note], esi 1584 NoUpdate: 1585 00000B0F C3 retn 1586 1587 ;-------------------------------------------------------------------------- 1588 ; MixTrack: Mixes one track into a CLEAN buffer. 1589 ; In: 1590 ; ds:si - Track Info Address. 1591 ; ds:di - Buffer Address. 1592 ; cx - Buffer Size. 1593 ;-------------------------------------------------------------------------- 1594 1595 ; esi = Track info address 1596 ; edi = Buffer address 1597 ; ecx = Buffer size 1598 1599 MixTrack: 1600 00000B10 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1601 00000B15 7752 ja short MixLooped 1602 MixNonLooped: 1603 00000B17 8B16 mov edx, [esi+TrackInfo.Samples] 1604 00000B19 8B5E04 mov ebx, [esi+TrackInfo.Position] 1605 00000B1C 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1606 00000B20 52 push edx 1607 00000B21 56 push esi 1608 00000B22 01D3 add ebx, edx 1609 00000B24 01D5 add ebp, edx 1610 00000B26 668B5612 mov dx, [esi+TrackInfo.Pitch] 1611 ; 01/10/2017 1612 ;mov al, [esi+TrackInfo.Volume] 1613 00000B2A 668B460E mov ax, [esi+TrackInfo.Volume] 1614 ; ah = [esi+TrackInfo.VolDiff] 1615 00000B2E 00E0 add al, ah ; ****** 1616 00000B30 C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1617 00000B34 8A661D mov ah, [esi+TrackInfo.Error] 1618 00000B37 89DE mov esi, ebx 1619 00000B39 31DB xor ebx, ebx ; 01/10/2017 ; * 1620 00000B3B 88C7 mov bh, al 1621 00000B3D 88D0 mov al, dl 1622 00000B3F 88F2 mov dl, dh 1623 ;xor dh, dh 1624 00000B41 81E2FF000000 and edx, 0FFh 1625 nlMixSamp: 1626 00000B47 39EE cmp esi, ebp 1627 00000B49 7311 jae short nlMixBye 1628 00000B4B 8A1E mov bl, [esi] 1629 ;mov bl, [VolTable+bx] 1630 00000B4D 8A9B[5C300000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1631 00000B53 001F add [edi], bl 1632 00000B55 47 inc edi 1633 00000B56 00C4 add ah, al 1634 00000B58 11D6 adc esi, edx 1635 00000B5A E2EB loop nlMixSamp 1636 nlMixBye: 1637 00000B5C 89F3 mov ebx, esi 1638 00000B5E 5E pop esi 1639 00000B5F 5A pop edx 1640 00000B60 29D3 sub ebx, edx 1641 00000B62 895E04 mov [esi+TrackInfo.Position], ebx 1642 00000B65 88661D mov [esi+TrackInfo.Error], ah 1643 00000B68 C3 retn 1644 MixLooped: 1645 00000B69 8B16 mov edx, [esi+TrackInfo.Samples] 1646 00000B6B 8B5E04 mov ebx, [esi+TrackInfo.Position] 1647 00000B6E 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1648 00000B72 892D[6A810000] mov [BufRep], ebp 1649 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1650 00000B78 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1651 00000B7C 52 push edx 1652 00000B7D 56 push esi 1653 00000B7E 01D3 add ebx, edx 1654 00000B80 01D5 add ebp, edx 1655 00000B82 668B5612 mov dx, [esi+TrackInfo.Pitch] 1656 ; 01/10/2017 1657 ;mov al, [esi+TrackInfo.Volume] 1658 00000B86 668B460E mov ax, [esi+TrackInfo.Volume] 1659 ; ah = [esi+TrackInfo.VolDiff] 1660 00000B8A 00E0 add al, ah ; ****** 1661 00000B8C C6460F00 mov byte [esi+TrackInfo.VolDiff], 0 1662 00000B90 8A661D mov ah, [esi+TrackInfo.Error] 1663 ;mov si, bx 1664 00000B93 89DE mov esi, ebx ; 04/09/2017 1665 00000B95 31DB xor ebx, ebx ; 01/10/2017 ; * 1666 00000B97 88C7 mov bh, al 1667 00000B99 88D0 mov al, dl 1668 00000B9B 88F2 mov dl, dh 1669 ;xor dh, dh 1670 00000B9D 81E2FF000000 and edx, 0FFh 1671 lpMixSamp: 1672 00000BA3 39EE cmp esi, ebp 1673 00000BA5 7206 jb short lpMixNow 1674 00000BA7 2B35[6A810000] sub esi, [BufRep] 1675 lpMixNow: 1676 00000BAD 8A1E mov bl, [esi] 1677 ;mov bl, [VolTable+bx] 1678 00000BAF 8A9B[5C300000] mov bl, [VolTable+ebx] ; 01/10/2017 ; * 1679 00000BB5 001F add [edi], bl 1680 00000BB7 47 inc edi 1681 00000BB8 00C4 add ah, al 1682 00000BBA 11D6 adc esi, edx 1683 00000BBC E2E5 loop lpMixSamp 1684 lpMixBye: 1685 ; mov ebx, esi 1686 ; pop esi 1687 ; pop edx 1688 ; sub ebx, edx 1689 ; mov [esi+TrackInfo.Position], ebx 1690 ; mov [esi+TrackInfo.Error], ah 1691 ; retn 1692 00000BBE EB9C jmp short nlMixBye 1693 1694 ;-------------------------------------------------------------------------- 1695 ; mixpoll - updates the output buffer 1696 ;-------------------------------------------------------------------------- 1697 ; 1698 ;-------------------------------------------------------------------------- 1699 ; GetSamples: Returns the next chunk of samples to be played. 1700 ; In: 1701 ; Buffer - Buffer Address. 1702 ; Count - Buffer Size. 1703 ;-------------------------------------------------------------------------- 1704 1705 mixpoll: 1706 GetSamples: ; mixpoll ; 01/10/2017 (TMODPLAY.ASM) 1707 ; edi = buffer address 1708 ; ebx = count 1709 1710 00000BC0 60 pushad 1711 1712 ;cld 1713 NextChunk: 1714 00000BC1 66833D[68810000]00 cmp word [BufLen], 0 1715 00000BC9 7546 jne short CopyChunk 1716 1717 00000BCB 53 push ebx 1718 00000BCC 57 push edi 1719 MixChunk: 1720 00000BCD BF[5C710000] mov edi, MixBuffer 1721 00000BD2 0FB70D[62810000] movzx ecx, word [BpmSamples] 1722 ;mov cx, [BpmSamples] 1723 00000BD9 893D[64810000] mov [BufPtr], edi 1724 00000BDF 66890D[68810000] mov [BufLen], cx 1725 1726 00000BE6 B080 mov al, 80h 1727 00000BE8 F3AA rep stosb 1728 1729 ;mov cx, NumTracks 1730 00000BEA B104 mov cl, NumTracks ; 01/10/2017 1731 00000BEC BE[4C810000] mov esi, Tracks - TrackInfo.size 1732 GetSamples_next: 1733 00000BF1 51 push ecx 1734 00000BF2 83C626 add esi, TrackInfo.size 1735 00000BF5 668B0D[68810000] mov cx, [BufLen] 1736 00000BFC 8B3D[64810000] mov edi, [BufPtr] 1737 00000C02 E809FFFFFF call MixTrack 1738 00000C07 59 pop ecx 1739 00000C08 E2E7 loop GetSamples_next 1740 1741 00000C0A E845FEFFFF call UpdateTracks 1742 1743 00000C0F 5F pop edi 1744 00000C10 5B pop ebx 1745 CopyChunk: 1746 ;mov cx, [BufLen] 1747 00000C11 0FB70D[68810000] movzx ecx, word [BufLen] 1748 00000C18 39D9 cmp ecx, ebx 1749 ;cmp cx, bx 1750 00000C1A 7602 jbe short MoveChunk 1751 ;mov cx, bx 1752 00000C1C 89D9 mov ecx, ebx 1753 MoveChunk: 1754 00000C1E 8B35[64810000] mov esi, [BufPtr] 1755 00000C24 010D[64810000] add [BufPtr], ecx 1756 00000C2A 66290D[68810000] sub [BufLen], cx 1757 00000C31 29CB sub ebx, ecx 1758 00000C33 F3A4 rep movsb 1759 00000C35 85DB test ebx, ebx 1760 00000C37 7588 jnz short NextChunk 1761 1762 00000C39 61 popad 1763 00000C3A C3 retn 1764 1765 ;-------------------------------------------------------------------------- 1766 ; StartPlaying: Initializes the Sound System. 1767 ; In: 1768 ; Module Information Resources. 1769 ;-------------------------------------------------------------------------- 1770 1771 StartPlaying: 1772 00000C3B 60 pushad 1773 SetModParms: 1774 00000C3C C605[5C810000]00 mov byte [OrderPos], 0 1775 00000C43 C605[5D810000]06 mov byte [Tempo], DefTempo 1776 00000C4A C605[5E810000]06 mov byte [TempoWait], DefTempo 1777 00000C51 C605[5F810000]7D mov byte [Bpm], DefBpm 1778 00000C58 C605[60810000]40 mov byte [Row], 64 1779 00000C5F C605[61810000]00 mov byte [BreakRow], 0 1780 00000C66 66A1[9E130000] mov ax, [MixSpeed] 1781 00000C6C 31D2 xor edx, edx 1782 00000C6E 66BB3200 mov bx, 24*DefBpm/60 1783 00000C72 66F7F3 div bx 1784 00000C75 66A3[62810000] mov [BpmSamples], ax 1785 ClearTracks: 1786 00000C7B BF[72810000] mov edi, Tracks 1787 00000C80 B998000000 mov ecx, NumTracks*TrackInfo.size 1788 00000C85 31C0 xor eax, eax 1789 ;cld 1790 00000C87 F3AA rep stosb 1791 1792 00000C89 A3[64810000] mov [BufPtr], eax 1793 00000C8E 66A3[68810000] mov [BufLen], ax 1794 MakePitch: 1795 00000C94 66B80021 mov ax, MidCRate 1796 00000C98 66BBAC01 mov bx, 428 1797 00000C9C 66F7E3 mul bx 1798 00000C9F 66F735[9E130000] div word [MixSpeed] 1799 00000CA6 30F6 xor dh, dh 1800 00000CA8 88E2 mov dl, ah 1801 00000CAA 88C4 mov ah, al 1802 00000CAC 30C0 xor al, al 1803 ;mov cx, 857 1804 00000CAE 66B9610D mov cx, 3425 ; 01/10/2017 (TMODPLAY.ASM) 1805 00000CB2 31DB xor ebx, ebx 1806 00000CB4 BF[9A150000] mov edi, PitchTable 1807 PitchLoop: 1808 00000CB9 50 push eax 1809 00000CBA 52 push edx 1810 00000CBB 6639DA cmp dx, bx 1811 00000CBE 7303 jae short NoDiv 1812 00000CC0 66F7F3 div bx 1813 NoDiv: 1814 00000CC3 66AB stosw 1815 00000CC5 5A pop edx 1816 00000CC6 58 pop eax 1817 ;inc bx 1818 00000CC7 43 inc ebx 1819 00000CC8 E2EF loop PitchLoop 1820 MakeVolume: 1821 00000CCA 66B90041 mov cx, 16640 1822 00000CCE 89CB mov ebx, ecx 1823 VolLoop: 1824 00000CD0 664B dec bx 1825 00000CD2 88D8 mov al, bl 1826 00000CD4 F6EF imul bh 1827 ;mov [VolTable+bx], ah 1828 00000CD6 88A3[5C300000] mov [VolTable+ebx], ah 1829 00000CDC E2F2 loop VolLoop 1830 1831 00000CDE 61 popad 1832 ;retn 1833 1834 ;-------------------------------------------------------------------------- 1835 ; StopPlaying: ShutDown the Sound System. 1836 ;-------------------------------------------------------------------------- 1837 1838 StopPlaying: 1839 00000CDF C3 retn 1840 1841 ;============================================================================= 1842 ; preinitialized data 1843 ;============================================================================= 1844 1845 ;============================================================================= 1846 ; SB.ASM - DATA 1847 ;============================================================================= 1848 1849 00000CE0 2002 SbAddr: dw 220h 1850 00000CE2 07 SbIrq: db 7 1851 ;Srbs: db 0 1852 1853 ;============================================================================= 1854 ; Protracker effects stuff 1855 ;============================================================================= 1856 1857 ;----------------------------------------------------------------------------- 1858 ; Effect jump tables 1859 ;----------------------------------------------------------------------------- 1860 1861 00000CE3 90 align 4 1862 1863 efxtable: 1864 00000CE4 [BE090000] dd efxarpeggio ; 0 - arpeggio 1865 00000CE8 [EB060000] dd efxnull ; 1 - porta up 1866 00000CEC [EB060000] dd efxnull ; 2 - porta down 1867 00000CF0 [09090000] dd efxtoneporta ; 3 - tone porta 1868 00000CF4 [18090000] dd efxvibrato ; 4 - vibrato 1869 00000CF8 [EB060000] dd efxnull ; 5 - tone+slide 1870 00000CFC [EB060000] dd efxnull ; 6 - vibrato+slide 1871 00000D00 [350A0000] dd efxtremolo ; 7 - tremolo 1872 00000D04 [EB060000] dd efxnull ; 8 - unused 1873 00000D08 [40090000] dd efxsampoffset ; 9 - sample offset 1874 00000D0C [EB060000] dd efxnull ; A - volume slide 1875 00000D10 [4C090000] dd efxpattjump ; B - pattern jump 1876 00000D14 [5A090000] dd efxsetvolume ; C - set volume 1877 00000D18 [68090000] dd efxbreak ; D - break pattern 1878 00000D1C [EB060000] dd efxnull ; E - extra effects 1879 00000D20 [87090000] dd efxsetspeed ; F - set speed 1880 1881 efxtable2: 1882 00000D24 [EC060000] dd efxarpeggio2 ; 0 - arpeggio 1883 00000D28 [0E070000] dd efxportaup ; 1 - porta up 1884 00000D2C [34070000] dd efxportadown ; 2 - porta down 1885 00000D30 [5B070000] dd efxtoneporta2 ; 3 - tone porta 1886 00000D34 [94070000] dd efxvibrato2 ; 4 - vibrato 1887 00000D38 [F0070000] dd efxtoneslide ; 5 - tone+slide 1888 00000D3C [FD070000] dd efxvibslide ; 6 - vibrato+slide 1889 00000D40 [24080000] dd efxtremolo2 ; 7 - tremolo 1890 00000D44 [EB060000] dd efxnull ; 8 - unused 1891 00000D48 [EB060000] dd efxnull ; 9 - sample offset 1892 00000D4C [07080000] dd efxvolslide ; A - volume slide 1893 00000D50 [EB060000] dd efxnull ; B - pattern jump 1894 00000D54 [EB060000] dd efxnull ; C - set volume 1895 00000D58 [EB060000] dd efxnull ; D - break pattern 1896 00000D5C [EB060000] dd efxnull ; E - extra effects 1897 00000D60 [EB060000] dd efxnull ; F - set speed 1898 1899 ;----------------------------------------------------------------------------- 1900 ; Amiga period table 1901 ;----------------------------------------------------------------------------- 1902 1903 ;PeriodTable0: 1904 ; dw 0 1905 PeriodTable: 1906 00000D64 600DA00CE80B400B98- dw 3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812 1906 00000D6D 0A000A7009E8086808- 1906 00000D76 F00780071407 1907 00000D7C B0065006F405A0054C- dw 1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906 1907 00000D85 050005B80474043404- 1907 00000D8E F803C0038A03 1908 00000D94 58032803FA02D002A6- dw 856,808,762,720,678,640,604,570,538,508,480,453 1908 00000D9D 0280025C023A021A02- 1908 00000DA6 FC01E001C501 1909 00000DAC AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 1909 00000DB5 0140012E011D010D01- 1909 00000DBE FE00F000E200 1910 00000DC4 D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 1910 00000DCD 00A00097008F008700- 1910 00000DD6 7F0078007100 1911 00000DDC 6B0065005F005A0055- dw 107,101,95,90,85,80,75,71,67,63,60,56 1911 00000DE5 0050004B0047004300- 1911 00000DEE 3F003C003800 1912 00000DF4 350032002F002D002A- dw 53,50,47,45,42,40,37,35,33,31,30,28 1912 00000DFD 002800250023002100- 1912 00000E06 1F001E001C00 1913 1914 ;----------------------------------------------------------------------------- 1915 ; Sinus wave table 1916 ;----------------------------------------------------------------------------- 1917 1918 SinTable: 1919 00000E0C 0019324A62788EA2B4- db 0,25,50,74,98,120,142,162,180,197,212,225 1919 00000E15 C5D4E1 1920 00000E18 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 1920 00000E21 E1 1921 00000E22 D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 1921 00000E2B 19 1922 1923 ;============================================================================= 1924 ; Copyright Strings & Messages 1925 ;============================================================================= 1926 00000E2C 0000 dw 0 1927 msg_usage: 1928 00000E2E 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 1928 00000E37 506C6179657220666F- 1928 00000E40 72205452444F532033- 1928 00000E49 383620627920457264- 1928 00000E52 6F67616E2054616E2E- 1928 00000E5B 20 1929 00000E5C 4F63746F6265722032- db 'October 2017.',10,13 1929 00000E65 3031372E0A0D 1930 00000E6B 75736167653A207469- db 'usage: tinyplay filename.mod', 10, 13,0 1930 00000E74 6E79706C6179206669- 1930 00000E7D 6C656E616D652E6D6F- 1930 00000E86 640A0D00 1931 00000E8A 30372F31302F323031- db '07/10/2017',0 1931 00000E93 3700 1932 1933 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 1934 1935 00000E95 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 1935 00000E9E 506C61796572207630- 1935 00000EA7 2E3162206279204361- 1935 00000EB0 726C6F732048617361- 1935 00000EB9 6E2E204A756C792031- 1935 00000EC2 3939332E 1936 00000EC6 0A0D00 db 10,13,0 1937 00000EC9 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 1937 00000ED2 64696E67204D6F6475- 1937 00000EDB 6C652066696C652E0A- 1937 00000EE4 0D00 1938 00000EE6 536F756E6420426C61- MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 1938 00000EEF 73746572206E6F7420- 1938 00000EF8 666F756E64206F7220- 1938 00000F01 495251206572726F72- 1938 00000F0A 2E0A0D00 1939 00000F0E 536F756E6420426C61- MsgFound: db 'Sound Blaster found at Address 2' 1939 00000F17 7374657220666F756E- 1939 00000F20 642061742041646472- 1939 00000F29 6573732032 1940 00000F2E 7830682C2049525120 PortText: db 'x0h, IRQ ' 1941 00000F37 782E0A0D00 IrqText: db 'x.',10,13,0 1942 1943 trdos386_err_msg: 1944 00000F3C 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 1944 00000F45 2053797374656D2063- 1944 00000F4E 616C6C206572726F72- 1944 00000F57 20210A0D00 1945 1946 bss_start: 1947 1948 ABSOLUTE bss_start 1949 1950 alignb 2 1951 1952 ;============================================================================= 1953 ; uninitialized data 1954 ;============================================================================= 1955 1956 ; SB.ASM 1957 00000F5C DmaFlag resb 1 1958 1959 ; 11/03/2017 1960 00000F5D iStatus: resb 1 1961 1962 ; MODLOAD.ASM 1963 00000F5E FileHandle: resd 1 1964 00000F62 Header: resb ModHeader.size 1965 1966 ; MODPLAY.ASM 1967 sampling_rate: ; 11/03/2017 1968 0000139E MixSpeed: resw 1 1969 1970 ModInfo: 1971 000013A0 ModInfo.OrderLen: resb 1 1972 000013A1 ModInfo.ReStart: resb 1 1973 000013A2 ModInfo.Order: resb 128 1974 00001422 ModInfo.Patterns: resd 1 1975 1976 00001426 ModInfo.SampOfs: resw 31 1977 00001464 ModInfo.SampSeg: resw 31 1978 000014A2 ModInfo.SampLen: resw 31 1979 000014E0 ModInfo.SampRep: resw 31 1980 0000151E ModInfo.SampRepLen: resw 31 1981 0000155C ModInfo.SampVol: resw 31 1982 1983 ; MODPLAY.ASM 1984 PitchTable: ;resw 857 1985 0000159A resw 3425 ; 01/10/2017 (TMODPLAY.ASM) 1986 0000305C VolTable: resb 16640 1987 0000715C MixBuffer resb MixBufSize 1988 1989 ; MODPLAY.ASM 1990 0000815C OrderPos: resb 1 1991 0000815D Tempo: resb 1 1992 0000815E TempoWait: resb 1 1993 0000815F Bpm: resb 1 1994 00008160 Row: resb 1 1995 00008161 BreakRow: resb 1 1996 00008162 BpmSamples: resw 1 1997 00008164 BufPtr: resd 1 1998 00008168 BufLen: resw 1 1999 0000816A BufRep: resd 1 2000 0000816E Note: resd 1 2001 00008172 Tracks: resb TrackInfo.size*NumTracks 2002 2003 0000820A alignb 16 2004 2005 ; PLAY.ASM 2006 00008210 Scope: resw 320 2007 00008490 RowOfs: resw 256 2008 2009 ;03/03/2017 2010 00008690 DMA_phy_buff: resd 1 2011 mod_file_name: 2012 00008694 resb 16 2013 2014 ; 12/03/2017 2015 000086A4 alignb 65536 2016 2017 DmaBuffer: 2018 00010000 DoubleBuffer: resb 65536 ; DmaBufSize 2019 2020 alignb 65536 2021 2022 file_buffer: 2023 00020000 resb 65536*6 ; 13/03/2017 2024 EOF: