     1                                  ; ****************************************************************************
     2                                  ; modplay6.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY6.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 18/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 'tinyply3.s' ('TINYPLY3.PRG') 
    14                                  ; by Erdogan Tan (07/10/2017)
    15                                  ;
    16                                  ; Modified from 'playwav3.s' (13/06/2017)
    17                                  ;
    18                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    19                                  ;			                     (23/06/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  modplay.s -l modplay.txt -o MODPLAY.PRG	
    26                                  ; ****************************************************************************
    27                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    28                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    29                                  
    30                                  ; 01/03/2017
    31                                  ; 16/10/2016
    32                                  ; 29/04/2016
    33                                  ; TRDOS 386 system calls (temporary list!)
    34                                  _ver 	equ 0
    35                                  _exit 	equ 1
    36                                  _fork 	equ 2
    37                                  _read 	equ 3
    38                                  _write	equ 4
    39                                  _open	equ 5
    40                                  _close 	equ 6
    41                                  _wait 	equ 7
    42                                  _creat 	equ 8
    43                                  _link 	equ 9
    44                                  _unlink	equ 10
    45                                  _exec	equ 11
    46                                  _chdir	equ 12
    47                                  _time 	equ 13
    48                                  _mkdir 	equ 14
    49                                  _chmod	equ 15
    50                                  _chown	equ 16
    51                                  _break	equ 17
    52                                  _stat	equ 18
    53                                  _seek	equ 19
    54                                  _tell 	equ 20
    55                                  _mount	equ 21
    56                                  _umount	equ 22
    57                                  _setuid	equ 23
    58                                  _getuid	equ 24
    59                                  _stime	equ 25
    60                                  _quit	equ 26	
    61                                  _intr	equ 27
    62                                  _fstat	equ 28
    63                                  _emt 	equ 29
    64                                  _mdate 	equ 30
    65                                  _video 	equ 31
    66                                  _audio	equ 32
    67                                  _timer	equ 33
    68                                  _sleep	equ 34
    69                                  _msg    equ 35
    70                                  _geterr	equ 36
    71                                  _fpsave	equ 37
    72                                  _pri	equ 38
    73                                  _rele	equ 39
    74                                  _fff	equ 40
    75                                  _fnf	equ 41
    76                                  _alloc	equ 42
    77                                  _dalloc equ 43
    78                                  _calbac equ 44		
    79                                  
    80                                  %macro sys 1-4
    81                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    82                                      ; 03/09/2015	
    83                                      ; 13/04/2015
    84                                      ; Retro UNIX 386 v1 system call.	
    85                                      %if %0 >= 2   
    86                                          mov ebx, %2
    87                                          %if %0 >= 3    
    88                                              mov ecx, %3
    89                                              %if %0 = 4
    90                                                 mov edx, %4   
    91                                              %endif
    92                                          %endif
    93                                      %endif
    94                                      mov eax, %1
    95                                      ;int 30h
    96                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    97                                  %endmacro
    98                                  
    99                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   100                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   101                                  
   102                                  ; 19/06/2017
   103                                  BUFFERSIZE equ 32768
   104                                  
   105                                  ; ----------------------------------------------------------------------------
   106                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   107                                  ;	July 14th, 1993.
   108                                  
   109                                  ;=============================================================================
   110                                  ;  
   111                                  ;=============================================================================
   112                                  
   113                                  [BITS 32]
   114                                  [org 0]
   115                                  
   116                                  Start:
   117                                  	; clear bss
   118 00000000 B9[00000900]            	mov	ecx, EOF
   119 00000005 BF[F20F0000]            	mov	edi, bss_start
   120 0000000A 29F9                    	sub	ecx, edi
   121 0000000C D1E9                    	shr	ecx, 1
   122 0000000E 31C0                    	xor	eax, eax
   123 00000010 F366AB                  	rep	stosw
   124                                  
   125                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   126 00000013 E8F4010000              	call    DetectICH
   127 00000018 731B                    	jnc     short GetFileName
   128                                  
   129                                  _dev_not_ready:
   130                                  ; couldn't find the audio device!
   131                                  	sys	_msg, noDevMsg, 255, 0Fh
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1>  %if %0 >= 2
   131 0000001A BB[19020000]        <1>  mov ebx, %2
   131                              <1>  %if %0 >= 3
   131 0000001F B9FF000000          <1>  mov ecx, %3
   131                              <1>  %if %0 = 4
   131 00000024 BA0F000000          <1>  mov edx, %4
   131                              <1>  %endif
   131                              <1>  %endif
   131                              <1>  %endif
   131 00000029 B823000000          <1>  mov eax, %1
   131                              <1> 
   131 0000002E CD40                <1>  int 40h
   132 00000030 E9B6010000                      jmp     Exit
   133                                  
   134                                  GetFileName:  
   135 00000035 89E6                    	mov	esi, esp
   136 00000037 AD                      	lodsd
   137 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   138                                  		; (program file name & mod file name)
   139 0000003B 0F82B3010000            	jb	pmsg_2017 ; nothing to do
   140                                  
   141 00000041 AD                      	lodsd ; program file name address 
   142 00000042 AD                      	lodsd ; mod file name address (file to be read)
   143 00000043 89C6                    	mov	esi, eax
   144 00000045 BF[C0970000]            	mov	edi, mod_file_name
   145                                  ScanName:       
   146 0000004A AC                      	lodsb
   147 0000004B 84C0                    	test	al, al
   148 0000004D 0F84A1010000            	je	pmsg_2017
   149 00000053 3C20                    	cmp	al, 20h
   150 00000055 74F3                    	je	short ScanName	; scan start of name.
   151 00000057 AA                      	stosb
   152 00000058 B4FF                    	mov	ah, 0FFh
   153                                  a_0:	
   154 0000005A FEC4                    	inc	ah
   155                                  a_1:
   156 0000005C AC                      	lodsb
   157 0000005D AA                      	stosb
   158 0000005E 3C2E                    	cmp	al, '.'
   159 00000060 74F8                    	je	short a_0	
   160 00000062 20C0                    	and	al, al
   161 00000064 75F6                    	jnz	short a_1
   162                                  
   163 00000066 08E4                    	or	ah, ah		; if period NOT found,
   164 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   165                                  SetExt:
   166 0000006A 4F                      	dec	edi
   167 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   168 00000071 C6470400                	mov	byte [edi+4], 0
   169                                  PrintMesg:      
   170                                  	; Prints the Credits Text.
   171                                  	sys	_msg, Credits, 255, 0Fh
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 00000075 BB[D10E0000]        <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 0000007A B9FF000000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 0000007F BA0F000000          <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 00000084 B823000000          <1>  mov eax, %1
   171                              <1> 
   171 00000089 CD40                <1>  int 40h
   172                                  _1:
   173                                  	; 19/06/2017
   174                                  	; Allocate Audio Buffer (for user)
   175                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1>  %if %0 >= 2
   175 0000008B BB00020000          <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   175 00000090 B900800000          <1>  mov ecx, %3
   175                              <1>  %if %0 = 4
   175 00000095 BA[00A00000]        <1>  mov edx, %4
   175                              <1>  %endif
   175                              <1>  %endif
   175                              <1>  %endif
   175 0000009A B820000000          <1>  mov eax, %1
   175                              <1> 
   175 0000009F CD40                <1>  int 40h
   176 000000A1 0F8216010000            	jc	error_exit
   177                                  _2:
   178                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   179                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   180                                  	;jc	error_exit
   181                                  	
   182                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   183                                  	sys	_audio, 0300h, 1, srb 
   183                              <1> 
   183                              <1> 
   183                              <1> 
   183                              <1> 
   183                              <1>  %if %0 >= 2
   183 000000A7 BB00030000          <1>  mov ebx, %2
   183                              <1>  %if %0 >= 3
   183 000000AC B901000000          <1>  mov ecx, %3
   183                              <1>  %if %0 = 4
   183 000000B1 BA[05100000]        <1>  mov edx, %4
   183                              <1>  %endif
   183                              <1>  %endif
   183                              <1>  %endif
   183 000000B6 B820000000          <1>  mov eax, %1
   183                              <1> 
   183 000000BB CD40                <1>  int 40h
   184 000000BD 0F82FA000000            	jc	error_exit
   185                                  
   186                                  LoadMod:  
   187 000000C3 BF[C0970000]            	mov	edi, mod_file_name
   188 000000C8 E819020000              	call    LoadModule	; Load the MODule...
   189                                  	; 08/10/2017
   190 000000CD 731B                    	jnc	short _3	; any error loading?
   191                                  
   192                                  	; yes, print error and Exit.
   193                                  
   194                                  	sys	_msg, ErrorMesg, 255, 0Fh
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1>  %if %0 >= 2
   194 000000CF BB[050F0000]        <1>  mov ebx, %2
   194                              <1>  %if %0 >= 3
   194 000000D4 B9FF000000          <1>  mov ecx, %3
   194                              <1>  %if %0 = 4
   194 000000D9 BA0F000000          <1>  mov edx, %4
   194                              <1>  %endif
   194                              <1>  %endif
   194                              <1>  %endif
   194 000000DE B823000000          <1>  mov eax, %1
   194                              <1> 
   194 000000E3 CD40                <1>  int 40h
   195                                  
   196 000000E5 E901010000              	jmp     Exit
   197                                  
   198                                  _3:
   199                                  	; 10/06/2017
   200                                  	sys	_audio, 0E00h ; get audio controller info
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1>  %if %0 >= 2
   200 000000EA BB000E0000          <1>  mov ebx, %2
   200                              <1>  %if %0 >= 3
   200                              <1>  mov ecx, %3
   200                              <1>  %if %0 = 4
   200                              <1>  mov edx, %4
   200                              <1>  %endif
   200                              <1>  %endif
   200                              <1>  %endif
   200 000000EF B820000000          <1>  mov eax, %1
   200                              <1> 
   200 000000F4 CD40                <1>  int 40h
   201 000000F6 0F82C1000000            	jc	error_exit
   202                                  
   203                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   204                                  	;jne	_dev_not_ready	
   205                                  
   206                                  	; EAX = IRQ Number in AL
   207                                  	;	Audio Device Number in AH 
   208                                  	; EBX = DEV/VENDOR ID
   209                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   210                                  	; ECX = BUS/DEV/FN 
   211                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   212                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   213                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   214                                  	;      (Low word, DX = NAMBAR address)
   215                                  
   216 000000FC A2[04100000]            	mov	[ac97_int_ln_reg], al
   217 00000101 891D[F40F0000]          	mov	[dev_vendor], ebx
   218 00000107 890D[F80F0000]          	mov	[bus_dev_fn], ecx
   219 0000010D 668915[00100000]        	mov	[ac97_NamBar], dx
   220                                  	;mov	[ac97_NamBar], dx
   221                                  	;shr	dx, 16
   222                                  	;mov	[ac97_NabmBar], dx
   223 00000114 8915[00100000]          	mov	[ac97_NamBar], edx	
   224                                    
   225 0000011A E8350A0000              	call	write_audio_dev_info 
   226                                  
   227                                  PlayNow: 
   228 0000011F E829090000              	call    StartPlaying
   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 00000124 BF[00200100]            	mov	edi, temp_buffer
   236 00000129 BB00200000              	mov	ebx, BUFFERSIZE / 4
   237 0000012E E83A080000              	call	GetSamples
   238 00000133 0F8284000000            	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 00000139 E8F0090000              	call 	ConvertSamples
   247                                  
   248                                  	;mov	ecx, 128	; Make a lookup table
   249 0000013E B180                    	mov	cl, 128
   250 00000140 31DB                    	xor     ebx, ebx	; for fastest pixel
   251 00000142 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   252                                  MakeOfs:        
   253 00000147 668993[C0950000]        	mov     [RowOfs+ebx], dx
   254 0000014E 668993[C2950000]        	mov     [RowOfs+ebx+2], dx
   255 00000155 6681C24001              	add     dx, 320
   256 0000015A 83C304                  	add     ebx, 4
   257 0000015D E2E8                    	loop    MakeOfs
   258                                  
   259                                  	; 23/06/2017
   260                                  	; Map DMA buffer to user's memory space
   261                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
   261                              <1> 
   261                              <1> 
   261                              <1> 
   261                              <1> 
   261                              <1>  %if %0 >= 2
   261 0000015F BB000D0000          <1>  mov ebx, %2
   261                              <1>  %if %0 >= 3
   261 00000164 B900000100          <1>  mov ecx, %3
   261                              <1>  %if %0 = 4
   261 00000169 BA[00000200]        <1>  mov edx, %4
   261                              <1>  %endif
   261                              <1>  %endif
   261                              <1>  %endif
   261 0000016E B820000000          <1>  mov eax, %1
   261                              <1> 
   261 00000173 CD40                <1>  int 40h
   262                                  	;jc	error_exit
   263                                  
   264                                  	; Set Master Volume Level
   265                                  	sys	_audio, 0B00h, 1D1Dh
   265                              <1> 
   265                              <1> 
   265                              <1> 
   265                              <1> 
   265                              <1>  %if %0 >= 2
   265 00000175 BB000B0000          <1>  mov ebx, %2
   265                              <1>  %if %0 >= 3
   265 0000017A B91D1D0000          <1>  mov ecx, %3
   265                              <1>  %if %0 = 4
   265                              <1>  mov edx, %4
   265                              <1>  %endif
   265                              <1>  %endif
   265                              <1>  %endif
   265 0000017F B820000000          <1>  mov eax, %1
   265                              <1> 
   265 00000184 CD40                <1>  int 40h
   266                                  
   267                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   268                                  	
   269                                  	; Start	to play
   270 00000186 A0[480F0000]            	mov	al, [bps]
   271 0000018B C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   272 0000018E D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   273 00000190 8A1D[470F0000]          	mov	bl, [stmo]
   274 00000196 FECB                    	dec	bl
   275 00000198 08C3                    	or	bl, al
   276 0000019A 668B0D[490F0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   277 000001A1 B704                    	mov	bh, 4 ; start to play	
   278                                  	sys	_audio
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1>  %if %0 >= 2
   278                              <1>  mov ebx, %2
   278                              <1>  %if %0 >= 3
   278                              <1>  mov ecx, %3
   278                              <1>  %if %0 = 4
   278                              <1>  mov edx, %4
   278                              <1>  %endif
   278                              <1>  %endif
   278                              <1>  %endif
   278 000001A3 B820000000          <1>  mov eax, %1
   278                              <1> 
   278 000001A8 CD40                <1>  int 40h
   279                                      
   280                                  	;; SETUP SIGNAL RESPONSE BYTE
   281                                  	;; 06/03/2017
   282                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   283                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   284                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   285                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   286                                  	;sys	_calbac
   287                                  	;jc	short error_exit
   288                                  
   289                                  	; DIRECT VGA MEMORY ACCESS
   290                                  	; bl = 0, bh = 5
   291                                  	; Direct access/map to VGA memory (0A0000h)
   292                                  
   293                                  	sys	_video, 0500h
   293                              <1> 
   293                              <1> 
   293                              <1> 
   293                              <1> 
   293                              <1>  %if %0 >= 2
   293 000001AA BB00050000          <1>  mov ebx, %2
   293                              <1>  %if %0 >= 3
   293                              <1>  mov ecx, %3
   293                              <1>  %if %0 = 4
   293                              <1>  mov edx, %4
   293                              <1>  %endif
   293                              <1>  %endif
   293                              <1>  %endif
   293 000001AF B81F000000          <1>  mov eax, %1
   293                              <1> 
   293 000001B4 CD40                <1>  int 40h
   294 000001B6 3D00000A00              	cmp	eax, 0A0000h
   295 000001BB 7418                    	je	short _a3
   296                                  error_exit:
   297                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   297                              <1> 
   297                              <1> 
   297                              <1> 
   297                              <1> 
   297                              <1>  %if %0 >= 2
   297 000001BD BB[220F0000]        <1>  mov ebx, %2
   297                              <1>  %if %0 >= 3
   297 000001C2 B9FF000000          <1>  mov ecx, %3
   297                              <1>  %if %0 = 4
   297 000001C7 BA0E000000          <1>  mov edx, %4
   297                              <1>  %endif
   297                              <1>  %endif
   297                              <1>  %endif
   297 000001CC B823000000          <1>  mov eax, %1
   297                              <1> 
   297 000001D1 CD40                <1>  int 40h
   298 000001D3 EB16                    	jmp	short Exit
   299                                  
   300                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   301                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   302                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   303                                  ;       second, or the module will sound "looped".
   304                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   305                                  ;       the polling is called from my routine, and then the irq 0 must be
   306                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   307                                  ;       samples played by the Sound Blaster. Note that some samples are
   308                                  ;       discarded in the next code, just for fun!
   309                                  
   310                                  _a3:
   311 000001D5 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   312 000001D9 CD31                    	int     31h
   313                                  
   314                                  	; 24/06/2017
   315 000001DB E864000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   316                                  
   317                                  _s_exit:
   318 000001E0 E818090000              	call	StopPlaying	; STOP!
   319                                  
   320 000001E5 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   321 000001E9 CD31                    	int     31h
   322                                  Exit:           
   323                                  	;call    FreeModule	; Free MODule core.
   324                                  	
   325                                  	sys 	_exit	; Bye !
   325                              <1> 
   325                              <1> 
   325                              <1> 
   325                              <1> 
   325                              <1>  %if %0 >= 2
   325                              <1>  mov ebx, %2
   325                              <1>  %if %0 >= 3
   325                              <1>  mov ecx, %3
   325                              <1>  %if %0 = 4
   325                              <1>  mov edx, %4
   325                              <1>  %endif
   325                              <1>  %endif
   325                              <1>  %endif
   325 000001EB B801000000          <1>  mov eax, %1
   325                              <1> 
   325 000001F0 CD40                <1>  int 40h
   326                                  here:
   327 000001F2 EBFE                    	jmp	short here
   328                                  
   329                                  pmsg_2017:
   330                                  	sys	_msg, msg_2017, 255, 0Fh
   330                              <1> 
   330                              <1> 
   330                              <1> 
   330                              <1> 
   330                              <1>  %if %0 >= 2
   330 000001F4 BB[690E0000]        <1>  mov ebx, %2
   330                              <1>  %if %0 >= 3
   330 000001F9 B9FF000000          <1>  mov ecx, %3
   330                              <1>  %if %0 = 4
   330 000001FE BA0F000000          <1>  mov edx, %4
   330                              <1>  %endif
   330                              <1>  %endif
   330                              <1>  %endif
   330 00000203 B823000000          <1>  mov eax, %1
   330                              <1> 
   330 00000208 CD40                <1>  int 40h
   331 0000020A EBDF                    	jmp	short Exit
   332                                  
   333                                  DetectICH:
   334                                  	; 24/06/2017
   335                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   336                                          sys	_audio, 0102h
   336                              <1> 
   336                              <1> 
   336                              <1> 
   336                              <1> 
   336                              <1>  %if %0 >= 2
   336 0000020C BB02010000          <1>  mov ebx, %2
   336                              <1>  %if %0 >= 3
   336                              <1>  mov ecx, %3
   336                              <1>  %if %0 = 4
   336                              <1>  mov edx, %4
   336                              <1>  %endif
   336                              <1>  %endif
   336                              <1>  %endif
   336 00000211 B820000000          <1>  mov eax, %1
   336                              <1> 
   336 00000216 CD40                <1>  int 40h
   337 00000218 C3                      	retn
   338                                  
   339                                  noDevMsg:
   340 00000219 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   340 00000222 61626C6520746F2066-
   340 0000022B 696E64204143393720-
   340 00000234 617564696F20646576-
   340 0000023D 696365210D0A00     
   341                                  
   342                                  ;ac97_int_handler:
   343                                  ;	; 19/06/2017
   344                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   345                                  ;
   346                                  ;	sys	_rele ; return from callback service 
   347                                  ;	; we must not come here !
   348                                  ;	sys	_exit
   349                                  
   350                                  ;=============================================================================
   351                                  ;      
   352                                  ;=============================================================================
   353                                  
   354                                  PlayMod:
   355                                  	; 23/06/2017   
   356                                  	; 21/06/2017
   357                                  	; 19/06/2017
   358                                  
   359                                  	; 05/03/2017 (TRDOS 386)
   360                                  	; 14/02/2017
   361                                  	; 13/02/2017
   362                                  	; 08/12/2016
   363                                  	; 28/11/2016
   364                                  
   365 00000244 EB10                         	jmp	short modp_gs ; 23/06/2017
   366                                  p_loop:
   367 00000246 803D[05100000]00        	cmp	byte [srb], 0
   368 0000024D 7621                    	jna	short q_loop
   369 0000024F C605[05100000]00        	mov	byte [srb], 0
   370                                  modp_gs:
   371                                  	;mov	edi, Audio_Buffer
   372                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   373                                  	;call	GetSamples
   374                                  
   375                                  	; 24/06/2017
   376                                          ; load 8192 bytes into audio buffer
   377 00000256 BF[00200100]            	mov	edi, temp_buffer
   378 0000025B BB00200000              	mov	ebx, BUFFERSIZE / 4
   379 00000260 E808070000              	call	GetSamples
   380 00000265 0F8252FFFFFF            	jc	error_exit
   381                                  
   382                                  	; 24/06/2017
   383                                  	; 8 bit to 16 bit (*2)
   384                                  	; mono to stereo (*2)
   385                                  	; 4* (BUFFERSIZE/4) 
   386                                  	; source = temp_buffer
   387                                  	; destination = Audio_Buffer
   388 0000026B E8BE080000              	call 	ConvertSamples
   389                                  
   390                                  q_loop:
   391 00000270 B401                    	mov     ah, 1		; any key pressed?
   392 00000272 CD32                    	int     32h		; no, Loop.
   393 00000274 7405                    	jz	short r_loop
   394                                  
   395 00000276 B400                    	mov     ah, 0		; flush key buffer...
   396 00000278 CD32                    	int     32h
   397                                  q_return:
   398 0000027A C3                      	retn
   399                                  r_loop:
   400                                  	; Get Current DMA buffer Pointer 
   401                                  	; 23/06/2017
   402                                  	; bh = 15, get current pointer (DMA buffer offset)
   403                                  	; bl = 0, for PCM OUT
   404                                  	; ecx = 0
   405                                  	;
   406                                  	sys	_audio, 0F00h, 0
   406                              <1> 
   406                              <1> 
   406                              <1> 
   406                              <1> 
   406                              <1>  %if %0 >= 2
   406 0000027B BB000F0000          <1>  mov ebx, %2
   406                              <1>  %if %0 >= 3
   406 00000280 B900000000          <1>  mov ecx, %3
   406                              <1>  %if %0 = 4
   406                              <1>  mov edx, %4
   406                              <1>  %endif
   406                              <1>  %endif
   406                              <1>  %endif
   406 00000285 B820000000          <1>  mov eax, %1
   406                              <1> 
   406 0000028A CD40                <1>  int 40h
   407                                  ScopeLoop:
   408 0000028C BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   409                                  	; 23/06/2017
   410 00000291 BE[00000200]            	mov     esi, DMA_Buffer
   411 00000296 01C6                    	add     esi, eax	; add offset value
   412                                  	; 24/06/2017
   413 00000298 B9[00FB0200]            	mov	ecx, DMA_Buffer + (65536 - (320*4))
   414 0000029D 39CE                    	cmp	esi, ecx 
   415 0000029F 7602                    	jna	short _4
   416 000002A1 89CE                    	mov	esi, ecx
   417                                  _4:
   418 000002A3 31C9                    	xor     ecx, ecx	; to be drawed ...
   419 000002A5 31D2                    	xor     edx, edx
   420                                  DrawLoop:       
   421 000002A7 89D3                    	mov     ebx, edx	; (save Index)
   422 000002A9 668BBB[40930000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   423 000002B0 C60700                  	mov     byte [edi], 0	; erase it!
   424                                  	; 24/06/2017
   425 000002B3 AD                      	lodsd
   426 000002B4 80C480                  	add	ah, 80h
   427 000002B7 88E3                    	mov	bl, ah
   428                                  	;
   429 000002B9 30FF                    	xor     bh, bh
   430 000002BB 66D1E3                  	shl     bx, 1
   431 000002BE 668BBB[C0950000]        	mov     di, [RowOfs+ebx]
   432 000002C5 6601CF                  	add     di, cx
   433 000002C8 6689D3                  	mov     bx, dx		; (restore Index)
   434 000002CB 6689BB[40930000]        	mov     [Scope+ebx], di	; save new address...
   435 000002D2 C6070A                  	mov     byte [edi], 10	; and DRAW.
   436 000002D5 6683C202                	add     dx, 2		; the next pixel...
   437 000002D9 41                      	inc     ecx
   438 000002DA 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   439 000002DF 72C6                    	jb      short DrawLoop
   440 000002E1 E960FFFFFF              	jmp	p_loop
   441                                  
   442                                  
   443                                  ;=============================================================================
   444                                  ;               MODLOAD.ASM
   445                                  ;=============================================================================
   446                                  
   447                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   448                                  ;	July 10th, 1993.
   449                                  
   450                                  ; STRUCTURES
   451                                  
   452                                  struc ModSample
   453 00000000 <res 00000016>          .msName:	resb 22
   454 00000016 <res 00000002>          .msLength:	resw 1
   455 00000018 <res 00000001>          .msFinetune:	resb 1
   456 00000019 <res 00000001>          .msVolume:	resb 1
   457 0000001A <res 00000002>          .msRepeat:	resw 1
   458 0000001C <res 00000002>          .msRepLen:	resw 1
   459                                  .size:
   460                                  endstruc
   461                                  
   462                                  struc ModHeader
   463 00000000 <res 00000014>          .mhName:	resb 20
   464 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   465 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   466 000003B7 <res 00000001>          .mhReStart:	resb 1
   467 000003B8 <res 00000080>          .mhOrder:	resb 128
   468 00000438 <res 00000004>          .mhSign:	resw 2
   469                                  .size:	
   470                                  endstruc
   471                                  
   472                                  struc ModInfoRec
   473 00000000 <res 00000001>          .OrderLen:	resb 1
   474 00000001 <res 00000001>          .ReStart:	resb 1
   475 00000002 <res 00000080>          .Order:	resb 128
   476 00000082 <res 00000004>          .Patterns:	resd 1
   477 00000086 <res 0000003E>          .SampOfs:	resw 31
   478 000000C4 <res 0000003E>          .SampSeg:	resw 31
   479 00000102 <res 0000003E>          .SampLen:	resw 31
   480 00000140 <res 0000003E>          .SampRep:	resw 31
   481 0000017E <res 0000003E>          .SampRepLen:	resw 31
   482 000001BC <res 0000003E>          .SampVol:	resw 31
   483                                  .size:	
   484                                  endstruc
   485                                  
   486                                  ; CODE
   487                                  
   488                                  ; 07/10/2017 (modplay3.s)
   489                                  ; tinyply3.s
   490                                  ; 06/10/2017
   491                                  ; 04/10/2017
   492                                  ; /* MOD FileFormat */
   493                                  
   494                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   495                                  ID_FLT4 equ 34544C46h ; "FLT4"
   496                                  ID_8CHN equ 4E484338h ; "8CHN"
   497                                  ID_FLT8 equ 34544C46h ; "FLT8"
   498                                  
   499                                  ; CODE
   500                                  
   501                                  LoadModule:
   502                                  	; edi = file name address
   503                                  
   504 000002E6 60                      	pushad
   505                                  
   506 000002E7 E878010000              	call    ClearModInfo
   507                                  OpenFile:       
   508                                  	; ebx = ASCIIZ file name address
   509                                  	; ecx = open mode (0 = open for read)	
   510                                  	sys	_open, edi, 0 ; open for reading
   510                              <1> 
   510                              <1> 
   510                              <1> 
   510                              <1> 
   510                              <1>  %if %0 >= 2
   510 000002EC 89FB                <1>  mov ebx, %2
   510                              <1>  %if %0 >= 3
   510 000002EE B900000000          <1>  mov ecx, %3
   510                              <1>  %if %0 = 4
   510                              <1>  mov edx, %4
   510                              <1>  %endif
   510                              <1>  %endif
   510                              <1>  %endif
   510 000002F3 B805000000          <1>  mov eax, %1
   510                              <1> 
   510 000002F8 CD40                <1>  int 40h
   511 000002FA 0F8262010000            	jc	Failed
   512 00000300 A3[06100000]            	mov     [FileHandle], eax
   513                                  ReadHeader:
   514                                  	; ebx = File handle
   515                                  	; ecx = Buffer address
   516                                  	; edx = Byte count
   517                                  	sys	_read, [FileHandle], Header, ModHeader.size
   517                              <1> 
   517                              <1> 
   517                              <1> 
   517                              <1> 
   517                              <1>  %if %0 >= 2
   517 00000305 8B1D[06100000]      <1>  mov ebx, %2
   517                              <1>  %if %0 >= 3
   517 0000030B B9[0A100000]        <1>  mov ecx, %3
   517                              <1>  %if %0 = 4
   517 00000310 BA3C040000          <1>  mov edx, %4
   517                              <1>  %endif
   517                              <1>  %endif
   517                              <1>  %endif
   517 00000315 B803000000          <1>  mov eax, %1
   517                              <1> 
   517 0000031A CD40                <1>  int 40h
   518 0000031C 0F8231010000            	jc      CloseFile
   519                                  CheckMK:  
   520                                  	; 04/10/2017
   521 00000322 A1[42140000]            	mov	eax, [Header+ModHeader.mhSign]
   522                                        
   523 00000327 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   524                                  	;je	short Is4chnMod
   525 0000032C 742B                    	je	short IsModFile
   526                                  CheckFLT4:
   527 0000032E 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   528                                  	;je	short Is4chnMod
   529 00000333 7424                    	je	short IsModFile
   530                                  Check8CHN:
   531 00000335 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   532 0000033A 740D                    	je	short Is8chnMod
   533                                  CheckFLT8:
   534 0000033C 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   535                                  	; 06/10/2017
   536 00000341 7406                    	je	short Is8chnMod
   537 00000343 F9                      	stc
   538 00000344 E90A010000              	jmp	CloseFile
   539                                  Is8chnMod:
   540 00000349 C605[430F0000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   541 00000350 C605[420F0000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   542 00000357 EB00                    	jmp	short IsModFile
   543                                  ;Is4chnMod:
   544                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   545                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   546                                  
   547                                  IsModFile:
   548 00000359 A0[C0130000]            	mov     al, [Header+ModHeader.mhOrderLen]
   549 0000035E A2[46140000]            	mov     [ModInfo.OrderLen], al
   550                                  
   551 00000363 A0[C1130000]            	mov     al, [Header+ModHeader.mhReStart]
   552 00000368 3A05[C0130000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   553 0000036E 7202                    	jb      short SetReStart
   554 00000370 B07F                    	mov     al, 7Fh
   555                                  SetReStart:
   556 00000372 A2[47140000]            	mov     [ModInfo.ReStart], al
   557                                  
   558                                  	;mov	ecx, 128
   559 00000377 66B98000                	mov	cx, 128
   560 0000037B 31D2                    	xor     edx, edx
   561 0000037D 31DB                    	xor     ebx, ebx
   562                                  CopyOrder:
   563 0000037F 8AB3[C2130000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   564 00000385 88B3[48140000]          	mov     [ModInfo.Order+ebx], dh
   565 0000038B 38D6                    	cmp     dh, dl
   566 0000038D 7202                    	jb      short NextOrder
   567 0000038F 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   568                                  NextOrder:
   569 00000391 43                      	inc     ebx
   570 00000392 E2EB                    	loop    CopyOrder
   571                                  AllocPatterns:  
   572 00000394 81E2FF000000            	and	edx, 0FFh
   573                                  	; 04/10/2017
   574                                  	;inx	dx  ; 12/03/2017
   575 0000039A FEC2                    	inc	dl
   576                                  	; dl = number of patterns (04/07/2017)
   577 0000039C 8A0D[420F0000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   578 000003A2 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   579                                  	     ; *2048 ; (byte count of patterns *64*8*4)
   580                                  	;
   581 000003A4 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   582                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   583 000003A6 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   584                                  	;
   585 000003AB 890D[C8140000]          	mov	[ModInfo.Patterns], ecx
   586                                  	;
   587 000003B1 01CD                    	add	ebp, ecx ; next offset for samples
   588                                  ReadPatterns:  
   589                                  	;mov	ebx, [FileHandle] 
   590                                  	; ebx = File handle
   591                                  	; ecx = Buffer address
   592                                  	; edx = Byte count
   593                                  	sys	_read, [FileHandle]
   593                              <1> 
   593                              <1> 
   593                              <1> 
   593                              <1> 
   593                              <1>  %if %0 >= 2
   593 000003B3 8B1D[06100000]      <1>  mov ebx, %2
   593                              <1>  %if %0 >= 3
   593                              <1>  mov ecx, %3
   593                              <1>  %if %0 = 4
   593                              <1>  mov edx, %4
   593                              <1>  %endif
   593                              <1>  %endif
   593                              <1>  %endif
   593 000003B9 B803000000          <1>  mov eax, %1
   593                              <1> 
   593 000003BE CD40                <1>  int 40h
   594 000003C0 0F828D000000            	jc      CloseFile
   595                                  
   596                                  	; patterns have been loaded here... (04/07/2017)
   597                                  
   598 000003C6 BE[1E100000]            	mov	esi, Header+ModHeader.mhSamples
   599 000003CB 31FF                    	xor     edi, edi
   600                                  CopySamples:
   601 000003CD 668B4616                	mov     ax, [esi+ModSample.msLength]
   602 000003D1 86C4                    	xchg    al, ah
   603 000003D3 66D1E0                  	shl     ax, 1
   604 000003D6 668987[48150000]        	mov     [ModInfo.SampLen+edi], ax
   605 000003DD 8A4619                  	mov     al, [esi+ModSample.msVolume]
   606 000003E0 30E4                    	xor     ah, ah
   607 000003E2 668987[02160000]        	mov     [ModInfo.SampVol+edi], ax
   608 000003E9 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   609 000003ED 86C4                    	xchg    al, ah
   610 000003EF 66D1E0                  	shl     ax, 1
   611 000003F2 668987[86150000]        	mov     [ModInfo.SampRep+edi], ax
   612 000003F9 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   613 000003FD 86C4                    	xchg    al, ah
   614 000003FF 66D1E0                  	shl     ax, 1
   615 00000402 668987[C4150000]        	mov     [ModInfo.SampRepLen+edi], ax
   616 00000409 83C61E                  	add     esi, ModSample.size
   617 0000040C 6683C702                	add     di, 2
   618 00000410 6683FF3E                	cmp     di, 2*31
   619 00000414 72B7                    	jb      short CopySamples
   620                                  
   621 00000416 31F6                    	xor     esi, esi
   622                                  AllocSamples:
   623 00000418 0FB796[48150000]        	movzx	edx, word [ModInfo.SampLen+esi]
   624                                  	; 07/10/2017
   625                                  	;shr	dx, 4 ; ***
   626 0000041F 21D2                    	and	edx, edx
   627 00000421 7426                    	jz      short NextSample
   628                                  	;inc	dx  ; number of paragraphs ; ***
   629                                  	;shl	dx, 4 ; ***
   630 00000423 89E8                    	mov	eax, ebp
   631 00000425 668986[CC140000]        	mov	[ModInfo.SampOfs+esi], ax
   632 0000042C C1E810                  	shr	eax, 16
   633 0000042F 668986[0A150000]        	mov	[ModInfo.SampSeg+esi], ax
   634 00000436 89E9                    	mov	ecx, ebp
   635 00000438 01D5                    	add	ebp, edx ; next offset for sample 
   636                                  ReadSample:
   637                                  	;mov	ebx, [FileHandle]
   638                                  	;movzx  edx, [ModInfo.SampLen+esi]
   639                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   640                                  
   641                                  	; ebx = File handle
   642                                  	; ecx = Buffer address
   643                                  	; edx = Byte count
   644                                  	sys	_read, [FileHandle]
   644                              <1> 
   644                              <1> 
   644                              <1> 
   644                              <1> 
   644                              <1>  %if %0 >= 2
   644 0000043A 8B1D[06100000]      <1>  mov ebx, %2
   644                              <1>  %if %0 >= 3
   644                              <1>  mov ecx, %3
   644                              <1>  %if %0 = 4
   644                              <1>  mov edx, %4
   644                              <1>  %endif
   644                              <1>  %endif
   644                              <1>  %endif
   644 00000440 B803000000          <1>  mov eax, %1
   644                              <1> 
   644 00000445 CD40                <1>  int 40h
   645 00000447 720A                    	jc      short CloseFile
   646                                  
   647                                  NextSample:
   648 00000449 6683C602                	add     si, 2
   649 0000044D 6683FE3E                	cmp     si, 2*31
   650 00000451 72C5                    	jb      short AllocSamples
   651                                  CloseFile:      
   652 00000453 9C                      	pushf
   653                                  	sys	_close, [FileHandle]
   653                              <1> 
   653                              <1> 
   653                              <1> 
   653                              <1> 
   653                              <1>  %if %0 >= 2
   653 00000454 8B1D[06100000]      <1>  mov ebx, %2
   653                              <1>  %if %0 >= 3
   653                              <1>  mov ecx, %3
   653                              <1>  %if %0 = 4
   653                              <1>  mov edx, %4
   653                              <1>  %endif
   653                              <1>  %endif
   653                              <1>  %endif
   653 0000045A B806000000          <1>  mov eax, %1
   653                              <1> 
   653 0000045F CD40                <1>  int 40h
   654 00000461 9D                      	popf
   655                                  Failed:       
   656 00000462 61                      	popad
   657 00000463 C3                      	retn
   658                                  
   659                                  FreeModule:
   660                                  	; Erdogan Tan (13/02/2017)
   661                                  	; nothing to do here for memory de-allocation
   662                                  ClearModInfo:
   663 00000464 57                      	push	edi
   664 00000465 BF[46140000]            	mov	edi, ModInfo
   665 0000046A B9FA010000              	mov     ecx, ModInfoRec.size
   666                                  	;cld
   667 0000046F 30C0                    	xor     al, al
   668 00000471 F3AA                    	rep     stosb
   669 00000473 5F                      	pop	edi
   670 00000474 C3                      	retn
   671                                  
   672                                  ;=============================================================================
   673                                  ;               MODPLAY.ASM
   674                                  ;=============================================================================
   675                                  
   676                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   677                                  ;	July 23th, 1993.
   678                                  
   679                                  ; EQUATES
   680                                  
   681                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   682                                  DefTempo        equ 6
   683                                  DefBpm          equ 125
   684                                  MidCRate        equ 8448
   685                                  MixBufSize	equ 4096
   686                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   687                                  
   688                                  ; STRUCTURES
   689                                  
   690                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   691 00000000 <res 00000004>          .Samples:	resd 1
   692                                  ;.Position:	resw 1
   693 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   694 00000008 <res 00000002>          .Len:	resw 1
   695 0000000A <res 00000002>          .Repeat:	resw 1
   696 0000000C <res 00000002>          .RepLen:	resw 1
   697 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   698 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   699                                  ;.Error:	resb 1
   700                                  ;.Reserved:	resb 1 ; 01/10/2017
   701 00000010 <res 00000002>          .Period:	resw 1 ; Period
   702 00000012 <res 00000002>          .Pitch:	resw 1 
   703 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   704 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   705 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   706 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   707 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   708 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   709 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   710                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   711 0000001D <res 00000001>          .Error:	resb 1 ; 01/10/2017
   712 0000001E <res 00000006>          .Arp:	resw 3
   713 00000024 <res 00000002>          .ArpIndex:	resw 1
   714                                  .size:	; 38 bytes ; 01/10/2017 -  TRDOS 386
   715                                  endstruc
   716                                  
   717                                  ; CODE
   718                                  
   719                                  ;--------------------------------------------------------------------------
   720                                  ; updatechannel - update the track using the current effect
   721                                  ;--------------------------------------------------------------------------
   722                                  ; 
   723                                  ;--------------------------------------------------------------------------
   724                                  ; BeatTrack:  Process the next beat in one track.
   725                                  ;  In:
   726                                  ;    ds:di -  Track info Address.
   727                                  ;--------------------------------------------------------------------------
   728                                  
   729                                  ; edi = Track info address
   730                                  
   731                                  updatechannel:
   732                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   733                                  
   734 00000475 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   735                                  
   736                                  	;test   dx, dx
   737                                  	;je     short None
   738                                  	;cmp    dh, 00h
   739                                  	;je     short Arpeggio
   740                                  	;cmp    dh, 01h
   741                                  	;je     short PortUp
   742                                  	;cmp    dh, 02h
   743                                  	;je     short PortDown
   744                                  	;cmp    dh, 03h
   745                                  	;je     TonePort
   746                                  	;cmp    dh, 04h
   747                                  	;je     Vibrato
   748                                  	;cmp    dh, 05h
   749                                  	;je     PortSlide
   750                                  	;cmp    dh, 06h
   751                                  	;je     VibSlide
   752                                  	;cmp    dh, 0Ah
   753                                  	;je     VolSlide
   754                                  	;retn
   755                                  
   756 00000479 0FB6C6                  	movzx	eax, dh
   757 0000047C 240F                    	and	al, 0Fh
   758 0000047E FF2485[600D0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   759                                  efxnull:
   760                                  None:           
   761 00000485 C3                      	retn
   762                                  efxarpeggio2:
   763                                  	; 01/10/2017
   764 00000486 84D2                    	test    dl, dl
   765 00000488 74FB                    	jz      short efxnull
   766                                  Arpeggio:
   767 0000048A 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   768 0000048E 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   769 00000493 66894712                	mov     [edi+TrackInfo.Pitch], ax
   770 00000497 6683C302                	add     bx, 2
   771 0000049B 6683FB06                	cmp     bx, 6
   772 0000049F 7202                    	jb      short SetArpIndex
   773 000004A1 31DB                    	xor     ebx, ebx
   774                                  SetArpIndex:
   775 000004A3 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   776 000004A7 C3                      	retn
   777                                  efxportaup:
   778                                  PortUp:
   779 000004A8 30F6                    	xor     dh, dh
   780                                  	;mov	bx, [edi+TrackInfo.Period]
   781 000004AA 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   782 000004AE 6629D3                  	sub     bx, dx
   783                                  	;cmp	bx, 113
   784 000004B1 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   785 000004B5 7D04                    	jge     short NotSmall
   786                                  	;mov	bx, 113
   787 000004B7 66BB1C00                	mov	bx, 28 ; 01/10/2017
   788                                  NotSmall:
   789 000004BB 66895F10                	mov     [edi+TrackInfo.Period], bx
   790 000004BF 6601DB                  	add     bx, bx
   791                                  	;mov	ax, [PitchTable+bx]
   792 000004C2 668B83[40160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   793 000004C9 66894712                	mov     [edi+TrackInfo.Pitch], ax
   794 000004CD C3                      	retn
   795                                  efxportadown:
   796                                  PortDown:
   797 000004CE 30F6                    	xor     dh, dh
   798                                  	;mov	bx, [edi+TrackInfo.Period]
   799 000004D0 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   800 000004D4 6601D3                  	add     bx, dx
   801 000004D7 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   802                                  	;cmp	bx, 856
   803 000004DC 7E04                    	jle     short NotBig
   804                                  	;mov	bx, 856
   805 000004DE 66BB600D                	mov	bx, 3424 ; 01/10/2017
   806                                  NotBig:         
   807 000004E2 66895F10                	mov     [edi+TrackInfo.Period], bx
   808 000004E6 6601DB                  	add     bx, bx
   809                                  	;mov	ax, [PitchTable+bx]
   810 000004E9 668B83[40160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   811 000004F0 66894712                	mov     [edi+TrackInfo.Pitch], ax
   812 000004F4 C3                      	retn
   813                                  efxtoneporta2:
   814                                  TonePort:
   815 000004F5 30F6                    	xor     dh, dh
   816 000004F7 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   817                                  	;mov	bx, [edi+TrackInfo.Period]
   818 000004FB 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   819 000004FF 6639C3                  	cmp     bx, ax
   820 00000502 7429                    	je      short NoPort
   821 00000504 7F0D                    	jg      short PortToUp
   822                                  PortToDown:     
   823 00000506 6601D3                  	add     bx, dx
   824 00000509 6639C3                  	cmp     bx, ax
   825 0000050C 7E0D                    	jle     short SetPort
   826                                  FixPort:        
   827 0000050E 6689C3                  	mov     bx, ax
   828 00000511 EB08                    	jmp     short SetPort
   829                                  PortToUp:
   830 00000513 6629D3                  	sub     bx, dx
   831 00000516 6639C3                  	cmp     bx, ax
   832 00000519 7CF3                    	jl      short FixPort
   833                                  SetPort:        
   834 0000051B 66895F10                	mov     [edi+TrackInfo.Period], bx
   835 0000051F 6601DB                  	add     bx, bx
   836                                  	;mov	ax, [PitchTable+bx]
   837 00000522 668B83[40160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   838 00000529 66894712                	mov     [edi+TrackInfo.Pitch], ax
   839                                  NoPort:         
   840 0000052D C3                      	retn
   841                                  efxvibrato2:
   842                                  	; 01/10/2017
   843                                  Vibrato:
   844 0000052E 88D6                    	mov     dh, dl
   845                                  	;and	dl, 0Fh
   846                                  	;shr	dh, 4
   847                                  	;shl	dh, 2
   848 00000530 6681E20FF0              	and     dx, 0F00Fh
   849 00000535 C0EE02                  	shr     dh, 2
   850                                  	;add	[edi+TrackInfo.VibPos], dh
   851                                  	;mov	dh, [edi+TrackInfo.VibPos]
   852                                  	;mov	bl, dh
   853 00000538 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   854 0000053B 007719                  	add	[edi+TrackInfo.VibPos], dh
   855 0000053E 88DE                    	mov	dh, bl ; 01/10/2017
   856 00000540 C0EB02                  	shr     bl, 2
   857                                  	;and	bx, 1Fh
   858                                  	;mov	al, [SinTable+bx]
   859 00000543 83E31F                  	and	ebx, 1Fh
   860 00000546 8A83[480E0000]          	mov	al, [SinTable+ebx]
   861 0000054C F6E2                    	mul     dl
   862                                  	;rol	ax, 1
   863                                  	;xchg	al, ah
   864                                  	;and	ah, 1
   865 0000054E 66C1E807                	shr	ax, 7
   866 00000552 84F6                    	test    dh, dh
   867 00000554 7903                    	jns     short VibUp
   868 00000556 66F7D8                  	neg     ax
   869                                  VibUp:          
   870 00000559 66034710                	add     ax, [edi+TrackInfo.Period]
   871 0000055D 6689C3                  	mov	bx, ax
   872                                  	;movzx	ebx, ax
   873 00000560 6683FB71                	cmp     bx, 113
   874                                  	;cmp	bx, 113
   875 00000564 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   876 00000568 7D06                    	jge     short NoLoVib
   877                                  	;mov	bx, 113
   878 0000056A 66BB1C00                	mov	bx, 28	; 01/10/2017
   879 0000056E EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   880                                  NoLoVib:        
   881 00000570 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   882                                  	;cmp	bx, 856
   883 00000575 7E04                    	jle     short NoHiVib
   884                                  	;mov	bx, 856
   885 00000577 66BB600D                	mov	bx, 3424 ; 01/10/2017
   886                                  NoHiVib:        
   887 0000057B 6601DB                  	add     bx, bx
   888                                  	;mov	ax, [PitchTable+bx]
   889 0000057E 668B83[40160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   890 00000585 66894712                	mov     [edi+TrackInfo.Pitch], ax
   891 00000589 C3                      	retn
   892                                  efxtoneslide:
   893                                  PortSlide:
   894 0000058A E812000000              	call    VolSlide
   895 0000058F 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   896 00000592 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   897                                  efxvibslide:
   898                                  VibSlide:
   899 00000597 E805000000              	call    VolSlide
   900 0000059C 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   901 0000059F EB8D                    	jmp     short Vibrato  ; efxvibrato2
   902                                  efxvolslide:
   903                                  VolSlide:
   904 000005A1 88D6                    	mov     dh, dl
   905 000005A3 80E20F                  	and     dl, 0Fh
   906 000005A6 C0EE04                  	shr     dh, 4
   907 000005A9 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   908 000005AC 28D0                    	sub     al, dl
   909 000005AE 7D02                    	jge     short NoLoVol
   910 000005B0 30C0                    	xor     al, al
   911                                  NoLoVol:        
   912 000005B2 00F0                    	add     al, dh
   913 000005B4 3C40                    	cmp     al, 64
   914 000005B6 7602                    	jbe     short NoHiVol
   915 000005B8 B040                    	mov     al, 64
   916                                  NoHiVol:        
   917 000005BA 88470E                  	mov     [edi+TrackInfo.Volume], al
   918 000005BD C3                      	retn
   919                                  
   920                                  efxtremolo2:
   921                                  	; 01/10/2017 (TMODPLAY.ASM)
   922                                  Tremolo:
   923 000005BE 88D6                    	mov     dh, dl
   924 000005C0 6681E20FF0              	and     dx, 0F00Fh
   925 000005C5 C0EE02                  	shr     dh, 2
   926 000005C8 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
   927 000005CB 00771B                  	add	[edi+TrackInfo.TremPos], dh
   928 000005CE 88DE                    	mov	dh, bl
   929 000005D0 C0EB02                  	shr     bl, 2
   930                                  	; 01/10/2017 - TRDOS 386
   931                                  	;and	bx, 1Fh
   932 000005D3 83E31F                  	and	ebx, 1Fh 
   933                                  	;mov	al, [SinTable+bx]
   934 000005D6 8A83[480E0000]          	mov     al, [SinTable+ebx]
   935 000005DC F6E2                    	mul     dl
   936 000005DE 66C1E806                	shr	ax, 6
   937 000005E2 84F6                    	test    dh, dh
   938 000005E4 7D03                    	jge	short Tremolo_1 ; efxtremolof2
   939 000005E6 66F7D8                  	neg     ax
   940                                  efxtremolof2:
   941                                  Tremolo_1:      
   942 000005E9 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
   943 000005EC 00E0                    	add     al, ah
   944 000005EE 7D02                    	jge     short Tremolo_2 ; efxtremolof3
   945 000005F0 30C0                    	xor     al, al
   946                                  efxtremolof3:
   947                                  Tremolo_2:       
   948 000005F2 3C40                    	cmp     al, 64 ; 40h
   949 000005F4 7E02                    	jle     short Tremolo_3 ; efxtremolof4
   950 000005F6 B040                    	mov     al, 64 ; 40h
   951                                  efxtremolof4:
   952                                  Tremolo_3:       
   953 000005F8 28E0                    	sub	al, ah  ; ****** 
   954 000005FA 88470F                  	mov     [edi+TrackInfo.VolDiff], al
   955 000005FD C3                      	retn	
   956                                  
   957                                  ;--------------------------------------------------------------------------
   958                                  ; readchannel - read the next note event from the pattern sheet
   959                                  ;--------------------------------------------------------------------------
   960                                  ;
   961                                  ;--------------------------------------------------------------------------
   962                                  ; GetTrack:   Get the next Note from a pattern.
   963                                  ;  In:
   964                                  ;    ds:di -  Track info Address.
   965                                  ;    es:si -  Pattern Note Address.
   966                                  ; Out:
   967                                  ;    es:si -  The Next Pattern Note address.
   968                                  ;--------------------------------------------------------------------------
   969                                  
   970                                  ; esi = Pattern note address
   971                                  ; edi = Track info address
   972                                  
   973                                  readchannel:
   974                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
   975 000005FE 66AD                    	lodsw
   976 00000600 86C4                    	xchg    al, ah
   977 00000602 88E3                    	mov	bl, ah
   978 00000604 80E40F                  	and     ah, 0Fh
   979 00000607 6689C1                  	mov     cx, ax
   980 0000060A 66AD                    	lodsw
   981 0000060C 86C4                    	xchg    al, ah
   982 0000060E 88E7                    	mov     bh, ah
   983 00000610 80E40F                  	and     ah, 0Fh
   984 00000613 6689C2                  	mov     dx, ax
   985 00000616 66895714                	mov     [edi+TrackInfo.Effect], dx
   986                                  	; 01/10/2017 - TRDOS 386
   987                                  	;and	bl, 0F0h
   988 0000061A 81E3F0FF0000            	and	ebx, 0FFF0h
   989 00000620 C0EF04                  	shr     bh, 4
   990 00000623 08FB                    	or      bl, bh
   991 00000625 7446                    	jz      short SetPeriod
   992                                  SetSample:
   993 00000627 30FF                    	xor	bh, bh
   994                                  	;and	ebx, 0FFh
   995 00000629 FECB                    	dec     bl
   996 0000062B 01DB                    	add     ebx, ebx
   997 0000062D 668B83[02160000]        	mov     ax, [ModInfo.SampVol+ebx]
   998 00000634 88470E                  	mov     [edi+TrackInfo.Volume], al
   999 00000637 668B83[CC140000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1000 0000063E 668907                  	mov     [edi+TrackInfo.Samples], ax
  1001 00000641 668B83[0A150000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1002 00000648 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1003 0000064C 668B83[48150000]        	mov     ax, [ModInfo.SampLen+ebx]
  1004 00000653 66894708                	mov     [edi+TrackInfo.Len], ax
  1005 00000657 668B83[86150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1006 0000065E 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1007 00000662 668B83[C4150000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1008 00000669 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1009                                  SetPeriod:      
  1010 0000066D 6685C9                  	test    cx, cx
  1011 00000670 7425                    	jz      short SetEffect
  1012                                  
  1013 00000672 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1014                                  	
  1015 00000676 80FE03                  	cmp     dh, 03h
  1016                                  	;je	short SetEffect
  1017 00000679 7428                    	je	short efxtoneporta ; 01/10/2017
  1018                                  
  1019 0000067B 66894F10                	mov     [edi+TrackInfo.Period], cx
  1020                                  	;movzx	ebx, cx
  1021 0000067F 6689CB                  	mov     bx, cx
  1022 00000682 6601DB                  	add     bx, bx
  1023                                  	;mov	ax, [PitchTable+bx]
  1024 00000685 668B83[40160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1025 0000068C 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1026 00000690 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1027                                  SetEffect:
  1028                                  	;test	dx, dx
  1029                                  	;je	short InitNone
  1030                                  	;cmp	dh, 00h
  1031                                  	;je	InitArpeggio
  1032                                  	;cmp	dh, 03h
  1033                                  	;je	short InitTonePort
  1034                                  	;cmp	dh, 04h
  1035                                  	;je	short InitVibrato
  1036                                  	;cmp	dh, 09h
  1037                                  	;je	short SampleOfs
  1038                                  	;cmp	dh, 0Bh
  1039                                  	;je	short PosJump
  1040                                  	;cmp	dh, 0Ch
  1041                                  	;je	short SetVolume
  1042                                  	;cmp	dh, 0Dh
  1043                                  	;je	short Break
  1044                                  	;cmp	dh, 0Fh
  1045                                  	;je	SetSpeed
  1046                                  	;retn
  1047                                  
  1048                                  	; 01/10/2017 (TMODPLAY.ASM)
  1049                                  	
  1050                                  	; dx = [di+TrackInfo.Effect]
  1051                                  	
  1052 00000697 0FB6C6                  	movzx	eax, dh
  1053 0000069A 240F                    	and	al, 0Fh
  1054 0000069C FF2485[200D0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1055                                  ;efxnull:
  1056                                  ;InitNone:
  1057                                  ;	retn
  1058                                  efxtoneporta:
  1059                                  	; 01/10/2017
  1060                                  	; cx = period
  1061                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1062                                  InitTonePort:
  1063 000006A3 84D2                    	test    dl, dl
  1064 000006A5 7503                    	jnz     short SetPortParm
  1065 000006A7 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1066                                  SetPortParm:    
  1067 000006AA 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1068 000006AD 66895714                	mov     [edi+TrackInfo.Effect], dx
  1069 000006B1 C3                      	retn
  1070                                  efxvibrato:
  1071                                  InitVibrato:
  1072 000006B2 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1073 000006B5 88C4                    	mov     ah, al
  1074                                  	;and	al, 0Fh
  1075                                  	;and	ah, 0F0h
  1076 000006B7 66250FF0                	and	ax, 0F00Fh
  1077 000006BB F6C20F                  	test    dl, 0Fh
  1078 000006BE 7502                    	jne     short OkDepth
  1079 000006C0 08C2                    	or      dl, al
  1080                                  OkDepth:        
  1081 000006C2 F6C2F0                  	test    dl, 0F0h
  1082 000006C5 7502                    	jnz     short OkRate
  1083 000006C7 08E2                    	or      dl, ah
  1084                                  OkRate:         
  1085 000006C9 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1086 000006CC 66895714                	mov     [edi+TrackInfo.Effect], dx
  1087 000006D0 6685C9                  	test    cx, cx
  1088 000006D3 7404                    	jz      short OkPos
  1089 000006D5 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1090                                  OkPos:          
  1091 000006D9 C3                      	retn
  1092                                  efxsampoffset:
  1093                                  	; 01/10/2017 ; *******
  1094                                  SampleOfs:         
  1095                                  ;	test    dl, dl
  1096                                  ;	jnz     short SetSampleOfs
  1097                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1098                                  ;SetSampleOfs:
  1099                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1100 000006DA 88D6                    	mov     dh, dl
  1101 000006DC 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1102 000006E2 895704                  	mov     [edi+TrackInfo.Position], edx
  1103 000006E5 C3                      	retn
  1104                                  efxpattjump:
  1105                                  PosJump:
  1106 000006E6 8815[EE910000]          	mov     [OrderPos], dl
  1107 000006EC C605[F2910000]40        	mov     byte [Row], 64
  1108 000006F3 C3                      	retn
  1109                                  efxsetvolume:
  1110                                  SetVolume:
  1111 000006F4 80FA40                  	cmp     dl, 64
  1112 000006F7 7602                    	jbe     short OkVol
  1113 000006F9 B240                    	mov     dl, 64
  1114                                  OkVol:
  1115                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1116 000006FB 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1117                                  	;mov	[edi+TrackInfo.Volume], dl
  1118 000006FD 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1119 00000701 C3                      	retn
  1120                                  efxbreak:
  1121                                  Break:
  1122 00000702 88D6                    	mov     dh, dl
  1123 00000704 80E20F                  	and     dl, 0Fh
  1124 00000707 C0EE04                  	shr     dh, 4
  1125 0000070A 00F6                    	add     dh, dh
  1126 0000070C 00F2                    	add     dl, dh
  1127 0000070E C0E602                  	shl     dh, 2
  1128 00000711 00F2                    	add     dl, dh
  1129 00000713 8815[F3910000]          	mov     [BreakRow], dl
  1130 00000719 C605[F2910000]40        	mov     byte [Row], 64
  1131 00000720 C3                      	retn
  1132                                  efxsetspeed:
  1133                                  SetSpeed:
  1134 00000721 84D2                    	test    dl,dl
  1135 00000723 7432                    	je      Skip
  1136 00000725 80FA1F                  	cmp     dl,31
  1137 00000728 770D                    	ja      short SetBpm
  1138                                  SetTempo:       
  1139 0000072A 8815[EF910000]          	mov     [Tempo], dl
  1140 00000730 8815[F0910000]          	mov     [TempoWait], dl
  1141 00000736 C3                      	retn
  1142                                  SetBpm:
  1143 00000737 8815[F1910000]          	mov     [Bpm], dl
  1144 0000073D B067                    	mov     al, 103
  1145 0000073F F6E2                    	mul     dl
  1146 00000741 88E3                    	mov     bl, ah
  1147 00000743 30FF                    	xor     bh, bh
  1148 00000745 66A1[490F0000]          	mov     ax, [MixSpeed]
  1149 0000074B 6631D2                  	xor     dx, dx
  1150 0000074E 66F7F3                  	div     bx
  1151 00000751 66A3[F4910000]          	mov     [BpmSamples], ax
  1152                                  Skip:           
  1153 00000757 C3                      	retn
  1154                                  efxarpeggio:
  1155                                  	; 01/10/2017
  1156 00000758 84D2                    	test    dl, dl
  1157                                  	;je	efxnull
  1158 0000075A 74FB                    	je	short Skip
  1159                                  InitArpeggio:
  1160 0000075C 88D6                    	mov     dh, dl
  1161 0000075E 80E20F                  	and     dl, 0Fh
  1162 00000761 C0EE04                  	shr     dh, 4
  1163                                  	; 01/10/2017
  1164                                  	;mov	cx, 36
  1165 00000764 66B95400                	mov	cx, 84 ; 84 notes/periods
  1166 00000768 31DB                    	xor     ebx, ebx
  1167 0000076A 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1168                                  gt_ScanPeriod:
  1169                                  	;cmp	ax, [PeriodTable+bx]
  1170 0000076E 663B83[A00D0000]        	cmp	ax, [PeriodTable+ebx]
  1171 00000775 7306                    	jae     short SetArp
  1172 00000777 6683C302                	add     bx, 2
  1173 0000077B E2F1                    	loop    gt_ScanPeriod
  1174                                  SetArp:         
  1175 0000077D 6601D2                  	add     dx, dx
  1176 00000780 00DE                    	add     dh, bl
  1177 00000782 00DA                    	add     dl, bl
  1178                                  	; 01/10/2017
  1179                                  	;mov	bx, [PeriodTable+bx]
  1180 00000784 668B9B[A00D0000]        	mov	bx, [PeriodTable+ebx]
  1181                                  	;add	bx, bx
  1182 0000078B 01DB                    	add	ebx, ebx
  1183                                  	;mov	ax, [PitchTable+bx]
  1184 0000078D 668B83[40160000]        	mov	ax, [PitchTable+ebx]
  1185 00000794 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1186 00000798 88F3                    	mov     bl, dh
  1187 0000079A 30FF                    	xor     bh, bh
  1188 0000079C 668B9B[A00D0000]        	mov	bx, [PeriodTable+ebx]
  1189                                  	;add	bx, bx
  1190 000007A3 01DB                    	add	ebx, ebx
  1191                                  	;mov	ax, [PitchTable+bx]
  1192 000007A5 668B83[40160000]        	mov	ax, [PitchTable+ebx]
  1193 000007AC 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1194 000007B0 88D3                    	mov     bl, dl
  1195 000007B2 30FF                    	xor     bh, bh
  1196 000007B4 668B9B[A00D0000]        	mov	bx, [PeriodTable+ebx]
  1197                                  	;add	bx, bx
  1198 000007BB 01DB                    	add	ebx, ebx
  1199                                  	;mov	ax, [PitchTable+bx]
  1200 000007BD 668B83[40160000]        	mov	ax, [PitchTable+ebx]
  1201 000007C4 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1202 000007C8 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1203 000007CE C3                      	retn
  1204                                  
  1205                                  efxtremolo:
  1206                                  	; 01/10/2017 (TMODPLAY.ASM)
  1207                                  InitTremolo:
  1208 000007CF 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1209 000007D2 88C4                    	mov     ah, al
  1210 000007D4 66250FF0                	and     ax, 0F00Fh
  1211 000007D8 F6C20F                  	test    dl, 0Fh
  1212 000007DB 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1213 000007DD 08C2                    	or      dl, al
  1214                                  efxtremolof0:
  1215                                  InitTremolo_1: 
  1216 000007DF F6C2F0                  	test    dl, 0F0h
  1217 000007E2 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1218 000007E4 08E2                    	or      dl, ah
  1219                                  efxtremolof1:
  1220                                  InitTremolo_2:
  1221 000007E6 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1222 000007E9 66895714                	mov     [edi+TrackInfo.Effect], dx
  1223 000007ED C3                      	retn
  1224                                  
  1225                                  ;--------------------------------------------------------------------------
  1226                                  ; pollmodule - polls the module player
  1227                                  ;--------------------------------------------------------------------------
  1228                                  ;--------------------------------------------------------------------------
  1229                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1230                                  ;--------------------------------------------------------------------------
  1231                                  
  1232                                  pollmodule:
  1233                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1234 000007EE FE0D[F0910000]          	dec     byte [TempoWait]
  1235 000007F4 7417                    	jz      short GetTracks
  1236                                  
  1237                                  	;mov	ecx, NumTracks
  1238 000007F6 0FB70D[430F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1239 000007FD BF[04920000]            	mov	edi, Tracks
  1240                                  BeatTracks:
  1241 00000802 E86EFCFFFF              	call	BeatTrack	
  1242 00000807 83C726                  	add	edi, TrackInfo.size
  1243 0000080A E2F6                    	loop	BeatTracks
  1244 0000080C C3                      	retn
  1245                                  GetTracks:
  1246 0000080D A0[EF910000]            	mov     al, [Tempo]
  1247 00000812 A2[F0910000]            	mov     [TempoWait], al
  1248                                  
  1249 00000817 8B35[00920000]          	mov	esi, [Note]
  1250 0000081D 803D[F2910000]40        	cmp     byte [Row], 64
  1251 00000824 7268                    	jb      short NoPattWrap
  1252                                  
  1253 00000826 8B35[C8140000]          	mov	esi, [ModInfo.Patterns]
  1254 0000082C 8A1D[EE910000]          	mov     bl, [OrderPos]
  1255 00000832 3A1D[46140000]          	cmp     bl, [ModInfo.OrderLen]
  1256 00000838 7214                    	jb      short NoOrderWrap
  1257 0000083A 8A1D[47140000]          	mov     bl, [ModInfo.ReStart]
  1258 00000840 881D[EE910000]          	mov     [OrderPos], bl
  1259 00000846 3A1D[46140000]          	cmp     bl, [ModInfo.OrderLen]
  1260 0000084C 7364                    	jae     short NoUpdate
  1261                                  NoOrderWrap:    
  1262                                  	;xor	bh, bh
  1263 0000084E 81E3FF000000            	and	ebx, 0FFh
  1264 00000854 8A9B[48140000]          	mov     bl, [ModInfo.Order+ebx]
  1265                                  	; 05/10/2017
  1266                                  	;shl	ebx, 10 ; *1024
  1267 0000085A 8A0D[420F0000]          	mov	cl, [pattern_shift] ; 10 or 11
  1268 00000860 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1269                                  	;
  1270 00000862 01DE                    	add     esi, ebx
  1271 00000864 8A1D[F3910000]          	mov     bl, [BreakRow]
  1272 0000086A 881D[F2910000]          	mov     [Row], bl
  1273                                  	;xor	bh, bh
  1274 00000870 81E3FF000000            	and	ebx, 0FFh
  1275 00000876 883D[F3910000]          	mov     [BreakRow], bh ; 0
  1276 0000087C 66C1E304                	shl     bx, 4
  1277 00000880 01DE                    	add     esi, ebx
  1278 00000882 8935[00920000]          	mov     [Note], esi
  1279 00000888 FE05[EE910000]          	inc     byte [OrderPos]
  1280                                  NoPattWrap:     
  1281 0000088E FE05[F2910000]          	inc     byte [Row]
  1282                                  
  1283                                  	;cld
  1284                                  	;mov	ecx, NumTracks
  1285 00000894 0FB70D[430F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1286 0000089B BF[04920000]            	mov	edi, Tracks
  1287                                  GetTracks_next:
  1288 000008A0 51                      	push	ecx	
  1289 000008A1 E858FDFFFF              	call	GetTrack ; readchannel
  1290 000008A6 59                      	pop	ecx
  1291 000008A7 83C726                  	add	edi, TrackInfo.size
  1292 000008AA E2F4                    	loop	GetTracks_next
  1293                                  
  1294 000008AC 8935[00920000]          	mov     [Note], esi
  1295                                  NoUpdate:
  1296 000008B2 C3                      	retn
  1297                                  
  1298                                  ;--------------------------------------------------------------------------
  1299                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1300                                  ;  In:
  1301                                  ;   ds:si -  Track Info Address.
  1302                                  ;   ds:di -  Buffer Address.
  1303                                  ;    cx   -  Buffer Size.
  1304                                  ;--------------------------------------------------------------------------
  1305                                  
  1306                                  ; esi = Track info address
  1307                                  ; edi = Buffer address
  1308                                  ; ecx = Buffer size
  1309                                  
  1310                                  MixTrack:
  1311 000008B3 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1312 000008B8 7757                    	ja      short MixLooped
  1313                                  MixNonLooped:   
  1314 000008BA 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1315 000008BC 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1316 000008BF 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1317 000008C3 52                      	push    edx
  1318 000008C4 56                      	push    esi
  1319 000008C5 01D3                    	add     ebx, edx
  1320 000008C7 01D5                    	add     ebp, edx
  1321 000008C9 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1322                                  	; 01/10/2017
  1323                                  	;mov	al, [esi+TrackInfo.Volume]
  1324 000008CD 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1325                                  	; ah = [esi+TrackInfo.VolDiff]
  1326 000008D1 00E0                    	add	al, ah ; ****** 
  1327 000008D3 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1328 000008D7 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1329 000008DA 89DE                    	mov     esi, ebx
  1330 000008DC 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1331 000008DE 88C7                    	mov     bh, al
  1332 000008E0 88D0                    	mov     al, dl
  1333 000008E2 88F2                    	mov     dl, dh
  1334                                  	;xor	dh, dh
  1335 000008E4 81E2FF000000            	and	edx, 0FFh
  1336                                  nlMixSamp:      
  1337 000008EA 39EE                    	cmp     esi, ebp
  1338 000008EC 7316                    	jae     short nlMixBye
  1339 000008EE 8A1E                    	mov     bl, [esi]
  1340                                  	;mov	bl, [VolTable+bx]
  1341 000008F0 8A9B[02310000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1342                                  	; 17/10/2017
  1343 000008F6 001F                    	add     [edi], bl
  1344                                  	; 18/10/2017
  1345 000008F8 00C4                    	add     ah, al
  1346 000008FA 11D6                    	adc     esi, edx
  1347 000008FC 033D[430F0000]          	add	edi, [numtracks]
  1348 00000902 E2E6                    	loop    nlMixSamp
  1349                                  nlMixBye:       
  1350 00000904 89F3                    	mov     ebx, esi
  1351 00000906 5E                      	pop     esi
  1352 00000907 5A                      	pop     edx
  1353 00000908 29D3                    	sub     ebx, edx
  1354 0000090A 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1355 0000090D 88661D                  	mov     [esi+TrackInfo.Error], ah
  1356 00000910 C3                      	retn
  1357                                  MixLooped:
  1358 00000911 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1359 00000913 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1360 00000916 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1361 0000091A 892D[FC910000]          	mov     [BufRep], ebp
  1362                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1363 00000920 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1364 00000924 52                      	push    edx
  1365 00000925 56                      	push    esi
  1366 00000926 01D3                    	add     ebx, edx
  1367 00000928 01D5                    	add     ebp, edx
  1368 0000092A 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1369                                  	; 01/10/2017
  1370                                  	;mov	al, [esi+TrackInfo.Volume]
  1371 0000092E 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1372                                  	; ah = [esi+TrackInfo.VolDiff]
  1373 00000932 00E0                    	add	al, ah ; ****** 
  1374 00000934 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1375 00000938 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1376                                  	;mov	si, bx
  1377 0000093B 89DE                    	mov	esi, ebx ; 04/09/2017
  1378 0000093D 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1379 0000093F 88C7                    	mov     bh, al
  1380 00000941 88D0                    	mov     al, dl
  1381 00000943 88F2                    	mov     dl, dh
  1382                                  	;xor	dh, dh
  1383 00000945 81E2FF000000            	and	edx, 0FFh
  1384                                  lpMixSamp:      
  1385 0000094B 39EE                    	cmp     esi, ebp
  1386 0000094D 7206                    	jb      short lpMixNow
  1387 0000094F 2B35[FC910000]          	sub     esi, [BufRep]
  1388                                  lpMixNow:       
  1389 00000955 8A1E                    	mov     bl, [esi]
  1390                                  	;mov	bl, [VolTable+bx]
  1391 00000957 8A9B[02310000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1392                                  	; 17/10/2017
  1393 0000095D 001F                    	add     [edi], bl
  1394                                  	; 18/10/2017
  1395 0000095F 00C4                    	add     ah, al
  1396 00000961 11D6                    	adc     esi, edx
  1397 00000963 033D[430F0000]          	add	edi, [numtracks]
  1398 00000969 E2E0                    	loop    lpMixSamp
  1399                                  lpMixBye:       
  1400                                  ;	mov     ebx, esi
  1401                                  ;	pop     esi
  1402                                  ;	pop     edx
  1403                                  ;	sub     ebx, edx
  1404                                  ;	mov     [esi+TrackInfo.Position], ebx
  1405                                  ;	mov     [esi+TrackInfo.Error], ah
  1406                                  ;	retn
  1407 0000096B EB97                    	jmp	short nlMixBye
  1408                                  
  1409                                  ;--------------------------------------------------------------------------
  1410                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1411                                  ;  In:
  1412                                  ;    Buffer  - Buffer Address.
  1413                                  ;    Count   - Buffer Size.
  1414                                  ;--------------------------------------------------------------------------
  1415                                  
  1416                                  ;--------------------------------------------------------------------------
  1417                                  ; mixpoll - updates the output buffer
  1418                                  ;--------------------------------------------------------------------------
  1419                                  ;
  1420                                  ;--------------------------------------------------------------------------
  1421                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1422                                  ;  In:
  1423                                  ;    Buffer  - Buffer Address.
  1424                                  ;    Count   - Buffer Size.
  1425                                  ;--------------------------------------------------------------------------
  1426                                  
  1427                                  mixpoll:
  1428                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1429                                  	; edi = buffer address
  1430                                  	; ebx = count
  1431                                  
  1432 0000096D 60                      	pushad
  1433                                  
  1434                                  	;cld
  1435                                  NextChunk:      
  1436 0000096E 66833D[FA910000]00      	cmp     word [BufLen], 0
  1437 00000976 756C                    	jne     short CopyChunk
  1438                                  
  1439 00000978 53                      	push    ebx
  1440 00000979 57                      	push    edi
  1441                                  MixChunk:       
  1442 0000097A BF[02720000]            	mov	edi, MixBuffer
  1443                                  	; 17/10/2017
  1444 0000097F 0FB70D[F4910000]        	movzx	ecx, word [BpmSamples]
  1445                                  	;mov	cx, [BpmSamples]
  1446 00000986 893D[F6910000]          	mov     [BufPtr], edi
  1447 0000098C 66890D[FA910000]        	mov	[BufLen], cx
  1448                                  
  1449 00000993 803D[430F0000]04        	cmp	byte [numtracks], 4
  1450 0000099A 7603                    	jna	short ch_silence
  1451 0000099C 66D1E1                  	shl	cx, 1 
  1452                                  ch_silence:
  1453 0000099F B880808080              	mov	eax, 80808080h
  1454 000009A4 F3AB                    	rep	stosd
  1455                                  	
  1456                                  	;mov	cx, NumTracks
  1457                                  	;mov	cl, NumTracks ; 01/10/2017
  1458 000009A6 668B0D[430F0000]        	mov	cx, [numtracks] ; 18/10/2017
  1459 000009AD BE[DE910000]            	mov	esi, Tracks - TrackInfo.size
  1460                                  GetSamples_next:
  1461 000009B2 51                      	push	ecx
  1462 000009B3 83C626                  	add	esi, TrackInfo.size
  1463 000009B6 668B0D[FA910000]        	mov	cx, [BufLen]
  1464 000009BD 8B3D[F6910000]          	mov	edi, [BufPtr]
  1465 000009C3 E8EBFEFFFF              	call	MixTrack
  1466 000009C8 59                      	pop	ecx
  1467 000009C9 FF05[F6910000]          	inc	dword [BufPtr] ; 18/10/2017
  1468 000009CF E2E1                    	loop	GetSamples_next
  1469                                  
  1470                                   	; 18/10/2017	
  1471 000009D1 8B1D[430F0000]          	mov	ebx, [numtracks]
  1472 000009D7 291D[F6910000]          	sub	dword [BufPtr], ebx
  1473                                  
  1474 000009DD E80CFEFFFF              	call    UpdateTracks
  1475                                  
  1476 000009E2 5F                      	pop     edi
  1477 000009E3 5B                      	pop     ebx
  1478                                  CopyChunk:      
  1479                                  	;mov	cx, [BufLen]
  1480 000009E4 0FB70D[FA910000]        	movzx	ecx, word [BufLen]
  1481 000009EB 39D9                    	cmp	ecx, ebx
  1482                                  	;cmp	cx, bx
  1483 000009ED 7602                    	jbe     short MoveChunk
  1484                                  	;mov	cx, bx
  1485 000009EF 89D9                    	mov     ecx, ebx
  1486                                  MoveChunk:
  1487 000009F1 8B35[F6910000]          	mov     esi, [BufPtr]
  1488 000009F7 010D[F6910000]          	add     [BufPtr], ecx
  1489 000009FD 66290D[FA910000]        	sub     [BufLen], cx
  1490 00000A04 29CB                    	sub     ebx, ecx
  1491                                  	; 17/10/2017 ; STEREO MIXING
  1492                                  	;rep	movsb
  1493                                  	; 18/10/2017
  1494 00000A06 803D[430F0000]04        	cmp	byte [numtracks], 4
  1495                                  	;jna	short _4_channels_mix
  1496 00000A0D 7622                    	jna	_4_channels_mix
  1497                                  	
  1498                                  _8_channels_mix:
  1499                                  	; 18/10/2017
  1500 00000A0F AD                      	lodsd 
  1501 00000A10 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1502 00000A12 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1503 00000A15 00C6                    	add	dh, al ; ch1 + ch4
  1504 00000A17 00E2                    	add	dl, ah ; ch2 + ch3
  1505                                  
  1506 00000A19 AD                      	lodsd
  1507 00000A1A 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1508 00000A1C 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1509 00000A1E C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1510 00000A21 00F4                    	add	ah, dh ; ch1 + ch4 + ch5 + ch8
  1511 00000A23 00D0                    	add	al, dl ; ch2 + ch3 + ch6 + ch7
  1512                                  
  1513 00000A25 86E0                    	xchg	ah, al
  1514                                  
  1515                                  	; L = ch1 + ch4 + ch5 + ch8
  1516                                  	; R = ch2 + ch3 + ch6 + ch7
  1517                                  
  1518 00000A27 66058080                	add	ax, 8080h
  1519                                  
  1520 00000A2B 66AB                    	stosw ; ch5 + ch8, ch6 + ch7 
  1521                                  
  1522 00000A2D E2E0                    	loop	_8_channels_mix
  1523                                  	
  1524 00000A2F EB12                    	jmp	short channel_mix_ok
  1525                                  	
  1526                                  _4_channels_mix:
  1527                                  	; 18/10/2017
  1528 00000A31 AD                      	lodsd 
  1529 00000A32 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1530 00000A34 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1531 00000A37 00F0                    	add	al, dh ; ch1 + ch4
  1532 00000A39 00D4                    	add	ah, dl ; ch2 + ch3
  1533                                  
  1534                                  	; L = ch1 + ch4
  1535                                  	; R = ch2 + ch3
  1536                                  
  1537 00000A3B 66058080                	add	ax, 8080h
  1538                                  
  1539 00000A3F 66AB                    	stosw ; ch1 + ch3
  1540                                  	
  1541 00000A41 E2EE                    	loop	_4_channels_mix
  1542                                  
  1543                                  channel_mix_ok:
  1544 00000A43 85DB                    	test    ebx, ebx
  1545                                  	;jnz	short NextChunk
  1546 00000A45 0F8523FFFFFF            	jnz	NextChunk ; 17/10/2017
  1547                                  
  1548 00000A4B 61                      	popad	
  1549 00000A4C C3                      	retn
  1550                                  
  1551                                  ;--------------------------------------------------------------------------
  1552                                  ; StartPlaying: Initializes the Sound System.
  1553                                  ;  In:
  1554                                  ;   Module Information Resources.
  1555                                  ;--------------------------------------------------------------------------
  1556                                  
  1557                                  StartPlaying:
  1558                                  	; 07/10/2017
  1559 00000A4D 60                      	pushad
  1560                                  SetModParms:    
  1561 00000A4E C605[EE910000]00        	mov     byte [OrderPos], 0
  1562 00000A55 C605[EF910000]06        	mov     byte [Tempo], DefTempo
  1563 00000A5C C605[F0910000]06        	mov     byte [TempoWait], DefTempo
  1564 00000A63 C605[F1910000]7D        	mov     byte [Bpm], DefBpm
  1565 00000A6A C605[F2910000]40        	mov     byte [Row], 64
  1566 00000A71 C605[F3910000]00        	mov     byte [BreakRow], 0
  1567 00000A78 66A1[490F0000]          	mov     ax, [MixSpeed]
  1568 00000A7E 31D2                    	xor     edx, edx
  1569 00000A80 66BB3200                	mov     bx, 24*DefBpm/60
  1570 00000A84 66F7F3                  	div     bx
  1571 00000A87 66A3[F4910000]          	mov     [BpmSamples], ax
  1572                                  ClearTracks:    
  1573 00000A8D BF[04920000]            	mov     edi, Tracks
  1574                                  	; 06/10/2017
  1575                                  	;mov	ecx, NumTracks*TrackInfo.size
  1576 00000A92 B826000000              	mov	eax, TrackInfo.size
  1577 00000A97 0FB70D[430F0000]        	movzx	ecx, word [numtracks]
  1578 00000A9E F7E1                    	mul	ecx
  1579 00000AA0 89C1                    	mov	ecx, eax
  1580 00000AA2 31C0                    	xor     eax, eax
  1581                                  	;cld
  1582 00000AA4 F3AA                    	rep     stosb
  1583                                  
  1584 00000AA6 A3[F6910000]            	mov     [BufPtr], eax
  1585 00000AAB 66A3[FA910000]          	mov     [BufLen], ax
  1586                                  MakePitch:
  1587 00000AB1 66B80021                	mov     ax, MidCRate
  1588 00000AB5 66BBAC01                	mov     bx, 428
  1589 00000AB9 66F7E3                  	mul     bx
  1590 00000ABC 66F735[490F0000]        	div     word [MixSpeed]
  1591 00000AC3 30F6                    	xor     dh, dh
  1592 00000AC5 88E2                    	mov     dl, ah
  1593 00000AC7 88C4                    	mov     ah, al
  1594 00000AC9 30C0                    	xor     al, al
  1595                                  	;mov	cx, 857
  1596 00000ACB 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1597 00000ACF 31DB                    	xor     ebx, ebx
  1598 00000AD1 BF[40160000]            	mov     edi, PitchTable
  1599                                  PitchLoop:      
  1600 00000AD6 50                      	push    eax
  1601 00000AD7 52                      	push    edx
  1602 00000AD8 6639DA                  	cmp     dx, bx
  1603 00000ADB 7303                    	jae     short NoDiv
  1604 00000ADD 66F7F3                  	div     bx
  1605                                  NoDiv:          
  1606 00000AE0 66AB                    	stosw
  1607 00000AE2 5A                      	pop     edx
  1608 00000AE3 58                      	pop     eax
  1609                                  	;inc	bx
  1610 00000AE4 43                      	inc	ebx
  1611 00000AE5 E2EF                    	loop    PitchLoop
  1612                                  MakeVolume:     
  1613 00000AE7 66B90041                	mov     cx, 16640
  1614 00000AEB 89CB                    	mov     ebx, ecx
  1615                                  VolLoop:
  1616 00000AED 664B                    	dec     bx
  1617 00000AEF 88D8                    	mov     al, bl
  1618 00000AF1 F6EF                    	imul    bh
  1619                                  	;mov	[VolTable+bx], ah
  1620 00000AF3 88A3[02310000]          	mov     [VolTable+ebx], ah
  1621 00000AF9 E2F2                    	loop    VolLoop
  1622                                  
  1623 00000AFB 61                      	popad
  1624 00000AFC C3                      	retn
  1625                                  
  1626                                  ;--------------------------------------------------------------------------
  1627                                  ; StopPlaying: ShutDown the Sound System.
  1628                                  ;--------------------------------------------------------------------------
  1629                                  
  1630                                  StopPlaying:
  1631                                  	; 19/06/2017
  1632                                  	; Stop Playing
  1633                                  	sys	_audio, 0700h
  1633                              <1> 
  1633                              <1> 
  1633                              <1> 
  1633                              <1> 
  1633                              <1>  %if %0 >= 2
  1633 00000AFD BB00070000          <1>  mov ebx, %2
  1633                              <1>  %if %0 >= 3
  1633                              <1>  mov ecx, %3
  1633                              <1>  %if %0 = 4
  1633                              <1>  mov edx, %4
  1633                              <1>  %endif
  1633                              <1>  %endif
  1633                              <1>  %endif
  1633 00000B02 B820000000          <1>  mov eax, %1
  1633                              <1> 
  1633 00000B07 CD40                <1>  int 40h
  1634                                  	; Cancel callback service (for user)
  1635                                  	sys	_audio, 0900h
  1635                              <1> 
  1635                              <1> 
  1635                              <1> 
  1635                              <1> 
  1635                              <1>  %if %0 >= 2
  1635 00000B09 BB00090000          <1>  mov ebx, %2
  1635                              <1>  %if %0 >= 3
  1635                              <1>  mov ecx, %3
  1635                              <1>  %if %0 = 4
  1635                              <1>  mov edx, %4
  1635                              <1>  %endif
  1635                              <1>  %endif
  1635                              <1>  %endif
  1635 00000B0E B820000000          <1>  mov eax, %1
  1635                              <1> 
  1635 00000B13 CD40                <1>  int 40h
  1636                                  	; Deallocate Audio Buffer (for user)
  1637                                  	sys	_audio, 0A00h
  1637                              <1> 
  1637                              <1> 
  1637                              <1> 
  1637                              <1> 
  1637                              <1>  %if %0 >= 2
  1637 00000B15 BB000A0000          <1>  mov ebx, %2
  1637                              <1>  %if %0 >= 3
  1637                              <1>  mov ecx, %3
  1637                              <1>  %if %0 = 4
  1637                              <1>  mov edx, %4
  1637                              <1>  %endif
  1637                              <1>  %endif
  1637                              <1>  %endif
  1637 00000B1A B820000000          <1>  mov eax, %1
  1637                              <1> 
  1637 00000B1F CD40                <1>  int 40h
  1638                                  	; Disable Audio Device
  1639                                  	sys	_audio, 0C00h
  1639                              <1> 
  1639                              <1> 
  1639                              <1> 
  1639                              <1> 
  1639                              <1>  %if %0 >= 2
  1639 00000B21 BB000C0000          <1>  mov ebx, %2
  1639                              <1>  %if %0 >= 3
  1639                              <1>  mov ecx, %3
  1639                              <1>  %if %0 = 4
  1639                              <1>  mov edx, %4
  1639                              <1>  %endif
  1639                              <1>  %endif
  1639                              <1>  %endif
  1639 00000B26 B820000000          <1>  mov eax, %1
  1639                              <1> 
  1639 00000B2B CD40                <1>  int 40h
  1640                                  
  1641 00000B2D C3                      	retn
  1642                                  
  1643                                  ; 17/10/2017 (STEREO PLAYING)
  1644                                  ; 24/06/2017
  1645                                  ;--------------------------------------------------------------------------
  1646                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1647                                  ;--------------------------------------------------------------------------
  1648                                  ; This Conversion is needed for AC'97 hardware 
  1649                                  ; which ony supports 16 bit stereo samples !
  1650                                  
  1651                                  ; source = temp_buffer (8192 bytes)
  1652                                  ; destination = Audio_Buffer (32768 bytes)
  1653                                  
  1654                                  ConvertSamples:
  1655                                  	; 24/06/2017
  1656 00000B2E B900200000              	mov	ecx, BUFFERSIZE/4 ; 8192
  1657 00000B33 BE[00200100]            	mov	esi, temp_buffer
  1658 00000B38 BF[00A00000]            	mov	edi, Audio_Buffer
  1659                                  c_smpl_1:
  1660                                  	; 17/10/2017 (Left channel)
  1661 00000B3D AC                      	lodsb	; get 8 bit mono sample
  1662                                  	; 15/10/2017
  1663                                  	;sub	al, 80h
  1664                                  	;shl	ax, 8
  1665 00000B3E 88C4                    	mov	ah, al
  1666 00000B40 80EC80                  	sub	ah, 80h
  1667 00000B43 30C0                    	xor	al, al
  1668                                  	;
  1669                                  	;mov	dx, ax
  1670                                  	;shl	eax, 16
  1671                                  	;mov	ax, dx
  1672                                  	;stosd	; save 16 bit stereo sample
  1673 00000B45 66AB                    	stosw	; save 16 bit left channel data ; 17/10/2017
  1674                                  
  1675                                  	; 17/10/2017 (Right channel)
  1676 00000B47 AC                      	lodsb	; get 8 bit mono sample
  1677 00000B48 88C4                    	mov	ah, al
  1678 00000B4A 80EC80                  	sub	ah, 80h
  1679 00000B4D 30C0                    	xor	al, al
  1680                                  	;
  1681 00000B4F 66AB                    	stosw	; save 16 bit right channel data
  1682                                  
  1683 00000B51 E2EA                    	loop 	c_smpl_1
  1684                                  	
  1685 00000B53 C3                      	retn
  1686                                  
  1687                                  ;=============================================================================
  1688                                  ; 
  1689                                  ;=============================================================================
  1690                                  
  1691                                  ;dword2str:
  1692                                  ;	; 13/11/2016 - Erdogan Tan 
  1693                                  ;	; eax = dword value
  1694                                  ;	;
  1695                                  ;	call	dwordtohex
  1696                                  ;	mov	[dword_str], edx
  1697                                  ;	mov	[dword_str+4], eax
  1698                                  ;	mov	si, dword_str
  1699                                  ;	retn
  1700                                  
  1701                                  	; 05/03/2017 (TRDOS 386)
  1702                                  	; trdos386.s (unix386.s) - 10/05/2015
  1703                                  	; Convert binary number to hexadecimal string
  1704                                  
  1705                                  ;bytetohex:
  1706                                  ;	; INPUT ->
  1707                                  ;	; 	AL = byte (binary number)
  1708                                  ;	; OUTPUT ->
  1709                                  ;	;	AX = hexadecimal string
  1710                                  ;	;
  1711                                  ;	push	ebx
  1712                                  ;	movzx	ebx, al
  1713                                  ;	shr	bl, 4
  1714                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1715                                  ;	xchg	bl, al
  1716                                  ;	and	bl, 0Fh
  1717                                  ;	mov	ah, [ebx+hex_chars] 
  1718                                  ;	pop	ebx	
  1719                                  ;	retn
  1720                                  
  1721                                  ;wordtohex:
  1722                                  ;	; INPUT ->
  1723                                  ;	; 	AX = word (binary number)
  1724                                  ;	; OUTPUT ->
  1725                                  ;	;	EAX = hexadecimal string
  1726                                  ;	;
  1727                                  ;	push	ebx
  1728                                  ;	xor	ebx, ebx
  1729                                  ;	xchg	ah, al
  1730                                  ;	push	eax
  1731                                  ;	mov	bl, ah
  1732                                  ;	shr	bl, 4
  1733                                  ;	mov	al, [ebx+hex_chars] 	 	
  1734                                  ;	mov	bl, ah
  1735                                  ;	and	bl, 0Fh
  1736                                  ;	mov	ah, [ebx+hex_chars]
  1737                                  ;	shl	eax, 16
  1738                                  ;	pop	eax
  1739                                  ;	pop	ebx
  1740                                  ;	jmp	short bytetohex
  1741                                  
  1742                                  ;dwordtohex:
  1743                                  ;	; INPUT ->
  1744                                  ;	; 	EAX = dword (binary number)
  1745                                  ;	; OUTPUT ->
  1746                                  ;	;	EDX:EAX = hexadecimal string
  1747                                  ;	;
  1748                                  ;	push	eax
  1749                                  ;	shr	eax, 16
  1750                                  ;	call	wordtohex
  1751                                  ;	mov	edx, eax
  1752                                  ;	pop	eax
  1753                                  ;	call	wordtohex
  1754                                  ;	retn
  1755                                  
  1756                                  	; 24/06/2017
  1757                                  	; 19/06/2017
  1758                                  	; 05/03/2017 (TRDOS 386)
  1759                                  	; 13/11/2016 - Erdogan Tan
  1760                                  write_audio_dev_info:
  1761                                  	; BUS/DEV/FN
  1762                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1763                                  	; DEV/VENDOR
  1764                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1765                                  
  1766 00000B54 8B35[F40F0000]          	mov	esi, [dev_vendor]
  1767 00000B5A 6689F0                  	mov	ax, si
  1768 00000B5D 0FB6D8                  	movzx	ebx, al
  1769 00000B60 88DA                    	mov	dl, bl
  1770 00000B62 80E30F                  	and	bl, 0Fh
  1771 00000B65 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1772 00000B6B A2[900F0000]            	mov	[msgVendorId+3], al
  1773 00000B70 88D3                    	mov	bl, dl
  1774 00000B72 C0EB04                  	shr	bl, 4
  1775 00000B75 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1776 00000B7B A2[8F0F0000]            	mov	[msgVendorId+2], al
  1777 00000B80 88E3                    	mov	bl, ah
  1778 00000B82 88DA                    	mov	dl, bl
  1779 00000B84 80E30F                  	and	bl, 0Fh
  1780 00000B87 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1781 00000B8D A2[8E0F0000]            	mov	[msgVendorId+1], al
  1782 00000B92 88D3                    	mov	bl, dl
  1783 00000B94 C0EB04                  	shr	bl, 4
  1784 00000B97 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1785 00000B9D A2[8D0F0000]            	mov	[msgVendorId], al
  1786 00000BA2 C1EE10                  	shr	esi, 16
  1787 00000BA5 6689F0                  	mov	ax, si
  1788 00000BA8 88C3                    	mov	bl, al
  1789 00000BAA 88DA                    	mov	dl, bl
  1790 00000BAC 80E30F                  	and	bl, 0Fh
  1791 00000BAF 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1792 00000BB5 A2[A10F0000]            	mov	[msgDevId+3], al
  1793 00000BBA 88D3                    	mov	bl, dl
  1794 00000BBC C0EB04                  	shr	bl, 4
  1795 00000BBF 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1796 00000BC5 A2[A00F0000]            	mov	[msgDevId+2], al
  1797 00000BCA 88E3                    	mov	bl, ah
  1798 00000BCC 88DA                    	mov	dl, bl
  1799 00000BCE 80E30F                  	and	bl, 0Fh
  1800 00000BD1 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1801 00000BD7 A2[9F0F0000]            	mov	[msgDevId+1], al
  1802 00000BDC 88D3                    	mov	bl, dl
  1803 00000BDE C0EB04                  	shr	bl, 4
  1804 00000BE1 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1805 00000BE7 A2[9E0F0000]            	mov	[msgDevId], al
  1806                                  
  1807 00000BEC 8B35[F80F0000]          	mov	esi, [bus_dev_fn]
  1808 00000BF2 C1EE08                  	shr	esi, 8
  1809 00000BF5 6689F0                  	mov	ax, si
  1810 00000BF8 88C3                    	mov	bl, al
  1811 00000BFA 88DA                    	mov	dl, bl
  1812 00000BFC 80E307                  	and	bl, 7 ; bit 0,1,2
  1813 00000BFF 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1814 00000C05 A2[C50F0000]            	mov	[msgFncNo+1], al
  1815 00000C0A 88D3                    	mov	bl, dl
  1816 00000C0C C0EB03                  	shr	bl, 3
  1817 00000C0F 88DA                    	mov	dl, bl
  1818 00000C11 80E30F                  	and	bl, 0Fh
  1819 00000C14 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1820 00000C1A A2[B70F0000]            	mov	[msgDevNo+1], al
  1821 00000C1F 88D3                    	mov	bl, dl
  1822 00000C21 C0EB04                  	shr	bl, 4
  1823 00000C24 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1824 00000C2A A2[B60F0000]            	mov	[msgDevNo], al
  1825 00000C2F 88E3                    	mov	bl, ah
  1826 00000C31 88DA                    	mov	dl, bl
  1827 00000C33 80E30F                  	and	bl, 0Fh
  1828 00000C36 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1829 00000C3C A2[AB0F0000]            	mov	[msgBusNo+1], al
  1830 00000C41 88D3                    	mov	bl, dl
  1831 00000C43 C0EB04                  	shr	bl, 4
  1832 00000C46 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1833 00000C4C A2[AA0F0000]            	mov	[msgBusNo], al
  1834                                  
  1835                                  	; 24/06/2017
  1836 00000C51 66A1[00100000]          	mov	ax, [ac97_NamBar]
  1837 00000C57 88C3                    	mov	bl, al
  1838 00000C59 88DA                    	mov	dl, bl
  1839 00000C5B 80E30F                  	and	bl, 0Fh
  1840 00000C5E 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1841 00000C64 A2[D40F0000]            	mov	[msgNamBar+3], al
  1842 00000C69 88D3                    	mov	bl, dl
  1843 00000C6B C0EB04                  	shr	bl, 4
  1844 00000C6E 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1845 00000C74 A2[D30F0000]            	mov	[msgNamBar+2], al
  1846 00000C79 88E3                    	mov	bl, ah
  1847 00000C7B 88DA                    	mov	dl, bl
  1848 00000C7D 80E30F                  	and	bl, 0Fh
  1849 00000C80 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1850 00000C86 A2[D20F0000]            	mov	[msgNamBar+1], al
  1851 00000C8B 88D3                    	mov	bl, dl
  1852 00000C8D C0EB04                  	shr	bl, 4
  1853 00000C90 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1854 00000C96 A2[D10F0000]            	mov	[msgNamBar], al
  1855                                  
  1856 00000C9B 66A1[02100000]          	mov	ax, [ac97_NabmBar]
  1857 00000CA1 88C3                    	mov	bl, al
  1858 00000CA3 88DA                    	mov	dl, bl
  1859 00000CA5 80E30F                  	and	bl, 0Fh
  1860 00000CA8 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1861 00000CAE A2[E40F0000]            	mov	[msgNabmBar+3], al
  1862 00000CB3 88D3                    	mov	bl, dl
  1863 00000CB5 C0EB04                  	shr	bl, 4
  1864 00000CB8 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1865 00000CBE A2[E30F0000]            	mov	[msgNabmBar+2], al
  1866 00000CC3 88E3                    	mov	bl, ah
  1867 00000CC5 88DA                    	mov	dl, bl
  1868 00000CC7 80E30F                  	and	bl, 0Fh
  1869 00000CCA 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1870 00000CD0 A2[E20F0000]            	mov	[msgNabmBar+1], al
  1871 00000CD5 88D3                    	mov	bl, dl
  1872 00000CD7 C0EB04                  	shr	bl, 4
  1873 00000CDA 8A83[4B0F0000]          	mov	al, [ebx+hex_chars]
  1874 00000CE0 A2[E10F0000]            	mov	[msgNabmBar], al
  1875                                  
  1876                                  	; 24/11/2016
  1877 00000CE5 30E4                    	xor	ah, ah
  1878 00000CE7 A0[04100000]            	mov	al, [ac97_int_ln_reg]
  1879 00000CEC B10A                    	mov	cl, 10
  1880 00000CEE F6F1                    	div	cl
  1881 00000CF0 660105[ED0F0000]        	add	[msgIRQ], ax
  1882 00000CF7 20C0                    	and	al, al
  1883 00000CF9 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1884 00000CFB A0[EE0F0000]            	mov	al, [msgIRQ+1]
  1885 00000D00 B420                    	mov	ah, ' '
  1886 00000D02 66A3[ED0F0000]          	mov	[msgIRQ], ax
  1887                                  _w_ac97imsg_:
  1888                                  	; EBX = Message address
  1889                                  	; ECX = Max. message length (or stop on ZERO character)
  1890                                  	;	(1 to 255)
  1891                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1892                                       	sys 	_msg, msgAC97Info, 255, 07h
  1892                              <1> 
  1892                              <1> 
  1892                              <1> 
  1892                              <1> 
  1892                              <1>  %if %0 >= 2
  1892 00000D08 BB[5C0F0000]        <1>  mov ebx, %2
  1892                              <1>  %if %0 >= 3
  1892 00000D0D B9FF000000          <1>  mov ecx, %3
  1892                              <1>  %if %0 = 4
  1892 00000D12 BA07000000          <1>  mov edx, %4
  1892                              <1>  %endif
  1892                              <1>  %endif
  1892                              <1>  %endif
  1892 00000D17 B823000000          <1>  mov eax, %1
  1892                              <1> 
  1892 00000D1C CD40                <1>  int 40h
  1893 00000D1E C3                              retn
  1894                                  
  1895                                  ;=============================================================================
  1896                                  ;               preinitialized data
  1897                                  ;=============================================================================
  1898                                  
  1899                                  ;=============================================================================
  1900                                  ; Protracker effects stuff
  1901                                  ;=============================================================================
  1902                                  
  1903                                  ;-----------------------------------------------------------------------------
  1904                                  ; Effect jump tables
  1905                                  ;-----------------------------------------------------------------------------
  1906                                  
  1907 00000D1F 90                      align 4
  1908                                  
  1909                                  efxtable:
  1910 00000D20 [58070000]              	dd      efxarpeggio	; 0 - arpeggio
  1911 00000D24 [85040000]              	dd      efxnull		; 1 - porta up
  1912 00000D28 [85040000]              	dd      efxnull		; 2 - porta down
  1913 00000D2C [A3060000]              	dd      efxtoneporta	; 3 - tone porta
  1914 00000D30 [B2060000]              	dd      efxvibrato	; 4 - vibrato
  1915 00000D34 [85040000]              	dd      efxnull		; 5 - tone+slide
  1916 00000D38 [85040000]              	dd      efxnull		; 6 - vibrato+slide
  1917 00000D3C [CF070000]              	dd      efxtremolo	; 7 - tremolo
  1918 00000D40 [85040000]              	dd      efxnull		; 8 - unused
  1919 00000D44 [DA060000]              	dd      efxsampoffset	; 9 - sample offset
  1920 00000D48 [85040000]              	dd      efxnull		; A - volume slide
  1921 00000D4C [E6060000]              	dd      efxpattjump	; B - pattern jump
  1922 00000D50 [F4060000]              	dd      efxsetvolume	; C - set volume
  1923 00000D54 [02070000]              	dd      efxbreak	; D - break pattern
  1924 00000D58 [85040000]              	dd      efxnull		; E - extra effects
  1925 00000D5C [21070000]              	dd      efxsetspeed	; F - set speed
  1926                                  
  1927                                  efxtable2:
  1928 00000D60 [86040000]              	dd      efxarpeggio2	; 0 - arpeggio
  1929 00000D64 [A8040000]              	dd      efxportaup	; 1 - porta up
  1930 00000D68 [CE040000]              	dd      efxportadown	; 2 - porta down
  1931 00000D6C [F5040000]              	dd      efxtoneporta2	; 3 - tone porta
  1932 00000D70 [2E050000]              	dd      efxvibrato2	; 4 - vibrato
  1933 00000D74 [8A050000]              	dd      efxtoneslide	; 5 - tone+slide
  1934 00000D78 [97050000]              	dd      efxvibslide	; 6 - vibrato+slide
  1935 00000D7C [BE050000]              	dd      efxtremolo2	; 7 - tremolo
  1936 00000D80 [85040000]              	dd      efxnull		; 8 - unused
  1937 00000D84 [85040000]              	dd      efxnull		; 9 - sample offset
  1938 00000D88 [A1050000]              	dd      efxvolslide	; A - volume slide
  1939 00000D8C [85040000]              	dd      efxnull		; B - pattern jump
  1940 00000D90 [85040000]              	dd      efxnull		; C - set volume
  1941 00000D94 [85040000]              	dd      efxnull		; D - break pattern
  1942 00000D98 [85040000]              	dd      efxnull		; E - extra effects
  1943 00000D9C [85040000]              	dd      efxnull		; F - set speed
  1944                                  
  1945                                  ;-----------------------------------------------------------------------------
  1946                                  ; Amiga period table
  1947                                  ;-----------------------------------------------------------------------------
  1948                                  
  1949                                  ;PeriodTable0:	
  1950                                  ;	dw	0
  1951                                  PeriodTable:
  1952 00000DA0 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1952 00000DA9 0A000A7009E8086808-
  1952 00000DB2 F00780071407       
  1953 00000DB8 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1953 00000DC1 050005B80474043404-
  1953 00000DCA F803C0038A03       
  1954 00000DD0 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1954 00000DD9 0280025C023A021A02-
  1954 00000DE2 FC01E001C501       
  1955 00000DE8 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1955 00000DF1 0140012E011D010D01-
  1955 00000DFA FE00F000E200       
  1956 00000E00 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1956 00000E09 00A00097008F008700-
  1956 00000E12 7F0078007100       
  1957 00000E18 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1957 00000E21 0050004B0047004300-
  1957 00000E2A 3F003C003800       
  1958 00000E30 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1958 00000E39 002800250023002100-
  1958 00000E42 1F001E001C00       
  1959                                  
  1960                                  ;-----------------------------------------------------------------------------
  1961                                  ; Sinus wave table
  1962                                  ;-----------------------------------------------------------------------------
  1963                                  
  1964                                  SinTable:
  1965 00000E48 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1965 00000E51 C5D4E1             
  1966 00000E54 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1966 00000E5D E1                 
  1967 00000E5E D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1967 00000E67 19                 
  1968                                  
  1969                                  ;=============================================================================
  1970                                  ; Copyright Strings & Messages
  1971                                  ;=============================================================================
  1972 00000E68 00                      	db	0
  1973                                  msg_2017:
  1974 00000E69 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1974 00000E72 506C6179657220666F-
  1974 00000E7B 72205452444F532033-
  1974 00000E84 383620627920457264-
  1974 00000E8D 6F67616E2054616E2E-
  1974 00000E96 20                 
  1975 00000E97 4F63746F6265722032-     	db	'October 2017.',10,13
  1975 00000EA0 3031372E0A0D       
  1976 00000EA6 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1976 00000EAF 64706C61792066696C-
  1976 00000EB8 656E616D652E6D6F64-
  1976 00000EC1 0A0D00             
  1977 00000EC4 31382F31302F323031-     	db	'18/10/2017',10,13,0
  1977 00000ECD 370A0D00           
  1978                                  
  1979                                  Credits:
  1980 00000ED1 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1980 00000EDA 506C61796572207630-
  1980 00000EE3 2E3162206279204361-
  1980 00000EEC 726C6F732048617361-
  1980 00000EF5 6E2E204A756C792031-
  1980 00000EFE 3939332E           
  1981 00000F02 0A0D00                  	db	10,13,0
  1982                                  ErrorMesg:
  1983 00000F05 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  1983 00000F0E 64696E67204D6F6475-
  1983 00000F17 6C652066696C652E0A-
  1983 00000F20 0D00               
  1984                                  
  1985                                  ;MsgNotFound: db	'Sound Blaster not found or IRQ error.',10,13,0
  1986                                  ;MsgFound:    db	'Sound Blaster found at Address 2'
  1987                                  ;PortText:    db	'x0h, IRQ '
  1988                                  ;IrqText:     db	'x.',10,13,0
  1989                                  
  1990                                  trdos386_err_msg:
  1991 00000F22 5452444F5320333836-     	db	'TRDOS 386 System call error !', 10, 13,0
  1991 00000F2B 2053797374656D2063-
  1991 00000F34 616C6C206572726F72-
  1991 00000F3D 20210A0D00         
  1992                                  
  1993                                  ; 07/10/2017
  1994 00000F42 0A                      pattern_shift:	db 10
  1995                                  ;numtracks:	dw 4
  1996                                  ; 18/10/2017
  1997 00000F43 04000000                numtracks:	dd 4
  1998                                  
  1999                                  ;=============================================================================
  2000                                  ;               PLAYER.ASM - DATA
  2001                                  ;=============================================================================
  2002                                  
  2003 00000F47 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  2004 00000F48 08                      bps:		db 8 ; bits per sample (8 or 16)
  2005                                  Sample_Rate:
  2006 00000F49 2256                    MixSpeed:	dw 22050 ; Hz
  2007                                  
  2008                                  ; 13/11/2016
  2009 00000F4B 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2009 00000F54 3941424344454600   
  2010                                  ;
  2011                                  msgAC97Info:	
  2012 00000F5C 0D0A                    		db 0Dh, 0Ah
  2013 00000F5E 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2013 00000F67 6F20436F6E74726F6C-
  2013 00000F70 6C6572202620436F64-
  2013 00000F79 656320496E666F0D0A 
  2014 00000F82 56656E646F72204944-     		db "Vendor ID: "
  2014 00000F8B 3A20               
  2015 00000F8D 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2015 00000F96 6963652049443A20   
  2016 00000F9E 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2017 00000FA5 4275733A20              		db "Bus: "
  2018 00000FAA 303068204465766963-     msgBusNo:	db "00h Device: "
  2018 00000FB3 653A20             
  2019 00000FB6 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2019 00000FBF 696F6E3A20         
  2020 00000FC4 303068                  msgFncNo	db "00h"
  2021 00000FC7 0D0A                    		db 0Dh, 0Ah
  2022 00000FC9 4E414D4241523A20        		db "NAMBAR: "
  2023 00000FD1 30303030682020          msgNamBar	db "0000h  "
  2024 00000FD8 4E41424D4241523A20      		db "NABMBAR: "
  2025 00000FE1 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2025 00000FEA 513A20             
  2026 00000FED 3030                    msgIRQ:		dw 3030h
  2027 00000FEF 0D0A00                  		db 0Dh, 0Ah, 0
  2028                                  
  2029                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2030                                  ;codec_id:	   dd 0
  2031                                  ;codec_chip_id:	   dd 0
  2032                                  ;codec_vendor_ids: dw 0
  2033                                  ;codec_chip_ids:   dw 0
  2034                                  
  2035                                  ;dword_str:	dd 30303030h, 30303030h
  2036                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2037                                  
  2038                                  ;=============================================================================
  2039                                  ;        	uninitialized data
  2040                                  ;=============================================================================
  2041                                  
  2042                                  bss_start:
  2043                                  
  2044                                  ABSOLUTE bss_start
  2045                                  
  2046 00000FF2 <res 00000002>          alignb 4
  2047                                  
  2048 00000FF4 <res 00000004>          dev_vendor:	resd 1
  2049 00000FF8 <res 00000004>          bus_dev_fn:	resd 1
  2050 00000FFC <res 00000004>          stats_cmd:	resd 1
  2051 00001000 <res 00000002>          ac97_NamBar:	resw 1
  2052 00001002 <res 00000002>          ac97_NabmBar:	resw 1
  2053 00001004 <res 00000001>          ac97_int_ln_reg: resb 1
  2054 00001005 <res 00000001>          srb:		resb 1
  2055                                  
  2056                                  ; MODLOAD.ASM
  2057 00001006 <res 00000004>          FileHandle:	resd 1
  2058 0000100A <res 0000043C>          Header:		resb ModHeader.size
  2059                                  
  2060                                  ; MODPLAY.ASM
  2061                                  ;MixSpeed:	    resw 1
  2062                                  
  2063                                  ModInfo:
  2064 00001446 <res 00000001>          ModInfo.OrderLen:   resb 1
  2065 00001447 <res 00000001>          ModInfo.ReStart:    resb 1
  2066 00001448 <res 00000080>          ModInfo.Order:	    resb 128
  2067 000014C8 <res 00000004>          ModInfo.Patterns:   resd 1
  2068                                  
  2069 000014CC <res 0000003E>          ModInfo.SampOfs:    resw 31
  2070 0000150A <res 0000003E>          ModInfo.SampSeg:    resw 31
  2071 00001548 <res 0000003E>          ModInfo.SampLen:    resw 31
  2072 00001586 <res 0000003E>          ModInfo.SampRep:    resw 31
  2073 000015C4 <res 0000003E>          ModInfo.SampRepLen: resw 31
  2074 00001602 <res 0000003E>          ModInfo.SampVol:    resw 31
  2075                                  
  2076                                  ; MODPLAY.ASM
  2077                                  PitchTable:	;resw 857
  2078 00001640 <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2079 00003102 <res 00004100>          VolTable:	resb 16640
  2080 00007202 <res 00001FEC>          MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2081                                  
  2082                                  ; MODPLAY.ASM
  2083 000091EE <res 00000001>          OrderPos:	resb 1
  2084 000091EF <res 00000001>          Tempo:		resb 1
  2085 000091F0 <res 00000001>          TempoWait:	resb 1
  2086 000091F1 <res 00000001>          Bpm:		resb 1
  2087 000091F2 <res 00000001>          Row:		resb 1
  2088 000091F3 <res 00000001>          BreakRow:	resb 1
  2089 000091F4 <res 00000002>          BpmSamples:	resw 1
  2090 000091F6 <res 00000004>          BufPtr:		resd 1
  2091 000091FA <res 00000002>          BufLen:		resw 1
  2092 000091FC <res 00000004>          BufRep:		resd 1
  2093 00009200 <res 00000004>          Note:		resd 1
  2094                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2095                                  ; 07/10/2017
  2096 00009204 <res 00000130>          Tracks:	resb TrackInfo.size*8
  2097                                  
  2098 00009334 <res 0000000C>          alignb 16
  2099                                  
  2100                                  ; PLAY.ASM
  2101 00009340 <res 00000280>          Scope:		resw 320
  2102 000095C0 <res 00000200>          RowOfs:		resw 256
  2103                                  
  2104                                  mod_file_name:
  2105 000097C0 <res 00000050>          		resb 80
  2106                                  
  2107 00009810 <res 000007F0>          alignb 4096
  2108                                  
  2109                                  Audio_Buffer:
  2110 0000A000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2111                                  temp_buffer:
  2112                                  		;resb BUFFERSIZE / 4 ; 8192
  2113 00012000 <res 00004000>          		resb BUFFERSIZE / 2 ; 17/10/2017
  2114                                  		
  2115 00016000 <res 0000A000>          alignb 65536
  2116                                  
  2117                                  DMA_Buffer:
  2118 00020000 <res 00010000>          		resb 65536	
  2119                                  file_buffer:
  2120 00030000 <res 00060000>          		resb 65536*6
  2121                                  EOF:
