     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: 19/10/2017 ] !!! STEREO MOD PLAYING !!!
     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[F60F0000]            	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[D50E0000]        <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[09100000]        <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 E81E020000              	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[090F0000]        <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[08100000]            	mov	[ac97_int_ln_reg], al
   217 00000101 891D[F80F0000]          	mov	[dev_vendor], ebx
   218 00000107 890D[FC0F0000]          	mov	[bus_dev_fn], ecx
   219 0000010D 668915[04100000]        	mov	[ac97_NamBar], dx
   220                                  	;mov	[ac97_NamBar], dx
   221                                  	;shr	dx, 16
   222                                  	;mov	[ac97_NabmBar], dx
   223 00000114 8915[04100000]          	mov	[ac97_NamBar], edx	
   224                                    
   225 0000011A E8390A0000              	call	write_audio_dev_info 
   226                                  
   227                                  PlayNow: 
   228 0000011F E82D090000              	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 E83F080000              	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 E8F4090000              	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                                  	;
   271                                  	;19/10/2017
   272                                  	;Note: AC'97 hardware plays music as stereo and 16 bits.
   273                                  	;    'stmo' and 'bps' will not be recognized by TDDOS 386 kernel ('audio.s'). 	
   274                                  	;
   275 00000186 A0[4C0F0000]            	mov	al, [bps] ; 8 bits or 16 bits
   276 0000018B C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   277 0000018E D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   278 00000190 8A1D[4B0F0000]          	mov	bl, [stmo] ; 2 = stereo, 1 = mono
   279 00000196 FECB                    	dec	bl
   280 00000198 08C3                    	or	bl, al
   281 0000019A 668B0D[4D0F0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   282 000001A1 B704                    	mov	bh, 4 ; start to play	
   283                                  	sys	_audio
   283                              <1> 
   283                              <1> 
   283                              <1> 
   283                              <1> 
   283                              <1>  %if %0 >= 2
   283                              <1>  mov ebx, %2
   283                              <1>  %if %0 >= 3
   283                              <1>  mov ecx, %3
   283                              <1>  %if %0 = 4
   283                              <1>  mov edx, %4
   283                              <1>  %endif
   283                              <1>  %endif
   283                              <1>  %endif
   283 000001A3 B820000000          <1>  mov eax, %1
   283                              <1> 
   283 000001A8 CD40                <1>  int 40h
   284                                      
   285                                  	;; SETUP SIGNAL RESPONSE BYTE
   286                                  	;; 06/03/2017
   287                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   288                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   289                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   290                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   291                                  	;sys	_calbac
   292                                  	;jc	short error_exit
   293                                  
   294                                  	; DIRECT VGA MEMORY ACCESS
   295                                  	; bl = 0, bh = 5
   296                                  	; Direct access/map to VGA memory (0A0000h)
   297                                  
   298                                  	sys	_video, 0500h
   298                              <1> 
   298                              <1> 
   298                              <1> 
   298                              <1> 
   298                              <1>  %if %0 >= 2
   298 000001AA BB00050000          <1>  mov ebx, %2
   298                              <1>  %if %0 >= 3
   298                              <1>  mov ecx, %3
   298                              <1>  %if %0 = 4
   298                              <1>  mov edx, %4
   298                              <1>  %endif
   298                              <1>  %endif
   298                              <1>  %endif
   298 000001AF B81F000000          <1>  mov eax, %1
   298                              <1> 
   298 000001B4 CD40                <1>  int 40h
   299 000001B6 3D00000A00              	cmp	eax, 0A0000h
   300 000001BB 7418                    	je	short _a3
   301                                  error_exit:
   302                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   302                              <1> 
   302                              <1> 
   302                              <1> 
   302                              <1> 
   302                              <1>  %if %0 >= 2
   302 000001BD BB[260F0000]        <1>  mov ebx, %2
   302                              <1>  %if %0 >= 3
   302 000001C2 B9FF000000          <1>  mov ecx, %3
   302                              <1>  %if %0 = 4
   302 000001C7 BA0E000000          <1>  mov edx, %4
   302                              <1>  %endif
   302                              <1>  %endif
   302                              <1>  %endif
   302 000001CC B823000000          <1>  mov eax, %1
   302                              <1> 
   302 000001D1 CD40                <1>  int 40h
   303 000001D3 EB16                    	jmp	short Exit
   304                                  
   305                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   306                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   307                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   308                                  ;       second, or the module will sound "looped".
   309                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   310                                  ;       the polling is called from my routine, and then the irq 0 must be
   311                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   312                                  ;       samples played by the Sound Blaster. Note that some samples are
   313                                  ;       discarded in the next code, just for fun!
   314                                  
   315                                  _a3:
   316 000001D5 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   317 000001D9 CD31                    	int     31h
   318                                  
   319                                  	; 24/06/2017
   320 000001DB E864000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   321                                  
   322                                  _s_exit:
   323 000001E0 E81C090000              	call	StopPlaying	; STOP!
   324                                  
   325 000001E5 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   326 000001E9 CD31                    	int     31h
   327                                  Exit:           
   328                                  	;call    FreeModule	; Free MODule core.
   329                                  	
   330                                  	sys 	_exit	; Bye !
   330                              <1> 
   330                              <1> 
   330                              <1> 
   330                              <1> 
   330                              <1>  %if %0 >= 2
   330                              <1>  mov ebx, %2
   330                              <1>  %if %0 >= 3
   330                              <1>  mov ecx, %3
   330                              <1>  %if %0 = 4
   330                              <1>  mov edx, %4
   330                              <1>  %endif
   330                              <1>  %endif
   330                              <1>  %endif
   330 000001EB B801000000          <1>  mov eax, %1
   330                              <1> 
   330 000001F0 CD40                <1>  int 40h
   331                                  here:
   332 000001F2 EBFE                    	jmp	short here
   333                                  
   334                                  pmsg_2017:
   335                                  	sys	_msg, msg_2017, 255, 0Fh
   335                              <1> 
   335                              <1> 
   335                              <1> 
   335                              <1> 
   335                              <1>  %if %0 >= 2
   335 000001F4 BB[6D0E0000]        <1>  mov ebx, %2
   335                              <1>  %if %0 >= 3
   335 000001F9 B9FF000000          <1>  mov ecx, %3
   335                              <1>  %if %0 = 4
   335 000001FE BA0F000000          <1>  mov edx, %4
   335                              <1>  %endif
   335                              <1>  %endif
   335                              <1>  %endif
   335 00000203 B823000000          <1>  mov eax, %1
   335                              <1> 
   335 00000208 CD40                <1>  int 40h
   336 0000020A EBDF                    	jmp	short Exit
   337                                  
   338                                  DetectICH:
   339                                  	; 24/06/2017
   340                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   341                                          sys	_audio, 0102h
   341                              <1> 
   341                              <1> 
   341                              <1> 
   341                              <1> 
   341                              <1>  %if %0 >= 2
   341 0000020C BB02010000          <1>  mov ebx, %2
   341                              <1>  %if %0 >= 3
   341                              <1>  mov ecx, %3
   341                              <1>  %if %0 = 4
   341                              <1>  mov edx, %4
   341                              <1>  %endif
   341                              <1>  %endif
   341                              <1>  %endif
   341 00000211 B820000000          <1>  mov eax, %1
   341                              <1> 
   341 00000216 CD40                <1>  int 40h
   342 00000218 C3                      	retn
   343                                  
   344                                  noDevMsg:
   345 00000219 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   345 00000222 61626C6520746F2066-
   345 0000022B 696E64204143393720-
   345 00000234 617564696F20646576-
   345 0000023D 696365210D0A00     
   346                                  
   347                                  ;ac97_int_handler:
   348                                  ;	; 19/06/2017
   349                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   350                                  ;
   351                                  ;	sys	_rele ; return from callback service 
   352                                  ;	; we must not come here !
   353                                  ;	sys	_exit
   354                                  
   355                                  ;=============================================================================
   356                                  ;      
   357                                  ;=============================================================================
   358                                  
   359                                  PlayMod:
   360                                  	; 23/06/2017   
   361                                  	; 21/06/2017
   362                                  	; 19/06/2017
   363                                  
   364                                  	; 05/03/2017 (TRDOS 386)
   365                                  	; 14/02/2017
   366                                  	; 13/02/2017
   367                                  	; 08/12/2016
   368                                  	; 28/11/2016
   369                                  
   370 00000244 EB10                         	jmp	short modp_gs ; 23/06/2017
   371                                  p_loop:
   372 00000246 803D[09100000]00        	cmp	byte [srb], 0
   373 0000024D 7621                    	jna	short q_loop
   374 0000024F C605[09100000]00        	mov	byte [srb], 0
   375                                  modp_gs:
   376                                  	;mov	edi, Audio_Buffer
   377                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   378                                  	;call	GetSamples
   379                                  
   380                                  	; 24/06/2017
   381                                          ; load 8192 bytes into audio buffer
   382 00000256 BF[00200100]            	mov	edi, temp_buffer
   383 0000025B BB00200000              	mov	ebx, BUFFERSIZE / 4
   384 00000260 E80D070000              	call	GetSamples
   385 00000265 0F8252FFFFFF            	jc	error_exit
   386                                  
   387                                  	; 24/06/2017
   388                                  	; 8 bit to 16 bit (*2)
   389                                  	; mono to stereo (*2)
   390                                  	; 4* (BUFFERSIZE/4) 
   391                                  	; source = temp_buffer
   392                                  	; destination = Audio_Buffer
   393 0000026B E8C2080000              	call 	ConvertSamples
   394                                  
   395                                  q_loop:
   396 00000270 B401                    	mov     ah, 1		; any key pressed?
   397 00000272 CD32                    	int     32h		; no, Loop.
   398 00000274 7405                    	jz	short r_loop
   399                                  
   400 00000276 B400                    	mov     ah, 0		; flush key buffer...
   401 00000278 CD32                    	int     32h
   402                                  q_return:
   403 0000027A C3                      	retn
   404                                  r_loop:
   405                                  	; Get Current DMA buffer Pointer 
   406                                  	; 23/06/2017
   407                                  	; bh = 15, get current pointer (DMA buffer offset)
   408                                  	; bl = 0, for PCM OUT
   409                                  	; ecx = 0
   410                                  	;
   411                                  	sys	_audio, 0F00h, 0
   411                              <1> 
   411                              <1> 
   411                              <1> 
   411                              <1> 
   411                              <1>  %if %0 >= 2
   411 0000027B BB000F0000          <1>  mov ebx, %2
   411                              <1>  %if %0 >= 3
   411 00000280 B900000000          <1>  mov ecx, %3
   411                              <1>  %if %0 = 4
   411                              <1>  mov edx, %4
   411                              <1>  %endif
   411                              <1>  %endif
   411                              <1>  %endif
   411 00000285 B820000000          <1>  mov eax, %1
   411                              <1> 
   411 0000028A CD40                <1>  int 40h
   412                                  ScopeLoop:
   413 0000028C BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   414                                  	; 23/06/2017
   415 00000291 BE[00000200]            	mov     esi, DMA_Buffer
   416 00000296 01C6                    	add     esi, eax	; add offset value
   417                                  	; 24/06/2017
   418 00000298 B9[00FB0200]            	mov	ecx, DMA_Buffer + (65536 - (320*4))
   419 0000029D 39CE                    	cmp	esi, ecx 
   420 0000029F 7602                    	jna	short _4
   421 000002A1 89CE                    	mov	esi, ecx
   422                                  _4:
   423 000002A3 31C9                    	xor     ecx, ecx	; to be drawed ...
   424 000002A5 31D2                    	xor     edx, edx
   425                                  DrawLoop:       
   426 000002A7 89D3                    	mov     ebx, edx	; (save Index)
   427 000002A9 668BBB[40930000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   428 000002B0 C60700                  	mov     byte [edi], 0	; erase it!
   429                                  	;; 24/06/2017
   430                                  	;lodsd
   431                                  	;add	ah, 80h
   432                                  	;mov	bl, ah
   433                                  	; 19/10/2017
   434 000002B3 66AD                    	lodsw
   435 000002B5 80C480                  	add	ah, 80h
   436 000002B8 88E3                    	mov	bl, ah  ; Left Channel
   437 000002BA 66AD                    	lodsw
   438 000002BC 00E3                    	add	bl, ah	; Right Channel
   439                                  	;
   440 000002BE 30FF                    	xor     bh, bh
   441 000002C0 66D1E3                  	shl     bx, 1
   442 000002C3 668BBB[C0950000]        	mov     di, [RowOfs+ebx]
   443 000002CA 6601CF                  	add     di, cx
   444 000002CD 6689D3                  	mov     bx, dx		; (restore Index)
   445 000002D0 6689BB[40930000]        	mov     [Scope+ebx], di	; save new address...
   446 000002D7 C6070A                  	mov     byte [edi], 10	; and DRAW.
   447 000002DA 6683C202                	add     dx, 2		; the next pixel...
   448 000002DE 41                      	inc     ecx
   449 000002DF 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   450 000002E4 72C1                    	jb      short DrawLoop
   451 000002E6 E95BFFFFFF              	jmp	p_loop
   452                                  
   453                                  
   454                                  ;=============================================================================
   455                                  ;               MODLOAD.ASM
   456                                  ;=============================================================================
   457                                  
   458                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   459                                  ;	July 10th, 1993.
   460                                  
   461                                  ; STRUCTURES
   462                                  
   463                                  struc ModSample
   464 00000000 <res 00000016>          .msName:	resb 22
   465 00000016 <res 00000002>          .msLength:	resw 1
   466 00000018 <res 00000001>          .msFinetune:	resb 1
   467 00000019 <res 00000001>          .msVolume:	resb 1
   468 0000001A <res 00000002>          .msRepeat:	resw 1
   469 0000001C <res 00000002>          .msRepLen:	resw 1
   470                                  .size:
   471                                  endstruc
   472                                  
   473                                  struc ModHeader
   474 00000000 <res 00000014>          .mhName:	resb 20
   475 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   476 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   477 000003B7 <res 00000001>          .mhReStart:	resb 1
   478 000003B8 <res 00000080>          .mhOrder:	resb 128
   479 00000438 <res 00000004>          .mhSign:	resw 2
   480                                  .size:	
   481                                  endstruc
   482                                  
   483                                  struc ModInfoRec
   484 00000000 <res 00000001>          .OrderLen:	resb 1
   485 00000001 <res 00000001>          .ReStart:	resb 1
   486 00000002 <res 00000080>          .Order:	resb 128
   487 00000082 <res 00000004>          .Patterns:	resd 1
   488 00000086 <res 0000003E>          .SampOfs:	resw 31
   489 000000C4 <res 0000003E>          .SampSeg:	resw 31
   490 00000102 <res 0000003E>          .SampLen:	resw 31
   491 00000140 <res 0000003E>          .SampRep:	resw 31
   492 0000017E <res 0000003E>          .SampRepLen:	resw 31
   493 000001BC <res 0000003E>          .SampVol:	resw 31
   494                                  .size:	
   495                                  endstruc
   496                                  
   497                                  ; CODE
   498                                  
   499                                  ; 07/10/2017 (modplay3.s)
   500                                  ; tinyply3.s
   501                                  ; 06/10/2017
   502                                  ; 04/10/2017
   503                                  ; /* MOD FileFormat */
   504                                  
   505                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   506                                  ID_FLT4 equ 34544C46h ; "FLT4"
   507                                  ID_8CHN equ 4E484338h ; "8CHN"
   508                                  ID_FLT8 equ 34544C46h ; "FLT8"
   509                                  
   510                                  ; CODE
   511                                  
   512                                  LoadModule:
   513                                  	; edi = file name address
   514                                  
   515 000002EB 60                      	pushad
   516                                  
   517 000002EC E878010000              	call    ClearModInfo
   518                                  OpenFile:       
   519                                  	; ebx = ASCIIZ file name address
   520                                  	; ecx = open mode (0 = open for read)	
   521                                  	sys	_open, edi, 0 ; open for reading
   521                              <1> 
   521                              <1> 
   521                              <1> 
   521                              <1> 
   521                              <1>  %if %0 >= 2
   521 000002F1 89FB                <1>  mov ebx, %2
   521                              <1>  %if %0 >= 3
   521 000002F3 B900000000          <1>  mov ecx, %3
   521                              <1>  %if %0 = 4
   521                              <1>  mov edx, %4
   521                              <1>  %endif
   521                              <1>  %endif
   521                              <1>  %endif
   521 000002F8 B805000000          <1>  mov eax, %1
   521                              <1> 
   521 000002FD CD40                <1>  int 40h
   522 000002FF 0F8262010000            	jc	Failed
   523 00000305 A3[0A100000]            	mov     [FileHandle], eax
   524                                  ReadHeader:
   525                                  	; ebx = File handle
   526                                  	; ecx = Buffer address
   527                                  	; edx = Byte count
   528                                  	sys	_read, [FileHandle], Header, ModHeader.size
   528                              <1> 
   528                              <1> 
   528                              <1> 
   528                              <1> 
   528                              <1>  %if %0 >= 2
   528 0000030A 8B1D[0A100000]      <1>  mov ebx, %2
   528                              <1>  %if %0 >= 3
   528 00000310 B9[0E100000]        <1>  mov ecx, %3
   528                              <1>  %if %0 = 4
   528 00000315 BA3C040000          <1>  mov edx, %4
   528                              <1>  %endif
   528                              <1>  %endif
   528                              <1>  %endif
   528 0000031A B803000000          <1>  mov eax, %1
   528                              <1> 
   528 0000031F CD40                <1>  int 40h
   529 00000321 0F8231010000            	jc      CloseFile
   530                                  CheckMK:  
   531                                  	; 04/10/2017
   532 00000327 A1[46140000]            	mov	eax, [Header+ModHeader.mhSign]
   533                                        
   534 0000032C 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   535                                  	;je	short Is4chnMod
   536 00000331 742B                    	je	short IsModFile
   537                                  CheckFLT4:
   538 00000333 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   539                                  	;je	short Is4chnMod
   540 00000338 7424                    	je	short IsModFile
   541                                  Check8CHN:
   542 0000033A 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   543 0000033F 740D                    	je	short Is8chnMod
   544                                  CheckFLT8:
   545 00000341 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   546                                  	; 06/10/2017
   547 00000346 7406                    	je	short Is8chnMod
   548 00000348 F9                      	stc
   549 00000349 E90A010000              	jmp	CloseFile
   550                                  Is8chnMod:
   551 0000034E C605[470F0000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   552 00000355 C605[460F0000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   553 0000035C EB00                    	jmp	short IsModFile
   554                                  ;Is4chnMod:
   555                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   556                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   557                                  
   558                                  IsModFile:
   559 0000035E A0[C4130000]            	mov     al, [Header+ModHeader.mhOrderLen]
   560 00000363 A2[4A140000]            	mov     [ModInfo.OrderLen], al
   561                                  
   562 00000368 A0[C5130000]            	mov     al, [Header+ModHeader.mhReStart]
   563 0000036D 3A05[C4130000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   564 00000373 7202                    	jb      short SetReStart
   565 00000375 B07F                    	mov     al, 7Fh
   566                                  SetReStart:
   567 00000377 A2[4B140000]            	mov     [ModInfo.ReStart], al
   568                                  
   569                                  	;mov	ecx, 128
   570 0000037C 66B98000                	mov	cx, 128
   571 00000380 31D2                    	xor     edx, edx
   572 00000382 31DB                    	xor     ebx, ebx
   573                                  CopyOrder:
   574 00000384 8AB3[C6130000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   575 0000038A 88B3[4C140000]          	mov     [ModInfo.Order+ebx], dh
   576 00000390 38D6                    	cmp     dh, dl
   577 00000392 7202                    	jb      short NextOrder
   578 00000394 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   579                                  NextOrder:
   580 00000396 43                      	inc     ebx
   581 00000397 E2EB                    	loop    CopyOrder
   582                                  AllocPatterns:  
   583 00000399 81E2FF000000            	and	edx, 0FFh
   584                                  	; 04/10/2017
   585                                  	;inx	dx  ; 12/03/2017
   586 0000039F FEC2                    	inc	dl
   587                                  	; dl = number of patterns (04/07/2017)
   588 000003A1 8A0D[460F0000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   589 000003A7 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   590                                  	     ; *2048 ; (byte count of patterns *64*8*4)
   591                                  	;
   592 000003A9 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   593                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   594 000003AB B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   595                                  	;
   596 000003B0 890D[CC140000]          	mov	[ModInfo.Patterns], ecx
   597                                  	;
   598 000003B6 01CD                    	add	ebp, ecx ; next offset for samples
   599                                  ReadPatterns:  
   600                                  	;mov	ebx, [FileHandle] 
   601                                  	; ebx = File handle
   602                                  	; ecx = Buffer address
   603                                  	; edx = Byte count
   604                                  	sys	_read, [FileHandle]
   604                              <1> 
   604                              <1> 
   604                              <1> 
   604                              <1> 
   604                              <1>  %if %0 >= 2
   604 000003B8 8B1D[0A100000]      <1>  mov ebx, %2
   604                              <1>  %if %0 >= 3
   604                              <1>  mov ecx, %3
   604                              <1>  %if %0 = 4
   604                              <1>  mov edx, %4
   604                              <1>  %endif
   604                              <1>  %endif
   604                              <1>  %endif
   604 000003BE B803000000          <1>  mov eax, %1
   604                              <1> 
   604 000003C3 CD40                <1>  int 40h
   605 000003C5 0F828D000000            	jc      CloseFile
   606                                  
   607                                  	; patterns have been loaded here... (04/07/2017)
   608                                  
   609 000003CB BE[22100000]            	mov	esi, Header+ModHeader.mhSamples
   610 000003D0 31FF                    	xor     edi, edi
   611                                  CopySamples:
   612 000003D2 668B4616                	mov     ax, [esi+ModSample.msLength]
   613 000003D6 86C4                    	xchg    al, ah
   614 000003D8 66D1E0                  	shl     ax, 1
   615 000003DB 668987[4C150000]        	mov     [ModInfo.SampLen+edi], ax
   616 000003E2 8A4619                  	mov     al, [esi+ModSample.msVolume]
   617 000003E5 30E4                    	xor     ah, ah
   618 000003E7 668987[06160000]        	mov     [ModInfo.SampVol+edi], ax
   619 000003EE 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   620 000003F2 86C4                    	xchg    al, ah
   621 000003F4 66D1E0                  	shl     ax, 1
   622 000003F7 668987[8A150000]        	mov     [ModInfo.SampRep+edi], ax
   623 000003FE 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   624 00000402 86C4                    	xchg    al, ah
   625 00000404 66D1E0                  	shl     ax, 1
   626 00000407 668987[C8150000]        	mov     [ModInfo.SampRepLen+edi], ax
   627 0000040E 83C61E                  	add     esi, ModSample.size
   628 00000411 6683C702                	add     di, 2
   629 00000415 6683FF3E                	cmp     di, 2*31
   630 00000419 72B7                    	jb      short CopySamples
   631                                  
   632 0000041B 31F6                    	xor     esi, esi
   633                                  AllocSamples:
   634 0000041D 0FB796[4C150000]        	movzx	edx, word [ModInfo.SampLen+esi]
   635                                  	; 07/10/2017
   636                                  	;shr	dx, 4 ; ***
   637 00000424 21D2                    	and	edx, edx
   638 00000426 7426                    	jz      short NextSample
   639                                  	;inc	dx  ; number of paragraphs ; ***
   640                                  	;shl	dx, 4 ; ***
   641 00000428 89E8                    	mov	eax, ebp
   642 0000042A 668986[D0140000]        	mov	[ModInfo.SampOfs+esi], ax
   643 00000431 C1E810                  	shr	eax, 16
   644 00000434 668986[0E150000]        	mov	[ModInfo.SampSeg+esi], ax
   645 0000043B 89E9                    	mov	ecx, ebp
   646 0000043D 01D5                    	add	ebp, edx ; next offset for sample 
   647                                  ReadSample:
   648                                  	;mov	ebx, [FileHandle]
   649                                  	;movzx  edx, [ModInfo.SampLen+esi]
   650                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   651                                  
   652                                  	; ebx = File handle
   653                                  	; ecx = Buffer address
   654                                  	; edx = Byte count
   655                                  	sys	_read, [FileHandle]
   655                              <1> 
   655                              <1> 
   655                              <1> 
   655                              <1> 
   655                              <1>  %if %0 >= 2
   655 0000043F 8B1D[0A100000]      <1>  mov ebx, %2
   655                              <1>  %if %0 >= 3
   655                              <1>  mov ecx, %3
   655                              <1>  %if %0 = 4
   655                              <1>  mov edx, %4
   655                              <1>  %endif
   655                              <1>  %endif
   655                              <1>  %endif
   655 00000445 B803000000          <1>  mov eax, %1
   655                              <1> 
   655 0000044A CD40                <1>  int 40h
   656 0000044C 720A                    	jc      short CloseFile
   657                                  
   658                                  NextSample:
   659 0000044E 6683C602                	add     si, 2
   660 00000452 6683FE3E                	cmp     si, 2*31
   661 00000456 72C5                    	jb      short AllocSamples
   662                                  CloseFile:      
   663 00000458 9C                      	pushf
   664                                  	sys	_close, [FileHandle]
   664                              <1> 
   664                              <1> 
   664                              <1> 
   664                              <1> 
   664                              <1>  %if %0 >= 2
   664 00000459 8B1D[0A100000]      <1>  mov ebx, %2
   664                              <1>  %if %0 >= 3
   664                              <1>  mov ecx, %3
   664                              <1>  %if %0 = 4
   664                              <1>  mov edx, %4
   664                              <1>  %endif
   664                              <1>  %endif
   664                              <1>  %endif
   664 0000045F B806000000          <1>  mov eax, %1
   664                              <1> 
   664 00000464 CD40                <1>  int 40h
   665 00000466 9D                      	popf
   666                                  Failed:       
   667 00000467 61                      	popad
   668 00000468 C3                      	retn
   669                                  
   670                                  FreeModule:
   671                                  	; Erdogan Tan (13/02/2017)
   672                                  	; nothing to do here for memory de-allocation
   673                                  ClearModInfo:
   674 00000469 57                      	push	edi
   675 0000046A BF[4A140000]            	mov	edi, ModInfo
   676 0000046F B9FA010000              	mov     ecx, ModInfoRec.size
   677                                  	;cld
   678 00000474 30C0                    	xor     al, al
   679 00000476 F3AA                    	rep     stosb
   680 00000478 5F                      	pop	edi
   681 00000479 C3                      	retn
   682                                  
   683                                  ;=============================================================================
   684                                  ;               MODPLAY.ASM
   685                                  ;=============================================================================
   686                                  
   687                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   688                                  ;	July 23th, 1993.
   689                                  
   690                                  ; EQUATES
   691                                  
   692                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   693                                  DefTempo        equ 6
   694                                  DefBpm          equ 125
   695                                  MidCRate        equ 8448
   696                                  MixBufSize	equ 4096
   697                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   698                                  
   699                                  ; STRUCTURES
   700                                  
   701                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   702 00000000 <res 00000004>          .Samples:	resd 1
   703                                  ;.Position:	resw 1
   704 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   705 00000008 <res 00000002>          .Len:	resw 1
   706 0000000A <res 00000002>          .Repeat:	resw 1
   707 0000000C <res 00000002>          .RepLen:	resw 1
   708 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   709 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   710                                  ;.Error:	resb 1
   711                                  ;.Reserved:	resb 1 ; 01/10/2017
   712 00000010 <res 00000002>          .Period:	resw 1 ; Period
   713 00000012 <res 00000002>          .Pitch:	resw 1 
   714 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   715 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   716 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   717 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   718 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   719 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   720 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   721                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   722 0000001D <res 00000001>          .Error:	resb 1 ; 01/10/2017
   723 0000001E <res 00000006>          .Arp:	resw 3
   724 00000024 <res 00000002>          .ArpIndex:	resw 1
   725                                  .size:	; 38 bytes ; 01/10/2017 -  TRDOS 386
   726                                  endstruc
   727                                  
   728                                  ; CODE
   729                                  
   730                                  ;--------------------------------------------------------------------------
   731                                  ; updatechannel - update the track using the current effect
   732                                  ;--------------------------------------------------------------------------
   733                                  ; 
   734                                  ;--------------------------------------------------------------------------
   735                                  ; BeatTrack:  Process the next beat in one track.
   736                                  ;  In:
   737                                  ;    ds:di -  Track info Address.
   738                                  ;--------------------------------------------------------------------------
   739                                  
   740                                  ; edi = Track info address
   741                                  
   742                                  updatechannel:
   743                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   744                                  
   745 0000047A 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   746                                  
   747                                  	;test   dx, dx
   748                                  	;je     short None
   749                                  	;cmp    dh, 00h
   750                                  	;je     short Arpeggio
   751                                  	;cmp    dh, 01h
   752                                  	;je     short PortUp
   753                                  	;cmp    dh, 02h
   754                                  	;je     short PortDown
   755                                  	;cmp    dh, 03h
   756                                  	;je     TonePort
   757                                  	;cmp    dh, 04h
   758                                  	;je     Vibrato
   759                                  	;cmp    dh, 05h
   760                                  	;je     PortSlide
   761                                  	;cmp    dh, 06h
   762                                  	;je     VibSlide
   763                                  	;cmp    dh, 0Ah
   764                                  	;je     VolSlide
   765                                  	;retn
   766                                  
   767 0000047E 0FB6C6                  	movzx	eax, dh
   768 00000481 240F                    	and	al, 0Fh
   769 00000483 FF2485[640D0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   770                                  efxnull:
   771                                  None:           
   772 0000048A C3                      	retn
   773                                  efxarpeggio2:
   774                                  	; 01/10/2017
   775 0000048B 84D2                    	test    dl, dl
   776 0000048D 74FB                    	jz      short efxnull
   777                                  Arpeggio:
   778 0000048F 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   779 00000493 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   780 00000498 66894712                	mov     [edi+TrackInfo.Pitch], ax
   781 0000049C 6683C302                	add     bx, 2
   782 000004A0 6683FB06                	cmp     bx, 6
   783 000004A4 7202                    	jb      short SetArpIndex
   784 000004A6 31DB                    	xor     ebx, ebx
   785                                  SetArpIndex:
   786 000004A8 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   787 000004AC C3                      	retn
   788                                  efxportaup:
   789                                  PortUp:
   790 000004AD 30F6                    	xor     dh, dh
   791                                  	;mov	bx, [edi+TrackInfo.Period]
   792 000004AF 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   793 000004B3 6629D3                  	sub     bx, dx
   794                                  	;cmp	bx, 113
   795 000004B6 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   796 000004BA 7D04                    	jge     short NotSmall
   797                                  	;mov	bx, 113
   798 000004BC 66BB1C00                	mov	bx, 28 ; 01/10/2017
   799                                  NotSmall:
   800 000004C0 66895F10                	mov     [edi+TrackInfo.Period], bx
   801 000004C4 6601DB                  	add     bx, bx
   802                                  	;mov	ax, [PitchTable+bx]
   803 000004C7 668B83[44160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   804 000004CE 66894712                	mov     [edi+TrackInfo.Pitch], ax
   805 000004D2 C3                      	retn
   806                                  efxportadown:
   807                                  PortDown:
   808 000004D3 30F6                    	xor     dh, dh
   809                                  	;mov	bx, [edi+TrackInfo.Period]
   810 000004D5 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   811 000004D9 6601D3                  	add     bx, dx
   812 000004DC 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   813                                  	;cmp	bx, 856
   814 000004E1 7E04                    	jle     short NotBig
   815                                  	;mov	bx, 856
   816 000004E3 66BB600D                	mov	bx, 3424 ; 01/10/2017
   817                                  NotBig:         
   818 000004E7 66895F10                	mov     [edi+TrackInfo.Period], bx
   819 000004EB 6601DB                  	add     bx, bx
   820                                  	;mov	ax, [PitchTable+bx]
   821 000004EE 668B83[44160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   822 000004F5 66894712                	mov     [edi+TrackInfo.Pitch], ax
   823 000004F9 C3                      	retn
   824                                  efxtoneporta2:
   825                                  TonePort:
   826 000004FA 30F6                    	xor     dh, dh
   827 000004FC 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   828                                  	;mov	bx, [edi+TrackInfo.Period]
   829 00000500 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   830 00000504 6639C3                  	cmp     bx, ax
   831 00000507 7429                    	je      short NoPort
   832 00000509 7F0D                    	jg      short PortToUp
   833                                  PortToDown:     
   834 0000050B 6601D3                  	add     bx, dx
   835 0000050E 6639C3                  	cmp     bx, ax
   836 00000511 7E0D                    	jle     short SetPort
   837                                  FixPort:        
   838 00000513 6689C3                  	mov     bx, ax
   839 00000516 EB08                    	jmp     short SetPort
   840                                  PortToUp:
   841 00000518 6629D3                  	sub     bx, dx
   842 0000051B 6639C3                  	cmp     bx, ax
   843 0000051E 7CF3                    	jl      short FixPort
   844                                  SetPort:        
   845 00000520 66895F10                	mov     [edi+TrackInfo.Period], bx
   846 00000524 6601DB                  	add     bx, bx
   847                                  	;mov	ax, [PitchTable+bx]
   848 00000527 668B83[44160000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   849 0000052E 66894712                	mov     [edi+TrackInfo.Pitch], ax
   850                                  NoPort:         
   851 00000532 C3                      	retn
   852                                  efxvibrato2:
   853                                  	; 01/10/2017
   854                                  Vibrato:
   855 00000533 88D6                    	mov     dh, dl
   856                                  	;and	dl, 0Fh
   857                                  	;shr	dh, 4
   858                                  	;shl	dh, 2
   859 00000535 6681E20FF0              	and     dx, 0F00Fh
   860 0000053A C0EE02                  	shr     dh, 2
   861                                  	;add	[edi+TrackInfo.VibPos], dh
   862                                  	;mov	dh, [edi+TrackInfo.VibPos]
   863                                  	;mov	bl, dh
   864 0000053D 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   865 00000540 007719                  	add	[edi+TrackInfo.VibPos], dh
   866 00000543 88DE                    	mov	dh, bl ; 01/10/2017
   867 00000545 C0EB02                  	shr     bl, 2
   868                                  	;and	bx, 1Fh
   869                                  	;mov	al, [SinTable+bx]
   870 00000548 83E31F                  	and	ebx, 1Fh
   871 0000054B 8A83[4C0E0000]          	mov	al, [SinTable+ebx]
   872 00000551 F6E2                    	mul     dl
   873                                  	;rol	ax, 1
   874                                  	;xchg	al, ah
   875                                  	;and	ah, 1
   876 00000553 66C1E807                	shr	ax, 7
   877 00000557 84F6                    	test    dh, dh
   878 00000559 7903                    	jns     short VibUp
   879 0000055B 66F7D8                  	neg     ax
   880                                  VibUp:          
   881 0000055E 66034710                	add     ax, [edi+TrackInfo.Period]
   882 00000562 6689C3                  	mov	bx, ax
   883                                  	;movzx	ebx, ax
   884 00000565 6683FB71                	cmp     bx, 113
   885                                  	;cmp	bx, 113
   886 00000569 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   887 0000056D 7D06                    	jge     short NoLoVib
   888                                  	;mov	bx, 113
   889 0000056F 66BB1C00                	mov	bx, 28	; 01/10/2017
   890 00000573 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   891                                  NoLoVib:        
   892 00000575 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   893                                  	;cmp	bx, 856
   894 0000057A 7E04                    	jle     short NoHiVib
   895                                  	;mov	bx, 856
   896 0000057C 66BB600D                	mov	bx, 3424 ; 01/10/2017
   897                                  NoHiVib:        
   898 00000580 6601DB                  	add     bx, bx
   899                                  	;mov	ax, [PitchTable+bx]
   900 00000583 668B83[44160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   901 0000058A 66894712                	mov     [edi+TrackInfo.Pitch], ax
   902 0000058E C3                      	retn
   903                                  efxtoneslide:
   904                                  PortSlide:
   905 0000058F E812000000              	call    VolSlide
   906 00000594 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   907 00000597 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   908                                  efxvibslide:
   909                                  VibSlide:
   910 0000059C E805000000              	call    VolSlide
   911 000005A1 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   912 000005A4 EB8D                    	jmp     short Vibrato  ; efxvibrato2
   913                                  efxvolslide:
   914                                  VolSlide:
   915 000005A6 88D6                    	mov     dh, dl
   916 000005A8 80E20F                  	and     dl, 0Fh
   917 000005AB C0EE04                  	shr     dh, 4
   918 000005AE 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   919 000005B1 28D0                    	sub     al, dl
   920 000005B3 7D02                    	jge     short NoLoVol
   921 000005B5 30C0                    	xor     al, al
   922                                  NoLoVol:        
   923 000005B7 00F0                    	add     al, dh
   924 000005B9 3C40                    	cmp     al, 64
   925 000005BB 7602                    	jbe     short NoHiVol
   926 000005BD B040                    	mov     al, 64
   927                                  NoHiVol:        
   928 000005BF 88470E                  	mov     [edi+TrackInfo.Volume], al
   929 000005C2 C3                      	retn
   930                                  
   931                                  efxtremolo2:
   932                                  	; 01/10/2017 (TMODPLAY.ASM)
   933                                  Tremolo:
   934 000005C3 88D6                    	mov     dh, dl
   935 000005C5 6681E20FF0              	and     dx, 0F00Fh
   936 000005CA C0EE02                  	shr     dh, 2
   937 000005CD 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
   938 000005D0 00771B                  	add	[edi+TrackInfo.TremPos], dh
   939 000005D3 88DE                    	mov	dh, bl
   940 000005D5 C0EB02                  	shr     bl, 2
   941                                  	; 01/10/2017 - TRDOS 386
   942                                  	;and	bx, 1Fh
   943 000005D8 83E31F                  	and	ebx, 1Fh 
   944                                  	;mov	al, [SinTable+bx]
   945 000005DB 8A83[4C0E0000]          	mov     al, [SinTable+ebx]
   946 000005E1 F6E2                    	mul     dl
   947 000005E3 66C1E806                	shr	ax, 6
   948 000005E7 84F6                    	test    dh, dh
   949 000005E9 7D03                    	jge	short Tremolo_1 ; efxtremolof2
   950 000005EB 66F7D8                  	neg     ax
   951                                  efxtremolof2:
   952                                  Tremolo_1:      
   953 000005EE 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
   954 000005F1 00E0                    	add     al, ah
   955 000005F3 7D02                    	jge     short Tremolo_2 ; efxtremolof3
   956 000005F5 30C0                    	xor     al, al
   957                                  efxtremolof3:
   958                                  Tremolo_2:       
   959 000005F7 3C40                    	cmp     al, 64 ; 40h
   960 000005F9 7E02                    	jle     short Tremolo_3 ; efxtremolof4
   961 000005FB B040                    	mov     al, 64 ; 40h
   962                                  efxtremolof4:
   963                                  Tremolo_3:       
   964 000005FD 28E0                    	sub	al, ah  ; ****** 
   965 000005FF 88470F                  	mov     [edi+TrackInfo.VolDiff], al
   966 00000602 C3                      	retn	
   967                                  
   968                                  ;--------------------------------------------------------------------------
   969                                  ; readchannel - read the next note event from the pattern sheet
   970                                  ;--------------------------------------------------------------------------
   971                                  ;
   972                                  ;--------------------------------------------------------------------------
   973                                  ; GetTrack:   Get the next Note from a pattern.
   974                                  ;  In:
   975                                  ;    ds:di -  Track info Address.
   976                                  ;    es:si -  Pattern Note Address.
   977                                  ; Out:
   978                                  ;    es:si -  The Next Pattern Note address.
   979                                  ;--------------------------------------------------------------------------
   980                                  
   981                                  ; esi = Pattern note address
   982                                  ; edi = Track info address
   983                                  
   984                                  readchannel:
   985                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
   986 00000603 66AD                    	lodsw
   987 00000605 86C4                    	xchg    al, ah
   988 00000607 88E3                    	mov	bl, ah
   989 00000609 80E40F                  	and     ah, 0Fh
   990 0000060C 6689C1                  	mov     cx, ax
   991 0000060F 66AD                    	lodsw
   992 00000611 86C4                    	xchg    al, ah
   993 00000613 88E7                    	mov     bh, ah
   994 00000615 80E40F                  	and     ah, 0Fh
   995 00000618 6689C2                  	mov     dx, ax
   996 0000061B 66895714                	mov     [edi+TrackInfo.Effect], dx
   997                                  	; 01/10/2017 - TRDOS 386
   998                                  	;and	bl, 0F0h
   999 0000061F 81E3F0FF0000            	and	ebx, 0FFF0h
  1000 00000625 C0EF04                  	shr     bh, 4
  1001 00000628 08FB                    	or      bl, bh
  1002 0000062A 7446                    	jz      short SetPeriod
  1003                                  SetSample:
  1004 0000062C 30FF                    	xor	bh, bh
  1005                                  	;and	ebx, 0FFh
  1006 0000062E FECB                    	dec     bl
  1007 00000630 01DB                    	add     ebx, ebx
  1008 00000632 668B83[06160000]        	mov     ax, [ModInfo.SampVol+ebx]
  1009 00000639 88470E                  	mov     [edi+TrackInfo.Volume], al
  1010 0000063C 668B83[D0140000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1011 00000643 668907                  	mov     [edi+TrackInfo.Samples], ax
  1012 00000646 668B83[0E150000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1013 0000064D 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1014 00000651 668B83[4C150000]        	mov     ax, [ModInfo.SampLen+ebx]
  1015 00000658 66894708                	mov     [edi+TrackInfo.Len], ax
  1016 0000065C 668B83[8A150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1017 00000663 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1018 00000667 668B83[C8150000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1019 0000066E 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1020                                  SetPeriod:      
  1021 00000672 6685C9                  	test    cx, cx
  1022 00000675 7425                    	jz      short SetEffect
  1023                                  
  1024 00000677 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1025                                  	
  1026 0000067B 80FE03                  	cmp     dh, 03h
  1027                                  	;je	short SetEffect
  1028 0000067E 7428                    	je	short efxtoneporta ; 01/10/2017
  1029                                  
  1030 00000680 66894F10                	mov     [edi+TrackInfo.Period], cx
  1031                                  	;movzx	ebx, cx
  1032 00000684 6689CB                  	mov     bx, cx
  1033 00000687 6601DB                  	add     bx, bx
  1034                                  	;mov	ax, [PitchTable+bx]
  1035 0000068A 668B83[44160000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1036 00000691 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1037 00000695 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1038                                  SetEffect:
  1039                                  	;test	dx, dx
  1040                                  	;je	short InitNone
  1041                                  	;cmp	dh, 00h
  1042                                  	;je	InitArpeggio
  1043                                  	;cmp	dh, 03h
  1044                                  	;je	short InitTonePort
  1045                                  	;cmp	dh, 04h
  1046                                  	;je	short InitVibrato
  1047                                  	;cmp	dh, 09h
  1048                                  	;je	short SampleOfs
  1049                                  	;cmp	dh, 0Bh
  1050                                  	;je	short PosJump
  1051                                  	;cmp	dh, 0Ch
  1052                                  	;je	short SetVolume
  1053                                  	;cmp	dh, 0Dh
  1054                                  	;je	short Break
  1055                                  	;cmp	dh, 0Fh
  1056                                  	;je	SetSpeed
  1057                                  	;retn
  1058                                  
  1059                                  	; 01/10/2017 (TMODPLAY.ASM)
  1060                                  	
  1061                                  	; dx = [di+TrackInfo.Effect]
  1062                                  	
  1063 0000069C 0FB6C6                  	movzx	eax, dh
  1064 0000069F 240F                    	and	al, 0Fh
  1065 000006A1 FF2485[240D0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1066                                  ;efxnull:
  1067                                  ;InitNone:
  1068                                  ;	retn
  1069                                  efxtoneporta:
  1070                                  	; 01/10/2017
  1071                                  	; cx = period
  1072                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1073                                  InitTonePort:
  1074 000006A8 84D2                    	test    dl, dl
  1075 000006AA 7503                    	jnz     short SetPortParm
  1076 000006AC 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1077                                  SetPortParm:    
  1078 000006AF 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1079 000006B2 66895714                	mov     [edi+TrackInfo.Effect], dx
  1080 000006B6 C3                      	retn
  1081                                  efxvibrato:
  1082                                  InitVibrato:
  1083 000006B7 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1084 000006BA 88C4                    	mov     ah, al
  1085                                  	;and	al, 0Fh
  1086                                  	;and	ah, 0F0h
  1087 000006BC 66250FF0                	and	ax, 0F00Fh
  1088 000006C0 F6C20F                  	test    dl, 0Fh
  1089 000006C3 7502                    	jne     short OkDepth
  1090 000006C5 08C2                    	or      dl, al
  1091                                  OkDepth:        
  1092 000006C7 F6C2F0                  	test    dl, 0F0h
  1093 000006CA 7502                    	jnz     short OkRate
  1094 000006CC 08E2                    	or      dl, ah
  1095                                  OkRate:         
  1096 000006CE 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1097 000006D1 66895714                	mov     [edi+TrackInfo.Effect], dx
  1098 000006D5 6685C9                  	test    cx, cx
  1099 000006D8 7404                    	jz      short OkPos
  1100 000006DA C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1101                                  OkPos:          
  1102 000006DE C3                      	retn
  1103                                  efxsampoffset:
  1104                                  	; 01/10/2017 ; *******
  1105                                  SampleOfs:         
  1106                                  ;	test    dl, dl
  1107                                  ;	jnz     short SetSampleOfs
  1108                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1109                                  ;SetSampleOfs:
  1110                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1111 000006DF 88D6                    	mov     dh, dl
  1112 000006E1 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1113 000006E7 895704                  	mov     [edi+TrackInfo.Position], edx
  1114 000006EA C3                      	retn
  1115                                  efxpattjump:
  1116                                  PosJump:
  1117 000006EB 8815[F2910000]          	mov     [OrderPos], dl
  1118 000006F1 C605[F6910000]40        	mov     byte [Row], 64
  1119 000006F8 C3                      	retn
  1120                                  efxsetvolume:
  1121                                  SetVolume:
  1122 000006F9 80FA40                  	cmp     dl, 64
  1123 000006FC 7602                    	jbe     short OkVol
  1124 000006FE B240                    	mov     dl, 64
  1125                                  OkVol:
  1126                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1127 00000700 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1128                                  	;mov	[edi+TrackInfo.Volume], dl
  1129 00000702 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1130 00000706 C3                      	retn
  1131                                  efxbreak:
  1132                                  Break:
  1133 00000707 88D6                    	mov     dh, dl
  1134 00000709 80E20F                  	and     dl, 0Fh
  1135 0000070C C0EE04                  	shr     dh, 4
  1136 0000070F 00F6                    	add     dh, dh
  1137 00000711 00F2                    	add     dl, dh
  1138 00000713 C0E602                  	shl     dh, 2
  1139 00000716 00F2                    	add     dl, dh
  1140 00000718 8815[F7910000]          	mov     [BreakRow], dl
  1141 0000071E C605[F6910000]40        	mov     byte [Row], 64
  1142 00000725 C3                      	retn
  1143                                  efxsetspeed:
  1144                                  SetSpeed:
  1145 00000726 84D2                    	test    dl,dl
  1146 00000728 7432                    	je      Skip
  1147 0000072A 80FA1F                  	cmp     dl,31
  1148 0000072D 770D                    	ja      short SetBpm
  1149                                  SetTempo:       
  1150 0000072F 8815[F3910000]          	mov     [Tempo], dl
  1151 00000735 8815[F4910000]          	mov     [TempoWait], dl
  1152 0000073B C3                      	retn
  1153                                  SetBpm:
  1154 0000073C 8815[F5910000]          	mov     [Bpm], dl
  1155 00000742 B067                    	mov     al, 103
  1156 00000744 F6E2                    	mul     dl
  1157 00000746 88E3                    	mov     bl, ah
  1158 00000748 30FF                    	xor     bh, bh
  1159 0000074A 66A1[4D0F0000]          	mov     ax, [MixSpeed]
  1160 00000750 6631D2                  	xor     dx, dx
  1161 00000753 66F7F3                  	div     bx
  1162 00000756 66A3[F8910000]          	mov     [BpmSamples], ax
  1163                                  Skip:           
  1164 0000075C C3                      	retn
  1165                                  efxarpeggio:
  1166                                  	; 01/10/2017
  1167 0000075D 84D2                    	test    dl, dl
  1168                                  	;je	efxnull
  1169 0000075F 74FB                    	je	short Skip
  1170                                  InitArpeggio:
  1171 00000761 88D6                    	mov     dh, dl
  1172 00000763 80E20F                  	and     dl, 0Fh
  1173 00000766 C0EE04                  	shr     dh, 4
  1174                                  	; 01/10/2017
  1175                                  	;mov	cx, 36
  1176 00000769 66B95400                	mov	cx, 84 ; 84 notes/periods
  1177 0000076D 31DB                    	xor     ebx, ebx
  1178 0000076F 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1179                                  gt_ScanPeriod:
  1180                                  	;cmp	ax, [PeriodTable+bx]
  1181 00000773 663B83[A40D0000]        	cmp	ax, [PeriodTable+ebx]
  1182 0000077A 7306                    	jae     short SetArp
  1183 0000077C 6683C302                	add     bx, 2
  1184 00000780 E2F1                    	loop    gt_ScanPeriod
  1185                                  SetArp:         
  1186 00000782 6601D2                  	add     dx, dx
  1187 00000785 00DE                    	add     dh, bl
  1188 00000787 00DA                    	add     dl, bl
  1189                                  	; 01/10/2017
  1190                                  	;mov	bx, [PeriodTable+bx]
  1191 00000789 668B9B[A40D0000]        	mov	bx, [PeriodTable+ebx]
  1192                                  	;add	bx, bx
  1193 00000790 01DB                    	add	ebx, ebx
  1194                                  	;mov	ax, [PitchTable+bx]
  1195 00000792 668B83[44160000]        	mov	ax, [PitchTable+ebx]
  1196 00000799 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1197 0000079D 88F3                    	mov     bl, dh
  1198 0000079F 30FF                    	xor     bh, bh
  1199 000007A1 668B9B[A40D0000]        	mov	bx, [PeriodTable+ebx]
  1200                                  	;add	bx, bx
  1201 000007A8 01DB                    	add	ebx, ebx
  1202                                  	;mov	ax, [PitchTable+bx]
  1203 000007AA 668B83[44160000]        	mov	ax, [PitchTable+ebx]
  1204 000007B1 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1205 000007B5 88D3                    	mov     bl, dl
  1206 000007B7 30FF                    	xor     bh, bh
  1207 000007B9 668B9B[A40D0000]        	mov	bx, [PeriodTable+ebx]
  1208                                  	;add	bx, bx
  1209 000007C0 01DB                    	add	ebx, ebx
  1210                                  	;mov	ax, [PitchTable+bx]
  1211 000007C2 668B83[44160000]        	mov	ax, [PitchTable+ebx]
  1212 000007C9 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1213 000007CD 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1214 000007D3 C3                      	retn
  1215                                  
  1216                                  efxtremolo:
  1217                                  	; 01/10/2017 (TMODPLAY.ASM)
  1218                                  InitTremolo:
  1219 000007D4 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1220 000007D7 88C4                    	mov     ah, al
  1221 000007D9 66250FF0                	and     ax, 0F00Fh
  1222 000007DD F6C20F                  	test    dl, 0Fh
  1223 000007E0 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1224 000007E2 08C2                    	or      dl, al
  1225                                  efxtremolof0:
  1226                                  InitTremolo_1: 
  1227 000007E4 F6C2F0                  	test    dl, 0F0h
  1228 000007E7 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1229 000007E9 08E2                    	or      dl, ah
  1230                                  efxtremolof1:
  1231                                  InitTremolo_2:
  1232 000007EB 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1233 000007EE 66895714                	mov     [edi+TrackInfo.Effect], dx
  1234 000007F2 C3                      	retn
  1235                                  
  1236                                  ;--------------------------------------------------------------------------
  1237                                  ; pollmodule - polls the module player
  1238                                  ;--------------------------------------------------------------------------
  1239                                  ;--------------------------------------------------------------------------
  1240                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1241                                  ;--------------------------------------------------------------------------
  1242                                  
  1243                                  pollmodule:
  1244                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1245 000007F3 FE0D[F4910000]          	dec     byte [TempoWait]
  1246 000007F9 7417                    	jz      short GetTracks
  1247                                  
  1248                                  	;mov	ecx, NumTracks
  1249 000007FB 0FB70D[470F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1250 00000802 BF[08920000]            	mov	edi, Tracks
  1251                                  BeatTracks:
  1252 00000807 E86EFCFFFF              	call	BeatTrack	
  1253 0000080C 83C726                  	add	edi, TrackInfo.size
  1254 0000080F E2F6                    	loop	BeatTracks
  1255 00000811 C3                      	retn
  1256                                  GetTracks:
  1257 00000812 A0[F3910000]            	mov     al, [Tempo]
  1258 00000817 A2[F4910000]            	mov     [TempoWait], al
  1259                                  
  1260 0000081C 8B35[04920000]          	mov	esi, [Note]
  1261 00000822 803D[F6910000]40        	cmp     byte [Row], 64
  1262 00000829 7268                    	jb      short NoPattWrap
  1263                                  
  1264 0000082B 8B35[CC140000]          	mov	esi, [ModInfo.Patterns]
  1265 00000831 8A1D[F2910000]          	mov     bl, [OrderPos]
  1266 00000837 3A1D[4A140000]          	cmp     bl, [ModInfo.OrderLen]
  1267 0000083D 7214                    	jb      short NoOrderWrap
  1268 0000083F 8A1D[4B140000]          	mov     bl, [ModInfo.ReStart]
  1269 00000845 881D[F2910000]          	mov     [OrderPos], bl
  1270 0000084B 3A1D[4A140000]          	cmp     bl, [ModInfo.OrderLen]
  1271 00000851 7364                    	jae     short NoUpdate
  1272                                  NoOrderWrap:    
  1273                                  	;xor	bh, bh
  1274 00000853 81E3FF000000            	and	ebx, 0FFh
  1275 00000859 8A9B[4C140000]          	mov     bl, [ModInfo.Order+ebx]
  1276                                  	; 05/10/2017
  1277                                  	;shl	ebx, 10 ; *1024
  1278 0000085F 8A0D[460F0000]          	mov	cl, [pattern_shift] ; 10 or 11
  1279 00000865 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1280                                  	;
  1281 00000867 01DE                    	add     esi, ebx
  1282 00000869 8A1D[F7910000]          	mov     bl, [BreakRow]
  1283 0000086F 881D[F6910000]          	mov     [Row], bl
  1284                                  	;xor	bh, bh
  1285 00000875 81E3FF000000            	and	ebx, 0FFh
  1286 0000087B 883D[F7910000]          	mov     [BreakRow], bh ; 0
  1287 00000881 66C1E304                	shl     bx, 4
  1288 00000885 01DE                    	add     esi, ebx
  1289 00000887 8935[04920000]          	mov     [Note], esi
  1290 0000088D FE05[F2910000]          	inc     byte [OrderPos]
  1291                                  NoPattWrap:     
  1292 00000893 FE05[F6910000]          	inc     byte [Row]
  1293                                  
  1294                                  	;cld
  1295                                  	;mov	ecx, NumTracks
  1296 00000899 0FB70D[470F0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1297 000008A0 BF[08920000]            	mov	edi, Tracks
  1298                                  GetTracks_next:
  1299 000008A5 51                      	push	ecx	
  1300 000008A6 E858FDFFFF              	call	GetTrack ; readchannel
  1301 000008AB 59                      	pop	ecx
  1302 000008AC 83C726                  	add	edi, TrackInfo.size
  1303 000008AF E2F4                    	loop	GetTracks_next
  1304                                  
  1305 000008B1 8935[04920000]          	mov     [Note], esi
  1306                                  NoUpdate:
  1307 000008B7 C3                      	retn
  1308                                  
  1309                                  ;--------------------------------------------------------------------------
  1310                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1311                                  ;  In:
  1312                                  ;   ds:si -  Track Info Address.
  1313                                  ;   ds:di -  Buffer Address.
  1314                                  ;    cx   -  Buffer Size.
  1315                                  ;--------------------------------------------------------------------------
  1316                                  
  1317                                  ; esi = Track info address
  1318                                  ; edi = Buffer address
  1319                                  ; ecx = Buffer size
  1320                                  
  1321                                  MixTrack:
  1322 000008B8 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1323 000008BD 7757                    	ja      short MixLooped
  1324                                  MixNonLooped:   
  1325 000008BF 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1326 000008C1 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1327 000008C4 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1328 000008C8 52                      	push    edx
  1329 000008C9 56                      	push    esi
  1330 000008CA 01D3                    	add     ebx, edx
  1331 000008CC 01D5                    	add     ebp, edx
  1332 000008CE 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1333                                  	; 01/10/2017
  1334                                  	;mov	al, [esi+TrackInfo.Volume]
  1335 000008D2 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1336                                  	; ah = [esi+TrackInfo.VolDiff]
  1337 000008D6 00E0                    	add	al, ah ; ****** 
  1338 000008D8 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1339 000008DC 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1340 000008DF 89DE                    	mov     esi, ebx
  1341 000008E1 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1342 000008E3 88C7                    	mov     bh, al
  1343 000008E5 88D0                    	mov     al, dl
  1344 000008E7 88F2                    	mov     dl, dh
  1345                                  	;xor	dh, dh
  1346 000008E9 81E2FF000000            	and	edx, 0FFh
  1347                                  nlMixSamp:      
  1348 000008EF 39EE                    	cmp     esi, ebp
  1349 000008F1 7316                    	jae     short nlMixBye
  1350 000008F3 8A1E                    	mov     bl, [esi]
  1351                                  	;mov	bl, [VolTable+bx]
  1352 000008F5 8A9B[06310000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1353                                  	; 17/10/2017
  1354 000008FB 001F                    	add     [edi], bl
  1355                                  	; 18/10/2017
  1356 000008FD 00C4                    	add     ah, al
  1357 000008FF 11D6                    	adc     esi, edx
  1358 00000901 033D[470F0000]          	add	edi, [numtracks]
  1359 00000907 E2E6                    	loop    nlMixSamp
  1360                                  nlMixBye:       
  1361 00000909 89F3                    	mov     ebx, esi
  1362 0000090B 5E                      	pop     esi
  1363 0000090C 5A                      	pop     edx
  1364 0000090D 29D3                    	sub     ebx, edx
  1365 0000090F 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1366 00000912 88661D                  	mov     [esi+TrackInfo.Error], ah
  1367 00000915 C3                      	retn
  1368                                  MixLooped:
  1369 00000916 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1370 00000918 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1371 0000091B 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1372 0000091F 892D[00920000]          	mov     [BufRep], ebp
  1373                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1374 00000925 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1375 00000929 52                      	push    edx
  1376 0000092A 56                      	push    esi
  1377 0000092B 01D3                    	add     ebx, edx
  1378 0000092D 01D5                    	add     ebp, edx
  1379 0000092F 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1380                                  	; 01/10/2017
  1381                                  	;mov	al, [esi+TrackInfo.Volume]
  1382 00000933 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1383                                  	; ah = [esi+TrackInfo.VolDiff]
  1384 00000937 00E0                    	add	al, ah ; ****** 
  1385 00000939 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1386 0000093D 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1387                                  	;mov	si, bx
  1388 00000940 89DE                    	mov	esi, ebx ; 04/09/2017
  1389 00000942 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1390 00000944 88C7                    	mov     bh, al
  1391 00000946 88D0                    	mov     al, dl
  1392 00000948 88F2                    	mov     dl, dh
  1393                                  	;xor	dh, dh
  1394 0000094A 81E2FF000000            	and	edx, 0FFh
  1395                                  lpMixSamp:      
  1396 00000950 39EE                    	cmp     esi, ebp
  1397 00000952 7206                    	jb      short lpMixNow
  1398 00000954 2B35[00920000]          	sub     esi, [BufRep]
  1399                                  lpMixNow:       
  1400 0000095A 8A1E                    	mov     bl, [esi]
  1401                                  	;mov	bl, [VolTable+bx]
  1402 0000095C 8A9B[06310000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1403                                  	; 17/10/2017
  1404 00000962 001F                    	add     [edi], bl
  1405                                  	; 18/10/2017
  1406 00000964 00C4                    	add     ah, al
  1407 00000966 11D6                    	adc     esi, edx
  1408 00000968 033D[470F0000]          	add	edi, [numtracks]
  1409 0000096E E2E0                    	loop    lpMixSamp
  1410                                  lpMixBye:       
  1411                                  ;	mov     ebx, esi
  1412                                  ;	pop     esi
  1413                                  ;	pop     edx
  1414                                  ;	sub     ebx, edx
  1415                                  ;	mov     [esi+TrackInfo.Position], ebx
  1416                                  ;	mov     [esi+TrackInfo.Error], ah
  1417                                  ;	retn
  1418 00000970 EB97                    	jmp	short nlMixBye
  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                                  ;--------------------------------------------------------------------------
  1428                                  ; mixpoll - updates the output buffer
  1429                                  ;--------------------------------------------------------------------------
  1430                                  ;
  1431                                  ;--------------------------------------------------------------------------
  1432                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1433                                  ;  In:
  1434                                  ;    Buffer  - Buffer Address.
  1435                                  ;    Count   - Buffer Size.
  1436                                  ;--------------------------------------------------------------------------
  1437                                  
  1438                                  mixpoll:
  1439                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1440                                  	; edi = buffer address
  1441                                  	; ebx = count
  1442                                  
  1443 00000972 60                      	pushad
  1444                                  
  1445                                  	;cld
  1446                                  NextChunk:      
  1447 00000973 66833D[FE910000]00      	cmp     word [BufLen], 0
  1448 0000097B 756B                    	jne     short CopyChunk
  1449                                  
  1450 0000097D 53                      	push    ebx
  1451 0000097E 57                      	push    edi
  1452                                  MixChunk:       
  1453 0000097F BF[06720000]            	mov	edi, MixBuffer
  1454                                  	; 17/10/2017
  1455 00000984 0FB70D[F8910000]        	movzx	ecx, word [BpmSamples]
  1456                                  	;mov	cx, [BpmSamples]
  1457 0000098B 893D[FA910000]          	mov     [BufPtr], edi
  1458 00000991 66890D[FE910000]        	mov	[BufLen], cx
  1459                                  
  1460 00000998 803D[470F0000]04        	cmp	byte [numtracks], 4
  1461 0000099F 7603                    	jna	short ch_silence
  1462 000009A1 66D1E1                  	shl	cx, 1 
  1463                                  ch_silence:
  1464 000009A4 B880808080              	mov	eax, 80808080h
  1465 000009A9 F3AB                    	rep	stosd
  1466                                  	
  1467                                  	;mov	cx, NumTracks
  1468                                  	;mov	cl, NumTracks ; 01/10/2017
  1469                                  	;mov	cx, [numtracks] ; 18/10/2017
  1470 000009AB 8A0D[470F0000]          	mov	cl, [numtracks] ; 19/10/2017
  1471 000009B1 BE[E2910000]            	mov	esi, Tracks - TrackInfo.size
  1472                                  GetSamples_next:
  1473 000009B6 51                      	push	ecx
  1474 000009B7 83C626                  	add	esi, TrackInfo.size
  1475 000009BA 668B0D[FE910000]        	mov	cx, [BufLen]
  1476 000009C1 8B3D[FA910000]          	mov	edi, [BufPtr]
  1477 000009C7 E8ECFEFFFF              	call	MixTrack
  1478 000009CC 59                      	pop	ecx
  1479 000009CD FF05[FA910000]          	inc	dword [BufPtr] ; 18/10/2017
  1480 000009D3 E2E1                    	loop	GetSamples_next
  1481                                  
  1482                                   	; 18/10/2017	
  1483 000009D5 8B1D[470F0000]          	mov	ebx, [numtracks]
  1484 000009DB 291D[FA910000]          	sub	dword [BufPtr], ebx
  1485                                  
  1486 000009E1 E80DFEFFFF              	call    UpdateTracks
  1487                                  
  1488 000009E6 5F                      	pop     edi
  1489 000009E7 5B                      	pop     ebx
  1490                                  CopyChunk:      
  1491                                  	;mov	cx, [BufLen]
  1492 000009E8 0FB70D[FE910000]        	movzx	ecx, word [BufLen]
  1493 000009EF 39D9                    	cmp	ecx, ebx
  1494                                  	;cmp	cx, bx
  1495 000009F1 7602                    	jbe     short MoveChunk
  1496                                  	;mov	cx, bx
  1497 000009F3 89D9                    	mov     ecx, ebx
  1498                                  MoveChunk:
  1499 000009F5 8B35[FA910000]          	mov     esi, [BufPtr]
  1500 000009FB 010D[FA910000]          	add     [BufPtr], ecx
  1501 00000A01 66290D[FE910000]        	sub     [BufLen], cx
  1502 00000A08 29CB                    	sub     ebx, ecx
  1503                                  	; 17/10/2017 ; STEREO MIXING
  1504                                  	;rep	movsb
  1505                                  	; 18/10/2017
  1506 00000A0A 803D[470F0000]04        	cmp	byte [numtracks], 4
  1507                                  	;jna	short _4_channels_mix
  1508 00000A11 7622                    	jna	_4_channels_mix
  1509                                  	
  1510                                  _8_channels_mix:
  1511                                  	; 18/10/2017
  1512 00000A13 AD                      	lodsd 
  1513 00000A14 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1514 00000A16 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1515 00000A19 00C6                    	add	dh, al ; ch1 + ch4
  1516 00000A1B 00E2                    	add	dl, ah ; ch2 + ch3
  1517                                  
  1518 00000A1D AD                      	lodsd
  1519 00000A1E 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1520 00000A20 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1521 00000A22 C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1522 00000A25 00F4                    	add	ah, dh ; ch1 + ch4 + ch5 + ch8
  1523 00000A27 00D0                    	add	al, dl ; ch2 + ch3 + ch6 + ch7
  1524                                  
  1525 00000A29 86E0                    	xchg	ah, al
  1526                                  
  1527                                  	; L = ch1 + ch4 + ch5 + ch8
  1528                                  	; R = ch2 + ch3 + ch6 + ch7
  1529                                  
  1530 00000A2B 66058080                	add	ax, 8080h
  1531                                  
  1532 00000A2F 66AB                    	stosw 
  1533                                  
  1534 00000A31 E2E0                    	loop	_8_channels_mix
  1535                                  	
  1536 00000A33 EB12                    	jmp	short channel_mix_ok
  1537                                  	
  1538                                  _4_channels_mix:
  1539                                  	; 18/10/2017
  1540 00000A35 AD                      	lodsd 
  1541 00000A36 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1542 00000A38 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1543 00000A3B 00F0                    	add	al, dh ; ch1 + ch4
  1544 00000A3D 00D4                    	add	ah, dl ; ch2 + ch3
  1545                                  
  1546                                  	; L = ch1 + ch4
  1547                                  	; R = ch2 + ch3
  1548                                  
  1549 00000A3F 66058080                	add	ax, 8080h
  1550                                  
  1551 00000A43 66AB                    	stosw ; ch1 + ch3
  1552                                  	
  1553 00000A45 E2EE                    	loop	_4_channels_mix
  1554                                  
  1555                                  channel_mix_ok:
  1556 00000A47 85DB                    	test    ebx, ebx
  1557                                  	;jnz	short NextChunk
  1558 00000A49 0F8524FFFFFF            	jnz	NextChunk ; 17/10/2017
  1559                                  
  1560 00000A4F 61                      	popad	
  1561 00000A50 C3                      	retn
  1562                                  
  1563                                  ;--------------------------------------------------------------------------
  1564                                  ; StartPlaying: Initializes the Sound System.
  1565                                  ;  In:
  1566                                  ;   Module Information Resources.
  1567                                  ;--------------------------------------------------------------------------
  1568                                  
  1569                                  StartPlaying:
  1570                                  	; 07/10/2017
  1571 00000A51 60                      	pushad
  1572                                  SetModParms:    
  1573 00000A52 C605[F2910000]00        	mov     byte [OrderPos], 0
  1574 00000A59 C605[F3910000]06        	mov     byte [Tempo], DefTempo
  1575 00000A60 C605[F4910000]06        	mov     byte [TempoWait], DefTempo
  1576 00000A67 C605[F5910000]7D        	mov     byte [Bpm], DefBpm
  1577 00000A6E C605[F6910000]40        	mov     byte [Row], 64
  1578 00000A75 C605[F7910000]00        	mov     byte [BreakRow], 0
  1579 00000A7C 66A1[4D0F0000]          	mov     ax, [MixSpeed]
  1580 00000A82 31D2                    	xor     edx, edx
  1581 00000A84 66BB3200                	mov     bx, 24*DefBpm/60
  1582 00000A88 66F7F3                  	div     bx
  1583 00000A8B 66A3[F8910000]          	mov     [BpmSamples], ax
  1584                                  ClearTracks:    
  1585 00000A91 BF[08920000]            	mov     edi, Tracks
  1586                                  	; 06/10/2017
  1587                                  	;mov	ecx, NumTracks*TrackInfo.size
  1588 00000A96 B826000000              	mov	eax, TrackInfo.size
  1589 00000A9B 0FB70D[470F0000]        	movzx	ecx, word [numtracks]
  1590 00000AA2 F7E1                    	mul	ecx
  1591 00000AA4 89C1                    	mov	ecx, eax
  1592 00000AA6 31C0                    	xor     eax, eax
  1593                                  	;cld
  1594 00000AA8 F3AA                    	rep     stosb
  1595                                  
  1596 00000AAA A3[FA910000]            	mov     [BufPtr], eax
  1597 00000AAF 66A3[FE910000]          	mov     [BufLen], ax
  1598                                  MakePitch:
  1599 00000AB5 66B80021                	mov     ax, MidCRate
  1600 00000AB9 66BBAC01                	mov     bx, 428
  1601 00000ABD 66F7E3                  	mul     bx
  1602 00000AC0 66F735[4D0F0000]        	div     word [MixSpeed]
  1603 00000AC7 30F6                    	xor     dh, dh
  1604 00000AC9 88E2                    	mov     dl, ah
  1605 00000ACB 88C4                    	mov     ah, al
  1606 00000ACD 30C0                    	xor     al, al
  1607                                  	;mov	cx, 857
  1608 00000ACF 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1609 00000AD3 31DB                    	xor     ebx, ebx
  1610 00000AD5 BF[44160000]            	mov     edi, PitchTable
  1611                                  PitchLoop:      
  1612 00000ADA 50                      	push    eax
  1613 00000ADB 52                      	push    edx
  1614 00000ADC 6639DA                  	cmp     dx, bx
  1615 00000ADF 7303                    	jae     short NoDiv
  1616 00000AE1 66F7F3                  	div     bx
  1617                                  NoDiv:          
  1618 00000AE4 66AB                    	stosw
  1619 00000AE6 5A                      	pop     edx
  1620 00000AE7 58                      	pop     eax
  1621                                  	;inc	bx
  1622 00000AE8 43                      	inc	ebx
  1623 00000AE9 E2EF                    	loop    PitchLoop
  1624                                  MakeVolume:     
  1625 00000AEB 66B90041                	mov     cx, 16640
  1626 00000AEF 89CB                    	mov     ebx, ecx
  1627                                  VolLoop:
  1628 00000AF1 664B                    	dec     bx
  1629 00000AF3 88D8                    	mov     al, bl
  1630 00000AF5 F6EF                    	imul    bh
  1631                                  	;mov	[VolTable+bx], ah
  1632 00000AF7 88A3[06310000]          	mov     [VolTable+ebx], ah
  1633 00000AFD E2F2                    	loop    VolLoop
  1634                                  
  1635 00000AFF 61                      	popad
  1636 00000B00 C3                      	retn
  1637                                  
  1638                                  ;--------------------------------------------------------------------------
  1639                                  ; StopPlaying: ShutDown the Sound System.
  1640                                  ;--------------------------------------------------------------------------
  1641                                  
  1642                                  StopPlaying:
  1643                                  	; 19/06/2017
  1644                                  	; Stop Playing
  1645                                  	sys	_audio, 0700h
  1645                              <1> 
  1645                              <1> 
  1645                              <1> 
  1645                              <1> 
  1645                              <1>  %if %0 >= 2
  1645 00000B01 BB00070000          <1>  mov ebx, %2
  1645                              <1>  %if %0 >= 3
  1645                              <1>  mov ecx, %3
  1645                              <1>  %if %0 = 4
  1645                              <1>  mov edx, %4
  1645                              <1>  %endif
  1645                              <1>  %endif
  1645                              <1>  %endif
  1645 00000B06 B820000000          <1>  mov eax, %1
  1645                              <1> 
  1645 00000B0B CD40                <1>  int 40h
  1646                                  	; Cancel callback service (for user)
  1647                                  	sys	_audio, 0900h
  1647                              <1> 
  1647                              <1> 
  1647                              <1> 
  1647                              <1> 
  1647                              <1>  %if %0 >= 2
  1647 00000B0D BB00090000          <1>  mov ebx, %2
  1647                              <1>  %if %0 >= 3
  1647                              <1>  mov ecx, %3
  1647                              <1>  %if %0 = 4
  1647                              <1>  mov edx, %4
  1647                              <1>  %endif
  1647                              <1>  %endif
  1647                              <1>  %endif
  1647 00000B12 B820000000          <1>  mov eax, %1
  1647                              <1> 
  1647 00000B17 CD40                <1>  int 40h
  1648                                  	; Deallocate Audio Buffer (for user)
  1649                                  	sys	_audio, 0A00h
  1649                              <1> 
  1649                              <1> 
  1649                              <1> 
  1649                              <1> 
  1649                              <1>  %if %0 >= 2
  1649 00000B19 BB000A0000          <1>  mov ebx, %2
  1649                              <1>  %if %0 >= 3
  1649                              <1>  mov ecx, %3
  1649                              <1>  %if %0 = 4
  1649                              <1>  mov edx, %4
  1649                              <1>  %endif
  1649                              <1>  %endif
  1649                              <1>  %endif
  1649 00000B1E B820000000          <1>  mov eax, %1
  1649                              <1> 
  1649 00000B23 CD40                <1>  int 40h
  1650                                  	; Disable Audio Device
  1651                                  	sys	_audio, 0C00h
  1651                              <1> 
  1651                              <1> 
  1651                              <1> 
  1651                              <1> 
  1651                              <1>  %if %0 >= 2
  1651 00000B25 BB000C0000          <1>  mov ebx, %2
  1651                              <1>  %if %0 >= 3
  1651                              <1>  mov ecx, %3
  1651                              <1>  %if %0 = 4
  1651                              <1>  mov edx, %4
  1651                              <1>  %endif
  1651                              <1>  %endif
  1651                              <1>  %endif
  1651 00000B2A B820000000          <1>  mov eax, %1
  1651                              <1> 
  1651 00000B2F CD40                <1>  int 40h
  1652                                  
  1653 00000B31 C3                      	retn
  1654                                  
  1655                                  ; 17/10/2017 (STEREO PLAYING)
  1656                                  ; 24/06/2017
  1657                                  ;--------------------------------------------------------------------------
  1658                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1659                                  ;--------------------------------------------------------------------------
  1660                                  ; This Conversion is needed for AC'97 hardware 
  1661                                  ; which ony supports 16 bit stereo samples !
  1662                                  
  1663                                  ; source = temp_buffer (8192 bytes)
  1664                                  ; destination = Audio_Buffer (32768 bytes)
  1665                                  
  1666                                  ConvertSamples:
  1667                                  	; 24/06/2017
  1668 00000B32 B900200000              	mov	ecx, BUFFERSIZE/4 ; 8192
  1669 00000B37 BE[00200100]            	mov	esi, temp_buffer
  1670 00000B3C BF[00A00000]            	mov	edi, Audio_Buffer
  1671                                  c_smpl_1:
  1672                                  	; 17/10/2017 (Left channel)
  1673 00000B41 AC                      	lodsb	; get 8 bit mono sample
  1674                                  	; 15/10/2017
  1675                                  	;sub	al, 80h
  1676                                  	;shl	ax, 8
  1677 00000B42 88C4                    	mov	ah, al
  1678 00000B44 80EC80                  	sub	ah, 80h
  1679 00000B47 30C0                    	xor	al, al
  1680                                  	;
  1681                                  	;mov	dx, ax
  1682                                  	;shl	eax, 16
  1683                                  	;mov	ax, dx
  1684                                  	;stosd	; save 16 bit stereo sample
  1685 00000B49 66AB                    	stosw	; save 16 bit left channel data ; 17/10/2017
  1686                                  
  1687                                  	; 17/10/2017 (Right channel)
  1688 00000B4B AC                      	lodsb	; get 8 bit mono sample
  1689 00000B4C 88C4                    	mov	ah, al
  1690 00000B4E 80EC80                  	sub	ah, 80h
  1691 00000B51 30C0                    	xor	al, al
  1692                                  	;
  1693 00000B53 66AB                    	stosw	; save 16 bit right channel data
  1694                                  
  1695 00000B55 E2EA                    	loop 	c_smpl_1
  1696                                  	
  1697 00000B57 C3                      	retn
  1698                                  
  1699                                  ;=============================================================================
  1700                                  ; 
  1701                                  ;=============================================================================
  1702                                  
  1703                                  ;dword2str:
  1704                                  ;	; 13/11/2016 - Erdogan Tan 
  1705                                  ;	; eax = dword value
  1706                                  ;	;
  1707                                  ;	call	dwordtohex
  1708                                  ;	mov	[dword_str], edx
  1709                                  ;	mov	[dword_str+4], eax
  1710                                  ;	mov	si, dword_str
  1711                                  ;	retn
  1712                                  
  1713                                  	; 05/03/2017 (TRDOS 386)
  1714                                  	; trdos386.s (unix386.s) - 10/05/2015
  1715                                  	; Convert binary number to hexadecimal string
  1716                                  
  1717                                  ;bytetohex:
  1718                                  ;	; INPUT ->
  1719                                  ;	; 	AL = byte (binary number)
  1720                                  ;	; OUTPUT ->
  1721                                  ;	;	AX = hexadecimal string
  1722                                  ;	;
  1723                                  ;	push	ebx
  1724                                  ;	movzx	ebx, al
  1725                                  ;	shr	bl, 4
  1726                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1727                                  ;	xchg	bl, al
  1728                                  ;	and	bl, 0Fh
  1729                                  ;	mov	ah, [ebx+hex_chars] 
  1730                                  ;	pop	ebx	
  1731                                  ;	retn
  1732                                  
  1733                                  ;wordtohex:
  1734                                  ;	; INPUT ->
  1735                                  ;	; 	AX = word (binary number)
  1736                                  ;	; OUTPUT ->
  1737                                  ;	;	EAX = hexadecimal string
  1738                                  ;	;
  1739                                  ;	push	ebx
  1740                                  ;	xor	ebx, ebx
  1741                                  ;	xchg	ah, al
  1742                                  ;	push	eax
  1743                                  ;	mov	bl, ah
  1744                                  ;	shr	bl, 4
  1745                                  ;	mov	al, [ebx+hex_chars] 	 	
  1746                                  ;	mov	bl, ah
  1747                                  ;	and	bl, 0Fh
  1748                                  ;	mov	ah, [ebx+hex_chars]
  1749                                  ;	shl	eax, 16
  1750                                  ;	pop	eax
  1751                                  ;	pop	ebx
  1752                                  ;	jmp	short bytetohex
  1753                                  
  1754                                  ;dwordtohex:
  1755                                  ;	; INPUT ->
  1756                                  ;	; 	EAX = dword (binary number)
  1757                                  ;	; OUTPUT ->
  1758                                  ;	;	EDX:EAX = hexadecimal string
  1759                                  ;	;
  1760                                  ;	push	eax
  1761                                  ;	shr	eax, 16
  1762                                  ;	call	wordtohex
  1763                                  ;	mov	edx, eax
  1764                                  ;	pop	eax
  1765                                  ;	call	wordtohex
  1766                                  ;	retn
  1767                                  
  1768                                  	; 24/06/2017
  1769                                  	; 19/06/2017
  1770                                  	; 05/03/2017 (TRDOS 386)
  1771                                  	; 13/11/2016 - Erdogan Tan
  1772                                  write_audio_dev_info:
  1773                                  	; BUS/DEV/FN
  1774                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1775                                  	; DEV/VENDOR
  1776                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1777                                  
  1778 00000B58 8B35[F80F0000]          	mov	esi, [dev_vendor]
  1779 00000B5E 6689F0                  	mov	ax, si
  1780 00000B61 0FB6D8                  	movzx	ebx, al
  1781 00000B64 88DA                    	mov	dl, bl
  1782 00000B66 80E30F                  	and	bl, 0Fh
  1783 00000B69 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1784 00000B6F A2[940F0000]            	mov	[msgVendorId+3], al
  1785 00000B74 88D3                    	mov	bl, dl
  1786 00000B76 C0EB04                  	shr	bl, 4
  1787 00000B79 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1788 00000B7F A2[930F0000]            	mov	[msgVendorId+2], al
  1789 00000B84 88E3                    	mov	bl, ah
  1790 00000B86 88DA                    	mov	dl, bl
  1791 00000B88 80E30F                  	and	bl, 0Fh
  1792 00000B8B 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1793 00000B91 A2[920F0000]            	mov	[msgVendorId+1], al
  1794 00000B96 88D3                    	mov	bl, dl
  1795 00000B98 C0EB04                  	shr	bl, 4
  1796 00000B9B 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1797 00000BA1 A2[910F0000]            	mov	[msgVendorId], al
  1798 00000BA6 C1EE10                  	shr	esi, 16
  1799 00000BA9 6689F0                  	mov	ax, si
  1800 00000BAC 88C3                    	mov	bl, al
  1801 00000BAE 88DA                    	mov	dl, bl
  1802 00000BB0 80E30F                  	and	bl, 0Fh
  1803 00000BB3 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1804 00000BB9 A2[A50F0000]            	mov	[msgDevId+3], al
  1805 00000BBE 88D3                    	mov	bl, dl
  1806 00000BC0 C0EB04                  	shr	bl, 4
  1807 00000BC3 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1808 00000BC9 A2[A40F0000]            	mov	[msgDevId+2], al
  1809 00000BCE 88E3                    	mov	bl, ah
  1810 00000BD0 88DA                    	mov	dl, bl
  1811 00000BD2 80E30F                  	and	bl, 0Fh
  1812 00000BD5 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1813 00000BDB A2[A30F0000]            	mov	[msgDevId+1], al
  1814 00000BE0 88D3                    	mov	bl, dl
  1815 00000BE2 C0EB04                  	shr	bl, 4
  1816 00000BE5 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1817 00000BEB A2[A20F0000]            	mov	[msgDevId], al
  1818                                  
  1819 00000BF0 8B35[FC0F0000]          	mov	esi, [bus_dev_fn]
  1820 00000BF6 C1EE08                  	shr	esi, 8
  1821 00000BF9 6689F0                  	mov	ax, si
  1822 00000BFC 88C3                    	mov	bl, al
  1823 00000BFE 88DA                    	mov	dl, bl
  1824 00000C00 80E307                  	and	bl, 7 ; bit 0,1,2
  1825 00000C03 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1826 00000C09 A2[C90F0000]            	mov	[msgFncNo+1], al
  1827 00000C0E 88D3                    	mov	bl, dl
  1828 00000C10 C0EB03                  	shr	bl, 3
  1829 00000C13 88DA                    	mov	dl, bl
  1830 00000C15 80E30F                  	and	bl, 0Fh
  1831 00000C18 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1832 00000C1E A2[BB0F0000]            	mov	[msgDevNo+1], al
  1833 00000C23 88D3                    	mov	bl, dl
  1834 00000C25 C0EB04                  	shr	bl, 4
  1835 00000C28 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1836 00000C2E A2[BA0F0000]            	mov	[msgDevNo], al
  1837 00000C33 88E3                    	mov	bl, ah
  1838 00000C35 88DA                    	mov	dl, bl
  1839 00000C37 80E30F                  	and	bl, 0Fh
  1840 00000C3A 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1841 00000C40 A2[AF0F0000]            	mov	[msgBusNo+1], al
  1842 00000C45 88D3                    	mov	bl, dl
  1843 00000C47 C0EB04                  	shr	bl, 4
  1844 00000C4A 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1845 00000C50 A2[AE0F0000]            	mov	[msgBusNo], al
  1846                                  
  1847                                  	; 24/06/2017
  1848 00000C55 66A1[04100000]          	mov	ax, [ac97_NamBar]
  1849 00000C5B 88C3                    	mov	bl, al
  1850 00000C5D 88DA                    	mov	dl, bl
  1851 00000C5F 80E30F                  	and	bl, 0Fh
  1852 00000C62 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1853 00000C68 A2[D80F0000]            	mov	[msgNamBar+3], al
  1854 00000C6D 88D3                    	mov	bl, dl
  1855 00000C6F C0EB04                  	shr	bl, 4
  1856 00000C72 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1857 00000C78 A2[D70F0000]            	mov	[msgNamBar+2], al
  1858 00000C7D 88E3                    	mov	bl, ah
  1859 00000C7F 88DA                    	mov	dl, bl
  1860 00000C81 80E30F                  	and	bl, 0Fh
  1861 00000C84 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1862 00000C8A A2[D60F0000]            	mov	[msgNamBar+1], al
  1863 00000C8F 88D3                    	mov	bl, dl
  1864 00000C91 C0EB04                  	shr	bl, 4
  1865 00000C94 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1866 00000C9A A2[D50F0000]            	mov	[msgNamBar], al
  1867                                  
  1868 00000C9F 66A1[06100000]          	mov	ax, [ac97_NabmBar]
  1869 00000CA5 88C3                    	mov	bl, al
  1870 00000CA7 88DA                    	mov	dl, bl
  1871 00000CA9 80E30F                  	and	bl, 0Fh
  1872 00000CAC 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1873 00000CB2 A2[E80F0000]            	mov	[msgNabmBar+3], al
  1874 00000CB7 88D3                    	mov	bl, dl
  1875 00000CB9 C0EB04                  	shr	bl, 4
  1876 00000CBC 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1877 00000CC2 A2[E70F0000]            	mov	[msgNabmBar+2], al
  1878 00000CC7 88E3                    	mov	bl, ah
  1879 00000CC9 88DA                    	mov	dl, bl
  1880 00000CCB 80E30F                  	and	bl, 0Fh
  1881 00000CCE 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1882 00000CD4 A2[E60F0000]            	mov	[msgNabmBar+1], al
  1883 00000CD9 88D3                    	mov	bl, dl
  1884 00000CDB C0EB04                  	shr	bl, 4
  1885 00000CDE 8A83[4F0F0000]          	mov	al, [ebx+hex_chars]
  1886 00000CE4 A2[E50F0000]            	mov	[msgNabmBar], al
  1887                                  
  1888                                  	; 24/11/2016
  1889 00000CE9 30E4                    	xor	ah, ah
  1890 00000CEB A0[08100000]            	mov	al, [ac97_int_ln_reg]
  1891 00000CF0 B10A                    	mov	cl, 10
  1892 00000CF2 F6F1                    	div	cl
  1893 00000CF4 660105[F10F0000]        	add	[msgIRQ], ax
  1894 00000CFB 20C0                    	and	al, al
  1895 00000CFD 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1896 00000CFF A0[F20F0000]            	mov	al, [msgIRQ+1]
  1897 00000D04 B420                    	mov	ah, ' '
  1898 00000D06 66A3[F10F0000]          	mov	[msgIRQ], ax
  1899                                  _w_ac97imsg_:
  1900                                  	; EBX = Message address
  1901                                  	; ECX = Max. message length (or stop on ZERO character)
  1902                                  	;	(1 to 255)
  1903                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1904                                       	sys 	_msg, msgAC97Info, 255, 07h
  1904                              <1> 
  1904                              <1> 
  1904                              <1> 
  1904                              <1> 
  1904                              <1>  %if %0 >= 2
  1904 00000D0C BB[600F0000]        <1>  mov ebx, %2
  1904                              <1>  %if %0 >= 3
  1904 00000D11 B9FF000000          <1>  mov ecx, %3
  1904                              <1>  %if %0 = 4
  1904 00000D16 BA07000000          <1>  mov edx, %4
  1904                              <1>  %endif
  1904                              <1>  %endif
  1904                              <1>  %endif
  1904 00000D1B B823000000          <1>  mov eax, %1
  1904                              <1> 
  1904 00000D20 CD40                <1>  int 40h
  1905 00000D22 C3                              retn
  1906                                  
  1907                                  ;=============================================================================
  1908                                  ;               preinitialized data
  1909                                  ;=============================================================================
  1910                                  
  1911                                  ;=============================================================================
  1912                                  ; Protracker effects stuff
  1913                                  ;=============================================================================
  1914                                  
  1915                                  ;-----------------------------------------------------------------------------
  1916                                  ; Effect jump tables
  1917                                  ;-----------------------------------------------------------------------------
  1918                                  
  1919 00000D23 90                      align 4
  1920                                  
  1921                                  efxtable:
  1922 00000D24 [5D070000]              	dd      efxarpeggio	; 0 - arpeggio
  1923 00000D28 [8A040000]              	dd      efxnull		; 1 - porta up
  1924 00000D2C [8A040000]              	dd      efxnull		; 2 - porta down
  1925 00000D30 [A8060000]              	dd      efxtoneporta	; 3 - tone porta
  1926 00000D34 [B7060000]              	dd      efxvibrato	; 4 - vibrato
  1927 00000D38 [8A040000]              	dd      efxnull		; 5 - tone+slide
  1928 00000D3C [8A040000]              	dd      efxnull		; 6 - vibrato+slide
  1929 00000D40 [D4070000]              	dd      efxtremolo	; 7 - tremolo
  1930 00000D44 [8A040000]              	dd      efxnull		; 8 - unused
  1931 00000D48 [DF060000]              	dd      efxsampoffset	; 9 - sample offset
  1932 00000D4C [8A040000]              	dd      efxnull		; A - volume slide
  1933 00000D50 [EB060000]              	dd      efxpattjump	; B - pattern jump
  1934 00000D54 [F9060000]              	dd      efxsetvolume	; C - set volume
  1935 00000D58 [07070000]              	dd      efxbreak	; D - break pattern
  1936 00000D5C [8A040000]              	dd      efxnull		; E - extra effects
  1937 00000D60 [26070000]              	dd      efxsetspeed	; F - set speed
  1938                                  
  1939                                  efxtable2:
  1940 00000D64 [8B040000]              	dd      efxarpeggio2	; 0 - arpeggio
  1941 00000D68 [AD040000]              	dd      efxportaup	; 1 - porta up
  1942 00000D6C [D3040000]              	dd      efxportadown	; 2 - porta down
  1943 00000D70 [FA040000]              	dd      efxtoneporta2	; 3 - tone porta
  1944 00000D74 [33050000]              	dd      efxvibrato2	; 4 - vibrato
  1945 00000D78 [8F050000]              	dd      efxtoneslide	; 5 - tone+slide
  1946 00000D7C [9C050000]              	dd      efxvibslide	; 6 - vibrato+slide
  1947 00000D80 [C3050000]              	dd      efxtremolo2	; 7 - tremolo
  1948 00000D84 [8A040000]              	dd      efxnull		; 8 - unused
  1949 00000D88 [8A040000]              	dd      efxnull		; 9 - sample offset
  1950 00000D8C [A6050000]              	dd      efxvolslide	; A - volume slide
  1951 00000D90 [8A040000]              	dd      efxnull		; B - pattern jump
  1952 00000D94 [8A040000]              	dd      efxnull		; C - set volume
  1953 00000D98 [8A040000]              	dd      efxnull		; D - break pattern
  1954 00000D9C [8A040000]              	dd      efxnull		; E - extra effects
  1955 00000DA0 [8A040000]              	dd      efxnull		; F - set speed
  1956                                  
  1957                                  ;-----------------------------------------------------------------------------
  1958                                  ; Amiga period table
  1959                                  ;-----------------------------------------------------------------------------
  1960                                  
  1961                                  ;PeriodTable0:	
  1962                                  ;	dw	0
  1963                                  PeriodTable:
  1964 00000DA4 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1964 00000DAD 0A000A7009E8086808-
  1964 00000DB6 F00780071407       
  1965 00000DBC B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1965 00000DC5 050005B80474043404-
  1965 00000DCE F803C0038A03       
  1966 00000DD4 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1966 00000DDD 0280025C023A021A02-
  1966 00000DE6 FC01E001C501       
  1967 00000DEC AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1967 00000DF5 0140012E011D010D01-
  1967 00000DFE FE00F000E200       
  1968 00000E04 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1968 00000E0D 00A00097008F008700-
  1968 00000E16 7F0078007100       
  1969 00000E1C 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1969 00000E25 0050004B0047004300-
  1969 00000E2E 3F003C003800       
  1970 00000E34 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1970 00000E3D 002800250023002100-
  1970 00000E46 1F001E001C00       
  1971                                  
  1972                                  ;-----------------------------------------------------------------------------
  1973                                  ; Sinus wave table
  1974                                  ;-----------------------------------------------------------------------------
  1975                                  
  1976                                  SinTable:
  1977 00000E4C 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1977 00000E55 C5D4E1             
  1978 00000E58 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1978 00000E61 E1                 
  1979 00000E62 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1979 00000E6B 19                 
  1980                                  
  1981                                  ;=============================================================================
  1982                                  ; Copyright Strings & Messages
  1983                                  ;=============================================================================
  1984 00000E6C 00                      	db	0
  1985                                  msg_2017:
  1986 00000E6D 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1986 00000E76 506C6179657220666F-
  1986 00000E7F 72205452444F532033-
  1986 00000E88 383620627920457264-
  1986 00000E91 6F67616E2054616E2E-
  1986 00000E9A 20                 
  1987 00000E9B 4F63746F6265722032-     	db	'October 2017.',10,13
  1987 00000EA4 3031372E0A0D       
  1988 00000EAA 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1988 00000EB3 64706C61792066696C-
  1988 00000EBC 656E616D652E6D6F64-
  1988 00000EC5 0A0D00             
  1989 00000EC8 31392F31302F323031-     	db	'19/10/2017',10,13,0
  1989 00000ED1 370A0D00           
  1990                                  
  1991                                  Credits:
  1992 00000ED5 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1992 00000EDE 506C61796572207630-
  1992 00000EE7 2E3162206279204361-
  1992 00000EF0 726C6F732048617361-
  1992 00000EF9 6E2E204A756C792031-
  1992 00000F02 3939332E           
  1993 00000F06 0A0D00                  	db	10,13,0
  1994                                  ErrorMesg:
  1995 00000F09 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  1995 00000F12 64696E67204D6F6475-
  1995 00000F1B 6C652066696C652E0A-
  1995 00000F24 0D00               
  1996                                  
  1997                                  ;MsgNotFound: db	'Sound Blaster not found or IRQ error.',10,13,0
  1998                                  ;MsgFound:    db	'Sound Blaster found at Address 2'
  1999                                  ;PortText:    db	'x0h, IRQ '
  2000                                  ;IrqText:     db	'x.',10,13,0
  2001                                  
  2002                                  trdos386_err_msg:
  2003 00000F26 5452444F5320333836-     	db	'TRDOS 386 System call error !', 10, 13,0
  2003 00000F2F 2053797374656D2063-
  2003 00000F38 616C6C206572726F72-
  2003 00000F41 20210A0D00         
  2004                                  
  2005                                  ; 07/10/2017
  2006 00000F46 0A                      pattern_shift:	db 10
  2007                                  ;numtracks:	dw 4
  2008                                  ; 18/10/2017
  2009 00000F47 04000000                numtracks:	dd 4
  2010                                  
  2011                                  ;=============================================================================
  2012                                  ;               PLAYER.ASM - DATA
  2013                                  ;=============================================================================
  2014                                  
  2015                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2016                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2017                                  
  2018                                  ;19/10/2017
  2019                                  ;Note: AC'97 hardware plays music as stereo and 16 bits.
  2020                                  ;    'stmo' and 'bps' will not be recognized by TDDOS 386 kernel ('audio.s'). 	
  2021 00000F4B 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2022 00000F4C 10                      bps:		db 16 ; bits per sample (8 or 16)
  2023                                  
  2024                                  
  2025                                  Sample_Rate:
  2026 00000F4D 2256                    MixSpeed:	dw 22050 ; Hz
  2027                                  
  2028                                  ; 13/11/2016
  2029 00000F4F 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2029 00000F58 3941424344454600   
  2030                                  ;
  2031                                  msgAC97Info:	
  2032 00000F60 0D0A                    		db 0Dh, 0Ah
  2033 00000F62 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2033 00000F6B 6F20436F6E74726F6C-
  2033 00000F74 6C6572202620436F64-
  2033 00000F7D 656320496E666F0D0A 
  2034 00000F86 56656E646F72204944-     		db "Vendor ID: "
  2034 00000F8F 3A20               
  2035 00000F91 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2035 00000F9A 6963652049443A20   
  2036 00000FA2 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2037 00000FA9 4275733A20              		db "Bus: "
  2038 00000FAE 303068204465766963-     msgBusNo:	db "00h Device: "
  2038 00000FB7 653A20             
  2039 00000FBA 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2039 00000FC3 696F6E3A20         
  2040 00000FC8 303068                  msgFncNo	db "00h"
  2041 00000FCB 0D0A                    		db 0Dh, 0Ah
  2042 00000FCD 4E414D4241523A20        		db "NAMBAR: "
  2043 00000FD5 30303030682020          msgNamBar	db "0000h  "
  2044 00000FDC 4E41424D4241523A20      		db "NABMBAR: "
  2045 00000FE5 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2045 00000FEE 513A20             
  2046 00000FF1 3030                    msgIRQ:		dw 3030h
  2047 00000FF3 0D0A00                  		db 0Dh, 0Ah, 0
  2048                                  
  2049                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2050                                  ;codec_id:	   dd 0
  2051                                  ;codec_chip_id:	   dd 0
  2052                                  ;codec_vendor_ids: dw 0
  2053                                  ;codec_chip_ids:   dw 0
  2054                                  
  2055                                  ;dword_str:	dd 30303030h, 30303030h
  2056                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2057                                  
  2058                                  ;=============================================================================
  2059                                  ;        	uninitialized data
  2060                                  ;=============================================================================
  2061                                  
  2062                                  bss_start:
  2063                                  
  2064                                  ABSOLUTE bss_start
  2065                                  
  2066 00000FF6 <res 00000002>          alignb 4
  2067                                  
  2068 00000FF8 <res 00000004>          dev_vendor:	resd 1
  2069 00000FFC <res 00000004>          bus_dev_fn:	resd 1
  2070 00001000 <res 00000004>          stats_cmd:	resd 1
  2071 00001004 <res 00000002>          ac97_NamBar:	resw 1
  2072 00001006 <res 00000002>          ac97_NabmBar:	resw 1
  2073 00001008 <res 00000001>          ac97_int_ln_reg: resb 1
  2074 00001009 <res 00000001>          srb:		resb 1
  2075                                  
  2076                                  ; MODLOAD.ASM
  2077 0000100A <res 00000004>          FileHandle:	resd 1
  2078 0000100E <res 0000043C>          Header:		resb ModHeader.size
  2079                                  
  2080                                  ; MODPLAY.ASM
  2081                                  ;MixSpeed:	    resw 1
  2082                                  
  2083                                  ModInfo:
  2084 0000144A <res 00000001>          ModInfo.OrderLen:   resb 1
  2085 0000144B <res 00000001>          ModInfo.ReStart:    resb 1
  2086 0000144C <res 00000080>          ModInfo.Order:	    resb 128
  2087 000014CC <res 00000004>          ModInfo.Patterns:   resd 1
  2088                                  
  2089 000014D0 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2090 0000150E <res 0000003E>          ModInfo.SampSeg:    resw 31
  2091 0000154C <res 0000003E>          ModInfo.SampLen:    resw 31
  2092 0000158A <res 0000003E>          ModInfo.SampRep:    resw 31
  2093 000015C8 <res 0000003E>          ModInfo.SampRepLen: resw 31
  2094 00001606 <res 0000003E>          ModInfo.SampVol:    resw 31
  2095                                  
  2096                                  ; MODPLAY.ASM
  2097                                  PitchTable:	;resw 857
  2098 00001644 <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2099 00003106 <res 00004100>          VolTable:	resb 16640
  2100 00007206 <res 00001FEC>          MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2101                                  
  2102                                  ; MODPLAY.ASM
  2103 000091F2 <res 00000001>          OrderPos:	resb 1
  2104 000091F3 <res 00000001>          Tempo:		resb 1
  2105 000091F4 <res 00000001>          TempoWait:	resb 1
  2106 000091F5 <res 00000001>          Bpm:		resb 1
  2107 000091F6 <res 00000001>          Row:		resb 1
  2108 000091F7 <res 00000001>          BreakRow:	resb 1
  2109 000091F8 <res 00000002>          BpmSamples:	resw 1
  2110 000091FA <res 00000004>          BufPtr:		resd 1
  2111 000091FE <res 00000002>          BufLen:		resw 1
  2112 00009200 <res 00000004>          BufRep:		resd 1
  2113 00009204 <res 00000004>          Note:		resd 1
  2114                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2115                                  ; 07/10/2017
  2116 00009208 <res 00000130>          Tracks:	resb TrackInfo.size*8
  2117                                  
  2118 00009338 <res 00000008>          alignb 16
  2119                                  
  2120                                  ; PLAY.ASM
  2121 00009340 <res 00000280>          Scope:		resw 320
  2122 000095C0 <res 00000200>          RowOfs:		resw 256
  2123                                  
  2124                                  mod_file_name:
  2125 000097C0 <res 00000050>          		resb 80
  2126                                  
  2127 00009810 <res 000007F0>          alignb 4096
  2128                                  
  2129                                  Audio_Buffer:
  2130 0000A000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2131                                  temp_buffer:
  2132                                  		;resb BUFFERSIZE / 4 ; 8192
  2133 00012000 <res 00004000>          		resb BUFFERSIZE / 2 ; 17/10/2017
  2134                                  		
  2135 00016000 <res 0000A000>          alignb 65536
  2136                                  
  2137                                  DMA_Buffer:
  2138 00020000 <res 00010000>          		resb 65536	
  2139                                  file_buffer:
  2140 00030000 <res 00060000>          		resb 65536*6
  2141                                  EOF:
