1 ; **************************************************************************** 2 ; playmod2.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; PLAYMOD2.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN 5 ; 6 ; 05/03/2017 7 ; 8 ; [ Last Modification: 08/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 ; Modified by using the source code of 'tinyplay.s' ('TINYPLAY.PRG') 14 ; by Erdogan Tan (07/10/2017) 15 ; 16 ; Modified from 'wavplay2.s' (11/06/2017) 17 ; 18 ; Modified from 'TINYPLAY.PRG' ('tinyplay.s') source code by Erdogan Tan 19 ; (05/03/2017) 20 ; 21 ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan 22 ; (04/03/2017) 23 ; Assembler: NASM 2.11 24 ; ---------------------------------------------------------------------------- 25 ; nasm playmod.s -l playmod.txt -o PLAYMOD.PRG 26 ; **************************************************************************** 27 ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017) 28 ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017) 29 30 ; 01/03/2017 31 ; 16/10/2016 32 ; 29/04/2016 33 ; TRDOS 386 system calls (temporary list!) 34 _ver equ 0 35 _exit equ 1 36 _fork equ 2 37 _read equ 3 38 _write equ 4 39 _open equ 5 40 _close equ 6 41 _wait equ 7 42 _creat equ 8 43 _link equ 9 44 _unlink equ 10 45 _exec equ 11 46 _chdir equ 12 47 _time equ 13 48 _mkdir equ 14 49 _chmod equ 15 50 _chown equ 16 51 _break equ 17 52 _stat equ 18 53 _seek equ 19 54 _tell equ 20 55 _mount equ 21 56 _umount equ 22 57 _setuid equ 23 58 _getuid equ 24 59 _stime equ 25 60 _quit equ 26 61 _intr equ 27 62 _fstat equ 28 63 _emt equ 29 64 _mdate equ 30 65 _video equ 31 66 _audio equ 32 67 _timer equ 33 68 _sleep equ 34 69 _msg equ 35 70 _geterr equ 36 71 _fpsave equ 37 72 _pri equ 38 73 _rele equ 39 74 _fff equ 40 75 _fnf equ 41 76 _alloc equ 42 77 _dalloc equ 43 78 _calbac equ 44 79 80 %macro sys 1-4 81 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 82 ; 03/09/2015 83 ; 13/04/2015 84 ; Retro UNIX 386 v1 system call. 85 %if %0 >= 2 86 mov ebx, %2 87 %if %0 >= 3 88 mov ecx, %3 89 %if %0 = 4 90 mov edx, %4 91 %endif 92 %endif 93 %endif 94 mov eax, %1 95 ;int 30h 96 int 40h ; TRDOS 386 (TRDOS v2.0) 97 %endmacro 98 99 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 100 ; sys systemcall (eax) , , 101 102 ; 19/06/2017 103 BUFFERSIZE equ 32768 104 105 ; ---------------------------------------------------------------------------- 106 ; Tiny MOD Player v0.1b by Carlos Hasan. 107 ; July 14th, 1993. 108 109 ;============================================================================= 110 ; 111 ;============================================================================= 112 113 [BITS 32] 114 [org 0] 115 116 Start: 117 ; clear bss 118 00000000 B9[00000900] mov ecx, EOF 119 00000005 BF[A20D0000] mov edi, bss_start 120 0000000A 29F9 sub ecx, edi 121 0000000C D1E9 shr ecx, 1 122 0000000E 31C0 xor eax, eax 123 00000010 F366AB rep stosw 124 125 ; Detect (& Enable) VT8233 Audio Device 126 00000013 E8CF010000 call DetectVT8233 127 00000018 731B jnc short GetFileName 128 129 _dev_not_ready: 130 ; couldn't find the audio device! 131 sys _msg, noDevMsg, 255, 0Fh 131 <1> 131 <1> 131 <1> 131 <1> 131 <1> %if %0 >= 2 131 0000001A BB[F4010000] <1> mov ebx, %2 131 <1> %if %0 >= 3 131 0000001F B9FF000000 <1> mov ecx, %3 131 <1> %if %0 = 4 131 00000024 BA0F000000 <1> mov edx, %4 131 <1> %endif 131 <1> %endif 131 <1> %endif 131 00000029 B823000000 <1> mov eax, %1 131 <1> 131 0000002E CD40 <1> int 40h 132 00000030 E991010000 jmp Exit 133 134 GetFileName: 135 00000035 89E6 mov esi, esp 136 00000037 AD lodsd 137 00000038 83F802 cmp eax, 2 ; two arguments 138 ; (program file name & mod file name) 139 0000003B 0F828E010000 jb pmsg_2017 ; nothing to do 140 141 00000041 AD lodsd ; program file name address 142 00000042 AD lodsd ; mod file name address (file to be read) 143 00000043 89C6 mov esi, eax 144 00000045 BF[D0700000] mov edi, mod_file_name 145 ScanName: 146 0000004A AC lodsb 147 0000004B 84C0 test al, al 148 0000004D 0F847C010000 je pmsg_2017 149 00000053 3C20 cmp al, 20h 150 00000055 74F3 je short ScanName ; scan start of name. 151 00000057 AA stosb 152 00000058 B4FF mov ah, 0FFh 153 a_0: 154 0000005A FEC4 inc ah 155 a_1: 156 0000005C AC lodsb 157 0000005D AA stosb 158 0000005E 3C2E cmp al, '.' 159 00000060 74F8 je short a_0 160 00000062 20C0 and al, al 161 00000064 75F6 jnz short a_1 162 163 00000066 08E4 or ah, ah ; if period NOT found, 164 00000068 750B jnz short PrintMesg ; then add a .MOD extension. 165 SetExt: 166 0000006A 4F dec edi 167 0000006B C7072E4D4F44 mov dword [edi], '.MOD' 168 00000071 C6470400 mov byte [edi+4], 0 169 PrintMesg: 170 ; Prints the Credits Text. 171 sys _msg, Credits, 255, 0Fh 171 <1> 171 <1> 171 <1> 171 <1> 171 <1> %if %0 >= 2 171 00000075 BB[250C0000] <1> mov ebx, %2 171 <1> %if %0 >= 3 171 0000007A B9FF000000 <1> mov ecx, %3 171 <1> %if %0 = 4 171 0000007F BA0F000000 <1> mov edx, %4 171 <1> %endif 171 <1> %endif 171 <1> %endif 171 00000084 B823000000 <1> mov eax, %1 171 <1> 171 00000089 CD40 <1> int 40h 172 _1: 173 ; 19/06/2017 174 ; Allocate Audio Buffer (for user) 175 sys _audio, 0200h, BUFFERSIZE, Audio_Buffer 175 <1> 175 <1> 175 <1> 175 <1> 175 <1> %if %0 >= 2 175 0000008B BB00020000 <1> mov ebx, %2 175 <1> %if %0 >= 3 175 00000090 B900800000 <1> mov ecx, %3 175 <1> %if %0 = 4 175 00000095 BA[00800000] <1> mov edx, %4 175 <1> %endif 175 <1> %endif 175 <1> %endif 175 0000009A B820000000 <1> mov eax, %1 175 <1> 175 0000009F CD40 <1> int 40h 176 000000A1 0F82F1000000 jc error_exit 177 _2: 178 ; Initialize Audio Device (bl = 1 -> Interrrupt method) 179 ;sys _audio, 0301h, 0, ac97_int_handler 180 ;jc error_exit 181 182 ; Initialize Audio Device (bl = 0 -> SRB method) 183 sys _audio, 0300h, 1, srb 183 <1> 183 <1> 183 <1> 183 <1> 183 <1> %if %0 >= 2 183 000000A7 BB00030000 <1> mov ebx, %2 183 <1> %if %0 >= 3 183 000000AC B901000000 <1> mov ecx, %3 183 <1> %if %0 = 4 183 000000B1 BA[B30D0000] <1> mov edx, %4 183 <1> %endif 183 <1> %endif 183 <1> %endif 183 000000B6 B820000000 <1> mov eax, %1 183 <1> 183 000000BB CD40 <1> int 40h 184 000000BD 0F82D5000000 jc error_exit 185 186 LoadMod: 187 000000C3 BF[D0700000] mov edi, mod_file_name 188 000000C8 E8EA010000 call LoadModule ; Load the MODule... 189 ; 08/10/2017 190 000000CD 731B jnc short _3 ; any error loading? 191 192 ; yes, print error and Exit. 193 194 sys _msg, ErrorMesg, 255, 0Fh 194 <1> 194 <1> 194 <1> 194 <1> 194 <1> %if %0 >= 2 194 000000CF BB[590C0000] <1> mov ebx, %2 194 <1> %if %0 >= 3 194 000000D4 B9FF000000 <1> mov ecx, %3 194 <1> %if %0 = 4 194 000000D9 BA0F000000 <1> mov edx, %4 194 <1> %endif 194 <1> %endif 194 <1> %endif 194 000000DE B823000000 <1> mov eax, %1 194 <1> 194 000000E3 CD40 <1> int 40h 195 196 000000E5 E9DC000000 jmp Exit 197 198 _3: 199 ; 10/06/2017 200 sys _audio, 0E00h ; get audio controller info 200 <1> 200 <1> 200 <1> 200 <1> 200 <1> %if %0 >= 2 200 000000EA BB000E0000 <1> mov ebx, %2 200 <1> %if %0 >= 3 200 <1> mov ecx, %3 200 <1> %if %0 = 4 200 <1> mov edx, %4 200 <1> %endif 200 <1> %endif 200 <1> %endif 200 000000EF B820000000 <1> mov eax, %1 200 <1> 200 000000F4 CD40 <1> int 40h 201 000000F6 0F829C000000 jc error_exit 202 203 ;cmp ah, 3 ; VT 8233? (VIA AC'97 Audio Controller) 204 ;jne _dev_not_ready 205 206 ; EAX = IRQ Number in AL 207 ; Audio Device Number in AH 208 ; EBX = DEV/VENDOR ID 209 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 210 ; ECX = BUS/DEV/FN 211 ; (00000000BBBBBBBBDDDDDFFF00000000) 212 ; EDX = Base IO Addr (DX) for SB16 & VT8233 213 ; EDX = NABMBAR/NAMBAR (for AC97) 214 ; (Low word, DX = NAMBAR address) 215 216 000000FC A2[B20D0000] mov [ac97_int_ln_reg], al 217 00000101 891D[A40D0000] mov [dev_vendor], ebx 218 00000107 890D[A80D0000] mov [bus_dev_fn], ecx 219 0000010D 668915[B00D0000] mov [ac97_io_base], dx 220 221 00000114 E823090000 call write_audio_dev_info 222 223 PlayNow: 224 00000119 E849080000 call StartPlaying 225 226 ; load 32768 bytes into audio buffer 227 0000011E BF[00800000] mov edi, Audio_Buffer 228 00000123 BB00800000 mov ebx, BUFFERSIZE 229 00000128 E8BD070000 call GetSamples 230 0000012D 7269 jc error_exit 231 232 ;mov ecx, 128 ; Make a lookup table 233 0000012F B180 mov cl, 128 234 00000131 31DB xor ebx, ebx ; for fastest pixel 235 00000133 BA002D0000 mov edx, 320*(100-64) ; addressing. 236 MakeOfs: 237 00000138 668993[D06E0000] mov [RowOfs+ebx], dx 238 0000013F 668993[D26E0000] mov [RowOfs+ebx+2], dx 239 00000146 6681C24001 add dx, 320 240 0000014B 83C304 add ebx, 4 241 0000014E E2E8 loop MakeOfs 242 243 ; Set Master Volume Level 244 sys _audio, 0B00h, 1D1Dh 244 <1> 244 <1> 244 <1> 244 <1> 244 <1> %if %0 >= 2 244 00000150 BB000B0000 <1> mov ebx, %2 244 <1> %if %0 >= 3 244 00000155 B91D1D0000 <1> mov ecx, %3 244 <1> %if %0 = 4 244 <1> mov edx, %4 244 <1> %endif 244 <1> %endif 244 <1> %endif 244 0000015A B820000000 <1> mov eax, %1 244 <1> 244 0000015F CD40 <1> int 40h 245 246 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 247 248 ; Start to play 249 00000161 A0[FF0C0000] mov al, [bps] 250 00000166 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 251 00000169 D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 252 0000016B 8A1D[FE0C0000] mov bl, [stmo] 253 00000171 FECB dec bl 254 00000173 08C3 or bl, al 255 00000175 668B0D[000D0000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 256 0000017C B704 mov bh, 4 ; start to play 257 sys _audio 257 <1> 257 <1> 257 <1> 257 <1> 257 <1> %if %0 >= 2 257 <1> mov ebx, %2 257 <1> %if %0 >= 3 257 <1> mov ecx, %3 257 <1> %if %0 = 4 257 <1> mov edx, %4 257 <1> %endif 257 <1> %endif 257 <1> %endif 257 0000017E B820000000 <1> mov eax, %1 257 <1> 257 00000183 CD40 <1> int 40h 258 259 ;; SETUP SIGNAL RESPONSE BYTE 260 ;; 06/03/2017 261 ;mov bl, [ac97_int_ln_reg] ; IRQ number 262 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 263 ;mov edx, srb ; Signal Response/Return Byte address 264 ;mov ecx, 0FFh ; Signal Response/Return Byte value 265 ;sys _calbac 266 ;jc short error_exit 267 268 ; DIRECT VGA MEMORY ACCESS 269 ; bl = 0, bh = 5 270 ; Direct access/map to VGA memory (0A0000h) 271 272 sys _video, 0500h 272 <1> 272 <1> 272 <1> 272 <1> 272 <1> %if %0 >= 2 272 00000185 BB00050000 <1> mov ebx, %2 272 <1> %if %0 >= 3 272 <1> mov ecx, %3 272 <1> %if %0 = 4 272 <1> mov edx, %4 272 <1> %endif 272 <1> %endif 272 <1> %endif 272 0000018A B81F000000 <1> mov eax, %1 272 <1> 272 0000018F CD40 <1> int 40h 273 00000191 3D00000A00 cmp eax, 0A0000h 274 00000196 7418 je short _a3 275 error_exit: 276 sys _msg, trdos386_err_msg, 255, 0Eh 276 <1> 276 <1> 276 <1> 276 <1> 276 <1> %if %0 >= 2 276 00000198 BB[760C0000] <1> mov ebx, %2 276 <1> %if %0 >= 3 276 0000019D B9FF000000 <1> mov ecx, %3 276 <1> %if %0 = 4 276 000001A2 BA0E000000 <1> mov edx, %4 276 <1> %endif 276 <1> %endif 276 <1> %endif 276 000001A7 B823000000 <1> mov eax, %1 276 <1> 276 000001AC CD40 <1> int 40h 277 000001AE EB16 jmp short Exit 278 279 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 280 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 281 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 282 ; second, or the module will sound "looped". 283 ; Because we need better sync with the ModPlayer to draw the scope, 284 ; the polling is called from my routine, and then the irq 0 must be 285 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 286 ; samples played by the Sound Blaster. Note that some samples are 287 ; discarded in the next code, just for fun! 288 289 _a3: 290 000001B0 66B81300 mov ax, 0013h ; Set Mode 320x200x256 291 000001B4 CD31 int 31h 292 293 000001B6 E870000000 call ModPlay ; 13/02/2017 294 295 _s_exit: 296 000001BB E84B080000 call StopPlaying ; STOP! 297 298 000001C0 66B80300 mov ax, 0003h ; Set Text Mode 80x25x16 299 000001C4 CD31 int 31h 300 Exit: 301 ;call FreeModule ; Free MODule core. 302 303 sys _exit ; Bye ! 303 <1> 303 <1> 303 <1> 303 <1> 303 <1> %if %0 >= 2 303 <1> mov ebx, %2 303 <1> %if %0 >= 3 303 <1> mov ecx, %3 303 <1> %if %0 = 4 303 <1> mov edx, %4 303 <1> %endif 303 <1> %endif 303 <1> %endif 303 000001C6 B801000000 <1> mov eax, %1 303 <1> 303 000001CB CD40 <1> int 40h 304 here: 305 000001CD EBFE jmp short here 306 307 pmsg_2017: 308 sys _msg, msg_2017, 255, 0Fh 308 <1> 308 <1> 308 <1> 308 <1> 308 <1> %if %0 >= 2 308 000001CF BB[BD0B0000] <1> mov ebx, %2 308 <1> %if %0 >= 3 308 000001D4 B9FF000000 <1> mov ecx, %3 308 <1> %if %0 = 4 308 000001D9 BA0F000000 <1> mov edx, %4 308 <1> %endif 308 <1> %endif 308 <1> %endif 308 000001DE B823000000 <1> mov eax, %1 308 <1> 308 000001E3 CD40 <1> int 40h 309 000001E5 EBDF jmp short Exit 310 311 DetectVT8233: 312 ; Detect (BH=1) VT8233 (BL=3) Audio Controller 313 sys _audio, 0103h 313 <1> 313 <1> 313 <1> 313 <1> 313 <1> %if %0 >= 2 313 000001E7 BB03010000 <1> mov ebx, %2 313 <1> %if %0 >= 3 313 <1> mov ecx, %3 313 <1> %if %0 = 4 313 <1> mov edx, %4 313 <1> %endif 313 <1> %endif 313 <1> %endif 313 000001EC B820000000 <1> mov eax, %1 313 <1> 313 000001F1 CD40 <1> int 40h 314 000001F3 C3 retn 315 316 noDevMsg: 317 000001F4 4572726F723A20556E- db "Error: Unable to find VIA VT8233 based audio device!",13,10,0 317 000001FD 61626C6520746F2066- 317 00000206 696E64205649412056- 317 0000020F 543832333320626173- 317 00000218 656420617564696F20- 317 00000221 646576696365210D0A- 317 0000022A 00 318 319 ;ac97_int_handler: 320 ; ; 19/06/2017 321 ; mov byte [srb], 1 ; interrupt (or signal response byte) 322 ; 323 ; sys _rele ; return from callback service 324 ; ; we must not come here ! 325 ; sys _exit 326 327 ;============================================================================= 328 ; 329 ;============================================================================= 330 331 ModPlay: 332 ; 23/06/2017 333 ; 21/06/2017 334 ; 19/06/2017 335 336 ; 05/03/2017 (TRDOS 386) 337 ; 14/02/2017 338 ; 13/02/2017 339 ; 08/12/2016 340 ; 28/11/2016 341 342 0000022B EB10 jmp short modp_gs ; 23/06/2017 343 p_loop: 344 0000022D 803D[B30D0000]00 cmp byte [srb], 0 345 00000234 7616 jna short q_loop 346 00000236 C605[B30D0000]00 mov byte [srb], 0 347 modp_gs: 348 0000023D BF[00800000] mov edi, Audio_Buffer 349 00000242 BB00800000 mov ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017 350 00000247 E89E060000 call GetSamples 351 q_loop: 352 0000024C B401 mov ah, 1 ; any key pressed? 353 0000024E CD32 int 32h ; no, Loop. 354 00000250 7405 jz short r_loop 355 356 00000252 B400 mov ah, 0 ; flush key buffer... 357 00000254 CD32 int 32h 358 q_return: 359 00000256 C3 retn 360 r_loop: 361 ; Get Current Sound Data (in DMA buffer) ((320 bytes)) 362 ; 23/06/2017 363 ; 22/06/2017 364 ; bh = 15, get current sound data/samples 365 ; bl = 0, for PCM OUT 366 ; ecx = count of sample/data bytes (1 to 4096) 367 ; edx = destination buffer address 368 ; (page aligned address is better) 369 ; 370 sys _audio, 0F00h, 320, g_buff 370 <1> 370 <1> 370 <1> 370 <1> 370 <1> %if %0 >= 2 370 00000257 BB000F0000 <1> mov ebx, %2 370 <1> %if %0 >= 3 370 0000025C B940010000 <1> mov ecx, %3 370 <1> %if %0 = 4 370 00000261 BA[00000100] <1> mov edx, %4 370 <1> %endif 370 <1> %endif 370 <1> %endif 370 00000266 B820000000 <1> mov eax, %1 370 <1> 370 0000026B CD40 <1> int 40h 371 ScopeLoop: 372 0000026D BF00000A00 mov edi, 0A0000h ; VGA display memory address 373 ; 19/06/2017 374 00000272 BE[00000100] mov esi, g_buff ; display current samples 375 00000277 31C9 xor ecx, ecx ; to be drawed ... 376 00000279 31D2 xor edx, edx 377 DrawLoop: 378 0000027B 89D3 mov ebx, edx ; (save Index) 379 0000027D 668BBB[506C0000] mov di, [Scope+ebx] ; get old SCOPE pixel address 380 00000284 C60700 mov byte [edi], 0 ; erase it! 381 ;lodsb 382 ;mov bl, al 383 00000287 8A1E mov bl, [esi] ; get a sample (8-bit) 384 00000289 46 inc esi ; calc new pixel address... 385 0000028A 30FF xor bh, bh 386 0000028C 66D1E3 shl bx, 1 387 0000028F 668BBB[D06E0000] mov di, [RowOfs+ebx] 388 00000296 6601CF add di, cx 389 00000299 6689D3 mov bx, dx ; (restore Index) 390 0000029C 6689BB[506C0000] mov [Scope+ebx], di ; save new address... 391 000002A3 C6070A mov byte [edi], 10 ; and DRAW. 392 000002A6 6683C202 add dx, 2 ; the next pixel... 393 000002AA 41 inc ecx 394 000002AB 6681F94001 cmp cx, 320 ; 320 pixels drawed? 395 000002B0 72C9 jb short DrawLoop 396 000002B2 E976FFFFFF jmp p_loop 397 398 399 ;============================================================================= 400 ; MODLOAD.ASM 401 ;============================================================================= 402 403 ; Amiga Module Loader v0.1b by Carlos Hasan. 404 ; July 10th, 1993. 405 406 ; STRUCTURES 407 408 struc ModSample 409 00000000 .msName: resb 22 410 00000016 .msLength: resw 1 411 00000018 .msFinetune: resb 1 412 00000019 .msVolume: resb 1 413 0000001A .msRepeat: resw 1 414 0000001C .msRepLen: resw 1 415 .size: 416 endstruc 417 418 struc ModHeader 419 00000000 .mhName: resb 20 420 00000014 .mhSamples: resb ModSample.size*31 421 000003B6 .mhOrderLen: resb 1 422 000003B7 .mhReStart: resb 1 423 000003B8 .mhOrder: resb 128 424 00000438 .mhSign: resw 2 425 .size: 426 endstruc 427 428 struc ModInfoRec 429 00000000 .OrderLen: resb 1 430 00000001 .ReStart: resb 1 431 00000002 .Order: resb 128 432 00000082 .Patterns: resd 1 433 00000086 .SampOfs: resw 31 434 000000C4 .SampSeg: resw 31 435 00000102 .SampLen: resw 31 436 00000140 .SampRep: resw 31 437 0000017E .SampRepLen: resw 31 438 000001BC .SampVol: resw 31 439 .size: 440 endstruc 441 442 ; CODE 443 444 ; 07/10/2017 (playmod2.s) 445 446 LoadModule: 447 ; edi = file name address 448 449 000002B7 60 pushad 450 451 ;call ClearModInfo ; 07/10/2017 (not necessary.) 452 OpenFile: 453 ; ebx = ASCIIZ file name address 454 ; ecx = open mode (0 = open for read) 455 sys _open, edi, 0 ; open for reading 455 <1> 455 <1> 455 <1> 455 <1> 455 <1> %if %0 >= 2 455 000002B8 89FB <1> mov ebx, %2 455 <1> %if %0 >= 3 455 000002BA B900000000 <1> mov ecx, %3 455 <1> %if %0 = 4 455 <1> mov edx, %4 455 <1> %endif 455 <1> %endif 455 <1> %endif 455 000002BF B805000000 <1> mov eax, %1 455 <1> 455 000002C4 CD40 <1> int 40h 456 000002C6 0F8244010000 jc Failed 457 000002CC A3[B40D0000] mov [FileHandle], eax 458 ReadHeader: 459 ; ebx = File handle 460 ; ecx = Buffer address 461 ; edx = Byte count 462 sys _read, [FileHandle], Header, ModHeader.size 462 <1> 462 <1> 462 <1> 462 <1> 462 <1> %if %0 >= 2 462 000002D1 8B1D[B40D0000] <1> mov ebx, %2 462 <1> %if %0 >= 3 462 000002D7 B9[B80D0000] <1> mov ecx, %3 462 <1> %if %0 = 4 462 000002DC BA3C040000 <1> mov edx, %4 462 <1> %endif 462 <1> %endif 462 <1> %endif 462 000002E1 B803000000 <1> mov eax, %1 462 <1> 462 000002E6 CD40 <1> int 40h 463 000002E8 0F8213010000 jc CloseFile 464 CheckMK: 465 000002EE 813D[F0110000]4D2E- cmp dword [Header+ModHeader.mhSign], 'M.K.' 465 000002F6 4B2E 466 000002F8 7412 je short IsModFile 467 CheckFLT4: 468 000002FA 813D[F0110000]464C- cmp dword [Header+ModHeader.mhSign], 'FLT4' 468 00000302 5434 469 00000304 7406 je short IsModFile 470 ; 07/10/2017 471 00000306 F9 stc 472 00000307 E9F5000000 jmp CloseFile 473 IsModFile: 474 0000030C A0[6E110000] mov al, [Header+ModHeader.mhOrderLen] 475 00000311 A2[F4110000] mov [ModInfo.OrderLen], al 476 477 00000316 A0[6F110000] mov al, [Header+ModHeader.mhReStart] 478 0000031B 3A05[6E110000] cmp al, [Header+ModHeader.mhOrderLen] 479 00000321 7202 jb short SetReStart 480 00000323 B07F mov al, 7Fh 481 SetReStart: 482 00000325 A2[F5110000] mov [ModInfo.ReStart], al 483 484 ;mov ecx, 128 485 0000032A 66B98000 mov cx, 128 486 0000032E 31D2 xor edx, edx 487 00000330 31DB xor ebx, ebx 488 CopyOrder: 489 00000332 8AB3[70110000] mov dh, [Header+ModHeader.mhOrder+ebx] 490 00000338 88B3[F6110000] mov [ModInfo.Order+ebx], dh 491 0000033E 38D6 cmp dh, dl 492 00000340 7202 jb short NextOrder 493 00000342 88F2 mov dl, dh 494 NextOrder: 495 00000344 43 inc ebx 496 00000345 E2EB loop CopyOrder 497 AllocPatterns: 498 00000347 81E2FF000000 and edx, 0FFh 499 ;inc dx 500 0000034D FEC2 inc dl ; 07/10/2017 501 ; dl = count of 1024 bytes ; count of patterns (04/07/2017) 502 0000034F C1E20A shl edx, 10 ; *1024 ; (count of patterns *64*16) 503 504 00000352 89D5 mov ebp, edx ; offset of samples (04/07/2017) 505 ;mov ecx, 10000h ; next 64K (4096*16) 506 00000354 B9[00000200] mov ecx, file_buffer ; 12/03/2017 507 ; 508 00000359 890D[76120000] mov [ModInfo.Patterns], ecx 509 ; 510 0000035F 01CD add ebp, ecx ; next offset for samples 511 ReadPatterns: 512 ;mov ebx, [FileHandle] 513 ; ebx = File handle 514 ; ecx = Buffer address 515 ; edx = Byte count 516 sys _read, [FileHandle] 516 <1> 516 <1> 516 <1> 516 <1> 516 <1> %if %0 >= 2 516 00000361 8B1D[B40D0000] <1> mov ebx, %2 516 <1> %if %0 >= 3 516 <1> mov ecx, %3 516 <1> %if %0 = 4 516 <1> mov edx, %4 516 <1> %endif 516 <1> %endif 516 <1> %endif 516 00000367 B803000000 <1> mov eax, %1 516 <1> 516 0000036C CD40 <1> int 40h 517 0000036E 0F828D000000 jc CloseFile 518 519 ; paterns have been loaded here... (04/07/2017) 520 521 00000374 BE[CC0D0000] mov esi, Header+ModHeader.mhSamples 522 00000379 31FF xor edi, edi 523 CopySamples: 524 0000037B 668B4616 mov ax, [esi+ModSample.msLength] 525 0000037F 86C4 xchg al, ah 526 00000381 66D1E0 shl ax, 1 527 00000384 668987[F6120000] mov [ModInfo.SampLen+edi], ax 528 0000038B 8A4619 mov al, [esi+ModSample.msVolume] 529 0000038E 30E4 xor ah, ah 530 00000390 668987[B0130000] mov [ModInfo.SampVol+edi], ax 531 00000397 668B461A mov ax, [esi+ModSample.msRepeat] 532 0000039B 86C4 xchg al, ah 533 0000039D 66D1E0 shl ax, 1 534 000003A0 668987[34130000] mov [ModInfo.SampRep+edi], ax 535 000003A7 668B461C mov ax, [esi+ModSample.msRepLen] 536 000003AB 86C4 xchg al, ah 537 000003AD 66D1E0 shl ax, 1 538 000003B0 668987[72130000] mov [ModInfo.SampRepLen+edi], ax 539 000003B7 83C61E add esi, ModSample.size 540 000003BA 6683C702 add di, 2 541 000003BE 6683FF3E cmp di, 2*31 542 000003C2 72B7 jb short CopySamples 543 544 000003C4 31F6 xor esi, esi 545 AllocSamples: 546 000003C6 0FB796[F6120000] movzx edx, word [ModInfo.SampLen+esi] 547 ; 07/10/2017 548 ;shr dx, 4 ; *** 549 000003CD 21D2 and edx, edx 550 000003CF 7426 jz short NextSample 551 ;inc dx ; number of paragraphs ; *** 552 ;shl dx, 4 ; *** 553 000003D1 89E8 mov eax, ebp 554 000003D3 668986[7A120000] mov [ModInfo.SampOfs+esi], ax 555 000003DA C1E810 shr eax, 16 556 000003DD 668986[B8120000] mov [ModInfo.SampSeg+esi], ax 557 000003E4 89E9 mov ecx, ebp 558 000003E6 01D5 add ebp, edx ; next offset for sample 559 ReadSample: 560 ;mov ebx, [FileHandle] 561 ;movzx edx, [ModInfo.SampLen+esi] 562 ;mov ecx, [ModInfo.SampOfs+esi] 563 564 ; ebx = File handle 565 ; ecx = Buffer address 566 ; edx = Byte count 567 sys _read, [FileHandle] 567 <1> 567 <1> 567 <1> 567 <1> 567 <1> %if %0 >= 2 567 000003E8 8B1D[B40D0000] <1> mov ebx, %2 567 <1> %if %0 >= 3 567 <1> mov ecx, %3 567 <1> %if %0 = 4 567 <1> mov edx, %4 567 <1> %endif 567 <1> %endif 567 <1> %endif 567 000003EE B803000000 <1> mov eax, %1 567 <1> 567 000003F3 CD40 <1> int 40h 568 000003F5 720A jc short CloseFile 569 570 NextSample: 571 000003F7 6683C602 add si, 2 572 000003FB 6683FE3E cmp si, 2*31 573 000003FF 72C5 jb short AllocSamples 574 CloseFile: 575 00000401 9C pushf 576 sys _close, [FileHandle] 576 <1> 576 <1> 576 <1> 576 <1> 576 <1> %if %0 >= 2 576 00000402 8B1D[B40D0000] <1> mov ebx, %2 576 <1> %if %0 >= 3 576 <1> mov ecx, %3 576 <1> %if %0 = 4 576 <1> mov edx, %4 576 <1> %endif 576 <1> %endif 576 <1> %endif 576 00000408 B806000000 <1> mov eax, %1 576 <1> 576 0000040D CD40 <1> int 40h 577 0000040F 9D popf 578 Failed: 579 00000410 61 popad 580 581 00000411 C3 retn 582 583 FreeModule: 584 ; Erdogan Tan (13/02/2017) 585 ; nothing to do here for memory de-allocation 586 ClearModInfo: 587 00000412 57 push edi 588 00000413 BF[F4110000] mov edi, ModInfo 589 00000418 B9FA010000 mov ecx, ModInfoRec.size 590 ;cld 591 0000041D 30C0 xor al, al 592 0000041F F3AA rep stosb 593 00000421 5F pop edi 594 00000422 C3 retn 595 596 ;============================================================================= 597 ; MODPLAY.ASM 598 ;============================================================================= 599 600 ; Amiga Module Loader v0.3b by Carlos Hasan. 601 ; July 23th, 1993. 602 603 ; EQUATES 604 605 NumTracks equ 4 606 DefTempo equ 6 607 DefBpm equ 125 608 MidCRate equ 8448 609 MixBufSize equ 4096 610 611 ; STRUCTURES 612 613 struc TrackInfo 614 00000000 .Samples: resd 1 615 00000004 .Position: resd 1 616 00000008 .Len: resw 1 617 0000000A .Repeat: resw 1 618 0000000C .RepLen: resw 1 619 0000000E .Volume: resb 1 620 0000000F .Error: resb 1 621 00000010 .Period: resw 1 622 00000012 .Pitch: resw 1 623 00000014 .Effect: resw 1 624 00000016 .PortTo: resw 1 625 00000018 .PortParm: resb 1 626 00000019 .VibPos: resb 1 627 0000001A .VibParm: resb 1 628 0000001B .OldSampOfs: resb 1 629 0000001C .Arp: resw 3 630 00000022 .ArpIndex: resw 1 631 .size: 632 endstruc 633 634 ; CODE 635 636 ;-------------------------------------------------------------------------- 637 ; BeatTrack: Process the next beat in one track. 638 ; In: 639 ; ds:di - Track info Address. 640 ;-------------------------------------------------------------------------- 641 642 ; edi = Track info address 643 644 BeatTrack: 645 00000423 668B5714 mov dx, [edi+TrackInfo.Effect] 646 00000427 6685D2 test dx, dx 647 0000042A 743C je short None 648 0000042C 80FE00 cmp dh, 00h 649 0000042F 7438 je short Arpeggio 650 00000431 80FE01 cmp dh, 01h 651 00000434 7451 je short PortUp 652 00000436 80FE02 cmp dh, 02h 653 00000439 7471 je short PortDown 654 0000043B 80FE03 cmp dh, 03h 655 0000043E 0F848E000000 je TonePort 656 00000444 80FE04 cmp dh, 04h 657 00000447 0F84BD000000 je Vibrato 658 0000044D 80FE05 cmp dh, 05h 659 00000450 0F840E010000 je PortSlide 660 00000456 80FE06 cmp dh, 06h 661 00000459 0F8412010000 je VibSlide 662 0000045F 80FE0A cmp dh, 0Ah 663 00000462 0F8413010000 je VolSlide 664 None: 665 00000468 C3 retn 666 Arpeggio: 667 00000469 0FB75F22 movzx ebx, word [edi+TrackInfo.ArpIndex] 668 0000046D 668B441F1C mov ax, [edi+TrackInfo.Arp+ebx] 669 00000472 66894712 mov [edi+TrackInfo.Pitch], ax 670 00000476 6683C302 add bx, 2 671 0000047A 6683FB06 cmp bx, 6 672 0000047E 7202 jb short SetArpIndex 673 00000480 31DB xor ebx, ebx 674 SetArpIndex: 675 00000482 66895F22 mov [edi+TrackInfo.ArpIndex], bx 676 00000486 C3 retn 677 PortUp: 678 00000487 30F6 xor dh, dh 679 00000489 668B5F10 mov bx, [edi+TrackInfo.Period] 680 0000048D 6629D3 sub bx, dx 681 00000490 6683FB71 cmp bx, 113 682 00000494 7D04 jge short NotSmall 683 00000496 66BB7100 mov bx, 113 684 NotSmall: 685 0000049A 66895F10 mov [edi+TrackInfo.Period], bx 686 0000049E 6601DB add bx, bx 687 000004A1 66678B87[EE13] mov ax, [PitchTable+bx] 688 000004A7 66894712 mov [edi+TrackInfo.Pitch], ax 689 000004AB C3 retn 690 PortDown: 691 000004AC 30F6 xor dh, dh 692 000004AE 668B5F10 mov bx, [edi+TrackInfo.Period] 693 000004B2 6601D3 add bx, dx 694 000004B5 6681FB5803 cmp bx, 856 695 000004BA 7E04 jle short NotBig 696 000004BC 66BB5803 mov bx, 856 697 000004C0 66895F10 NotBig: mov [edi+TrackInfo.Period], bx 698 000004C4 6601DB add bx, bx 699 000004C7 66678B87[EE13] mov ax, [PitchTable+bx] 700 000004CD 66894712 mov [edi+TrackInfo.Pitch], ax 701 000004D1 C3 retn 702 TonePort: 703 000004D2 30F6 xor dh, dh 704 000004D4 668B4716 mov ax, [edi+TrackInfo.PortTo] 705 000004D8 668B5F10 mov bx, [edi+TrackInfo.Period] 706 000004DC 6639C3 cmp bx, ax 707 000004DF 7428 je short NoPort 708 000004E1 7F0D jg short PortToUp 709 PortToDown: 710 000004E3 6601D3 add bx, dx 711 000004E6 6639C3 cmp bx, ax 712 000004E9 7E0D jle short SetPort 713 FixPort: 714 000004EB 6689C3 mov bx, ax 715 000004EE EB08 jmp short SetPort 716 PortToUp: 717 000004F0 6629D3 sub bx, dx 718 000004F3 6639C3 cmp bx, ax 719 000004F6 7CF3 jl short FixPort 720 SetPort: 721 000004F8 66895F10 mov [edi+TrackInfo.Period], bx 722 000004FC 6601DB add bx, bx 723 000004FF 66678B87[EE13] mov ax, [PitchTable+bx] 724 00000505 66894712 mov [edi+TrackInfo.Pitch], ax 725 NoPort: 726 00000509 C3 retn 727 Vibrato: 728 0000050A 88D6 mov dh, dl 729 0000050C 80E20F and dl, 0Fh 730 0000050F C0EE04 shr dh, 4 731 00000512 C0E602 shl dh, 2 732 00000515 007719 add [edi+TrackInfo.VibPos], dh 733 00000518 8A7719 mov dh, [edi+TrackInfo.VibPos] 734 0000051B 88F3 mov bl, dh 735 0000051D C0EB02 shr bl, 2 736 00000520 6683E31F and bx, 1Fh 737 00000524 678A87[960C] mov al, [SinTable+bx] 738 00000529 F6E2 mul dl 739 0000052B 66D1C0 rol ax, 1 740 0000052E 86C4 xchg al, ah 741 00000530 80E401 and ah, 1 742 00000533 84F6 test dh, dh 743 00000535 7903 jns short VibUp 744 00000537 66F7D8 neg ax 745 VibUp: 746 0000053A 66034710 add ax, [edi+TrackInfo.Period] 747 0000053E 6689C3 mov bx, ax 748 00000541 6683FB71 cmp bx, 113 749 00000545 7D04 jge short NoLoVib 750 00000547 66BB7100 mov bx, 113 751 NoLoVib: 752 0000054B 6681FB5803 cmp bx, 856 753 00000550 7E04 jle short NoHiVib 754 00000552 66BB5803 mov bx, 856 755 NoHiVib: 756 00000556 6601DB add bx, bx 757 00000559 66678B87[EE13] mov ax, [PitchTable+bx] 758 0000055F 66894712 mov [edi+TrackInfo.Pitch], ax 759 00000563 C3 retn 760 PortSlide: 761 00000564 E812000000 call VolSlide 762 00000569 8A5718 mov dl, [edi+TrackInfo.PortParm] 763 0000056C E961FFFFFF jmp TonePort 764 VibSlide: 765 00000571 E805000000 call VolSlide 766 00000576 8A571A mov dl, [edi+TrackInfo.VibParm] 767 00000579 EB8F jmp short Vibrato 768 VolSlide: 769 0000057B 88D6 mov dh, dl 770 0000057D 80E20F and dl, 0Fh 771 00000580 C0EE04 shr dh, 4 772 00000583 8A470E mov al, [edi+TrackInfo.Volume] 773 00000586 28D0 sub al, dl 774 00000588 7D02 jge short NoLoVol 775 0000058A 30C0 xor al, al 776 NoLoVol: 777 0000058C 00F0 add al, dh 778 0000058E 3C40 cmp al, 64 779 00000590 7602 jbe short NoHiVol 780 00000592 B040 mov al, 64 781 NoHiVol: 782 00000594 88470E mov [edi+TrackInfo.Volume], al 783 00000597 C3 retn 784 785 ;-------------------------------------------------------------------------- 786 ; GetTrack: Get the next Note from a pattern. 787 ; In: 788 ; ds:di - Track info Address. 789 ; es:si - Pattern Note Address. 790 ; Out: 791 ; es:si - The Next Pattern Note address. 792 ;-------------------------------------------------------------------------- 793 794 ; esi = Pattern note address 795 ; edi = Track info address 796 797 GetTrack: 798 00000598 66AD lodsw 799 0000059A 86C4 xchg al, ah 800 0000059C 88E3 mov bl, ah 801 0000059E 80E40F and ah, 0Fh 802 000005A1 6689C1 mov cx, ax 803 000005A4 66AD lodsw 804 000005A6 86C4 xchg al, ah 805 000005A8 88E7 mov bh, ah 806 000005AA 80E40F and ah, 0Fh 807 000005AD 6689C2 mov dx, ax 808 000005B0 66895714 mov [edi+TrackInfo.Effect], dx 809 000005B4 80E3F0 and bl, 0F0h 810 000005B7 C0EF04 shr bh, 4 811 000005BA 08FB or bl, bh 812 000005BC 7449 je short SetPeriod 813 SetSample: 814 ;xor bh, bh 815 000005BE 81E3FF000000 and ebx, 0FFh 816 000005C4 4B dec ebx 817 000005C5 01DB add ebx, ebx 818 000005C7 668B83[B0130000] mov ax, [ModInfo.SampVol+ebx] 819 000005CE 88470E mov [edi+TrackInfo.Volume], al 820 000005D1 668B83[7A120000] mov ax, [ModInfo.SampOfs+ebx] 821 000005D8 668907 mov [edi+TrackInfo.Samples], ax 822 000005DB 668B83[B8120000] mov ax, [ModInfo.SampSeg+ebx] 823 000005E2 66894702 mov [edi+TrackInfo.Samples+2], ax 824 000005E6 668B83[F6120000] mov ax, [ModInfo.SampLen+ebx] 825 000005ED 66894708 mov [edi+TrackInfo.Len], ax 826 000005F1 668B83[34130000] mov ax, [ModInfo.SampRep+ebx] 827 000005F8 6689470A mov [edi+TrackInfo.Repeat], ax 828 000005FC 668B83[72130000] mov ax, [ModInfo.SampRepLen+ebx] 829 00000603 6689470C mov [edi+TrackInfo.RepLen], ax 830 SetPeriod: 831 00000607 6685C9 test cx, cx 832 0000060A 7424 jz short SetEffect 833 834 0000060C 66894F16 mov [edi+TrackInfo.PortTo], cx 835 00000610 80FE03 cmp dh, 03h 836 00000613 741B je short SetEffect 837 838 00000615 66894F10 mov [edi+TrackInfo.Period], cx 839 00000619 6689CB mov bx, cx 840 0000061C 6601DB add bx, bx 841 0000061F 66678B87[EE13] mov ax, [PitchTable+bx] 842 00000625 66894712 mov [edi+TrackInfo.Pitch], ax 843 00000629 C7470400000000 mov dword [edi+TrackInfo.Position], 0 844 SetEffect: 845 00000630 6685D2 test dx, dx 846 00000633 7430 jz short InitNone 847 00000635 80FE00 cmp dh, 00h 848 00000638 0F84E5000000 je InitArpeggio 849 0000063E 80FE03 cmp dh, 03h 850 00000641 7423 je short InitTonePort 851 00000643 80FE04 cmp dh, 04h 852 00000646 742D je short InitVibrato 853 00000648 80FE09 cmp dh, 09h 854 0000064B 7451 je short SampleOfs 855 0000064D 80FE0B cmp dh, 0Bh 856 00000650 7462 je short PosJump 857 00000652 80FE0C cmp dh, 0Ch 858 00000655 746B je short SetVolume 859 00000657 80FE0D cmp dh, 0Dh 860 0000065A 7471 je short Break 861 0000065C 80FE0F cmp dh, 0Fh 862 0000065F 0F8487000000 je SetSpeed 863 InitNone: 864 00000665 C3 retn 865 InitTonePort: 866 00000666 84D2 test dl, dl 867 00000668 7503 jnz short SetPortParm 868 0000066A 8A5718 mov dl, [edi+TrackInfo.PortParm] 869 SetPortParm: 870 0000066D 885718 mov [edi+TrackInfo.PortParm], dl 871 00000670 66895714 mov [edi+TrackInfo.Effect], dx 872 00000674 C3 retn 873 InitVibrato: 874 00000675 8A471A mov al, [edi+TrackInfo.VibParm] 875 00000678 88C4 mov ah, al 876 0000067A 240F and al, 0Fh 877 0000067C 80E4F0 and ah, 0F0h 878 0000067F F6C20F test dl, 0Fh 879 00000682 7502 jne short OkDepth 880 00000684 08C2 or dl, al 881 OkDepth: 882 00000686 F6C2F0 test dl, 0F0h 883 00000689 7502 jnz short OkRate 884 0000068B 08E2 or dl, ah 885 OkRate: 886 0000068D 88571A mov [edi+TrackInfo.VibParm], dl 887 00000690 66895714 mov [edi+TrackInfo.Effect], dx 888 00000694 6685C9 test cx, cx 889 00000697 7404 jz short OkPos 890 00000699 C6471900 mov byte [edi+TrackInfo.VibPos], 0 891 OkPos: 892 0000069D C3 retn 893 SampleOfs: 894 0000069E 84D2 test dl, dl 895 000006A0 7503 jnz short SetSampleOfs 896 000006A2 8A571B mov dl, [edi+TrackInfo.OldSampOfs] 897 SetSampleOfs: 898 000006A5 88571B mov [edi+TrackInfo.OldSampOfs], dl 899 000006A8 88D6 mov dh, dl 900 000006AA 81E200FF0000 and edx, 0FF00h ; 05/03/2017 901 000006B0 895704 mov [edi+TrackInfo.Position], edx 902 000006B3 C3 retn 903 PosJump: 904 000006B4 8815[A06B0000] mov [OrderPos], dl 905 000006BA C605[A46B0000]40 mov byte [Row], 64 906 000006C1 C3 retn 907 SetVolume: 908 000006C2 80FA40 cmp dl, 64 909 000006C5 7602 jbe short OkVol 910 000006C7 B240 mov dl, 64 911 OkVol: 912 000006C9 88570E mov [edi+TrackInfo.Volume], dl 913 000006CC C3 retn 914 Break: 915 000006CD 88D6 mov dh, dl 916 000006CF 80E20F and dl, 0Fh 917 000006D2 C0EE04 shr dh, 4 918 000006D5 00F6 add dh, dh 919 000006D7 00F2 add dl, dh 920 000006D9 C0E602 shl dh, 2 921 000006DC 00F2 add dl, dh 922 000006DE 8815[A56B0000] mov [BreakRow], dl 923 000006E4 C605[A46B0000]40 mov byte [Row], 64 924 000006EB C3 retn 925 SetSpeed: 926 000006EC 84D2 test dl,dl 927 000006EE 7432 je Skip 928 000006F0 80FA1F cmp dl,31 929 000006F3 770D ja short SetBpm 930 SetTempo: 931 000006F5 8815[A16B0000] mov [Tempo], dl 932 000006FB 8815[A26B0000] mov [TempoWait], dl 933 00000701 C3 retn 934 SetBpm: 935 00000702 8815[A36B0000] mov [Bpm], dl 936 00000708 B067 mov al, 103 937 0000070A F6E2 mul dl 938 0000070C 88E3 mov bl, ah 939 0000070E 30FF xor bh, bh 940 00000710 66A1[000D0000] mov ax, [MixSpeed] 941 00000716 6631D2 xor dx, dx 942 00000719 66F7F3 div bx 943 0000071C 66A3[A66B0000] mov [BpmSamples], ax 944 Skip: 945 00000722 C3 retn 946 InitArpeggio: 947 00000723 88D6 mov dh, dl 948 00000725 80E20F and dl, 0Fh 949 00000728 C0EE04 shr dh, 4 950 0000072B 66B92400 mov cx, 36 951 0000072F 31DB xor ebx, ebx 952 00000731 668B4710 mov ax, [edi+TrackInfo.Period] 953 gt_ScanPeriod: 954 00000735 66673B87[B60C] cmp ax, [PeriodTable+bx] 955 0000073B 7306 jae short SetArp 956 0000073D 6683C302 add bx, 2 957 00000741 E2F2 loop gt_ScanPeriod 958 SetArp: 959 00000743 6601D2 add dx, dx 960 00000746 00DE add dh, bl 961 00000748 00DA add dl, bl 962 0000074A 66678B9F[B60C] mov bx, [PeriodTable+bx] 963 00000750 6601DB add bx, bx 964 00000753 66678B87[EE13] mov ax, [PitchTable+bx] 965 00000759 6689471C mov [edi+TrackInfo.Arp], ax 966 0000075D 88F3 mov bl, dh 967 0000075F 30FF xor bh, bh 968 00000761 66678B9F[B60C] mov bx, [PeriodTable+bx] 969 00000767 6601DB add bx, bx 970 0000076A 66678B87[EE13] mov ax, [PitchTable+bx] 971 00000770 6689471E mov [edi+TrackInfo.Arp+2], ax 972 00000774 88D3 mov bl, dl 973 00000776 30FF xor bh, bh 974 00000778 66678B9F[B60C] mov bx, [PeriodTable+bx] 975 0000077E 6601DB add bx, bx 976 00000781 66678B87[EE13] mov ax, [PitchTable+bx] 977 00000787 66894720 mov [edi+TrackInfo.Arp+4], ax 978 0000078B 66C747220000 mov word [edi+TrackInfo.ArpIndex], 0 979 00000791 C3 retn 980 981 ;-------------------------------------------------------------------------- 982 ; UpdateTracks: Main code to process the next tick to be played. 983 ;-------------------------------------------------------------------------- 984 985 UpdateTracks: 986 00000792 FE0D[A26B0000] dec byte [TempoWait] 987 00000798 7415 jz short GetTracks 988 989 0000079A B904000000 mov ecx, NumTracks 990 0000079F BF[B66B0000] mov edi, Tracks 991 BeatTracks: 992 000007A4 E87AFCFFFF call BeatTrack 993 000007A9 83C724 add edi, TrackInfo.size 994 000007AC E2F6 loop BeatTracks 995 000007AE C3 retn 996 GetTracks: 997 000007AF A0[A16B0000] mov al, [Tempo] 998 000007B4 A2[A26B0000] mov [TempoWait], al 999 1000 000007B9 8B35[B26B0000] mov esi, [Note] 1001 000007BF 803D[A46B0000]40 cmp byte [Row], 64 1002 000007C6 7263 jb short NoPattWrap 1003 1004 000007C8 8B35[76120000] mov esi, [ModInfo.Patterns] 1005 000007CE 8A1D[A06B0000] mov bl, [OrderPos] 1006 000007D4 3A1D[F4110000] cmp bl, [ModInfo.OrderLen] 1007 000007DA 7214 jb short NoOrderWrap 1008 000007DC 8A1D[F5110000] mov bl, [ModInfo.ReStart] 1009 000007E2 881D[A06B0000] mov [OrderPos], bl 1010 000007E8 3A1D[F4110000] cmp bl, [ModInfo.OrderLen] 1011 000007EE 735D jae short NoUpdate 1012 NoOrderWrap: 1013 ;xor bh, bh 1014 000007F0 81E3FF000000 and ebx, 0FFh 1015 000007F6 8A9B[F6110000] mov bl, [ModInfo.Order+ebx] 1016 000007FC C1E30A shl ebx, 10 ; *1024 1017 000007FF 01DE add esi, ebx 1018 00000801 8A1D[A56B0000] mov bl, [BreakRow] 1019 00000807 881D[A46B0000] mov [Row], bl 1020 ;xor bh, bh 1021 0000080D 81E3FF000000 and ebx, 0FFh 1022 00000813 883D[A56B0000] mov [BreakRow], bh ; 0 1023 00000819 66C1E304 shl bx, 4 1024 0000081D 01DE add esi, ebx 1025 0000081F 8935[B26B0000] mov [Note], esi 1026 00000825 FE05[A06B0000] inc byte [OrderPos] 1027 NoPattWrap: 1028 0000082B FE05[A46B0000] inc byte [Row] 1029 1030 ;cld 1031 00000831 B904000000 mov ecx, NumTracks 1032 00000836 BF[B66B0000] mov edi, Tracks 1033 GetTracks_next: 1034 0000083B 51 push ecx 1035 0000083C E857FDFFFF call GetTrack 1036 00000841 59 pop ecx 1037 00000842 83C724 add edi, TrackInfo.size 1038 00000845 E2F4 loop GetTracks_next 1039 1040 00000847 8935[B26B0000] mov [Note], esi 1041 NoUpdate: 1042 0000084D C3 retn 1043 1044 ;-------------------------------------------------------------------------- 1045 ; MixTrack: Mixes one track into a CLEAN buffer. 1046 ; In: 1047 ; ds:si - Track Info Address. 1048 ; ds:di - Buffer Address. 1049 ; cx - Buffer Size. 1050 ;-------------------------------------------------------------------------- 1051 1052 ; esi = Track info address 1053 ; edi = Buffer address 1054 ; ecx = Buffer size 1055 1056 MixTrack: 1057 0000084E 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1058 00000853 7748 ja short MixLooped 1059 MixNonLooped: 1060 00000855 8B16 mov edx, [esi+TrackInfo.Samples] 1061 00000857 8B5E04 mov ebx, [esi+TrackInfo.Position] 1062 0000085A 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1063 0000085E 52 push edx 1064 0000085F 56 push esi 1065 00000860 01D3 add ebx, edx 1066 00000862 01D5 add ebp, edx 1067 00000864 668B5612 mov dx, [esi+TrackInfo.Pitch] 1068 00000868 8A460E mov al, [esi+TrackInfo.Volume] 1069 0000086B 8A660F mov ah, [esi+TrackInfo.Error] 1070 0000086E 89DE mov esi, ebx 1071 00000870 88C7 mov bh, al 1072 00000872 88D0 mov al, dl 1073 00000874 88F2 mov dl, dh 1074 ;xor dh, dh 1075 00000876 81E2FF000000 and edx, 0FFh 1076 nlMixSamp: 1077 0000087C 39EE cmp esi, ebp 1078 0000087E 7310 jae short nlMixBye 1079 00000880 8A1E mov bl, [esi] 1080 00000882 678A9F[A01A] mov bl, [VolTable+bx] 1081 00000887 001F add [edi], bl 1082 00000889 47 inc edi 1083 0000088A 00C4 add ah, al 1084 0000088C 11D6 adc esi, edx 1085 0000088E E2EC loop nlMixSamp 1086 nlMixBye: 1087 00000890 89F3 mov ebx, esi 1088 00000892 5E pop esi 1089 00000893 5A pop edx 1090 00000894 29D3 sub ebx, edx 1091 00000896 895E04 mov [esi+TrackInfo.Position], ebx 1092 00000899 88660F mov [esi+TrackInfo.Error], ah 1093 0000089C C3 retn 1094 MixLooped: 1095 0000089D 8B16 mov edx, [esi+TrackInfo.Samples] 1096 0000089F 8B5E04 mov ebx, [esi+TrackInfo.Position] 1097 000008A2 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1098 000008A6 892D[AE6B0000] mov [BufRep], ebp 1099 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1100 000008AC 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1101 000008B0 52 push edx 1102 000008B1 56 push esi 1103 000008B2 01D3 add ebx, edx 1104 000008B4 01D5 add ebp, edx 1105 000008B6 668B5612 mov dx, [esi+TrackInfo.Pitch] 1106 000008BA 8A460E mov al, [esi+TrackInfo.Volume] 1107 000008BD 8A660F mov ah, [esi+TrackInfo.Error] 1108 ;mov si, bx 1109 000008C0 89DE mov esi, ebx ; 04/09/2017 1110 000008C2 88C7 mov bh, al 1111 000008C4 88D0 mov al, dl 1112 000008C6 88F2 mov dl, dh 1113 ;xor dh, dh 1114 000008C8 81E2FF000000 and edx, 0FFh 1115 lpMixSamp: 1116 000008CE 39EE cmp esi, ebp 1117 000008D0 7206 jb short lpMixNow 1118 000008D2 2B35[AE6B0000] sub esi, [BufRep] 1119 lpMixNow: 1120 000008D8 8A1E mov bl, [esi] 1121 000008DA 678A9F[A01A] mov bl, [VolTable+bx] 1122 000008DF 001F add [edi], bl 1123 000008E1 47 inc edi 1124 000008E2 00C4 add ah, al 1125 000008E4 11D6 adc esi, edx 1126 000008E6 E2E6 loop lpMixSamp 1127 lpMixBye: 1128 ; mov ebx, esi 1129 ; pop esi 1130 ; pop edx 1131 ; sub ebx, edx 1132 ; mov [esi+TrackInfo.Position], ebx 1133 ; mov [esi+TrackInfo.Error], ah 1134 ; retn 1135 000008E8 EBA6 jmp short nlMixBye 1136 1137 ;-------------------------------------------------------------------------- 1138 ; GetSamples: Returns the next chunk of samples to be played. 1139 ; In: 1140 ; Buffer - Buffer Address. 1141 ; Count - Buffer Size. 1142 ;-------------------------------------------------------------------------- 1143 1144 GetSamples: 1145 ; edi = buffer address 1146 ; ebx = count 1147 1148 000008EA 60 pushad 1149 1150 ;cld 1151 NextChunk: 1152 000008EB 66833D[AC6B0000]00 cmp word [BufLen], 0 1153 000008F3 7548 jne short CopyChunk 1154 1155 000008F5 53 push ebx 1156 000008F6 57 push edi 1157 MixChunk: 1158 000008F7 BF[A05B0000] mov edi, MixBuffer 1159 000008FC 0FB70D[A66B0000] movzx ecx, word [BpmSamples] 1160 00000903 893D[A86B0000] mov [BufPtr], edi 1161 00000909 66890D[AC6B0000] mov [BufLen], cx 1162 1163 00000910 B080 mov al, 80h 1164 00000912 F3AA rep stosb 1165 1166 00000914 66B90400 mov cx, NumTracks 1167 00000918 BE[926B0000] mov esi, Tracks - TrackInfo.size 1168 GetSamples_next: 1169 0000091D 51 push ecx 1170 0000091E 83C624 add esi, TrackInfo.size 1171 00000921 668B0D[AC6B0000] mov cx, [BufLen] 1172 00000928 8B3D[A86B0000] mov edi, [BufPtr] 1173 0000092E E81BFFFFFF call MixTrack 1174 00000933 59 pop ecx 1175 00000934 E2E7 loop GetSamples_next 1176 1177 00000936 E857FEFFFF call UpdateTracks 1178 1179 0000093B 5F pop edi 1180 0000093C 5B pop ebx 1181 CopyChunk: 1182 ;mov cx, [BufLen] 1183 0000093D 0FB70D[AC6B0000] movzx ecx, word [BufLen] 1184 00000944 39D9 cmp ecx, ebx 1185 ;cmp cx, bx 1186 00000946 7602 jbe short MoveChunk 1187 ;mov cx, bx 1188 00000948 89D9 mov ecx, ebx 1189 MoveChunk: 1190 0000094A 8B35[A86B0000] mov esi, [BufPtr] 1191 00000950 010D[A86B0000] add [BufPtr], ecx 1192 00000956 66290D[AC6B0000] sub [BufLen], cx 1193 0000095D 29CB sub ebx, ecx 1194 0000095F F3A4 rep movsb 1195 00000961 85DB test ebx, ebx 1196 00000963 7586 jnz short NextChunk 1197 1198 00000965 61 popad 1199 00000966 C3 retn 1200 1201 ;-------------------------------------------------------------------------- 1202 ; StartPlaying: Initializes the Sound System. 1203 ; In: 1204 ; Module Information Resources. 1205 ;-------------------------------------------------------------------------- 1206 1207 StartPlaying: 1208 00000967 60 pushad 1209 SetModParms: 1210 00000968 C605[A06B0000]00 mov byte [OrderPos], 0 1211 0000096F C605[A16B0000]06 mov byte [Tempo], DefTempo 1212 00000976 C605[A26B0000]06 mov byte [TempoWait], DefTempo 1213 0000097D C605[A36B0000]7D mov byte [Bpm], DefBpm 1214 00000984 C605[A46B0000]40 mov byte [Row], 64 1215 0000098B C605[A56B0000]00 mov byte [BreakRow], 0 1216 00000992 66A1[000D0000] mov ax, [MixSpeed] 1217 00000998 31D2 xor edx, edx 1218 0000099A 66BB3200 mov bx, 24*DefBpm/60 1219 0000099E 66F7F3 div bx 1220 000009A1 66A3[A66B0000] mov [BpmSamples], ax 1221 ClearTracks: 1222 000009A7 BF[B66B0000] mov edi, Tracks 1223 000009AC B990000000 mov ecx, NumTracks*TrackInfo.size 1224 000009B1 31C0 xor eax, eax 1225 ;cld 1226 000009B3 F3AA rep stosb 1227 1228 000009B5 A3[A86B0000] mov [BufPtr], eax 1229 000009BA 66A3[AC6B0000] mov [BufLen], ax 1230 MakePitch: 1231 000009C0 66B80021 mov ax, MidCRate 1232 000009C4 66BBAC01 mov bx, 428 1233 000009C8 66F7E3 mul bx 1234 000009CB 66F735[000D0000] div word [MixSpeed] 1235 000009D2 30F6 xor dh, dh 1236 000009D4 88E2 mov dl, ah 1237 000009D6 88C4 mov ah, al 1238 000009D8 30C0 xor al, al 1239 000009DA 66B95903 mov cx, 857 1240 000009DE 31DB xor ebx, ebx 1241 000009E0 BF[EE130000] mov edi, PitchTable 1242 PitchLoop: 1243 000009E5 50 push eax 1244 000009E6 52 push edx 1245 000009E7 6639DA cmp dx, bx 1246 000009EA 7303 jae short NoDiv 1247 000009EC 66F7F3 div bx 1248 NoDiv: 1249 000009EF 66AB stosw 1250 000009F1 5A pop edx 1251 000009F2 58 pop eax 1252 000009F3 43 inc ebx 1253 000009F4 E2EF loop PitchLoop 1254 MakeVolume: 1255 000009F6 66B90041 mov cx, 16640 1256 000009FA 89CB mov ebx, ecx 1257 VolLoop: 1258 000009FC 4B dec ebx 1259 000009FD 88D8 mov al, bl 1260 000009FF F6EF imul bh 1261 00000A01 88A3[A01A0000] mov [VolTable+ebx], ah 1262 00000A07 E2F3 loop VolLoop 1263 1264 00000A09 61 popad 1265 00000A0A C3 retn 1266 1267 ;-------------------------------------------------------------------------- 1268 ; StopPlaying: ShutDown the Sound System. 1269 ;-------------------------------------------------------------------------- 1270 1271 StopPlaying: 1272 ; 19/06/2017 1273 ; Stop Playing 1274 sys _audio, 0700h 1274 <1> 1274 <1> 1274 <1> 1274 <1> 1274 <1> %if %0 >= 2 1274 00000A0B BB00070000 <1> mov ebx, %2 1274 <1> %if %0 >= 3 1274 <1> mov ecx, %3 1274 <1> %if %0 = 4 1274 <1> mov edx, %4 1274 <1> %endif 1274 <1> %endif 1274 <1> %endif 1274 00000A10 B820000000 <1> mov eax, %1 1274 <1> 1274 00000A15 CD40 <1> int 40h 1275 ; Cancel callback service (for user) 1276 sys _audio, 0900h 1276 <1> 1276 <1> 1276 <1> 1276 <1> 1276 <1> %if %0 >= 2 1276 00000A17 BB00090000 <1> mov ebx, %2 1276 <1> %if %0 >= 3 1276 <1> mov ecx, %3 1276 <1> %if %0 = 4 1276 <1> mov edx, %4 1276 <1> %endif 1276 <1> %endif 1276 <1> %endif 1276 00000A1C B820000000 <1> mov eax, %1 1276 <1> 1276 00000A21 CD40 <1> int 40h 1277 ; Deallocate Audio Buffer (for user) 1278 sys _audio, 0A00h 1278 <1> 1278 <1> 1278 <1> 1278 <1> 1278 <1> %if %0 >= 2 1278 00000A23 BB000A0000 <1> mov ebx, %2 1278 <1> %if %0 >= 3 1278 <1> mov ecx, %3 1278 <1> %if %0 = 4 1278 <1> mov edx, %4 1278 <1> %endif 1278 <1> %endif 1278 <1> %endif 1278 00000A28 B820000000 <1> mov eax, %1 1278 <1> 1278 00000A2D CD40 <1> int 40h 1279 ; Disable Audio Device 1280 sys _audio, 0C00h 1280 <1> 1280 <1> 1280 <1> 1280 <1> 1280 <1> %if %0 >= 2 1280 00000A2F BB000C0000 <1> mov ebx, %2 1280 <1> %if %0 >= 3 1280 <1> mov ecx, %3 1280 <1> %if %0 = 4 1280 <1> mov edx, %4 1280 <1> %endif 1280 <1> %endif 1280 <1> %endif 1280 00000A34 B820000000 <1> mov eax, %1 1280 <1> 1280 00000A39 CD40 <1> int 40h 1281 1282 00000A3B C3 retn 1283 1284 ;============================================================================= 1285 ; 1286 ;============================================================================= 1287 1288 ;dword2str: 1289 ; ; 13/11/2016 - Erdogan Tan 1290 ; ; eax = dword value 1291 ; ; 1292 ; call dwordtohex 1293 ; mov [dword_str], edx 1294 ; mov [dword_str+4], eax 1295 ; mov si, dword_str 1296 ; retn 1297 1298 ; 05/03/2017 (TRDOS 386) 1299 ; trdos386.s (unix386.s) - 10/05/2015 1300 ; Convert binary number to hexadecimal string 1301 1302 ;bytetohex: 1303 ; ; INPUT -> 1304 ; ; AL = byte (binary number) 1305 ; ; OUTPUT -> 1306 ; ; AX = hexadecimal string 1307 ; ; 1308 ; push ebx 1309 ; movzx ebx, al 1310 ; shr bl, 4 1311 ; mov bl, [ebx+hex_chars] 1312 ; xchg bl, al 1313 ; and bl, 0Fh 1314 ; mov ah, [ebx+hex_chars] 1315 ; pop ebx 1316 ; retn 1317 1318 ;wordtohex: 1319 ; ; INPUT -> 1320 ; ; AX = word (binary number) 1321 ; ; OUTPUT -> 1322 ; ; EAX = hexadecimal string 1323 ; ; 1324 ; push ebx 1325 ; xor ebx, ebx 1326 ; xchg ah, al 1327 ; push eax 1328 ; mov bl, ah 1329 ; shr bl, 4 1330 ; mov al, [ebx+hex_chars] 1331 ; mov bl, ah 1332 ; and bl, 0Fh 1333 ; mov ah, [ebx+hex_chars] 1334 ; shl eax, 16 1335 ; pop eax 1336 ; pop ebx 1337 ; jmp short bytetohex 1338 1339 ;dwordtohex: 1340 ; ; INPUT -> 1341 ; ; EAX = dword (binary number) 1342 ; ; OUTPUT -> 1343 ; ; EDX:EAX = hexadecimal string 1344 ; ; 1345 ; push eax 1346 ; shr eax, 16 1347 ; call wordtohex 1348 ; mov edx, eax 1349 ; pop eax 1350 ; call wordtohex 1351 ; retn 1352 1353 ; 19/06/2017 1354 ; 05/03/2017 (TRDOS 386) 1355 ; 13/11/2016 - Erdogan Tan 1356 write_audio_dev_info: 1357 ; BUS/DEV/FN 1358 ; 00000000BBBBBBBBDDDDDFFF00000000 1359 ; DEV/VENDOR 1360 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1361 1362 00000A3C 8B35[A40D0000] mov esi, [dev_vendor] 1363 00000A42 6689F0 mov ax, si 1364 00000A45 0FB6D8 movzx ebx, al 1365 00000A48 88DA mov dl, bl 1366 00000A4A 80E30F and bl, 0Fh 1367 00000A4D 8A83[020D0000] mov al, [ebx+hex_chars] 1368 00000A53 A2[470D0000] mov [msgVendorId+3], al 1369 00000A58 88D3 mov bl, dl 1370 00000A5A C0EB04 shr bl, 4 1371 00000A5D 8A83[020D0000] mov al, [ebx+hex_chars] 1372 00000A63 A2[460D0000] mov [msgVendorId+2], al 1373 00000A68 88E3 mov bl, ah 1374 00000A6A 88DA mov dl, bl 1375 00000A6C 80E30F and bl, 0Fh 1376 00000A6F 8A83[020D0000] mov al, [ebx+hex_chars] 1377 00000A75 A2[450D0000] mov [msgVendorId+1], al 1378 00000A7A 88D3 mov bl, dl 1379 00000A7C C0EB04 shr bl, 4 1380 00000A7F 8A83[020D0000] mov al, [ebx+hex_chars] 1381 00000A85 A2[440D0000] mov [msgVendorId], al 1382 00000A8A C1EE10 shr esi, 16 1383 00000A8D 6689F0 mov ax, si 1384 00000A90 88C3 mov bl, al 1385 00000A92 88DA mov dl, bl 1386 00000A94 80E30F and bl, 0Fh 1387 00000A97 8A83[020D0000] mov al, [ebx+hex_chars] 1388 00000A9D A2[580D0000] mov [msgDevId+3], al 1389 00000AA2 88D3 mov bl, dl 1390 00000AA4 C0EB04 shr bl, 4 1391 00000AA7 8A83[020D0000] mov al, [ebx+hex_chars] 1392 00000AAD A2[570D0000] mov [msgDevId+2], al 1393 00000AB2 88E3 mov bl, ah 1394 00000AB4 88DA mov dl, bl 1395 00000AB6 80E30F and bl, 0Fh 1396 00000AB9 8A83[020D0000] mov al, [ebx+hex_chars] 1397 00000ABF A2[560D0000] mov [msgDevId+1], al 1398 00000AC4 88D3 mov bl, dl 1399 00000AC6 C0EB04 shr bl, 4 1400 00000AC9 8A83[020D0000] mov al, [ebx+hex_chars] 1401 00000ACF A2[550D0000] mov [msgDevId], al 1402 1403 00000AD4 8B35[A80D0000] mov esi, [bus_dev_fn] 1404 00000ADA C1EE08 shr esi, 8 1405 00000ADD 6689F0 mov ax, si 1406 00000AE0 88C3 mov bl, al 1407 00000AE2 88DA mov dl, bl 1408 00000AE4 80E307 and bl, 7 ; bit 0,1,2 1409 00000AE7 8A83[020D0000] mov al, [ebx+hex_chars] 1410 00000AED A2[7C0D0000] mov [msgFncNo+1], al 1411 00000AF2 88D3 mov bl, dl 1412 00000AF4 C0EB03 shr bl, 3 1413 00000AF7 88DA mov dl, bl 1414 00000AF9 80E30F and bl, 0Fh 1415 00000AFC 8A83[020D0000] mov al, [ebx+hex_chars] 1416 00000B02 A2[6E0D0000] mov [msgDevNo+1], al 1417 00000B07 88D3 mov bl, dl 1418 00000B09 C0EB04 shr bl, 4 1419 00000B0C 8A83[020D0000] mov al, [ebx+hex_chars] 1420 00000B12 A2[6D0D0000] mov [msgDevNo], al 1421 00000B17 88E3 mov bl, ah 1422 00000B19 88DA mov dl, bl 1423 00000B1B 80E30F and bl, 0Fh 1424 00000B1E 8A83[020D0000] mov al, [ebx+hex_chars] 1425 00000B24 A2[620D0000] mov [msgBusNo+1], al 1426 00000B29 88D3 mov bl, dl 1427 00000B2B C0EB04 shr bl, 4 1428 00000B2E 8A83[020D0000] mov al, [ebx+hex_chars] 1429 00000B34 A2[610D0000] mov [msgBusNo], al 1430 1431 00000B39 66A1[B00D0000] mov ax, [ac97_io_base] 1432 00000B3F 88C3 mov bl, al 1433 00000B41 88DA mov dl, bl 1434 00000B43 80E30F and bl, 0Fh 1435 00000B46 8A83[020D0000] mov al, [ebx+hex_chars] 1436 00000B4C A2[950D0000] mov [msgIOBaseAddr+3], al 1437 00000B51 88D3 mov bl, dl 1438 00000B53 C0EB04 shr bl, 4 1439 00000B56 8A83[020D0000] mov al, [ebx+hex_chars] 1440 00000B5C A2[940D0000] mov [msgIOBaseAddr+2], al 1441 00000B61 88E3 mov bl, ah 1442 00000B63 88DA mov dl, bl 1443 00000B65 80E30F and bl, 0Fh 1444 00000B68 8A83[020D0000] mov al, [ebx+hex_chars] 1445 00000B6E A2[930D0000] mov [msgIOBaseAddr+1], al 1446 00000B73 88D3 mov bl, dl 1447 00000B75 C0EB04 shr bl, 4 1448 00000B78 8A83[020D0000] mov al, [ebx+hex_chars] 1449 00000B7E A2[920D0000] mov [msgIOBaseAddr], al 1450 1451 ; 24/11/2016 1452 00000B83 30E4 xor ah, ah 1453 00000B85 A0[B20D0000] mov al, [ac97_int_ln_reg] 1454 00000B8A B10A mov cl, 10 1455 00000B8C F6F1 div cl 1456 00000B8E 660105[9D0D0000] add [msgIRQ], ax 1457 00000B95 20C0 and al, al 1458 00000B97 750D jnz short _w_ac97imsg_ ; 19/06/2017 1459 00000B99 A0[9E0D0000] mov al, [msgIRQ+1] 1460 00000B9E B420 mov ah, ' ' 1461 00000BA0 66A3[9D0D0000] mov [msgIRQ], ax 1462 _w_ac97imsg_: 1463 ; EBX = Message address 1464 ; ECX = Max. message length (or stop on ZERO character) 1465 ; (1 to 255) 1466 ; DL = Message color (07h = light gray, 0Fh = white) 1467 sys _msg, msgAC97Info, 255, 07h 1467 <1> 1467 <1> 1467 <1> 1467 <1> 1467 <1> %if %0 >= 2 1467 00000BA6 BB[130D0000] <1> mov ebx, %2 1467 <1> %if %0 >= 3 1467 00000BAB B9FF000000 <1> mov ecx, %3 1467 <1> %if %0 = 4 1467 00000BB0 BA07000000 <1> mov edx, %4 1467 <1> %endif 1467 <1> %endif 1467 <1> %endif 1467 00000BB5 B823000000 <1> mov eax, %1 1467 <1> 1467 00000BBA CD40 <1> int 40h 1468 00000BBC C3 retn 1469 1470 ;============================================================================= 1471 ; preinitialized data 1472 ;============================================================================= 1473 1474 ;============================================================================= 1475 ; PLAY.ASM - DATA 1476 ;============================================================================= 1477 1478 msg_2017: 1479 00000BBD 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 1479 00000BC6 506C6179657220666F- 1479 00000BCF 72205452444F532033- 1479 00000BD8 383620627920457264- 1479 00000BE1 6F67616E2054616E2E- 1479 00000BEA 20 1480 00000BEB 4F63746F6265722032- db 'October 2017.',10,13 1480 00000BF4 3031372E0A0D 1481 00000BFA 75736167653A20706C- db 'usage: playmod filename.mod', 10,13,0 1481 00000C03 61796D6F642066696C- 1481 00000C0C 656E616D652E6D6F64- 1481 00000C15 0A0D00 1482 00000C18 30382F31302F323031- db '08/10/2017',10,13,0 1482 00000C21 370A0D00 1483 1484 00000C25 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 1484 00000C2E 506C61796572207630- 1484 00000C37 2E3162206279204361- 1484 00000C40 726C6F732048617361- 1484 00000C49 6E2E204A756C792031- 1484 00000C52 3939332E 1485 00000C56 0A0D00 db 10,13,0 1486 00000C59 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 1486 00000C62 64696E67204D6F6475- 1486 00000C6B 6C652066696C652E0A- 1486 00000C74 0D00 1487 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 1488 ;MsgFound: db 'Sound Blaster found at Address 2' 1489 ;PortText: db 'x0h, IRQ ' 1490 ;IrqText: db 'x.',10,13,0 1491 1492 trdos386_err_msg: 1493 00000C76 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 1493 00000C7F 2053797374656D2063- 1493 00000C88 616C6C206572726F72- 1493 00000C91 20210A0D00 1494 1495 ;============================================================================= 1496 ; MODPLAY.ASM - DATA 1497 ;============================================================================= 1498 1499 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 1500 1501 00000C96 0019324A62788EA2B4- SinTable: db 0,25,50,74,98,120,142,162,180,197,212,225 1501 00000C9F C5D4E1 1502 00000CA2 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 1502 00000CAB E1 1503 00000CAC D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 1503 00000CB5 19 1504 1505 00000CB6 58032803FA02D002A6- PeriodTable: dw 856,808,762,720,678,640,604,570,538,508,480,453 1505 00000CBF 0280025C023A021A02- 1505 00000CC8 FC01E001C501 1506 00000CCE AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 1506 00000CD7 0140012E011D010D01- 1506 00000CE0 FE00F000E200 1507 00000CE6 D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 1507 00000CEF 00A00097008F008700- 1507 00000CF8 7F0078007100 1508 1509 ;============================================================================= 1510 ; PLAYER.ASM - DATA 1511 ;============================================================================= 1512 1513 00000CFE 01 stmo: db 1 ; stereo (2) or mono (1) 1514 00000CFF 08 bps: db 8 ; bits per sample (8 or 16) 1515 Sample_Rate: 1516 00000D00 2256 MixSpeed: dw 22050 ; Hz 1517 1518 ; 13/11/2016 1519 00000D02 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 1519 00000D0B 3941424344454600 1520 msgAC97Info: 1521 00000D13 0D0A db 0Dh, 0Ah 1522 00000D15 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 1522 00000D1E 6F20436F6E74726F6C- 1522 00000D27 6C6572202620436F64- 1522 00000D30 656320496E666F0D0A 1523 00000D39 56656E646F72204944- db "Vendor ID: " 1523 00000D42 3A20 1524 00000D44 303030306820446576- msgVendorId: db "0000h Device ID: " 1524 00000D4D 6963652049443A20 1525 00000D55 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 1526 00000D5C 4275733A20 db "Bus: " 1527 00000D61 303068204465766963- msgBusNo: db "00h Device: " 1527 00000D6A 653A20 1528 00000D6D 3030682046756E6374- msgDevNo: db "00h Function: " 1528 00000D76 696F6E3A20 1529 00000D7B 303068 msgFncNo: db "00h" 1530 00000D7E 0D0A db 0Dh, 0Ah 1531 00000D80 492F4F204261736520- db "I/O Base Address: " 1531 00000D89 416464726573733A20 1532 00000D92 303030306820495251- msgIOBaseAddr: db "0000h IRQ: " 1532 00000D9B 3A20 1533 00000D9D 3030 msgIRQ: dw 3030h 1534 00000D9F 0D0A00 db 0Dh, 0Ah, 0 1535 ;msgSampleRate: db "Sample Rate: " 1536 ;msgHertz: db "00000 Hz ", 0 1537 ;msg8Bits: db "8 bits ", 0 1538 ;msgMono: db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0 1539 ;msg16Bits: db "16 bits ", 0 1540 ;msgStereo: db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0 1541 1542 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 1543 ;codec_id: dd 0 1544 ;codec_chip_id: dd 0 1545 ;codec_vendor_ids: dw 0 1546 ;codec_chip_ids: dw 0 1547 1548 ;dword_str: dd 30303030h, 30303030h 1549 ; db 'h', 0Dh, 0Ah, 0 1550 1551 ;============================================================================= 1552 ; uninitialized data 1553 ;============================================================================= 1554 1555 bss_start: 1556 1557 ABSOLUTE bss_start 1558 1559 00000DA2 alignb 4 1560 1561 00000DA4 dev_vendor: resd 1 1562 00000DA8 bus_dev_fn: resd 1 1563 00000DAC stats_cmd: resd 1 1564 00000DB0 ac97_io_base: resw 1 1565 00000DB2 ac97_int_ln_reg: resb 1 1566 00000DB3 srb: resb 1 1567 1568 ; MODLOAD.ASM 1569 00000DB4 FileHandle: resd 1 1570 00000DB8 Header: resb ModHeader.size 1571 1572 ; MODPLAY.ASM 1573 ;MixSpeed: resw 1 1574 1575 ModInfo: 1576 000011F4 ModInfo.OrderLen: resb 1 1577 000011F5 ModInfo.ReStart: resb 1 1578 000011F6 ModInfo.Order: resb 128 1579 00001276 ModInfo.Patterns: resd 1 1580 1581 0000127A ModInfo.SampOfs: resw 31 1582 000012B8 ModInfo.SampSeg: resw 31 1583 000012F6 ModInfo.SampLen: resw 31 1584 00001334 ModInfo.SampRep: resw 31 1585 00001372 ModInfo.SampRepLen: resw 31 1586 000013B0 ModInfo.SampVol: resw 31 1587 1588 ; MODPLAY.ASM 1589 000013EE PitchTable: resw 857 1590 00001AA0 VolTable: resb 16640 1591 00005BA0 MixBuffer resb MixBufSize 1592 1593 ; MODPLAY.ASM 1594 00006BA0 OrderPos: resb 1 1595 00006BA1 Tempo: resb 1 1596 00006BA2 TempoWait: resb 1 1597 00006BA3 Bpm: resb 1 1598 00006BA4 Row: resb 1 1599 00006BA5 BreakRow: resb 1 1600 00006BA6 BpmSamples: resw 1 1601 00006BA8 BufPtr: resd 1 1602 00006BAC BufLen: resw 1 1603 00006BAE BufRep: resd 1 1604 00006BB2 Note: resd 1 1605 00006BB6 Tracks: resb TrackInfo.size*NumTracks 1606 1607 00006C46 alignb 16 1608 1609 ; PLAY.ASM 1610 00006C50 Scope: resw 320 1611 00006ED0 RowOfs: resw 256 1612 1613 mod_file_name: 1614 000070D0 resb 80 1615 1616 00007120 alignb 4096 1617 1618 Audio_Buffer: 1619 00008000 resb 32768 1620 1621 g_buff: 1622 00010000 resb 320 1623 00010140 resb 192 1624 1625 00010200 alignb 65536 1626 1627 file_buffer: 1628 00020000 resb 65536*7 1629 EOF: