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 19 ; 01/03/2017 20 ; 16/10/2016 21 ; 29/04/2016 22 ; TRDOS 386 system calls (temporary list!) 23 _ver equ 0 24 _exit equ 1 25 _fork equ 2 26 _read equ 3 27 _write equ 4 28 _open equ 5 29 _close equ 6 30 _wait equ 7 31 _creat equ 8 32 _link equ 9 33 _unlink equ 10 34 _exec equ 11 35 _chdir equ 12 36 _time equ 13 37 _mkdir equ 14 38 _chmod equ 15 39 _chown equ 16 40 _break equ 17 41 _stat equ 18 42 _seek equ 19 43 _tell equ 20 44 _mount equ 21 45 _umount equ 22 46 _setuid equ 23 47 _getuid equ 24 48 _stime equ 25 49 _quit equ 26 50 _intr equ 27 51 _fstat equ 28 52 _emt equ 29 53 _mdate equ 30 54 _video equ 31 55 _audio equ 32 56 _timer equ 33 57 _sleep equ 34 58 _msg equ 35 59 _geterr equ 36 60 _fpsave equ 37 61 _pri equ 38 62 _rele equ 39 63 _fff equ 40 64 _fnf equ 41 65 _alloc equ 42 66 _dalloc equ 43 67 _calbac equ 44 68 69 %macro sys 1-4 70 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 71 ; 03/09/2015 72 ; 13/04/2015 73 ; Retro UNIX 386 v1 system call. 74 %if %0 >= 2 75 mov ebx, %2 76 %if %0 >= 3 77 mov ecx, %3 78 %if %0 = 4 79 mov edx, %4 80 %endif 81 %endif 82 %endif 83 mov eax, %1 84 ;int 30h 85 int 40h ; TRDOS 386 (TRDOS v2.0) 86 %endmacro 87 88 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 89 ; sys systemcall (eax) , , 90 91 92 ; ---------------------------------------------------------------------------- 93 ; Tiny MOD Player v0.1b by Carlos Hasan. 94 ; July 14th, 1993. 95 96 ;============================================================================= 97 ; PLAY.ASM 98 ;============================================================================= 99 100 [BITS 32] 101 [org 0] 102 103 Start: 104 ; clear bss 105 00000000 B9[00000800] mov ecx, EOF 106 00000005 BF[550E0000] mov edi, bss_start 107 0000000A 29F9 sub ecx, edi 108 0000000C D1E9 shr ecx, 1 109 0000000E 31C0 xor eax, eax 110 00000010 F366AB rep stosw 111 112 GetFileName: 113 00000013 89E6 mov esi, esp 114 00000015 AD lodsd 115 00000016 83F802 cmp eax, 2 ; two arguments 116 ; (program file name & mod file name) 117 00000019 0F829B010000 jb pmsg_usage ; nothing to do 118 119 0000001F AD lodsd ; program file name address 120 00000020 AD lodsd ; mod file name address (file to be read) 121 00000021 89C6 mov esi, eax 122 00000023 BF[74710000] mov edi, mod_file_name 123 ScanName: 124 00000028 AC lodsb 125 00000029 84C0 test al, al 126 0000002B 0F8489010000 je pmsg_usage 127 00000031 3C20 cmp al, 20h 128 00000033 74F3 je short ScanName ; scan start of name. 129 00000035 AA stosb 130 00000036 B4FF mov ah, 0FFh 131 a_0: 132 00000038 FEC4 inc ah 133 a_1: 134 0000003A AC lodsb 135 0000003B AA stosb 136 0000003C 3C2E cmp al, '.' 137 0000003E 74F8 je short a_0 138 00000040 20C0 and al, al 139 00000042 75F6 jnz short a_1 140 141 00000044 08E4 or ah, ah ; if period NOT found, 142 00000046 750B jnz short a_2 ; then add a .MOD extension. 143 SetExt: 144 00000048 4F dec edi 145 00000049 C7072E4D4F44 mov dword [edi], '.MOD' 146 0000004F C6470400 mov byte [edi+4], 0 147 a_2: 148 ; Prints the Credits Text. 149 sys _msg, Credits, 255, 0Ch 149 <1> 149 <1> 149 <1> 149 <1> 149 <1> %if %0 >= 2 149 00000053 BB[260D0000] <1> mov ebx, %2 149 <1> %if %0 >= 3 149 00000058 B9FF000000 <1> mov ecx, %3 149 <1> %if %0 = 4 149 0000005D BA0C000000 <1> mov edx, %4 149 <1> %endif 149 <1> %endif 149 <1> %endif 149 00000062 B823000000 <1> mov eax, %1 149 <1> 149 00000067 CD40 <1> int 40h 150 151 00000069 E864010000 call DetectSb ; Detect the SB Addr, Irq. 152 LoadMod: 153 0000006E BF[74710000] mov edi, mod_file_name 154 00000073 E8EE040000 call LoadModule ; Load the MODule... 155 ; 07/10/2017 156 00000078 731B jnc short PlayNow ; any error loading? 157 158 ; yes, print error and Exit. 159 160 sys _msg, ErrorMesg, 255, 0Fh 160 <1> 160 <1> 160 <1> 160 <1> 160 <1> %if %0 >= 2 160 0000007A BB[5A0D0000] <1> mov ebx, %2 160 <1> %if %0 >= 3 160 0000007F B9FF000000 <1> mov ecx, %3 160 <1> %if %0 = 4 160 00000084 BA0F000000 <1> mov edx, %4 160 <1> %endif 160 <1> %endif 160 <1> %endif 160 00000089 B823000000 <1> mov eax, %1 160 <1> 160 0000008E CD40 <1> int 40h 161 162 00000090 E919010000 jmp Exit 163 164 PlayNow: 165 ;; DIRECT MEMORY ACCESS (for Audio DMA) 166 ;; ebx = DMA buffer address (virtual, user) 167 ;; ecx = buffer size (in bytes) 168 ;; edx = upper limit = 16MB 169 170 ;_16MB equ 1024*1024*16 171 172 ;sys _alloc, DoubleBuffer, DmaBufSize, _16MB 173 ;jc short error_exit 174 175 ; 12/05/2017 176 sys _audio, 0D00h, DmaBufSize, DoubleBuffer 176 <1> 176 <1> 176 <1> 176 <1> 176 <1> %if %0 >= 2 176 00000095 BB000D0000 <1> mov ebx, %2 176 <1> %if %0 >= 3 176 0000009A B900000100 <1> mov ecx, %3 176 <1> %if %0 = 4 176 0000009F BA[00000100] <1> mov edx, %4 176 <1> %endif 176 <1> %endif 176 <1> %endif 176 000000A4 B820000000 <1> mov eax, %1 176 <1> 176 000000A9 CD40 <1> int 40h 177 000000AB 724A jc short error_exit 178 179 000000AD A3[70710000] mov [DMA_phy_buff], eax ; physical address 180 ; of the buffer 181 ; (which is needed 182 ; for DMA controller) 183 184 ; 11/03/2017 (22000 -> 22050) 185 ;mov word [MixSpeed], 22050 ; Mixing at 22 kHz 186 187 ; 07/10/2017 188 000000B2 66C705[98120000]CE- mov word [MixSpeed], 22222 ; Mixing at 22 kHz 188 000000BA 56 189 190 ; call StartPlaying ; PLAY! 191 192 000000BB E810030000 call SbInit 193 194 000000C0 B980000000 mov ecx, 128 ; Make a lookup table 195 000000C5 31DB xor ebx, ebx ; for fastest pixel 196 000000C7 BA002D0000 mov edx, 320*(100-64) ; addressing. 197 MakeOfs: 198 000000CC 668993[706F0000] mov [RowOfs+ebx], dx 199 000000D3 668993[726F0000] mov [RowOfs+ebx+2], dx 200 000000DA 6681C24001 add dx, 320 201 000000DF 83C304 add ebx, 4 202 000000E2 E2E8 loop MakeOfs 203 204 ;cld 205 206 ; DIRECT VGA MEMORY ACCESS 207 ; bl = 0, bh = 5 208 ; Direct access/map to VGA memory (0A0000h) 209 210 sys _video, 0500h 210 <1> 210 <1> 210 <1> 210 <1> 210 <1> %if %0 >= 2 210 000000E4 BB00050000 <1> mov ebx, %2 210 <1> %if %0 >= 3 210 <1> mov ecx, %3 210 <1> %if %0 = 4 210 <1> mov edx, %4 210 <1> %endif 210 <1> %endif 210 <1> %endif 210 000000E9 B81F000000 <1> mov eax, %1 210 <1> 210 000000EE CD40 <1> int 40h 211 000000F0 3D00000A00 cmp eax, 0A0000h 212 000000F5 741B je short start_scope 213 214 error_exit: 215 sys _msg, trdos386_err_msg, 255, 0Eh 215 <1> 215 <1> 215 <1> 215 <1> 215 <1> %if %0 >= 2 215 000000F7 BB[CD0D0000] <1> mov ebx, %2 215 <1> %if %0 >= 3 215 000000FC B9FF000000 <1> mov ecx, %3 215 <1> %if %0 = 4 215 00000101 BA0E000000 <1> mov edx, %4 215 <1> %endif 215 <1> %endif 215 <1> %endif 215 00000106 B823000000 <1> mov eax, %1 215 <1> 215 0000010B CD40 <1> int 40h 216 ;jmp short Exit 217 0000010D E99C000000 jmp Exit 218 219 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 220 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 221 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 222 ; second, or the module will sound "looped". 223 ; Because we need better sync with the ModPlayer to draw the scope, 224 ; the polling is called from my routine, and then the irq 0 must be 225 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 226 ; samples played by the Sound Blaster. Note that some samples are 227 ; discarded in the next code, just for fun! 228 229 start_scope: 230 ; mov ax, 0A000h 231 ; mov es, ax 232 00000112 89C7 mov edi, eax ; 0A0000h 233 234 ;mov byte [tLoop], 1 235 236 ; 11/03/2017 237 00000114 66B81300 mov ax, 0013h ; Set Mode 320x200x256 238 00000118 CD31 int 31h 239 ScopeLoop: 240 ; ModPlay Polling! 241 0000011A E884020000 call SbPoll 242 243 ;cmp byte [tLoop], 1 244 ;jb short _StopPlay 245 246 247 0000011F BE[00000100] mov esi, DmaBuffer ; get current samples 248 ; to be drawed ... 249 ; 12/03/2017 250 ; original tinyplay scope drawing code is for 1K buffer 251 ; but now we have 32K buffer, following code is for that... 252 GetDmaCount: 253 ;in al, 03h 254 00000124 66BA0300 mov dx, 03h 255 00000128 B400 mov ah, 0 ; inb 256 0000012A CD34 int 34h 257 0000012C 88C1 mov cl, al 258 ;in al, 03h 259 ;mov ah, 0 ; inb 260 0000012E CD34 int 34h 261 00000130 88C5 mov ch, al 262 00000132 66BAFFFF mov dx, 65535 263 00000136 6629CA sub dx, cx 264 ; 15/03/2017 265 00000139 6681EAA000 sub dx, 160 266 0000013E 6601D6 add si, dx 267 ; 268 00000141 6631C9 xor cx, cx 269 00000144 6631D2 xor dx, dx 270 DrawLoop: 271 00000147 6689D3 mov bx, dx ; (save Index) 272 0000014A 66678BBF[F06C] mov di, [Scope+bx] ; get old SCOPE pixel address 273 ;mov byte [es:di], 0 ; erase it! 274 00000150 C60700 mov byte [edi], 0 275 ;lodsb ; get a sample (8-bit) 276 ;mov bl, al 277 ;15/03/2017 278 00000153 8A1E mov bl, [esi] ; calc new pixel address... 279 00000155 6646 inc si 280 00000157 30FF xor bh, bh 281 00000159 66D1E3 shl bx, 1 282 0000015C 66678BBF[706F] mov di, [RowOfs+bx] 283 00000162 6601CF add di, cx 284 00000165 6689D3 mov bx, dx ; (restore Index) 285 00000168 666789BF[F06C] mov [Scope+bx], di ; save new address... 286 ;mov byte [es:di], 10 ; and DRAW. 287 0000016E C6070A mov byte [edi], 10 288 00000171 6683C202 add dx, 2 ; the next pixel... 289 00000175 6641 inc cx 290 00000177 6681F94001 cmp cx, 320 ; 320 pixels drawed? 291 0000017C 72C9 jb short DrawLoop 292 CheckAnyKey: 293 0000017E B401 mov ah, 1 ; any key pressed? 294 00000180 CD32 int 32h ; no, Loop. 295 00000182 7496 jz short ScopeLoop 296 297 00000184 B400 mov ah, 0 ; flush key buffer... 298 00000186 CD32 int 32h 299 300 00000188 66B80300 mov ax, 0003h ; Set Text Mode 80x25x16 301 0000018C CD31 int 31h 302 303 ;call StopPlaying ; STOP! 304 305 ;mov byte [tLoop], 0 306 _StopPlay: 307 ; 11/03/2017 308 0000018E 30C0 xor al, al 309 ; Stop 8 bit (autoinitialized) DMA process 310 ;out 0Ch, al 311 ;retn 312 00000190 66BA0C00 mov dx, 0Ch 313 00000194 B401 mov ah, 1 ;outb 314 00000196 CD34 int 34h 315 316 00000198 E88B030000 call SbDone 317 318 ; Deallocate DMA buffer (not necessary just before exit!) 319 sys _dalloc, DoubleBuffer, DmaBufSize 319 <1> 319 <1> 319 <1> 319 <1> 319 <1> %if %0 >= 2 319 0000019D BB[00000100] <1> mov ebx, %2 319 <1> %if %0 >= 3 319 000001A2 B900000100 <1> mov ecx, %3 319 <1> %if %0 = 4 319 <1> mov edx, %4 319 <1> %endif 319 <1> %endif 319 <1> %endif 319 000001A7 B82B000000 <1> mov eax, %1 319 <1> 319 000001AC CD40 <1> int 40h 320 ;jc error_exit 321 Exit: 322 000001AE E80E050000 call FreeModule ; Free MODule core. 323 324 sys _exit ; Bye! 324 <1> 324 <1> 324 <1> 324 <1> 324 <1> %if %0 >= 2 324 <1> mov ebx, %2 324 <1> %if %0 >= 3 324 <1> mov ecx, %3 324 <1> %if %0 = 4 324 <1> mov edx, %4 324 <1> %endif 324 <1> %endif 324 <1> %endif 324 000001B3 B801000000 <1> mov eax, %1 324 <1> 324 000001B8 CD40 <1> int 40h 325 326 pmsg_usage: 327 sys _msg, msg_usage, 255, 0Ah 327 <1> 327 <1> 327 <1> 327 <1> 327 <1> %if %0 >= 2 327 000001BA BB[C00C0000] <1> mov ebx, %2 327 <1> %if %0 >= 3 327 000001BF B9FF000000 <1> mov ecx, %3 327 <1> %if %0 = 4 327 000001C4 BA0A000000 <1> mov edx, %4 327 <1> %endif 327 <1> %endif 327 <1> %endif 327 000001C9 B823000000 <1> mov eax, %1 327 <1> 327 000001CE CD40 <1> int 40h 328 000001D0 EBDC jmp short Exit 329 330 DetectSb: 331 000001D2 60 pushad 332 ScanPort: 333 000001D3 66BB1002 mov bx, 210h ; start scanning ports 334 ; 210h, 220h, .. 260h 335 ResetDSP: 336 000001D7 6689DA mov dx, bx ; try to reset the DSP. 337 000001DA 6683C206 add dx, 06h 338 000001DE B001 mov al, 1 339 ;out dx, al 340 000001E0 B401 mov ah, 1 ; outb 341 000001E2 CD34 int 34h 342 343 ;in al, dx 344 ;in al, dx 345 ;in al, dx 346 ;in al, dx 347 348 000001E4 B400 mov ah, 0 ; inb 349 000001E6 CD34 int 34h 350 ;mov ah, 0 ; inb 351 000001E8 CD34 int 34h 352 353 000001EA 30C0 xor al, al 354 ;out dx, al 355 000001EC B401 mov ah, 1 ; outb 356 000001EE CD34 int 34h 357 358 000001F0 6683C208 add dx, 08h 359 ;mov cx, 100 360 000001F4 66B92000 mov cx, 32 361 000001F8 28E4 sub ah, ah ; 0 362 WaitID: 363 ;in al, dx 364 000001FA CD34 int 34h ;ah = 0 ; inb 365 000001FC 08C0 or al, al 366 000001FE 7804 js short GetID 367 00000200 E2F8 loop WaitID 368 00000202 EB10 jmp short NextPort 369 GetID: 370 00000204 6683EA04 sub dx, 04h 371 ;in al, dx 372 00000208 CD34 int 34h ;ah = 0 ; inb 373 0000020A 3CAA cmp al, 0AAh 374 0000020C 7416 je short Found 375 0000020E 6683C204 add dx, 04h 376 00000212 E2E6 loop WaitID 377 NextPort: 378 00000214 6683C310 add bx, 10h ; if not response, 379 00000218 6681FB6002 cmp bx, 260h ; try the next port. 380 0000021D 76B8 jbe short ResetDSP 381 0000021F E934010000 jmp Fail 382 Found: 383 00000224 66891D[BD0C0000] mov [SbAddr], bx ; SB Port Address Found! 384 ScanIRQ: 385 SetIrqs: ; LINK SIGNAL RESPONSE/RETURN BYTE TO REQUESTED IRQ 386 sys _calbac, 102h, 2, SbIrq ; IRQ 2 386 <1> 386 <1> 386 <1> 386 <1> 386 <1> %if %0 >= 2 386 0000022B BB02010000 <1> mov ebx, %2 386 <1> %if %0 >= 3 386 00000230 B902000000 <1> mov ecx, %3 386 <1> %if %0 = 4 386 00000235 BA[BF0C0000] <1> mov edx, %4 386 <1> %endif 386 <1> %endif 386 <1> %endif 386 0000023A B82C000000 <1> mov eax, %1 386 <1> 386 0000023F CD40 <1> int 40h 387 ; Signal Response Byte 388 ;jc short error_exit 389 390 sys _calbac, 103h, 3, SbIrq ; IRQ 3 390 <1> 390 <1> 390 <1> 390 <1> 390 <1> %if %0 >= 2 390 00000241 BB03010000 <1> mov ebx, %2 390 <1> %if %0 >= 3 390 00000246 B903000000 <1> mov ecx, %3 390 <1> %if %0 = 4 390 0000024B BA[BF0C0000] <1> mov edx, %4 390 <1> %endif 390 <1> %endif 390 <1> %endif 390 00000250 B82C000000 <1> mov eax, %1 390 <1> 390 00000255 CD40 <1> int 40h 391 ; Signal Response Byte 392 ;jc short error_exit 393 394 sys _calbac, 104h, 4, SbIrq ; IRQ 4 394 <1> 394 <1> 394 <1> 394 <1> 394 <1> %if %0 >= 2 394 00000257 BB04010000 <1> mov ebx, %2 394 <1> %if %0 >= 3 394 0000025C B904000000 <1> mov ecx, %3 394 <1> %if %0 = 4 394 00000261 BA[BF0C0000] <1> mov edx, %4 394 <1> %endif 394 <1> %endif 394 <1> %endif 394 00000266 B82C000000 <1> mov eax, %1 394 <1> 394 0000026B CD40 <1> int 40h 395 ; Signal Response Byte 396 ;jc short error_exit 397 398 sys _calbac, 105h, 5, SbIrq ; IRQ 5 398 <1> 398 <1> 398 <1> 398 <1> 398 <1> %if %0 >= 2 398 0000026D BB05010000 <1> mov ebx, %2 398 <1> %if %0 >= 3 398 00000272 B905000000 <1> mov ecx, %3 398 <1> %if %0 = 4 398 00000277 BA[BF0C0000] <1> mov edx, %4 398 <1> %endif 398 <1> %endif 398 <1> %endif 398 0000027C B82C000000 <1> mov eax, %1 398 <1> 398 00000281 CD40 <1> int 40h 399 ; Signal Response Byte 400 ;jc short error_exit 401 402 sys _calbac, 107h, 7, SbIrq ; IRQ 7 402 <1> 402 <1> 402 <1> 402 <1> 402 <1> %if %0 >= 2 402 00000283 BB07010000 <1> mov ebx, %2 402 <1> %if %0 >= 3 402 00000288 B907000000 <1> mov ecx, %3 402 <1> %if %0 = 4 402 0000028D BA[BF0C0000] <1> mov edx, %4 402 <1> %endif 402 <1> %endif 402 <1> %endif 402 00000292 B82C000000 <1> mov eax, %1 402 <1> 402 00000297 CD40 <1> int 40h 403 ; Signal Response Byte 404 ;jc short error_exit 405 406 00000299 C605[BF0C0000]00 mov byte [SbIrq], 0 ; clear the IRQ level. 407 408 000002A0 668B15[BD0C0000] mov dx, [SbAddr] ; tells to the SB to 409 000002A7 6683C20C add dx, 0Ch ; generate a IRQ! 410 WaitSb: ;in al, dx 411 000002AB B400 mov ah, 0 ; inb 412 000002AD CD34 int 34h 413 000002AF 08C0 or al, al 414 000002B1 78F8 js short WaitSb 415 000002B3 B0F2 mov al, 0F2h 416 ;out dx, al 417 000002B5 B401 mov ah,1 ; outb 418 000002B7 CD34 int 34h 419 420 000002B9 31C9 xor ecx, ecx ; wait until IRQ level 421 WaitIRQ: 422 000002BB 803D[BF0C0000]00 cmp byte [SbIrq], 0 ; is changed or timeout. 423 000002C2 7506 jne short IrqOk 424 000002C4 6649 dec cx 425 000002C6 75F3 jnz short WaitIRQ 426 000002C8 EB0F jmp short RestoreIrqs 427 IrqOk: 428 000002CA 668B15[BD0C0000] mov dx, [SbAddr] 429 000002D1 6683C20E add dx, 0Eh 430 ;in al, dx ; SB acknowledge. 431 000002D5 B400 mov ah, 0 ; inb 432 000002D7 CD34 int 34h 433 ;mov al, 20h 434 ;;out 20h, al ; Hardware acknowledge. 435 ;mov ah,1 ; outb 436 ;int 34h 437 438 RestoreIrqs: ; UNLINK SIGNAL RESPONSE/RETURN BYTE FROM REQUESTED IRQ 439 sys _calbac, 2 ; unlink IRQ 2 439 <1> 439 <1> 439 <1> 439 <1> 439 <1> %if %0 >= 2 439 000002D9 BB02000000 <1> mov ebx, %2 439 <1> %if %0 >= 3 439 <1> mov ecx, %3 439 <1> %if %0 = 4 439 <1> mov edx, %4 439 <1> %endif 439 <1> %endif 439 <1> %endif 439 000002DE B82C000000 <1> mov eax, %1 439 <1> 439 000002E3 CD40 <1> int 40h 440 ; Signal Response Byte 441 sys _calbac, 3 ; unlink IRQ 3 441 <1> 441 <1> 441 <1> 441 <1> 441 <1> %if %0 >= 2 441 000002E5 BB03000000 <1> mov ebx, %2 441 <1> %if %0 >= 3 441 <1> mov ecx, %3 441 <1> %if %0 = 4 441 <1> mov edx, %4 441 <1> %endif 441 <1> %endif 441 <1> %endif 441 000002EA B82C000000 <1> mov eax, %1 441 <1> 441 000002EF CD40 <1> int 40h 442 ; Signal Response Byte 443 sys _calbac, 4 ; unlink IRQ 4 443 <1> 443 <1> 443 <1> 443 <1> 443 <1> %if %0 >= 2 443 000002F1 BB04000000 <1> mov ebx, %2 443 <1> %if %0 >= 3 443 <1> mov ecx, %3 443 <1> %if %0 = 4 443 <1> mov edx, %4 443 <1> %endif 443 <1> %endif 443 <1> %endif 443 000002F6 B82C000000 <1> mov eax, %1 443 <1> 443 000002FB CD40 <1> int 40h 444 ; Signal Response Byte 445 sys _calbac, 5 ; unlink IRQ 5 445 <1> 445 <1> 445 <1> 445 <1> 445 <1> %if %0 >= 2 445 000002FD BB05000000 <1> mov ebx, %2 445 <1> %if %0 >= 3 445 <1> mov ecx, %3 445 <1> %if %0 = 4 445 <1> mov edx, %4 445 <1> %endif 445 <1> %endif 445 <1> %endif 445 00000302 B82C000000 <1> mov eax, %1 445 <1> 445 00000307 CD40 <1> int 40h 446 ; Signal Response Byte 447 sys _calbac, 7 ; unlink IRQ 7 447 <1> 447 <1> 447 <1> 447 <1> 447 <1> %if %0 >= 2 447 00000309 BB07000000 <1> mov ebx, %2 447 <1> %if %0 >= 3 447 <1> mov ecx, %3 447 <1> %if %0 = 4 447 <1> mov edx, %4 447 <1> %endif 447 <1> %endif 447 <1> %endif 447 0000030E B82C000000 <1> mov eax, %1 447 <1> 447 00000313 CD40 <1> int 40h 448 ; Signal Response Byte 449 450 00000315 803D[BF0C0000]00 cmp byte [SbIrq], 0 ; IRQ level was changed? 451 0000031C 743A je short Fail ; no, fail. 452 Success: 453 0000031E 668B15[BD0C0000] mov dx, [SbAddr] ; Print Sucessful message. 454 00000325 8A0D[BF0C0000] mov cl, [SbIrq] 455 0000032B C0EA04 shr dl, 4 456 0000032E 80C230 add dl, '0' 457 00000331 8815[BF0D0000] mov [PortText], dl 458 00000337 80C130 add cl, '0' 459 0000033A 880D[C80D0000] mov [IrqText], cl 460 461 sys _msg, MsgFound, 255, 0Fh 461 <1> 461 <1> 461 <1> 461 <1> 461 <1> %if %0 >= 2 461 00000340 BB[9F0D0000] <1> mov ebx, %2 461 <1> %if %0 >= 3 461 00000345 B9FF000000 <1> mov ecx, %3 461 <1> %if %0 = 4 461 0000034A BA0F000000 <1> mov edx, %4 461 <1> %endif 461 <1> %endif 461 <1> %endif 461 0000034F B823000000 <1> mov eax, %1 461 <1> 461 00000354 CD40 <1> int 40h 462 463 00000356 61 popad ; Return to caller. 464 00000357 C3 retn 465 466 Fail: 467 ; Print Failed Message, 468 ; and exit to MainProg. 469 470 sys _msg, MsgNotFound, 255, 0Fh 470 <1> 470 <1> 470 <1> 470 <1> 470 <1> %if %0 >= 2 470 00000358 BB[770D0000] <1> mov ebx, %2 470 <1> %if %0 >= 3 470 0000035D B9FF000000 <1> mov ecx, %3 470 <1> %if %0 = 4 470 00000362 BA0F000000 <1> mov edx, %4 470 <1> %endif 470 <1> %endif 470 <1> %endif 470 00000367 B823000000 <1> mov eax, %1 470 <1> 470 0000036C CD40 <1> int 40h 471 472 sys _exit 472 <1> 472 <1> 472 <1> 472 <1> 472 <1> %if %0 >= 2 472 <1> mov ebx, %2 472 <1> %if %0 >= 3 472 <1> mov ecx, %3 472 <1> %if %0 = 4 472 <1> mov edx, %4 472 <1> %endif 472 <1> %endif 472 <1> %endif 472 0000036E B801000000 <1> mov eax, %1 472 <1> 472 00000373 CD40 <1> int 40h 473 here: 474 00000375 EBFE jmp short here 475 476 ;============================================================================= 477 ; SB.ASM 478 ;============================================================================= 479 480 ; Sound Blaster DMA Driver v0.1b by Carlos Hasan. 481 ; July 24th, 1993. 482 483 ; EQUATES 484 485 DmaBufSize equ 65536 ; 12/03/2016 486 487 ; MACROS 488 489 %macro SbOut 1 490 %%Wait: 491 ;in al, dx 492 mov ah, 0 493 int 34h 494 or al, al 495 js short %%Wait 496 mov al, %1 497 ;out dx, al 498 mov ah, 1 499 int 34h 500 %endmacro 501 502 ; CODE 503 504 ;-------------------------------------------------------------------------- 505 ; SbIrqHandler: Sound Blaster IRQ handler. 506 ;-------------------------------------------------------------------------- 507 508 SbIrqHandler: ; SoundBlaster IRQ Callback service for TRDOS 386 509 ; 03/03/2017 510 511 ; 12/03/2017 512 ; 11/03/2017 513 514 00000377 668B15[BD0C0000] mov dx, [SbAddr] 515 0000037E 6683C20E add dx, 0Eh 516 ;in al, dx 517 ;mov ah, 0 518 00000382 28E4 sub ah, ah 519 00000384 CD34 int 34h 520 521 ;test byte [flags], ENDOFFILE ; end of file flag 522 ;jz short a_3 523 524 ;sub dx, 02h ; 0Ch 525 526 ; exit auto-initialize 8 bit transfer 527 ;SbOut 0DAh ; exit auto-initialize transfer command 528 ;jmp short a_5 529 530 a_3: 531 00000386 30C0 xor al, al ; 0 532 00000388 A2[570E0000] mov [iStatus], al 533 0000038D 3805[560E0000] cmp [DmaFlag], al 534 00000393 7702 ja short a_4 535 00000395 FEC0 inc al 536 a_4: 537 00000397 A2[560E0000] mov [DmaFlag], al ; 538 a_5: 539 sys _rele ; return from callback service 539 <1> 539 <1> 539 <1> 539 <1> 539 <1> %if %0 >= 2 539 <1> mov ebx, %2 539 <1> %if %0 >= 3 539 <1> mov ecx, %3 539 <1> %if %0 = 4 539 <1> mov edx, %4 539 <1> %endif 539 <1> %endif 539 <1> %endif 539 0000039C B827000000 <1> mov eax, %1 539 <1> 539 000003A1 CD40 <1> int 40h 540 541 ;-------------------------------------------------------------------------- 542 ; SbPoll: Sound Blaster Polling. 543 ;-------------------------------------------------------------------------- 544 545 SbPoll: 546 000003A3 60 pushad 547 548 ; 11/03/2017 549 000003A4 803D[570E0000]00 cmp byte [iStatus], 0 550 000003AB 7721 ja short Bye 551 552 000003AD C605[570E0000]01 mov byte [iStatus], 1 ; 1 = set before interrupt 553 ; (for preventing data load 554 ; without an interrupt) 555 556 ;test byte [flags], ENDOFFILE 557 ;jnz short sbPoll_stop 558 559 000003B4 BF[00000100] mov edi, DmaBuffer 560 000003B9 BB00800000 mov ebx, DmaBufSize/2 561 562 000003BE F605[560E0000]01 test byte [DmaFlag], 1 563 000003C5 7402 jz short FirstHalf 564 SecondHalf: 565 000003C7 01DF add edi, ebx 566 FirstHalf: 567 000003C9 E8CC070000 call GetSamples 568 Bye: 569 000003CE 61 popad 570 000003CF C3 retn 571 572 ;sbPoll_stop: ; 11/03/2017 573 ; ; exit auto-initialize 8 bit transfer 574 ; SbOut 0DAh ; exit auto-initialize transfer command 575 ; ;mov byte [tLoop}, 0 576 ; jmp short Bye 577 578 ;-------------------------------------------------------------------------- 579 ; SbInit: Initializes the Sound Blaster Driver. 580 ;-------------------------------------------------------------------------- 581 582 SbInit: 583 000003D0 60 pushad 584 585 000003D1 E841080000 call StartPlaying 586 SetBuffer: 587 ;mov byte [DmaFlag], 0 588 000003D6 8B1D[70710000] mov ebx, [DMA_phy_buff] ; physical addr of DMA buff 589 000003DC B900000100 mov ecx, DmaBufSize 590 000003E1 49 dec ecx 591 592 ; 8 bit DMA buffer setting (DMA channel 1) 593 000003E2 B005 mov al, 05h ; set mask bit for channel 1 (4+1) 594 ;out 0Ah, al 595 000003E4 66BA0A00 mov dx, 0Ah ; DMA mask register 596 000003E8 B401 mov ah, 1 ;outb 597 000003EA CD34 int 34h 598 599 000003EC 30C0 xor al, al ; stops all DMA processes on selected channel 600 ;out 0Ch, al 601 000003EE B20C mov dl, 0Ch ; clear selected channel register 602 ;mov ah, 1 ;outb 603 000003F0 CD34 int 34h 604 605 000003F2 88D8 mov al, bl ; byte 0 of DMA buffer address (physical) 606 ;out 02h, al 607 000003F4 B202 mov dl, 02h ; DMA channel 1 port number 608 ;mov ah, 1 ;outb 609 000003F6 CD34 int 34h 610 611 000003F8 88F8 mov al, bh ; byte 1 of DMA buffer address (physical) 612 ;out 02h, al 613 ;mov dl, 02h ; DMA channel 1 port number 614 ;mov ah, 1 ;outb 615 000003FA CD34 int 34h 616 617 000003FC C1EB10 shr ebx, 16 618 619 000003FF 88D8 mov al, bl ; byte 2 of DMA buffer address (physical) 620 ;out 83h, al 621 00000401 B283 mov dl, 83h ; page register port addr for channel 1 622 ;mov ah, 1 ;outb 623 00000403 CD34 int 34h 624 625 00000405 88C8 mov al, cl ; low byte of DMA count - 1 626 ;out 03h, al 627 00000407 B203 mov dl, 03h ; count register port addr for channel 1 628 ;mov ah, 1 ;outb 629 00000409 CD34 int 34h 630 631 0000040B 88E8 mov al, ch ; high byte of DMA count - 1 632 ;out 03h, al 633 ;mov dl, 03h ; count register port addr for channel 1 634 ;mov ah, 1 ;outb 635 0000040D CD34 int 34h 636 637 ; channel 1, read, autoinitialized, single mode 638 0000040F B049 mov al, 49h 639 ;out 0Bh, al 640 00000411 B20B mov dl, 0Bh ; DMA mode register port address 641 ;mov ah, 1 ;outb 642 00000413 CD34 int 34h 643 644 00000415 B001 mov al, 01h ; clear mask bit for channel 1 645 ;out 0Ah, al 646 00000417 B20A mov dl, 0Ah ; DMA mask register port address 647 ;mov ah, 1 ;outb 648 00000419 CD34 int 34h 649 ClearBuffer: 650 0000041B BF[00000100] mov edi, DmaBuffer ; virtual addr of DMA buff 651 ;mov ecx, DmaBufSize 652 00000420 41 inc ecx 653 00000421 B080 mov al, 80h 654 ;cld 655 00000423 F3AA rep stosb 656 SetIrq: 657 ; CALLBACK method 658 00000425 8A1D[BF0C0000] mov bl, [SbIrq] ; IRQ number 659 0000042B B702 mov bh, 2 ; Link IRQ to user for callback service 660 0000042D BA[77030000] mov edx, SbIrqHandler 661 sys _calbac 661 <1> 661 <1> 661 <1> 661 <1> 661 <1> %if %0 >= 2 661 <1> mov ebx, %2 661 <1> %if %0 >= 3 661 <1> mov ecx, %3 661 <1> %if %0 = 4 661 <1> mov edx, %4 661 <1> %endif 661 <1> %endif 661 <1> %endif 661 00000432 B82C000000 <1> mov eax, %1 661 <1> 661 00000437 CD40 <1> int 40h 662 ; SIGNAL RESPONSE BYTE method ; 04/03/2017 663 ;mov bl, [SbIrq] 664 ;mov bh, 1 ; Signal Response Byte method 665 ;movzx ecx, bl ; S.R.B. value = IRQ Number 666 ;mov edx, SbSrb ; S.R.B. address 667 ;sys _calbac 668 ResetDsp: 669 00000439 668B15[BD0C0000] mov dx, [SbAddr] 670 00000440 6683C206 add dx, 06h 671 00000444 B001 mov al, 1 672 ;out dx, al 673 00000446 B401 mov ah, 1 ;outb 674 00000448 CD34 int 34h 675 676 ;in al, dx 677 ;in al, dx 678 ;in al, dx 679 ;in al, dx 680 681 0000044A FECC dec ah ; ah = 0 ; inb 682 0000044C CD34 int 34h 683 ;mov ah, 0 684 0000044E CD34 int 34h 685 686 00000450 30C0 xor al, al 687 ;out dx, al 688 00000452 FEC4 inc ah ; ah = 1 ;outb 689 00000454 CD34 int 34h 690 691 00000456 66B96400 mov cx, 100 692 0000045A 28E4 sub ah, ah ; 0 693 WaitId: 694 0000045C 668B15[BD0C0000] mov dx, [SbAddr] 695 00000463 6683C20E add dx, 0Eh 696 ;in al, dx 697 ;mov ah, 0 ;inb 698 00000467 CD34 int 34h 699 00000469 08C0 or al, al 700 0000046B 7807 js short sb_GetId 701 0000046D E2ED loop WaitId 702 0000046F E9B2000000 jmp sb_Exit 703 sb_GetId: 704 00000474 668B15[BD0C0000] mov dx, [SbAddr] 705 0000047B 6683C20A add dx, 0Ah 706 ;in al, dx 707 ;mov ah, 0 ;inb 708 0000047F CD34 int 34h 709 00000481 3CAA cmp al, 0AAh 710 00000483 7407 je short SbOk 711 00000485 E2D5 loop WaitId 712 00000487 E99A000000 jmp sb_Exit 713 SbOk: 714 0000048C 668B15[BD0C0000] mov dx, [SbAddr] 715 00000493 6683C20C add dx, 0Ch 716 SbOut 0D1h 716 <1> %%Wait: 716 <1> 716 00000497 B400 <1> mov ah, 0 716 00000499 CD34 <1> int 34h 716 0000049B 08C0 <1> or al, al 716 0000049D 78F8 <1> js short %%Wait 716 0000049F B0D1 <1> mov al, %1 716 <1> 716 000004A1 B401 <1> mov ah, 1 716 000004A3 CD34 <1> int 34h 717 718 ; 11/03/2017 719 SbOut 41h ; 8 bit or 16 bit transfer 719 <1> %%Wait: 719 <1> 719 000004A5 B400 <1> mov ah, 0 719 000004A7 CD34 <1> int 34h 719 000004A9 08C0 <1> or al, al 719 000004AB 78F8 <1> js short %%Wait 719 000004AD B041 <1> mov al, %1 719 <1> 719 000004AF B401 <1> mov ah, 1 719 000004B1 CD34 <1> int 34h 720 000004B3 668B1D[98120000] mov bx, [sampling_rate] 721 SbOut bh ; sampling rate high byte 721 <1> %%Wait: 721 <1> 721 000004BA B400 <1> mov ah, 0 721 000004BC CD34 <1> int 34h 721 000004BE 08C0 <1> or al, al 721 000004C0 78F8 <1> js short %%Wait 721 000004C2 88F8 <1> mov al, %1 721 <1> 721 000004C4 B401 <1> mov ah, 1 721 000004C6 CD34 <1> int 34h 722 SbOut bl ; sampling rate low byte 722 <1> %%Wait: 722 <1> 722 000004C8 B400 <1> mov ah, 0 722 000004CA CD34 <1> int 34h 722 000004CC 08C0 <1> or al, al 722 000004CE 78F8 <1> js short %%Wait 722 000004D0 88D8 <1> mov al, %1 722 <1> 722 000004D2 B401 <1> mov ah, 1 722 000004D4 CD34 <1> int 34h 723 724 ; 22/04/2017 725 ;mov ah, 1 726 ;mov dx, [SbAddr] 727 ;add dx, 4 ; Mixer chip address port 728 000004D6 6683EA08 sub dx, 0Ch-04h 729 000004DA B022 mov al, 22h ; master volume 730 000004DC CD34 int 34h 731 000004DE 6642 inc dx 732 000004E0 B0FF mov al, 0FFh ; maximum volume level 733 000004E2 CD34 int 34h 734 000004E4 6683C207 add dx, 0Ch-05h 735 StartDma: 736 ; autoinitialized 8 bit DMA transfer mode 737 ;mov bx, 0C6h ; 8 bit output (0C6h) 738 ; PCM output (8 bit mono autoinitialized transfer) 739 ;SbOut bl ; bCommand 740 ;SbOut bh ; bMode 741 SbOut 0C6h ; bCommand (C6h = 8 bit autoinitialzed) 741 <1> %%Wait: 741 <1> 741 000004E8 B400 <1> mov ah, 0 741 000004EA CD34 <1> int 34h 741 000004EC 08C0 <1> or al, al 741 000004EE 78F8 <1> js short %%Wait 741 000004F0 B0C6 <1> mov al, %1 741 <1> 741 000004F2 B401 <1> mov ah, 1 741 000004F4 CD34 <1> int 34h 742 SbOut 0 ; bMode (0 = 8 bit mono) 742 <1> %%Wait: 742 <1> 742 000004F6 B400 <1> mov ah, 0 742 000004F8 CD34 <1> int 34h 742 000004FA 08C0 <1> or al, al 742 000004FC 78F8 <1> js short %%Wait 742 000004FE B000 <1> mov al, %1 742 <1> 742 00000500 B401 <1> mov ah, 1 742 00000502 CD34 <1> int 34h 743 00000504 66BB0080 mov bx, DmaBufSize / 2 744 00000508 664B dec bx ; wBlkSize is one less than the actual size 745 SbOut bl 745 <1> %%Wait: 745 <1> 745 0000050A B400 <1> mov ah, 0 745 0000050C CD34 <1> int 34h 745 0000050E 08C0 <1> or al, al 745 00000510 78F8 <1> js short %%Wait 745 00000512 88D8 <1> mov al, %1 745 <1> 745 00000514 B401 <1> mov ah, 1 745 00000516 CD34 <1> int 34h 746 SbOut bh 746 <1> %%Wait: 746 <1> 746 00000518 B400 <1> mov ah, 0 746 0000051A CD34 <1> int 34h 746 0000051C 08C0 <1> or al, al 746 0000051E 78F8 <1> js short %%Wait 746 00000520 88F8 <1> mov al, %1 746 <1> 746 00000522 B401 <1> mov ah, 1 746 00000524 CD34 <1> int 34h 747 sb_Exit: 748 00000526 61 popad 749 00000527 C3 retn 750 751 ;-------------------------------------------------------------------------- 752 ; SbDone: Shut Down the Sound Blaster Driver. 753 ;-------------------------------------------------------------------------- 754 755 SbDone: 756 00000528 60 pushad 757 758 00000529 8A1D[BF0C0000] mov bl, [SbIrq] ; IRQ number 759 0000052F 28FF sub bh, bh ; 0 = Unlink IRQ from user 760 sys _calbac 760 <1> 760 <1> 760 <1> 760 <1> 760 <1> %if %0 >= 2 760 <1> mov ebx, %2 760 <1> %if %0 >= 3 760 <1> mov ecx, %3 760 <1> %if %0 = 4 760 <1> mov edx, %4 760 <1> %endif 760 <1> %endif 760 <1> %endif 760 00000531 B82C000000 <1> mov eax, %1 760 <1> 760 00000536 CD40 <1> int 40h 761 762 00000538 668B15[BD0C0000] mov dx, [SbAddr] 763 0000053F 6683C20C add dx, 0Ch 764 SbOut 0D0h 764 <1> %%Wait: 764 <1> 764 00000543 B400 <1> mov ah, 0 764 00000545 CD34 <1> int 34h 764 00000547 08C0 <1> or al, al 764 00000549 78F8 <1> js short %%Wait 764 0000054B B0D0 <1> mov al, %1 764 <1> 764 0000054D B401 <1> mov ah, 1 764 0000054F CD34 <1> int 34h 765 SbOut 0D3h 765 <1> %%Wait: 765 <1> 765 00000551 B400 <1> mov ah, 0 765 00000553 CD34 <1> int 34h 765 00000555 08C0 <1> or al, al 765 00000557 78F8 <1> js short %%Wait 765 00000559 B0D3 <1> mov al, %1 765 <1> 765 0000055B B401 <1> mov ah, 1 765 0000055D CD34 <1> int 34h 766 767 0000055F E858070000 call StopPlaying 768 769 00000564 61 popad 770 00000565 C3 retn 771 772 ;============================================================================= 773 ; MODLOAD.ASM 774 ;============================================================================= 775 776 ; Amiga Module Loader v0.1b by Carlos Hasan. 777 ; July 10th, 1993. 778 779 ; STRUCTURES 780 781 struc ModSample 782 00000000 .msName: resb 22 783 00000016 .msLength: resw 1 784 00000018 .msFinetune: resb 1 785 00000019 .msVolume: resb 1 786 0000001A .msRepeat: resw 1 787 0000001C .msRepLen: resw 1 788 .size: 789 endstruc 790 791 struc ModHeader 792 00000000 .mhName: resb 20 793 00000014 .mhSamples: resb ModSample.size*31 794 000003B6 .mhOrderLen: resb 1 795 000003B7 .mhReStart: resb 1 796 000003B8 .mhOrder: resb 128 797 00000438 .mhSign: resw 2 798 .size: 799 endstruc 800 801 struc ModInfoRec 802 00000000 .OrderLen: resb 1 803 00000001 .ReStart: resb 1 804 00000002 .Order: resb 128 805 00000082 .Patterns: resd 1 806 00000086 .SampOfs: resw 31 807 000000C4 .SampSeg: resw 31 808 00000102 .SampLen: resw 31 809 00000140 .SampRep: resw 31 810 0000017E .SampRepLen: resw 31 811 000001BC .SampVol: resw 31 812 .size: 813 endstruc 814 815 ; CODE 816 817 LoadModule: 818 ; edi = file name address 819 820 00000566 60 pushad 821 822 ;call ClearModInfo ; 07/10/2017 (not necessary.) 823 OpenFile: 824 ; ebx = ASCIIZ file name address 825 ; ecx = open mode (0 = open for read) 826 sys _open, edi, 0 ; open for reading 826 <1> 826 <1> 826 <1> 826 <1> 826 <1> %if %0 >= 2 826 00000567 89FB <1> mov ebx, %2 826 <1> %if %0 >= 3 826 00000569 B900000000 <1> mov ecx, %3 826 <1> %if %0 = 4 826 <1> mov edx, %4 826 <1> %endif 826 <1> %endif 826 <1> %endif 826 0000056E B805000000 <1> mov eax, %1 826 <1> 826 00000573 CD40 <1> int 40h 827 00000575 0F8244010000 jc Failed 828 0000057B A3[580E0000] mov [FileHandle], eax 829 ReadHeader: 830 ; ebx = File handle 831 ; ecx = Buffer address 832 ; edx = Byte count 833 sys _read, [FileHandle], Header, ModHeader.size 833 <1> 833 <1> 833 <1> 833 <1> 833 <1> %if %0 >= 2 833 00000580 8B1D[580E0000] <1> mov ebx, %2 833 <1> %if %0 >= 3 833 00000586 B9[5C0E0000] <1> mov ecx, %3 833 <1> %if %0 = 4 833 0000058B BA3C040000 <1> mov edx, %4 833 <1> %endif 833 <1> %endif 833 <1> %endif 833 00000590 B803000000 <1> mov eax, %1 833 <1> 833 00000595 CD40 <1> int 40h 834 00000597 0F8213010000 jc CloseFile 835 CheckMK: 836 0000059D 813D[94120000]4D2E- cmp dword [Header+ModHeader.mhSign], 'M.K.' 836 000005A5 4B2E 837 000005A7 7412 je short IsModFile 838 CheckFLT4: 839 000005A9 813D[94120000]464C- cmp dword [Header+ModHeader.mhSign], 'FLT4' 839 000005B1 5434 840 000005B3 7406 je short IsModFile 841 ; 07/10/2017 842 000005B5 F9 stc 843 000005B6 E9F5000000 jmp CloseFile 844 IsModFile: 845 000005BB A0[12120000] mov al, [Header+ModHeader.mhOrderLen] 846 000005C0 A2[9A120000] mov [ModInfo.OrderLen], al 847 848 000005C5 A0[13120000] mov al, [Header+ModHeader.mhReStart] 849 000005CA 3A05[12120000] cmp al, [Header+ModHeader.mhOrderLen] 850 000005D0 7202 jb short SetReStart 851 000005D2 B07F mov al, 7Fh 852 SetReStart: 853 000005D4 A2[9B120000] mov [ModInfo.ReStart], al 854 855 ;mov ecx, 128 856 000005D9 66B98000 mov cx, 128 857 000005DD 31D2 xor edx, edx 858 000005DF 31DB xor ebx, ebx 859 CopyOrder: 860 000005E1 8AB3[14120000] mov dh, [Header+ModHeader.mhOrder+ebx] 861 000005E7 88B3[9C120000] mov [ModInfo.Order+ebx], dh 862 000005ED 38D6 cmp dh, dl 863 000005EF 7202 jb short NextOrder 864 000005F1 88F2 mov dl, dh 865 NextOrder: 866 000005F3 43 inc ebx 867 000005F4 E2EB loop CopyOrder 868 AllocPatterns: 869 000005F6 81E2FF000000 and edx, 0FFh 870 ;inc dx 871 000005FC FEC2 inc dl ; 07/10/2017 872 ; dl = count of 1024 bytes ; count of patterns (04/07/2017) 873 000005FE C1E20A shl edx, 10 ; *1024 ; (count of patterns *64*16) 874 875 00000601 89D5 mov ebp, edx ; offset of samples (04/07/2017) 876 ;mov ecx, 10000h ; next 64K (4096*16) 877 00000603 B9[00000200] mov ecx, file_buffer ; 12/03/2017 878 ; 879 00000608 890D[1C130000] mov [ModInfo.Patterns], ecx 880 ; 881 0000060E 01CD add ebp, ecx ; next offset for samples 882 ReadPatterns: 883 ;mov ebx, [FileHandle] 884 ; ebx = File handle 885 ; ecx = Buffer address 886 ; edx = Byte count 887 sys _read, [FileHandle] 887 <1> 887 <1> 887 <1> 887 <1> 887 <1> %if %0 >= 2 887 00000610 8B1D[580E0000] <1> mov ebx, %2 887 <1> %if %0 >= 3 887 <1> mov ecx, %3 887 <1> %if %0 = 4 887 <1> mov edx, %4 887 <1> %endif 887 <1> %endif 887 <1> %endif 887 00000616 B803000000 <1> mov eax, %1 887 <1> 887 0000061B CD40 <1> int 40h 888 0000061D 0F828D000000 jc CloseFile 889 890 ; paterns have been loaded here... (04/07/2017) 891 892 00000623 BE[700E0000] mov esi, Header+ModHeader.mhSamples 893 00000628 31FF xor edi, edi 894 CopySamples: 895 0000062A 668B4616 mov ax, [esi+ModSample.msLength] 896 0000062E 86C4 xchg al, ah 897 00000630 66D1E0 shl ax, 1 898 00000633 668987[9C130000] mov [ModInfo.SampLen+edi], ax 899 0000063A 8A4619 mov al, [esi+ModSample.msVolume] 900 0000063D 30E4 xor ah, ah 901 0000063F 668987[56140000] mov [ModInfo.SampVol+edi], ax 902 00000646 668B461A mov ax, [esi+ModSample.msRepeat] 903 0000064A 86C4 xchg al, ah 904 0000064C 66D1E0 shl ax, 1 905 0000064F 668987[DA130000] mov [ModInfo.SampRep+edi], ax 906 00000656 668B461C mov ax, [esi+ModSample.msRepLen] 907 0000065A 86C4 xchg al, ah 908 0000065C 66D1E0 shl ax, 1 909 0000065F 668987[18140000] mov [ModInfo.SampRepLen+edi], ax 910 00000666 83C61E add esi, ModSample.size 911 00000669 6683C702 add di, 2 912 0000066D 6683FF3E cmp di, 2*31 913 00000671 72B7 jb short CopySamples 914 915 00000673 31F6 xor esi, esi 916 AllocSamples: 917 00000675 0FB796[9C130000] movzx edx, word [ModInfo.SampLen+esi] 918 ; 07/10/2017 919 ;shr dx, 4 ; *** 920 0000067C 21D2 and edx, edx 921 0000067E 7426 jz short NextSample 922 ;inc dx ; number of paragraphs ; *** 923 ;shl dx, 4 ; *** 924 00000680 89E8 mov eax, ebp 925 00000682 668986[20130000] mov [ModInfo.SampOfs+esi], ax 926 00000689 C1E810 shr eax, 16 927 0000068C 668986[5E130000] mov [ModInfo.SampSeg+esi], ax 928 00000693 89E9 mov ecx, ebp 929 00000695 01D5 add ebp, edx ; next offset for sample 930 ReadSample: 931 ;mov ebx, [FileHandle] 932 ;movzx edx, [ModInfo.SampLen+esi] 933 ;mov ecx, [ModInfo.SampOfs+esi] 934 935 ; ebx = File handle 936 ; ecx = Buffer address 937 ; edx = Byte count 938 sys _read, [FileHandle] 938 <1> 938 <1> 938 <1> 938 <1> 938 <1> %if %0 >= 2 938 00000697 8B1D[580E0000] <1> mov ebx, %2 938 <1> %if %0 >= 3 938 <1> mov ecx, %3 938 <1> %if %0 = 4 938 <1> mov edx, %4 938 <1> %endif 938 <1> %endif 938 <1> %endif 938 0000069D B803000000 <1> mov eax, %1 938 <1> 938 000006A2 CD40 <1> int 40h 939 000006A4 720A jc short CloseFile 940 941 NextSample: 942 000006A6 6683C602 add si, 2 943 000006AA 6683FE3E cmp si, 2*31 944 000006AE 72C5 jb short AllocSamples 945 CloseFile: 946 000006B0 9C pushf 947 sys _close, [FileHandle] 947 <1> 947 <1> 947 <1> 947 <1> 947 <1> %if %0 >= 2 947 000006B1 8B1D[580E0000] <1> mov ebx, %2 947 <1> %if %0 >= 3 947 <1> mov ecx, %3 947 <1> %if %0 = 4 947 <1> mov edx, %4 947 <1> %endif 947 <1> %endif 947 <1> %endif 947 000006B7 B806000000 <1> mov eax, %1 947 <1> 947 000006BC CD40 <1> int 40h 948 000006BE 9D popf 949 Failed: 950 000006BF 61 popad 951 952 000006C0 C3 retn 953 954 FreeModule: 955 ; Erdogan Tan (13/02/2017) 956 ; nothing to do here for memory de-allocation 957 ClearModInfo: 958 000006C1 57 push edi 959 000006C2 BF[9A120000] mov edi, ModInfo 960 000006C7 B9FA010000 mov ecx, ModInfoRec.size 961 ;cld 962 000006CC 30C0 xor al, al 963 000006CE F3AA rep stosb 964 000006D0 5F pop edi 965 000006D1 C3 retn 966 967 ;============================================================================= 968 ; MODPLAY.ASM 969 ;============================================================================= 970 971 ; Amiga Module Loader v0.3b by Carlos Hasan. 972 ; July 23th, 1993. 973 974 ; EQUATES 975 976 NumTracks equ 4 977 DefTempo equ 6 978 DefBpm equ 125 979 MidCRate equ 8448 980 MixBufSize equ 4096 981 982 ; STRUCTURES 983 984 struc TrackInfo 985 00000000 .Samples: resd 1 986 00000004 .Position: resd 1 987 00000008 .Len: resw 1 988 0000000A .Repeat: resw 1 989 0000000C .RepLen: resw 1 990 0000000E .Volume: resb 1 991 0000000F .Error: resb 1 992 00000010 .Period: resw 1 993 00000012 .Pitch: resw 1 994 00000014 .Effect: resw 1 995 00000016 .PortTo: resw 1 996 00000018 .PortParm: resb 1 997 00000019 .VibPos: resb 1 998 0000001A .VibParm: resb 1 999 0000001B .OldSampOfs: resb 1 1000 0000001C .Arp: resw 3 1001 00000022 .ArpIndex: resw 1 1002 .size: 1003 endstruc 1004 1005 ; CODE 1006 1007 ;-------------------------------------------------------------------------- 1008 ; BeatTrack: Process the next beat in one track. 1009 ; In: 1010 ; ds:di - Track info Address. 1011 ;-------------------------------------------------------------------------- 1012 1013 ; edi = Track info address 1014 1015 BeatTrack: 1016 000006D2 668B5714 mov dx, [edi+TrackInfo.Effect] 1017 000006D6 6685D2 test dx, dx 1018 000006D9 743C je short None 1019 000006DB 80FE00 cmp dh, 00h 1020 000006DE 7438 je short Arpeggio 1021 000006E0 80FE01 cmp dh, 01h 1022 000006E3 7451 je short PortUp 1023 000006E5 80FE02 cmp dh, 02h 1024 000006E8 7471 je short PortDown 1025 000006EA 80FE03 cmp dh, 03h 1026 000006ED 0F848E000000 je TonePort 1027 000006F3 80FE04 cmp dh, 04h 1028 000006F6 0F84BD000000 je Vibrato 1029 000006FC 80FE05 cmp dh, 05h 1030 000006FF 0F840E010000 je PortSlide 1031 00000705 80FE06 cmp dh, 06h 1032 00000708 0F8412010000 je VibSlide 1033 0000070E 80FE0A cmp dh, 0Ah 1034 00000711 0F8413010000 je VolSlide 1035 None: 1036 00000717 C3 retn 1037 Arpeggio: 1038 00000718 0FB75F22 movzx ebx, word [edi+TrackInfo.ArpIndex] 1039 0000071C 668B441F1C mov ax, [edi+TrackInfo.Arp+ebx] 1040 00000721 66894712 mov [edi+TrackInfo.Pitch], ax 1041 00000725 6683C302 add bx, 2 1042 00000729 6683FB06 cmp bx, 6 1043 0000072D 7202 jb short SetArpIndex 1044 0000072F 31DB xor ebx, ebx 1045 SetArpIndex: 1046 00000731 66895F22 mov [edi+TrackInfo.ArpIndex], bx 1047 00000735 C3 retn 1048 PortUp: 1049 00000736 30F6 xor dh, dh 1050 00000738 668B5F10 mov bx, [edi+TrackInfo.Period] 1051 0000073C 6629D3 sub bx, dx 1052 0000073F 6683FB71 cmp bx, 113 1053 00000743 7D04 jge short NotSmall 1054 00000745 66BB7100 mov bx, 113 1055 NotSmall: 1056 00000749 66895F10 mov [edi+TrackInfo.Period], bx 1057 0000074D 6601DB add bx, bx 1058 00000750 66678B87[9414] mov ax, [PitchTable+bx] 1059 00000756 66894712 mov [edi+TrackInfo.Pitch], ax 1060 0000075A C3 retn 1061 PortDown: 1062 0000075B 30F6 xor dh, dh 1063 0000075D 668B5F10 mov bx, [edi+TrackInfo.Period] 1064 00000761 6601D3 add bx, dx 1065 00000764 6681FB5803 cmp bx, 856 1066 00000769 7E04 jle short NotBig 1067 0000076B 66BB5803 mov bx, 856 1068 0000076F 66895F10 NotBig: mov [edi+TrackInfo.Period], bx 1069 00000773 6601DB add bx, bx 1070 00000776 66678B87[9414] mov ax, [PitchTable+bx] 1071 0000077C 66894712 mov [edi+TrackInfo.Pitch], ax 1072 00000780 C3 retn 1073 TonePort: 1074 00000781 30F6 xor dh, dh 1075 00000783 668B4716 mov ax, [edi+TrackInfo.PortTo] 1076 00000787 668B5F10 mov bx, [edi+TrackInfo.Period] 1077 0000078B 6639C3 cmp bx, ax 1078 0000078E 7428 je short NoPort 1079 00000790 7F0D jg short PortToUp 1080 PortToDown: 1081 00000792 6601D3 add bx, dx 1082 00000795 6639C3 cmp bx, ax 1083 00000798 7E0D jle short SetPort 1084 FixPort: 1085 0000079A 6689C3 mov bx, ax 1086 0000079D EB08 jmp short SetPort 1087 PortToUp: 1088 0000079F 6629D3 sub bx, dx 1089 000007A2 6639C3 cmp bx, ax 1090 000007A5 7CF3 jl short FixPort 1091 SetPort: 1092 000007A7 66895F10 mov [edi+TrackInfo.Period], bx 1093 000007AB 6601DB add bx, bx 1094 000007AE 66678B87[9414] mov ax, [PitchTable+bx] 1095 000007B4 66894712 mov [edi+TrackInfo.Pitch], ax 1096 NoPort: 1097 000007B8 C3 retn 1098 Vibrato: 1099 000007B9 88D6 mov dh, dl 1100 000007BB 80E20F and dl, 0Fh 1101 000007BE C0EE04 shr dh, 4 1102 000007C1 C0E602 shl dh, 2 1103 000007C4 007719 add [edi+TrackInfo.VibPos], dh 1104 000007C7 8A7719 mov dh, [edi+TrackInfo.VibPos] 1105 000007CA 88F3 mov bl, dh 1106 000007CC C0EB02 shr bl, 2 1107 000007CF 6683E31F and bx, 1Fh 1108 000007D3 678A87[ED0D] mov al, [SinTable+bx] 1109 000007D8 F6E2 mul dl 1110 000007DA 66D1C0 rol ax, 1 1111 000007DD 86C4 xchg al, ah 1112 000007DF 80E401 and ah, 1 1113 000007E2 84F6 test dh, dh 1114 000007E4 7903 jns short VibUp 1115 000007E6 66F7D8 neg ax 1116 VibUp: 1117 000007E9 66034710 add ax, [edi+TrackInfo.Period] 1118 000007ED 6689C3 mov bx, ax 1119 000007F0 6683FB71 cmp bx, 113 1120 000007F4 7D04 jge short NoLoVib 1121 000007F6 66BB7100 mov bx, 113 1122 NoLoVib: 1123 000007FA 6681FB5803 cmp bx, 856 1124 000007FF 7E04 jle short NoHiVib 1125 00000801 66BB5803 mov bx, 856 1126 NoHiVib: 1127 00000805 6601DB add bx, bx 1128 00000808 66678B87[9414] mov ax, [PitchTable+bx] 1129 0000080E 66894712 mov [edi+TrackInfo.Pitch], ax 1130 00000812 C3 retn 1131 PortSlide: 1132 00000813 E812000000 call VolSlide 1133 00000818 8A5718 mov dl, [edi+TrackInfo.PortParm] 1134 0000081B E961FFFFFF jmp TonePort 1135 VibSlide: 1136 00000820 E805000000 call VolSlide 1137 00000825 8A571A mov dl, [edi+TrackInfo.VibParm] 1138 00000828 EB8F jmp short Vibrato 1139 VolSlide: 1140 0000082A 88D6 mov dh, dl 1141 0000082C 80E20F and dl, 0Fh 1142 0000082F C0EE04 shr dh, 4 1143 00000832 8A470E mov al, [edi+TrackInfo.Volume] 1144 00000835 28D0 sub al, dl 1145 00000837 7D02 jge short NoLoVol 1146 00000839 30C0 xor al, al 1147 NoLoVol: 1148 0000083B 00F0 add al, dh 1149 0000083D 3C40 cmp al, 64 1150 0000083F 7602 jbe short NoHiVol 1151 00000841 B040 mov al, 64 1152 NoHiVol: 1153 00000843 88470E mov [edi+TrackInfo.Volume], al 1154 00000846 C3 retn 1155 1156 ;-------------------------------------------------------------------------- 1157 ; GetTrack: Get the next Note from a pattern. 1158 ; In: 1159 ; ds:di - Track info Address. 1160 ; es:si - Pattern Note Address. 1161 ; Out: 1162 ; es:si - The Next Pattern Note address. 1163 ;-------------------------------------------------------------------------- 1164 1165 ; esi = Pattern note address 1166 ; edi = Track info address 1167 1168 GetTrack: 1169 00000847 66AD lodsw 1170 00000849 86C4 xchg al, ah 1171 0000084B 88E3 mov bl, ah 1172 0000084D 80E40F and ah, 0Fh 1173 00000850 6689C1 mov cx, ax 1174 00000853 66AD lodsw 1175 00000855 86C4 xchg al, ah 1176 00000857 88E7 mov bh, ah 1177 00000859 80E40F and ah, 0Fh 1178 0000085C 6689C2 mov dx, ax 1179 0000085F 66895714 mov [edi+TrackInfo.Effect], dx 1180 00000863 80E3F0 and bl, 0F0h 1181 00000866 C0EF04 shr bh, 4 1182 00000869 08FB or bl, bh 1183 0000086B 744A je short SetPeriod 1184 SetSample: 1185 ;xor bh, bh 1186 0000086D 81E3FF000000 and ebx, 0FFh 1187 00000873 FECB dec bl 1188 00000875 01DB add ebx, ebx 1189 00000877 668B83[56140000] mov ax, [ModInfo.SampVol+ebx] 1190 0000087E 88470E mov [edi+TrackInfo.Volume], al 1191 00000881 668B83[20130000] mov ax, [ModInfo.SampOfs+ebx] 1192 00000888 668907 mov [edi+TrackInfo.Samples], ax 1193 0000088B 668B83[5E130000] mov ax, [ModInfo.SampSeg+ebx] 1194 00000892 66894702 mov [edi+TrackInfo.Samples+2], ax 1195 00000896 668B83[9C130000] mov ax, [ModInfo.SampLen+ebx] 1196 0000089D 66894708 mov [edi+TrackInfo.Len], ax 1197 000008A1 668B83[DA130000] mov ax, [ModInfo.SampRep+ebx] 1198 000008A8 6689470A mov [edi+TrackInfo.Repeat], ax 1199 000008AC 668B83[18140000] mov ax, [ModInfo.SampRepLen+ebx] 1200 000008B3 6689470C mov [edi+TrackInfo.RepLen], ax 1201 SetPeriod: 1202 000008B7 6685C9 test cx, cx 1203 000008BA 7424 jz short SetEffect 1204 1205 000008BC 66894F16 mov [edi+TrackInfo.PortTo], cx 1206 000008C0 80FE03 cmp dh, 03h 1207 000008C3 741B je short SetEffect 1208 1209 000008C5 66894F10 mov [edi+TrackInfo.Period], cx 1210 000008C9 6689CB mov bx, cx 1211 000008CC 6601DB add bx, bx 1212 000008CF 66678B87[9414] mov ax, [PitchTable+bx] 1213 000008D5 66894712 mov [edi+TrackInfo.Pitch], ax 1214 000008D9 C7470400000000 mov dword [edi+TrackInfo.Position], 0 1215 SetEffect: 1216 000008E0 6685D2 test dx, dx 1217 000008E3 7430 jz short InitNone 1218 000008E5 80FE00 cmp dh, 00h 1219 000008E8 0F84E5000000 je InitArpeggio 1220 000008EE 80FE03 cmp dh, 03h 1221 000008F1 7423 je short InitTonePort 1222 000008F3 80FE04 cmp dh, 04h 1223 000008F6 742D je short InitVibrato 1224 000008F8 80FE09 cmp dh, 09h 1225 000008FB 7451 je short SampleOfs 1226 000008FD 80FE0B cmp dh, 0Bh 1227 00000900 7462 je short PosJump 1228 00000902 80FE0C cmp dh, 0Ch 1229 00000905 746B je short SetVolume 1230 00000907 80FE0D cmp dh, 0Dh 1231 0000090A 7471 je short Break 1232 0000090C 80FE0F cmp dh, 0Fh 1233 0000090F 0F8487000000 je SetSpeed 1234 InitNone: 1235 00000915 C3 retn 1236 InitTonePort: 1237 00000916 84D2 test dl, dl 1238 00000918 7503 jnz short SetPortParm 1239 0000091A 8A5718 mov dl, [edi+TrackInfo.PortParm] 1240 SetPortParm: 1241 0000091D 885718 mov [edi+TrackInfo.PortParm], dl 1242 00000920 66895714 mov [edi+TrackInfo.Effect], dx 1243 00000924 C3 retn 1244 InitVibrato: 1245 00000925 8A471A mov al, [edi+TrackInfo.VibParm] 1246 00000928 88C4 mov ah, al 1247 0000092A 240F and al, 0Fh 1248 0000092C 80E4F0 and ah, 0F0h 1249 0000092F F6C20F test dl, 0Fh 1250 00000932 7502 jne short OkDepth 1251 00000934 08C2 or dl, al 1252 OkDepth: 1253 00000936 F6C2F0 test dl, 0F0h 1254 00000939 7502 jnz short OkRate 1255 0000093B 08E2 or dl, ah 1256 OkRate: 1257 0000093D 88571A mov [edi+TrackInfo.VibParm], dl 1258 00000940 66895714 mov [edi+TrackInfo.Effect], dx 1259 00000944 6685C9 test cx, cx 1260 00000947 7404 jz short OkPos 1261 00000949 C6471900 mov byte [edi+TrackInfo.VibPos], 0 1262 OkPos: 1263 0000094D C3 retn 1264 SampleOfs: 1265 0000094E 84D2 test dl, dl 1266 00000950 7503 jnz short SetSampleOfs 1267 00000952 8A571B mov dl, [edi+TrackInfo.OldSampOfs] 1268 SetSampleOfs: 1269 00000955 88571B mov [edi+TrackInfo.OldSampOfs], dl 1270 00000958 88D6 mov dh, dl 1271 0000095A 81E200FF0000 and edx, 0FF00h ; 05/03/2017 1272 00000960 895704 mov [edi+TrackInfo.Position], edx 1273 00000963 C3 retn 1274 PosJump: 1275 00000964 8815[466C0000] mov [OrderPos], dl 1276 0000096A C605[4A6C0000]40 mov byte [Row], 64 1277 00000971 C3 retn 1278 SetVolume: 1279 00000972 80FA40 cmp dl, 64 1280 00000975 7602 jbe short OkVol 1281 00000977 B240 mov dl, 64 1282 OkVol: 1283 00000979 88570E mov [edi+TrackInfo.Volume], dl 1284 0000097C C3 retn 1285 Break: 1286 0000097D 88D6 mov dh, dl 1287 0000097F 80E20F and dl, 0Fh 1288 00000982 C0EE04 shr dh, 4 1289 00000985 00F6 add dh, dh 1290 00000987 00F2 add dl, dh 1291 00000989 C0E602 shl dh, 2 1292 0000098C 00F2 add dl, dh 1293 0000098E 8815[4B6C0000] mov [BreakRow], dl 1294 00000994 C605[4A6C0000]40 mov byte [Row], 64 1295 0000099B C3 retn 1296 SetSpeed: 1297 0000099C 84D2 test dl,dl 1298 0000099E 7432 je Skip 1299 000009A0 80FA1F cmp dl,31 1300 000009A3 770D ja short SetBpm 1301 SetTempo: 1302 000009A5 8815[476C0000] mov [Tempo], dl 1303 000009AB 8815[486C0000] mov [TempoWait], dl 1304 000009B1 C3 retn 1305 SetBpm: 1306 000009B2 8815[496C0000] mov [Bpm], dl 1307 000009B8 B067 mov al, 103 1308 000009BA F6E2 mul dl 1309 000009BC 88E3 mov bl, ah 1310 000009BE 30FF xor bh, bh 1311 000009C0 66A1[98120000] mov ax, [MixSpeed] 1312 000009C6 6631D2 xor dx, dx 1313 000009C9 66F7F3 div bx 1314 000009CC 66A3[4C6C0000] mov [BpmSamples], ax 1315 Skip: 1316 000009D2 C3 retn 1317 InitArpeggio: 1318 000009D3 88D6 mov dh, dl 1319 000009D5 80E20F and dl, 0Fh 1320 000009D8 C0EE04 shr dh, 4 1321 000009DB 66B92400 mov cx, 36 1322 000009DF 31DB xor ebx, ebx 1323 000009E1 668B4710 mov ax, [edi+TrackInfo.Period] 1324 gt_ScanPeriod: 1325 000009E5 66673B87[0D0E] cmp ax, [PeriodTable+bx] 1326 000009EB 7306 jae short SetArp 1327 000009ED 6683C302 add bx, 2 1328 000009F1 E2F2 loop gt_ScanPeriod 1329 SetArp: 1330 000009F3 6601D2 add dx, dx 1331 000009F6 00DE add dh, bl 1332 000009F8 00DA add dl, bl 1333 000009FA 66678B9F[0D0E] mov bx, [PeriodTable+bx] 1334 00000A00 6601DB add bx, bx 1335 00000A03 66678B87[9414] mov ax, [PitchTable+bx] 1336 00000A09 6689471C mov [edi+TrackInfo.Arp], ax 1337 00000A0D 88F3 mov bl, dh 1338 00000A0F 30FF xor bh, bh 1339 00000A11 66678B9F[0D0E] mov bx, [PeriodTable+bx] 1340 00000A17 6601DB add bx, bx 1341 00000A1A 66678B87[9414] mov ax, [PitchTable+bx] 1342 00000A20 6689471E mov [edi+TrackInfo.Arp+2], ax 1343 00000A24 88D3 mov bl, dl 1344 00000A26 30FF xor bh, bh 1345 00000A28 66678B9F[0D0E] mov bx, [PeriodTable+bx] 1346 00000A2E 6601DB add bx, bx 1347 00000A31 66678B87[9414] mov ax, [PitchTable+bx] 1348 00000A37 66894720 mov [edi+TrackInfo.Arp+4], ax 1349 00000A3B 66C747220000 mov word [edi+TrackInfo.ArpIndex], 0 1350 00000A41 C3 retn 1351 1352 ;-------------------------------------------------------------------------- 1353 ; UpdateTracks: Main code to process the next tick to be played. 1354 ;-------------------------------------------------------------------------- 1355 1356 UpdateTracks: 1357 00000A42 FE0D[486C0000] dec byte [TempoWait] 1358 00000A48 7415 jz short GetTracks 1359 1360 00000A4A B904000000 mov ecx, NumTracks 1361 00000A4F BF[5C6C0000] mov edi, Tracks 1362 BeatTracks: 1363 00000A54 E879FCFFFF call BeatTrack 1364 00000A59 83C724 add edi, TrackInfo.size 1365 00000A5C E2F6 loop BeatTracks 1366 00000A5E C3 retn 1367 GetTracks: 1368 00000A5F A0[476C0000] mov al, [Tempo] 1369 00000A64 A2[486C0000] mov [TempoWait], al 1370 1371 00000A69 8B35[586C0000] mov esi, [Note] 1372 00000A6F 803D[4A6C0000]40 cmp byte [Row], 64 1373 00000A76 7263 jb short NoPattWrap 1374 1375 00000A78 8B35[1C130000] mov esi, [ModInfo.Patterns] 1376 00000A7E 8A1D[466C0000] mov bl, [OrderPos] 1377 00000A84 3A1D[9A120000] cmp bl, [ModInfo.OrderLen] 1378 00000A8A 7214 jb short NoOrderWrap 1379 00000A8C 8A1D[9B120000] mov bl, [ModInfo.ReStart] 1380 00000A92 881D[466C0000] mov [OrderPos], bl 1381 00000A98 3A1D[9A120000] cmp bl, [ModInfo.OrderLen] 1382 00000A9E 735D jae short NoUpdate 1383 NoOrderWrap: 1384 ;xor bh, bh 1385 00000AA0 81E3FF000000 and ebx, 0FFh 1386 00000AA6 8A9B[9C120000] mov bl, [ModInfo.Order+ebx] 1387 00000AAC C1E30A shl ebx, 10 ; *1024 1388 00000AAF 01DE add esi, ebx 1389 00000AB1 8A1D[4B6C0000] mov bl, [BreakRow] 1390 00000AB7 881D[4A6C0000] mov [Row], bl 1391 ;xor bh, bh 1392 00000ABD 81E3FF000000 and ebx, 0FFh 1393 00000AC3 883D[4B6C0000] mov [BreakRow], bh ; 0 1394 00000AC9 66C1E304 shl bx, 4 1395 00000ACD 01DE add esi, ebx 1396 00000ACF 8935[586C0000] mov [Note], esi 1397 00000AD5 FE05[466C0000] inc byte [OrderPos] 1398 NoPattWrap: 1399 00000ADB FE05[4A6C0000] inc byte [Row] 1400 1401 ;cld 1402 00000AE1 B904000000 mov ecx, NumTracks 1403 00000AE6 BF[5C6C0000] mov edi, Tracks 1404 GetTracks_next: 1405 00000AEB 51 push ecx 1406 00000AEC E856FDFFFF call GetTrack 1407 00000AF1 59 pop ecx 1408 00000AF2 83C724 add edi, TrackInfo.size 1409 00000AF5 E2F4 loop GetTracks_next 1410 1411 00000AF7 8935[586C0000] mov [Note], esi 1412 NoUpdate: 1413 00000AFD C3 retn 1414 1415 ;-------------------------------------------------------------------------- 1416 ; MixTrack: Mixes one track into a CLEAN buffer. 1417 ; In: 1418 ; ds:si - Track Info Address. 1419 ; ds:di - Buffer Address. 1420 ; cx - Buffer Size. 1421 ;-------------------------------------------------------------------------- 1422 1423 ; esi = Track info address 1424 ; edi = Buffer address 1425 ; ecx = Buffer size 1426 1427 MixTrack: 1428 00000AFE 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1429 00000B03 7748 ja short MixLooped 1430 MixNonLooped: 1431 00000B05 8B16 mov edx, [esi+TrackInfo.Samples] 1432 00000B07 8B5E04 mov ebx, [esi+TrackInfo.Position] 1433 00000B0A 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1434 00000B0E 52 push edx 1435 00000B0F 56 push esi 1436 00000B10 01D3 add ebx, edx 1437 00000B12 01D5 add ebp, edx 1438 00000B14 668B5612 mov dx, [esi+TrackInfo.Pitch] 1439 00000B18 8A460E mov al, [esi+TrackInfo.Volume] 1440 00000B1B 8A660F mov ah, [esi+TrackInfo.Error] 1441 00000B1E 89DE mov esi, ebx 1442 00000B20 88C7 mov bh, al 1443 00000B22 88D0 mov al, dl 1444 00000B24 88F2 mov dl, dh 1445 ;xor dh, dh 1446 00000B26 81E2FF000000 and edx, 0FFh 1447 nlMixSamp: 1448 00000B2C 39EE cmp esi, ebp 1449 00000B2E 7310 jae short nlMixBye 1450 00000B30 8A1E mov bl, [esi] 1451 00000B32 678A9F[461B] mov bl, [VolTable+bx] 1452 00000B37 001F add [edi], bl 1453 00000B39 47 inc edi 1454 00000B3A 00C4 add ah, al 1455 00000B3C 11D6 adc esi, edx 1456 00000B3E E2EC loop nlMixSamp 1457 nlMixBye: 1458 00000B40 89F3 mov ebx, esi 1459 00000B42 5E pop esi 1460 00000B43 5A pop edx 1461 00000B44 29D3 sub ebx, edx 1462 00000B46 895E04 mov [esi+TrackInfo.Position], ebx 1463 00000B49 88660F mov [esi+TrackInfo.Error], ah 1464 00000B4C C3 retn 1465 MixLooped: 1466 00000B4D 8B16 mov edx, [esi+TrackInfo.Samples] 1467 00000B4F 8B5E04 mov ebx, [esi+TrackInfo.Position] 1468 00000B52 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1469 00000B56 892D[546C0000] mov [BufRep], ebp 1470 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1471 00000B5C 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1472 00000B60 52 push edx 1473 00000B61 56 push esi 1474 00000B62 01D3 add ebx, edx 1475 00000B64 01D5 add ebp, edx 1476 00000B66 668B5612 mov dx, [esi+TrackInfo.Pitch] 1477 00000B6A 8A460E mov al, [esi+TrackInfo.Volume] 1478 00000B6D 8A660F mov ah, [esi+TrackInfo.Error] 1479 ;mov si, bx 1480 00000B70 89DE mov esi, ebx ; 04/09/2017 1481 00000B72 88C7 mov bh, al 1482 00000B74 88D0 mov al, dl 1483 00000B76 88F2 mov dl, dh 1484 ;xor dh, dh 1485 00000B78 81E2FF000000 and edx, 0FFh 1486 lpMixSamp: 1487 00000B7E 39EE cmp esi, ebp 1488 00000B80 7206 jb short lpMixNow 1489 00000B82 2B35[546C0000] sub esi, [BufRep] 1490 lpMixNow: 1491 00000B88 8A1E mov bl, [esi] 1492 00000B8A 678A9F[461B] mov bl, [VolTable+bx] 1493 00000B8F 001F add [edi], bl 1494 00000B91 47 inc edi 1495 00000B92 00C4 add ah, al 1496 00000B94 11D6 adc esi, edx 1497 00000B96 E2E6 loop lpMixSamp 1498 lpMixBye: 1499 ; mov ebx, esi 1500 ; pop esi 1501 ; pop edx 1502 ; sub ebx, edx 1503 ; mov [esi+TrackInfo.Position], ebx 1504 ; mov [esi+TrackInfo.Error], ah 1505 ; retn 1506 00000B98 EBA6 jmp short nlMixBye 1507 1508 ;-------------------------------------------------------------------------- 1509 ; GetSamples: Returns the next chunk of samples to be played. 1510 ; In: 1511 ; Buffer - Buffer Address. 1512 ; Count - Buffer Size. 1513 ;-------------------------------------------------------------------------- 1514 1515 GetSamples: 1516 ; edi = buffer address 1517 ; ebx = count 1518 1519 00000B9A 60 pushad 1520 1521 ;cld 1522 NextChunk: 1523 00000B9B 66833D[526C0000]00 cmp word [BufLen], 0 1524 00000BA3 7548 jne short CopyChunk 1525 1526 00000BA5 53 push ebx 1527 00000BA6 57 push edi 1528 MixChunk: 1529 00000BA7 BF[465C0000] mov edi, MixBuffer 1530 00000BAC 0FB70D[4C6C0000] movzx ecx, word [BpmSamples] 1531 ;mov cx, [BpmSamples] 1532 00000BB3 893D[4E6C0000] mov [BufPtr], edi 1533 00000BB9 66890D[526C0000] mov [BufLen], cx 1534 1535 00000BC0 B080 mov al, 80h 1536 00000BC2 F3AA rep stosb 1537 1538 00000BC4 66B90400 mov cx, NumTracks 1539 00000BC8 BE[386C0000] mov esi, Tracks - TrackInfo.size 1540 GetSamples_next: 1541 00000BCD 51 push ecx 1542 00000BCE 83C624 add esi, TrackInfo.size 1543 00000BD1 668B0D[526C0000] mov cx, [BufLen] 1544 00000BD8 8B3D[4E6C0000] mov edi, [BufPtr] 1545 00000BDE E81BFFFFFF call MixTrack 1546 00000BE3 59 pop ecx 1547 00000BE4 E2E7 loop GetSamples_next 1548 1549 00000BE6 E857FEFFFF call UpdateTracks 1550 1551 00000BEB 5F pop edi 1552 00000BEC 5B pop ebx 1553 CopyChunk: 1554 ;mov cx, [BufLen] 1555 00000BED 0FB70D[526C0000] movzx ecx, word [BufLen] 1556 00000BF4 39D9 cmp ecx, ebx 1557 ;cmp cx, bx 1558 00000BF6 7602 jbe short MoveChunk 1559 ;mov cx, bx 1560 00000BF8 89D9 mov ecx, ebx 1561 MoveChunk: 1562 00000BFA 8B35[4E6C0000] mov esi, [BufPtr] 1563 00000C00 010D[4E6C0000] add [BufPtr], ecx 1564 00000C06 66290D[526C0000] sub [BufLen], cx 1565 00000C0D 29CB sub ebx, ecx 1566 00000C0F F3A4 rep movsb 1567 00000C11 85DB test ebx, ebx 1568 00000C13 7586 jnz short NextChunk 1569 1570 00000C15 61 popad 1571 00000C16 C3 retn 1572 1573 ;-------------------------------------------------------------------------- 1574 ; StartPlaying: Initializes the Sound System. 1575 ; In: 1576 ; Module Information Resources. 1577 ;-------------------------------------------------------------------------- 1578 1579 StartPlaying: 1580 00000C17 60 pushad 1581 SetModParms: 1582 00000C18 C605[466C0000]00 mov byte [OrderPos], 0 1583 00000C1F C605[476C0000]06 mov byte [Tempo], DefTempo 1584 00000C26 C605[486C0000]06 mov byte [TempoWait], DefTempo 1585 00000C2D C605[496C0000]7D mov byte [Bpm], DefBpm 1586 00000C34 C605[4A6C0000]40 mov byte [Row], 64 1587 00000C3B C605[4B6C0000]00 mov byte [BreakRow], 0 1588 00000C42 66A1[98120000] mov ax, [MixSpeed] 1589 00000C48 31D2 xor edx, edx 1590 00000C4A 66BB3200 mov bx, 24*DefBpm/60 1591 00000C4E 66F7F3 div bx 1592 00000C51 66A3[4C6C0000] mov [BpmSamples], ax 1593 ClearTracks: 1594 00000C57 BF[5C6C0000] mov edi, Tracks 1595 00000C5C B990000000 mov ecx, NumTracks*TrackInfo.size 1596 00000C61 31C0 xor eax, eax 1597 ;cld 1598 00000C63 F3AA rep stosb 1599 1600 00000C65 A3[4E6C0000] mov [BufPtr], eax 1601 00000C6A 66A3[526C0000] mov [BufLen], ax 1602 MakePitch: 1603 00000C70 66B80021 mov ax, MidCRate 1604 00000C74 66BBAC01 mov bx, 428 1605 00000C78 66F7E3 mul bx 1606 00000C7B 66F735[98120000] div word [MixSpeed] 1607 00000C82 30F6 xor dh, dh 1608 00000C84 88E2 mov dl, ah 1609 00000C86 88C4 mov ah, al 1610 00000C88 30C0 xor al, al 1611 00000C8A 66B95903 mov cx, 857 1612 00000C8E 31DB xor ebx, ebx 1613 00000C90 BF[94140000] mov edi, PitchTable 1614 PitchLoop: 1615 00000C95 50 push eax 1616 00000C96 52 push edx 1617 00000C97 6639DA cmp dx, bx 1618 00000C9A 7303 jae short NoDiv 1619 00000C9C 66F7F3 div bx 1620 NoDiv: 1621 00000C9F 66AB stosw 1622 00000CA1 5A pop edx 1623 00000CA2 58 pop eax 1624 00000CA3 6643 inc bx 1625 00000CA5 E2EE loop PitchLoop 1626 MakeVolume: 1627 00000CA7 66B90041 mov cx, 16640 1628 00000CAB 89CB mov ebx, ecx 1629 VolLoop: 1630 00000CAD 664B dec bx 1631 00000CAF 88D8 mov al, bl 1632 00000CB1 F6EF imul bh 1633 00000CB3 88A3[461B0000] mov [VolTable+ebx], ah 1634 00000CB9 E2F2 loop VolLoop 1635 1636 00000CBB 61 popad 1637 ;retn 1638 1639 ;-------------------------------------------------------------------------- 1640 ; StopPlaying: ShutDown the Sound System. 1641 ;-------------------------------------------------------------------------- 1642 1643 StopPlaying: 1644 00000CBC C3 retn 1645 1646 ;============================================================================= 1647 ; preinitialized data 1648 ;============================================================================= 1649 1650 ;============================================================================= 1651 ; SB.ASM - DATA 1652 ;============================================================================= 1653 1654 00000CBD 2002 SbAddr: dw 220h 1655 00000CBF 07 SbIrq: db 7 1656 ;Srbs: db 0 1657 1658 ;============================================================================= 1659 ; PLAY.ASM - DATA 1660 ;============================================================================= 1661 1662 msg_usage: 1663 00000CC0 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 1663 00000CC9 506C6179657220666F- 1663 00000CD2 72205452444F532033- 1663 00000CDB 383620627920457264- 1663 00000CE4 6F67616E2054616E2E- 1663 00000CED 20 1664 00000CEE 4F63746F6265722032- db 'October 2017.',10,13 1664 00000CF7 3031372E0A0D 1665 00000CFD 75736167653A207469- db 'usage: tinyplay filename.mod', 10, 13,0 1665 00000D06 6E79706C6179206669- 1665 00000D0F 6C656E616D652E6D6F- 1665 00000D18 640A0D00 1666 00000D1C 30372F31302F323031- db '07/10/2017' 1666 00000D25 37 1667 1668 00000D26 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 1668 00000D2F 506C61796572207630- 1668 00000D38 2E3162206279204361- 1668 00000D41 726C6F732048617361- 1668 00000D4A 6E2E204A756C792031- 1668 00000D53 3939332E 1669 00000D57 0A0D00 db 10,13,0 1670 00000D5A 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 1670 00000D63 64696E67204D6F6475- 1670 00000D6C 6C652066696C652E0A- 1670 00000D75 0D00 1671 00000D77 536F756E6420426C61- MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 1671 00000D80 73746572206E6F7420- 1671 00000D89 666F756E64206F7220- 1671 00000D92 495251206572726F72- 1671 00000D9B 2E0A0D00 1672 00000D9F 536F756E6420426C61- MsgFound: db 'Sound Blaster found at Address 2' 1672 00000DA8 7374657220666F756E- 1672 00000DB1 642061742041646472- 1672 00000DBA 6573732032 1673 00000DBF 7830682C2049525120 PortText: db 'x0h, IRQ ' 1674 00000DC8 782E0A0D00 IrqText: db 'x.',10,13,0 1675 1676 trdos386_err_msg: 1677 00000DCD 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 1677 00000DD6 2053797374656D2063- 1677 00000DDF 616C6C206572726F72- 1677 00000DE8 20210A0D00 1678 1679 ;============================================================================= 1680 ; MODPLAY.ASM - DATA 1681 ;============================================================================= 1682 1683 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 1684 1685 00000DED 0019324A62788EA2B4- SinTable: db 0,25,50,74,98,120,142,162,180,197,212,225 1685 00000DF6 C5D4E1 1686 00000DF9 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 1686 00000E02 E1 1687 00000E03 D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 1687 00000E0C 19 1688 1689 00000E0D 58032803FA02D002A6- PeriodTable: dw 856,808,762,720,678,640,604,570,538,508,480,453 1689 00000E16 0280025C023A021A02- 1689 00000E1F FC01E001C501 1690 00000E25 AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 1690 00000E2E 0140012E011D010D01- 1690 00000E37 FE00F000E200 1691 00000E3D D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 1691 00000E46 00A00097008F008700- 1691 00000E4F 7F0078007100 1692 1693 bss_start: 1694 1695 ABSOLUTE bss_start 1696 1697 00000E55 alignb 2 1698 1699 ;============================================================================= 1700 ; uninitialized data 1701 ;============================================================================= 1702 1703 ; SB.ASM 1704 00000E56 DmaFlag resb 1 1705 1706 ; 11/03/2017 1707 00000E57 iStatus: resb 1 1708 1709 ; MODLOAD.ASM 1710 00000E58 FileHandle: resd 1 1711 00000E5C Header: resb ModHeader.size 1712 1713 ; MODPLAY.ASM 1714 sampling_rate: ; 11/03/2017 1715 00001298 MixSpeed: resw 1 1716 1717 ModInfo: 1718 0000129A ModInfo.OrderLen: resb 1 1719 0000129B ModInfo.ReStart: resb 1 1720 0000129C ModInfo.Order: resb 128 1721 0000131C ModInfo.Patterns: resd 1 1722 1723 00001320 ModInfo.SampOfs: resw 31 1724 0000135E ModInfo.SampSeg: resw 31 1725 0000139C ModInfo.SampLen: resw 31 1726 000013DA ModInfo.SampRep: resw 31 1727 00001418 ModInfo.SampRepLen: resw 31 1728 00001456 ModInfo.SampVol: resw 31 1729 1730 ; MODPLAY.ASM 1731 00001494 PitchTable: resw 857 1732 00001B46 VolTable: resb 16640 1733 00005C46 MixBuffer resb MixBufSize 1734 1735 ; MODPLAY.ASM 1736 00006C46 OrderPos: resb 1 1737 00006C47 Tempo: resb 1 1738 00006C48 TempoWait: resb 1 1739 00006C49 Bpm: resb 1 1740 00006C4A Row: resb 1 1741 00006C4B BreakRow: resb 1 1742 00006C4C BpmSamples: resw 1 1743 00006C4E BufPtr: resd 1 1744 00006C52 BufLen: resw 1 1745 00006C54 BufRep: resd 1 1746 00006C58 Note: resd 1 1747 00006C5C Tracks: resb TrackInfo.size*NumTracks 1748 1749 00006CEC alignb 16 1750 1751 ; PLAY.ASM 1752 00006CF0 Scope: resw 320 1753 00006F70 RowOfs: resw 256 1754 1755 ;03/03/2017 1756 00007170 DMA_phy_buff: resd 1 1757 mod_file_name: 1758 00007174 resb 16 1759 1760 ; 12/03/2017 1761 00007184 alignb 65536 1762 1763 DmaBuffer: 1764 00010000 DoubleBuffer: resb 65536 ; DmaBufSize 1765 file_buffer: 1766 00020000 resb 65536*6 ; 13/03/2017 1767 EOF: