     1                                  ; ****************************************************************************
     2                                  ; playmod6.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PLAYMOD6.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 05/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 15/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 'tinyply4.s' ('TINYPLY4.PRG') 
    14                                  ; by Erdogan Tan (06/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                                  ; 16 bits, stereo conversion code: 'modplay3.s' (13/10/2017)
    30                                  
    31                                  ; 01/03/2017
    32                                  ; 16/10/2016
    33                                  ; 29/04/2016
    34                                  ; TRDOS 386 system calls (temporary list!)
    35                                  _ver 	equ 0
    36                                  _exit 	equ 1
    37                                  _fork 	equ 2
    38                                  _read 	equ 3
    39                                  _write	equ 4
    40                                  _open	equ 5
    41                                  _close 	equ 6
    42                                  _wait 	equ 7
    43                                  _creat 	equ 8
    44                                  _link 	equ 9
    45                                  _unlink	equ 10
    46                                  _exec	equ 11
    47                                  _chdir	equ 12
    48                                  _time 	equ 13
    49                                  _mkdir 	equ 14
    50                                  _chmod	equ 15
    51                                  _chown	equ 16
    52                                  _break	equ 17
    53                                  _stat	equ 18
    54                                  _seek	equ 19
    55                                  _tell 	equ 20
    56                                  _mount	equ 21
    57                                  _umount	equ 22
    58                                  _setuid	equ 23
    59                                  _getuid	equ 24
    60                                  _stime	equ 25
    61                                  _quit	equ 26	
    62                                  _intr	equ 27
    63                                  _fstat	equ 28
    64                                  _emt 	equ 29
    65                                  _mdate 	equ 30
    66                                  _video 	equ 31
    67                                  _audio	equ 32
    68                                  _timer	equ 33
    69                                  _sleep	equ 34
    70                                  _msg    equ 35
    71                                  _geterr	equ 36
    72                                  _fpsave	equ 37
    73                                  _pri	equ 38
    74                                  _rele	equ 39
    75                                  _fff	equ 40
    76                                  _fnf	equ 41
    77                                  _alloc	equ 42
    78                                  _dalloc equ 43
    79                                  _calbac equ 44		
    80                                  
    81                                  %macro sys 1-4
    82                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    83                                      ; 03/09/2015	
    84                                      ; 13/04/2015
    85                                      ; Retro UNIX 386 v1 system call.	
    86                                      %if %0 >= 2   
    87                                          mov ebx, %2
    88                                          %if %0 >= 3    
    89                                              mov ecx, %3
    90                                              %if %0 = 4
    91                                                 mov edx, %4   
    92                                              %endif
    93                                          %endif
    94                                      %endif
    95                                      mov eax, %1
    96                                      ;int 30h
    97                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    98                                  %endmacro
    99                                  
   100                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   101                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   102                                  
   103                                  ;; 19/06/2017
   104                                  ;BUFFERSIZE equ 2*32768 ; 25/06/2017
   105                                  BUFFERSIZE equ 32768 ; 09/10/2017
   106                                  
   107                                  ; ----------------------------------------------------------------------------
   108                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   109                                  ;	July 14th, 1993.
   110                                  
   111                                  ;=============================================================================
   112                                  ;  
   113                                  ;=============================================================================
   114                                  
   115                                  [BITS 32]
   116                                  [org 0]
   117                                  
   118                                  Start:
   119                                  	; clear bss
   120 00000000 B9[00000900]            	mov	ecx, EOF
   121 00000005 BF[43100000]            	mov	edi, bss_start
   122 0000000A 29F9                    	sub	ecx, edi
   123 0000000C D1E9                    	shr	ecx, 1
   124 0000000E 31C0                    	xor	eax, eax
   125 00000010 F366AB                  	rep	stosw
   126                                  
   127                                  	; Detect (& Enable) VT8233 Audio Device
   128 00000013 E856020000              	call    DetectVT8233
   129 00000018 731B                    	jnc     short GetFileName
   130                                  
   131                                  _dev_not_ready:
   132                                  ; couldn't find the audio device!
   133                                  	sys	_msg, noDevMsg, 255, 0Fh
   133                              <1> 
   133                              <1> 
   133                              <1> 
   133                              <1> 
   133                              <1>  %if %0 >= 2
   133 0000001A BB[7B020000]        <1>  mov ebx, %2
   133                              <1>  %if %0 >= 3
   133 0000001F B9FF000000          <1>  mov ecx, %3
   133                              <1>  %if %0 = 4
   133 00000024 BA0F000000          <1>  mov edx, %4
   133                              <1>  %endif
   133                              <1>  %endif
   133                              <1>  %endif
   133 00000029 B823000000          <1>  mov eax, %1
   133                              <1> 
   133 0000002E CD40                <1>  int 40h
   134 00000030 E918020000                      jmp     Exit
   135                                  
   136                                  GetFileName:  
   137 00000035 89E6                    	mov	esi, esp
   138 00000037 AD                      	lodsd
   139 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   140                                  		; (program file name & mod file name)
   141 0000003B 0F8215020000            	jb	pmsg_usage ; nothing to do
   142                                  
   143 00000041 AD                      	lodsd ; program file name address 
   144 00000042 AD                      	lodsd ; mod file name address (file to be read)
   145 00000043 89C6                    	mov	esi, eax
   146 00000045 BF[A2830000]            	mov	edi, mod_file_name
   147                                  ScanName:       
   148 0000004A AC                      	lodsb
   149 0000004B 84C0                    	test	al, al
   150 0000004D 0F8403020000            	je	pmsg_usage
   151 00000053 3C20                    	cmp	al, 20h
   152 00000055 74F3                    	je	short ScanName	; scan start of name.
   153 00000057 AA                      	stosb
   154 00000058 B4FF                    	mov	ah, 0FFh
   155                                  a_0:	
   156 0000005A FEC4                    	inc	ah
   157                                  a_1:
   158 0000005C AC                      	lodsb
   159 0000005D AA                      	stosb
   160 0000005E 3C2E                    	cmp	al, '.'
   161 00000060 74F8                    	je	short a_0	
   162 00000062 20C0                    	and	al, al
   163 00000064 75F6                    	jnz	short a_1
   164                                  
   165 00000066 08E4                    	or	ah, ah		; if period NOT found,
   166 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   167                                  SetExt:
   168 0000006A 4F                      	dec	edi
   169 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   170 00000071 C6470400                	mov	byte [edi+4], 0
   171                                  PrintMesg:      
   172                                  	; Prints the Credits Text.
   173                                  	sys	_msg, Credits, 255, 0Fh
   173                              <1> 
   173                              <1> 
   173                              <1> 
   173                              <1> 
   173                              <1>  %if %0 >= 2
   173 00000075 BB[B50F0000]        <1>  mov ebx, %2
   173                              <1>  %if %0 >= 3
   173 0000007A B9FF000000          <1>  mov ecx, %3
   173                              <1>  %if %0 = 4
   173 0000007F BA0F000000          <1>  mov edx, %4
   173                              <1>  %endif
   173                              <1>  %endif
   173                              <1>  %endif
   173 00000084 B823000000          <1>  mov eax, %1
   173                              <1> 
   173 00000089 CD40                <1>  int 40h
   174                                  _1:
   175                                  	; 19/06/2017
   176                                  	; Allocate Audio Buffer (for user)
   177                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   177                              <1> 
   177                              <1> 
   177                              <1> 
   177                              <1> 
   177                              <1>  %if %0 >= 2
   177 0000008B BB00020000          <1>  mov ebx, %2
   177                              <1>  %if %0 >= 3
   177 00000090 B900800000          <1>  mov ecx, %3
   177                              <1>  %if %0 = 4
   177 00000095 BA[00900000]        <1>  mov edx, %4
   177                              <1>  %endif
   177                              <1>  %endif
   177                              <1>  %endif
   177 0000009A B820000000          <1>  mov eax, %1
   177                              <1> 
   177 0000009F CD40                <1>  int 40h
   178 000000A1 0F8211010000            	jc	error_exit
   179                                  _2:
   180                                  	; Initialize Audio Device (bl = 1 -> Interrupt method)
   181                                  	sys	_audio, 0301h, 0, ac97_int_handler ; 09/10/2017
   181                              <1> 
   181                              <1> 
   181                              <1> 
   181                              <1> 
   181                              <1>  %if %0 >= 2
   181 000000A7 BB01030000          <1>  mov ebx, %2
   181                              <1>  %if %0 >= 3
   181 000000AC B900000000          <1>  mov ecx, %3
   181                              <1>  %if %0 = 4
   181 000000B1 BA[B2020000]        <1>  mov edx, %4
   181                              <1>  %endif
   181                              <1>  %endif
   181                              <1>  %endif
   181 000000B6 B820000000          <1>  mov eax, %1
   181                              <1> 
   181 000000BB CD40                <1>  int 40h
   182 000000BD 0F82F5000000            	jc	error_exit
   183                                  	
   184                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   185                                  	;sys	_audio, 0300h, 1, srb  ; 09/10/2017 
   186                                  	;jc	error_exit
   187                                  
   188                                  LoadMod:  
   189 000000C3 BF[A2830000]            	mov	edi, mod_file_name
   190 000000C8 E849030000              	call    LoadModule		; Load the MODule...
   191                                  	; 08/10/2017
   192 000000CD 731B                    	jnc	short _3		; any error loading?
   193                                  		
   194                                  	; yes, print error and Exit.
   195                                  
   196                                  	sys	_msg, ErrorMesg, 255, 0Fh
   196                              <1> 
   196                              <1> 
   196                              <1> 
   196                              <1> 
   196                              <1>  %if %0 >= 2
   196 000000CF BB[E90F0000]        <1>  mov ebx, %2
   196                              <1>  %if %0 >= 3
   196 000000D4 B9FF000000          <1>  mov ecx, %3
   196                              <1>  %if %0 = 4
   196 000000D9 BA0F000000          <1>  mov edx, %4
   196                              <1>  %endif
   196                              <1>  %endif
   196                              <1>  %endif
   196 000000DE B823000000          <1>  mov eax, %1
   196                              <1> 
   196 000000E3 CD40                <1>  int 40h
   197                                  
   198 000000E5 E963010000              	jmp     Exit
   199                                  
   200                                  _3:
   201                                  	; 10/06/2017
   202                                  	sys	_audio, 0E00h ; get audio controller info
   202                              <1> 
   202                              <1> 
   202                              <1> 
   202                              <1> 
   202                              <1>  %if %0 >= 2
   202 000000EA BB000E0000          <1>  mov ebx, %2
   202                              <1>  %if %0 >= 3
   202                              <1>  mov ecx, %3
   202                              <1>  %if %0 = 4
   202                              <1>  mov edx, %4
   202                              <1>  %endif
   202                              <1>  %endif
   202                              <1>  %endif
   202 000000EF B820000000          <1>  mov eax, %1
   202                              <1> 
   202 000000F4 CD40                <1>  int 40h
   203 000000F6 0F82BC000000            	jc	error_exit
   204                                  
   205                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   206                                  	;jne	_dev_not_ready	
   207                                  
   208                                  	; EAX = IRQ Number in AL
   209                                  	;	Audio Device Number in AH 
   210                                  	; EBX = DEV/VENDOR ID
   211                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   212                                  	; ECX = BUS/DEV/FN 
   213                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   214                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   215                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   216                                  	;      (Low word, DX = NAMBAR address)
   217                                  
   218 000000FC A2[5E100000]            	mov	[ac97_int_ln_reg], al
   219 00000101 891D[50100000]          	mov	[dev_vendor], ebx
   220 00000107 890D[54100000]          	mov	[bus_dev_fn], ecx
   221 0000010D 668915[5C100000]        	mov	[ac97_io_base], dx
   222                                    
   223 00000114 E8C30A0000              	call	write_audio_dev_info 
   224                                  
   225                                  PlayNow: 
   226 00000119 E8DE090000              	call    StartPlaying
   227                                  
   228                                  	; 14/10/2017
   229                                  
   230                                          ; load 32768 bytes into audio buffer
   231                                  	;mov	edi, Audio_Buffer
   232                                  	;mov	ebx, BUFFERSIZE
   233                                  	; 24/06/2017
   234                                          ; load 8192 bytes into audio buffer
   235 0000011E BF[00100100]            	mov	edi, temp_buffer
   236 00000123 BB00200000              	mov	ebx, BUFFERSIZE / 4
   237 00000128 E850090000              	call	GetSamples
   238 0000012D 0F8285000000            	jc	error_exit
   239                                  
   240                                  	; 24/06/2017
   241                                  	; 8 bit to 16 bit (*2)
   242                                  	; mono to stereo (*2)
   243                                  	; 4* (BUFFERSIZE/4) 
   244                                  	; source = temp_buffer
   245                                  	; destination = Audio_Buffer
   246 00000133 E8BA020000              	call 	ConvertSamples
   247                                  
   248                                  	; 09/10/2017 (2*BUFFERSIZE, 64K)
   249                                  	; 23/06/2017 (2*65536, 128K)
   250                                  	; Map DMA buffer to user's memory space
   251                                  	sys	_audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer
   251                              <1> 
   251                              <1> 
   251                              <1> 
   251                              <1> 
   251                              <1>  %if %0 >= 2
   251 00000138 BB000D0000          <1>  mov ebx, %2
   251                              <1>  %if %0 >= 3
   251 0000013D B900000100          <1>  mov ecx, %3
   251                              <1>  %if %0 = 4
   251 00000142 BA[00000200]        <1>  mov edx, %4
   251                              <1>  %endif
   251                              <1>  %endif
   251                              <1>  %endif
   251 00000147 B820000000          <1>  mov eax, %1
   251                              <1> 
   251 0000014C CD40                <1>  int 40h
   252                                  	;jc	error_exit
   253                                  
   254                                  	; Set Master Volume Level
   255                                  	sys	_audio, 0B00h, 1D1Dh
   255                              <1> 
   255                              <1> 
   255                              <1> 
   255                              <1> 
   255                              <1>  %if %0 >= 2
   255 0000014E BB000B0000          <1>  mov ebx, %2
   255                              <1>  %if %0 >= 3
   255 00000153 B91D1D0000          <1>  mov ecx, %3
   255                              <1>  %if %0 = 4
   255                              <1>  mov edx, %4
   255                              <1>  %endif
   255                              <1>  %endif
   255                              <1>  %endif
   255 00000158 B820000000          <1>  mov eax, %1
   255                              <1> 
   255 0000015D CD40                <1>  int 40h
   256                                  
   257                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   258                                  
   259                                  	; 07/10/2017
   260                                  	;mov	word [MixSpeed], 22222	; Mixing at 22 kHz
   261                                  	
   262                                  	; Start	to play
   263 0000015F A0[AB0E0000]            	mov	al, [bps]
   264 00000164 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   265 00000167 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   266 00000169 8A1D[AA0E0000]          	mov	bl, [stmo]
   267 0000016F FECB                    	dec	bl
   268 00000171 08C3                    	or	bl, al
   269 00000173 668B0D[AC0E0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   270 0000017A B704                    	mov	bh, 4 ; start to play	
   271                                  	sys	_audio
   271                              <1> 
   271                              <1> 
   271                              <1> 
   271                              <1> 
   271                              <1>  %if %0 >= 2
   271                              <1>  mov ebx, %2
   271                              <1>  %if %0 >= 3
   271                              <1>  mov ecx, %3
   271                              <1>  %if %0 = 4
   271                              <1>  mov edx, %4
   271                              <1>  %endif
   271                              <1>  %endif
   271                              <1>  %endif
   271 0000017C B820000000          <1>  mov eax, %1
   271                              <1> 
   271 00000181 CD40                <1>  int 40h
   272                                  
   273                                  	; 14/10/2017
   274                                          ; load 8192 bytes into audio buffer
   275 00000183 BF[00100100]                    mov	edi, temp_buffer
   276 00000188 BB00200000              	mov	ebx, BUFFERSIZE / 4
   277 0000018D E8EB080000              	call	GetSamples
   278 00000192 7224                    	jc	error_exit
   279                                  
   280                                  	; 8 bit to 16 bit (*2)
   281                                  	; mono to stereo (*2)
   282                                  	; 4* (BUFFERSIZE/4) 
   283                                  	; source = temp_buffer
   284                                  	; destination = Audio_Buffer
   285 00000194 E859020000              	call 	ConvertSamples
   286                                  
   287                                  	; bh = 16 : update (current) dma half buffer
   288                                  	; bl = 0  : then switch to the next half buffer
   289                                  	;sys	_audio, 1000h
   290                                  	; 14/10/2017
   291                                  	sys	_audio, 1002h ; update dma half buffer 2
   291                              <1> 
   291                              <1> 
   291                              <1> 
   291                              <1> 
   291                              <1>  %if %0 >= 2
   291 00000199 BB02100000          <1>  mov ebx, %2
   291                              <1>  %if %0 >= 3
   291                              <1>  mov ecx, %3
   291                              <1>  %if %0 = 4
   291                              <1>  mov edx, %4
   291                              <1>  %endif
   291                              <1>  %endif
   291                              <1>  %endif
   291 0000019E B820000000          <1>  mov eax, %1
   291                              <1> 
   291 000001A3 CD40                <1>  int 40h
   292                                  
   293                                  	;mov	byte [srb], 0  ; 14/10/2017
   294                                  	    
   295                                  	;; SETUP SIGNAL RESPONSE BYTE
   296                                  	;; 06/03/2017
   297                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   298                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   299                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   300                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   301                                  	;sys	_calbac
   302                                  	;jc	short error_exit
   303                                  
   304                                  	; 06/10/2017
   305                                  
   306                                  	; DIRECT CGA MEMORY ACCESS
   307                                  	; bl = 0, bh = 4
   308                                  	; Direct access/map to CGA memory (0B8000h)
   309                                  
   310                                  	sys	_video, 0400h
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1>  %if %0 >= 2
   310 000001A5 BB00040000          <1>  mov ebx, %2
   310                              <1>  %if %0 >= 3
   310                              <1>  mov ecx, %3
   310                              <1>  %if %0 = 4
   310                              <1>  mov edx, %4
   310                              <1>  %endif
   310                              <1>  %endif
   310                              <1>  %endif
   310 000001AA B81F000000          <1>  mov eax, %1
   310                              <1> 
   310 000001AF CD40                <1>  int 40h
   311 000001B1 3D00800B00              	cmp	eax, 0B8000h
   312 000001B6 7418                    	je	short _a3
   313                                  error_exit:
   314                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   314                              <1> 
   314                              <1> 
   314                              <1> 
   314                              <1> 
   314                              <1>  %if %0 >= 2
   314 000001B8 BB[06100000]        <1>  mov ebx, %2
   314                              <1>  %if %0 >= 3
   314 000001BD B9FF000000          <1>  mov ecx, %3
   314                              <1>  %if %0 = 4
   314 000001C2 BA0E000000          <1>  mov edx, %4
   314                              <1>  %endif
   314                              <1>  %endif
   314                              <1>  %endif
   314 000001C7 B823000000          <1>  mov eax, %1
   314                              <1> 
   314 000001CC CD40                <1>  int 40h
   315 000001CE EB7D                    	jmp	short Exit
   316                                  
   317                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   318                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   319                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   320                                  ;       second, or the module will sound "looped".
   321                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   322                                  ;       the polling is called from my routine, and then the irq 0 must be
   323                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   324                                  ;       samples played by the Sound Blaster. Note that some samples are
   325                                  ;       discarded in the next code, just for fun!
   326                                  
   327                                  _a3:
   328                                  	; 02/10/2017
   329                                  	; Print "Playing..." message.
   330                                  	sys	_msg, PlayMsg, 255, 0Fh
   330                              <1> 
   330                              <1> 
   330                              <1> 
   330                              <1> 
   330                              <1>  %if %0 >= 2
   330 000001D0 BB[26100000]        <1>  mov ebx, %2
   330                              <1>  %if %0 >= 3
   330 000001D5 B9FF000000          <1>  mov ecx, %3
   330                              <1>  %if %0 = 4
   330 000001DA BA0F000000          <1>  mov edx, %4
   330                              <1>  %endif
   330                              <1>  %endif
   330                              <1>  %endif
   330 000001DF B823000000          <1>  mov eax, %1
   330                              <1> 
   330 000001E4 CD40                <1>  int 40h
   331                                  	; Get current cursor position
   332 000001E6 B403                    	mov	ah, 3
   333 000001E8 B700                    	mov	bh, 0 ; Video Page 0
   334 000001EA CD31                    	int	31h
   335                                  	; dh = row, dl = column
   336                                  	; 06/10/2017 (scroll check on next line)
   337 000001EC 80FE18                  	cmp	dh, 24 ; the last row
   338 000001EF 7202                    	jb	short set_bar_pos
   339 000001F1 FECE                    	dec	dh
   340                                  set_bar_pos:
   341 000001F3 B050                    	mov	al, 80
   342 000001F5 F6E6                    	mul	dh
   343 000001F7 30F6                    	xor	dh, dh
   344 000001F9 6601D0                  	add	ax, dx
   345 000001FC 66D1E0                  	shl	ax, 1
   346 000001FF BB00800B00              	mov	ebx, 0B8000h
   347 00000204 6601C3                  	add	bx, ax
   348 00000207 891D[44100000]          	mov	[bar_start], ebx
   349 0000020D 6683C320                	add	bx, 2*16
   350 00000211 891D[48100000]          	mov	[bar_stop], ebx
   351                                  
   352                                  	; Print (GoTo) NextLine.
   353                                  	sys	_msg, NextLine, 3, 07h
   353                              <1> 
   353                              <1> 
   353                              <1> 
   353                              <1> 
   353                              <1>  %if %0 >= 2
   353 00000217 BB[3D100000]        <1>  mov ebx, %2
   353                              <1>  %if %0 >= 3
   353 0000021C B903000000          <1>  mov ecx, %3
   353                              <1>  %if %0 = 4
   353 00000221 BA07000000          <1>  mov edx, %4
   353                              <1>  %endif
   353                              <1>  %endif
   353                              <1>  %endif
   353 00000226 B823000000          <1>  mov eax, %1
   353                              <1> 
   353 0000022B CD40                <1>  int 40h
   354                                  	;
   355                                  
   356 0000022D E8AF000000              	call	ModPlay ; 13/02/2017
   357                                  
   358                                  _s_exit:
   359 00000232 E874090000              	call	StopPlaying	; STOP!
   360                                  
   361                                  	; 02/10/2017
   362                                  	; Print "OK." message.
   363                                  	sys	_msg, OkMsg, 255, 0Fh
   363                              <1> 
   363                              <1> 
   363                              <1> 
   363                              <1> 
   363                              <1>  %if %0 >= 2
   363 00000237 BB[3A100000]        <1>  mov ebx, %2
   363                              <1>  %if %0 >= 3
   363 0000023C B9FF000000          <1>  mov ecx, %3
   363                              <1>  %if %0 = 4
   363 00000241 BA0F000000          <1>  mov edx, %4
   363                              <1>  %endif
   363                              <1>  %endif
   363                              <1>  %endif
   363 00000246 B823000000          <1>  mov eax, %1
   363                              <1> 
   363 0000024B CD40                <1>  int 40h
   364                                  Exit:           
   365                                  	;call    FreeModule	; Free MODule core.
   366                                  	
   367                                  	sys 	_exit	; Bye !
   367                              <1> 
   367                              <1> 
   367                              <1> 
   367                              <1> 
   367                              <1>  %if %0 >= 2
   367                              <1>  mov ebx, %2
   367                              <1>  %if %0 >= 3
   367                              <1>  mov ecx, %3
   367                              <1>  %if %0 = 4
   367                              <1>  mov edx, %4
   367                              <1>  %endif
   367                              <1>  %endif
   367                              <1>  %endif
   367 0000024D B801000000          <1>  mov eax, %1
   367                              <1> 
   367 00000252 CD40                <1>  int 40h
   368                                  here:
   369 00000254 EBFE                    	jmp	short here
   370                                  
   371                                  pmsg_usage:
   372                                  	sys	_msg, msg_usage, 255, 0Fh
   372                              <1> 
   372                              <1> 
   372                              <1> 
   372                              <1> 
   372                              <1>  %if %0 >= 2
   372 00000256 BB[4E0F0000]        <1>  mov ebx, %2
   372                              <1>  %if %0 >= 3
   372 0000025B B9FF000000          <1>  mov ecx, %3
   372                              <1>  %if %0 = 4
   372 00000260 BA0F000000          <1>  mov edx, %4
   372                              <1>  %endif
   372                              <1>  %endif
   372                              <1>  %endif
   372 00000265 B823000000          <1>  mov eax, %1
   372                              <1> 
   372 0000026A CD40                <1>  int 40h
   373 0000026C EBDF                    	jmp	short Exit
   374                                  
   375                                  DetectVT8233:
   376                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   377                                          sys	_audio, 0103h
   377                              <1> 
   377                              <1> 
   377                              <1> 
   377                              <1> 
   377                              <1>  %if %0 >= 2
   377 0000026E BB03010000          <1>  mov ebx, %2
   377                              <1>  %if %0 >= 3
   377                              <1>  mov ecx, %3
   377                              <1>  %if %0 = 4
   377                              <1>  mov edx, %4
   377                              <1>  %endif
   377                              <1>  %endif
   377                              <1>  %endif
   377 00000273 B820000000          <1>  mov eax, %1
   377                              <1> 
   377 00000278 CD40                <1>  int 40h
   378 0000027A C3                      	retn
   379                                  
   380                                  noDevMsg:
   381 0000027B 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   381 00000284 61626C6520746F2066-
   381 0000028D 696E64205649412056-
   381 00000296 543832333320626173-
   381 0000029F 656420617564696F20-
   381 000002A8 646576696365210D0A-
   381 000002B1 00                 
   382                                  
   383                                  ac97_int_handler: ; 14/10/2017
   384                                  	; 09/10/2017
   385                                  	
   386                                  	; 19/06/2017
   387 000002B2 C605[5F100000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   388                                  
   389                                  	; 14/10/2017
   390                                          ; load 8192 bytes into audio buffer
   391 000002B9 BF[00100100]                    mov	edi, temp_buffer
   392 000002BE BB00200000              	mov	ebx, BUFFERSIZE / 4
   393 000002C3 E8B5070000              	call	GetSamples
   394 000002C8 0F82EAFEFFFF            	jc	error_exit
   395                                  
   396                                  	; 8 bit to 16 bit (*2)
   397                                  	; mono to stereo (*2)
   398                                  	; 4* (BUFFERSIZE/4) 
   399                                  	; source = temp_buffer
   400                                  	; destination = Audio_Buffer
   401 000002CE E81F010000              	call 	ConvertSamples
   402                                  
   403                                  	sys	_rele ; return from callback service 
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1>  %if %0 >= 2
   403                              <1>  mov ebx, %2
   403                              <1>  %if %0 >= 3
   403                              <1>  mov ecx, %3
   403                              <1>  %if %0 = 4
   403                              <1>  mov edx, %4
   403                              <1>  %endif
   403                              <1>  %endif
   403                              <1>  %endif
   403 000002D3 B827000000          <1>  mov eax, %1
   403                              <1> 
   403 000002D8 CD40                <1>  int 40h
   404                                  	; we must not come here !
   405                                  	sys	_exit
   405                              <1> 
   405                              <1> 
   405                              <1> 
   405                              <1> 
   405                              <1>  %if %0 >= 2
   405                              <1>  mov ebx, %2
   405                              <1>  %if %0 >= 3
   405                              <1>  mov ecx, %3
   405                              <1>  %if %0 = 4
   405                              <1>  mov edx, %4
   405                              <1>  %endif
   405                              <1>  %endif
   405                              <1>  %endif
   405 000002DA B801000000          <1>  mov eax, %1
   405                              <1> 
   405 000002DF CD40                <1>  int 40h
   406                                  
   407                                  ;=============================================================================
   408                                  ;      
   409                                  ;=============================================================================
   410                                  
   411                                  ModPlay:
   412                                  	; 14/10/2017
   413                                  	; 13/10/2017
   414                                  	; 06/10/2017, 09/10/2017
   415                                  	; 19/06/2017, 21/06/2017, 23/06/2017
   416                                  
   417                                  	; 05/03/2017 (TRDOS 386)
   418                                  	; 28/11/2016, 08/12/2016, 13/02/2017, 14/02/2017
   419                                  
   420 000002E1 66C70500800B00314E      mov word [0B8000h], 4E31h
   421                                  
   422                                  p_loop:
   423 000002EA 803D[5F100000]00        	cmp	byte [srb], 0
   424 000002F1 7624                    	jna	short q_loop
   425 000002F3 C605[5F100000]00        	mov	byte [srb], 0
   426                                  
   427 000002FA 803D00800B0031          cmp byte [0B8000h], 31h
   428 00000301 750B                    jne short _cv1
   429 00000303 66C70500800B00324E      mov word [0B8000h], 4E32h
   430                                  ;jmp short modp_gs
   431 0000030C EB09                    jmp	short q_loop
   432                                  
   433                                  _cv1:
   434 0000030E 66C70500800B00314E      mov word [0B8000h], 4E31h
   435                                  
   436                                  ;modp_gs:
   437                                  ;	; 14/10/2017
   438                                  ;	; load 8192 bytes into audio buffer
   439                                  ;	mov	edi, temp_buffer
   440                                  ;	mov	ebx, BUFFERSIZE / 4
   441                                  ;	call	GetSamples
   442                                  ;	jc	error_exit
   443                                  ;
   444                                  ;	; 8 bit to 16 bit (*2)
   445                                  ;	; mono to stereo (*2)
   446                                  ;	; 4* (BUFFERSIZE/4) 
   447                                  ;	; source = temp_buffer
   448                                  ;	; destination = Audio_Buffer
   449                                  ;	call 	ConvertSamples
   450                                  q_loop:
   451 00000317 B401                    	mov     ah, 1		; any key pressed?
   452 00000319 CD32                    	int     32h		; no, Loop.
   453 0000031B 743F                    	jz	short r_loop
   454                                  
   455 0000031D B400                    	mov     ah, 0		; flush key buffer...
   456 0000031F CD32                    	int     32h
   457                                  
   458                                  	; 09/10/2017
   459 00000321 3C2B                    	cmp	al, '+' ; increase sound volume
   460 00000323 7405                    	je	short inc_volume_level
   461 00000325 3C2D                    	cmp	al, '-'
   462 00000327 7424                    	je	short dec_volume_level
   463                                  q_return:
   464 00000329 C3                      	retn
   465                                  
   466                                  	; 09/10/2017 (playmod5.s)
   467                                  	; 24/06/2017 (wavplay2.s)
   468                                  inc_volume_level:
   469 0000032A 8A0D[F2830000]          	mov	cl, [volume_level]
   470 00000330 80F91F                  	cmp	cl, 1Fh ; 31
   471 00000333 73E2                    	jnb	short q_loop
   472 00000335 FEC1                    	inc	cl
   473                                  change_volume_level:
   474 00000337 880D[F2830000]          	mov	[volume_level], cl
   475 0000033D 88CD                    	mov	ch, cl
   476                                  	; Set Master Volume Level
   477                                  	sys	_audio, 0B00h
   477                              <1> 
   477                              <1> 
   477                              <1> 
   477                              <1> 
   477                              <1>  %if %0 >= 2
   477 0000033F BB000B0000          <1>  mov ebx, %2
   477                              <1>  %if %0 >= 3
   477                              <1>  mov ecx, %3
   477                              <1>  %if %0 = 4
   477                              <1>  mov edx, %4
   477                              <1>  %endif
   477                              <1>  %endif
   477                              <1>  %endif
   477 00000344 B820000000          <1>  mov eax, %1
   477                              <1> 
   477 00000349 CD40                <1>  int 40h
   478 0000034B EBCA                    	jmp	short q_loop
   479                                  dec_volume_level:
   480 0000034D 8A0D[F2830000]          	mov	cl, [volume_level]
   481 00000353 80F901                  	cmp	cl, 1 ; 1
   482 00000356 76BF                    	jna	short q_loop
   483 00000358 FEC9                    	dec	cl
   484 0000035A EBDB                    	jmp	short change_volume_level
   485                                  
   486                                  r_loop:
   487                                  	; 08/10/2017
   488 0000035C 66FF05[F0030000]        	inc	word [counter]
   489 00000363 7585                    	jnz	p_loop ; 09/10/2017  ; SHORT olacak !!!
   490                                  BarLoop:
   491 00000365 EB4D                    jmp short check_volume
   492                                  	; Get Current DMA buffer Pointer 
   493                                  	; 23/06/2017
   494                                  	; bh = 15, get current pointer (DMA buffer offset)
   495                                  	; bl = 0, for PCM OUT
   496                                  	; ecx = 0
   497                                  	;
   498                                  	sys	_audio, 0F00h, 0
   498                              <1> 
   498                              <1> 
   498                              <1> 
   498                              <1> 
   498                              <1>  %if %0 >= 2
   498 00000367 BB000F0000          <1>  mov ebx, %2
   498                              <1>  %if %0 >= 3
   498 0000036C B900000000          <1>  mov ecx, %3
   498                              <1>  %if %0 = 4
   498                              <1>  mov edx, %4
   498                              <1>  %endif
   498                              <1>  %endif
   498                              <1>  %endif
   498 00000371 B820000000          <1>  mov eax, %1
   498                              <1> 
   498 00000376 CD40                <1>  int 40h
   499                                  
   500                                  
   501                                  	; 06/10/2017
   502 00000378 BE[00000200]            	mov	esi, DMA_Buffer
   503 0000037D 01C6                    	add     esi, eax	; add offset value
   504                                      
   505                                  	; 02/10/2017 
   506 0000037F 8B0D[48100000]          	mov     ecx, [bar_stop]	; get previous bar stop address
   507 00000385 8B3D[44100000]          	mov	edi, [bar_start]
   508                                  	; 06/10/2017
   509 0000038B 66B80007                	mov	ax, 0700h ; Blank
   510 0000038F 668907                  	mov	[edi], ax
   511 00000392 29F9                    	sub	ecx, edi
   512 00000394 761E                    	jna	short check_volume
   513 00000396 89FA                    	mov	edx, edi
   514 00000398 D0E9                    	shr	cl, 1
   515 0000039A F366AB                  	rep	stosw
   516 0000039D 89D7                    	mov	edi, edx
   517 0000039F 8B15[4C100000]          	mov	edx, [prev_max]
   518 000003A5 09D2                    	or	edx, edx
   519 000003A7 740B                    	jz	short check_volume
   520 000003A9 39FA                    	cmp	edx, edi
   521 000003AB 7607                    	jna	short check_volume
   522 000003AD B0DB                    	mov	al, 0DBh ; 219 ; Block
   523 000003AF B40C                    	mov	ah, 0Ch ; Light Red
   524 000003B1 668902                  	mov	[edx], ax
   525                                  check_volume:
   526                                  	; 06/10/2017
   527 000003B4 8A06                    	mov	al, [esi]
   528 000003B6 C0E804                  	shr	al, 4 ; al = 0 to 15
   529 000003B9 742A                    	jz	short update_bar_stop
   530 000003BB 88C1                    	mov	cl, al
   531                                  draw_bar:
   532 000003BD B0DB                    	mov	al, 0DBh ; 219 ; Block
   533 000003BF B40A                    	mov	ah, 0Ah ; Light Green
   534 000003C1 F366AB                  	rep	stosw
   535 000003C4 89FA                    	mov	edx, edi
   536 000003C6 4A                      	dec	edx
   537 000003C7 4A                      	dec	edx	
   538 000003C8 3B15[4C100000]          	cmp	edx, [prev_max]
   539 000003CE 7508                    	jne	short new_max_volume
   540 000003D0 890D[4C100000]          	mov	[prev_max], ecx ; 0 ; *
   541                                  	;jmp	short blank_prev_max
   542 000003D6 EB0D                    	jmp	short update_bar_stop
   543                                  new_max_volume:	 
   544 000003D8 B40C                    	mov	ah, 0Ch ; Light Red
   545 000003DA 668902                  	mov	[edx], ax
   546 000003DD 8715[4C100000]          	xchg	[prev_max], edx
   547                                  	;cmp	edx, [prev_max] ; ** not necessary ?!
   548                                  	;ja	short update_bar_stop ; **  not necessary ?!
   549                                  blank_prev_max:
   550 000003E3 890A                    	mov	[edx], ecx ; 0 ; *
   551                                  update_bar_stop:
   552 000003E5 893D[48100000]          	mov	[bar_stop], edi
   553                                  	;
   554 000003EB E9FAFEFFFF              	jmp	p_loop
   555                                  
   556                                  counter: ; 08/10/2017
   557 000003F0 FFFF                    	dw 	65535 ; 09/10/2017
   558                                  
   559                                  ; 15/10/2017 
   560                                  ; 14/10/2017
   561                                  ; 24/06/2017 ('modplay3.s')
   562                                  ;--------------------------------------------------------------------------
   563                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
   564                                  ;--------------------------------------------------------------------------
   565                                  ; This Conversion is needed for AC'97 hardware 
   566                                  ; which ony supports 16 bit stereo samples !
   567                                  
   568                                  ; source = temp_buffer (8192 bytes)
   569                                  ; destination = Audio_Buffer (32768 bytes)
   570                                  
   571                                  ConvertSamples:
   572                                  	; 24/06/2017
   573 000003F2 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
   574 000003F7 BE[00100100]            	mov	esi, temp_buffer
   575 000003FC BF[00900000]            	mov	edi, Audio_Buffer
   576                                  c_smpl_1:
   577 00000401 AC                      	lodsb	; get 8 bit mono sample
   578                                  	; 15/10/2017
   579                                  	;sub	al, 80h
   580                                  	;shl	ax, 8
   581 00000402 88C4                    	mov	ah, al
   582 00000404 80EC80                  	sub	ah, 80h
   583 00000407 30C0                    	xor	al, al
   584                                  	;
   585 00000409 6689C2                  	mov	dx, ax
   586 0000040C C1E010                  	shl	eax, 16
   587 0000040F 6689D0                  	mov	ax, dx
   588 00000412 AB                      	stosd	; save 16 bit stereo sample
   589 00000413 E2EC                    	loop 	c_smpl_1
   590                                  	
   591 00000415 C3                      	retn
   592                                  
   593                                  ;=============================================================================
   594                                  ;               MODLOAD.ASM
   595                                  ;=============================================================================
   596                                  
   597                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   598                                  ;	July 10th, 1993.
   599                                  
   600                                  ; STRUCTURES
   601                                  
   602                                  struc ModSample
   603 00000000 <res 00000016>          .msName:	resb 22
   604 00000016 <res 00000002>          .msLength:	resw 1
   605 00000018 <res 00000001>          .msFinetune:	resb 1
   606 00000019 <res 00000001>          .msVolume:	resb 1
   607 0000001A <res 00000002>          .msRepeat:	resw 1
   608 0000001C <res 00000002>          .msRepLen:	resw 1
   609                                  .size:		; 30 bytes
   610                                  endstruc
   611                                  
   612                                  struc ModHeader
   613 00000000 <res 00000014>          .mhName:	resb 20
   614 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   615 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   616 000003B7 <res 00000001>          .mhReStart:	resb 1
   617 000003B8 <res 00000080>          .mhOrder:	resb 128
   618 00000438 <res 00000004>          .mhSign:	resw 2
   619                                  .size:		; 1084 bytes
   620                                  endstruc
   621                                  
   622                                  struc ModInfoRec
   623 00000000 <res 00000001>          .OrderLen:	resb 1
   624 00000001 <res 00000001>          .ReStart:	resb 1
   625 00000002 <res 00000080>          .Order:		resb 128
   626 00000082 <res 00000004>          .Patterns:	resd 1
   627 00000086 <res 0000003E>          .SampOfs:	resw 31
   628 000000C4 <res 0000003E>          .SampSeg:	resw 31
   629 00000102 <res 0000003E>          .SampLen:	resw 31
   630 00000140 <res 0000003E>          .SampRep:	resw 31
   631 0000017E <res 0000003E>          .SampRepLen:	resw 31
   632 000001BC <res 0000003E>          .SampVol:	resw 31
   633                                  .size:		; 506 bytes	
   634                                  endstruc
   635                                  
   636                                  ; CODE
   637                                  
   638                                  ; 06/10/2017
   639                                  ; 04/10/2017
   640                                  ; /* MOD FileFormat */
   641                                  
   642                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   643                                  ID_FLT4 equ 34544C46h ; "FLT4"
   644                                  ID_8CHN equ 4E484338h ; "8CHN"
   645                                  ID_FLT8 equ 34544C46h ; "FLT8"
   646                                  
   647                                  ; CODE
   648                                  
   649                                  LoadModule:
   650                                  	; edi = file name address
   651                                  
   652 00000416 60                      	pushad
   653                                  
   654                                  	;call	ClearModInfo
   655                                  OpenFile:       
   656                                  	; ebx = ASCIIZ file name address
   657                                  	; ecx = open mode (0 = open for read)		
   658                                  	sys	_open, edi, 0 ; open for reading
   658                              <1> 
   658                              <1> 
   658                              <1> 
   658                              <1> 
   658                              <1>  %if %0 >= 2
   658 00000417 89FB                <1>  mov ebx, %2
   658                              <1>  %if %0 >= 3
   658 00000419 B900000000          <1>  mov ecx, %3
   658                              <1>  %if %0 = 4
   658                              <1>  mov edx, %4
   658                              <1>  %endif
   658                              <1>  %endif
   658                              <1>  %endif
   658 0000041E B805000000          <1>  mov eax, %1
   658                              <1> 
   658 00000423 CD40                <1>  int 40h
   659 00000425 0F8262010000            	jc	Failed
   660 0000042B A3[60100000]            	mov     [FileHandle], eax
   661                                  ReadHeader:
   662                                  	; ebx = File handle
   663                                  	; ecx = Buffer address
   664                                  	; edx = Byte count
   665                                  	sys	_read, [FileHandle], Header, ModHeader.size
   665                              <1> 
   665                              <1> 
   665                              <1> 
   665                              <1> 
   665                              <1>  %if %0 >= 2
   665 00000430 8B1D[60100000]      <1>  mov ebx, %2
   665                              <1>  %if %0 >= 3
   665 00000436 B9[64100000]        <1>  mov ecx, %3
   665                              <1>  %if %0 = 4
   665 0000043B BA3C040000          <1>  mov edx, %4
   665                              <1>  %endif
   665                              <1>  %endif
   665                              <1>  %endif
   665 00000440 B803000000          <1>  mov eax, %1
   665                              <1> 
   665 00000445 CD40                <1>  int 40h
   666 00000447 0F8231010000            	jc      CloseFile
   667                                  CheckMK:  
   668                                  	; 04/10/2017
   669 0000044D A1[9C140000]            	mov	eax, [Header+ModHeader.mhSign]
   670                                        
   671 00000452 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   672                                  	;je	short Is4chnMod
   673 00000457 742B                    	je	short IsModFile
   674                                  CheckFLT4:
   675 00000459 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   676                                  	;je	short Is4chnMod
   677 0000045E 7424                    	je	short IsModFile
   678                                  Check8CHN:
   679 00000460 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   680 00000465 740D                    	je	short Is8chnMod
   681                                  CheckFLT8:
   682 00000467 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   683                                  	; 06/10/2017
   684 0000046C 7406                    	je	short Is8chnMod
   685 0000046E F9                      	stc
   686 0000046F E90A010000              	jmp	CloseFile
   687                                  Is8chnMod:
   688 00000474 C605[41100000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   689 0000047B C605[40100000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   690 00000482 EB00                    	jmp	short IsModFile
   691                                  ;Is4chnMod:
   692                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   693                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   694                                  
   695                                  IsModFile:
   696 00000484 A0[1A140000]            	mov     al, [Header+ModHeader.mhOrderLen]
   697 00000489 A2[A0140000]            	mov     [ModInfo.OrderLen], al
   698                                  
   699 0000048E A0[1B140000]            	mov     al, [Header+ModHeader.mhReStart]
   700 00000493 3A05[1A140000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   701 00000499 7202                    	jb      short SetReStart
   702 0000049B B07F                    	mov     al, 7Fh
   703                                  SetReStart:
   704 0000049D A2[A1140000]            	mov     [ModInfo.ReStart], al
   705                                  
   706                                  	;mov	ecx, 128
   707 000004A2 66B98000                	mov	cx, 128
   708 000004A6 31D2                    	xor     edx, edx
   709 000004A8 31DB                    	xor     ebx, ebx
   710                                  CopyOrder:
   711 000004AA 8AB3[1C140000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   712 000004B0 88B3[A2140000]          	mov     [ModInfo.Order+ebx], dh
   713 000004B6 38D6                    	cmp     dh, dl
   714 000004B8 7202                    	jb      short NextOrder
   715 000004BA 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   716                                  NextOrder:
   717 000004BC 43                      	inc     ebx
   718 000004BD E2EB                    	loop    CopyOrder
   719                                  AllocPatterns:  
   720 000004BF 81E2FF000000            	and	edx, 0FFh
   721                                  	; 04/10/2017
   722                                  	;inx	dx  ; 12/03/2017
   723 000004C5 FEC2                    	inc	dl
   724                                  	; dl = number of patterns (04/07/2017)
   725 000004C7 8A0D[40100000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   726 000004CD D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   727                                  				     ; *2048 ; (byte count of patterns *64*8*4)
   728                                  	;
   729 000004CF 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   730                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   731 000004D1 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   732                                  	;
   733 000004D6 890D[22150000]          	mov	[ModInfo.Patterns], ecx
   734                                  	;
   735 000004DC 01CD                    	add	ebp, ecx ; next offset for samples
   736                                  ReadPatterns:  
   737                                  	;mov	ebx, [FileHandle] 
   738                                  	; ebx = File handle
   739                                  	; ecx = Buffer address
   740                                  	; edx = Byte count
   741                                  	sys	_read, [FileHandle]
   741                              <1> 
   741                              <1> 
   741                              <1> 
   741                              <1> 
   741                              <1>  %if %0 >= 2
   741 000004DE 8B1D[60100000]      <1>  mov ebx, %2
   741                              <1>  %if %0 >= 3
   741                              <1>  mov ecx, %3
   741                              <1>  %if %0 = 4
   741                              <1>  mov edx, %4
   741                              <1>  %endif
   741                              <1>  %endif
   741                              <1>  %endif
   741 000004E4 B803000000          <1>  mov eax, %1
   741                              <1> 
   741 000004E9 CD40                <1>  int 40h
   742 000004EB 0F828D000000            	jc      CloseFile
   743                                  
   744                                  	; patterns have been loaded here... (04/07/2017)
   745                                  
   746 000004F1 BE[78100000]            	mov	esi, Header+ModHeader.mhSamples
   747 000004F6 31FF                    	xor     edi, edi
   748                                  CopySamples:
   749 000004F8 668B4616                	mov     ax, [esi+ModSample.msLength]
   750 000004FC 86C4                    	xchg    al, ah
   751 000004FE 66D1E0                  	shl     ax, 1
   752 00000501 668987[A2150000]        	mov     [ModInfo.SampLen+edi], ax
   753 00000508 8A4619                  	mov     al, [esi+ModSample.msVolume]
   754 0000050B 30E4                    	xor     ah, ah
   755 0000050D 668987[5C160000]        	mov     [ModInfo.SampVol+edi], ax
   756 00000514 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   757 00000518 86C4                    	xchg    al, ah
   758 0000051A 66D1E0                  	shl     ax, 1
   759 0000051D 668987[E0150000]        	mov     [ModInfo.SampRep+edi], ax
   760 00000524 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   761 00000528 86C4                    	xchg    al, ah
   762 0000052A 66D1E0                  	shl     ax, 1
   763 0000052D 668987[1E160000]        	mov     [ModInfo.SampRepLen+edi], ax
   764 00000534 83C61E                  	add     esi, ModSample.size
   765 00000537 6683C702                	add     di, 2
   766 0000053B 6683FF3E                	cmp     di, 2*31
   767 0000053F 72B7                    	jb      short CopySamples
   768                                  
   769 00000541 31F6                    	xor     esi, esi
   770                                  AllocSamples:
   771 00000543 0FB796[A2150000]        	movzx	edx, word [ModInfo.SampLen+esi]
   772                                  	; 07/10/2017
   773                                  	;shr	dx, 4 ; ***
   774 0000054A 21D2                    	and	edx, edx
   775 0000054C 7426                    	jz      short NextSample
   776                                  	;inc	dx  ; number of paragraphs ; ***
   777                                  	;shl	dx, 4 ; ***
   778 0000054E 89E8                    	mov	eax, ebp
   779 00000550 668986[26150000]        	mov	[ModInfo.SampOfs+esi], ax
   780 00000557 C1E810                  	shr	eax, 16
   781 0000055A 668986[64150000]        	mov	[ModInfo.SampSeg+esi], ax
   782 00000561 89E9                    	mov	ecx, ebp
   783 00000563 01D5                    	add	ebp, edx ; next offset for sample 
   784                                  ReadSample:
   785                                  	;mov	ebx, [FileHandle]
   786                                  	;movzx  edx, [ModInfo.SampLen+esi]
   787                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   788                                  
   789                                  	; ebx = File handle
   790                                  	; ecx = Buffer address
   791                                  	; edx = Byte count
   792                                  	sys	_read, [FileHandle]
   792                              <1> 
   792                              <1> 
   792                              <1> 
   792                              <1> 
   792                              <1>  %if %0 >= 2
   792 00000565 8B1D[60100000]      <1>  mov ebx, %2
   792                              <1>  %if %0 >= 3
   792                              <1>  mov ecx, %3
   792                              <1>  %if %0 = 4
   792                              <1>  mov edx, %4
   792                              <1>  %endif
   792                              <1>  %endif
   792                              <1>  %endif
   792 0000056B B803000000          <1>  mov eax, %1
   792                              <1> 
   792 00000570 CD40                <1>  int 40h
   793 00000572 720A                    	jc      short CloseFile
   794                                  
   795                                  NextSample:
   796 00000574 6683C602                	add     si, 2
   797 00000578 6683FE3E                	cmp     si, 2*31
   798 0000057C 72C5                    	jb      short AllocSamples
   799                                  CloseFile:      
   800 0000057E 9C                      	pushf
   801                                  	sys	_close, [FileHandle]
   801                              <1> 
   801                              <1> 
   801                              <1> 
   801                              <1> 
   801                              <1>  %if %0 >= 2
   801 0000057F 8B1D[60100000]      <1>  mov ebx, %2
   801                              <1>  %if %0 >= 3
   801                              <1>  mov ecx, %3
   801                              <1>  %if %0 = 4
   801                              <1>  mov edx, %4
   801                              <1>  %endif
   801                              <1>  %endif
   801                              <1>  %endif
   801 00000585 B806000000          <1>  mov eax, %1
   801                              <1> 
   801 0000058A CD40                <1>  int 40h
   802 0000058C 9D                      	popf
   803                                  Failed:       
   804 0000058D 61                      	popad
   805 0000058E C3                      	retn
   806                                  
   807                                  ;=============================================================================
   808                                  ;               MODPLAY.ASM
   809                                  ;=============================================================================
   810                                  
   811                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   812                                  ;	July 23th, 1993.
   813                                  
   814                                  ; EQUATES
   815                                  
   816                                  ;NumTracks	equ 4 ; 06/10/2017 ([numtracks])
   817                                  DefTempo        equ 6
   818                                  DefBpm          equ 125
   819                                  MidCRate        equ 8448
   820                                  MixBufSize      equ 4096
   821                                  
   822                                  ; STRUCTURES
   823                                  
   824                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   825 00000000 <res 00000004>          .Samples:	resd 1
   826                                  ;.Position:	resw 1
   827 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   828 00000008 <res 00000002>          .Len:		resw 1
   829 0000000A <res 00000002>          .Repeat:	resw 1
   830 0000000C <res 00000002>          .RepLen:	resw 1
   831 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   832 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   833                                  ;.Error:	resb 1
   834                                  ;.Reserved:	resb 1 ; 01/10/2017
   835 00000010 <res 00000002>          .Period:	resw 1 ; Period
   836 00000012 <res 00000002>          .Pitch:		resw 1 
   837 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   838 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   839 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   840 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   841 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   842 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   843 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   844                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   845 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
   846 0000001E <res 00000006>          .Arp:		resw 3
   847 00000024 <res 00000002>          .ArpIndex:	resw 1
   848                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   849                                  endstruc
   850                                  
   851                                  ; CODE
   852                                  
   853                                  ;--------------------------------------------------------------------------
   854                                  ; updatechannel - update the track using the current effect
   855                                  ;--------------------------------------------------------------------------
   856                                  ; 
   857                                  ;--------------------------------------------------------------------------
   858                                  ; BeatTrack:  Process the next beat in one track.
   859                                  ;  In:
   860                                  ;    ds:di -  Track info Address.
   861                                  ;--------------------------------------------------------------------------
   862                                  
   863                                  ; edi = Track info address
   864                                  
   865                                  updatechannel:
   866                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   867                                  
   868 0000058F 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   869                                  
   870                                  	;test   dx, dx
   871                                  	;je     short None
   872                                  	;cmp    dh, 00h
   873                                  	;je     short Arpeggio
   874                                  	;cmp    dh, 01h
   875                                  	;je     short PortUp
   876                                  	;cmp    dh, 02h
   877                                  	;je     short PortDown
   878                                  	;cmp    dh, 03h
   879                                  	;je     TonePort
   880                                  	;cmp    dh, 04h
   881                                  	;je     Vibrato
   882                                  	;cmp    dh, 05h
   883                                  	;je     PortSlide
   884                                  	;cmp    dh, 06h
   885                                  	;je     VibSlide
   886                                  	;cmp    dh, 0Ah
   887                                  	;je     VolSlide
   888                                  	;retn
   889                                  
   890 00000593 0FB6C6                  	movzx	eax, dh
   891 00000596 240F                    	and	al, 0Fh
   892 00000598 FF2485[A00D0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   893                                  efxnull:
   894                                  None:           
   895 0000059F C3                      	retn
   896                                  efxarpeggio2:
   897                                  	; 01/10/2017
   898 000005A0 84D2                    	test    dl, dl
   899 000005A2 74FB                    	jz      short efxnull
   900                                  Arpeggio:
   901 000005A4 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   902 000005A8 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   903 000005AD 66894712                	mov     [edi+TrackInfo.Pitch], ax
   904 000005B1 6683C302                	add     bx, 2
   905 000005B5 6683FB06                	cmp     bx, 6
   906 000005B9 7202                    	jb      short SetArpIndex
   907 000005BB 31DB                    	xor     ebx, ebx
   908                                  SetArpIndex:
   909 000005BD 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   910 000005C1 C3                      	retn
   911                                  efxportaup:
   912                                  PortUp:
   913 000005C2 30F6                    	xor     dh, dh
   914                                  	;mov	bx, [edi+TrackInfo.Period]
   915 000005C4 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   916 000005C8 6629D3                  	sub     bx, dx
   917                                  	;cmp	bx, 113
   918 000005CB 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   919 000005CF 7D04                    	jge     short NotSmall
   920                                  	;mov	bx, 113
   921 000005D1 66BB1C00                	mov	bx, 28 ; 01/10/2017
   922                                  NotSmall:
   923 000005D5 66895F10                	mov     [edi+TrackInfo.Period], bx
   924 000005D9 6601DB                  	add     bx, bx
   925                                  	;mov	ax, [PitchTable+bx]
   926 000005DC 668B83[9A160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   927 000005E3 66894712                	mov     [edi+TrackInfo.Pitch], ax
   928 000005E7 C3                      	retn
   929                                  efxportadown:
   930                                  PortDown:
   931 000005E8 30F6                    	xor     dh, dh
   932                                  	;mov	bx, [edi+TrackInfo.Period]
   933 000005EA 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   934 000005EE 6601D3                  	add     bx, dx
   935 000005F1 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   936                                  	;cmp	bx, 856
   937 000005F6 7E04                    	jle     short NotBig
   938                                  	;mov	bx, 856
   939 000005F8 66BB600D                	mov	bx, 3424 ; 01/10/2017
   940                                  NotBig:         
   941 000005FC 66895F10                	mov     [edi+TrackInfo.Period], bx
   942 00000600 6601DB                  	add     bx, bx
   943                                  	;mov	ax, [PitchTable+bx]
   944 00000603 668B83[9A160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   945 0000060A 66894712                	mov     [edi+TrackInfo.Pitch], ax
   946 0000060E C3                      	retn
   947                                  efxtoneporta2:
   948                                  TonePort:
   949 0000060F 30F6                    	xor     dh, dh
   950 00000611 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   951                                  	;mov	bx, [edi+TrackInfo.Period]
   952 00000615 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   953 00000619 6639C3                  	cmp     bx, ax
   954 0000061C 7429                    	je      short NoPort
   955 0000061E 7F0D                    	jg      short PortToUp
   956                                  PortToDown:     
   957 00000620 6601D3                  	add     bx, dx
   958 00000623 6639C3                  	cmp     bx, ax
   959 00000626 7E0D                    	jle     short SetPort
   960                                  FixPort:        
   961 00000628 6689C3                  	mov     bx, ax
   962 0000062B EB08                    	jmp     short SetPort
   963                                  PortToUp:
   964 0000062D 6629D3                  	sub     bx, dx
   965 00000630 6639C3                  	cmp     bx, ax
   966 00000633 7CF3                    	jl      short FixPort
   967                                  SetPort:        
   968 00000635 66895F10                	mov     [edi+TrackInfo.Period], bx
   969 00000639 6601DB                  	add     bx, bx
   970                                  	;mov	ax, [PitchTable+bx]
   971 0000063C 668B83[9A160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   972 00000643 66894712                	mov     [edi+TrackInfo.Pitch], ax
   973                                  NoPort:         
   974 00000647 C3                      	retn
   975                                  efxvibrato2:
   976                                  	; 01/10/2017
   977                                  Vibrato:
   978 00000648 88D6                    	mov     dh, dl
   979                                  	;and	dl, 0Fh
   980                                  	;shr	dh, 4
   981                                  	;shl	dh, 2
   982 0000064A 6681E20FF0              	and     dx, 0F00Fh
   983 0000064F C0EE02                  	shr     dh, 2
   984                                  	;add	[edi+TrackInfo.VibPos], dh
   985                                  	;mov	dh, [edi+TrackInfo.VibPos]
   986                                  	;mov	bl, dh
   987 00000652 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   988 00000655 007719                  	add	[edi+TrackInfo.VibPos], dh
   989 00000658 88DE                    	mov	dh, bl ; 01/10/2017
   990 0000065A C0EB02                  	shr     bl, 2
   991                                  	;and	bx, 1Fh
   992                                  	;mov	al, [SinTable+bx]
   993 0000065D 83E31F                  	and	ebx, 1Fh
   994 00000660 8A83[880E0000]          	mov	al, [SinTable+ebx]
   995 00000666 F6E2                    	mul     dl
   996                                  	;rol	ax, 1
   997                                  	;xchg	al, ah
   998                                  	;and	ah, 1
   999 00000668 66C1E807                	shr	ax, 7
  1000 0000066C 84F6                    	test    dh, dh
  1001 0000066E 7903                    	jns     short VibUp
  1002 00000670 66F7D8                  	neg     ax
  1003                                  VibUp:          
  1004 00000673 66034710                	add     ax, [edi+TrackInfo.Period]
  1005 00000677 6689C3                  	mov	bx, ax
  1006                                  	;movzx	ebx, ax
  1007 0000067A 6683FB71                	cmp     bx, 113
  1008                                  	;cmp	bx, 113
  1009 0000067E 6683FB1C                	cmp	bx, 28  ; 01/10/2017
  1010 00000682 7D06                    	jge     short NoLoVib
  1011                                  	;mov	bx, 113
  1012 00000684 66BB1C00                	mov	bx, 28	; 01/10/2017
  1013 00000688 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
  1014                                  NoLoVib:        
  1015 0000068A 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1016                                  	;cmp	bx, 856
  1017 0000068F 7E04                    	jle     short NoHiVib
  1018                                  	;mov	bx, 856
  1019 00000691 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1020                                  NoHiVib:        
  1021 00000695 6601DB                  	add     bx, bx
  1022                                  	;mov	ax, [PitchTable+bx]
  1023 00000698 668B83[9A160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1024 0000069F 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1025 000006A3 C3                      	retn
  1026                                  efxtoneslide:
  1027                                  PortSlide:
  1028 000006A4 E812000000              	call    VolSlide
  1029 000006A9 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1030 000006AC E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
  1031                                  efxvibslide:
  1032                                  VibSlide:
  1033 000006B1 E805000000              	call    VolSlide
  1034 000006B6 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
  1035 000006B9 EB8D                    	jmp     short Vibrato  ; efxvibrato2
  1036                                  efxvolslide:
  1037                                  VolSlide:
  1038 000006BB 88D6                    	mov     dh, dl
  1039 000006BD 80E20F                  	and     dl, 0Fh
  1040 000006C0 C0EE04                  	shr     dh, 4
  1041 000006C3 8A470E                  	mov     al, [edi+TrackInfo.Volume]
  1042 000006C6 28D0                    	sub     al, dl
  1043 000006C8 7D02                    	jge     short NoLoVol
  1044 000006CA 30C0                    	xor     al, al
  1045                                  NoLoVol:        
  1046 000006CC 00F0                    	add     al, dh
  1047 000006CE 3C40                    	cmp     al, 64
  1048 000006D0 7602                    	jbe     short NoHiVol
  1049 000006D2 B040                    	mov     al, 64
  1050                                  NoHiVol:        
  1051 000006D4 88470E                  	mov     [edi+TrackInfo.Volume], al
  1052 000006D7 C3                      	retn
  1053                                  
  1054                                  efxtremolo2:
  1055                                  	; 01/10/2017 (TMODPLAY.ASM)
  1056                                  Tremolo:
  1057 000006D8 88D6                    	mov     dh, dl
  1058 000006DA 6681E20FF0              	and     dx, 0F00Fh
  1059 000006DF C0EE02                  	shr     dh, 2
  1060 000006E2 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1061 000006E5 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1062 000006E8 88DE                    	mov	dh, bl
  1063 000006EA C0EB02                  	shr     bl, 2
  1064                                  	; 01/10/2017 - TRDOS 386
  1065                                  	;and	bx, 1Fh
  1066 000006ED 83E31F                  	and	ebx, 1Fh 
  1067                                  	;mov	al, [SinTable+bx]
  1068 000006F0 8A83[880E0000]          	mov     al, [SinTable+ebx]
  1069 000006F6 F6E2                    	mul     dl
  1070 000006F8 66C1E806                	shr	ax, 6
  1071 000006FC 84F6                    	test    dh, dh
  1072 000006FE 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1073 00000700 66F7D8                  	neg     ax
  1074                                  efxtremolof2:
  1075                                  Tremolo_1:      
  1076 00000703 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1077 00000706 00E0                    	add     al, ah
  1078 00000708 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1079 0000070A 30C0                    	xor     al, al
  1080                                  efxtremolof3:
  1081                                  Tremolo_2:       
  1082 0000070C 3C40                    	cmp     al, 64 ; 40h
  1083 0000070E 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1084 00000710 B040                    	mov     al, 64 ; 40h
  1085                                  efxtremolof4:
  1086                                  Tremolo_3:       
  1087 00000712 28E0                    	sub	al, ah  ; ****** 
  1088 00000714 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1089 00000717 C3                      	retn	
  1090                                  
  1091                                  ;--------------------------------------------------------------------------
  1092                                  ; readchannel - read the next note event from the pattern sheet
  1093                                  ;--------------------------------------------------------------------------
  1094                                  ;
  1095                                  ;--------------------------------------------------------------------------
  1096                                  ; GetTrack:   Get the next Note from a pattern.
  1097                                  ;  In:
  1098                                  ;    ds:di -  Track info Address.
  1099                                  ;    es:si -  Pattern Note Address.
  1100                                  ; Out:
  1101                                  ;    es:si -  The Next Pattern Note address.
  1102                                  ;--------------------------------------------------------------------------
  1103                                  
  1104                                  ; esi = Pattern note address
  1105                                  ; edi = Track info address
  1106                                  
  1107                                  readchannel:
  1108                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1109 00000718 66AD                    	lodsw
  1110 0000071A 86C4                    	xchg    al, ah
  1111 0000071C 88E3                    	mov	bl, ah
  1112 0000071E 80E40F                  	and     ah, 0Fh
  1113 00000721 6689C1                  	mov     cx, ax
  1114 00000724 66AD                    	lodsw
  1115 00000726 86C4                    	xchg    al, ah
  1116 00000728 88E7                    	mov     bh, ah
  1117 0000072A 80E40F                  	and     ah, 0Fh
  1118 0000072D 6689C2                  	mov     dx, ax
  1119 00000730 66895714                	mov     [edi+TrackInfo.Effect], dx
  1120                                  	; 01/10/2017 - TRDOS 386
  1121                                  	;and	bl, 0F0h
  1122 00000734 81E3F0FF0000            	and	ebx, 0FFF0h
  1123 0000073A C0EF04                  	shr     bh, 4
  1124 0000073D 08FB                    	or      bl, bh
  1125 0000073F 7446                    	je      short SetPeriod
  1126                                  SetSample:
  1127 00000741 30FF                    	xor	bh, bh
  1128                                  	;and	ebx, 0FFh
  1129 00000743 FECB                    	dec     bl
  1130 00000745 01DB                    	add     ebx, ebx
  1131 00000747 668B83[5C160000]        	mov     ax, [ModInfo.SampVol+ebx]
  1132 0000074E 88470E                  	mov     [edi+TrackInfo.Volume], al
  1133 00000751 668B83[26150000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1134 00000758 668907                  	mov     [edi+TrackInfo.Samples], ax
  1135 0000075B 668B83[64150000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1136 00000762 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1137 00000766 668B83[A2150000]        	mov     ax, [ModInfo.SampLen+ebx]
  1138 0000076D 66894708                	mov     [edi+TrackInfo.Len], ax
  1139 00000771 668B83[E0150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1140 00000778 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1141 0000077C 668B83[1E160000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1142 00000783 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1143                                  SetPeriod:      
  1144 00000787 6685C9                  	test    cx, cx
  1145 0000078A 7425                    	jz      short SetEffect
  1146                                  
  1147 0000078C 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1148                                  	
  1149 00000790 80FE03                  	cmp     dh, 03h
  1150                                  	;je	short SetEffect
  1151 00000793 7428                    	je	short efxtoneporta ; 01/10/2017
  1152                                  
  1153 00000795 66894F10                	mov     [edi+TrackInfo.Period], cx
  1154                                  	;movzx	ebx, cx
  1155 00000799 6689CB                  	mov     bx, cx
  1156 0000079C 6601DB                  	add     bx, bx
  1157                                  	;mov	ax, [PitchTable+bx]
  1158 0000079F 668B83[9A160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1159 000007A6 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1160 000007AA C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1161                                  SetEffect:
  1162                                  	;test	dx, dx
  1163                                  	;je	short InitNone
  1164                                  	;cmp	dh, 00h
  1165                                  	;je	InitArpeggio
  1166                                  	;cmp	dh, 03h
  1167                                  	;je	short InitTonePort
  1168                                  	;cmp	dh, 04h
  1169                                  	;je	short InitVibrato
  1170                                  	;cmp	dh, 09h
  1171                                  	;je	short SampleOfs
  1172                                  	;cmp	dh, 0Bh
  1173                                  	;je	short PosJump
  1174                                  	;cmp	dh, 0Ch
  1175                                  	;je	short SetVolume
  1176                                  	;cmp	dh, 0Dh
  1177                                  	;je	short Break
  1178                                  	;cmp	dh, 0Fh
  1179                                  	;je	SetSpeed
  1180                                  	;retn
  1181                                  
  1182                                  	; 01/10/2017 (TMODPLAY.ASM)
  1183                                  	
  1184                                  	; dx = [di+TrackInfo.Effect]
  1185                                  	
  1186 000007B1 0FB6C6                  	movzx	eax, dh
  1187 000007B4 240F                    	and	al, 0Fh
  1188 000007B6 FF2485[600D0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1189                                  ;efxnull:
  1190                                  ;InitNone:
  1191                                  ;	retn
  1192                                  efxtoneporta:
  1193                                  	; 01/10/2017
  1194                                  	; cx = period
  1195                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1196                                  InitTonePort:
  1197 000007BD 84D2                    	test    dl, dl
  1198 000007BF 7503                    	jnz     short SetPortParm
  1199 000007C1 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1200                                  SetPortParm:    
  1201 000007C4 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1202 000007C7 66895714                	mov     [edi+TrackInfo.Effect], dx
  1203 000007CB C3                      	retn
  1204                                  efxvibrato:
  1205                                  InitVibrato:
  1206 000007CC 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1207 000007CF 88C4                    	mov     ah, al
  1208                                  	;and	al, 0Fh
  1209                                  	;and	ah, 0F0h
  1210 000007D1 66250FF0                	and	ax, 0F00Fh
  1211 000007D5 F6C20F                  	test    dl, 0Fh
  1212 000007D8 7502                    	jne     short OkDepth
  1213 000007DA 08C2                    	or      dl, al
  1214                                  OkDepth:        
  1215 000007DC F6C2F0                  	test    dl, 0F0h
  1216 000007DF 7502                    	jnz     short OkRate
  1217 000007E1 08E2                    	or      dl, ah
  1218                                  OkRate:         
  1219 000007E3 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1220 000007E6 66895714                	mov     [edi+TrackInfo.Effect], dx
  1221 000007EA 6685C9                  	test    cx, cx
  1222 000007ED 7404                    	jz      short OkPos
  1223 000007EF C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1224                                  OkPos:          
  1225 000007F3 C3                      	retn
  1226                                  efxsampoffset:
  1227                                  	; 01/10/2017 ; *******
  1228                                  SampleOfs:         
  1229                                  ;	test    dl, dl
  1230                                  ;	jnz     short SetSampleOfs
  1231                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1232                                  ;SetSampleOfs:
  1233                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1234 000007F4 88D6                    	mov     dh, dl
  1235 000007F6 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1236 000007FC 895704                  	mov     [edi+TrackInfo.Position], edx
  1237 000007FF C3                      	retn
  1238                                  efxpattjump:
  1239                                  PosJump:
  1240 00000800 8815[5C820000]          	mov     [OrderPos], dl
  1241 00000806 C605[60820000]40        	mov     byte [Row], 64
  1242 0000080D C3                      	retn
  1243                                  efxsetvolume:
  1244                                  SetVolume:
  1245 0000080E 80FA40                  	cmp     dl, 64
  1246 00000811 7602                    	jbe     short OkVol
  1247 00000813 B240                    	mov     dl, 64
  1248                                  OkVol:
  1249                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1250 00000815 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1251                                  	;mov	[edi+TrackInfo.Volume], dl
  1252 00000817 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1253 0000081B C3                      	retn
  1254                                  efxbreak:
  1255                                  Break:
  1256 0000081C 88D6                    	mov     dh, dl
  1257 0000081E 80E20F                  	and     dl, 0Fh
  1258 00000821 C0EE04                  	shr     dh, 4
  1259 00000824 00F6                    	add     dh, dh
  1260 00000826 00F2                    	add     dl, dh
  1261 00000828 C0E602                  	shl     dh, 2
  1262 0000082B 00F2                    	add     dl, dh
  1263 0000082D 8815[61820000]          	mov     [BreakRow], dl
  1264 00000833 C605[60820000]40        	mov     byte [Row], 64
  1265 0000083A C3                      	retn
  1266                                  efxsetspeed:
  1267                                  SetSpeed:
  1268 0000083B 84D2                    	test    dl,dl
  1269 0000083D 7432                    	je      Skip
  1270 0000083F 80FA1F                  	cmp     dl,31
  1271 00000842 770D                    	ja      short SetBpm
  1272                                  SetTempo:       
  1273 00000844 8815[5D820000]          	mov     [Tempo], dl
  1274 0000084A 8815[5E820000]          	mov     [TempoWait], dl
  1275 00000850 C3                      	retn
  1276                                  SetBpm:
  1277 00000851 8815[5F820000]          	mov     [Bpm], dl
  1278 00000857 B067                    	mov     al, 103
  1279 00000859 F6E2                    	mul     dl
  1280 0000085B 88E3                    	mov     bl, ah
  1281 0000085D 30FF                    	xor     bh, bh
  1282 0000085F 66A1[AC0E0000]          	mov     ax, [MixSpeed]
  1283 00000865 6631D2                  	xor     dx, dx
  1284 00000868 66F7F3                  	div     bx
  1285 0000086B 66A3[62820000]          	mov     [BpmSamples], ax
  1286                                  Skip:           
  1287 00000871 C3                      	retn
  1288                                  efxarpeggio:
  1289                                  	; 01/10/2017
  1290 00000872 84D2                    	test    dl, dl
  1291                                  	;je	efxnull
  1292 00000874 74FB                    	je	short Skip
  1293                                  InitArpeggio:
  1294 00000876 88D6                    	mov     dh, dl
  1295 00000878 80E20F                  	and     dl, 0Fh
  1296 0000087B C0EE04                  	shr     dh, 4
  1297                                  	; 01/10/2017
  1298                                  	;mov	cx, 36
  1299 0000087E 66B95400                	mov	cx, 84 ; 84 notes/periods
  1300 00000882 31DB                    	xor     ebx, ebx
  1301 00000884 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1302                                  gt_ScanPeriod:
  1303                                  	;cmp	ax, [PeriodTable+bx]
  1304 00000888 663B83[E00D0000]        	cmp	ax, [PeriodTable+ebx]
  1305 0000088F 7306                    	jae     short SetArp
  1306 00000891 6683C302                	add     bx, 2
  1307 00000895 E2F1                    	loop    gt_ScanPeriod
  1308                                  SetArp:         
  1309 00000897 6601D2                  	add     dx, dx
  1310 0000089A 00DE                    	add     dh, bl
  1311 0000089C 00DA                    	add     dl, bl
  1312                                  	; 01/10/2017
  1313                                  	;mov	bx, [PeriodTable+bx]
  1314 0000089E 668B9B[E00D0000]        	mov	bx, [PeriodTable+ebx]
  1315                                  	;add	bx, bx
  1316 000008A5 01DB                    	add	ebx, ebx
  1317                                  	;mov	ax, [PitchTable+bx]
  1318 000008A7 668B83[9A160000]        	mov	ax, [PitchTable+ebx]
  1319 000008AE 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1320 000008B2 88F3                    	mov     bl, dh
  1321 000008B4 30FF                    	xor     bh, bh
  1322 000008B6 668B9B[E00D0000]        	mov	bx, [PeriodTable+ebx]
  1323                                  	;add	bx, bx
  1324 000008BD 01DB                    	add	ebx, ebx
  1325                                  	;mov	ax, [PitchTable+bx]
  1326 000008BF 668B83[9A160000]        	mov	ax, [PitchTable+ebx]
  1327 000008C6 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1328 000008CA 88D3                    	mov     bl, dl
  1329 000008CC 30FF                    	xor     bh, bh
  1330 000008CE 668B9B[E00D0000]        	mov	bx, [PeriodTable+ebx]
  1331                                  	;add	bx, bx
  1332 000008D5 01DB                    	add	ebx, ebx
  1333                                  	;mov	ax, [PitchTable+bx]
  1334 000008D7 668B83[9A160000]        	mov	ax, [PitchTable+ebx]
  1335 000008DE 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1336 000008E2 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1337 000008E8 C3                      	retn
  1338                                  
  1339                                  efxtremolo:
  1340                                  	; 01/10/2017 (TMODPLAY.ASM)
  1341                                  InitTremolo:
  1342 000008E9 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1343 000008EC 88C4                    	mov     ah, al
  1344 000008EE 66250FF0                	and     ax, 0F00Fh
  1345 000008F2 F6C20F                  	test    dl, 0Fh
  1346 000008F5 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1347 000008F7 08C2                    	or      dl, al
  1348                                  efxtremolof0:
  1349                                  InitTremolo_1: 
  1350 000008F9 F6C2F0                  	test    dl, 0F0h
  1351 000008FC 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1352 000008FE 08E2                    	or      dl, ah
  1353                                  efxtremolof1:
  1354                                  InitTremolo_2:
  1355 00000900 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1356 00000903 66895714                	mov     [edi+TrackInfo.Effect], dx
  1357 00000907 C3                      	retn
  1358                                  
  1359                                  ;--------------------------------------------------------------------------
  1360                                  ; pollmodule - polls the module player
  1361                                  ;--------------------------------------------------------------------------
  1362                                  ;--------------------------------------------------------------------------
  1363                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1364                                  ;--------------------------------------------------------------------------
  1365                                  
  1366                                  pollmodule:
  1367                                  UpdateTracks: ; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1368 00000908 FE0D[5E820000]          	dec     byte [TempoWait]
  1369 0000090E 7417                    	jz      short GetTracks
  1370                                  
  1371                                  	;mov	ecx, NumTracks
  1372 00000910 0FB70D[41100000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1373 00000917 BF[72820000]            	mov	edi, Tracks
  1374                                  BeatTracks:
  1375 0000091C E86EFCFFFF              	call	BeatTrack	
  1376 00000921 83C726                  	add	edi, TrackInfo.size
  1377 00000924 E2F6                    	loop	BeatTracks
  1378 00000926 C3                      	retn
  1379                                  GetTracks:
  1380 00000927 A0[5D820000]            	mov     al, [Tempo]
  1381 0000092C A2[5E820000]            	mov     [TempoWait], al
  1382                                  
  1383 00000931 8B35[6E820000]          	mov	esi, [Note]
  1384 00000937 803D[60820000]40        	cmp     byte [Row], 64
  1385 0000093E 7268                    	jb      short NoPattWrap
  1386                                  
  1387 00000940 8B35[22150000]          	mov	esi, [ModInfo.Patterns]
  1388 00000946 8A1D[5C820000]          	mov     bl, [OrderPos]
  1389 0000094C 3A1D[A0140000]          	cmp     bl, [ModInfo.OrderLen]
  1390 00000952 7214                    	jb      short NoOrderWrap
  1391 00000954 8A1D[A1140000]          	mov     bl, [ModInfo.ReStart]
  1392 0000095A 881D[5C820000]          	mov     [OrderPos], bl
  1393 00000960 3A1D[A0140000]          	cmp     bl, [ModInfo.OrderLen]
  1394 00000966 7364                    	jae     short NoUpdate
  1395                                  NoOrderWrap:    
  1396                                  	;xor	bh, bh
  1397 00000968 81E3FF000000            	and	ebx, 0FFh
  1398 0000096E 8A9B[A2140000]          	mov     bl, [ModInfo.Order+ebx]
  1399                                  	; 05/10/2017
  1400                                  	;shl	ebx, 10 ; *1024
  1401 00000974 8A0D[40100000]          	mov	cl, [pattern_shift] ; 10 or 11
  1402 0000097A D3E3                    	shl	ebx, cl ; *1024 or *2048
  1403                                  	;
  1404 0000097C 01DE                    	add     esi, ebx
  1405 0000097E 8A1D[61820000]          	mov     bl, [BreakRow]
  1406 00000984 881D[60820000]          	mov     [Row], bl
  1407                                  	;xor	bh, bh
  1408 0000098A 81E3FF000000            	and	ebx, 0FFh
  1409 00000990 883D[61820000]          	mov     [BreakRow], bh ; 0
  1410 00000996 66C1E304                	shl     bx, 4
  1411 0000099A 01DE                    	add     esi, ebx
  1412 0000099C 8935[6E820000]          	mov     [Note], esi
  1413 000009A2 FE05[5C820000]          	inc     byte [OrderPos]
  1414                                  NoPattWrap:     
  1415 000009A8 FE05[60820000]          	inc     byte [Row]
  1416                                  
  1417                                  	;cld
  1418                                  	;mov	ecx, NumTracks
  1419 000009AE 0FB70D[41100000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1420 000009B5 BF[72820000]            	mov	edi, Tracks
  1421                                  GetTracks_next:
  1422 000009BA 51                      	push	ecx	
  1423 000009BB E858FDFFFF              	call	GetTrack
  1424 000009C0 59                      	pop	ecx
  1425 000009C1 83C726                  	add	edi, TrackInfo.size
  1426 000009C4 E2F4                    	loop	GetTracks_next
  1427                                  
  1428 000009C6 8935[6E820000]          	mov     [Note], esi
  1429                                  NoUpdate:
  1430 000009CC C3                      	retn
  1431                                  
  1432                                  ;--------------------------------------------------------------------------
  1433                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1434                                  ;  In:
  1435                                  ;   ds:si -  Track Info Address.
  1436                                  ;   ds:di -  Buffer Address.
  1437                                  ;    cx   -  Buffer Size.
  1438                                  ;--------------------------------------------------------------------------
  1439                                  
  1440                                  ; esi = Track info address
  1441                                  ; edi = Buffer address
  1442                                  ; ecx = Buffer size
  1443                                  
  1444                                  MixTrack:
  1445 000009CD 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1446 000009D2 7752                    	ja      short MixLooped
  1447                                  MixNonLooped:   
  1448 000009D4 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1449 000009D6 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1450 000009D9 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1451 000009DD 52                      	push    edx
  1452 000009DE 56                      	push    esi
  1453 000009DF 01D3                    	add     ebx, edx
  1454 000009E1 01D5                    	add     ebp, edx
  1455 000009E3 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1456                                  	; 01/10/2017
  1457                                  	;mov	al, [esi+TrackInfo.Volume]
  1458 000009E7 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1459                                  	; ah = [esi+TrackInfo.VolDiff]
  1460 000009EB 00E0                    	add	al, ah ; ****** 
  1461 000009ED C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1462 000009F1 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1463 000009F4 89DE                    	mov     esi, ebx
  1464 000009F6 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1465 000009F8 88C7                    	mov     bh, al
  1466 000009FA 88D0                    	mov     al, dl
  1467 000009FC 88F2                    	mov     dl, dh
  1468                                  	;xor	dh, dh
  1469 000009FE 81E2FF000000            	and	edx, 0FFh
  1470                                  nlMixSamp:      
  1471 00000A04 39EE                    	cmp     esi, ebp
  1472 00000A06 7311                    	jae     short nlMixBye
  1473 00000A08 8A1E                    	mov     bl, [esi]
  1474                                  	;mov	bl, [VolTable+bx]
  1475 00000A0A 8A9B[5C310000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1476 00000A10 001F                    	add     [edi], bl
  1477 00000A12 47                      	inc     edi
  1478 00000A13 00C4                    	add     ah, al
  1479 00000A15 11D6                    	adc     esi, edx
  1480 00000A17 E2EB                    	loop    nlMixSamp
  1481                                  nlMixBye:       
  1482 00000A19 89F3                    	mov     ebx, esi
  1483 00000A1B 5E                      	pop     esi
  1484 00000A1C 5A                      	pop     edx
  1485 00000A1D 29D3                    	sub     ebx, edx
  1486 00000A1F 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1487 00000A22 88661D                  	mov     [esi+TrackInfo.Error], ah
  1488 00000A25 C3                      	retn
  1489                                  MixLooped:
  1490 00000A26 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1491 00000A28 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1492 00000A2B 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1493 00000A2F 892D[6A820000]          	mov     [BufRep], ebp
  1494                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1495 00000A35 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1496 00000A39 52                      	push    edx
  1497 00000A3A 56                      	push    esi
  1498 00000A3B 01D3                    	add     ebx, edx
  1499 00000A3D 01D5                    	add     ebp, edx
  1500 00000A3F 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1501                                  	; 01/10/2017
  1502                                  	;mov	al, [esi+TrackInfo.Volume]
  1503 00000A43 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1504                                  	; ah = [esi+TrackInfo.VolDiff]
  1505 00000A47 00E0                    	add	al, ah ; ****** 
  1506 00000A49 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1507 00000A4D 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1508                                  	;mov	si, bx
  1509 00000A50 89DE                    	mov	esi, ebx ; 04/09/2017
  1510 00000A52 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1511 00000A54 88C7                    	mov     bh, al
  1512 00000A56 88D0                    	mov     al, dl
  1513 00000A58 88F2                    	mov     dl, dh
  1514                                  	;xor	dh, dh
  1515 00000A5A 81E2FF000000            	and	edx, 0FFh
  1516                                  lpMixSamp:      
  1517 00000A60 39EE                    	cmp     esi, ebp
  1518 00000A62 7206                    	jb      short lpMixNow
  1519 00000A64 2B35[6A820000]          	sub     esi, [BufRep]
  1520                                  lpMixNow:       
  1521 00000A6A 8A1E                    	mov     bl, [esi]
  1522                                  	;mov	bl, [VolTable+bx]
  1523 00000A6C 8A9B[5C310000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1524 00000A72 001F                    	add     [edi], bl
  1525 00000A74 47                      	inc     edi
  1526 00000A75 00C4                    	add     ah, al
  1527 00000A77 11D6                    	adc	esi, edx
  1528 00000A79 E2E5                    	loop    lpMixSamp
  1529                                  lpMixBye:       
  1530                                  ;	mov     ebx, esi
  1531                                  ;	pop     esi
  1532                                  ;	pop     edx
  1533                                  ;	sub     ebx, edx
  1534                                  ;	mov     [esi+TrackInfo.Position], ebx
  1535                                  ;	mov     [esi+TrackInfo.Error], ah
  1536                                  ;	retn
  1537 00000A7B EB9C                    	jmp	short nlMixBye
  1538                                  
  1539                                  ;--------------------------------------------------------------------------
  1540                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1541                                  ;  In:
  1542                                  ;    Buffer  - Buffer Address.
  1543                                  ;    Count   - Buffer Size.
  1544                                  ;--------------------------------------------------------------------------
  1545                                  
  1546                                  mixpoll:
  1547                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1548                                  	; edi = buffer address
  1549                                  	; ebx = count
  1550                                  
  1551 00000A7D 60                      	pushad
  1552                                  
  1553                                  	;cld
  1554                                  NextChunk:      
  1555 00000A7E 66833D[68820000]00      	cmp     word [BufLen], 0
  1556 00000A86 754A                    	jne     short CopyChunk
  1557                                  
  1558 00000A88 53                      	push    ebx
  1559 00000A89 57                      	push    edi
  1560                                  MixChunk:       
  1561 00000A8A BF[5C720000]            	mov	edi, MixBuffer
  1562 00000A8F 0FB70D[62820000]        	movzx	ecx, word [BpmSamples]
  1563                                  	;mov	cx, [BpmSamples]
  1564 00000A96 893D[64820000]          	mov     [BufPtr], edi
  1565 00000A9C 66890D[68820000]        	mov     [BufLen], cx
  1566                                  
  1567 00000AA3 B080                    	mov     al, 80h
  1568 00000AA5 F3AA                    	rep     stosb
  1569                                  
  1570                                  	;mov	cx, NumTracks
  1571                                  	;mov	cl, NumTracks ; 01/10/2017
  1572 00000AA7 8A0D[41100000]          	mov	cl, [numtracks] ; 06/10/2017
  1573 00000AAD BE[4C820000]            	mov	esi, Tracks - TrackInfo.size
  1574                                  GetSamples_next:
  1575 00000AB2 51                      	push	ecx
  1576 00000AB3 83C626                  	add	esi, TrackInfo.size
  1577 00000AB6 668B0D[68820000]        	mov	cx, [BufLen]
  1578 00000ABD 8B3D[64820000]          	mov	edi, [BufPtr]
  1579 00000AC3 E805FFFFFF              	call	MixTrack
  1580 00000AC8 59                      	pop	ecx
  1581 00000AC9 E2E7                    	loop	GetSamples_next	
  1582                                  
  1583 00000ACB E838FEFFFF              	call    UpdateTracks
  1584                                  
  1585 00000AD0 5F                      	pop     edi
  1586 00000AD1 5B                      	pop     ebx
  1587                                  CopyChunk:      
  1588                                  	;mov	cx, [BufLen]
  1589 00000AD2 0FB70D[68820000]        	movzx	ecx, word [BufLen]
  1590 00000AD9 39D9                    	cmp	ecx, ebx
  1591                                  	;cmp	cx, bx
  1592 00000ADB 7602                    	jbe     short MoveChunk
  1593                                  	;mov	cx, bx
  1594 00000ADD 89D9                    	mov     ecx, ebx
  1595                                  MoveChunk:
  1596 00000ADF 8B35[64820000]          	mov     esi, [BufPtr]
  1597 00000AE5 010D[64820000]          	add     [BufPtr], ecx
  1598 00000AEB 66290D[68820000]        	sub     [BufLen], cx
  1599 00000AF2 29CB                    	sub     ebx, ecx
  1600 00000AF4 F3A4                    	rep     movsb
  1601 00000AF6 85DB                    	test    ebx, ebx
  1602 00000AF8 7584                    	jnz     short NextChunk
  1603                                  
  1604 00000AFA 61                      	popad
  1605 00000AFB C3                      	retn
  1606                                  
  1607                                  ;--------------------------------------------------------------------------
  1608                                  ; StartPlaying: Initializes the Sound System.
  1609                                  ;  In:
  1610                                  ;   Module Information Resources.
  1611                                  ;--------------------------------------------------------------------------
  1612                                  
  1613                                  StartPlaying:
  1614 00000AFC 60                      	pushad
  1615                                  SetModParms:    
  1616 00000AFD C605[5C820000]00        	mov     byte [OrderPos], 0
  1617 00000B04 C605[5D820000]06        	mov     byte [Tempo], DefTempo
  1618 00000B0B C605[5E820000]06        	mov     byte [TempoWait], DefTempo
  1619 00000B12 C605[5F820000]7D        	mov     byte [Bpm], DefBpm
  1620 00000B19 C605[60820000]40        	mov     byte [Row], 64
  1621 00000B20 C605[61820000]00        	mov     byte [BreakRow], 0
  1622 00000B27 66A1[AC0E0000]          	mov     ax, [MixSpeed]
  1623 00000B2D 31D2                    	xor     edx, edx
  1624 00000B2F 66BB3200                	mov     bx, 24*DefBpm/60
  1625 00000B33 66F7F3                  	div     bx
  1626 00000B36 66A3[62820000]          	mov     [BpmSamples], ax
  1627                                  ClearTracks:    
  1628 00000B3C BF[72820000]            	mov     edi, Tracks
  1629                                  	; 06/10/2017
  1630                                  	;mov	ecx, NumTracks*TrackInfo.size
  1631 00000B41 B826000000              	mov	eax, TrackInfo.size
  1632 00000B46 0FB70D[41100000]        	movzx	ecx, word [numtracks]
  1633 00000B4D F7E1                    	mul	ecx
  1634 00000B4F 89C1                    	mov	ecx, eax
  1635 00000B51 31C0                    	xor	eax, eax
  1636                                  	;cld
  1637 00000B53 F3AA                    	rep     stosb
  1638                                  
  1639 00000B55 A3[64820000]            	mov     [BufPtr], eax
  1640 00000B5A 66A3[68820000]          	mov     [BufLen], ax
  1641                                  MakePitch:
  1642 00000B60 66B80021                	mov     ax, MidCRate
  1643 00000B64 66BBAC01                	mov     bx, 428
  1644 00000B68 66F7E3                  	mul     bx
  1645 00000B6B 66F735[AC0E0000]        	div     word [MixSpeed]
  1646 00000B72 30F6                    	xor     dh, dh
  1647 00000B74 88E2                    	mov     dl, ah
  1648 00000B76 88C4                    	mov     ah, al
  1649 00000B78 30C0                    	xor     al, al
  1650                                  	;mov	cx, 857
  1651 00000B7A 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1652 00000B7E 31DB                    	xor     ebx, ebx
  1653 00000B80 BF[9A160000]            	mov     edi, PitchTable
  1654                                  PitchLoop:      
  1655 00000B85 50                      	push    eax
  1656 00000B86 52                      	push    edx
  1657 00000B87 6639DA                  	cmp     dx, bx
  1658 00000B8A 7303                    	jae     short NoDiv
  1659 00000B8C 66F7F3                  	div     bx
  1660                                  NoDiv:          
  1661 00000B8F 66AB                    	stosw
  1662 00000B91 5A                      	pop     edx
  1663 00000B92 58                      	pop     eax
  1664 00000B93 43                      	inc     ebx
  1665 00000B94 E2EF                    	loop    PitchLoop
  1666                                  MakeVolume:     
  1667 00000B96 66B90041                	mov     cx, 16640
  1668 00000B9A 89CB                    	mov     ebx, ecx
  1669                                  VolLoop:
  1670 00000B9C 4B                      	dec     ebx
  1671 00000B9D 88D8                    	mov     al, bl
  1672 00000B9F F6EF                    	imul    bh
  1673 00000BA1 88A3[5C310000]          	mov     [VolTable+ebx], ah
  1674 00000BA7 E2F3                    	loop    VolLoop
  1675                                  
  1676 00000BA9 61                      	popad
  1677 00000BAA C3                      	retn
  1678                                  
  1679                                  ;--------------------------------------------------------------------------
  1680                                  ; StopPlaying: ShutDown the Sound System.
  1681                                  ;--------------------------------------------------------------------------
  1682                                  
  1683                                  StopPlaying:
  1684                                  	; 19/06/2017
  1685                                  	; Stop Playing
  1686                                  	sys	_audio, 0700h
  1686                              <1> 
  1686                              <1> 
  1686                              <1> 
  1686                              <1> 
  1686                              <1>  %if %0 >= 2
  1686 00000BAB BB00070000          <1>  mov ebx, %2
  1686                              <1>  %if %0 >= 3
  1686                              <1>  mov ecx, %3
  1686                              <1>  %if %0 = 4
  1686                              <1>  mov edx, %4
  1686                              <1>  %endif
  1686                              <1>  %endif
  1686                              <1>  %endif
  1686 00000BB0 B820000000          <1>  mov eax, %1
  1686                              <1> 
  1686 00000BB5 CD40                <1>  int 40h
  1687                                  	; Cancel callback service (for user)
  1688                                  	sys	_audio, 0900h
  1688                              <1> 
  1688                              <1> 
  1688                              <1> 
  1688                              <1> 
  1688                              <1>  %if %0 >= 2
  1688 00000BB7 BB00090000          <1>  mov ebx, %2
  1688                              <1>  %if %0 >= 3
  1688                              <1>  mov ecx, %3
  1688                              <1>  %if %0 = 4
  1688                              <1>  mov edx, %4
  1688                              <1>  %endif
  1688                              <1>  %endif
  1688                              <1>  %endif
  1688 00000BBC B820000000          <1>  mov eax, %1
  1688                              <1> 
  1688 00000BC1 CD40                <1>  int 40h
  1689                                  	; Deallocate Audio Buffer (for user)
  1690                                  	sys	_audio, 0A00h
  1690                              <1> 
  1690                              <1> 
  1690                              <1> 
  1690                              <1> 
  1690                              <1>  %if %0 >= 2
  1690 00000BC3 BB000A0000          <1>  mov ebx, %2
  1690                              <1>  %if %0 >= 3
  1690                              <1>  mov ecx, %3
  1690                              <1>  %if %0 = 4
  1690                              <1>  mov edx, %4
  1690                              <1>  %endif
  1690                              <1>  %endif
  1690                              <1>  %endif
  1690 00000BC8 B820000000          <1>  mov eax, %1
  1690                              <1> 
  1690 00000BCD CD40                <1>  int 40h
  1691                                  	; Disable Audio Device
  1692                                  	sys	_audio, 0C00h
  1692                              <1> 
  1692                              <1> 
  1692                              <1> 
  1692                              <1> 
  1692                              <1>  %if %0 >= 2
  1692 00000BCF BB000C0000          <1>  mov ebx, %2
  1692                              <1>  %if %0 >= 3
  1692                              <1>  mov ecx, %3
  1692                              <1>  %if %0 = 4
  1692                              <1>  mov edx, %4
  1692                              <1>  %endif
  1692                              <1>  %endif
  1692                              <1>  %endif
  1692 00000BD4 B820000000          <1>  mov eax, %1
  1692                              <1> 
  1692 00000BD9 CD40                <1>  int 40h
  1693                                  
  1694 00000BDB C3                      	retn
  1695                                  
  1696                                  ;=============================================================================
  1697                                  ; 
  1698                                  ;=============================================================================
  1699                                  
  1700                                  ;dword2str:
  1701                                  ;	; 13/11/2016 - Erdogan Tan 
  1702                                  ;	; eax = dword value
  1703                                  ;	;
  1704                                  ;	call	dwordtohex
  1705                                  ;	mov	[dword_str], edx
  1706                                  ;	mov	[dword_str+4], eax
  1707                                  ;	mov	si, dword_str
  1708                                  ;	retn
  1709                                  
  1710                                  	; 05/03/2017 (TRDOS 386)
  1711                                  	; trdos386.s (unix386.s) - 10/05/2015
  1712                                  	; Convert binary number to hexadecimal string
  1713                                  
  1714                                  ;bytetohex:
  1715                                  ;	; INPUT ->
  1716                                  ;	; 	AL = byte (binary number)
  1717                                  ;	; OUTPUT ->
  1718                                  ;	;	AX = hexadecimal string
  1719                                  ;	;
  1720                                  ;	push	ebx
  1721                                  ;	movzx	ebx, al
  1722                                  ;	shr	bl, 4
  1723                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1724                                  ;	xchg	bl, al
  1725                                  ;	and	bl, 0Fh
  1726                                  ;	mov	ah, [ebx+hex_chars] 
  1727                                  ;	pop	ebx	
  1728                                  ;	retn
  1729                                  
  1730                                  ;wordtohex:
  1731                                  ;	; INPUT ->
  1732                                  ;	; 	AX = word (binary number)
  1733                                  ;	; OUTPUT ->
  1734                                  ;	;	EAX = hexadecimal string
  1735                                  ;	;
  1736                                  ;	push	ebx
  1737                                  ;	xor	ebx, ebx
  1738                                  ;	xchg	ah, al
  1739                                  ;	push	eax
  1740                                  ;	mov	bl, ah
  1741                                  ;	shr	bl, 4
  1742                                  ;	mov	al, [ebx+hex_chars] 	 	
  1743                                  ;	mov	bl, ah
  1744                                  ;	and	bl, 0Fh
  1745                                  ;	mov	ah, [ebx+hex_chars]
  1746                                  ;	shl	eax, 16
  1747                                  ;	pop	eax
  1748                                  ;	pop	ebx
  1749                                  ;	jmp	short bytetohex
  1750                                  
  1751                                  ;dwordtohex:
  1752                                  ;	; INPUT ->
  1753                                  ;	; 	EAX = dword (binary number)
  1754                                  ;	; OUTPUT ->
  1755                                  ;	;	EDX:EAX = hexadecimal string
  1756                                  ;	;
  1757                                  ;	push	eax
  1758                                  ;	shr	eax, 16
  1759                                  ;	call	wordtohex
  1760                                  ;	mov	edx, eax
  1761                                  ;	pop	eax
  1762                                  ;	call	wordtohex
  1763                                  ;	retn
  1764                                  
  1765                                  	; 19/06/2017
  1766                                  	; 05/03/2017 (TRDOS 386)
  1767                                  	; 13/11/2016 - Erdogan Tan
  1768                                  write_audio_dev_info:
  1769                                  	; BUS/DEV/FN
  1770                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1771                                  	; DEV/VENDOR
  1772                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1773                                  
  1774 00000BDC 8B35[50100000]          	mov	esi, [dev_vendor]
  1775 00000BE2 6689F0                  	mov	ax, si
  1776 00000BE5 0FB6D8                  	movzx	ebx, al
  1777 00000BE8 88DA                    	mov	dl, bl
  1778 00000BEA 80E30F                  	and	bl, 0Fh
  1779 00000BED 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1780 00000BF3 A2[F30E0000]            	mov	[msgVendorId+3], al
  1781 00000BF8 88D3                    	mov	bl, dl
  1782 00000BFA C0EB04                  	shr	bl, 4
  1783 00000BFD 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1784 00000C03 A2[F20E0000]            	mov	[msgVendorId+2], al
  1785 00000C08 88E3                    	mov	bl, ah
  1786 00000C0A 88DA                    	mov	dl, bl
  1787 00000C0C 80E30F                  	and	bl, 0Fh
  1788 00000C0F 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1789 00000C15 A2[F10E0000]            	mov	[msgVendorId+1], al
  1790 00000C1A 88D3                    	mov	bl, dl
  1791 00000C1C C0EB04                  	shr	bl, 4
  1792 00000C1F 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1793 00000C25 A2[F00E0000]            	mov	[msgVendorId], al
  1794 00000C2A C1EE10                  	shr	esi, 16
  1795 00000C2D 6689F0                  	mov	ax, si
  1796 00000C30 88C3                    	mov	bl, al
  1797 00000C32 88DA                    	mov	dl, bl
  1798 00000C34 80E30F                  	and	bl, 0Fh
  1799 00000C37 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1800 00000C3D A2[040F0000]            	mov	[msgDevId+3], al
  1801 00000C42 88D3                    	mov	bl, dl
  1802 00000C44 C0EB04                  	shr	bl, 4
  1803 00000C47 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1804 00000C4D A2[030F0000]            	mov	[msgDevId+2], al
  1805 00000C52 88E3                    	mov	bl, ah
  1806 00000C54 88DA                    	mov	dl, bl
  1807 00000C56 80E30F                  	and	bl, 0Fh
  1808 00000C59 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1809 00000C5F A2[020F0000]            	mov	[msgDevId+1], al
  1810 00000C64 88D3                    	mov	bl, dl
  1811 00000C66 C0EB04                  	shr	bl, 4
  1812 00000C69 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1813 00000C6F A2[010F0000]            	mov	[msgDevId], al
  1814                                  
  1815 00000C74 8B35[54100000]          	mov	esi, [bus_dev_fn]
  1816 00000C7A C1EE08                  	shr	esi, 8
  1817 00000C7D 6689F0                  	mov	ax, si
  1818 00000C80 88C3                    	mov	bl, al
  1819 00000C82 88DA                    	mov	dl, bl
  1820 00000C84 80E307                  	and	bl, 7 ; bit 0,1,2
  1821 00000C87 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1822 00000C8D A2[280F0000]            	mov	[msgFncNo+1], al
  1823 00000C92 88D3                    	mov	bl, dl
  1824 00000C94 C0EB03                  	shr	bl, 3
  1825 00000C97 88DA                    	mov	dl, bl
  1826 00000C99 80E30F                  	and	bl, 0Fh
  1827 00000C9C 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1828 00000CA2 A2[1A0F0000]            	mov	[msgDevNo+1], al
  1829 00000CA7 88D3                    	mov	bl, dl
  1830 00000CA9 C0EB04                  	shr	bl, 4
  1831 00000CAC 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1832 00000CB2 A2[190F0000]            	mov	[msgDevNo], al
  1833 00000CB7 88E3                    	mov	bl, ah
  1834 00000CB9 88DA                    	mov	dl, bl
  1835 00000CBB 80E30F                  	and	bl, 0Fh
  1836 00000CBE 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1837 00000CC4 A2[0E0F0000]            	mov	[msgBusNo+1], al
  1838 00000CC9 88D3                    	mov	bl, dl
  1839 00000CCB C0EB04                  	shr	bl, 4
  1840 00000CCE 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1841 00000CD4 A2[0D0F0000]            	mov	[msgBusNo], al
  1842                                  
  1843 00000CD9 66A1[5C100000]          	mov	ax, [ac97_io_base]
  1844 00000CDF 88C3                    	mov	bl, al
  1845 00000CE1 88DA                    	mov	dl, bl
  1846 00000CE3 80E30F                  	and	bl, 0Fh
  1847 00000CE6 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1848 00000CEC A2[410F0000]            	mov	[msgIOBaseAddr+3], al
  1849 00000CF1 88D3                    	mov	bl, dl
  1850 00000CF3 C0EB04                  	shr	bl, 4
  1851 00000CF6 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1852 00000CFC A2[400F0000]            	mov	[msgIOBaseAddr+2], al
  1853 00000D01 88E3                    	mov	bl, ah
  1854 00000D03 88DA                    	mov	dl, bl
  1855 00000D05 80E30F                  	and	bl, 0Fh
  1856 00000D08 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1857 00000D0E A2[3F0F0000]            	mov	[msgIOBaseAddr+1], al
  1858 00000D13 88D3                    	mov	bl, dl
  1859 00000D15 C0EB04                  	shr	bl, 4
  1860 00000D18 8A83[AE0E0000]          	mov	al, [ebx+hex_chars]
  1861 00000D1E A2[3E0F0000]            	mov	[msgIOBaseAddr], al
  1862                                  
  1863                                  	; 24/11/2016
  1864 00000D23 30E4                    	xor	ah, ah
  1865 00000D25 A0[5E100000]            	mov	al, [ac97_int_ln_reg]
  1866 00000D2A B10A                    	mov	cl, 10
  1867 00000D2C F6F1                    	div	cl
  1868 00000D2E 660105[490F0000]        	add	[msgIRQ], ax
  1869 00000D35 20C0                    	and	al, al
  1870 00000D37 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1871 00000D39 A0[4A0F0000]            	mov	al, [msgIRQ+1]
  1872 00000D3E B420                    	mov	ah, ' '
  1873 00000D40 66A3[490F0000]          	mov	[msgIRQ], ax
  1874                                  _w_ac97imsg_:
  1875                                  	; EBX = Message address
  1876                                  	; ECX = Max. message length (or stop on ZERO character)
  1877                                  	;	(1 to 255)
  1878                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1879                                       	sys 	_msg, msgAC97Info, 255, 07h
  1879                              <1> 
  1879                              <1> 
  1879                              <1> 
  1879                              <1> 
  1879                              <1>  %if %0 >= 2
  1879 00000D46 BB[BF0E0000]        <1>  mov ebx, %2
  1879                              <1>  %if %0 >= 3
  1879 00000D4B B9FF000000          <1>  mov ecx, %3
  1879                              <1>  %if %0 = 4
  1879 00000D50 BA07000000          <1>  mov edx, %4
  1879                              <1>  %endif
  1879                              <1>  %endif
  1879                              <1>  %endif
  1879 00000D55 B823000000          <1>  mov eax, %1
  1879                              <1> 
  1879 00000D5A CD40                <1>  int 40h
  1880 00000D5C C3                              retn
  1881                                  
  1882                                  ;=============================================================================
  1883                                  ;               preinitialized data
  1884                                  ;=============================================================================
  1885                                  
  1886                                  ;=============================================================================
  1887                                  ; Protracker effects stuff
  1888                                  ;=============================================================================
  1889                                  
  1890                                  ;-----------------------------------------------------------------------------
  1891                                  ; Effect jump tables
  1892                                  ;-----------------------------------------------------------------------------
  1893                                  
  1894 00000D5D 90<rept>                align 4
  1895                                  
  1896                                  efxtable:
  1897 00000D60 [72080000]              	dd      efxarpeggio	; 0 - arpeggio
  1898 00000D64 [9F050000]              	dd      efxnull	; 1 - porta up
  1899 00000D68 [9F050000]              	dd      efxnull	; 2 - porta down
  1900 00000D6C [BD070000]              	dd      efxtoneporta	; 3 - tone porta
  1901 00000D70 [CC070000]              	dd      efxvibrato	; 4 - vibrato
  1902 00000D74 [9F050000]              	dd      efxnull		; 5 - tone+slide
  1903 00000D78 [9F050000]              	dd      efxnull		; 6 - vibrato+slide
  1904 00000D7C [E9080000]              	dd      efxtremolo	; 7 - tremolo
  1905 00000D80 [9F050000]              	dd      efxnull		; 8 - unused
  1906 00000D84 [F4070000]              	dd      efxsampoffset	; 9 - sample offset
  1907 00000D88 [9F050000]              	dd      efxnull		; A - volume slide
  1908 00000D8C [00080000]              	dd      efxpattjump	; B - pattern jump
  1909 00000D90 [0E080000]              	dd      efxsetvolume	; C - set volume
  1910 00000D94 [1C080000]              	dd      efxbreak	; D - break pattern
  1911 00000D98 [9F050000]              	dd      efxnull		; E - extra effects
  1912 00000D9C [3B080000]              	dd      efxsetspeed	; F - set speed
  1913                                  
  1914                                  efxtable2:
  1915 00000DA0 [A0050000]              	dd      efxarpeggio2	; 0 - arpeggio
  1916 00000DA4 [C2050000]              	dd      efxportaup	; 1 - porta up
  1917 00000DA8 [E8050000]              	dd      efxportadown	; 2 - porta down
  1918 00000DAC [0F060000]              	dd      efxtoneporta2	; 3 - tone porta
  1919 00000DB0 [48060000]              	dd      efxvibrato2	; 4 - vibrato
  1920 00000DB4 [A4060000]              	dd      efxtoneslide	; 5 - tone+slide
  1921 00000DB8 [B1060000]              	dd      efxvibslide	; 6 - vibrato+slide
  1922 00000DBC [D8060000]              	dd      efxtremolo2	; 7 - tremolo
  1923 00000DC0 [9F050000]              	dd      efxnull		; 8 - unused
  1924 00000DC4 [9F050000]              	dd      efxnull		; 9 - sample offset
  1925 00000DC8 [BB060000]              	dd      efxvolslide	; A - volume slide
  1926 00000DCC [9F050000]              	dd      efxnull		; B - pattern jump
  1927 00000DD0 [9F050000]              	dd      efxnull		; C - set volume
  1928 00000DD4 [9F050000]              	dd      efxnull		; D - break pattern
  1929 00000DD8 [9F050000]              	dd      efxnull		; E - extra effects
  1930 00000DDC [9F050000]              	dd      efxnull		; F - set speed
  1931                                  
  1932                                  ;-----------------------------------------------------------------------------
  1933                                  ; Amiga period table
  1934                                  ;-----------------------------------------------------------------------------
  1935                                  
  1936                                  ;PeriodTable0:	
  1937                                  ;	dw	0
  1938                                  PeriodTable:
  1939 00000DE0 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1939 00000DE9 0A000A7009E8086808-
  1939 00000DF2 F00780071407       
  1940 00000DF8 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1940 00000E01 050005B80474043404-
  1940 00000E0A F803C0038A03       
  1941 00000E10 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1941 00000E19 0280025C023A021A02-
  1941 00000E22 FC01E001C501       
  1942 00000E28 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1942 00000E31 0140012E011D010D01-
  1942 00000E3A FE00F000E200       
  1943 00000E40 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1943 00000E49 00A00097008F008700-
  1943 00000E52 7F0078007100       
  1944 00000E58 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1944 00000E61 0050004B0047004300-
  1944 00000E6A 3F003C003800       
  1945 00000E70 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1945 00000E79 002800250023002100-
  1945 00000E82 1F001E001C00       
  1946                                  
  1947                                  ;-----------------------------------------------------------------------------
  1948                                  ; Sinus wave table
  1949                                  ;-----------------------------------------------------------------------------
  1950                                  
  1951                                  SinTable:
  1952 00000E88 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1952 00000E91 C5D4E1             
  1953 00000E94 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1953 00000E9D E1                 
  1954 00000E9E D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1954 00000EA7 19                 
  1955                                  
  1956 00000EA8 0000                    	dw	0
  1957                                  
  1958                                  ;=============================================================================
  1959                                  ;              AC'97 data
  1960                                  ;=============================================================================
  1961                                  
  1962                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  1963                                  ;bps:		db 8 ; bits per sample (8 or 16)
  1964 00000EAA 02                      stmo:		db 2 ; stereo (2) or mono (1) 	  ; 14/10/2017 (stereo)
  1965 00000EAB 10                      bps:		db 16 ; bits per sample (8 or 16) ; 14/10/2017 (16 bits)
  1966                                  Sample_Rate:
  1967 00000EAC 2256                    MixSpeed:	dw 22050 ; Hz
  1968                                  ;MixSpeed:	dw 11025 ; Hz ; 13/10/2017
  1969                                  
  1970                                  ; 13/11/2016
  1971 00000EAE 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1971 00000EB7 3941424344454600   
  1972                                  msgAC97Info:	
  1973 00000EBF 0D0A                    		db 0Dh, 0Ah
  1974 00000EC1 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1974 00000ECA 6F20436F6E74726F6C-
  1974 00000ED3 6C6572202620436F64-
  1974 00000EDC 656320496E666F0D0A 
  1975 00000EE5 56656E646F72204944-     		db "Vendor ID: "
  1975 00000EEE 3A20               
  1976 00000EF0 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1976 00000EF9 6963652049443A20   
  1977 00000F01 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1978 00000F08 4275733A20              		db "Bus: "
  1979 00000F0D 303068204465766963-     msgBusNo:	db "00h Device: "
  1979 00000F16 653A20             
  1980 00000F19 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1980 00000F22 696F6E3A20         
  1981 00000F27 303068                  msgFncNo:	db "00h"
  1982 00000F2A 0D0A                    		db 0Dh, 0Ah
  1983 00000F2C 492F4F204261736520-     		db "I/O Base Address: "
  1983 00000F35 416464726573733A20 
  1984 00000F3E 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1984 00000F47 3A20               
  1985 00000F49 3030                    msgIRQ:		dw 3030h
  1986 00000F4B 0D0A00                  		db 0Dh, 0Ah, 0
  1987                                  ;msgSampleRate:	db "Sample Rate: "
  1988                                  ;msgHertz:	db "00000 Hz ", 0
  1989                                  ;msg8Bits:	db "8 bits ", 0
  1990                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1991                                  ;msg16Bits:	db "16 bits ", 0
  1992                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1993                                  
  1994                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1995                                  ;codec_id:	   dd 0
  1996                                  ;codec_chip_id:	   dd 0
  1997                                  ;codec_vendor_ids: dw 0
  1998                                  ;codec_chip_ids:   dw 0
  1999                                  
  2000                                  ;dword_str:	dd 30303030h, 30303030h
  2001                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2002                                  
  2003                                  ;=============================================================================
  2004                                  ; Copyright Strings & Messages
  2005                                  ;=============================================================================
  2006                                  
  2007                                  msg_usage:
  2008 00000F4E 54696E79204D4F4420-     		db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2008 00000F57 506C6179657220666F-
  2008 00000F60 72205452444F532033-
  2008 00000F69 383620627920457264-
  2008 00000F72 6F67616E2054616E2E-
  2008 00000F7B 20                 
  2009 00000F7C 4F63746F6265722032-     		db	'October 2017.',10,13
  2009 00000F85 3031372E0A0D       
  2010 00000F8B 75736167653A207469-     		db	'usage: tinyplay filename.mod', 10, 13,0
  2010 00000F94 6E79706C6179206669-
  2010 00000F9D 6C656E616D652E6D6F-
  2010 00000FA6 640A0D00           
  2011 00000FAA 31352F31302F323031-     		db	'15/10/2017',0
  2011 00000FB3 3700               
  2012                                  
  2013                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  2014                                  
  2015 00000FB5 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2015 00000FBE 506C61796572207630-
  2015 00000FC7 2E3162206279204361-
  2015 00000FD0 726C6F732048617361-
  2015 00000FD9 6E2E204A756C792031-
  2015 00000FE2 3939332E           
  2016 00000FE6 0A0D00                  		db	10,13,0
  2017 00000FE9 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  2017 00000FF2 64696E67204D6F6475-
  2017 00000FFB 6C652066696C652E0A-
  2017 00001004 0D00               
  2018                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  2019                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  2020                                  ;PortText:	db	'x0h, IRQ '
  2021                                  ;IrqText:	db	'x.',10,13,0
  2022                                  
  2023                                  trdos386_err_msg:
  2024 00001006 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  2024 0000100F 2053797374656D2063-
  2024 00001018 616C6C206572726F72-
  2024 00001021 20210A0D00         
  2025                                  
  2026                                  PlayMsg:
  2027 00001026 0D0A                    		db	0Dh, 0Ah
  2028 00001028 506C6179696E67206D-     		db	"Playing music... "
  2028 00001031 757369632E2E2E20   
  2029 00001039 00                      		db	0
  2030                                  OkMsg:
  2031 0000103A 4F4B2E                  		db	"OK."
  2032                                  NextLine:
  2033 0000103D 0D0A00                  		db	0Dh, 0Ah, 0
  2034                                  
  2035                                  ; 04/10/2017
  2036 00001040 0A                      pattern_shift:	db 10
  2037 00001041 0400                    numtracks:	dw 4
  2038                                  
  2039                                  ;=============================================================================
  2040                                  ;        	uninitialized data
  2041                                  ;=============================================================================
  2042                                  
  2043                                  bss_start:
  2044                                  
  2045                                  ABSOLUTE bss_start
  2046                                  
  2047 00001043 <res 00000001>          alignb 4
  2048                                  
  2049                                  ; 02/10/2017
  2050 00001044 <res 00000004>          bar_start:	resd	1
  2051 00001048 <res 00000004>          bar_stop:	resd	1
  2052                                  ; 06/10/2017
  2053 0000104C <res 00000004>          prev_max:	resd	1
  2054                                  
  2055 00001050 <res 00000004>          dev_vendor:	resd 1
  2056 00001054 <res 00000004>          bus_dev_fn:	resd 1
  2057 00001058 <res 00000004>          stats_cmd:	resd 1
  2058 0000105C <res 00000002>          ac97_io_base:	resw 1
  2059 0000105E <res 00000001>          ac97_int_ln_reg: resb 1
  2060 0000105F <res 00000001>          srb:		resb 1
  2061                                  
  2062                                  ; MODLOAD.ASM
  2063 00001060 <res 00000004>          FileHandle:	resd 1
  2064 00001064 <res 0000043C>          Header:		resb ModHeader.size
  2065                                  
  2066                                  ; MODPLAY.ASM
  2067                                  ;MixSpeed:	    resw 1
  2068                                  
  2069                                  ModInfo:
  2070 000014A0 <res 00000001>          ModInfo.OrderLen:   resb 1
  2071 000014A1 <res 00000001>          ModInfo.ReStart:    resb 1
  2072 000014A2 <res 00000080>          ModInfo.Order:	    resb 128
  2073 00001522 <res 00000004>          ModInfo.Patterns:   resd 1
  2074                                  
  2075 00001526 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2076 00001564 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2077 000015A2 <res 0000003E>          ModInfo.SampLen:    resw 31
  2078 000015E0 <res 0000003E>          ModInfo.SampRep:    resw 31
  2079 0000161E <res 0000003E>          ModInfo.SampRepLen: resw 31
  2080 0000165C <res 0000003E>          ModInfo.SampVol:    resw 31
  2081                                  
  2082                                  ; MODPLAY.ASM
  2083                                  PitchTable:	;resw 857
  2084 0000169A <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2085 0000315C <res 00004100>          VolTable:	resb 16640
  2086 0000725C <res 00001000>          MixBuffer       resb MixBufSize
  2087                                  
  2088                                  ; MODPLAY.ASM
  2089 0000825C <res 00000001>          OrderPos:	resb 1
  2090 0000825D <res 00000001>          Tempo:		resb 1
  2091 0000825E <res 00000001>          TempoWait:	resb 1
  2092 0000825F <res 00000001>          Bpm:		resb 1
  2093 00008260 <res 00000001>          Row:		resb 1
  2094 00008261 <res 00000001>          BreakRow:	resb 1
  2095 00008262 <res 00000002>          BpmSamples:	resw 1
  2096 00008264 <res 00000004>          BufPtr:		resd 1
  2097 00008268 <res 00000002>          BufLen:		resw 1
  2098 0000826A <res 00000004>          BufRep:		resd 1
  2099 0000826E <res 00000004>          Note:		resd 1
  2100                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2101                                  
  2102                                  ; 06/10/2017
  2103 00008272 <res 00000130>          Tracks:		resb TrackInfo.size*8
  2104                                  
  2105                                  mod_file_name:
  2106 000083A2 <res 00000050>          		resb 80
  2107                                  
  2108                                  ; 09/10/2017
  2109 000083F2 <res 00000001>          volume_level:	resb 1
  2110                                  
  2111 000083F3 <res 00000C0D>          alignb 4096
  2112                                  
  2113                                  Audio_Buffer:
  2114 00009000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2115                                  temp_buffer:
  2116 00011000 <res 00002000>          		resb BUFFERSIZE / 4 ; 8192
  2117                                  
  2118 00013000 <res 0000D000>          alignb 65536
  2119                                  
  2120 00020000 <res 00010000>          DMA_Buffer:	resb 2*BUFFERSIZE  ; 65536 ; 09/10/2017 
  2121                                  
  2122                                  file_buffer:
  2123 00030000 <res 00060000>          		resb 65536*6 ; 06/10/2017
  2124                                  EOF:
