     1                                  ; ****************************************************************************
     2                                  ; modplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 13/10/2017 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Modified by using the source code of 'tinyplay.s' ('TINYPLAY.PRG') 
    14                                  ; by Erdogan Tan (07/10/2017)
    15                                  ;
    16                                  ; Modified from '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                                  
    29                                  ; 01/03/2017
    30                                  ; 16/10/2016
    31                                  ; 29/04/2016
    32                                  ; TRDOS 386 system calls (temporary list!)
    33                                  _ver 	equ 0
    34                                  _exit 	equ 1
    35                                  _fork 	equ 2
    36                                  _read 	equ 3
    37                                  _write	equ 4
    38                                  _open	equ 5
    39                                  _close 	equ 6
    40                                  _wait 	equ 7
    41                                  _creat 	equ 8
    42                                  _link 	equ 9
    43                                  _unlink	equ 10
    44                                  _exec	equ 11
    45                                  _chdir	equ 12
    46                                  _time 	equ 13
    47                                  _mkdir 	equ 14
    48                                  _chmod	equ 15
    49                                  _chown	equ 16
    50                                  _break	equ 17
    51                                  _stat	equ 18
    52                                  _seek	equ 19
    53                                  _tell 	equ 20
    54                                  _mount	equ 21
    55                                  _umount	equ 22
    56                                  _setuid	equ 23
    57                                  _getuid	equ 24
    58                                  _stime	equ 25
    59                                  _quit	equ 26	
    60                                  _intr	equ 27
    61                                  _fstat	equ 28
    62                                  _emt 	equ 29
    63                                  _mdate 	equ 30
    64                                  _video 	equ 31
    65                                  _audio	equ 32
    66                                  _timer	equ 33
    67                                  _sleep	equ 34
    68                                  _msg    equ 35
    69                                  _geterr	equ 36
    70                                  _fpsave	equ 37
    71                                  _pri	equ 38
    72                                  _rele	equ 39
    73                                  _fff	equ 40
    74                                  _fnf	equ 41
    75                                  _alloc	equ 42
    76                                  _dalloc equ 43
    77                                  _calbac equ 44		
    78                                  
    79                                  %macro sys 1-4
    80                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    81                                      ; 03/09/2015	
    82                                      ; 13/04/2015
    83                                      ; Retro UNIX 386 v1 system call.	
    84                                      %if %0 >= 2   
    85                                          mov ebx, %2
    86                                          %if %0 >= 3    
    87                                              mov ecx, %3
    88                                              %if %0 = 4
    89                                                 mov edx, %4   
    90                                              %endif
    91                                          %endif
    92                                      %endif
    93                                      mov eax, %1
    94                                      ;int 30h
    95                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    96                                  %endmacro
    97                                  
    98                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    99                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   100                                  
   101                                  ; 19/06/2017
   102                                  BUFFERSIZE equ 32768
   103                                  
   104                                  ; ----------------------------------------------------------------------------
   105                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   106                                  ;	July 14th, 1993.
   107                                  
   108                                  ;=============================================================================
   109                                  ;  
   110                                  ;=============================================================================
   111                                  
   112                                  [BITS 32]
   113                                  [org 0]
   114                                  
   115                                  Start:
   116                                  	; clear bss
   117 00000000 B9[00000800]            	mov	ecx, EOF
   118 00000005 BF[660E0000]            	mov	edi, bss_start
   119 0000000A 29F9                    	sub	ecx, edi
   120 0000000C D1E9                    	shr	ecx, 1
   121 0000000E 31C0                    	xor	eax, eax
   122 00000010 F366AB                  	rep	stosw
   123                                  
   124                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   125 00000013 E800020000              	call    DetectICH
   126 00000018 731B                    	jnc     short GetFileName
   127                                  
   128                                  _dev_not_ready:
   129                                  ; couldn't find the audio device!
   130                                  	sys	_msg, noDevMsg, 255, 0Fh
   130                              <1> 
   130                              <1> 
   130                              <1> 
   130                              <1> 
   130                              <1>  %if %0 >= 2
   130 0000001A BB[25020000]        <1>  mov ebx, %2
   130                              <1>  %if %0 >= 3
   130 0000001F B9FF000000          <1>  mov ecx, %3
   130                              <1>  %if %0 = 4
   130 00000024 BA0F000000          <1>  mov edx, %4
   130                              <1>  %endif
   130                              <1>  %endif
   130                              <1>  %endif
   130 00000029 B823000000          <1>  mov eax, %1
   130                              <1> 
   130 0000002E CD40                <1>  int 40h
   131 00000030 E9C2010000                      jmp     Exit
   132                                  
   133                                  GetFileName:  
   134 00000035 89E6                    	mov	esi, esp
   135 00000037 AD                      	lodsd
   136 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   137                                  		; (program file name & mod file name)
   138 0000003B 0F82BF010000            	jb	pmsg_2017 ; nothing to do
   139                                  
   140 00000041 AD                      	lodsd ; program file name address 
   141 00000042 AD                      	lodsd ; mod file name address (file to be read)
   142 00000043 89C6                    	mov	esi, eax
   143 00000045 BF[90710000]            	mov	edi, mod_file_name
   144                                  ScanName:       
   145 0000004A AC                      	lodsb
   146 0000004B 84C0                    	test	al, al
   147 0000004D 0F84AD010000            	je	pmsg_2017
   148 00000053 3C20                    	cmp	al, 20h
   149 00000055 74F3                    	je	short ScanName	; scan start of name.
   150 00000057 AA                      	stosb
   151 00000058 B4FF                    	mov	ah, 0FFh
   152                                  a_0:	
   153 0000005A FEC4                    	inc	ah
   154                                  a_1:
   155 0000005C AC                      	lodsb
   156 0000005D AA                      	stosb
   157 0000005E 3C2E                    	cmp	al, '.'
   158 00000060 74F8                    	je	short a_0	
   159 00000062 20C0                    	and	al, al
   160 00000064 75F6                    	jnz	short a_1
   161                                  
   162 00000066 08E4                    	or	ah, ah		; if period NOT found,
   163 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   164                                  SetExt:
   165 0000006A 4F                      	dec	edi
   166 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   167 00000071 C6470400                	mov	byte [edi+4], 0
   168                                  PrintMesg:      
   169                                  	; Prints the Credits Text.
   170                                  	sys	_msg, Credits, 255, 0Fh
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1>  %if %0 >= 2
   170 00000075 BB[E20C0000]        <1>  mov ebx, %2
   170                              <1>  %if %0 >= 3
   170 0000007A B9FF000000          <1>  mov ecx, %3
   170                              <1>  %if %0 = 4
   170 0000007F BA0F000000          <1>  mov edx, %4
   170                              <1>  %endif
   170                              <1>  %endif
   170                              <1>  %endif
   170 00000084 B823000000          <1>  mov eax, %1
   170                              <1> 
   170 00000089 CD40                <1>  int 40h
   171                                  _1:
   172                                  	; 19/06/2017
   173                                  	; Allocate Audio Buffer (for user)
   174                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   174                              <1> 
   174                              <1> 
   174                              <1> 
   174                              <1> 
   174                              <1>  %if %0 >= 2
   174 0000008B BB00020000          <1>  mov ebx, %2
   174                              <1>  %if %0 >= 3
   174 00000090 B900800000          <1>  mov ecx, %3
   174                              <1>  %if %0 = 4
   174 00000095 BA[00000100]        <1>  mov edx, %4
   174                              <1>  %endif
   174                              <1>  %endif
   174                              <1>  %endif
   174 0000009A B820000000          <1>  mov eax, %1
   174                              <1> 
   174 0000009F CD40                <1>  int 40h
   175 000000A1 0F8222010000            	jc	error_exit
   176                                  _2:
   177                                  	; Initialize Audio Device
   178                                  	sys	_audio, 0301h, 0, ac97_int_handler 
   178                              <1> 
   178                              <1> 
   178                              <1> 
   178                              <1> 
   178                              <1>  %if %0 >= 2
   178 000000A7 BB01030000          <1>  mov ebx, %2
   178                              <1>  %if %0 >= 3
   178 000000AC B900000000          <1>  mov ecx, %3
   178                              <1>  %if %0 = 4
   178 000000B1 BA[50020000]        <1>  mov edx, %4
   178                              <1>  %endif
   178                              <1>  %endif
   178                              <1>  %endif
   178 000000B6 B820000000          <1>  mov eax, %1
   178                              <1> 
   178 000000BB CD40                <1>  int 40h
   179 000000BD 0F8206010000            	jc	error_exit
   180                                  
   181                                  LoadMod:  
   182 000000C3 BF[90710000]            	mov	edi, mod_file_name
   183 000000C8 E830020000              	call    LoadModule		; Load the MODule...
   184                                  	; 08/10/2017
   185 000000CD 731B                    	jnc	short _3		; any error loading?
   186                                  
   187                                  	; yes, print error and Exit.
   188                                  
   189                                  	sys	_msg, ErrorMesg, 255, 0Fh
   189                              <1> 
   189                              <1> 
   189                              <1> 
   189                              <1> 
   189                              <1>  %if %0 >= 2
   189 000000CF BB[160D0000]        <1>  mov ebx, %2
   189                              <1>  %if %0 >= 3
   189 000000D4 B9FF000000          <1>  mov ecx, %3
   189                              <1>  %if %0 = 4
   189 000000D9 BA0F000000          <1>  mov edx, %4
   189                              <1>  %endif
   189                              <1>  %endif
   189                              <1>  %endif
   189 000000DE B823000000          <1>  mov eax, %1
   189                              <1> 
   189 000000E3 CD40                <1>  int 40h
   190                                  
   191 000000E5 E90D010000              	jmp     Exit
   192                                  
   193                                  _3:
   194                                  	; 10/06/2017
   195                                  	sys	_audio, 0E00h ; get audio controller info
   195                              <1> 
   195                              <1> 
   195                              <1> 
   195                              <1> 
   195                              <1>  %if %0 >= 2
   195 000000EA BB000E0000          <1>  mov ebx, %2
   195                              <1>  %if %0 >= 3
   195                              <1>  mov ecx, %3
   195                              <1>  %if %0 = 4
   195                              <1>  mov edx, %4
   195                              <1>  %endif
   195                              <1>  %endif
   195                              <1>  %endif
   195 000000EF B820000000          <1>  mov eax, %1
   195                              <1> 
   195 000000F4 CD40                <1>  int 40h
   196 000000F6 0F82CD000000            	jc	error_exit
   197                                  
   198                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   199                                  	;jne	_dev_not_ready	
   200                                  
   201                                  	; EAX = IRQ Number in AL
   202                                  	;	Audio Device Number in AH 
   203                                  	; EBX = DEV/VENDOR ID
   204                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   205                                  	; ECX = BUS/DEV/FN 
   206                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   207                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   208                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   209                                  	;      (Low word, DX = NAMBAR address)
   210                                  
   211 000000FC A2[780E0000]            	mov	[ac97_int_ln_reg], al
   212 00000101 891D[680E0000]          	mov	[dev_vendor], ebx
   213 00000107 890D[6C0E0000]          	mov	[bus_dev_fn], ecx
   214 0000010D 668915[740E0000]        	mov	[ac97_NamBar], dx
   215                                  	;mov	[ac97_NamBar], dx
   216                                  	;shr	dx, 16
   217                                  	;mov	[ac97_NabmBar], dx
   218 00000114 8915[740E0000]          	mov	[ac97_NamBar], edx	
   219                                    
   220 0000011A E890090000              	call	write_audio_dev_info 
   221                                  
   222                                  PlayNow: 
   223 0000011F E889080000              	call    StartPlaying
   224                                  
   225                                          ; load 32768 bytes into audio buffer
   226                                  	;mov	edi, Audio_Buffer
   227                                  	;mov	ebx, BUFFERSIZE
   228                                  	; 24/06/2017
   229                                          ; load 8192 bytes into audio buffer
   230 00000124 BF[00800100]            	mov	edi, temp_buffer
   231 00000129 BB00200000              	mov	ebx, BUFFERSIZE / 4
   232 0000012E E8FD070000              	call	GetSamples
   233 00000133 0F8290000000            	jc	error_exit
   234                                  
   235                                  	; 24/06/2017
   236                                  	; 8 bit to 16 bit (*2)
   237                                  	; mono to stereo (*2)
   238                                  	; 4* (BUFFERSIZE/4) 
   239                                  	; source = temp_buffer
   240                                  	; destination = Audio_Buffer
   241 00000139 E844090000              	call 	ConvertSamples
   242                                  
   243                                  	;mov	ecx, 128	; Make a lookup table
   244 0000013E B180                    	mov	cl, 128
   245 00000140 31DB                    	xor     ebx, ebx	; for fastest pixel
   246 00000142 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   247                                  MakeOfs:        
   248 00000147 668993[906F0000]        	mov     [RowOfs+ebx], dx
   249 0000014E 668993[926F0000]        	mov     [RowOfs+ebx+2], dx
   250 00000155 6681C24001              	add     dx, 320
   251 0000015A 83C304                  	add     ebx, 4
   252 0000015D E2E8                    	loop    MakeOfs
   253                                  
   254                                  	; Set Master Volume Level
   255                                  	sys	_audio, 0B00h, 1D1Dh
   255                              <1> 
   255                              <1> 
   255                              <1> 
   255                              <1> 
   255                              <1>  %if %0 >= 2
   255 0000015F BB000B0000          <1>  mov ebx, %2
   255                              <1>  %if %0 >= 3
   255 00000164 B91D1D0000          <1>  mov ecx, %3
   255                              <1>  %if %0 = 4
   255                              <1>  mov edx, %4
   255                              <1>  %endif
   255                              <1>  %endif
   255                              <1>  %endif
   255 00000169 B820000000          <1>  mov eax, %1
   255                              <1> 
   255 0000016E CD40                <1>  int 40h
   256                                  
   257                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   258                                  	
   259                                  	; Start	to play
   260 00000170 A0[BC0D0000]            	mov	al, [bps]
   261 00000175 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   262 00000178 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   263 0000017A 8A1D[BB0D0000]          	mov	bl, [stmo]
   264 00000180 FECB                    	dec	bl
   265 00000182 08C3                    	or	bl, al
   266 00000184 668B0D[BD0D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   267 0000018B B704                    	mov	bh, 4 ; start to play	
   268                                  	sys	_audio
   268                              <1> 
   268                              <1> 
   268                              <1> 
   268                              <1> 
   268                              <1>  %if %0 >= 2
   268                              <1>  mov ebx, %2
   268                              <1>  %if %0 >= 3
   268                              <1>  mov ecx, %3
   268                              <1>  %if %0 = 4
   268                              <1>  mov edx, %4
   268                              <1>  %endif
   268                              <1>  %endif
   268                              <1>  %endif
   268 0000018D B820000000          <1>  mov eax, %1
   268                              <1> 
   268 00000192 CD40                <1>  int 40h
   269                                  
   270                                  	; 13/10/2017
   271                                          ; load 8192 bytes into audio buffer
   272 00000194 BF[00800100]                    mov	edi, temp_buffer
   273 00000199 BB00200000              	mov	ebx, BUFFERSIZE / 4
   274 0000019E E88D070000              	call	GetSamples
   275 000001A3 7224                    	jc	error_exit
   276                                  
   277                                  	; 8 bit to 16 bit (*2)
   278                                  	; mono to stereo (*2)
   279                                  	; 4* (BUFFERSIZE/4) 
   280                                  	; source = temp_buffer
   281                                  	; destination = Audio_Buffer
   282 000001A5 E8D8080000              	call 	ConvertSamples
   283                                  
   284                                  	; bh = 16 : update (current) dma half buffer
   285                                  	; bl = 0  : then switch to the next half buffer
   286                                  	sys	_audio, 1000h
   286                              <1> 
   286                              <1> 
   286                              <1> 
   286                              <1> 
   286                              <1>  %if %0 >= 2
   286 000001AA BB00100000          <1>  mov ebx, %2
   286                              <1>  %if %0 >= 3
   286                              <1>  mov ecx, %3
   286                              <1>  %if %0 = 4
   286                              <1>  mov edx, %4
   286                              <1>  %endif
   286                              <1>  %endif
   286                              <1>  %endif
   286 000001AF B820000000          <1>  mov eax, %1
   286                              <1> 
   286 000001B4 CD40                <1>  int 40h
   287                                      
   288                                  	;; SETUP SIGNAL RESPONSE BYTE
   289                                  	;; 06/03/2017
   290                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   291                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   292                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   293                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   294                                  	;sys	_calbac
   295                                  	;jc	short error_exit
   296                                  
   297                                  	; DIRECT VGA MEMORY ACCESS
   298                                  	; bl = 0, bh = 5
   299                                  	; Direct access/map to VGA memory (0A0000h)
   300                                  
   301                                  	sys	_video, 0500h
   301                              <1> 
   301                              <1> 
   301                              <1> 
   301                              <1> 
   301                              <1>  %if %0 >= 2
   301 000001B6 BB00050000          <1>  mov ebx, %2
   301                              <1>  %if %0 >= 3
   301                              <1>  mov ecx, %3
   301                              <1>  %if %0 = 4
   301                              <1>  mov edx, %4
   301                              <1>  %endif
   301                              <1>  %endif
   301                              <1>  %endif
   301 000001BB B81F000000          <1>  mov eax, %1
   301                              <1> 
   301 000001C0 CD40                <1>  int 40h
   302 000001C2 3D00000A00              	cmp	eax, 0A0000h
   303 000001C7 7418                    	je	short _a3
   304                                  error_exit:
   305                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   305                              <1> 
   305                              <1> 
   305                              <1> 
   305                              <1> 
   305                              <1>  %if %0 >= 2
   305 000001C9 BB[330D0000]        <1>  mov ebx, %2
   305                              <1>  %if %0 >= 3
   305 000001CE B9FF000000          <1>  mov ecx, %3
   305                              <1>  %if %0 = 4
   305 000001D3 BA0E000000          <1>  mov edx, %4
   305                              <1>  %endif
   305                              <1>  %endif
   305                              <1>  %endif
   305 000001D8 B823000000          <1>  mov eax, %1
   305                              <1> 
   305 000001DD CD40                <1>  int 40h
   306 000001DF EB16                    	jmp	short Exit
   307                                  
   308                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   309                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   310                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   311                                  ;       second, or the module will sound "looped".
   312                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   313                                  ;       the polling is called from my routine, and then the irq 0 must be
   314                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   315                                  ;       samples played by the Sound Blaster. Note that some samples are
   316                                  ;       discarded in the next code, just for fun!
   317                                  
   318                                  _a3:
   319 000001E1 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   320 000001E5 CD31                    	int     31h
   321                                  
   322                                  	; 24/06/2017
   323 000001E7 E879000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   324                                  
   325                                  _s_exit:
   326 000001EC E860080000              	call	StopPlaying	; STOP!
   327                                  
   328 000001F1 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   329 000001F5 CD31                    	int     31h
   330                                  Exit:           
   331                                  	;call    FreeModule	; Free MODule core.
   332                                  	
   333                                  	sys 	_exit	; Bye !
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1>  %if %0 >= 2
   333                              <1>  mov ebx, %2
   333                              <1>  %if %0 >= 3
   333                              <1>  mov ecx, %3
   333                              <1>  %if %0 = 4
   333                              <1>  mov edx, %4
   333                              <1>  %endif
   333                              <1>  %endif
   333                              <1>  %endif
   333 000001F7 B801000000          <1>  mov eax, %1
   333                              <1> 
   333 000001FC CD40                <1>  int 40h
   334                                  here:
   335 000001FE EBFE                    	jmp	short here
   336                                  
   337                                  pmsg_2017:
   338                                  	sys	_msg, msg_2017, 255, 0Fh
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1>  %if %0 >= 2
   338 00000200 BB[7A0C0000]        <1>  mov ebx, %2
   338                              <1>  %if %0 >= 3
   338 00000205 B9FF000000          <1>  mov ecx, %3
   338                              <1>  %if %0 = 4
   338 0000020A BA0F000000          <1>  mov edx, %4
   338                              <1>  %endif
   338                              <1>  %endif
   338                              <1>  %endif
   338 0000020F B823000000          <1>  mov eax, %1
   338                              <1> 
   338 00000214 CD40                <1>  int 40h
   339 00000216 EBDF                    	jmp	short Exit
   340                                  
   341                                  DetectICH:
   342                                  	; 24/06/2017
   343                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   344                                          sys	_audio, 0102h
   344                              <1> 
   344                              <1> 
   344                              <1> 
   344                              <1> 
   344                              <1>  %if %0 >= 2
   344 00000218 BB02010000          <1>  mov ebx, %2
   344                              <1>  %if %0 >= 3
   344                              <1>  mov ecx, %3
   344                              <1>  %if %0 = 4
   344                              <1>  mov edx, %4
   344                              <1>  %endif
   344                              <1>  %endif
   344                              <1>  %endif
   344 0000021D B820000000          <1>  mov eax, %1
   344                              <1> 
   344 00000222 CD40                <1>  int 40h
   345 00000224 C3                      	retn
   346                                  
   347                                  noDevMsg:
   348 00000225 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   348 0000022E 61626C6520746F2066-
   348 00000237 696E64204143393720-
   348 00000240 617564696F20646576-
   348 00000249 696365210D0A00     
   349                                  
   350                                  ac97_int_handler:
   351                                  	; 19/06/2017
   352 00000250 C605[790E0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   353                                  
   354                                  	sys	_rele ; return from callback service 
   354                              <1> 
   354                              <1> 
   354                              <1> 
   354                              <1> 
   354                              <1>  %if %0 >= 2
   354                              <1>  mov ebx, %2
   354                              <1>  %if %0 >= 3
   354                              <1>  mov ecx, %3
   354                              <1>  %if %0 = 4
   354                              <1>  mov edx, %4
   354                              <1>  %endif
   354                              <1>  %endif
   354                              <1>  %endif
   354 00000257 B827000000          <1>  mov eax, %1
   354                              <1> 
   354 0000025C CD40                <1>  int 40h
   355                                  	; we must not come here !
   356                                  	sys	_exit
   356                              <1> 
   356                              <1> 
   356                              <1> 
   356                              <1> 
   356                              <1>  %if %0 >= 2
   356                              <1>  mov ebx, %2
   356                              <1>  %if %0 >= 3
   356                              <1>  mov ecx, %3
   356                              <1>  %if %0 = 4
   356                              <1>  mov edx, %4
   356                              <1>  %endif
   356                              <1>  %endif
   356                              <1>  %endif
   356 0000025E B801000000          <1>  mov eax, %1
   356                              <1> 
   356 00000263 CD40                <1>  int 40h
   357                                  
   358                                  ;=============================================================================
   359                                  ;      
   360                                  ;=============================================================================
   361                                  
   362                                  PlayMod:
   363                                  	; 13/10/2017
   364                                  	; 23/06/2017   
   365                                  	; 21/06/2017
   366                                  	; 19/06/2017
   367                                  
   368                                  	; 05/03/2017 (TRDOS 386)
   369                                  	; 14/02/2017
   370                                  	; 13/02/2017
   371                                  	; 08/12/2016
   372                                  	; 28/11/2016
   373                                  
   374                                  	; 13/10/2017
   375                                  	;jmp	short modp_gs ; 23/06/2017
   376                                  p_loop:
   377 00000265 803D[790E0000]00        	cmp	byte [srb], 0
   378 0000026C 7621                    	jna	short q_loop
   379 0000026E C605[790E0000]00        	mov	byte [srb], 0
   380                                  modp_gs:
   381                                  	;mov	edi, Audio_Buffer
   382                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   383                                  	;call	GetSamples
   384                                  
   385                                  	; 24/06/2017
   386                                          ; load 8192 bytes into audio buffer
   387 00000275 BF[00800100]            	mov	edi, temp_buffer
   388 0000027A BB00200000              	mov	ebx, BUFFERSIZE / 4
   389 0000027F E8AC060000              	call	GetSamples
   390 00000284 0F823FFFFFFF            	jc	error_exit
   391                                  
   392                                  	; 24/06/2017
   393                                  	; 8 bit to 16 bit (*2)
   394                                  	; mono to stereo (*2)
   395                                  	; 4* (BUFFERSIZE/4) 
   396                                  	; source = temp_buffer
   397                                  	; destination = Audio_Buffer
   398 0000028A E8F3070000              	call 	ConvertSamples
   399                                  
   400                                  q_loop:
   401 0000028F B401                    	mov     ah, 1		; any key pressed?
   402 00000291 CD32                    	int     32h		; no, Loop.
   403 00000293 7405                    	jz	short r_loop
   404                                  
   405 00000295 B400                    	mov     ah, 0		; flush key buffer...
   406 00000297 CD32                    	int     32h
   407                                  q_return:
   408 00000299 C3                      	retn
   409                                  r_loop:
   410                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   411                                  	; 23/06/2017
   412                                  	; 22/06/2017
   413                                  	; bh = 15, get current sound data/samples
   414                                  	; bl = 0, for PCM OUT
   415                                  	; ecx = count of sample/data bytes (1 to 4096)
   416                                  	; edx = destination buffer address 
   417                                  	;	(page aligned address is better)
   418                                  	;
   419                                  	sys	_audio, 0F00h, 320*4, g_buff
   419                              <1> 
   419                              <1> 
   419                              <1> 
   419                              <1> 
   419                              <1>  %if %0 >= 2
   419 0000029A BB000F0000          <1>  mov ebx, %2
   419                              <1>  %if %0 >= 3
   419 0000029F B900050000          <1>  mov ecx, %3
   419                              <1>  %if %0 = 4
   419 000002A4 BA[00800000]        <1>  mov edx, %4
   419                              <1>  %endif
   419                              <1>  %endif
   419                              <1>  %endif
   419 000002A9 B820000000          <1>  mov eax, %1
   419                              <1> 
   419 000002AE CD40                <1>  int 40h
   420                                  ScopeLoop:
   421 000002B0 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   422                                  	; 19/06/2017
   423 000002B5 BE[00800000]            	mov     esi, g_buff	; display current samples
   424 000002BA 31C9                    	xor     ecx, ecx	; to be drawed ...
   425 000002BC 31D2                    	xor     edx, edx
   426                                  DrawLoop:       
   427 000002BE 89D3                    	mov     ebx, edx	; (save Index)
   428 000002C0 668BBB[106D0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   429 000002C7 C60700                  	mov     byte [edi], 0	; erase it!
   430                                  	; 24/06/2017
   431 000002CA AD                      	lodsd
   432 000002CB 80C480                  	add	ah, 80h
   433 000002CE 88E3                    	mov	bl, ah
   434                                  	;
   435 000002D0 30FF                    	xor     bh, bh
   436 000002D2 66D1E3                  	shl     bx, 1
   437 000002D5 668BBB[906F0000]        	mov     di, [RowOfs+ebx]
   438 000002DC 6601CF                  	add     di, cx
   439 000002DF 6689D3                  	mov     bx, dx		; (restore Index)
   440 000002E2 6689BB[106D0000]        	mov     [Scope+ebx], di	; save new address...
   441 000002E9 C6070A                  	mov     byte [edi], 10	; and DRAW.
   442 000002EC 6683C202                	add     dx, 2		; the next pixel...
   443 000002F0 41                      	inc     ecx
   444 000002F1 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   445 000002F6 72C6                    	jb      short DrawLoop
   446 000002F8 E968FFFFFF              	jmp	p_loop
   447                                  
   448                                  
   449                                  ;=============================================================================
   450                                  ;               MODLOAD.ASM
   451                                  ;=============================================================================
   452                                  
   453                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   454                                  ;	July 10th, 1993.
   455                                  
   456                                  ; STRUCTURES
   457                                  
   458                                  struc ModSample
   459 00000000 <res 00000016>          .msName:	resb 22
   460 00000016 <res 00000002>          .msLength:	resw 1
   461 00000018 <res 00000001>          .msFinetune:	resb 1
   462 00000019 <res 00000001>          .msVolume:	resb 1
   463 0000001A <res 00000002>          .msRepeat:	resw 1
   464 0000001C <res 00000002>          .msRepLen:	resw 1
   465                                  .size:
   466                                  endstruc
   467                                  
   468                                  struc ModHeader
   469 00000000 <res 00000014>          .mhName:	resb 20
   470 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   471 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   472 000003B7 <res 00000001>          .mhReStart:	resb 1
   473 000003B8 <res 00000080>          .mhOrder:	resb 128
   474 00000438 <res 00000004>          .mhSign:	resw 2
   475                                  .size:	
   476                                  endstruc
   477                                  
   478                                  struc ModInfoRec
   479 00000000 <res 00000001>          .OrderLen:	resb 1
   480 00000001 <res 00000001>          .ReStart:	resb 1
   481 00000002 <res 00000080>          .Order:	resb 128
   482 00000082 <res 00000004>          .Patterns:	resd 1
   483 00000086 <res 0000003E>          .SampOfs:	resw 31
   484 000000C4 <res 0000003E>          .SampSeg:	resw 31
   485 00000102 <res 0000003E>          .SampLen:	resw 31
   486 00000140 <res 0000003E>          .SampRep:	resw 31
   487 0000017E <res 0000003E>          .SampRepLen:	resw 31
   488 000001BC <res 0000003E>          .SampVol:	resw 31
   489                                  .size:	
   490                                  endstruc
   491                                  
   492                                  ; CODE
   493                                  
   494                                  ; 07/10/2017 (modplay.s)
   495                                  
   496                                  LoadModule:
   497                                  	; edi = file name address
   498                                  
   499 000002FD 60                      	pushad
   500                                  	
   501                                  	;call    ClearModInfo ; 07/10/2017 (not necessary.)
   502                                  OpenFile:       
   503                                  	; ebx = ASCIIZ file name address
   504                                  	; ecx = open mode (0 = open for read)	
   505                                  	sys	_open, edi, 0 ; open for reading
   505                              <1> 
   505                              <1> 
   505                              <1> 
   505                              <1> 
   505                              <1>  %if %0 >= 2
   505 000002FE 89FB                <1>  mov ebx, %2
   505                              <1>  %if %0 >= 3
   505 00000300 B900000000          <1>  mov ecx, %3
   505                              <1>  %if %0 = 4
   505                              <1>  mov edx, %4
   505                              <1>  %endif
   505                              <1>  %endif
   505                              <1>  %endif
   505 00000305 B805000000          <1>  mov eax, %1
   505                              <1> 
   505 0000030A CD40                <1>  int 40h
   506 0000030C 0F8244010000            	jc	Failed
   507 00000312 A3[7A0E0000]            	mov     [FileHandle], eax
   508                                  ReadHeader:
   509                                  	; ebx = File handle
   510                                  	; ecx = Buffer address
   511                                  	; edx = Byte count
   512                                  	sys	_read, [FileHandle], Header, ModHeader.size
   512                              <1> 
   512                              <1> 
   512                              <1> 
   512                              <1> 
   512                              <1>  %if %0 >= 2
   512 00000317 8B1D[7A0E0000]      <1>  mov ebx, %2
   512                              <1>  %if %0 >= 3
   512 0000031D B9[7E0E0000]        <1>  mov ecx, %3
   512                              <1>  %if %0 = 4
   512 00000322 BA3C040000          <1>  mov edx, %4
   512                              <1>  %endif
   512                              <1>  %endif
   512                              <1>  %endif
   512 00000327 B803000000          <1>  mov eax, %1
   512                              <1> 
   512 0000032C CD40                <1>  int 40h
   513 0000032E 0F8213010000            	jc      CloseFile
   514                                  CheckMK:        
   515 00000334 813D[B6120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   515 0000033C 4B2E               
   516 0000033E 7412                    	je      short IsModFile
   517                                  CheckFLT4:
   518 00000340 813D[B6120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   518 00000348 5434               
   519 0000034A 7406                    	je      short IsModFile
   520                                  	; 07/10/2017
   521 0000034C F9                      	stc
   522 0000034D E9F5000000              	jmp	CloseFile
   523                                  IsModFile:
   524 00000352 A0[34120000]            	mov     al, [Header+ModHeader.mhOrderLen]
   525 00000357 A2[BA120000]            	mov     [ModInfo.OrderLen], al
   526                                  
   527 0000035C A0[35120000]            	mov     al, [Header+ModHeader.mhReStart]
   528 00000361 3A05[34120000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   529 00000367 7202                    	jb      short SetReStart
   530 00000369 B07F                    	mov     al, 7Fh
   531                                  SetReStart:
   532 0000036B A2[BB120000]            	mov     [ModInfo.ReStart], al
   533                                  
   534                                  	;mov	ecx, 128
   535 00000370 66B98000                	mov	cx, 128
   536 00000374 31D2                    	xor     edx, edx
   537 00000376 31DB                    	xor     ebx, ebx
   538                                  CopyOrder:
   539 00000378 8AB3[36120000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   540 0000037E 88B3[BC120000]          	mov     [ModInfo.Order+ebx], dh
   541 00000384 38D6                    	cmp     dh, dl
   542 00000386 7202                    	jb      short NextOrder
   543 00000388 88F2                    	mov     dl, dh
   544                                  NextOrder:
   545 0000038A 43                      	inc     ebx
   546 0000038B E2EB                    	loop    CopyOrder
   547                                  AllocPatterns:  
   548 0000038D 81E2FF000000            	and	edx, 0FFh
   549                                  	;inc	dx
   550 00000393 FEC2                    	inc	dl  ; 07/10/2017
   551                                  	; dl = count of 1024 bytes ; count of patterns (04/07/2017)
   552 00000395 C1E20A                  	shl	edx, 10 ; *1024 ; (count of patterns *64*16)
   553                                  
   554 00000398 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   555                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   556 0000039A B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   557                                  	;
   558 0000039F 890D[3C130000]          	mov	[ModInfo.Patterns], ecx
   559                                  	;
   560 000003A5 01CD                    	add	ebp, ecx ; next offset for samples
   561                                  ReadPatterns:  
   562                                  	;mov	ebx, [FileHandle] 
   563                                  	; ebx = File handle
   564                                  	; ecx = Buffer address
   565                                  	; edx = Byte count
   566                                  	sys	_read, [FileHandle]
   566                              <1> 
   566                              <1> 
   566                              <1> 
   566                              <1> 
   566                              <1>  %if %0 >= 2
   566 000003A7 8B1D[7A0E0000]      <1>  mov ebx, %2
   566                              <1>  %if %0 >= 3
   566                              <1>  mov ecx, %3
   566                              <1>  %if %0 = 4
   566                              <1>  mov edx, %4
   566                              <1>  %endif
   566                              <1>  %endif
   566                              <1>  %endif
   566 000003AD B803000000          <1>  mov eax, %1
   566                              <1> 
   566 000003B2 CD40                <1>  int 40h
   567 000003B4 0F828D000000            	jc      CloseFile
   568                                  
   569                                  	; paterns have been loaded here... (04/07/2017)
   570                                  
   571 000003BA BE[920E0000]            	mov	esi, Header+ModHeader.mhSamples
   572 000003BF 31FF                    	xor     edi, edi
   573                                  CopySamples:
   574 000003C1 668B4616                	mov     ax, [esi+ModSample.msLength]
   575 000003C5 86C4                    	xchg    al, ah
   576 000003C7 66D1E0                  	shl     ax, 1
   577 000003CA 668987[BC130000]        	mov     [ModInfo.SampLen+edi], ax
   578 000003D1 8A4619                  	mov     al, [esi+ModSample.msVolume]
   579 000003D4 30E4                    	xor     ah, ah
   580 000003D6 668987[76140000]        	mov     [ModInfo.SampVol+edi], ax
   581 000003DD 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   582 000003E1 86C4                    	xchg    al, ah
   583 000003E3 66D1E0                  	shl     ax, 1
   584 000003E6 668987[FA130000]        	mov     [ModInfo.SampRep+edi], ax
   585 000003ED 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   586 000003F1 86C4                    	xchg    al, ah
   587 000003F3 66D1E0                  	shl     ax, 1
   588 000003F6 668987[38140000]        	mov     [ModInfo.SampRepLen+edi], ax
   589 000003FD 83C61E                  	add     esi, ModSample.size
   590 00000400 6683C702                	add     di, 2
   591 00000404 6683FF3E                	cmp     di, 2*31
   592 00000408 72B7                    	jb      short CopySamples
   593                                  
   594 0000040A 31F6                    	xor     esi, esi
   595                                  AllocSamples:
   596 0000040C 0FB796[BC130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   597                                  	; 07/10/2017
   598                                  	;shr	dx, 4 ; ***
   599 00000413 21D2                    	and	edx, edx
   600 00000415 7426                    	jz      short NextSample
   601                                  	;inc	dx  ; number of paragraphs ; ***
   602                                  	;shl	dx, 4 ; ***
   603 00000417 89E8                    	mov	eax, ebp
   604 00000419 668986[40130000]        	mov	[ModInfo.SampOfs+esi], ax
   605 00000420 C1E810                  	shr	eax, 16
   606 00000423 668986[7E130000]        	mov	[ModInfo.SampSeg+esi], ax
   607 0000042A 89E9                    	mov	ecx, ebp
   608 0000042C 01D5                    	add	ebp, edx ; next offset for sample 
   609                                  ReadSample:
   610                                  	;mov	ebx, [FileHandle]
   611                                  	;movzx  edx, [ModInfo.SampLen+esi]
   612                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   613                                  
   614                                  	; ebx = File handle
   615                                  	; ecx = Buffer address
   616                                  	; edx = Byte count
   617                                  	sys	_read, [FileHandle]
   617                              <1> 
   617                              <1> 
   617                              <1> 
   617                              <1> 
   617                              <1>  %if %0 >= 2
   617 0000042E 8B1D[7A0E0000]      <1>  mov ebx, %2
   617                              <1>  %if %0 >= 3
   617                              <1>  mov ecx, %3
   617                              <1>  %if %0 = 4
   617                              <1>  mov edx, %4
   617                              <1>  %endif
   617                              <1>  %endif
   617                              <1>  %endif
   617 00000434 B803000000          <1>  mov eax, %1
   617                              <1> 
   617 00000439 CD40                <1>  int 40h
   618 0000043B 720A                    	jc      short CloseFile
   619                                  
   620                                  NextSample:
   621 0000043D 6683C602                	add     si, 2
   622 00000441 6683FE3E                	cmp     si, 2*31
   623 00000445 72C5                    	jb      short AllocSamples
   624                                  CloseFile:      
   625 00000447 9C                      	pushf
   626                                  	sys	_close, [FileHandle]
   626                              <1> 
   626                              <1> 
   626                              <1> 
   626                              <1> 
   626                              <1>  %if %0 >= 2
   626 00000448 8B1D[7A0E0000]      <1>  mov ebx, %2
   626                              <1>  %if %0 >= 3
   626                              <1>  mov ecx, %3
   626                              <1>  %if %0 = 4
   626                              <1>  mov edx, %4
   626                              <1>  %endif
   626                              <1>  %endif
   626                              <1>  %endif
   626 0000044E B806000000          <1>  mov eax, %1
   626                              <1> 
   626 00000453 CD40                <1>  int 40h
   627 00000455 9D                      	popf
   628                                  Failed:         
   629 00000456 61                      	popad
   630                                  
   631 00000457 C3                      	retn
   632                                  
   633                                  FreeModule:
   634                                  	; Erdogan Tan (13/02/2017)
   635                                  	; nothing to do here for memory de-allocation
   636                                  ClearModInfo:
   637 00000458 57                      	push	edi
   638 00000459 BF[BA120000]            	mov	edi, ModInfo
   639 0000045E B9FA010000              	mov     ecx, ModInfoRec.size
   640                                  	;cld
   641 00000463 30C0                    	xor     al, al
   642 00000465 F3AA                    	rep     stosb
   643 00000467 5F                      	pop	edi
   644 00000468 C3                      	retn
   645                                  
   646                                  ;=============================================================================
   647                                  ;               MODPLAY.ASM
   648                                  ;=============================================================================
   649                                  
   650                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   651                                  ;	July 23th, 1993.
   652                                  
   653                                  ; EQUATES
   654                                  
   655                                  NumTracks       equ 4
   656                                  DefTempo        equ 6
   657                                  DefBpm          equ 125
   658                                  MidCRate        equ 8448
   659                                  MixBufSize      equ 4096
   660                                  
   661                                  ; STRUCTURES
   662                                  
   663                                  struc TrackInfo
   664 00000000 <res 00000004>          .Samples:	resd 1
   665 00000004 <res 00000004>          .Position:	resd 1
   666 00000008 <res 00000002>          .Len:	resw 1
   667 0000000A <res 00000002>          .Repeat:	resw 1
   668 0000000C <res 00000002>          .RepLen:	resw 1
   669 0000000E <res 00000001>          .Volume: 	resb 1
   670 0000000F <res 00000001>          .Error:	resb 1
   671 00000010 <res 00000002>          .Period:	resw 1
   672 00000012 <res 00000002>          .Pitch:	resw 1
   673 00000014 <res 00000002>          .Effect:	resw 1
   674 00000016 <res 00000002>          .PortTo:	resw 1
   675 00000018 <res 00000001>          .PortParm:	resb 1
   676 00000019 <res 00000001>          .VibPos:	resb 1
   677 0000001A <res 00000001>          .VibParm:	resb 1
   678 0000001B <res 00000001>          .OldSampOfs:	resb 1
   679 0000001C <res 00000006>          .Arp:	resw 3
   680 00000022 <res 00000002>          .ArpIndex:	resw 1
   681                                  .size:
   682                                  endstruc
   683                                  
   684                                  ; CODE
   685                                  
   686                                  ;--------------------------------------------------------------------------
   687                                  ; BeatTrack:  Process the next beat in one track.
   688                                  ;  In:
   689                                  ;    ds:di -  Track info Address.
   690                                  ;--------------------------------------------------------------------------
   691                                  
   692                                  ; edi = Track info address
   693                                  
   694                                  BeatTrack:
   695 00000469 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   696 0000046D 6685D2                  	test    dx, dx
   697 00000470 743C                    	je      short None
   698 00000472 80FE00                  	cmp     dh, 00h
   699 00000475 7438                    	je      short Arpeggio
   700 00000477 80FE01                  	cmp     dh, 01h
   701 0000047A 7451                    	je      short PortUp
   702 0000047C 80FE02                  	cmp     dh, 02h
   703 0000047F 7471                    	je      short PortDown
   704 00000481 80FE03                  	cmp     dh, 03h
   705 00000484 0F848E000000            	je      TonePort
   706 0000048A 80FE04                  	cmp     dh, 04h
   707 0000048D 0F84BD000000            	je      Vibrato
   708 00000493 80FE05                  	cmp     dh, 05h
   709 00000496 0F840E010000            	je      PortSlide
   710 0000049C 80FE06                  	cmp     dh, 06h
   711 0000049F 0F8412010000            	je      VibSlide
   712 000004A5 80FE0A                  	cmp     dh, 0Ah
   713 000004A8 0F8413010000            	je      VolSlide
   714                                  None:           
   715 000004AE C3                      	retn
   716                                  Arpeggio:
   717 000004AF 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   718 000004B3 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   719 000004B8 66894712                	mov     [edi+TrackInfo.Pitch], ax
   720 000004BC 6683C302                	add     bx, 2
   721 000004C0 6683FB06                	cmp     bx, 6
   722 000004C4 7202                    	jb      short SetArpIndex
   723 000004C6 31DB                    	xor     ebx, ebx
   724                                  SetArpIndex:
   725 000004C8 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   726 000004CC C3                      	retn
   727                                  PortUp:
   728 000004CD 30F6                    	xor     dh, dh
   729 000004CF 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   730 000004D3 6629D3                  	sub     bx, dx
   731 000004D6 6683FB71                	cmp     bx, 113
   732 000004DA 7D04                    	jge     short NotSmall
   733 000004DC 66BB7100                	mov     bx, 113
   734                                  NotSmall:
   735 000004E0 66895F10                	mov     [edi+TrackInfo.Period], bx
   736 000004E4 6601DB                  	add     bx, bx
   737 000004E7 66678B87[B414]          	mov     ax, [PitchTable+bx]
   738 000004ED 66894712                	mov     [edi+TrackInfo.Pitch], ax
   739 000004F1 C3                      	retn
   740                                  PortDown:
   741 000004F2 30F6                    	xor     dh, dh
   742 000004F4 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   743 000004F8 6601D3                  	add     bx, dx
   744 000004FB 6681FB5803              	cmp     bx, 856
   745 00000500 7E04                    	jle     short NotBig
   746 00000502 66BB5803                	mov     bx, 856
   747 00000506 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   748 0000050A 6601DB                  	add     bx, bx
   749 0000050D 66678B87[B414]          	mov     ax, [PitchTable+bx]
   750 00000513 66894712                	mov     [edi+TrackInfo.Pitch], ax
   751 00000517 C3                      	retn
   752                                  TonePort:
   753 00000518 30F6                    	xor     dh, dh
   754 0000051A 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   755 0000051E 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   756 00000522 6639C3                  	cmp     bx, ax
   757 00000525 7428                    	je      short NoPort
   758 00000527 7F0D                    	jg      short PortToUp
   759                                  PortToDown:     
   760 00000529 6601D3                  	add     bx, dx
   761 0000052C 6639C3                  	cmp     bx, ax
   762 0000052F 7E0D                    	jle     short SetPort
   763                                  FixPort:        
   764 00000531 6689C3                  	mov     bx, ax
   765 00000534 EB08                    	jmp     short SetPort
   766                                  PortToUp:
   767 00000536 6629D3                  	sub     bx, dx
   768 00000539 6639C3                  	cmp     bx, ax
   769 0000053C 7CF3                    	jl      short FixPort
   770                                  SetPort:        
   771 0000053E 66895F10                	mov     [edi+TrackInfo.Period], bx
   772 00000542 6601DB                  	add     bx, bx
   773 00000545 66678B87[B414]          	mov     ax, [PitchTable+bx]
   774 0000054B 66894712                	mov     [edi+TrackInfo.Pitch], ax
   775                                  NoPort:         
   776 0000054F C3                      	retn
   777                                  Vibrato:
   778 00000550 88D6                    	mov     dh, dl
   779 00000552 80E20F                  	and     dl, 0Fh
   780 00000555 C0EE04                  	shr     dh, 4
   781 00000558 C0E602                  	shl     dh, 2
   782 0000055B 007719                  	add     [edi+TrackInfo.VibPos], dh
   783 0000055E 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   784 00000561 88F3                    	mov     bl, dh
   785 00000563 C0EB02                  	shr     bl, 2
   786 00000566 6683E31F                	and     bx, 1Fh
   787 0000056A 678A87[530D]            	mov     al, [SinTable+bx]
   788 0000056F F6E2                    	mul     dl
   789 00000571 66D1C0                  	rol     ax, 1
   790 00000574 86C4                    	xchg    al, ah
   791 00000576 80E401                  	and     ah, 1
   792 00000579 84F6                    	test    dh, dh
   793 0000057B 7903                    	jns     short VibUp
   794 0000057D 66F7D8                  	neg     ax
   795                                  VibUp:          
   796 00000580 66034710                	add     ax, [edi+TrackInfo.Period]
   797 00000584 6689C3                  	mov     bx, ax
   798 00000587 6683FB71                	cmp     bx, 113
   799 0000058B 7D04                    	jge     short NoLoVib
   800 0000058D 66BB7100                	mov     bx, 113
   801                                  NoLoVib:        
   802 00000591 6681FB5803              	cmp     bx, 856
   803 00000596 7E04                    	jle     short NoHiVib
   804 00000598 66BB5803                	mov     bx, 856
   805                                  NoHiVib:        
   806 0000059C 6601DB                  	add     bx, bx
   807 0000059F 66678B87[B414]          	mov     ax, [PitchTable+bx]
   808 000005A5 66894712                	mov     [edi+TrackInfo.Pitch], ax
   809 000005A9 C3                      	retn
   810                                  PortSlide:
   811 000005AA E812000000              	call    VolSlide
   812 000005AF 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   813 000005B2 E961FFFFFF              	jmp     TonePort
   814                                  VibSlide:
   815 000005B7 E805000000              	call    VolSlide
   816 000005BC 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   817 000005BF EB8F                    	jmp     short Vibrato
   818                                  VolSlide:
   819 000005C1 88D6                    	mov     dh, dl
   820 000005C3 80E20F                  	and     dl, 0Fh
   821 000005C6 C0EE04                  	shr     dh, 4
   822 000005C9 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   823 000005CC 28D0                    	sub     al, dl
   824 000005CE 7D02                    	jge     short NoLoVol
   825 000005D0 30C0                    	xor     al, al
   826                                  NoLoVol:        
   827 000005D2 00F0                    	add     al, dh
   828 000005D4 3C40                    	cmp     al, 64
   829 000005D6 7602                    	jbe     short NoHiVol
   830 000005D8 B040                    	mov     al, 64
   831                                  NoHiVol:        
   832 000005DA 88470E                  	mov     [edi+TrackInfo.Volume], al
   833 000005DD C3                      	retn
   834                                  
   835                                  ;--------------------------------------------------------------------------
   836                                  ; GetTrack:   Get the next Note from a pattern.
   837                                  ;  In:
   838                                  ;    ds:di -  Track info Address.
   839                                  ;    es:si -  Pattern Note Address.
   840                                  ; Out:
   841                                  ;    es:si -  The Next Pattern Note address.
   842                                  ;--------------------------------------------------------------------------
   843                                  
   844                                  ; esi = Pattern note address
   845                                  ; edi = Track info address
   846                                  
   847                                  GetTrack:
   848 000005DE 66AD                    	lodsw
   849 000005E0 86C4                    	xchg    al, ah
   850 000005E2 88E3                    	mov	bl, ah
   851 000005E4 80E40F                  	and     ah, 0Fh
   852 000005E7 6689C1                  	mov     cx, ax
   853 000005EA 66AD                    	lodsw
   854 000005EC 86C4                    	xchg    al, ah
   855 000005EE 88E7                    	mov     bh, ah
   856 000005F0 80E40F                  	and     ah, 0Fh
   857 000005F3 6689C2                  	mov     dx, ax
   858 000005F6 66895714                	mov     [edi+TrackInfo.Effect], dx
   859 000005FA 80E3F0                  	and     bl, 0F0h
   860 000005FD C0EF04                  	shr     bh, 4
   861 00000600 08FB                    	or      bl, bh
   862 00000602 7449                    	je      short SetPeriod
   863                                  SetSample:
   864                                  	;xor    bh, bh
   865 00000604 81E3FF000000            	and	ebx, 0FFh
   866 0000060A 4B                      	dec     ebx
   867 0000060B 01DB                    	add     ebx, ebx
   868 0000060D 668B83[76140000]        	mov     ax, [ModInfo.SampVol+ebx]
   869 00000614 88470E                  	mov     [edi+TrackInfo.Volume], al
   870 00000617 668B83[40130000]        	mov     ax, [ModInfo.SampOfs+ebx]
   871 0000061E 668907                  	mov     [edi+TrackInfo.Samples], ax
   872 00000621 668B83[7E130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   873 00000628 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   874 0000062C 668B83[BC130000]        	mov     ax, [ModInfo.SampLen+ebx]
   875 00000633 66894708                	mov     [edi+TrackInfo.Len], ax
   876 00000637 668B83[FA130000]        	mov     ax, [ModInfo.SampRep+ebx]
   877 0000063E 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   878 00000642 668B83[38140000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   879 00000649 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   880                                  SetPeriod:      
   881 0000064D 6685C9                  	test    cx, cx
   882 00000650 7424                    	jz      short SetEffect
   883                                  
   884 00000652 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   885 00000656 80FE03                  	cmp     dh, 03h
   886 00000659 741B                    	je      short SetEffect
   887                                  
   888 0000065B 66894F10                	mov     [edi+TrackInfo.Period], cx
   889 0000065F 6689CB                  	mov     bx, cx
   890 00000662 6601DB                  	add     bx, bx
   891 00000665 66678B87[B414]          	mov     ax, [PitchTable+bx]
   892 0000066B 66894712                	mov     [edi+TrackInfo.Pitch], ax
   893 0000066F C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   894                                  SetEffect:
   895 00000676 6685D2                  	test    dx, dx
   896 00000679 7430                    	jz      short InitNone
   897 0000067B 80FE00                  	cmp     dh, 00h
   898 0000067E 0F84E5000000            	je      InitArpeggio
   899 00000684 80FE03                  	cmp     dh, 03h
   900 00000687 7423                    	je      short InitTonePort
   901 00000689 80FE04                  	cmp     dh, 04h
   902 0000068C 742D                    	je      short InitVibrato
   903 0000068E 80FE09                  	cmp     dh, 09h
   904 00000691 7451                    	je      short SampleOfs
   905 00000693 80FE0B                  	cmp     dh, 0Bh
   906 00000696 7462                    	je      short PosJump
   907 00000698 80FE0C                  	cmp     dh, 0Ch
   908 0000069B 746B                    	je      short SetVolume
   909 0000069D 80FE0D                  	cmp     dh, 0Dh
   910 000006A0 7471                    	je      short Break
   911 000006A2 80FE0F                  	cmp     dh, 0Fh
   912 000006A5 0F8487000000            	je      SetSpeed
   913                                  InitNone:
   914 000006AB C3                      	retn
   915                                  InitTonePort:
   916 000006AC 84D2                    	test    dl, dl
   917 000006AE 7503                    	jnz     short SetPortParm
   918 000006B0 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   919                                  SetPortParm:    
   920 000006B3 885718                  	mov     [edi+TrackInfo.PortParm], dl
   921 000006B6 66895714                	mov     [edi+TrackInfo.Effect], dx
   922 000006BA C3                      	retn
   923                                  InitVibrato:
   924 000006BB 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   925 000006BE 88C4                    	mov     ah, al
   926 000006C0 240F                    	and     al, 0Fh
   927 000006C2 80E4F0                  	and     ah, 0F0h
   928 000006C5 F6C20F                  	test    dl, 0Fh
   929 000006C8 7502                    	jne     short OkDepth
   930 000006CA 08C2                    	or      dl, al
   931                                  OkDepth:        
   932 000006CC F6C2F0                  	test    dl, 0F0h
   933 000006CF 7502                    	jnz     short OkRate
   934 000006D1 08E2                    	or      dl, ah
   935                                  OkRate:         
   936 000006D3 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   937 000006D6 66895714                	mov     [edi+TrackInfo.Effect], dx
   938 000006DA 6685C9                  	test    cx, cx
   939 000006DD 7404                    	jz      short OkPos
   940 000006DF C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   941                                  OkPos:          
   942 000006E3 C3                      	retn
   943                                  SampleOfs:      
   944 000006E4 84D2                    	test    dl, dl
   945 000006E6 7503                    	jnz     short SetSampleOfs
   946 000006E8 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   947                                  SetSampleOfs:
   948 000006EB 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   949 000006EE 88D6                    	mov     dh, dl
   950 000006F0 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   951 000006F6 895704                  	mov     [edi+TrackInfo.Position], edx
   952 000006F9 C3                      	retn
   953                                  PosJump:
   954 000006FA 8815[666C0000]          	mov     [OrderPos], dl
   955 00000700 C605[6A6C0000]40        	mov     byte [Row], 64
   956 00000707 C3                      	retn
   957                                  SetVolume:
   958 00000708 80FA40                  	cmp     dl, 64
   959 0000070B 7602                    	jbe     short OkVol
   960 0000070D B240                    	mov     dl, 64
   961                                  OkVol:
   962 0000070F 88570E                  	mov     [edi+TrackInfo.Volume], dl
   963 00000712 C3                      	retn
   964                                  Break:
   965 00000713 88D6                    	mov     dh, dl
   966 00000715 80E20F                  	and     dl, 0Fh
   967 00000718 C0EE04                  	shr     dh, 4
   968 0000071B 00F6                    	add     dh, dh
   969 0000071D 00F2                    	add     dl, dh
   970 0000071F C0E602                  	shl     dh, 2
   971 00000722 00F2                    	add     dl, dh
   972 00000724 8815[6B6C0000]          	mov     [BreakRow], dl
   973 0000072A C605[6A6C0000]40        	mov     byte [Row], 64
   974 00000731 C3                      	retn
   975                                  SetSpeed:
   976 00000732 84D2                    	test    dl,dl
   977 00000734 7432                    	je      Skip
   978 00000736 80FA1F                  	cmp     dl,31
   979 00000739 770D                    	ja      short SetBpm
   980                                  SetTempo:       
   981 0000073B 8815[676C0000]          	mov     [Tempo], dl
   982 00000741 8815[686C0000]          	mov     [TempoWait], dl
   983 00000747 C3                      	retn
   984                                  SetBpm:
   985 00000748 8815[696C0000]          	mov     [Bpm], dl
   986 0000074E B067                    	mov     al, 103
   987 00000750 F6E2                    	mul     dl
   988 00000752 88E3                    	mov     bl, ah
   989 00000754 30FF                    	xor     bh, bh
   990 00000756 66A1[BD0D0000]          	mov     ax, [MixSpeed]
   991 0000075C 6631D2                  	xor     dx, dx
   992 0000075F 66F7F3                  	div     bx
   993 00000762 66A3[6C6C0000]          	mov     [BpmSamples], ax
   994                                  Skip:           
   995 00000768 C3                      	retn
   996                                  InitArpeggio:
   997 00000769 88D6                    	mov     dh, dl
   998 0000076B 80E20F                  	and     dl, 0Fh
   999 0000076E C0EE04                  	shr     dh, 4
  1000 00000771 66B92400                	mov     cx, 36
  1001 00000775 31DB                    	xor     ebx, ebx
  1002 00000777 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1003                                  gt_ScanPeriod:
  1004 0000077B 66673B87[730D]          	cmp     ax, [PeriodTable+bx]
  1005 00000781 7306                    	jae     short SetArp
  1006 00000783 6683C302                	add     bx, 2
  1007 00000787 E2F2                    	loop    gt_ScanPeriod
  1008                                  SetArp:         
  1009 00000789 6601D2                  	add     dx, dx
  1010 0000078C 00DE                    	add     dh, bl
  1011 0000078E 00DA                    	add     dl, bl
  1012 00000790 66678B9F[730D]          	mov     bx, [PeriodTable+bx]
  1013 00000796 6601DB                  	add     bx, bx
  1014 00000799 66678B87[B414]          	mov     ax, [PitchTable+bx]
  1015 0000079F 6689471C                	mov     [edi+TrackInfo.Arp], ax
  1016 000007A3 88F3                    	mov     bl, dh
  1017 000007A5 30FF                    	xor     bh, bh
  1018 000007A7 66678B9F[730D]          	mov     bx, [PeriodTable+bx]
  1019 000007AD 6601DB                  	add     bx, bx
  1020 000007B0 66678B87[B414]          	mov     ax, [PitchTable+bx]
  1021 000007B6 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1022 000007BA 88D3                    	mov     bl, dl
  1023 000007BC 30FF                    	xor     bh, bh
  1024 000007BE 66678B9F[730D]          	mov     bx, [PeriodTable+bx]
  1025 000007C4 6601DB                  	add     bx, bx
  1026 000007C7 66678B87[B414]          	mov     ax, [PitchTable+bx]
  1027 000007CD 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1028 000007D1 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1029 000007D7 C3                      	retn
  1030                                  
  1031                                  ;--------------------------------------------------------------------------
  1032                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1033                                  ;--------------------------------------------------------------------------
  1034                                  
  1035                                  UpdateTracks:
  1036 000007D8 FE0D[686C0000]          	dec     byte [TempoWait]
  1037 000007DE 7415                    	jz      short GetTracks
  1038                                  
  1039 000007E0 B904000000              	mov	ecx, NumTracks
  1040 000007E5 BF[7C6C0000]            	mov	edi, Tracks
  1041                                  BeatTracks:
  1042 000007EA E87AFCFFFF              	call	BeatTrack	
  1043 000007EF 83C724                  	add	edi, TrackInfo.size
  1044 000007F2 E2F6                    	loop	BeatTracks
  1045 000007F4 C3                      	retn
  1046                                  GetTracks:
  1047 000007F5 A0[676C0000]            	mov     al, [Tempo]
  1048 000007FA A2[686C0000]            	mov     [TempoWait], al
  1049                                  
  1050 000007FF 8B35[786C0000]          	mov	esi, [Note]
  1051 00000805 803D[6A6C0000]40        	cmp     byte [Row], 64
  1052 0000080C 7263                    	jb      short NoPattWrap
  1053                                  
  1054 0000080E 8B35[3C130000]          	mov	esi, [ModInfo.Patterns]
  1055 00000814 8A1D[666C0000]          	mov     bl, [OrderPos]
  1056 0000081A 3A1D[BA120000]          	cmp     bl, [ModInfo.OrderLen]
  1057 00000820 7214                    	jb      short NoOrderWrap
  1058 00000822 8A1D[BB120000]          	mov     bl, [ModInfo.ReStart]
  1059 00000828 881D[666C0000]          	mov     [OrderPos], bl
  1060 0000082E 3A1D[BA120000]          	cmp     bl, [ModInfo.OrderLen]
  1061 00000834 735D                    	jae     short NoUpdate
  1062                                  NoOrderWrap:    
  1063                                  	;xor	bh, bh
  1064 00000836 81E3FF000000            	and	ebx, 0FFh
  1065 0000083C 8A9B[BC120000]          	mov     bl, [ModInfo.Order+ebx]
  1066 00000842 C1E30A                  	shl     ebx, 10 ; *1024
  1067 00000845 01DE                    	add     esi, ebx
  1068 00000847 8A1D[6B6C0000]          	mov     bl, [BreakRow]
  1069 0000084D 881D[6A6C0000]          	mov     [Row], bl
  1070                                  	;xor     bh, bh
  1071 00000853 81E3FF000000            	and	ebx, 0FFh
  1072 00000859 883D[6B6C0000]          	mov     [BreakRow], bh ; 0
  1073 0000085F 66C1E304                	shl     bx, 4
  1074 00000863 01DE                    	add     esi, ebx
  1075 00000865 8935[786C0000]          	mov     [Note], esi
  1076 0000086B FE05[666C0000]          	inc     byte [OrderPos]
  1077                                  NoPattWrap:     
  1078 00000871 FE05[6A6C0000]          	inc     byte [Row]
  1079                                  
  1080                                  	;cld
  1081 00000877 B904000000              	mov	ecx, NumTracks
  1082 0000087C BF[7C6C0000]            	mov	edi, Tracks
  1083                                  GetTracks_next:
  1084 00000881 51                      	push	ecx	
  1085 00000882 E857FDFFFF              	call	GetTrack
  1086 00000887 59                      	pop	ecx
  1087 00000888 83C724                  	add	edi, TrackInfo.size
  1088 0000088B E2F4                    	loop	GetTracks_next
  1089                                  
  1090 0000088D 8935[786C0000]          	mov     [Note], esi
  1091                                  NoUpdate:
  1092 00000893 C3                      	retn
  1093                                  
  1094                                  ;--------------------------------------------------------------------------
  1095                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1096                                  ;  In:
  1097                                  ;   ds:si -  Track Info Address.
  1098                                  ;   ds:di -  Buffer Address.
  1099                                  ;    cx   -  Buffer Size.
  1100                                  ;--------------------------------------------------------------------------
  1101                                  
  1102                                  ; esi = Track info address
  1103                                  ; edi = Buffer address
  1104                                  ; ecx = Buffer size
  1105                                  
  1106                                  MixTrack:
  1107 00000894 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1108 00000899 7748                    	ja      short MixLooped
  1109                                  MixNonLooped:   
  1110 0000089B 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1111 0000089D 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1112 000008A0 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1113 000008A4 52                      	push    edx
  1114 000008A5 56                      	push    esi
  1115 000008A6 01D3                    	add     ebx, edx
  1116 000008A8 01D5                    	add     ebp, edx
  1117 000008AA 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1118 000008AE 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1119 000008B1 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1120 000008B4 89DE                    	mov     esi, ebx
  1121 000008B6 88C7                    	mov     bh, al
  1122 000008B8 88D0                    	mov     al, dl
  1123 000008BA 88F2                    	mov     dl, dh
  1124                                  	;xor	dh, dh
  1125 000008BC 81E2FF000000            	and	edx, 0FFh
  1126                                  nlMixSamp:      
  1127 000008C2 39EE                    	cmp     esi, ebp
  1128 000008C4 7310                    	jae     short nlMixBye
  1129 000008C6 8A1E                    	mov     bl, [esi]
  1130 000008C8 678A9F[661B]            	mov     bl, [VolTable+bx]
  1131 000008CD 001F                    	add     [edi], bl
  1132 000008CF 47                      	inc     edi
  1133 000008D0 00C4                    	add     ah, al
  1134 000008D2 11D6                    	adc     esi, edx
  1135 000008D4 E2EC                    	loop    nlMixSamp
  1136                                  nlMixBye:       
  1137 000008D6 89F3                    	mov     ebx, esi
  1138 000008D8 5E                      	pop     esi
  1139 000008D9 5A                      	pop     edx
  1140 000008DA 29D3                    	sub     ebx, edx
  1141 000008DC 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1142 000008DF 88660F                  	mov     [esi+TrackInfo.Error], ah
  1143 000008E2 C3                      	retn
  1144                                  MixLooped:
  1145 000008E3 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1146 000008E5 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1147 000008E8 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1148 000008EC 892D[746C0000]          	mov     [BufRep], ebp
  1149                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1150 000008F2 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1151 000008F6 52                      	push    edx
  1152 000008F7 56                      	push    esi
  1153 000008F8 01D3                    	add     ebx, edx
  1154 000008FA 01D5                    	add     ebp, edx
  1155 000008FC 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1156 00000900 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1157 00000903 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1158                                  	;mov    si, bx
  1159 00000906 89DE                    	mov	esi, ebx ; 04/09/2017
  1160 00000908 88C7                    	mov     bh, al
  1161 0000090A 88D0                    	mov     al, dl
  1162 0000090C 88F2                    	mov     dl, dh
  1163                                  	;xor	dh, dh
  1164 0000090E 81E2FF000000            	and	edx, 0FFh
  1165                                  lpMixSamp:      
  1166 00000914 39EE                    	cmp     esi, ebp
  1167 00000916 7206                    	jb      short lpMixNow
  1168 00000918 2B35[746C0000]          	sub     esi, [BufRep]
  1169                                  lpMixNow:       
  1170 0000091E 8A1E                    	mov     bl, [esi]
  1171 00000920 678A9F[661B]            	mov     bl, [VolTable+bx]
  1172 00000925 001F                    	add     [edi], bl
  1173 00000927 47                      	inc     edi
  1174 00000928 00C4                    	add     ah, al
  1175 0000092A 11D6                    	adc	esi, edx
  1176 0000092C E2E6                    	loop    lpMixSamp
  1177                                  lpMixBye:       
  1178                                  ;	mov     ebx, esi
  1179                                  ;	pop     esi
  1180                                  ;	pop     edx
  1181                                  ;	sub     ebx, edx
  1182                                  ;	mov     [esi+TrackInfo.Position], ebx
  1183                                  ;	mov     [esi+TrackInfo.Error], ah
  1184                                  ;	retn
  1185 0000092E EBA6                    	jmp	short nlMixBye
  1186                                  
  1187                                  ;--------------------------------------------------------------------------
  1188                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1189                                  ;  In:
  1190                                  ;    Buffer  - Buffer Address.
  1191                                  ;    Count   - Buffer Size.
  1192                                  ;--------------------------------------------------------------------------
  1193                                  
  1194                                  GetSamples:
  1195                                  	; edi = buffer address
  1196                                  	; ebx = count
  1197                                  
  1198 00000930 60                      	pushad
  1199                                  
  1200                                  	;cld
  1201                                  NextChunk:      
  1202 00000931 66833D[726C0000]00      	cmp     word [BufLen], 0
  1203 00000939 7548                    	jne     short CopyChunk
  1204                                  
  1205 0000093B 53                      	push    ebx
  1206 0000093C 57                      	push    edi
  1207                                  MixChunk:       
  1208 0000093D BF[665C0000]            	mov	edi, MixBuffer
  1209 00000942 0FB70D[6C6C0000]        	movzx	ecx, word [BpmSamples]
  1210 00000949 893D[6E6C0000]          	mov     [BufPtr], edi
  1211 0000094F 66890D[726C0000]        	mov     [BufLen], cx
  1212                                  
  1213 00000956 B080                    	mov     al, 80h
  1214 00000958 F3AA                    	rep     stosb
  1215                                  
  1216 0000095A 66B90400                	mov	cx, NumTracks
  1217 0000095E BE[586C0000]            	mov	esi, Tracks - TrackInfo.size
  1218                                  GetSamples_next:
  1219 00000963 51                      	push	ecx
  1220 00000964 83C624                  	add	esi, TrackInfo.size
  1221 00000967 668B0D[726C0000]        	mov	cx, [BufLen]
  1222 0000096E 8B3D[6E6C0000]          	mov	edi, [BufPtr]
  1223 00000974 E81BFFFFFF              	call	MixTrack
  1224 00000979 59                      	pop	ecx
  1225 0000097A E2E7                    	loop	GetSamples_next	
  1226                                  
  1227 0000097C E857FEFFFF              	call    UpdateTracks
  1228                                  
  1229 00000981 5F                      	pop     edi
  1230 00000982 5B                      	pop     ebx
  1231                                  CopyChunk:      
  1232                                  	;mov	cx, [BufLen]
  1233 00000983 0FB70D[726C0000]        	movzx	ecx, word [BufLen]
  1234 0000098A 39D9                    	cmp	ecx, ebx
  1235                                  	;cmp	cx, bx
  1236 0000098C 7602                    	jbe     short MoveChunk
  1237                                  	;mov	cx, bx
  1238 0000098E 89D9                    	mov     ecx, ebx
  1239                                  MoveChunk:
  1240 00000990 8B35[6E6C0000]          	mov     esi, [BufPtr]
  1241 00000996 010D[6E6C0000]          	add     [BufPtr], ecx
  1242 0000099C 66290D[726C0000]        	sub     [BufLen], cx
  1243 000009A3 29CB                    	sub     ebx, ecx
  1244 000009A5 F3A4                    	rep     movsb
  1245 000009A7 85DB                    	test    ebx, ebx
  1246 000009A9 7586                    	jnz     short NextChunk
  1247                                  
  1248 000009AB 61                      	popad
  1249 000009AC C3                      	retn
  1250                                  
  1251                                  ;--------------------------------------------------------------------------
  1252                                  ; StartPlaying: Initializes the Sound System.
  1253                                  ;  In:
  1254                                  ;   Module Information Resources.
  1255                                  ;--------------------------------------------------------------------------
  1256                                  
  1257                                  StartPlaying:
  1258 000009AD 60                      	pushad
  1259                                  SetModParms:    
  1260 000009AE C605[666C0000]00        	mov     byte [OrderPos], 0
  1261 000009B5 C605[676C0000]06        	mov     byte [Tempo], DefTempo
  1262 000009BC C605[686C0000]06        	mov     byte [TempoWait], DefTempo
  1263 000009C3 C605[696C0000]7D        	mov     byte [Bpm], DefBpm
  1264 000009CA C605[6A6C0000]40        	mov     byte [Row], 64
  1265 000009D1 C605[6B6C0000]00        	mov     byte [BreakRow], 0
  1266 000009D8 66A1[BD0D0000]          	mov     ax, [MixSpeed]
  1267 000009DE 31D2                    	xor     edx, edx
  1268 000009E0 66BB3200                	mov     bx, 24*DefBpm/60
  1269 000009E4 66F7F3                  	div     bx
  1270 000009E7 66A3[6C6C0000]          	mov     [BpmSamples], ax
  1271                                  ClearTracks:    
  1272 000009ED BF[7C6C0000]            	mov     edi, Tracks
  1273 000009F2 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1274 000009F7 31C0                    	xor     eax, eax
  1275                                  	;cld
  1276 000009F9 F3AA                    	rep     stosb
  1277                                  
  1278 000009FB A3[6E6C0000]            	mov     [BufPtr], eax
  1279 00000A00 66A3[726C0000]          	mov     [BufLen], ax
  1280                                  MakePitch:
  1281 00000A06 66B80021                	mov     ax, MidCRate
  1282 00000A0A 66BBAC01                	mov     bx, 428
  1283 00000A0E 66F7E3                  	mul     bx
  1284 00000A11 66F735[BD0D0000]        	div     word [MixSpeed]
  1285 00000A18 30F6                    	xor     dh, dh
  1286 00000A1A 88E2                    	mov     dl, ah
  1287 00000A1C 88C4                    	mov     ah, al
  1288 00000A1E 30C0                    	xor     al, al
  1289 00000A20 66B95903                	mov     cx, 857
  1290 00000A24 31DB                    	xor     ebx, ebx
  1291 00000A26 BF[B4140000]            	mov     edi, PitchTable
  1292                                  PitchLoop:      
  1293 00000A2B 50                      	push    eax
  1294 00000A2C 52                      	push    edx
  1295 00000A2D 6639DA                  	cmp     dx, bx
  1296 00000A30 7303                    	jae     short NoDiv
  1297 00000A32 66F7F3                  	div     bx
  1298                                  NoDiv:          
  1299 00000A35 66AB                    	stosw
  1300 00000A37 5A                      	pop     edx
  1301 00000A38 58                      	pop     eax
  1302 00000A39 43                      	inc     ebx
  1303 00000A3A E2EF                    	loop    PitchLoop
  1304                                  MakeVolume:     
  1305 00000A3C 66B90041                	mov     cx, 16640
  1306 00000A40 89CB                    	mov     ebx, ecx
  1307                                  VolLoop:
  1308 00000A42 4B                      	dec     ebx
  1309 00000A43 88D8                    	mov     al, bl
  1310 00000A45 F6EF                    	imul    bh
  1311 00000A47 88A3[661B0000]          	mov     [VolTable+ebx], ah
  1312 00000A4D E2F3                    	loop    VolLoop
  1313                                  
  1314 00000A4F 61                      	popad
  1315 00000A50 C3                      	retn
  1316                                  
  1317                                  ;--------------------------------------------------------------------------
  1318                                  ; StopPlaying: ShutDown the Sound System.
  1319                                  ;--------------------------------------------------------------------------
  1320                                  
  1321                                  StopPlaying:
  1322                                  	; 19/06/2017
  1323                                  	; Stop Playing
  1324                                  	sys	_audio, 0700h
  1324                              <1> 
  1324                              <1> 
  1324                              <1> 
  1324                              <1> 
  1324                              <1>  %if %0 >= 2
  1324 00000A51 BB00070000          <1>  mov ebx, %2
  1324                              <1>  %if %0 >= 3
  1324                              <1>  mov ecx, %3
  1324                              <1>  %if %0 = 4
  1324                              <1>  mov edx, %4
  1324                              <1>  %endif
  1324                              <1>  %endif
  1324                              <1>  %endif
  1324 00000A56 B820000000          <1>  mov eax, %1
  1324                              <1> 
  1324 00000A5B CD40                <1>  int 40h
  1325                                  	; Cancel callback service (for user)
  1326                                  	sys	_audio, 0900h
  1326                              <1> 
  1326                              <1> 
  1326                              <1> 
  1326                              <1> 
  1326                              <1>  %if %0 >= 2
  1326 00000A5D BB00090000          <1>  mov ebx, %2
  1326                              <1>  %if %0 >= 3
  1326                              <1>  mov ecx, %3
  1326                              <1>  %if %0 = 4
  1326                              <1>  mov edx, %4
  1326                              <1>  %endif
  1326                              <1>  %endif
  1326                              <1>  %endif
  1326 00000A62 B820000000          <1>  mov eax, %1
  1326                              <1> 
  1326 00000A67 CD40                <1>  int 40h
  1327                                  	; Deallocate Audio Buffer (for user)
  1328                                  	sys	_audio, 0A00h
  1328                              <1> 
  1328                              <1> 
  1328                              <1> 
  1328                              <1> 
  1328                              <1>  %if %0 >= 2
  1328 00000A69 BB000A0000          <1>  mov ebx, %2
  1328                              <1>  %if %0 >= 3
  1328                              <1>  mov ecx, %3
  1328                              <1>  %if %0 = 4
  1328                              <1>  mov edx, %4
  1328                              <1>  %endif
  1328                              <1>  %endif
  1328                              <1>  %endif
  1328 00000A6E B820000000          <1>  mov eax, %1
  1328                              <1> 
  1328 00000A73 CD40                <1>  int 40h
  1329                                  	; Disable Audio Device
  1330                                  	sys	_audio, 0C00h
  1330                              <1> 
  1330                              <1> 
  1330                              <1> 
  1330                              <1> 
  1330                              <1>  %if %0 >= 2
  1330 00000A75 BB000C0000          <1>  mov ebx, %2
  1330                              <1>  %if %0 >= 3
  1330                              <1>  mov ecx, %3
  1330                              <1>  %if %0 = 4
  1330                              <1>  mov edx, %4
  1330                              <1>  %endif
  1330                              <1>  %endif
  1330                              <1>  %endif
  1330 00000A7A B820000000          <1>  mov eax, %1
  1330                              <1> 
  1330 00000A7F CD40                <1>  int 40h
  1331                                  
  1332 00000A81 C3                      	retn
  1333                                  
  1334                                  ; 24/06/2017
  1335                                  ;--------------------------------------------------------------------------
  1336                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1337                                  ;--------------------------------------------------------------------------
  1338                                  ; This Conversion is needed for AC'97 hardware 
  1339                                  ; which ony supports 16 bit stereo samples !
  1340                                  
  1341                                  ; source = temp_buffer (8192 bytes)
  1342                                  ; destination = Audio_Buffer (32768 bytes)
  1343                                  
  1344                                  ConvertSamples:
  1345                                  	; 24/06/2017
  1346 00000A82 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1347 00000A87 BE[00800100]            	mov	esi, temp_buffer
  1348 00000A8C BF[00000100]            	mov	edi, Audio_Buffer
  1349                                  c_smpl_1:
  1350 00000A91 AC                      	lodsb	; get 8 bit mono sample
  1351 00000A92 20C0                    	and	al, al
  1352 00000A94 7506                    	jnz	short c_smpl_2
  1353 00000A96 66B80080                	mov	ax, 8000h
  1354 00000A9A EB06                    	jmp	short c_smpl_3
  1355                                  c_smpl_2:
  1356 00000A9C 2C80                    	sub	al, 80h	
  1357 00000A9E 88C4                    	mov	ah, al
  1358 00000AA0 28C0                    	sub	al, al
  1359                                  c_smpl_3:	
  1360 00000AA2 6689C2                  	mov	dx, ax
  1361 00000AA5 C1E010                  	shl	eax, 16
  1362 00000AA8 6689D0                  	mov	ax, dx
  1363 00000AAB AB                      	stosd	; save 16 bit stereo sample
  1364 00000AAC E2E3                    	loop 	c_smpl_1
  1365                                  	
  1366 00000AAE C3                      	retn
  1367                                  
  1368                                  ;=============================================================================
  1369                                  ; 
  1370                                  ;=============================================================================
  1371                                  
  1372                                  ;dword2str:
  1373                                  ;	; 13/11/2016 - Erdogan Tan 
  1374                                  ;	; eax = dword value
  1375                                  ;	;
  1376                                  ;	call	dwordtohex
  1377                                  ;	mov	[dword_str], edx
  1378                                  ;	mov	[dword_str+4], eax
  1379                                  ;	mov	si, dword_str
  1380                                  ;	retn
  1381                                  
  1382                                  	; 05/03/2017 (TRDOS 386)
  1383                                  	; trdos386.s (unix386.s) - 10/05/2015
  1384                                  	; Convert binary number to hexadecimal string
  1385                                  
  1386                                  ;bytetohex:
  1387                                  ;	; INPUT ->
  1388                                  ;	; 	AL = byte (binary number)
  1389                                  ;	; OUTPUT ->
  1390                                  ;	;	AX = hexadecimal string
  1391                                  ;	;
  1392                                  ;	push	ebx
  1393                                  ;	movzx	ebx, al
  1394                                  ;	shr	bl, 4
  1395                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1396                                  ;	xchg	bl, al
  1397                                  ;	and	bl, 0Fh
  1398                                  ;	mov	ah, [ebx+hex_chars] 
  1399                                  ;	pop	ebx	
  1400                                  ;	retn
  1401                                  
  1402                                  ;wordtohex:
  1403                                  ;	; INPUT ->
  1404                                  ;	; 	AX = word (binary number)
  1405                                  ;	; OUTPUT ->
  1406                                  ;	;	EAX = hexadecimal string
  1407                                  ;	;
  1408                                  ;	push	ebx
  1409                                  ;	xor	ebx, ebx
  1410                                  ;	xchg	ah, al
  1411                                  ;	push	eax
  1412                                  ;	mov	bl, ah
  1413                                  ;	shr	bl, 4
  1414                                  ;	mov	al, [ebx+hex_chars] 	 	
  1415                                  ;	mov	bl, ah
  1416                                  ;	and	bl, 0Fh
  1417                                  ;	mov	ah, [ebx+hex_chars]
  1418                                  ;	shl	eax, 16
  1419                                  ;	pop	eax
  1420                                  ;	pop	ebx
  1421                                  ;	jmp	short bytetohex
  1422                                  
  1423                                  ;dwordtohex:
  1424                                  ;	; INPUT ->
  1425                                  ;	; 	EAX = dword (binary number)
  1426                                  ;	; OUTPUT ->
  1427                                  ;	;	EDX:EAX = hexadecimal string
  1428                                  ;	;
  1429                                  ;	push	eax
  1430                                  ;	shr	eax, 16
  1431                                  ;	call	wordtohex
  1432                                  ;	mov	edx, eax
  1433                                  ;	pop	eax
  1434                                  ;	call	wordtohex
  1435                                  ;	retn
  1436                                  
  1437                                  	; 24/06/2017
  1438                                  	; 19/06/2017
  1439                                  	; 05/03/2017 (TRDOS 386)
  1440                                  	; 13/11/2016 - Erdogan Tan
  1441                                  write_audio_dev_info:
  1442                                  	; BUS/DEV/FN
  1443                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1444                                  	; DEV/VENDOR
  1445                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1446                                  
  1447 00000AAF 8B35[680E0000]          	mov	esi, [dev_vendor]
  1448 00000AB5 6689F0                  	mov	ax, si
  1449 00000AB8 0FB6D8                  	movzx	ebx, al
  1450 00000ABB 88DA                    	mov	dl, bl
  1451 00000ABD 80E30F                  	and	bl, 0Fh
  1452 00000AC0 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1453 00000AC6 A2[040E0000]            	mov	[msgVendorId+3], al
  1454 00000ACB 88D3                    	mov	bl, dl
  1455 00000ACD C0EB04                  	shr	bl, 4
  1456 00000AD0 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1457 00000AD6 A2[030E0000]            	mov	[msgVendorId+2], al
  1458 00000ADB 88E3                    	mov	bl, ah
  1459 00000ADD 88DA                    	mov	dl, bl
  1460 00000ADF 80E30F                  	and	bl, 0Fh
  1461 00000AE2 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1462 00000AE8 A2[020E0000]            	mov	[msgVendorId+1], al
  1463 00000AED 88D3                    	mov	bl, dl
  1464 00000AEF C0EB04                  	shr	bl, 4
  1465 00000AF2 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1466 00000AF8 A2[010E0000]            	mov	[msgVendorId], al
  1467 00000AFD C1EE10                  	shr	esi, 16
  1468 00000B00 6689F0                  	mov	ax, si
  1469 00000B03 88C3                    	mov	bl, al
  1470 00000B05 88DA                    	mov	dl, bl
  1471 00000B07 80E30F                  	and	bl, 0Fh
  1472 00000B0A 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1473 00000B10 A2[150E0000]            	mov	[msgDevId+3], al
  1474 00000B15 88D3                    	mov	bl, dl
  1475 00000B17 C0EB04                  	shr	bl, 4
  1476 00000B1A 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1477 00000B20 A2[140E0000]            	mov	[msgDevId+2], al
  1478 00000B25 88E3                    	mov	bl, ah
  1479 00000B27 88DA                    	mov	dl, bl
  1480 00000B29 80E30F                  	and	bl, 0Fh
  1481 00000B2C 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1482 00000B32 A2[130E0000]            	mov	[msgDevId+1], al
  1483 00000B37 88D3                    	mov	bl, dl
  1484 00000B39 C0EB04                  	shr	bl, 4
  1485 00000B3C 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1486 00000B42 A2[120E0000]            	mov	[msgDevId], al
  1487                                  
  1488 00000B47 8B35[6C0E0000]          	mov	esi, [bus_dev_fn]
  1489 00000B4D C1EE08                  	shr	esi, 8
  1490 00000B50 6689F0                  	mov	ax, si
  1491 00000B53 88C3                    	mov	bl, al
  1492 00000B55 88DA                    	mov	dl, bl
  1493 00000B57 80E307                  	and	bl, 7 ; bit 0,1,2
  1494 00000B5A 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1495 00000B60 A2[390E0000]            	mov	[msgFncNo+1], al
  1496 00000B65 88D3                    	mov	bl, dl
  1497 00000B67 C0EB03                  	shr	bl, 3
  1498 00000B6A 88DA                    	mov	dl, bl
  1499 00000B6C 80E30F                  	and	bl, 0Fh
  1500 00000B6F 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1501 00000B75 A2[2B0E0000]            	mov	[msgDevNo+1], al
  1502 00000B7A 88D3                    	mov	bl, dl
  1503 00000B7C C0EB04                  	shr	bl, 4
  1504 00000B7F 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1505 00000B85 A2[2A0E0000]            	mov	[msgDevNo], al
  1506 00000B8A 88E3                    	mov	bl, ah
  1507 00000B8C 88DA                    	mov	dl, bl
  1508 00000B8E 80E30F                  	and	bl, 0Fh
  1509 00000B91 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1510 00000B97 A2[1F0E0000]            	mov	[msgBusNo+1], al
  1511 00000B9C 88D3                    	mov	bl, dl
  1512 00000B9E C0EB04                  	shr	bl, 4
  1513 00000BA1 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1514 00000BA7 A2[1E0E0000]            	mov	[msgBusNo], al
  1515                                  
  1516                                  	; 24/06/2017
  1517 00000BAC 66A1[740E0000]          	mov	ax, [ac97_NamBar]
  1518 00000BB2 88C3                    	mov	bl, al
  1519 00000BB4 88DA                    	mov	dl, bl
  1520 00000BB6 80E30F                  	and	bl, 0Fh
  1521 00000BB9 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1522 00000BBF A2[480E0000]            	mov	[msgNamBar+3], al
  1523 00000BC4 88D3                    	mov	bl, dl
  1524 00000BC6 C0EB04                  	shr	bl, 4
  1525 00000BC9 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1526 00000BCF A2[470E0000]            	mov	[msgNamBar+2], al
  1527 00000BD4 88E3                    	mov	bl, ah
  1528 00000BD6 88DA                    	mov	dl, bl
  1529 00000BD8 80E30F                  	and	bl, 0Fh
  1530 00000BDB 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1531 00000BE1 A2[460E0000]            	mov	[msgNamBar+1], al
  1532 00000BE6 88D3                    	mov	bl, dl
  1533 00000BE8 C0EB04                  	shr	bl, 4
  1534 00000BEB 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1535 00000BF1 A2[450E0000]            	mov	[msgNamBar], al
  1536                                  
  1537 00000BF6 66A1[760E0000]          	mov	ax, [ac97_NabmBar]
  1538 00000BFC 88C3                    	mov	bl, al
  1539 00000BFE 88DA                    	mov	dl, bl
  1540 00000C00 80E30F                  	and	bl, 0Fh
  1541 00000C03 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1542 00000C09 A2[580E0000]            	mov	[msgNabmBar+3], al
  1543 00000C0E 88D3                    	mov	bl, dl
  1544 00000C10 C0EB04                  	shr	bl, 4
  1545 00000C13 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1546 00000C19 A2[570E0000]            	mov	[msgNabmBar+2], al
  1547 00000C1E 88E3                    	mov	bl, ah
  1548 00000C20 88DA                    	mov	dl, bl
  1549 00000C22 80E30F                  	and	bl, 0Fh
  1550 00000C25 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1551 00000C2B A2[560E0000]            	mov	[msgNabmBar+1], al
  1552 00000C30 88D3                    	mov	bl, dl
  1553 00000C32 C0EB04                  	shr	bl, 4
  1554 00000C35 8A83[BF0D0000]          	mov	al, [ebx+hex_chars]
  1555 00000C3B A2[550E0000]            	mov	[msgNabmBar], al
  1556                                  
  1557                                  	; 24/11/2016
  1558 00000C40 30E4                    	xor	ah, ah
  1559 00000C42 A0[780E0000]            	mov	al, [ac97_int_ln_reg]
  1560 00000C47 B10A                    	mov	cl, 10
  1561 00000C49 F6F1                    	div	cl
  1562 00000C4B 660105[610E0000]        	add	[msgIRQ], ax
  1563 00000C52 20C0                    	and	al, al
  1564 00000C54 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1565 00000C56 A0[620E0000]            	mov	al, [msgIRQ+1]
  1566 00000C5B B420                    	mov	ah, ' '
  1567 00000C5D 66A3[610E0000]          	mov	[msgIRQ], ax
  1568                                  _w_ac97imsg_:
  1569                                  	; EBX = Message address
  1570                                  	; ECX = Max. message length (or stop on ZERO character)
  1571                                  	;	(1 to 255)
  1572                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1573                                       	sys 	_msg, msgAC97Info, 255, 07h
  1573                              <1> 
  1573                              <1> 
  1573                              <1> 
  1573                              <1> 
  1573                              <1>  %if %0 >= 2
  1573 00000C63 BB[D00D0000]        <1>  mov ebx, %2
  1573                              <1>  %if %0 >= 3
  1573 00000C68 B9FF000000          <1>  mov ecx, %3
  1573                              <1>  %if %0 = 4
  1573 00000C6D BA07000000          <1>  mov edx, %4
  1573                              <1>  %endif
  1573                              <1>  %endif
  1573                              <1>  %endif
  1573 00000C72 B823000000          <1>  mov eax, %1
  1573                              <1> 
  1573 00000C77 CD40                <1>  int 40h
  1574 00000C79 C3                              retn
  1575                                  
  1576                                  ;=============================================================================
  1577                                  ;               preinitialized data
  1578                                  ;=============================================================================
  1579                                  
  1580                                  ;=============================================================================
  1581                                  ;               PLAY.ASM - DATA
  1582                                  ;=============================================================================
  1583                                  
  1584                                  msg_2017:
  1585 00000C7A 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1585 00000C83 506C6179657220666F-
  1585 00000C8C 72205452444F532033-
  1585 00000C95 383620627920457264-
  1585 00000C9E 6F67616E2054616E2E-
  1585 00000CA7 20                 
  1586 00000CA8 4F63746F6265722032-     	db	'October 2017.',10,13
  1586 00000CB1 3031372E0A0D       
  1587 00000CB7 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1587 00000CC0 64706C61792066696C-
  1587 00000CC9 656E616D652E6D6F64-
  1587 00000CD2 0A0D00             
  1588 00000CD5 31332F31302F323031-     	db	'13/10/2017',10,13,0
  1588 00000CDE 370A0D00           
  1589                                  
  1590 00000CE2 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1590 00000CEB 506C61796572207630-
  1590 00000CF4 2E3162206279204361-
  1590 00000CFD 726C6F732048617361-
  1590 00000D06 6E2E204A756C792031-
  1590 00000D0F 3939332E           
  1591 00000D13 0A0D00                  		db	10,13,0
  1592 00000D16 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1592 00000D1F 64696E67204D6F6475-
  1592 00000D28 6C652066696C652E0A-
  1592 00000D31 0D00               
  1593                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1594                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1595                                  ;PortText:	db	'x0h, IRQ '
  1596                                  ;IrqText:	db	'x.',10,13,0
  1597                                  
  1598                                  trdos386_err_msg:
  1599 00000D33 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1599 00000D3C 2053797374656D2063-
  1599 00000D45 616C6C206572726F72-
  1599 00000D4E 20210A0D00         
  1600                                  
  1601                                  ;=============================================================================
  1602                                  ;               MODPLAY.ASM - DATA
  1603                                  ;=============================================================================
  1604                                  
  1605                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1606                                  
  1607 00000D53 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1607 00000D5C C5D4E1             
  1608 00000D5F ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1608 00000D68 E1                 
  1609 00000D69 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1609 00000D72 19                 
  1610                                  
  1611 00000D73 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1611 00000D7C 0280025C023A021A02-
  1611 00000D85 FC01E001C501       
  1612 00000D8B AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1612 00000D94 0140012E011D010D01-
  1612 00000D9D FE00F000E200       
  1613 00000DA3 D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1613 00000DAC 00A00097008F008700-
  1613 00000DB5 7F0078007100       
  1614                                  
  1615                                  ;=============================================================================
  1616                                  ;               PLAYER.ASM - DATA
  1617                                  ;=============================================================================
  1618                                  
  1619 00000DBB 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1620 00000DBC 08                      bps:		db 8 ; bits per sample (8 or 16)
  1621                                  Sample_Rate:
  1622 00000DBD 2256                    MixSpeed:	dw 22050 ; Hz
  1623                                  
  1624                                  ; 13/11/2016
  1625 00000DBF 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1625 00000DC8 3941424344454600   
  1626                                  ;
  1627                                  msgAC97Info:	
  1628 00000DD0 0D0A                    		db 0Dh, 0Ah
  1629 00000DD2 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1629 00000DDB 6F20436F6E74726F6C-
  1629 00000DE4 6C6572202620436F64-
  1629 00000DED 656320496E666F0D0A 
  1630 00000DF6 56656E646F72204944-     		db "Vendor ID: "
  1630 00000DFF 3A20               
  1631 00000E01 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1631 00000E0A 6963652049443A20   
  1632 00000E12 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1633 00000E19 4275733A20              		db "Bus: "
  1634 00000E1E 303068204465766963-     msgBusNo:	db "00h Device: "
  1634 00000E27 653A20             
  1635 00000E2A 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1635 00000E33 696F6E3A20         
  1636 00000E38 303068                  msgFncNo	db "00h"
  1637 00000E3B 0D0A                    		db 0Dh, 0Ah
  1638 00000E3D 4E414D4241523A20        		db "NAMBAR: "
  1639 00000E45 30303030682020          msgNamBar	db "0000h  "
  1640 00000E4C 4E41424D4241523A20      		db "NABMBAR: "
  1641 00000E55 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1641 00000E5E 513A20             
  1642 00000E61 3030                    msgIRQ:		dw 3030h
  1643 00000E63 0D0A00                  		db 0Dh, 0Ah, 0
  1644                                  
  1645                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1646                                  ;codec_id:	   dd 0
  1647                                  ;codec_chip_id:	   dd 0
  1648                                  ;codec_vendor_ids: dw 0
  1649                                  ;codec_chip_ids:   dw 0
  1650                                  
  1651                                  ;dword_str:	dd 30303030h, 30303030h
  1652                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1653                                  
  1654                                  ;=============================================================================
  1655                                  ;        	uninitialized data
  1656                                  ;=============================================================================
  1657                                  
  1658                                  bss_start:
  1659                                  
  1660                                  ABSOLUTE bss_start
  1661                                  
  1662 00000E66 <res 00000002>          alignb 4
  1663                                  
  1664 00000E68 <res 00000004>          dev_vendor:	resd 1
  1665 00000E6C <res 00000004>          bus_dev_fn:	resd 1
  1666 00000E70 <res 00000004>          stats_cmd:	resd 1
  1667 00000E74 <res 00000002>          ac97_NamBar:	resw 1
  1668 00000E76 <res 00000002>          ac97_NabmBar:	resw 1
  1669 00000E78 <res 00000001>          ac97_int_ln_reg: resb 1
  1670 00000E79 <res 00000001>          srb:		resb 1
  1671                                  
  1672                                  ; MODLOAD.ASM
  1673 00000E7A <res 00000004>          FileHandle:	resd 1
  1674 00000E7E <res 0000043C>          Header:		resb ModHeader.size
  1675                                  
  1676                                  ; MODPLAY.ASM
  1677                                  ;MixSpeed:	    resw 1
  1678                                  
  1679                                  ModInfo:
  1680 000012BA <res 00000001>          ModInfo.OrderLen:   resb 1
  1681 000012BB <res 00000001>          ModInfo.ReStart:    resb 1
  1682 000012BC <res 00000080>          ModInfo.Order:	    resb 128
  1683 0000133C <res 00000004>          ModInfo.Patterns:   resd 1
  1684                                  
  1685 00001340 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1686 0000137E <res 0000003E>          ModInfo.SampSeg:    resw 31
  1687 000013BC <res 0000003E>          ModInfo.SampLen:    resw 31
  1688 000013FA <res 0000003E>          ModInfo.SampRep:    resw 31
  1689 00001438 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1690 00001476 <res 0000003E>          ModInfo.SampVol:    resw 31
  1691                                  
  1692                                  ; MODPLAY.ASM
  1693 000014B4 <res 000006B2>          PitchTable:	resw 857
  1694 00001B66 <res 00004100>          VolTable:	resb 16640
  1695 00005C66 <res 00001000>          MixBuffer       resb MixBufSize
  1696                                  
  1697                                  ; MODPLAY.ASM
  1698 00006C66 <res 00000001>          OrderPos:	resb 1
  1699 00006C67 <res 00000001>          Tempo:		resb 1
  1700 00006C68 <res 00000001>          TempoWait:	resb 1
  1701 00006C69 <res 00000001>          Bpm:		resb 1
  1702 00006C6A <res 00000001>          Row:		resb 1
  1703 00006C6B <res 00000001>          BreakRow:	resb 1
  1704 00006C6C <res 00000002>          BpmSamples:	resw 1
  1705 00006C6E <res 00000004>          BufPtr:		resd 1
  1706 00006C72 <res 00000002>          BufLen:		resw 1
  1707 00006C74 <res 00000004>          BufRep:		resd 1
  1708 00006C78 <res 00000004>          Note:		resd 1
  1709 00006C7C <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1710                                  
  1711 00006D0C <res 00000004>          alignb 16
  1712                                  
  1713                                  ; PLAY.ASM
  1714 00006D10 <res 00000280>          Scope:		resw 320
  1715 00006F90 <res 00000200>          RowOfs:		resw 256
  1716                                  
  1717                                  mod_file_name:
  1718 00007190 <res 00000050>          		resb 80
  1719                                  
  1720 000071E0 <res 00000E20>          alignb 4096
  1721                                  
  1722                                  g_buff:
  1723 00008000 <res 00000500>          		resb 320*4 ; 24/06/2017
  1724                                  
  1725 00008500 <res 00007B00>          alignb 65536
  1726                                  
  1727                                  Audio_Buffer:
  1728 00010000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1729                                  temp_buffer:
  1730 00018000 <res 00002000>          		resb BUFFERSIZE / 4 ; 8192
  1731                                  
  1732 0001A000 <res 00006000>          alignb 65536
  1733                                  
  1734                                  file_buffer:
  1735 00020000 <res 00060000>          		resb 65536*6
  1736                                  EOF:
