1 ; **************************************************************************** 2 ; playmod.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; PLAYMOD.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[B70D0000] 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[E0700000] 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[3A0C0000] <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 179 sys _audio, 0301h, 0, ac97_int_handler 179 <1> 179 <1> 179 <1> 179 <1> 179 <1> %if %0 >= 2 179 000000A7 BB01030000 <1> mov ebx, %2 179 <1> %if %0 >= 3 179 000000AC B900000000 <1> mov ecx, %3 179 <1> %if %0 = 4 179 000000B1 BA[2B020000] <1> mov edx, %4 179 <1> %endif 179 <1> %endif 179 <1> %endif 179 000000B6 B820000000 <1> mov eax, %1 179 <1> 179 000000BB CD40 <1> int 40h 180 000000BD 0F82D5000000 jc error_exit 181 182 LoadMod: 183 000000C3 BF[E0700000] mov edi, mod_file_name 184 000000C8 E8FF010000 call LoadModule ; Load the MODule... 185 ; 08/10/2017 186 000000CD 731B jnc short _3 ; any error loading? 187 188 ; yes, print error and Exit. 189 190 sys _msg, ErrorMesg, 255, 0Fh 190 <1> 190 <1> 190 <1> 190 <1> 190 <1> %if %0 >= 2 190 000000CF BB[6E0C0000] <1> mov ebx, %2 190 <1> %if %0 >= 3 190 000000D4 B9FF000000 <1> mov ecx, %3 190 <1> %if %0 = 4 190 000000D9 BA0F000000 <1> mov edx, %4 190 <1> %endif 190 <1> %endif 190 <1> %endif 190 000000DE B823000000 <1> mov eax, %1 190 <1> 190 000000E3 CD40 <1> int 40h 191 192 000000E5 E9DC000000 jmp Exit 193 194 _3: 195 ; 10/06/2017 196 sys _audio, 0E00h ; get audio controller info 196 <1> 196 <1> 196 <1> 196 <1> 196 <1> %if %0 >= 2 196 000000EA BB000E0000 <1> mov ebx, %2 196 <1> %if %0 >= 3 196 <1> mov ecx, %3 196 <1> %if %0 = 4 196 <1> mov edx, %4 196 <1> %endif 196 <1> %endif 196 <1> %endif 196 000000EF B820000000 <1> mov eax, %1 196 <1> 196 000000F4 CD40 <1> int 40h 197 000000F6 0F829C000000 jc error_exit 198 199 ;cmp ah, 3 ; VT 8233? (VIA AC'97 Audio Controller) 200 ;jne _dev_not_ready 201 202 ; EAX = IRQ Number in AL 203 ; Audio Device Number in AH 204 ; EBX = DEV/VENDOR ID 205 ; (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV) 206 ; ECX = BUS/DEV/FN 207 ; (00000000BBBBBBBBDDDDDFFF00000000) 208 ; EDX = Base IO Addr (DX) for SB16 & VT8233 209 ; EDX = NABMBAR/NAMBAR (for AC97) 210 ; (Low word, DX = NAMBAR address) 211 212 000000FC A2[C60D0000] mov [ac97_int_ln_reg], al 213 00000101 891D[B80D0000] mov [dev_vendor], ebx 214 00000107 890D[BC0D0000] mov [bus_dev_fn], ecx 215 0000010D 668915[C40D0000] mov [ac97_io_base], dx 216 217 00000114 E838090000 call write_audio_dev_info 218 219 PlayNow: 220 00000119 E85E080000 call StartPlaying 221 222 ; load 32768 bytes into audio buffer 223 0000011E BF[00800000] mov edi, Audio_Buffer 224 00000123 BB00800000 mov ebx, BUFFERSIZE 225 00000128 E8D2070000 call GetSamples 226 0000012D 7269 jc error_exit 227 228 ;mov ecx, 128 ; Make a lookup table 229 0000012F B180 mov cl, 128 230 00000131 31DB xor ebx, ebx ; for fastest pixel 231 00000133 BA002D0000 mov edx, 320*(100-64) ; addressing. 232 MakeOfs: 233 00000138 668993[E06E0000] mov [RowOfs+ebx], dx 234 0000013F 668993[E26E0000] mov [RowOfs+ebx+2], dx 235 00000146 6681C24001 add dx, 320 236 0000014B 83C304 add ebx, 4 237 0000014E E2E8 loop MakeOfs 238 239 ; Set Master Volume Level 240 sys _audio, 0B00h, 1D1Dh 240 <1> 240 <1> 240 <1> 240 <1> 240 <1> %if %0 >= 2 240 00000150 BB000B0000 <1> mov ebx, %2 240 <1> %if %0 >= 3 240 00000155 B91D1D0000 <1> mov ecx, %3 240 <1> %if %0 = 4 240 <1> mov edx, %4 240 <1> %endif 240 <1> %endif 240 <1> %endif 240 0000015A B820000000 <1> mov eax, %1 240 <1> 240 0000015F CD40 <1> int 40h 241 242 ;mov word [MixSpeed], 22050 ; Mixing at 22.050 kHz 243 244 ; Start to play 245 00000161 A0[140D0000] mov al, [bps] 246 00000166 C0E804 shr al, 4 ; 8 -> 0, 16 -> 1 247 00000169 D0E0 shl al, 1 ; 16 -> 2, 8 -> 0 248 0000016B 8A1D[130D0000] mov bl, [stmo] 249 00000171 FECB dec bl 250 00000173 08C3 or bl, al 251 00000175 668B0D[150D0000] mov cx, [MixSpeed] ; [Sample_Rate] ; Hz 252 0000017C B704 mov bh, 4 ; start to play 253 sys _audio 253 <1> 253 <1> 253 <1> 253 <1> 253 <1> %if %0 >= 2 253 <1> mov ebx, %2 253 <1> %if %0 >= 3 253 <1> mov ecx, %3 253 <1> %if %0 = 4 253 <1> mov edx, %4 253 <1> %endif 253 <1> %endif 253 <1> %endif 253 0000017E B820000000 <1> mov eax, %1 253 <1> 253 00000183 CD40 <1> int 40h 254 255 ;; SETUP SIGNAL RESPONSE BYTE 256 ;; 06/03/2017 257 ;mov bl, [ac97_int_ln_reg] ; IRQ number 258 ;mov bh, 1 ; Link IRQ to user for Signal Response Byte 259 ;mov edx, srb ; Signal Response/Return Byte address 260 ;mov ecx, 0FFh ; Signal Response/Return Byte value 261 ;sys _calbac 262 ;jc short error_exit 263 264 ; DIRECT VGA MEMORY ACCESS 265 ; bl = 0, bh = 5 266 ; Direct access/map to VGA memory (0A0000h) 267 268 sys _video, 0500h 268 <1> 268 <1> 268 <1> 268 <1> 268 <1> %if %0 >= 2 268 00000185 BB00050000 <1> mov ebx, %2 268 <1> %if %0 >= 3 268 <1> mov ecx, %3 268 <1> %if %0 = 4 268 <1> mov edx, %4 268 <1> %endif 268 <1> %endif 268 <1> %endif 268 0000018A B81F000000 <1> mov eax, %1 268 <1> 268 0000018F CD40 <1> int 40h 269 00000191 3D00000A00 cmp eax, 0A0000h 270 00000196 7418 je short _a3 271 error_exit: 272 sys _msg, trdos386_err_msg, 255, 0Eh 272 <1> 272 <1> 272 <1> 272 <1> 272 <1> %if %0 >= 2 272 00000198 BB[8B0C0000] <1> mov ebx, %2 272 <1> %if %0 >= 3 272 0000019D B9FF000000 <1> mov ecx, %3 272 <1> %if %0 = 4 272 000001A2 BA0E000000 <1> mov edx, %4 272 <1> %endif 272 <1> %endif 272 <1> %endif 272 000001A7 B823000000 <1> mov eax, %1 272 <1> 272 000001AC CD40 <1> int 40h 273 000001AE EB16 jmp short Exit 274 275 ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru 276 ; the software interrupt 1Ch. If the IRQ 0 is disabled, then 277 ; the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per 278 ; second, or the module will sound "looped". 279 ; Because we need better sync with the ModPlayer to draw the scope, 280 ; the polling is called from my routine, and then the irq 0 must be 281 ; disabled. The [DmaBuffer] points to the current buffer of 8-bit 282 ; samples played by the Sound Blaster. Note that some samples are 283 ; discarded in the next code, just for fun! 284 285 _a3: 286 000001B0 66B81300 mov ax, 0013h ; Set Mode 320x200x256 287 000001B4 CD31 int 31h 288 289 000001B6 E885000000 call ModPlay ; 13/02/2017 290 291 _s_exit: 292 000001BB E860080000 call StopPlaying ; STOP! 293 294 000001C0 66B80300 mov ax, 0003h ; Set Text Mode 80x25x16 295 000001C4 CD31 int 31h 296 Exit: 297 ;call FreeModule ; Free MODule core. 298 299 sys _exit ; Bye ! 299 <1> 299 <1> 299 <1> 299 <1> 299 <1> %if %0 >= 2 299 <1> mov ebx, %2 299 <1> %if %0 >= 3 299 <1> mov ecx, %3 299 <1> %if %0 = 4 299 <1> mov edx, %4 299 <1> %endif 299 <1> %endif 299 <1> %endif 299 000001C6 B801000000 <1> mov eax, %1 299 <1> 299 000001CB CD40 <1> int 40h 300 here: 301 000001CD EBFE jmp short here 302 303 pmsg_2017: 304 sys _msg, msg_2017, 255, 0Fh 304 <1> 304 <1> 304 <1> 304 <1> 304 <1> %if %0 >= 2 304 000001CF BB[D20B0000] <1> mov ebx, %2 304 <1> %if %0 >= 3 304 000001D4 B9FF000000 <1> mov ecx, %3 304 <1> %if %0 = 4 304 000001D9 BA0F000000 <1> mov edx, %4 304 <1> %endif 304 <1> %endif 304 <1> %endif 304 000001DE B823000000 <1> mov eax, %1 304 <1> 304 000001E3 CD40 <1> int 40h 305 000001E5 EBDF jmp short Exit 306 307 DetectVT8233: 308 ; Detect (BH=1) VT8233 (BL=3) Audio Controller 309 sys _audio, 0103h 309 <1> 309 <1> 309 <1> 309 <1> 309 <1> %if %0 >= 2 309 000001E7 BB03010000 <1> mov ebx, %2 309 <1> %if %0 >= 3 309 <1> mov ecx, %3 309 <1> %if %0 = 4 309 <1> mov edx, %4 309 <1> %endif 309 <1> %endif 309 <1> %endif 309 000001EC B820000000 <1> mov eax, %1 309 <1> 309 000001F1 CD40 <1> int 40h 310 000001F3 C3 retn 311 312 noDevMsg: 313 000001F4 4572726F723A20556E- db "Error: Unable to find VIA VT8233 based audio device!",13,10,0 313 000001FD 61626C6520746F2066- 313 00000206 696E64205649412056- 313 0000020F 543832333320626173- 313 00000218 656420617564696F20- 313 00000221 646576696365210D0A- 313 0000022A 00 314 315 ac97_int_handler: 316 ; 19/06/2017 317 0000022B C605[C70D0000]01 mov byte [srb], 1 ; interrupt (or signal response byte) 318 319 sys _rele ; return from callback service 319 <1> 319 <1> 319 <1> 319 <1> 319 <1> %if %0 >= 2 319 <1> mov ebx, %2 319 <1> %if %0 >= 3 319 <1> mov ecx, %3 319 <1> %if %0 = 4 319 <1> mov edx, %4 319 <1> %endif 319 <1> %endif 319 <1> %endif 319 00000232 B827000000 <1> mov eax, %1 319 <1> 319 00000237 CD40 <1> int 40h 320 ; we must not come here ! 321 sys _exit 321 <1> 321 <1> 321 <1> 321 <1> 321 <1> %if %0 >= 2 321 <1> mov ebx, %2 321 <1> %if %0 >= 3 321 <1> mov ecx, %3 321 <1> %if %0 = 4 321 <1> mov edx, %4 321 <1> %endif 321 <1> %endif 321 <1> %endif 321 00000239 B801000000 <1> mov eax, %1 321 <1> 321 0000023E CD40 <1> int 40h 322 323 ;============================================================================= 324 ; 325 ;============================================================================= 326 327 ModPlay: 328 ; 23/06/2017 329 ; 21/06/2017 330 ; 19/06/2017 331 332 ; 05/03/2017 (TRDOS 386) 333 ; 14/02/2017 334 ; 13/02/2017 335 ; 08/12/2016 336 ; 28/11/2016 337 338 00000240 EB10 jmp short modp_gs ; 23/06/2017 339 p_loop: 340 00000242 803D[C70D0000]00 cmp byte [srb], 0 341 00000249 7616 jna short q_loop 342 0000024B C605[C70D0000]00 mov byte [srb], 0 343 modp_gs: 344 00000252 BF[00800000] mov edi, Audio_Buffer 345 00000257 BB00800000 mov ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017 346 0000025C E89E060000 call GetSamples 347 q_loop: 348 00000261 B401 mov ah, 1 ; any key pressed? 349 00000263 CD32 int 32h ; no, Loop. 350 00000265 7405 jz short r_loop 351 352 00000267 B400 mov ah, 0 ; flush key buffer... 353 00000269 CD32 int 32h 354 q_return: 355 0000026B C3 retn 356 r_loop: 357 ; Get Current Sound Data (in DMA buffer) ((320 bytes)) 358 ; 23/06/2017 359 ; 22/06/2017 360 ; bh = 15, get current sound data/samples 361 ; bl = 0, for PCM OUT 362 ; ecx = count of sample/data bytes (1 to 4096) 363 ; edx = destination buffer address 364 ; (page aligned address is better) 365 ; 366 sys _audio, 0F00h, 320, g_buff 366 <1> 366 <1> 366 <1> 366 <1> 366 <1> %if %0 >= 2 366 0000026C BB000F0000 <1> mov ebx, %2 366 <1> %if %0 >= 3 366 00000271 B940010000 <1> mov ecx, %3 366 <1> %if %0 = 4 366 00000276 BA[00000100] <1> mov edx, %4 366 <1> %endif 366 <1> %endif 366 <1> %endif 366 0000027B B820000000 <1> mov eax, %1 366 <1> 366 00000280 CD40 <1> int 40h 367 ScopeLoop: 368 00000282 BF00000A00 mov edi, 0A0000h ; VGA display memory address 369 ; 19/06/2017 370 00000287 BE[00000100] mov esi, g_buff ; display current samples 371 0000028C 31C9 xor ecx, ecx ; to be drawed ... 372 0000028E 31D2 xor edx, edx 373 DrawLoop: 374 00000290 89D3 mov ebx, edx ; (save Index) 375 00000292 668BBB[606C0000] mov di, [Scope+ebx] ; get old SCOPE pixel address 376 00000299 C60700 mov byte [edi], 0 ; erase it! 377 ;lodsb 378 ;mov bl, al 379 0000029C 8A1E mov bl, [esi] ; get a sample (8-bit) 380 0000029E 46 inc esi ; calc new pixel address... 381 0000029F 30FF xor bh, bh 382 000002A1 66D1E3 shl bx, 1 383 000002A4 668BBB[E06E0000] mov di, [RowOfs+ebx] 384 000002AB 6601CF add di, cx 385 000002AE 6689D3 mov bx, dx ; (restore Index) 386 000002B1 6689BB[606C0000] mov [Scope+ebx], di ; save new address... 387 000002B8 C6070A mov byte [edi], 10 ; and DRAW. 388 000002BB 6683C202 add dx, 2 ; the next pixel... 389 000002BF 41 inc ecx 390 000002C0 6681F94001 cmp cx, 320 ; 320 pixels drawed? 391 000002C5 72C9 jb short DrawLoop 392 000002C7 E976FFFFFF jmp p_loop 393 394 395 ;============================================================================= 396 ; MODLOAD.ASM 397 ;============================================================================= 398 399 ; Amiga Module Loader v0.1b by Carlos Hasan. 400 ; July 10th, 1993. 401 402 ; STRUCTURES 403 404 struc ModSample 405 00000000 .msName: resb 22 406 00000016 .msLength: resw 1 407 00000018 .msFinetune: resb 1 408 00000019 .msVolume: resb 1 409 0000001A .msRepeat: resw 1 410 0000001C .msRepLen: resw 1 411 .size: 412 endstruc 413 414 struc ModHeader 415 00000000 .mhName: resb 20 416 00000014 .mhSamples: resb ModSample.size*31 417 000003B6 .mhOrderLen: resb 1 418 000003B7 .mhReStart: resb 1 419 000003B8 .mhOrder: resb 128 420 00000438 .mhSign: resw 2 421 .size: 422 endstruc 423 424 struc ModInfoRec 425 00000000 .OrderLen: resb 1 426 00000001 .ReStart: resb 1 427 00000002 .Order: resb 128 428 00000082 .Patterns: resd 1 429 00000086 .SampOfs: resw 31 430 000000C4 .SampSeg: resw 31 431 00000102 .SampLen: resw 31 432 00000140 .SampRep: resw 31 433 0000017E .SampRepLen: resw 31 434 000001BC .SampVol: resw 31 435 .size: 436 endstruc 437 438 ; CODE 439 440 ; 07/10/2017 (playmod.s) 441 442 LoadModule: 443 ; edi = file name address 444 445 000002CC 60 pushad 446 447 ;call ClearModInfo ; 07/10/2017 (not necessary.) 448 OpenFile: 449 ; ebx = ASCIIZ file name address 450 ; ecx = open mode (0 = open for read) 451 sys _open, edi, 0 ; open for reading 451 <1> 451 <1> 451 <1> 451 <1> 451 <1> %if %0 >= 2 451 000002CD 89FB <1> mov ebx, %2 451 <1> %if %0 >= 3 451 000002CF B900000000 <1> mov ecx, %3 451 <1> %if %0 = 4 451 <1> mov edx, %4 451 <1> %endif 451 <1> %endif 451 <1> %endif 451 000002D4 B805000000 <1> mov eax, %1 451 <1> 451 000002D9 CD40 <1> int 40h 452 000002DB 0F8244010000 jc Failed 453 000002E1 A3[C80D0000] mov [FileHandle], eax 454 ReadHeader: 455 ; ebx = File handle 456 ; ecx = Buffer address 457 ; edx = Byte count 458 sys _read, [FileHandle], Header, ModHeader.size 458 <1> 458 <1> 458 <1> 458 <1> 458 <1> %if %0 >= 2 458 000002E6 8B1D[C80D0000] <1> mov ebx, %2 458 <1> %if %0 >= 3 458 000002EC B9[CC0D0000] <1> mov ecx, %3 458 <1> %if %0 = 4 458 000002F1 BA3C040000 <1> mov edx, %4 458 <1> %endif 458 <1> %endif 458 <1> %endif 458 000002F6 B803000000 <1> mov eax, %1 458 <1> 458 000002FB CD40 <1> int 40h 459 000002FD 0F8213010000 jc CloseFile 460 CheckMK: 461 00000303 813D[04120000]4D2E- cmp dword [Header+ModHeader.mhSign], 'M.K.' 461 0000030B 4B2E 462 0000030D 7412 je short IsModFile 463 CheckFLT4: 464 0000030F 813D[04120000]464C- cmp dword [Header+ModHeader.mhSign], 'FLT4' 464 00000317 5434 465 00000319 7406 je short IsModFile 466 ; 07/10/2017 467 0000031B F9 stc 468 0000031C E9F5000000 jmp CloseFile 469 IsModFile: 470 00000321 A0[82110000] mov al, [Header+ModHeader.mhOrderLen] 471 00000326 A2[08120000] mov [ModInfo.OrderLen], al 472 473 0000032B A0[83110000] mov al, [Header+ModHeader.mhReStart] 474 00000330 3A05[82110000] cmp al, [Header+ModHeader.mhOrderLen] 475 00000336 7202 jb short SetReStart 476 00000338 B07F mov al, 7Fh 477 SetReStart: 478 0000033A A2[09120000] mov [ModInfo.ReStart], al 479 480 ;mov ecx, 128 481 0000033F 66B98000 mov cx, 128 482 00000343 31D2 xor edx, edx 483 00000345 31DB xor ebx, ebx 484 CopyOrder: 485 00000347 8AB3[84110000] mov dh, [Header+ModHeader.mhOrder+ebx] 486 0000034D 88B3[0A120000] mov [ModInfo.Order+ebx], dh 487 00000353 38D6 cmp dh, dl 488 00000355 7202 jb short NextOrder 489 00000357 88F2 mov dl, dh 490 NextOrder: 491 00000359 43 inc ebx 492 0000035A E2EB loop CopyOrder 493 AllocPatterns: 494 0000035C 81E2FF000000 and edx, 0FFh 495 ;inc dx 496 00000362 FEC2 inc dl ; 07/10/2017 497 ; dl = count of 1024 bytes ; count of patterns (04/07/2017) 498 00000364 C1E20A shl edx, 10 ; *1024 ; (count of patterns *64*16) 499 500 00000367 89D5 mov ebp, edx ; offset of samples (04/07/2017) 501 ;mov ecx, 10000h ; next 64K (4096*16) 502 00000369 B9[00000200] mov ecx, file_buffer ; 12/03/2017 503 ; 504 0000036E 890D[8A120000] mov [ModInfo.Patterns], ecx 505 ; 506 00000374 01CD add ebp, ecx ; next offset for samples 507 ReadPatterns: 508 ;mov ebx, [FileHandle] 509 ; ebx = File handle 510 ; ecx = Buffer address 511 ; edx = Byte count 512 sys _read, [FileHandle] 512 <1> 512 <1> 512 <1> 512 <1> 512 <1> %if %0 >= 2 512 00000376 8B1D[C80D0000] <1> mov ebx, %2 512 <1> %if %0 >= 3 512 <1> mov ecx, %3 512 <1> %if %0 = 4 512 <1> mov edx, %4 512 <1> %endif 512 <1> %endif 512 <1> %endif 512 0000037C B803000000 <1> mov eax, %1 512 <1> 512 00000381 CD40 <1> int 40h 513 00000383 0F828D000000 jc CloseFile 514 515 ; patterns have been loaded here... (04/07/2017) 516 517 00000389 BE[E00D0000] mov esi, Header+ModHeader.mhSamples 518 0000038E 31FF xor edi, edi 519 CopySamples: 520 00000390 668B4616 mov ax, [esi+ModSample.msLength] 521 00000394 86C4 xchg al, ah 522 00000396 66D1E0 shl ax, 1 523 00000399 668987[0A130000] mov [ModInfo.SampLen+edi], ax 524 000003A0 8A4619 mov al, [esi+ModSample.msVolume] 525 000003A3 30E4 xor ah, ah 526 000003A5 668987[C4130000] mov [ModInfo.SampVol+edi], ax 527 000003AC 668B461A mov ax, [esi+ModSample.msRepeat] 528 000003B0 86C4 xchg al, ah 529 000003B2 66D1E0 shl ax, 1 530 000003B5 668987[48130000] mov [ModInfo.SampRep+edi], ax 531 000003BC 668B461C mov ax, [esi+ModSample.msRepLen] 532 000003C0 86C4 xchg al, ah 533 000003C2 66D1E0 shl ax, 1 534 000003C5 668987[86130000] mov [ModInfo.SampRepLen+edi], ax 535 000003CC 83C61E add esi, ModSample.size 536 000003CF 6683C702 add di, 2 537 000003D3 6683FF3E cmp di, 2*31 538 000003D7 72B7 jb short CopySamples 539 540 000003D9 31F6 xor esi, esi 541 AllocSamples: 542 000003DB 0FB796[0A130000] movzx edx, word [ModInfo.SampLen+esi] 543 ; 07/10/2017 544 ;shr dx, 4 ; *** 545 000003E2 21D2 and edx, edx 546 000003E4 7426 jz short NextSample 547 ;inc dx ; number of paragraphs ; *** 548 ;shl dx, 4 ; *** 549 000003E6 89E8 mov eax, ebp 550 000003E8 668986[8E120000] mov [ModInfo.SampOfs+esi], ax 551 000003EF C1E810 shr eax, 16 552 000003F2 668986[CC120000] mov [ModInfo.SampSeg+esi], ax 553 000003F9 89E9 mov ecx, ebp 554 000003FB 01D5 add ebp, edx ; next offset for sample 555 ReadSample: 556 ;mov ebx, [FileHandle] 557 ;movzx edx, [ModInfo.SampLen+esi] 558 ;mov ecx, [ModInfo.SampOfs+esi] 559 560 ; ebx = File handle 561 ; ecx = Buffer address 562 ; edx = Byte count 563 sys _read, [FileHandle] 563 <1> 563 <1> 563 <1> 563 <1> 563 <1> %if %0 >= 2 563 000003FD 8B1D[C80D0000] <1> mov ebx, %2 563 <1> %if %0 >= 3 563 <1> mov ecx, %3 563 <1> %if %0 = 4 563 <1> mov edx, %4 563 <1> %endif 563 <1> %endif 563 <1> %endif 563 00000403 B803000000 <1> mov eax, %1 563 <1> 563 00000408 CD40 <1> int 40h 564 0000040A 720A jc short CloseFile 565 566 NextSample: 567 0000040C 6683C602 add si, 2 568 00000410 6683FE3E cmp si, 2*31 569 00000414 72C5 jb short AllocSamples 570 CloseFile: 571 00000416 9C pushf 572 sys _close, [FileHandle] 572 <1> 572 <1> 572 <1> 572 <1> 572 <1> %if %0 >= 2 572 00000417 8B1D[C80D0000] <1> mov ebx, %2 572 <1> %if %0 >= 3 572 <1> mov ecx, %3 572 <1> %if %0 = 4 572 <1> mov edx, %4 572 <1> %endif 572 <1> %endif 572 <1> %endif 572 0000041D B806000000 <1> mov eax, %1 572 <1> 572 00000422 CD40 <1> int 40h 573 00000424 9D popf 574 Failed: 575 00000425 61 popad 576 577 00000426 C3 retn 578 579 FreeModule: 580 ; Erdogan Tan (13/02/2017) 581 ; nothing to do here for memory de-allocation 582 ClearModInfo: 583 00000427 57 push edi 584 00000428 BF[08120000] mov edi, ModInfo 585 0000042D B9FA010000 mov ecx, ModInfoRec.size 586 ;cld 587 00000432 30C0 xor al, al 588 00000434 F3AA rep stosb 589 00000436 5F pop edi 590 00000437 C3 retn 591 592 ;============================================================================= 593 ; MODPLAY.ASM 594 ;============================================================================= 595 596 ; Amiga Module Loader v0.3b by Carlos Hasan. 597 ; July 23th, 1993. 598 599 ; EQUATES 600 601 NumTracks equ 4 602 DefTempo equ 6 603 DefBpm equ 125 604 MidCRate equ 8448 605 MixBufSize equ 4096 606 607 ; STRUCTURES 608 609 struc TrackInfo 610 00000000 .Samples: resd 1 611 00000004 .Position: resd 1 612 00000008 .Len: resw 1 613 0000000A .Repeat: resw 1 614 0000000C .RepLen: resw 1 615 0000000E .Volume: resb 1 616 0000000F .Error: resb 1 617 00000010 .Period: resw 1 618 00000012 .Pitch: resw 1 619 00000014 .Effect: resw 1 620 00000016 .PortTo: resw 1 621 00000018 .PortParm: resb 1 622 00000019 .VibPos: resb 1 623 0000001A .VibParm: resb 1 624 0000001B .OldSampOfs: resb 1 625 0000001C .Arp: resw 3 626 00000022 .ArpIndex: resw 1 627 .size: 628 endstruc 629 630 ; CODE 631 632 ;-------------------------------------------------------------------------- 633 ; BeatTrack: Process the next beat in one track. 634 ; In: 635 ; ds:di - Track info Address. 636 ;-------------------------------------------------------------------------- 637 638 ; edi = Track info address 639 640 BeatTrack: 641 00000438 668B5714 mov dx, [edi+TrackInfo.Effect] 642 0000043C 6685D2 test dx, dx 643 0000043F 743C je short None 644 00000441 80FE00 cmp dh, 00h 645 00000444 7438 je short Arpeggio 646 00000446 80FE01 cmp dh, 01h 647 00000449 7451 je short PortUp 648 0000044B 80FE02 cmp dh, 02h 649 0000044E 7471 je short PortDown 650 00000450 80FE03 cmp dh, 03h 651 00000453 0F848E000000 je TonePort 652 00000459 80FE04 cmp dh, 04h 653 0000045C 0F84BD000000 je Vibrato 654 00000462 80FE05 cmp dh, 05h 655 00000465 0F840E010000 je PortSlide 656 0000046B 80FE06 cmp dh, 06h 657 0000046E 0F8412010000 je VibSlide 658 00000474 80FE0A cmp dh, 0Ah 659 00000477 0F8413010000 je VolSlide 660 None: 661 0000047D C3 retn 662 Arpeggio: 663 0000047E 0FB75F22 movzx ebx, word [edi+TrackInfo.ArpIndex] 664 00000482 668B441F1C mov ax, [edi+TrackInfo.Arp+ebx] 665 00000487 66894712 mov [edi+TrackInfo.Pitch], ax 666 0000048B 6683C302 add bx, 2 667 0000048F 6683FB06 cmp bx, 6 668 00000493 7202 jb short SetArpIndex 669 00000495 31DB xor ebx, ebx 670 SetArpIndex: 671 00000497 66895F22 mov [edi+TrackInfo.ArpIndex], bx 672 0000049B C3 retn 673 PortUp: 674 0000049C 30F6 xor dh, dh 675 0000049E 668B5F10 mov bx, [edi+TrackInfo.Period] 676 000004A2 6629D3 sub bx, dx 677 000004A5 6683FB71 cmp bx, 113 678 000004A9 7D04 jge short NotSmall 679 000004AB 66BB7100 mov bx, 113 680 NotSmall: 681 000004AF 66895F10 mov [edi+TrackInfo.Period], bx 682 000004B3 6601DB add bx, bx 683 000004B6 66678B87[0214] mov ax, [PitchTable+bx] 684 000004BC 66894712 mov [edi+TrackInfo.Pitch], ax 685 000004C0 C3 retn 686 PortDown: 687 000004C1 30F6 xor dh, dh 688 000004C3 668B5F10 mov bx, [edi+TrackInfo.Period] 689 000004C7 6601D3 add bx, dx 690 000004CA 6681FB5803 cmp bx, 856 691 000004CF 7E04 jle short NotBig 692 000004D1 66BB5803 mov bx, 856 693 000004D5 66895F10 NotBig: mov [edi+TrackInfo.Period], bx 694 000004D9 6601DB add bx, bx 695 000004DC 66678B87[0214] mov ax, [PitchTable+bx] 696 000004E2 66894712 mov [edi+TrackInfo.Pitch], ax 697 000004E6 C3 retn 698 TonePort: 699 000004E7 30F6 xor dh, dh 700 000004E9 668B4716 mov ax, [edi+TrackInfo.PortTo] 701 000004ED 668B5F10 mov bx, [edi+TrackInfo.Period] 702 000004F1 6639C3 cmp bx, ax 703 000004F4 7428 je short NoPort 704 000004F6 7F0D jg short PortToUp 705 PortToDown: 706 000004F8 6601D3 add bx, dx 707 000004FB 6639C3 cmp bx, ax 708 000004FE 7E0D jle short SetPort 709 FixPort: 710 00000500 6689C3 mov bx, ax 711 00000503 EB08 jmp short SetPort 712 PortToUp: 713 00000505 6629D3 sub bx, dx 714 00000508 6639C3 cmp bx, ax 715 0000050B 7CF3 jl short FixPort 716 SetPort: 717 0000050D 66895F10 mov [edi+TrackInfo.Period], bx 718 00000511 6601DB add bx, bx 719 00000514 66678B87[0214] mov ax, [PitchTable+bx] 720 0000051A 66894712 mov [edi+TrackInfo.Pitch], ax 721 NoPort: 722 0000051E C3 retn 723 Vibrato: 724 0000051F 88D6 mov dh, dl 725 00000521 80E20F and dl, 0Fh 726 00000524 C0EE04 shr dh, 4 727 00000527 C0E602 shl dh, 2 728 0000052A 007719 add [edi+TrackInfo.VibPos], dh 729 0000052D 8A7719 mov dh, [edi+TrackInfo.VibPos] 730 00000530 88F3 mov bl, dh 731 00000532 C0EB02 shr bl, 2 732 00000535 6683E31F and bx, 1Fh 733 00000539 678A87[AB0C] mov al, [SinTable+bx] 734 0000053E F6E2 mul dl 735 00000540 66D1C0 rol ax, 1 736 00000543 86C4 xchg al, ah 737 00000545 80E401 and ah, 1 738 00000548 84F6 test dh, dh 739 0000054A 7903 jns short VibUp 740 0000054C 66F7D8 neg ax 741 VibUp: 742 0000054F 66034710 add ax, [edi+TrackInfo.Period] 743 00000553 6689C3 mov bx, ax 744 00000556 6683FB71 cmp bx, 113 745 0000055A 7D04 jge short NoLoVib 746 0000055C 66BB7100 mov bx, 113 747 NoLoVib: 748 00000560 6681FB5803 cmp bx, 856 749 00000565 7E04 jle short NoHiVib 750 00000567 66BB5803 mov bx, 856 751 NoHiVib: 752 0000056B 6601DB add bx, bx 753 0000056E 66678B87[0214] mov ax, [PitchTable+bx] 754 00000574 66894712 mov [edi+TrackInfo.Pitch], ax 755 00000578 C3 retn 756 PortSlide: 757 00000579 E812000000 call VolSlide 758 0000057E 8A5718 mov dl, [edi+TrackInfo.PortParm] 759 00000581 E961FFFFFF jmp TonePort 760 VibSlide: 761 00000586 E805000000 call VolSlide 762 0000058B 8A571A mov dl, [edi+TrackInfo.VibParm] 763 0000058E EB8F jmp short Vibrato 764 VolSlide: 765 00000590 88D6 mov dh, dl 766 00000592 80E20F and dl, 0Fh 767 00000595 C0EE04 shr dh, 4 768 00000598 8A470E mov al, [edi+TrackInfo.Volume] 769 0000059B 28D0 sub al, dl 770 0000059D 7D02 jge short NoLoVol 771 0000059F 30C0 xor al, al 772 NoLoVol: 773 000005A1 00F0 add al, dh 774 000005A3 3C40 cmp al, 64 775 000005A5 7602 jbe short NoHiVol 776 000005A7 B040 mov al, 64 777 NoHiVol: 778 000005A9 88470E mov [edi+TrackInfo.Volume], al 779 000005AC C3 retn 780 781 ;-------------------------------------------------------------------------- 782 ; GetTrack: Get the next Note from a pattern. 783 ; In: 784 ; ds:di - Track info Address. 785 ; es:si - Pattern Note Address. 786 ; Out: 787 ; es:si - The Next Pattern Note address. 788 ;-------------------------------------------------------------------------- 789 790 ; esi = Pattern note address 791 ; edi = Track info address 792 793 GetTrack: 794 000005AD 66AD lodsw 795 000005AF 86C4 xchg al, ah 796 000005B1 88E3 mov bl, ah 797 000005B3 80E40F and ah, 0Fh 798 000005B6 6689C1 mov cx, ax 799 000005B9 66AD lodsw 800 000005BB 86C4 xchg al, ah 801 000005BD 88E7 mov bh, ah 802 000005BF 80E40F and ah, 0Fh 803 000005C2 6689C2 mov dx, ax 804 000005C5 66895714 mov [edi+TrackInfo.Effect], dx 805 000005C9 80E3F0 and bl, 0F0h 806 000005CC C0EF04 shr bh, 4 807 000005CF 08FB or bl, bh 808 000005D1 7449 je short SetPeriod 809 SetSample: 810 ;xor bh, bh 811 000005D3 81E3FF000000 and ebx, 0FFh 812 000005D9 4B dec ebx 813 000005DA 01DB add ebx, ebx 814 000005DC 668B83[C4130000] mov ax, [ModInfo.SampVol+ebx] 815 000005E3 88470E mov [edi+TrackInfo.Volume], al 816 000005E6 668B83[8E120000] mov ax, [ModInfo.SampOfs+ebx] 817 000005ED 668907 mov [edi+TrackInfo.Samples], ax 818 000005F0 668B83[CC120000] mov ax, [ModInfo.SampSeg+ebx] 819 000005F7 66894702 mov [edi+TrackInfo.Samples+2], ax 820 000005FB 668B83[0A130000] mov ax, [ModInfo.SampLen+ebx] 821 00000602 66894708 mov [edi+TrackInfo.Len], ax 822 00000606 668B83[48130000] mov ax, [ModInfo.SampRep+ebx] 823 0000060D 6689470A mov [edi+TrackInfo.Repeat], ax 824 00000611 668B83[86130000] mov ax, [ModInfo.SampRepLen+ebx] 825 00000618 6689470C mov [edi+TrackInfo.RepLen], ax 826 SetPeriod: 827 0000061C 6685C9 test cx, cx 828 0000061F 7424 jz short SetEffect 829 830 00000621 66894F16 mov [edi+TrackInfo.PortTo], cx 831 00000625 80FE03 cmp dh, 03h 832 00000628 741B je short SetEffect 833 834 0000062A 66894F10 mov [edi+TrackInfo.Period], cx 835 0000062E 6689CB mov bx, cx 836 00000631 6601DB add bx, bx 837 00000634 66678B87[0214] mov ax, [PitchTable+bx] 838 0000063A 66894712 mov [edi+TrackInfo.Pitch], ax 839 0000063E C7470400000000 mov dword [edi+TrackInfo.Position], 0 840 SetEffect: 841 00000645 6685D2 test dx, dx 842 00000648 7430 jz short InitNone 843 0000064A 80FE00 cmp dh, 00h 844 0000064D 0F84E5000000 je InitArpeggio 845 00000653 80FE03 cmp dh, 03h 846 00000656 7423 je short InitTonePort 847 00000658 80FE04 cmp dh, 04h 848 0000065B 742D je short InitVibrato 849 0000065D 80FE09 cmp dh, 09h 850 00000660 7451 je short SampleOfs 851 00000662 80FE0B cmp dh, 0Bh 852 00000665 7462 je short PosJump 853 00000667 80FE0C cmp dh, 0Ch 854 0000066A 746B je short SetVolume 855 0000066C 80FE0D cmp dh, 0Dh 856 0000066F 7471 je short Break 857 00000671 80FE0F cmp dh, 0Fh 858 00000674 0F8487000000 je SetSpeed 859 InitNone: 860 0000067A C3 retn 861 InitTonePort: 862 0000067B 84D2 test dl, dl 863 0000067D 7503 jnz short SetPortParm 864 0000067F 8A5718 mov dl, [edi+TrackInfo.PortParm] 865 SetPortParm: 866 00000682 885718 mov [edi+TrackInfo.PortParm], dl 867 00000685 66895714 mov [edi+TrackInfo.Effect], dx 868 00000689 C3 retn 869 InitVibrato: 870 0000068A 8A471A mov al, [edi+TrackInfo.VibParm] 871 0000068D 88C4 mov ah, al 872 0000068F 240F and al, 0Fh 873 00000691 80E4F0 and ah, 0F0h 874 00000694 F6C20F test dl, 0Fh 875 00000697 7502 jne short OkDepth 876 00000699 08C2 or dl, al 877 OkDepth: 878 0000069B F6C2F0 test dl, 0F0h 879 0000069E 7502 jnz short OkRate 880 000006A0 08E2 or dl, ah 881 OkRate: 882 000006A2 88571A mov [edi+TrackInfo.VibParm], dl 883 000006A5 66895714 mov [edi+TrackInfo.Effect], dx 884 000006A9 6685C9 test cx, cx 885 000006AC 7404 jz short OkPos 886 000006AE C6471900 mov byte [edi+TrackInfo.VibPos], 0 887 OkPos: 888 000006B2 C3 retn 889 SampleOfs: 890 000006B3 84D2 test dl, dl 891 000006B5 7503 jnz short SetSampleOfs 892 000006B7 8A571B mov dl, [edi+TrackInfo.OldSampOfs] 893 SetSampleOfs: 894 000006BA 88571B mov [edi+TrackInfo.OldSampOfs], dl 895 000006BD 88D6 mov dh, dl 896 000006BF 81E200FF0000 and edx, 0FF00h ; 05/03/2017 897 000006C5 895704 mov [edi+TrackInfo.Position], edx 898 000006C8 C3 retn 899 PosJump: 900 000006C9 8815[B46B0000] mov [OrderPos], dl 901 000006CF C605[B86B0000]40 mov byte [Row], 64 902 000006D6 C3 retn 903 SetVolume: 904 000006D7 80FA40 cmp dl, 64 905 000006DA 7602 jbe short OkVol 906 000006DC B240 mov dl, 64 907 OkVol: 908 000006DE 88570E mov [edi+TrackInfo.Volume], dl 909 000006E1 C3 retn 910 Break: 911 000006E2 88D6 mov dh, dl 912 000006E4 80E20F and dl, 0Fh 913 000006E7 C0EE04 shr dh, 4 914 000006EA 00F6 add dh, dh 915 000006EC 00F2 add dl, dh 916 000006EE C0E602 shl dh, 2 917 000006F1 00F2 add dl, dh 918 000006F3 8815[B96B0000] mov [BreakRow], dl 919 000006F9 C605[B86B0000]40 mov byte [Row], 64 920 00000700 C3 retn 921 SetSpeed: 922 00000701 84D2 test dl,dl 923 00000703 7432 je Skip 924 00000705 80FA1F cmp dl,31 925 00000708 770D ja short SetBpm 926 SetTempo: 927 0000070A 8815[B56B0000] mov [Tempo], dl 928 00000710 8815[B66B0000] mov [TempoWait], dl 929 00000716 C3 retn 930 SetBpm: 931 00000717 8815[B76B0000] mov [Bpm], dl 932 0000071D B067 mov al, 103 933 0000071F F6E2 mul dl 934 00000721 88E3 mov bl, ah 935 00000723 30FF xor bh, bh 936 00000725 66A1[150D0000] mov ax, [MixSpeed] 937 0000072B 6631D2 xor dx, dx 938 0000072E 66F7F3 div bx 939 00000731 66A3[BA6B0000] mov [BpmSamples], ax 940 Skip: 941 00000737 C3 retn 942 InitArpeggio: 943 00000738 88D6 mov dh, dl 944 0000073A 80E20F and dl, 0Fh 945 0000073D C0EE04 shr dh, 4 946 00000740 66B92400 mov cx, 36 947 00000744 31DB xor ebx, ebx 948 00000746 668B4710 mov ax, [edi+TrackInfo.Period] 949 gt_ScanPeriod: 950 0000074A 66673B87[CB0C] cmp ax, [PeriodTable+bx] 951 00000750 7306 jae short SetArp 952 00000752 6683C302 add bx, 2 953 00000756 E2F2 loop gt_ScanPeriod 954 SetArp: 955 00000758 6601D2 add dx, dx 956 0000075B 00DE add dh, bl 957 0000075D 00DA add dl, bl 958 0000075F 66678B9F[CB0C] mov bx, [PeriodTable+bx] 959 00000765 6601DB add bx, bx 960 00000768 66678B87[0214] mov ax, [PitchTable+bx] 961 0000076E 6689471C mov [edi+TrackInfo.Arp], ax 962 00000772 88F3 mov bl, dh 963 00000774 30FF xor bh, bh 964 00000776 66678B9F[CB0C] mov bx, [PeriodTable+bx] 965 0000077C 6601DB add bx, bx 966 0000077F 66678B87[0214] mov ax, [PitchTable+bx] 967 00000785 6689471E mov [edi+TrackInfo.Arp+2], ax 968 00000789 88D3 mov bl, dl 969 0000078B 30FF xor bh, bh 970 0000078D 66678B9F[CB0C] mov bx, [PeriodTable+bx] 971 00000793 6601DB add bx, bx 972 00000796 66678B87[0214] mov ax, [PitchTable+bx] 973 0000079C 66894720 mov [edi+TrackInfo.Arp+4], ax 974 000007A0 66C747220000 mov word [edi+TrackInfo.ArpIndex], 0 975 000007A6 C3 retn 976 977 ;-------------------------------------------------------------------------- 978 ; UpdateTracks: Main code to process the next tick to be played. 979 ;-------------------------------------------------------------------------- 980 981 UpdateTracks: 982 000007A7 FE0D[B66B0000] dec byte [TempoWait] 983 000007AD 7415 jz short GetTracks 984 985 000007AF B904000000 mov ecx, NumTracks 986 000007B4 BF[CA6B0000] mov edi, Tracks 987 BeatTracks: 988 000007B9 E87AFCFFFF call BeatTrack 989 000007BE 83C724 add edi, TrackInfo.size 990 000007C1 E2F6 loop BeatTracks 991 000007C3 C3 retn 992 GetTracks: 993 000007C4 A0[B56B0000] mov al, [Tempo] 994 000007C9 A2[B66B0000] mov [TempoWait], al 995 996 000007CE 8B35[C66B0000] mov esi, [Note] 997 000007D4 803D[B86B0000]40 cmp byte [Row], 64 998 000007DB 7263 jb short NoPattWrap 999 1000 000007DD 8B35[8A120000] mov esi, [ModInfo.Patterns] 1001 000007E3 8A1D[B46B0000] mov bl, [OrderPos] 1002 000007E9 3A1D[08120000] cmp bl, [ModInfo.OrderLen] 1003 000007EF 7214 jb short NoOrderWrap 1004 000007F1 8A1D[09120000] mov bl, [ModInfo.ReStart] 1005 000007F7 881D[B46B0000] mov [OrderPos], bl 1006 000007FD 3A1D[08120000] cmp bl, [ModInfo.OrderLen] 1007 00000803 735D jae short NoUpdate 1008 NoOrderWrap: 1009 ;xor bh, bh 1010 00000805 81E3FF000000 and ebx, 0FFh 1011 0000080B 8A9B[0A120000] mov bl, [ModInfo.Order+ebx] 1012 00000811 C1E30A shl ebx, 10 ; *1024 1013 00000814 01DE add esi, ebx 1014 00000816 8A1D[B96B0000] mov bl, [BreakRow] 1015 0000081C 881D[B86B0000] mov [Row], bl 1016 ;xor bh, bh 1017 00000822 81E3FF000000 and ebx, 0FFh 1018 00000828 883D[B96B0000] mov [BreakRow], bh ; 0 1019 0000082E 66C1E304 shl bx, 4 1020 00000832 01DE add esi, ebx 1021 00000834 8935[C66B0000] mov [Note], esi 1022 0000083A FE05[B46B0000] inc byte [OrderPos] 1023 NoPattWrap: 1024 00000840 FE05[B86B0000] inc byte [Row] 1025 1026 ;cld 1027 00000846 B904000000 mov ecx, NumTracks 1028 0000084B BF[CA6B0000] mov edi, Tracks 1029 GetTracks_next: 1030 00000850 51 push ecx 1031 00000851 E857FDFFFF call GetTrack 1032 00000856 59 pop ecx 1033 00000857 83C724 add edi, TrackInfo.size 1034 0000085A E2F4 loop GetTracks_next 1035 1036 0000085C 8935[C66B0000] mov [Note], esi 1037 NoUpdate: 1038 00000862 C3 retn 1039 1040 ;-------------------------------------------------------------------------- 1041 ; MixTrack: Mixes one track into a CLEAN buffer. 1042 ; In: 1043 ; ds:si - Track Info Address. 1044 ; ds:di - Buffer Address. 1045 ; cx - Buffer Size. 1046 ;-------------------------------------------------------------------------- 1047 1048 ; esi = Track info address 1049 ; edi = Buffer address 1050 ; ecx = Buffer size 1051 1052 MixTrack: 1053 00000863 66837E0C02 cmp word [esi+TrackInfo.RepLen], 2 1054 00000868 7748 ja short MixLooped 1055 MixNonLooped: 1056 0000086A 8B16 mov edx, [esi+TrackInfo.Samples] 1057 0000086C 8B5E04 mov ebx, [esi+TrackInfo.Position] 1058 0000086F 0FB76E08 movzx ebp, word [esi+TrackInfo.Len] 1059 00000873 52 push edx 1060 00000874 56 push esi 1061 00000875 01D3 add ebx, edx 1062 00000877 01D5 add ebp, edx 1063 00000879 668B5612 mov dx, [esi+TrackInfo.Pitch] 1064 0000087D 8A460E mov al, [esi+TrackInfo.Volume] 1065 00000880 8A660F mov ah, [esi+TrackInfo.Error] 1066 00000883 89DE mov esi, ebx 1067 00000885 88C7 mov bh, al 1068 00000887 88D0 mov al, dl 1069 00000889 88F2 mov dl, dh 1070 ;xor dh, dh 1071 0000088B 81E2FF000000 and edx, 0FFh 1072 nlMixSamp: 1073 00000891 39EE cmp esi, ebp 1074 00000893 7310 jae short nlMixBye 1075 00000895 8A1E mov bl, [esi] 1076 00000897 678A9F[B41A] mov bl, [VolTable+bx] 1077 0000089C 001F add [edi], bl 1078 0000089E 47 inc edi 1079 0000089F 00C4 add ah, al 1080 000008A1 11D6 adc esi, edx 1081 000008A3 E2EC loop nlMixSamp 1082 nlMixBye: 1083 000008A5 89F3 mov ebx, esi 1084 000008A7 5E pop esi 1085 000008A8 5A pop edx 1086 000008A9 29D3 sub ebx, edx 1087 000008AB 895E04 mov [esi+TrackInfo.Position], ebx 1088 000008AE 88660F mov [esi+TrackInfo.Error], ah 1089 000008B1 C3 retn 1090 MixLooped: 1091 000008B2 8B16 mov edx, [esi+TrackInfo.Samples] 1092 000008B4 8B5E04 mov ebx, [esi+TrackInfo.Position] 1093 000008B7 0FB76E0C movzx ebp, word [esi+TrackInfo.RepLen] 1094 000008BB 892D[C26B0000] mov [BufRep], ebp 1095 ;add ebp, [esi+TrackInfo.Repeat] ; BUG ! 1096 000008C1 66036E0A add bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!) 1097 000008C5 52 push edx 1098 000008C6 56 push esi 1099 000008C7 01D3 add ebx, edx 1100 000008C9 01D5 add ebp, edx 1101 000008CB 668B5612 mov dx, [esi+TrackInfo.Pitch] 1102 000008CF 8A460E mov al, [esi+TrackInfo.Volume] 1103 000008D2 8A660F mov ah, [esi+TrackInfo.Error] 1104 ;mov si, bx 1105 000008D5 89DE mov esi, ebx ; 04/09/2017 1106 000008D7 88C7 mov bh, al 1107 000008D9 88D0 mov al, dl 1108 000008DB 88F2 mov dl, dh 1109 ;xor dh, dh 1110 000008DD 81E2FF000000 and edx, 0FFh 1111 lpMixSamp: 1112 000008E3 39EE cmp esi, ebp 1113 000008E5 7206 jb short lpMixNow 1114 000008E7 2B35[C26B0000] sub esi, [BufRep] 1115 lpMixNow: 1116 000008ED 8A1E mov bl, [esi] 1117 000008EF 678A9F[B41A] mov bl, [VolTable+bx] 1118 000008F4 001F add [edi], bl 1119 000008F6 47 inc edi 1120 000008F7 00C4 add ah, al 1121 000008F9 11D6 adc esi, edx 1122 000008FB E2E6 loop lpMixSamp 1123 lpMixBye: 1124 ; mov ebx, esi 1125 ; pop esi 1126 ; pop edx 1127 ; sub ebx, edx 1128 ; mov [esi+TrackInfo.Position], ebx 1129 ; mov [esi+TrackInfo.Error], ah 1130 ; retn 1131 000008FD EBA6 jmp short nlMixBye 1132 1133 ;-------------------------------------------------------------------------- 1134 ; GetSamples: Returns the next chunk of samples to be played. 1135 ; In: 1136 ; Buffer - Buffer Address. 1137 ; Count - Buffer Size. 1138 ;-------------------------------------------------------------------------- 1139 1140 GetSamples: 1141 ; edi = buffer address 1142 ; ebx = count 1143 1144 000008FF 60 pushad 1145 1146 ;cld 1147 NextChunk: 1148 00000900 66833D[C06B0000]00 cmp word [BufLen], 0 1149 00000908 7548 jne short CopyChunk 1150 1151 0000090A 53 push ebx 1152 0000090B 57 push edi 1153 MixChunk: 1154 0000090C BF[B45B0000] mov edi, MixBuffer 1155 00000911 0FB70D[BA6B0000] movzx ecx, word [BpmSamples] 1156 00000918 893D[BC6B0000] mov [BufPtr], edi 1157 0000091E 66890D[C06B0000] mov [BufLen], cx 1158 1159 00000925 B080 mov al, 80h 1160 00000927 F3AA rep stosb 1161 1162 00000929 66B90400 mov cx, NumTracks 1163 0000092D BE[A66B0000] mov esi, Tracks - TrackInfo.size 1164 GetSamples_next: 1165 00000932 51 push ecx 1166 00000933 83C624 add esi, TrackInfo.size 1167 00000936 668B0D[C06B0000] mov cx, [BufLen] 1168 0000093D 8B3D[BC6B0000] mov edi, [BufPtr] 1169 00000943 E81BFFFFFF call MixTrack 1170 00000948 59 pop ecx 1171 00000949 E2E7 loop GetSamples_next 1172 1173 0000094B E857FEFFFF call UpdateTracks 1174 1175 00000950 5F pop edi 1176 00000951 5B pop ebx 1177 CopyChunk: 1178 ;mov cx, [BufLen] 1179 00000952 0FB70D[C06B0000] movzx ecx, word [BufLen] 1180 00000959 39D9 cmp ecx, ebx 1181 ;cmp cx, bx 1182 0000095B 7602 jbe short MoveChunk 1183 ;mov cx, bx 1184 0000095D 89D9 mov ecx, ebx 1185 MoveChunk: 1186 0000095F 8B35[BC6B0000] mov esi, [BufPtr] 1187 00000965 010D[BC6B0000] add [BufPtr], ecx 1188 0000096B 66290D[C06B0000] sub [BufLen], cx 1189 00000972 29CB sub ebx, ecx 1190 00000974 F3A4 rep movsb 1191 00000976 85DB test ebx, ebx 1192 00000978 7586 jnz short NextChunk 1193 1194 0000097A 61 popad 1195 0000097B C3 retn 1196 1197 ;-------------------------------------------------------------------------- 1198 ; StartPlaying: Initializes the Sound System. 1199 ; In: 1200 ; Module Information Resources. 1201 ;-------------------------------------------------------------------------- 1202 1203 StartPlaying: 1204 0000097C 60 pushad 1205 SetModParms: 1206 0000097D C605[B46B0000]00 mov byte [OrderPos], 0 1207 00000984 C605[B56B0000]06 mov byte [Tempo], DefTempo 1208 0000098B C605[B66B0000]06 mov byte [TempoWait], DefTempo 1209 00000992 C605[B76B0000]7D mov byte [Bpm], DefBpm 1210 00000999 C605[B86B0000]40 mov byte [Row], 64 1211 000009A0 C605[B96B0000]00 mov byte [BreakRow], 0 1212 000009A7 66A1[150D0000] mov ax, [MixSpeed] 1213 000009AD 31D2 xor edx, edx 1214 000009AF 66BB3200 mov bx, 24*DefBpm/60 1215 000009B3 66F7F3 div bx 1216 000009B6 66A3[BA6B0000] mov [BpmSamples], ax 1217 ClearTracks: 1218 000009BC BF[CA6B0000] mov edi, Tracks 1219 000009C1 B990000000 mov ecx, NumTracks*TrackInfo.size 1220 000009C6 31C0 xor eax, eax 1221 ;cld 1222 000009C8 F3AA rep stosb 1223 1224 000009CA A3[BC6B0000] mov [BufPtr], eax 1225 000009CF 66A3[C06B0000] mov [BufLen], ax 1226 MakePitch: 1227 000009D5 66B80021 mov ax, MidCRate 1228 000009D9 66BBAC01 mov bx, 428 1229 000009DD 66F7E3 mul bx 1230 000009E0 66F735[150D0000] div word [MixSpeed] 1231 000009E7 30F6 xor dh, dh 1232 000009E9 88E2 mov dl, ah 1233 000009EB 88C4 mov ah, al 1234 000009ED 30C0 xor al, al 1235 000009EF 66B95903 mov cx, 857 1236 000009F3 31DB xor ebx, ebx 1237 000009F5 BF[02140000] mov edi, PitchTable 1238 PitchLoop: 1239 000009FA 50 push eax 1240 000009FB 52 push edx 1241 000009FC 6639DA cmp dx, bx 1242 000009FF 7303 jae short NoDiv 1243 00000A01 66F7F3 div bx 1244 NoDiv: 1245 00000A04 66AB stosw 1246 00000A06 5A pop edx 1247 00000A07 58 pop eax 1248 00000A08 43 inc ebx 1249 00000A09 E2EF loop PitchLoop 1250 MakeVolume: 1251 00000A0B 66B90041 mov cx, 16640 1252 00000A0F 89CB mov ebx, ecx 1253 VolLoop: 1254 00000A11 4B dec ebx 1255 00000A12 88D8 mov al, bl 1256 00000A14 F6EF imul bh 1257 00000A16 88A3[B41A0000] mov [VolTable+ebx], ah 1258 00000A1C E2F3 loop VolLoop 1259 1260 00000A1E 61 popad 1261 00000A1F C3 retn 1262 1263 ;-------------------------------------------------------------------------- 1264 ; StopPlaying: ShutDown the Sound System. 1265 ;-------------------------------------------------------------------------- 1266 1267 StopPlaying: 1268 ; 19/06/2017 1269 ; Stop Playing 1270 sys _audio, 0700h 1270 <1> 1270 <1> 1270 <1> 1270 <1> 1270 <1> %if %0 >= 2 1270 00000A20 BB00070000 <1> mov ebx, %2 1270 <1> %if %0 >= 3 1270 <1> mov ecx, %3 1270 <1> %if %0 = 4 1270 <1> mov edx, %4 1270 <1> %endif 1270 <1> %endif 1270 <1> %endif 1270 00000A25 B820000000 <1> mov eax, %1 1270 <1> 1270 00000A2A CD40 <1> int 40h 1271 ; Cancel callback service (for user) 1272 sys _audio, 0900h 1272 <1> 1272 <1> 1272 <1> 1272 <1> 1272 <1> %if %0 >= 2 1272 00000A2C BB00090000 <1> mov ebx, %2 1272 <1> %if %0 >= 3 1272 <1> mov ecx, %3 1272 <1> %if %0 = 4 1272 <1> mov edx, %4 1272 <1> %endif 1272 <1> %endif 1272 <1> %endif 1272 00000A31 B820000000 <1> mov eax, %1 1272 <1> 1272 00000A36 CD40 <1> int 40h 1273 ; Deallocate Audio Buffer (for user) 1274 sys _audio, 0A00h 1274 <1> 1274 <1> 1274 <1> 1274 <1> 1274 <1> %if %0 >= 2 1274 00000A38 BB000A0000 <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 00000A3D B820000000 <1> mov eax, %1 1274 <1> 1274 00000A42 CD40 <1> int 40h 1275 ; Disable Audio Device 1276 sys _audio, 0C00h 1276 <1> 1276 <1> 1276 <1> 1276 <1> 1276 <1> %if %0 >= 2 1276 00000A44 BB000C0000 <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 00000A49 B820000000 <1> mov eax, %1 1276 <1> 1276 00000A4E CD40 <1> int 40h 1277 1278 00000A50 C3 retn 1279 1280 ;============================================================================= 1281 ; 1282 ;============================================================================= 1283 1284 ;dword2str: 1285 ; ; 13/11/2016 - Erdogan Tan 1286 ; ; eax = dword value 1287 ; ; 1288 ; call dwordtohex 1289 ; mov [dword_str], edx 1290 ; mov [dword_str+4], eax 1291 ; mov si, dword_str 1292 ; retn 1293 1294 ; 05/03/2017 (TRDOS 386) 1295 ; trdos386.s (unix386.s) - 10/05/2015 1296 ; Convert binary number to hexadecimal string 1297 1298 ;bytetohex: 1299 ; ; INPUT -> 1300 ; ; AL = byte (binary number) 1301 ; ; OUTPUT -> 1302 ; ; AX = hexadecimal string 1303 ; ; 1304 ; push ebx 1305 ; movzx ebx, al 1306 ; shr bl, 4 1307 ; mov bl, [ebx+hex_chars] 1308 ; xchg bl, al 1309 ; and bl, 0Fh 1310 ; mov ah, [ebx+hex_chars] 1311 ; pop ebx 1312 ; retn 1313 1314 ;wordtohex: 1315 ; ; INPUT -> 1316 ; ; AX = word (binary number) 1317 ; ; OUTPUT -> 1318 ; ; EAX = hexadecimal string 1319 ; ; 1320 ; push ebx 1321 ; xor ebx, ebx 1322 ; xchg ah, al 1323 ; push eax 1324 ; mov bl, ah 1325 ; shr bl, 4 1326 ; mov al, [ebx+hex_chars] 1327 ; mov bl, ah 1328 ; and bl, 0Fh 1329 ; mov ah, [ebx+hex_chars] 1330 ; shl eax, 16 1331 ; pop eax 1332 ; pop ebx 1333 ; jmp short bytetohex 1334 1335 ;dwordtohex: 1336 ; ; INPUT -> 1337 ; ; EAX = dword (binary number) 1338 ; ; OUTPUT -> 1339 ; ; EDX:EAX = hexadecimal string 1340 ; ; 1341 ; push eax 1342 ; shr eax, 16 1343 ; call wordtohex 1344 ; mov edx, eax 1345 ; pop eax 1346 ; call wordtohex 1347 ; retn 1348 1349 ; 19/06/2017 1350 ; 05/03/2017 (TRDOS 386) 1351 ; 13/11/2016 - Erdogan Tan 1352 write_audio_dev_info: 1353 ; BUS/DEV/FN 1354 ; 00000000BBBBBBBBDDDDDFFF00000000 1355 ; DEV/VENDOR 1356 ; DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV 1357 1358 00000A51 8B35[B80D0000] mov esi, [dev_vendor] 1359 00000A57 6689F0 mov ax, si 1360 00000A5A 0FB6D8 movzx ebx, al 1361 00000A5D 88DA mov dl, bl 1362 00000A5F 80E30F and bl, 0Fh 1363 00000A62 8A83[170D0000] mov al, [ebx+hex_chars] 1364 00000A68 A2[5C0D0000] mov [msgVendorId+3], al 1365 00000A6D 88D3 mov bl, dl 1366 00000A6F C0EB04 shr bl, 4 1367 00000A72 8A83[170D0000] mov al, [ebx+hex_chars] 1368 00000A78 A2[5B0D0000] mov [msgVendorId+2], al 1369 00000A7D 88E3 mov bl, ah 1370 00000A7F 88DA mov dl, bl 1371 00000A81 80E30F and bl, 0Fh 1372 00000A84 8A83[170D0000] mov al, [ebx+hex_chars] 1373 00000A8A A2[5A0D0000] mov [msgVendorId+1], al 1374 00000A8F 88D3 mov bl, dl 1375 00000A91 C0EB04 shr bl, 4 1376 00000A94 8A83[170D0000] mov al, [ebx+hex_chars] 1377 00000A9A A2[590D0000] mov [msgVendorId], al 1378 00000A9F C1EE10 shr esi, 16 1379 00000AA2 6689F0 mov ax, si 1380 00000AA5 88C3 mov bl, al 1381 00000AA7 88DA mov dl, bl 1382 00000AA9 80E30F and bl, 0Fh 1383 00000AAC 8A83[170D0000] mov al, [ebx+hex_chars] 1384 00000AB2 A2[6D0D0000] mov [msgDevId+3], al 1385 00000AB7 88D3 mov bl, dl 1386 00000AB9 C0EB04 shr bl, 4 1387 00000ABC 8A83[170D0000] mov al, [ebx+hex_chars] 1388 00000AC2 A2[6C0D0000] mov [msgDevId+2], al 1389 00000AC7 88E3 mov bl, ah 1390 00000AC9 88DA mov dl, bl 1391 00000ACB 80E30F and bl, 0Fh 1392 00000ACE 8A83[170D0000] mov al, [ebx+hex_chars] 1393 00000AD4 A2[6B0D0000] mov [msgDevId+1], al 1394 00000AD9 88D3 mov bl, dl 1395 00000ADB C0EB04 shr bl, 4 1396 00000ADE 8A83[170D0000] mov al, [ebx+hex_chars] 1397 00000AE4 A2[6A0D0000] mov [msgDevId], al 1398 1399 00000AE9 8B35[BC0D0000] mov esi, [bus_dev_fn] 1400 00000AEF C1EE08 shr esi, 8 1401 00000AF2 6689F0 mov ax, si 1402 00000AF5 88C3 mov bl, al 1403 00000AF7 88DA mov dl, bl 1404 00000AF9 80E307 and bl, 7 ; bit 0,1,2 1405 00000AFC 8A83[170D0000] mov al, [ebx+hex_chars] 1406 00000B02 A2[910D0000] mov [msgFncNo+1], al 1407 00000B07 88D3 mov bl, dl 1408 00000B09 C0EB03 shr bl, 3 1409 00000B0C 88DA mov dl, bl 1410 00000B0E 80E30F and bl, 0Fh 1411 00000B11 8A83[170D0000] mov al, [ebx+hex_chars] 1412 00000B17 A2[830D0000] mov [msgDevNo+1], al 1413 00000B1C 88D3 mov bl, dl 1414 00000B1E C0EB04 shr bl, 4 1415 00000B21 8A83[170D0000] mov al, [ebx+hex_chars] 1416 00000B27 A2[820D0000] mov [msgDevNo], al 1417 00000B2C 88E3 mov bl, ah 1418 00000B2E 88DA mov dl, bl 1419 00000B30 80E30F and bl, 0Fh 1420 00000B33 8A83[170D0000] mov al, [ebx+hex_chars] 1421 00000B39 A2[770D0000] mov [msgBusNo+1], al 1422 00000B3E 88D3 mov bl, dl 1423 00000B40 C0EB04 shr bl, 4 1424 00000B43 8A83[170D0000] mov al, [ebx+hex_chars] 1425 00000B49 A2[760D0000] mov [msgBusNo], al 1426 1427 00000B4E 66A1[C40D0000] mov ax, [ac97_io_base] 1428 00000B54 88C3 mov bl, al 1429 00000B56 88DA mov dl, bl 1430 00000B58 80E30F and bl, 0Fh 1431 00000B5B 8A83[170D0000] mov al, [ebx+hex_chars] 1432 00000B61 A2[AA0D0000] mov [msgIOBaseAddr+3], al 1433 00000B66 88D3 mov bl, dl 1434 00000B68 C0EB04 shr bl, 4 1435 00000B6B 8A83[170D0000] mov al, [ebx+hex_chars] 1436 00000B71 A2[A90D0000] mov [msgIOBaseAddr+2], al 1437 00000B76 88E3 mov bl, ah 1438 00000B78 88DA mov dl, bl 1439 00000B7A 80E30F and bl, 0Fh 1440 00000B7D 8A83[170D0000] mov al, [ebx+hex_chars] 1441 00000B83 A2[A80D0000] mov [msgIOBaseAddr+1], al 1442 00000B88 88D3 mov bl, dl 1443 00000B8A C0EB04 shr bl, 4 1444 00000B8D 8A83[170D0000] mov al, [ebx+hex_chars] 1445 00000B93 A2[A70D0000] mov [msgIOBaseAddr], al 1446 1447 ; 24/11/2016 1448 00000B98 30E4 xor ah, ah 1449 00000B9A A0[C60D0000] mov al, [ac97_int_ln_reg] 1450 00000B9F B10A mov cl, 10 1451 00000BA1 F6F1 div cl 1452 00000BA3 660105[B20D0000] add [msgIRQ], ax 1453 00000BAA 20C0 and al, al 1454 00000BAC 750D jnz short _w_ac97imsg_ ; 19/06/2017 1455 00000BAE A0[B30D0000] mov al, [msgIRQ+1] 1456 00000BB3 B420 mov ah, ' ' 1457 00000BB5 66A3[B20D0000] mov [msgIRQ], ax 1458 _w_ac97imsg_: 1459 ; EBX = Message address 1460 ; ECX = Max. message length (or stop on ZERO character) 1461 ; (1 to 255) 1462 ; DL = Message color (07h = light gray, 0Fh = white) 1463 sys _msg, msgAC97Info, 255, 07h 1463 <1> 1463 <1> 1463 <1> 1463 <1> 1463 <1> %if %0 >= 2 1463 00000BBB BB[280D0000] <1> mov ebx, %2 1463 <1> %if %0 >= 3 1463 00000BC0 B9FF000000 <1> mov ecx, %3 1463 <1> %if %0 = 4 1463 00000BC5 BA07000000 <1> mov edx, %4 1463 <1> %endif 1463 <1> %endif 1463 <1> %endif 1463 00000BCA B823000000 <1> mov eax, %1 1463 <1> 1463 00000BCF CD40 <1> int 40h 1464 00000BD1 C3 retn 1465 1466 ;============================================================================= 1467 ; preinitialized data 1468 ;============================================================================= 1469 1470 ;============================================================================= 1471 ; PLAY.ASM - DATA 1472 ;============================================================================= 1473 1474 msg_2017: 1475 00000BD2 54696E79204D4F4420- db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. ' 1475 00000BDB 506C6179657220666F- 1475 00000BE4 72205452444F532033- 1475 00000BED 383620627920457264- 1475 00000BF6 6F67616E2054616E2E- 1475 00000BFF 20 1476 00000C00 4F63746F6265722032- db 'October 2017.',10,13 1476 00000C09 3031372E0A0D 1477 00000C0F 75736167653A20706C- db 'usage: playmod filename.mod', 10,13,0 1477 00000C18 61796D6F642066696C- 1477 00000C21 656E616D652E6D6F64- 1477 00000C2A 0A0D00 1478 00000C2D 30382F31302F323031- db '08/10/2017',10,13,0 1478 00000C36 370A0D00 1479 1480 00000C3A 54696E79204D4F4420- Credits: db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.' 1480 00000C43 506C61796572207630- 1480 00000C4C 2E3162206279204361- 1480 00000C55 726C6F732048617361- 1480 00000C5E 6E2E204A756C792031- 1480 00000C67 3939332E 1481 00000C6B 0A0D00 db 10,13,0 1482 00000C6E 4572726F72206C6F61- ErrorMesg: db 'Error loading Module file.',10,13,0 1482 00000C77 64696E67204D6F6475- 1482 00000C80 6C652066696C652E0A- 1482 00000C89 0D00 1483 ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0 1484 ;MsgFound: db 'Sound Blaster found at Address 2' 1485 ;PortText: db 'x0h, IRQ ' 1486 ;IrqText: db 'x.',10,13,0 1487 1488 trdos386_err_msg: 1489 00000C8B 5452444F5320333836- db 'TRDOS 386 System call error !', 10, 13,0 1489 00000C94 2053797374656D2063- 1489 00000C9D 616C6C206572726F72- 1489 00000CA6 20210A0D00 1490 1491 ;============================================================================= 1492 ; MODPLAY.ASM - DATA 1493 ;============================================================================= 1494 1495 ;Credits: db 'Amiga Module Player v0.3b by Carlos Hasan.' 1496 1497 00000CAB 0019324A62788EA2B4- SinTable: db 0,25,50,74,98,120,142,162,180,197,212,225 1497 00000CB4 C5D4E1 1498 00000CB7 ECF4FAFEFFFEFAF4EC- db 236,244,250,254,255,254,250,244,236,225 1498 00000CC0 E1 1499 00000CC1 D4C5B4A28E78624A32- db 212,197,180,162,142,120,98,74,50,25 1499 00000CCA 19 1500 1501 00000CCB 58032803FA02D002A6- PeriodTable: dw 856,808,762,720,678,640,604,570,538,508,480,453 1501 00000CD4 0280025C023A021A02- 1501 00000CDD FC01E001C501 1502 00000CE3 AC0194017D01680153- dw 428,404,381,360,339,320,302,285,269,254,240,226 1502 00000CEC 0140012E011D010D01- 1502 00000CF5 FE00F000E200 1503 00000CFB D600CA00BE00B400AA- dw 214,202,190,180,170,160,151,143,135,127,120,113 1503 00000D04 00A00097008F008700- 1503 00000D0D 7F0078007100 1504 1505 ;============================================================================= 1506 ; PLAYER.ASM - DATA 1507 ;============================================================================= 1508 1509 00000D13 01 stmo: db 1 ; stereo (2) or mono (1) 1510 00000D14 08 bps: db 8 ; bits per sample (8 or 16) 1511 Sample_Rate: 1512 00000D15 2256 MixSpeed: dw 22050 ; Hz 1513 1514 ; 13/11/2016 1515 00000D17 303132333435363738- hex_chars: db "0123456789ABCDEF", 0 1515 00000D20 3941424344454600 1516 msgAC97Info: 1517 00000D28 0D0A db 0Dh, 0Ah 1518 00000D2A 414339372041756469- db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 1518 00000D33 6F20436F6E74726F6C- 1518 00000D3C 6C6572202620436F64- 1518 00000D45 656320496E666F0D0A 1519 00000D4E 56656E646F72204944- db "Vendor ID: " 1519 00000D57 3A20 1520 00000D59 303030306820446576- msgVendorId: db "0000h Device ID: " 1520 00000D62 6963652049443A20 1521 00000D6A 30303030680D0A msgDevId: db "0000h", 0Dh, 0Ah 1522 00000D71 4275733A20 db "Bus: " 1523 00000D76 303068204465766963- msgBusNo: db "00h Device: " 1523 00000D7F 653A20 1524 00000D82 3030682046756E6374- msgDevNo: db "00h Function: " 1524 00000D8B 696F6E3A20 1525 00000D90 303068 msgFncNo: db "00h" 1526 00000D93 0D0A db 0Dh, 0Ah 1527 00000D95 492F4F204261736520- db "I/O Base Address: " 1527 00000D9E 416464726573733A20 1528 00000DA7 303030306820495251- msgIOBaseAddr: db "0000h IRQ: " 1528 00000DB0 3A20 1529 00000DB2 3030 msgIRQ: dw 3030h 1530 00000DB4 0D0A00 db 0Dh, 0Ah, 0 1531 ;msgSampleRate: db "Sample Rate: " 1532 ;msgHertz: db "00000 Hz ", 0 1533 ;msg8Bits: db "8 bits ", 0 1534 ;msgMono: db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0 1535 ;msg16Bits: db "16 bits ", "$" 1536 ;msgStereo: db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0 1537 1538 ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc) 1539 ;codec_id: dd 0 1540 ;codec_chip_id: dd 0 1541 ;codec_vendor_ids: dw 0 1542 ;codec_chip_ids: dw 0 1543 1544 ;dword_str: dd 30303030h, 30303030h 1545 ; db 'h', 0Dh, 0Ah, 0 1546 1547 ;============================================================================= 1548 ; uninitialized data 1549 ;============================================================================= 1550 1551 bss_start: 1552 1553 ABSOLUTE bss_start 1554 1555 00000DB7 alignb 4 1556 1557 00000DB8 dev_vendor: resd 1 1558 00000DBC bus_dev_fn: resd 1 1559 00000DC0 stats_cmd: resd 1 1560 00000DC4 ac97_io_base: resw 1 1561 00000DC6 ac97_int_ln_reg: resb 1 1562 00000DC7 srb: resb 1 1563 1564 ; MODLOAD.ASM 1565 00000DC8 FileHandle: resd 1 1566 00000DCC Header: resb ModHeader.size 1567 1568 ; MODPLAY.ASM 1569 ;MixSpeed: resw 1 1570 1571 ModInfo: 1572 00001208 ModInfo.OrderLen: resb 1 1573 00001209 ModInfo.ReStart: resb 1 1574 0000120A ModInfo.Order: resb 128 1575 0000128A ModInfo.Patterns: resd 1 1576 1577 0000128E ModInfo.SampOfs: resw 31 1578 000012CC ModInfo.SampSeg: resw 31 1579 0000130A ModInfo.SampLen: resw 31 1580 00001348 ModInfo.SampRep: resw 31 1581 00001386 ModInfo.SampRepLen: resw 31 1582 000013C4 ModInfo.SampVol: resw 31 1583 1584 ; MODPLAY.ASM 1585 00001402 PitchTable: resw 857 1586 00001AB4 VolTable: resb 16640 1587 00005BB4 MixBuffer resb MixBufSize 1588 1589 ; MODPLAY.ASM 1590 00006BB4 OrderPos: resb 1 1591 00006BB5 Tempo: resb 1 1592 00006BB6 TempoWait: resb 1 1593 00006BB7 Bpm: resb 1 1594 00006BB8 Row: resb 1 1595 00006BB9 BreakRow: resb 1 1596 00006BBA BpmSamples: resw 1 1597 00006BBC BufPtr: resd 1 1598 00006BC0 BufLen: resw 1 1599 00006BC2 BufRep: resd 1 1600 00006BC6 Note: resd 1 1601 00006BCA Tracks: resb TrackInfo.size*NumTracks 1602 1603 00006C5A alignb 16 1604 1605 ; PLAY.ASM 1606 00006C60 Scope: resw 320 1607 00006EE0 RowOfs: resw 256 1608 1609 mod_file_name: 1610 000070E0 resb 80 1611 1612 00007130 alignb 4096 1613 1614 Audio_Buffer: 1615 00008000 resb 32768 1616 1617 g_buff: 1618 00010000 resb 320 1619 00010140 resb 192 1620 1621 00010200 alignb 65536 1622 1623 file_buffer: 1624 00020000 resb 65536*7 1625 EOF: