     1                                  ; ****************************************************************************
     2                                  ; modplay3.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY3.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 'tinyply3.s' ('TINYPLY3.PRG') 
    14                                  ; by Erdogan Tan (07/10/2017)
    15                                  ;
    16                                  ; Modified from 'playwav3.s' (13/06/2017)
    17                                  ;
    18                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    19                                  ;			                     (23/06/2017)
    20                                  ;
    21                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    22                                  ;				      (04/03/2017) 
    23                                  ; Assembler: NASM 2.11
    24                                  ; ----------------------------------------------------------------------------
    25                                  ;	   nasm  modplay.s -l modplay.txt -o MODPLAY.PRG	
    26                                  ; ****************************************************************************
    27                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    28                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    29                                  
    30                                  ; 01/03/2017
    31                                  ; 16/10/2016
    32                                  ; 29/04/2016
    33                                  ; TRDOS 386 system calls (temporary list!)
    34                                  _ver 	equ 0
    35                                  _exit 	equ 1
    36                                  _fork 	equ 2
    37                                  _read 	equ 3
    38                                  _write	equ 4
    39                                  _open	equ 5
    40                                  _close 	equ 6
    41                                  _wait 	equ 7
    42                                  _creat 	equ 8
    43                                  _link 	equ 9
    44                                  _unlink	equ 10
    45                                  _exec	equ 11
    46                                  _chdir	equ 12
    47                                  _time 	equ 13
    48                                  _mkdir 	equ 14
    49                                  _chmod	equ 15
    50                                  _chown	equ 16
    51                                  _break	equ 17
    52                                  _stat	equ 18
    53                                  _seek	equ 19
    54                                  _tell 	equ 20
    55                                  _mount	equ 21
    56                                  _umount	equ 22
    57                                  _setuid	equ 23
    58                                  _getuid	equ 24
    59                                  _stime	equ 25
    60                                  _quit	equ 26	
    61                                  _intr	equ 27
    62                                  _fstat	equ 28
    63                                  _emt 	equ 29
    64                                  _mdate 	equ 30
    65                                  _video 	equ 31
    66                                  _audio	equ 32
    67                                  _timer	equ 33
    68                                  _sleep	equ 34
    69                                  _msg    equ 35
    70                                  _geterr	equ 36
    71                                  _fpsave	equ 37
    72                                  _pri	equ 38
    73                                  _rele	equ 39
    74                                  _fff	equ 40
    75                                  _fnf	equ 41
    76                                  _alloc	equ 42
    77                                  _dalloc equ 43
    78                                  _calbac equ 44		
    79                                  
    80                                  %macro sys 1-4
    81                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    82                                      ; 03/09/2015	
    83                                      ; 13/04/2015
    84                                      ; Retro UNIX 386 v1 system call.	
    85                                      %if %0 >= 2   
    86                                          mov ebx, %2
    87                                          %if %0 >= 3    
    88                                              mov ecx, %3
    89                                              %if %0 = 4
    90                                                 mov edx, %4   
    91                                              %endif
    92                                          %endif
    93                                      %endif
    94                                      mov eax, %1
    95                                      ;int 30h
    96                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    97                                  %endmacro
    98                                  
    99                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   100                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   101                                  
   102                                  ; 19/06/2017
   103                                  BUFFERSIZE equ 32768
   104                                  
   105                                  ; ----------------------------------------------------------------------------
   106                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   107                                  ;	July 14th, 1993.
   108                                  
   109                                  ;=============================================================================
   110                                  ;  
   111                                  ;=============================================================================
   112                                  
   113                                  [BITS 32]
   114                                  [org 0]
   115                                  
   116                                  Start:
   117                                  	; clear bss
   118 00000000 B9[00000900]            	mov	ecx, EOF
   119 00000005 BF[AC0F0000]            	mov	edi, bss_start
   120 0000000A 29F9                    	sub	ecx, edi
   121 0000000C D1E9                    	shr	ecx, 1
   122 0000000E 31C0                    	xor	eax, eax
   123 00000010 F366AB                  	rep	stosw
   124                                  
   125                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   126 00000013 E816020000              	call    DetectICH
   127 00000018 731B                    	jnc     short GetFileName
   128                                  
   129                                  _dev_not_ready:
   130                                  ; couldn't find the audio device!
   131                                  	sys	_msg, noDevMsg, 255, 0Fh
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1>  %if %0 >= 2
   131 0000001A BB[3B020000]        <1>  mov ebx, %2
   131                              <1>  %if %0 >= 3
   131 0000001F B9FF000000          <1>  mov ecx, %3
   131                              <1>  %if %0 = 4
   131 00000024 BA0F000000          <1>  mov edx, %4
   131                              <1>  %endif
   131                              <1>  %endif
   131                              <1>  %endif
   131 00000029 B823000000          <1>  mov eax, %1
   131                              <1> 
   131 0000002E CD40                <1>  int 40h
   132 00000030 E9D8010000                      jmp     Exit
   133                                  
   134                                  GetFileName:  
   135 00000035 89E6                    	mov	esi, esp
   136 00000037 AD                      	lodsd
   137 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   138                                  		; (program file name & mod file name)
   139 0000003B 0F82D5010000            	jb	pmsg_2017 ; nothing to do
   140                                  
   141 00000041 AD                      	lodsd ; program file name address 
   142 00000042 AD                      	lodsd ; mod file name address (file to be read)
   143 00000043 89C6                    	mov	esi, eax
   144 00000045 BF[80870000]            	mov	edi, mod_file_name
   145                                  ScanName:       
   146 0000004A AC                      	lodsb
   147 0000004B 84C0                    	test	al, al
   148 0000004D 0F84C3010000            	je	pmsg_2017
   149 00000053 3C20                    	cmp	al, 20h
   150 00000055 74F3                    	je	short ScanName	; scan start of name.
   151 00000057 AA                      	stosb
   152 00000058 B4FF                    	mov	ah, 0FFh
   153                                  a_0:	
   154 0000005A FEC4                    	inc	ah
   155                                  a_1:
   156 0000005C AC                      	lodsb
   157 0000005D AA                      	stosb
   158 0000005E 3C2E                    	cmp	al, '.'
   159 00000060 74F8                    	je	short a_0	
   160 00000062 20C0                    	and	al, al
   161 00000064 75F6                    	jnz	short a_1
   162                                  
   163 00000066 08E4                    	or	ah, ah		; if period NOT found,
   164 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   165                                  SetExt:
   166 0000006A 4F                      	dec	edi
   167 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   168 00000071 C6470400                	mov	byte [edi+4], 0
   169                                  PrintMesg:      
   170                                  	; Prints the Credits Text.
   171                                  	sys	_msg, Credits, 255, 0Fh
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 00000075 BB[8D0E0000]        <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 0000007A B9FF000000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 0000007F BA0F000000          <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 00000084 B823000000          <1>  mov eax, %1
   171                              <1> 
   171 00000089 CD40                <1>  int 40h
   172                                  _1:
   173                                  	; 19/06/2017
   174                                  	; Allocate Audio Buffer (for user)
   175                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1>  %if %0 >= 2
   175 0000008B BB00020000          <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   175 00000090 B900800000          <1>  mov ecx, %3
   175                              <1>  %if %0 = 4
   175 00000095 BA[00900000]        <1>  mov edx, %4
   175                              <1>  %endif
   175                              <1>  %endif
   175                              <1>  %endif
   175 0000009A B820000000          <1>  mov eax, %1
   175                              <1> 
   175 0000009F CD40                <1>  int 40h
   176 000000A1 0F8238010000            	jc	error_exit
   177                                  _2:
   178                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   179                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   180                                  	;jc	error_exit
   181                                  	
   182                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   183                                  	sys	_audio, 0300h, 1, srb 
   183                              <1> 
   183                              <1> 
   183                              <1> 
   183                              <1> 
   183                              <1>  %if %0 >= 2
   183 000000A7 BB00030000          <1>  mov ebx, %2
   183                              <1>  %if %0 >= 3
   183 000000AC B901000000          <1>  mov ecx, %3
   183                              <1>  %if %0 = 4
   183 000000B1 BA[BD0F0000]        <1>  mov edx, %4
   183                              <1>  %endif
   183                              <1>  %endif
   183                              <1>  %endif
   183 000000B6 B820000000          <1>  mov eax, %1
   183                              <1> 
   183 000000BB CD40                <1>  int 40h
   184 000000BD 0F821C010000            	jc	error_exit
   185                                  
   186                                  LoadMod:  
   187 000000C3 BF[80870000]            	mov	edi, mod_file_name
   188 000000C8 E839020000              	call    LoadModule	; Load the MODule...
   189                                  	; 08/10/2017
   190 000000CD 731B                    	jnc	short _3	; any error loading?
   191                                  
   192                                  	; yes, print error and Exit.
   193                                  
   194                                  	sys	_msg, ErrorMesg, 255, 0Fh
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1>  %if %0 >= 2
   194 000000CF BB[C10E0000]        <1>  mov ebx, %2
   194                              <1>  %if %0 >= 3
   194 000000D4 B9FF000000          <1>  mov ecx, %3
   194                              <1>  %if %0 = 4
   194 000000D9 BA0F000000          <1>  mov edx, %4
   194                              <1>  %endif
   194                              <1>  %endif
   194                              <1>  %endif
   194 000000DE B823000000          <1>  mov eax, %1
   194                              <1> 
   194 000000E3 CD40                <1>  int 40h
   195                                  
   196 000000E5 E923010000              	jmp     Exit
   197                                  
   198                                  _3:
   199                                  	; 10/06/2017
   200                                  	sys	_audio, 0E00h ; get audio controller info
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1> 
   200                              <1>  %if %0 >= 2
   200 000000EA BB000E0000          <1>  mov ebx, %2
   200                              <1>  %if %0 >= 3
   200                              <1>  mov ecx, %3
   200                              <1>  %if %0 = 4
   200                              <1>  mov edx, %4
   200                              <1>  %endif
   200                              <1>  %endif
   200                              <1>  %endif
   200 000000EF B820000000          <1>  mov eax, %1
   200                              <1> 
   200 000000F4 CD40                <1>  int 40h
   201 000000F6 0F82E3000000            	jc	error_exit
   202                                  
   203                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   204                                  	;jne	_dev_not_ready	
   205                                  
   206                                  	; EAX = IRQ Number in AL
   207                                  	;	Audio Device Number in AH 
   208                                  	; EBX = DEV/VENDOR ID
   209                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   210                                  	; ECX = BUS/DEV/FN 
   211                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   212                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   213                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   214                                  	;      (Low word, DX = NAMBAR address)
   215                                  
   216 000000FC A2[BC0F0000]            	mov	[ac97_int_ln_reg], al
   217 00000101 891D[AC0F0000]          	mov	[dev_vendor], ebx
   218 00000107 890D[B00F0000]          	mov	[bus_dev_fn], ecx
   219 0000010D 668915[B80F0000]        	mov	[ac97_NamBar], dx
   220                                  	;mov	[ac97_NamBar], dx
   221                                  	;shr	dx, 16
   222                                  	;mov	[ac97_NabmBar], dx
   223 00000114 8915[B80F0000]          	mov	[ac97_NamBar], edx	
   224                                    
   225 0000011A E8F1090000              	call	write_audio_dev_info 
   226                                  
   227                                  PlayNow: 
   228 0000011F E8DE080000              	call    StartPlaying
   229                                  
   230                                          ; load 32768 bytes into audio buffer
   231                                  	;mov	edi, Audio_Buffer
   232                                  	;mov	ebx, BUFFERSIZE
   233                                  	; 24/06/2017
   234                                          ; load 8192 bytes into audio buffer
   235 00000124 BF[00100100]            	mov	edi, temp_buffer
   236 00000129 BB00200000              	mov	ebx, BUFFERSIZE / 4
   237 0000012E E850080000              	call	GetSamples
   238 00000133 0F82A6000000            	jc	error_exit
   239                                  
   240                                  	; 24/06/2017
   241                                  	; 8 bit to 16 bit (*2)
   242                                  	; mono to stereo (*2)
   243                                  	; 4* (BUFFERSIZE/4) 
   244                                  	; source = temp_buffer
   245                                  	; destination = Audio_Buffer
   246 00000139 E8A5090000              	call 	ConvertSamples
   247                                  
   248                                  	;mov	ecx, 128	; Make a lookup table
   249 0000013E B180                    	mov	cl, 128
   250 00000140 31DB                    	xor     ebx, ebx	; for fastest pixel
   251 00000142 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   252                                  MakeOfs:        
   253 00000147 668993[80850000]        	mov     [RowOfs+ebx], dx
   254 0000014E 668993[82850000]        	mov     [RowOfs+ebx+2], dx
   255 00000155 6681C24001              	add     dx, 320
   256 0000015A 83C304                  	add     ebx, 4
   257 0000015D E2E8                    	loop    MakeOfs
   258                                  
   259                                  	; 23/06/2017
   260                                  	; Map DMA buffer to user's memory space
   261                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
   261                              <1> 
   261                              <1> 
   261                              <1> 
   261                              <1> 
   261                              <1>  %if %0 >= 2
   261 0000015F BB000D0000          <1>  mov ebx, %2
   261                              <1>  %if %0 >= 3
   261 00000164 B900000100          <1>  mov ecx, %3
   261                              <1>  %if %0 = 4
   261 00000169 BA[00000200]        <1>  mov edx, %4
   261                              <1>  %endif
   261                              <1>  %endif
   261                              <1>  %endif
   261 0000016E B820000000          <1>  mov eax, %1
   261                              <1> 
   261 00000173 CD40                <1>  int 40h
   262                                  	;jc	error_exit
   263                                  
   264                                  	; Set Master Volume Level
   265                                  	sys	_audio, 0B00h, 1D1Dh
   265                              <1> 
   265                              <1> 
   265                              <1> 
   265                              <1> 
   265                              <1>  %if %0 >= 2
   265 00000175 BB000B0000          <1>  mov ebx, %2
   265                              <1>  %if %0 >= 3
   265 0000017A B91D1D0000          <1>  mov ecx, %3
   265                              <1>  %if %0 = 4
   265                              <1>  mov edx, %4
   265                              <1>  %endif
   265                              <1>  %endif
   265                              <1>  %endif
   265 0000017F B820000000          <1>  mov eax, %1
   265                              <1> 
   265 00000184 CD40                <1>  int 40h
   266                                  
   267                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   268                                  	
   269                                  	; Start	to play
   270 00000186 A0[020F0000]            	mov	al, [bps]
   271 0000018B C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   272 0000018E D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   273 00000190 8A1D[010F0000]          	mov	bl, [stmo]
   274 00000196 FECB                    	dec	bl
   275 00000198 08C3                    	or	bl, al
   276 0000019A 668B0D[030F0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   277 000001A1 B704                    	mov	bh, 4 ; start to play	
   278                                  	sys	_audio
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1>  %if %0 >= 2
   278                              <1>  mov ebx, %2
   278                              <1>  %if %0 >= 3
   278                              <1>  mov ecx, %3
   278                              <1>  %if %0 = 4
   278                              <1>  mov edx, %4
   278                              <1>  %endif
   278                              <1>  %endif
   278                              <1>  %endif
   278 000001A3 B820000000          <1>  mov eax, %1
   278                              <1> 
   278 000001A8 CD40                <1>  int 40h
   279                                  
   280                                  	; 13/10/2017
   281                                          ; load 8192 bytes into audio buffer
   282 000001AA BF[00100100]                    mov	edi, temp_buffer
   283 000001AF BB00200000              	mov	ebx, BUFFERSIZE / 4
   284 000001B4 E8CA070000              	call	GetSamples
   285 000001B9 7224                    	jc	error_exit
   286                                  
   287                                  	; 8 bit to 16 bit (*2)
   288                                  	; mono to stereo (*2)
   289                                  	; 4* (BUFFERSIZE/4) 
   290                                  	; source = temp_buffer
   291                                  	; destination = Audio_Buffer
   292 000001BB E823090000              	call 	ConvertSamples
   293                                  
   294                                  	; bh = 16 : update (current) dma half buffer
   295                                  	; bl = 0  : then switch to the next half buffer
   296                                  	sys	_audio, 1000h
   296                              <1> 
   296                              <1> 
   296                              <1> 
   296                              <1> 
   296                              <1>  %if %0 >= 2
   296 000001C0 BB00100000          <1>  mov ebx, %2
   296                              <1>  %if %0 >= 3
   296                              <1>  mov ecx, %3
   296                              <1>  %if %0 = 4
   296                              <1>  mov edx, %4
   296                              <1>  %endif
   296                              <1>  %endif
   296                              <1>  %endif
   296 000001C5 B820000000          <1>  mov eax, %1
   296                              <1> 
   296 000001CA CD40                <1>  int 40h
   297                                      
   298                                  	;; SETUP SIGNAL RESPONSE BYTE
   299                                  	;; 06/03/2017
   300                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   301                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   302                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   303                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   304                                  	;sys	_calbac
   305                                  	;jc	short error_exit
   306                                  
   307                                  	; DIRECT VGA MEMORY ACCESS
   308                                  	; bl = 0, bh = 5
   309                                  	; Direct access/map to VGA memory (0A0000h)
   310                                  
   311                                  	sys	_video, 0500h
   311                              <1> 
   311                              <1> 
   311                              <1> 
   311                              <1> 
   311                              <1>  %if %0 >= 2
   311 000001CC BB00050000          <1>  mov ebx, %2
   311                              <1>  %if %0 >= 3
   311                              <1>  mov ecx, %3
   311                              <1>  %if %0 = 4
   311                              <1>  mov edx, %4
   311                              <1>  %endif
   311                              <1>  %endif
   311                              <1>  %endif
   311 000001D1 B81F000000          <1>  mov eax, %1
   311                              <1> 
   311 000001D6 CD40                <1>  int 40h
   312 000001D8 3D00000A00              	cmp	eax, 0A0000h
   313 000001DD 7418                    	je	short _a3
   314                                  error_exit:
   315                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   315                              <1> 
   315                              <1> 
   315                              <1> 
   315                              <1> 
   315                              <1>  %if %0 >= 2
   315 000001DF BB[DE0E0000]        <1>  mov ebx, %2
   315                              <1>  %if %0 >= 3
   315 000001E4 B9FF000000          <1>  mov ecx, %3
   315                              <1>  %if %0 = 4
   315 000001E9 BA0E000000          <1>  mov edx, %4
   315                              <1>  %endif
   315                              <1>  %endif
   315                              <1>  %endif
   315 000001EE B823000000          <1>  mov eax, %1
   315                              <1> 
   315 000001F3 CD40                <1>  int 40h
   316 000001F5 EB16                    	jmp	short Exit
   317                                  
   318                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   319                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   320                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   321                                  ;       second, or the module will sound "looped".
   322                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   323                                  ;       the polling is called from my routine, and then the irq 0 must be
   324                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   325                                  ;       samples played by the Sound Blaster. Note that some samples are
   326                                  ;       discarded in the next code, just for fun!
   327                                  
   328                                  _a3:
   329 000001F7 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   330 000001FB CD31                    	int     31h
   331                                  
   332                                  	; 24/06/2017
   333 000001FD E864000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   334                                  
   335                                  _s_exit:
   336 00000202 E8AB080000              	call	StopPlaying	; STOP!
   337                                  
   338 00000207 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   339 0000020B CD31                    	int     31h
   340                                  Exit:           
   341                                  	;call    FreeModule	; Free MODule core.
   342                                  	
   343                                  	sys 	_exit	; Bye !
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1>  %if %0 >= 2
   343                              <1>  mov ebx, %2
   343                              <1>  %if %0 >= 3
   343                              <1>  mov ecx, %3
   343                              <1>  %if %0 = 4
   343                              <1>  mov edx, %4
   343                              <1>  %endif
   343                              <1>  %endif
   343                              <1>  %endif
   343 0000020D B801000000          <1>  mov eax, %1
   343                              <1> 
   343 00000212 CD40                <1>  int 40h
   344                                  here:
   345 00000214 EBFE                    	jmp	short here
   346                                  
   347                                  pmsg_2017:
   348                                  	sys	_msg, msg_2017, 255, 0Fh
   348                              <1> 
   348                              <1> 
   348                              <1> 
   348                              <1> 
   348                              <1>  %if %0 >= 2
   348 00000216 BB[250E0000]        <1>  mov ebx, %2
   348                              <1>  %if %0 >= 3
   348 0000021B B9FF000000          <1>  mov ecx, %3
   348                              <1>  %if %0 = 4
   348 00000220 BA0F000000          <1>  mov edx, %4
   348                              <1>  %endif
   348                              <1>  %endif
   348                              <1>  %endif
   348 00000225 B823000000          <1>  mov eax, %1
   348                              <1> 
   348 0000022A CD40                <1>  int 40h
   349 0000022C EBDF                    	jmp	short Exit
   350                                  
   351                                  DetectICH:
   352                                  	; 24/06/2017
   353                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   354                                          sys	_audio, 0102h
   354                              <1> 
   354                              <1> 
   354                              <1> 
   354                              <1> 
   354                              <1>  %if %0 >= 2
   354 0000022E BB02010000          <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 00000233 B820000000          <1>  mov eax, %1
   354                              <1> 
   354 00000238 CD40                <1>  int 40h
   355 0000023A C3                      	retn
   356                                  
   357                                  noDevMsg:
   358 0000023B 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   358 00000244 61626C6520746F2066-
   358 0000024D 696E64204143393720-
   358 00000256 617564696F20646576-
   358 0000025F 696365210D0A00     
   359                                  
   360                                  ;ac97_int_handler:
   361                                  ;	; 19/06/2017
   362                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   363                                  ;
   364                                  ;	sys	_rele ; return from callback service 
   365                                  ;	; we must not come here !
   366                                  ;	sys	_exit
   367                                  
   368                                  ;=============================================================================
   369                                  ;      
   370                                  ;=============================================================================
   371                                  
   372                                  PlayMod:
   373                                   	; 13/10/2017
   374                                  	; 23/06/2017   
   375                                  	; 21/06/2017
   376                                  	; 19/06/2017
   377                                  
   378                                  	; 05/03/2017 (TRDOS 386)
   379                                  	; 14/02/2017
   380                                  	; 13/02/2017
   381                                  	; 08/12/2016
   382                                  	; 28/11/2016
   383                                  
   384                                  	; 13/10/2017
   385                                  	;jmp	short modp_gs ; 23/06/2017
   386                                  p_loop:
   387 00000266 803D[BD0F0000]00        	cmp	byte [srb], 0
   388 0000026D 7621                    	jna	short q_loop
   389 0000026F C605[BD0F0000]00        	mov	byte [srb], 0
   390                                  modp_gs:
   391                                  	;mov	edi, Audio_Buffer
   392                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   393                                  	;call	GetSamples
   394                                  
   395                                  	; 24/06/2017
   396                                          ; load 8192 bytes into audio buffer
   397 00000276 BF[00100100]            	mov	edi, temp_buffer
   398 0000027B BB00200000              	mov	ebx, BUFFERSIZE / 4
   399 00000280 E8FE060000              	call	GetSamples
   400 00000285 0F8254FFFFFF            	jc	error_exit
   401                                  
   402                                  	; 24/06/2017
   403                                  	; 8 bit to 16 bit (*2)
   404                                  	; mono to stereo (*2)
   405                                  	; 4* (BUFFERSIZE/4) 
   406                                  	; source = temp_buffer
   407                                  	; destination = Audio_Buffer
   408 0000028B E853080000              	call 	ConvertSamples
   409                                  q_loop:
   410 00000290 B401                    	mov     ah, 1		; any key pressed?
   411 00000292 CD32                    	int     32h		; no, Loop.
   412 00000294 7405                    	jz	short r_loop
   413                                  
   414 00000296 B400                    	mov     ah, 0		; flush key buffer...
   415 00000298 CD32                    	int     32h
   416                                  q_return:
   417 0000029A C3                      	retn
   418                                  r_loop:
   419                                  	; Get Current DMA buffer Pointer 
   420                                  	; 23/06/2017
   421                                  	; bh = 15, get current pointer (DMA buffer offset)
   422                                  	; bl = 0, for PCM OUT
   423                                  	; ecx = 0
   424                                  	;
   425                                  	sys	_audio, 0F00h, 0
   425                              <1> 
   425                              <1> 
   425                              <1> 
   425                              <1> 
   425                              <1>  %if %0 >= 2
   425 0000029B BB000F0000          <1>  mov ebx, %2
   425                              <1>  %if %0 >= 3
   425 000002A0 B900000000          <1>  mov ecx, %3
   425                              <1>  %if %0 = 4
   425                              <1>  mov edx, %4
   425                              <1>  %endif
   425                              <1>  %endif
   425                              <1>  %endif
   425 000002A5 B820000000          <1>  mov eax, %1
   425                              <1> 
   425 000002AA CD40                <1>  int 40h
   426                                  ScopeLoop:
   427 000002AC BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   428                                  	; 23/06/2017
   429 000002B1 BE[00000200]            	mov     esi, DMA_Buffer
   430 000002B6 01C6                    	add     esi, eax	; add offset value
   431                                  	; 24/06/2017
   432 000002B8 B9[00FB0200]            	mov	ecx, DMA_Buffer + (65536 - (320*4))
   433 000002BD 39CE                    	cmp	esi, ecx 
   434 000002BF 7602                    	jna	short _4
   435 000002C1 89CE                    	mov	esi, ecx
   436                                  _4:
   437 000002C3 31C9                    	xor     ecx, ecx	; to be drawed ...
   438 000002C5 31D2                    	xor     edx, edx
   439                                  DrawLoop:       
   440 000002C7 89D3                    	mov     ebx, edx	; (save Index)
   441 000002C9 668BBB[00830000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   442 000002D0 C60700                  	mov     byte [edi], 0	; erase it!
   443                                  	; 24/06/2017
   444 000002D3 AD                      	lodsd
   445 000002D4 80C480                  	add	ah, 80h
   446 000002D7 88E3                    	mov	bl, ah
   447                                  	;
   448 000002D9 30FF                    	xor     bh, bh
   449 000002DB 66D1E3                  	shl     bx, 1
   450 000002DE 668BBB[80850000]        	mov     di, [RowOfs+ebx]
   451 000002E5 6601CF                  	add     di, cx
   452 000002E8 6689D3                  	mov     bx, dx		; (restore Index)
   453 000002EB 6689BB[00830000]        	mov     [Scope+ebx], di	; save new address...
   454 000002F2 C6070A                  	mov     byte [edi], 10	; and DRAW.
   455 000002F5 6683C202                	add     dx, 2		; the next pixel...
   456 000002F9 41                      	inc     ecx
   457 000002FA 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   458 000002FF 72C6                    	jb      short DrawLoop
   459 00000301 E960FFFFFF              	jmp	p_loop
   460                                  
   461                                  
   462                                  ;=============================================================================
   463                                  ;               MODLOAD.ASM
   464                                  ;=============================================================================
   465                                  
   466                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   467                                  ;	July 10th, 1993.
   468                                  
   469                                  ; STRUCTURES
   470                                  
   471                                  struc ModSample
   472 00000000 <res 00000016>          .msName:	resb 22
   473 00000016 <res 00000002>          .msLength:	resw 1
   474 00000018 <res 00000001>          .msFinetune:	resb 1
   475 00000019 <res 00000001>          .msVolume:	resb 1
   476 0000001A <res 00000002>          .msRepeat:	resw 1
   477 0000001C <res 00000002>          .msRepLen:	resw 1
   478                                  .size:
   479                                  endstruc
   480                                  
   481                                  struc ModHeader
   482 00000000 <res 00000014>          .mhName:	resb 20
   483 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   484 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   485 000003B7 <res 00000001>          .mhReStart:	resb 1
   486 000003B8 <res 00000080>          .mhOrder:	resb 128
   487 00000438 <res 00000004>          .mhSign:	resw 2
   488                                  .size:	
   489                                  endstruc
   490                                  
   491                                  struc ModInfoRec
   492 00000000 <res 00000001>          .OrderLen:	resb 1
   493 00000001 <res 00000001>          .ReStart:	resb 1
   494 00000002 <res 00000080>          .Order:	resb 128
   495 00000082 <res 00000004>          .Patterns:	resd 1
   496 00000086 <res 0000003E>          .SampOfs:	resw 31
   497 000000C4 <res 0000003E>          .SampSeg:	resw 31
   498 00000102 <res 0000003E>          .SampLen:	resw 31
   499 00000140 <res 0000003E>          .SampRep:	resw 31
   500 0000017E <res 0000003E>          .SampRepLen:	resw 31
   501 000001BC <res 0000003E>          .SampVol:	resw 31
   502                                  .size:	
   503                                  endstruc
   504                                  
   505                                  ; CODE
   506                                  
   507                                  ; 07/10/2017 (modplay3.s)
   508                                  ; tinyply3.s
   509                                  ; 06/10/2017
   510                                  ; 04/10/2017
   511                                  ; /* MOD FileFormat */
   512                                  
   513                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   514                                  ID_FLT4 equ 34544C46h ; "FLT4"
   515                                  ID_8CHN equ 4E484338h ; "8CHN"
   516                                  ID_FLT8 equ 34544C46h ; "FLT8"
   517                                  
   518                                  ; CODE
   519                                  
   520                                  LoadModule:
   521                                  	; edi = file name address
   522                                  
   523 00000306 60                      	pushad
   524                                  
   525 00000307 E878010000              	call    ClearModInfo
   526                                  OpenFile:       
   527                                  	; ebx = ASCIIZ file name address
   528                                  	; ecx = open mode (0 = open for read)	
   529                                  	sys	_open, edi, 0 ; open for reading
   529                              <1> 
   529                              <1> 
   529                              <1> 
   529                              <1> 
   529                              <1>  %if %0 >= 2
   529 0000030C 89FB                <1>  mov ebx, %2
   529                              <1>  %if %0 >= 3
   529 0000030E B900000000          <1>  mov ecx, %3
   529                              <1>  %if %0 = 4
   529                              <1>  mov edx, %4
   529                              <1>  %endif
   529                              <1>  %endif
   529                              <1>  %endif
   529 00000313 B805000000          <1>  mov eax, %1
   529                              <1> 
   529 00000318 CD40                <1>  int 40h
   530 0000031A 0F8262010000            	jc	Failed
   531 00000320 A3[BE0F0000]            	mov     [FileHandle], eax
   532                                  ReadHeader:
   533                                  	; ebx = File handle
   534                                  	; ecx = Buffer address
   535                                  	; edx = Byte count
   536                                  	sys	_read, [FileHandle], Header, ModHeader.size
   536                              <1> 
   536                              <1> 
   536                              <1> 
   536                              <1> 
   536                              <1>  %if %0 >= 2
   536 00000325 8B1D[BE0F0000]      <1>  mov ebx, %2
   536                              <1>  %if %0 >= 3
   536 0000032B B9[C20F0000]        <1>  mov ecx, %3
   536                              <1>  %if %0 = 4
   536 00000330 BA3C040000          <1>  mov edx, %4
   536                              <1>  %endif
   536                              <1>  %endif
   536                              <1>  %endif
   536 00000335 B803000000          <1>  mov eax, %1
   536                              <1> 
   536 0000033A CD40                <1>  int 40h
   537 0000033C 0F8231010000            	jc      CloseFile
   538                                  CheckMK:  
   539                                  	; 04/10/2017
   540 00000342 A1[FA130000]            	mov	eax, [Header+ModHeader.mhSign]
   541                                        
   542 00000347 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   543                                  	;je	short Is4chnMod
   544 0000034C 742B                    	je	short IsModFile
   545                                  CheckFLT4:
   546 0000034E 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   547                                  	;je	short Is4chnMod
   548 00000353 7424                    	je	short IsModFile
   549                                  Check8CHN:
   550 00000355 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   551 0000035A 740D                    	je	short Is8chnMod
   552                                  CheckFLT8:
   553 0000035C 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   554                                  	; 06/10/2017
   555 00000361 7406                    	je	short Is8chnMod
   556 00000363 F9                      	stc
   557 00000364 E90A010000              	jmp	CloseFile
   558                                  Is8chnMod:
   559 00000369 C605[FF0E0000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   560 00000370 C605[FE0E0000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   561 00000377 EB00                    	jmp	short IsModFile
   562                                  ;Is4chnMod:
   563                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   564                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   565                                  
   566                                  IsModFile:
   567 00000379 A0[78130000]            	mov     al, [Header+ModHeader.mhOrderLen]
   568 0000037E A2[FE130000]            	mov     [ModInfo.OrderLen], al
   569                                  
   570 00000383 A0[79130000]            	mov     al, [Header+ModHeader.mhReStart]
   571 00000388 3A05[78130000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   572 0000038E 7202                    	jb      short SetReStart
   573 00000390 B07F                    	mov     al, 7Fh
   574                                  SetReStart:
   575 00000392 A2[FF130000]            	mov     [ModInfo.ReStart], al
   576                                  
   577                                  	;mov	ecx, 128
   578 00000397 66B98000                	mov	cx, 128
   579 0000039B 31D2                    	xor     edx, edx
   580 0000039D 31DB                    	xor     ebx, ebx
   581                                  CopyOrder:
   582 0000039F 8AB3[7A130000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   583 000003A5 88B3[00140000]          	mov     [ModInfo.Order+ebx], dh
   584 000003AB 38D6                    	cmp     dh, dl
   585 000003AD 7202                    	jb      short NextOrder
   586 000003AF 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   587                                  NextOrder:
   588 000003B1 43                      	inc     ebx
   589 000003B2 E2EB                    	loop    CopyOrder
   590                                  AllocPatterns:  
   591 000003B4 81E2FF000000            	and	edx, 0FFh
   592                                  	; 04/10/2017
   593                                  	;inx	dx  ; 12/03/2017
   594 000003BA FEC2                    	inc	dl
   595                                  	; dl = number of patterns (04/07/2017)
   596 000003BC 8A0D[FE0E0000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   597 000003C2 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   598                                  	     ; *2048 ; (byte count of patterns *64*8*4)
   599                                  	;
   600 000003C4 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   601                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   602 000003C6 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   603                                  	;
   604 000003CB 890D[80140000]          	mov	[ModInfo.Patterns], ecx
   605                                  	;
   606 000003D1 01CD                    	add	ebp, ecx ; next offset for samples
   607                                  ReadPatterns:  
   608                                  	;mov	ebx, [FileHandle] 
   609                                  	; ebx = File handle
   610                                  	; ecx = Buffer address
   611                                  	; edx = Byte count
   612                                  	sys	_read, [FileHandle]
   612                              <1> 
   612                              <1> 
   612                              <1> 
   612                              <1> 
   612                              <1>  %if %0 >= 2
   612 000003D3 8B1D[BE0F0000]      <1>  mov ebx, %2
   612                              <1>  %if %0 >= 3
   612                              <1>  mov ecx, %3
   612                              <1>  %if %0 = 4
   612                              <1>  mov edx, %4
   612                              <1>  %endif
   612                              <1>  %endif
   612                              <1>  %endif
   612 000003D9 B803000000          <1>  mov eax, %1
   612                              <1> 
   612 000003DE CD40                <1>  int 40h
   613 000003E0 0F828D000000            	jc      CloseFile
   614                                  
   615                                  	; patterns have been loaded here... (04/07/2017)
   616                                  
   617 000003E6 BE[D60F0000]            	mov	esi, Header+ModHeader.mhSamples
   618 000003EB 31FF                    	xor     edi, edi
   619                                  CopySamples:
   620 000003ED 668B4616                	mov     ax, [esi+ModSample.msLength]
   621 000003F1 86C4                    	xchg    al, ah
   622 000003F3 66D1E0                  	shl     ax, 1
   623 000003F6 668987[00150000]        	mov     [ModInfo.SampLen+edi], ax
   624 000003FD 8A4619                  	mov     al, [esi+ModSample.msVolume]
   625 00000400 30E4                    	xor     ah, ah
   626 00000402 668987[BA150000]        	mov     [ModInfo.SampVol+edi], ax
   627 00000409 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   628 0000040D 86C4                    	xchg    al, ah
   629 0000040F 66D1E0                  	shl     ax, 1
   630 00000412 668987[3E150000]        	mov     [ModInfo.SampRep+edi], ax
   631 00000419 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   632 0000041D 86C4                    	xchg    al, ah
   633 0000041F 66D1E0                  	shl     ax, 1
   634 00000422 668987[7C150000]        	mov     [ModInfo.SampRepLen+edi], ax
   635 00000429 83C61E                  	add     esi, ModSample.size
   636 0000042C 6683C702                	add     di, 2
   637 00000430 6683FF3E                	cmp     di, 2*31
   638 00000434 72B7                    	jb      short CopySamples
   639                                  
   640 00000436 31F6                    	xor     esi, esi
   641                                  AllocSamples:
   642 00000438 0FB796[00150000]        	movzx	edx, word [ModInfo.SampLen+esi]
   643                                  	; 07/10/2017
   644                                  	;shr	dx, 4 ; ***
   645 0000043F 21D2                    	and	edx, edx
   646 00000441 7426                    	jz      short NextSample
   647                                  	;inc	dx  ; number of paragraphs ; ***
   648                                  	;shl	dx, 4 ; ***
   649 00000443 89E8                    	mov	eax, ebp
   650 00000445 668986[84140000]        	mov	[ModInfo.SampOfs+esi], ax
   651 0000044C C1E810                  	shr	eax, 16
   652 0000044F 668986[C2140000]        	mov	[ModInfo.SampSeg+esi], ax
   653 00000456 89E9                    	mov	ecx, ebp
   654 00000458 01D5                    	add	ebp, edx ; next offset for sample 
   655                                  ReadSample:
   656                                  	;mov	ebx, [FileHandle]
   657                                  	;movzx  edx, [ModInfo.SampLen+esi]
   658                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   659                                  
   660                                  	; ebx = File handle
   661                                  	; ecx = Buffer address
   662                                  	; edx = Byte count
   663                                  	sys	_read, [FileHandle]
   663                              <1> 
   663                              <1> 
   663                              <1> 
   663                              <1> 
   663                              <1>  %if %0 >= 2
   663 0000045A 8B1D[BE0F0000]      <1>  mov ebx, %2
   663                              <1>  %if %0 >= 3
   663                              <1>  mov ecx, %3
   663                              <1>  %if %0 = 4
   663                              <1>  mov edx, %4
   663                              <1>  %endif
   663                              <1>  %endif
   663                              <1>  %endif
   663 00000460 B803000000          <1>  mov eax, %1
   663                              <1> 
   663 00000465 CD40                <1>  int 40h
   664 00000467 720A                    	jc      short CloseFile
   665                                  
   666                                  NextSample:
   667 00000469 6683C602                	add     si, 2
   668 0000046D 6683FE3E                	cmp     si, 2*31
   669 00000471 72C5                    	jb      short AllocSamples
   670                                  CloseFile:      
   671 00000473 9C                      	pushf
   672                                  	sys	_close, [FileHandle]
   672                              <1> 
   672                              <1> 
   672                              <1> 
   672                              <1> 
   672                              <1>  %if %0 >= 2
   672 00000474 8B1D[BE0F0000]      <1>  mov ebx, %2
   672                              <1>  %if %0 >= 3
   672                              <1>  mov ecx, %3
   672                              <1>  %if %0 = 4
   672                              <1>  mov edx, %4
   672                              <1>  %endif
   672                              <1>  %endif
   672                              <1>  %endif
   672 0000047A B806000000          <1>  mov eax, %1
   672                              <1> 
   672 0000047F CD40                <1>  int 40h
   673 00000481 9D                      	popf
   674                                  Failed:       
   675 00000482 61                      	popad
   676 00000483 C3                      	retn
   677                                  
   678                                  FreeModule:
   679                                  	; Erdogan Tan (13/02/2017)
   680                                  	; nothing to do here for memory de-allocation
   681                                  ClearModInfo:
   682 00000484 57                      	push	edi
   683 00000485 BF[FE130000]            	mov	edi, ModInfo
   684 0000048A B9FA010000              	mov     ecx, ModInfoRec.size
   685                                  	;cld
   686 0000048F 30C0                    	xor     al, al
   687 00000491 F3AA                    	rep     stosb
   688 00000493 5F                      	pop	edi
   689 00000494 C3                      	retn
   690                                  
   691                                  ;=============================================================================
   692                                  ;               MODPLAY.ASM
   693                                  ;=============================================================================
   694                                  
   695                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   696                                  ;	July 23th, 1993.
   697                                  
   698                                  ; EQUATES
   699                                  
   700                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   701                                  DefTempo        equ 6
   702                                  DefBpm          equ 125
   703                                  MidCRate        equ 8448
   704                                  MixBufSize      equ 4096
   705                                  
   706                                  ; STRUCTURES
   707                                  
   708                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   709 00000000 <res 00000004>          .Samples:	resd 1
   710                                  ;.Position:	resw 1
   711 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   712 00000008 <res 00000002>          .Len:	resw 1
   713 0000000A <res 00000002>          .Repeat:	resw 1
   714 0000000C <res 00000002>          .RepLen:	resw 1
   715 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   716 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   717                                  ;.Error:	resb 1
   718                                  ;.Reserved:	resb 1 ; 01/10/2017
   719 00000010 <res 00000002>          .Period:	resw 1 ; Period
   720 00000012 <res 00000002>          .Pitch:	resw 1 
   721 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   722 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   723 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   724 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   725 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   726 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   727 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   728                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   729 0000001D <res 00000001>          .Error:	resb 1 ; 01/10/2017
   730 0000001E <res 00000006>          .Arp:	resw 3
   731 00000024 <res 00000002>          .ArpIndex:	resw 1
   732                                  .size:	; 38 bytes ; 01/10/2017 -  TRDOS 386
   733                                  endstruc
   734                                  
   735                                  ; CODE
   736                                  
   737                                  ;--------------------------------------------------------------------------
   738                                  ; updatechannel - update the track using the current effect
   739                                  ;--------------------------------------------------------------------------
   740                                  ; 
   741                                  ;--------------------------------------------------------------------------
   742                                  ; BeatTrack:  Process the next beat in one track.
   743                                  ;  In:
   744                                  ;    ds:di -  Track info Address.
   745                                  ;--------------------------------------------------------------------------
   746                                  
   747                                  ; edi = Track info address
   748                                  
   749                                  updatechannel:
   750                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   751                                  
   752 00000495 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   753                                  
   754                                  	;test   dx, dx
   755                                  	;je     short None
   756                                  	;cmp    dh, 00h
   757                                  	;je     short Arpeggio
   758                                  	;cmp    dh, 01h
   759                                  	;je     short PortUp
   760                                  	;cmp    dh, 02h
   761                                  	;je     short PortDown
   762                                  	;cmp    dh, 03h
   763                                  	;je     TonePort
   764                                  	;cmp    dh, 04h
   765                                  	;je     Vibrato
   766                                  	;cmp    dh, 05h
   767                                  	;je     PortSlide
   768                                  	;cmp    dh, 06h
   769                                  	;je     VibSlide
   770                                  	;cmp    dh, 0Ah
   771                                  	;je     VolSlide
   772                                  	;retn
   773                                  
   774 00000499 0FB6C6                  	movzx	eax, dh
   775 0000049C 240F                    	and	al, 0Fh
   776 0000049E FF2485[1C0D0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   777                                  efxnull:
   778                                  None:           
   779 000004A5 C3                      	retn
   780                                  efxarpeggio2:
   781                                  	; 01/10/2017
   782 000004A6 84D2                    	test    dl, dl
   783 000004A8 74FB                    	jz      short efxnull
   784                                  Arpeggio:
   785 000004AA 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   786 000004AE 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   787 000004B3 66894712                	mov     [edi+TrackInfo.Pitch], ax
   788 000004B7 6683C302                	add     bx, 2
   789 000004BB 6683FB06                	cmp     bx, 6
   790 000004BF 7202                    	jb      short SetArpIndex
   791 000004C1 31DB                    	xor     ebx, ebx
   792                                  SetArpIndex:
   793 000004C3 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   794 000004C7 C3                      	retn
   795                                  efxportaup:
   796                                  PortUp:
   797 000004C8 30F6                    	xor     dh, dh
   798                                  	;mov	bx, [edi+TrackInfo.Period]
   799 000004CA 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   800 000004CE 6629D3                  	sub     bx, dx
   801                                  	;cmp	bx, 113
   802 000004D1 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   803 000004D5 7D04                    	jge     short NotSmall
   804                                  	;mov	bx, 113
   805 000004D7 66BB1C00                	mov	bx, 28 ; 01/10/2017
   806                                  NotSmall:
   807 000004DB 66895F10                	mov     [edi+TrackInfo.Period], bx
   808 000004DF 6601DB                  	add     bx, bx
   809                                  	;mov	ax, [PitchTable+bx]
   810 000004E2 668B83[F8150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   811 000004E9 66894712                	mov     [edi+TrackInfo.Pitch], ax
   812 000004ED C3                      	retn
   813                                  efxportadown:
   814                                  PortDown:
   815 000004EE 30F6                    	xor     dh, dh
   816                                  	;mov	bx, [edi+TrackInfo.Period]
   817 000004F0 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   818 000004F4 6601D3                  	add     bx, dx
   819 000004F7 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   820                                  	;cmp	bx, 856
   821 000004FC 7E04                    	jle     short NotBig
   822                                  	;mov	bx, 856
   823 000004FE 66BB600D                	mov	bx, 3424 ; 01/10/2017
   824                                  NotBig:         
   825 00000502 66895F10                	mov     [edi+TrackInfo.Period], bx
   826 00000506 6601DB                  	add     bx, bx
   827                                  	;mov	ax, [PitchTable+bx]
   828 00000509 668B83[F8150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   829 00000510 66894712                	mov     [edi+TrackInfo.Pitch], ax
   830 00000514 C3                      	retn
   831                                  efxtoneporta2:
   832                                  TonePort:
   833 00000515 30F6                    	xor     dh, dh
   834 00000517 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   835                                  	;mov	bx, [edi+TrackInfo.Period]
   836 0000051B 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   837 0000051F 6639C3                  	cmp     bx, ax
   838 00000522 7429                    	je      short NoPort
   839 00000524 7F0D                    	jg      short PortToUp
   840                                  PortToDown:     
   841 00000526 6601D3                  	add     bx, dx
   842 00000529 6639C3                  	cmp     bx, ax
   843 0000052C 7E0D                    	jle     short SetPort
   844                                  FixPort:        
   845 0000052E 6689C3                  	mov     bx, ax
   846 00000531 EB08                    	jmp     short SetPort
   847                                  PortToUp:
   848 00000533 6629D3                  	sub     bx, dx
   849 00000536 6639C3                  	cmp     bx, ax
   850 00000539 7CF3                    	jl      short FixPort
   851                                  SetPort:        
   852 0000053B 66895F10                	mov     [edi+TrackInfo.Period], bx
   853 0000053F 6601DB                  	add     bx, bx
   854                                  	;mov	ax, [PitchTable+bx]
   855 00000542 668B83[F8150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   856 00000549 66894712                	mov     [edi+TrackInfo.Pitch], ax
   857                                  NoPort:         
   858 0000054D C3                      	retn
   859                                  efxvibrato2:
   860                                  	; 01/10/2017
   861                                  Vibrato:
   862 0000054E 88D6                    	mov     dh, dl
   863                                  	;and	dl, 0Fh
   864                                  	;shr	dh, 4
   865                                  	;shl	dh, 2
   866 00000550 6681E20FF0              	and     dx, 0F00Fh
   867 00000555 C0EE02                  	shr     dh, 2
   868                                  	;add	[edi+TrackInfo.VibPos], dh
   869                                  	;mov	dh, [edi+TrackInfo.VibPos]
   870                                  	;mov	bl, dh
   871 00000558 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   872 0000055B 007719                  	add	[edi+TrackInfo.VibPos], dh
   873 0000055E 88DE                    	mov	dh, bl ; 01/10/2017
   874 00000560 C0EB02                  	shr     bl, 2
   875                                  	;and	bx, 1Fh
   876                                  	;mov	al, [SinTable+bx]
   877 00000563 83E31F                  	and	ebx, 1Fh
   878 00000566 8A83[040E0000]          	mov	al, [SinTable+ebx]
   879 0000056C F6E2                    	mul     dl
   880                                  	;rol	ax, 1
   881                                  	;xchg	al, ah
   882                                  	;and	ah, 1
   883 0000056E 66C1E807                	shr	ax, 7
   884 00000572 84F6                    	test    dh, dh
   885 00000574 7903                    	jns     short VibUp
   886 00000576 66F7D8                  	neg     ax
   887                                  VibUp:          
   888 00000579 66034710                	add     ax, [edi+TrackInfo.Period]
   889 0000057D 6689C3                  	mov	bx, ax
   890                                  	;movzx	ebx, ax
   891 00000580 6683FB71                	cmp     bx, 113
   892                                  	;cmp	bx, 113
   893 00000584 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   894 00000588 7D06                    	jge     short NoLoVib
   895                                  	;mov	bx, 113
   896 0000058A 66BB1C00                	mov	bx, 28	; 01/10/2017
   897 0000058E EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   898                                  NoLoVib:        
   899 00000590 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   900                                  	;cmp	bx, 856
   901 00000595 7E04                    	jle     short NoHiVib
   902                                  	;mov	bx, 856
   903 00000597 66BB600D                	mov	bx, 3424 ; 01/10/2017
   904                                  NoHiVib:        
   905 0000059B 6601DB                  	add     bx, bx
   906                                  	;mov	ax, [PitchTable+bx]
   907 0000059E 668B83[F8150000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   908 000005A5 66894712                	mov     [edi+TrackInfo.Pitch], ax
   909 000005A9 C3                      	retn
   910                                  efxtoneslide:
   911                                  PortSlide:
   912 000005AA E812000000              	call    VolSlide
   913 000005AF 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   914 000005B2 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   915                                  efxvibslide:
   916                                  VibSlide:
   917 000005B7 E805000000              	call    VolSlide
   918 000005BC 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   919 000005BF EB8D                    	jmp     short Vibrato  ; efxvibrato2
   920                                  efxvolslide:
   921                                  VolSlide:
   922 000005C1 88D6                    	mov     dh, dl
   923 000005C3 80E20F                  	and     dl, 0Fh
   924 000005C6 C0EE04                  	shr     dh, 4
   925 000005C9 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   926 000005CC 28D0                    	sub     al, dl
   927 000005CE 7D02                    	jge     short NoLoVol
   928 000005D0 30C0                    	xor     al, al
   929                                  NoLoVol:        
   930 000005D2 00F0                    	add     al, dh
   931 000005D4 3C40                    	cmp     al, 64
   932 000005D6 7602                    	jbe     short NoHiVol
   933 000005D8 B040                    	mov     al, 64
   934                                  NoHiVol:        
   935 000005DA 88470E                  	mov     [edi+TrackInfo.Volume], al
   936 000005DD C3                      	retn
   937                                  
   938                                  efxtremolo2:
   939                                  	; 01/10/2017 (TMODPLAY.ASM)
   940                                  Tremolo:
   941 000005DE 88D6                    	mov     dh, dl
   942 000005E0 6681E20FF0              	and     dx, 0F00Fh
   943 000005E5 C0EE02                  	shr     dh, 2
   944 000005E8 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
   945 000005EB 00771B                  	add	[edi+TrackInfo.TremPos], dh
   946 000005EE 88DE                    	mov	dh, bl
   947 000005F0 C0EB02                  	shr     bl, 2
   948                                  	; 01/10/2017 - TRDOS 386
   949                                  	;and	bx, 1Fh
   950 000005F3 83E31F                  	and	ebx, 1Fh 
   951                                  	;mov	al, [SinTable+bx]
   952 000005F6 8A83[040E0000]          	mov     al, [SinTable+ebx]
   953 000005FC F6E2                    	mul     dl
   954 000005FE 66C1E806                	shr	ax, 6
   955 00000602 84F6                    	test    dh, dh
   956 00000604 7D03                    	jge	short Tremolo_1 ; efxtremolof2
   957 00000606 66F7D8                  	neg     ax
   958                                  efxtremolof2:
   959                                  Tremolo_1:      
   960 00000609 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
   961 0000060C 00E0                    	add     al, ah
   962 0000060E 7D02                    	jge     short Tremolo_2 ; efxtremolof3
   963 00000610 30C0                    	xor     al, al
   964                                  efxtremolof3:
   965                                  Tremolo_2:       
   966 00000612 3C40                    	cmp     al, 64 ; 40h
   967 00000614 7E02                    	jle     short Tremolo_3 ; efxtremolof4
   968 00000616 B040                    	mov     al, 64 ; 40h
   969                                  efxtremolof4:
   970                                  Tremolo_3:       
   971 00000618 28E0                    	sub	al, ah  ; ****** 
   972 0000061A 88470F                  	mov     [edi+TrackInfo.VolDiff], al
   973 0000061D C3                      	retn	
   974                                  
   975                                  ;--------------------------------------------------------------------------
   976                                  ; readchannel - read the next note event from the pattern sheet
   977                                  ;--------------------------------------------------------------------------
   978                                  ;
   979                                  ;--------------------------------------------------------------------------
   980                                  ; GetTrack:   Get the next Note from a pattern.
   981                                  ;  In:
   982                                  ;    ds:di -  Track info Address.
   983                                  ;    es:si -  Pattern Note Address.
   984                                  ; Out:
   985                                  ;    es:si -  The Next Pattern Note address.
   986                                  ;--------------------------------------------------------------------------
   987                                  
   988                                  ; esi = Pattern note address
   989                                  ; edi = Track info address
   990                                  
   991                                  readchannel:
   992                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
   993 0000061E 66AD                    	lodsw
   994 00000620 86C4                    	xchg    al, ah
   995 00000622 88E3                    	mov	bl, ah
   996 00000624 80E40F                  	and     ah, 0Fh
   997 00000627 6689C1                  	mov     cx, ax
   998 0000062A 66AD                    	lodsw
   999 0000062C 86C4                    	xchg    al, ah
  1000 0000062E 88E7                    	mov     bh, ah
  1001 00000630 80E40F                  	and     ah, 0Fh
  1002 00000633 6689C2                  	mov     dx, ax
  1003 00000636 66895714                	mov     [edi+TrackInfo.Effect], dx
  1004                                  	; 01/10/2017 - TRDOS 386
  1005                                  	;and	bl, 0F0h
  1006 0000063A 81E3F0FF0000            	and	ebx, 0FFF0h
  1007 00000640 C0EF04                  	shr     bh, 4
  1008 00000643 08FB                    	or      bl, bh
  1009 00000645 7446                    	jz      short SetPeriod
  1010                                  SetSample:
  1011 00000647 30FF                    	xor	bh, bh
  1012                                  	;and	ebx, 0FFh
  1013 00000649 FECB                    	dec     bl
  1014 0000064B 01DB                    	add     ebx, ebx
  1015 0000064D 668B83[BA150000]        	mov     ax, [ModInfo.SampVol+ebx]
  1016 00000654 88470E                  	mov     [edi+TrackInfo.Volume], al
  1017 00000657 668B83[84140000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1018 0000065E 668907                  	mov     [edi+TrackInfo.Samples], ax
  1019 00000661 668B83[C2140000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1020 00000668 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1021 0000066C 668B83[00150000]        	mov     ax, [ModInfo.SampLen+ebx]
  1022 00000673 66894708                	mov     [edi+TrackInfo.Len], ax
  1023 00000677 668B83[3E150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1024 0000067E 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1025 00000682 668B83[7C150000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1026 00000689 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1027                                  SetPeriod:      
  1028 0000068D 6685C9                  	test    cx, cx
  1029 00000690 7425                    	jz      short SetEffect
  1030                                  
  1031 00000692 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1032                                  	
  1033 00000696 80FE03                  	cmp     dh, 03h
  1034                                  	;je	short SetEffect
  1035 00000699 7428                    	je	short efxtoneporta ; 01/10/2017
  1036                                  
  1037 0000069B 66894F10                	mov     [edi+TrackInfo.Period], cx
  1038                                  	;movzx	ebx, cx
  1039 0000069F 6689CB                  	mov     bx, cx
  1040 000006A2 6601DB                  	add     bx, bx
  1041                                  	;mov	ax, [PitchTable+bx]
  1042 000006A5 668B83[F8150000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1043 000006AC 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1044 000006B0 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1045                                  SetEffect:
  1046                                  	;test	dx, dx
  1047                                  	;je	short InitNone
  1048                                  	;cmp	dh, 00h
  1049                                  	;je	InitArpeggio
  1050                                  	;cmp	dh, 03h
  1051                                  	;je	short InitTonePort
  1052                                  	;cmp	dh, 04h
  1053                                  	;je	short InitVibrato
  1054                                  	;cmp	dh, 09h
  1055                                  	;je	short SampleOfs
  1056                                  	;cmp	dh, 0Bh
  1057                                  	;je	short PosJump
  1058                                  	;cmp	dh, 0Ch
  1059                                  	;je	short SetVolume
  1060                                  	;cmp	dh, 0Dh
  1061                                  	;je	short Break
  1062                                  	;cmp	dh, 0Fh
  1063                                  	;je	SetSpeed
  1064                                  	;retn
  1065                                  
  1066                                  	; 01/10/2017 (TMODPLAY.ASM)
  1067                                  	
  1068                                  	; dx = [di+TrackInfo.Effect]
  1069                                  	
  1070 000006B7 0FB6C6                  	movzx	eax, dh
  1071 000006BA 240F                    	and	al, 0Fh
  1072 000006BC FF2485[DC0C0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1073                                  ;efxnull:
  1074                                  ;InitNone:
  1075                                  ;	retn
  1076                                  efxtoneporta:
  1077                                  	; 01/10/2017
  1078                                  	; cx = period
  1079                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1080                                  InitTonePort:
  1081 000006C3 84D2                    	test    dl, dl
  1082 000006C5 7503                    	jnz     short SetPortParm
  1083 000006C7 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1084                                  SetPortParm:    
  1085 000006CA 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1086 000006CD 66895714                	mov     [edi+TrackInfo.Effect], dx
  1087 000006D1 C3                      	retn
  1088                                  efxvibrato:
  1089                                  InitVibrato:
  1090 000006D2 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1091 000006D5 88C4                    	mov     ah, al
  1092                                  	;and	al, 0Fh
  1093                                  	;and	ah, 0F0h
  1094 000006D7 66250FF0                	and	ax, 0F00Fh
  1095 000006DB F6C20F                  	test    dl, 0Fh
  1096 000006DE 7502                    	jne     short OkDepth
  1097 000006E0 08C2                    	or      dl, al
  1098                                  OkDepth:        
  1099 000006E2 F6C2F0                  	test    dl, 0F0h
  1100 000006E5 7502                    	jnz     short OkRate
  1101 000006E7 08E2                    	or      dl, ah
  1102                                  OkRate:         
  1103 000006E9 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1104 000006EC 66895714                	mov     [edi+TrackInfo.Effect], dx
  1105 000006F0 6685C9                  	test    cx, cx
  1106 000006F3 7404                    	jz      short OkPos
  1107 000006F5 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1108                                  OkPos:          
  1109 000006F9 C3                      	retn
  1110                                  efxsampoffset:
  1111                                  	; 01/10/2017 ; *******
  1112                                  SampleOfs:         
  1113                                  ;	test    dl, dl
  1114                                  ;	jnz     short SetSampleOfs
  1115                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1116                                  ;SetSampleOfs:
  1117                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1118 000006FA 88D6                    	mov     dh, dl
  1119 000006FC 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1120 00000702 895704                  	mov     [edi+TrackInfo.Position], edx
  1121 00000705 C3                      	retn
  1122                                  efxpattjump:
  1123                                  PosJump:
  1124 00000706 8815[BA810000]          	mov     [OrderPos], dl
  1125 0000070C C605[BE810000]40        	mov     byte [Row], 64
  1126 00000713 C3                      	retn
  1127                                  efxsetvolume:
  1128                                  SetVolume:
  1129 00000714 80FA40                  	cmp     dl, 64
  1130 00000717 7602                    	jbe     short OkVol
  1131 00000719 B240                    	mov     dl, 64
  1132                                  OkVol:
  1133                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1134 0000071B 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1135                                  	;mov	[edi+TrackInfo.Volume], dl
  1136 0000071D 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1137 00000721 C3                      	retn
  1138                                  efxbreak:
  1139                                  Break:
  1140 00000722 88D6                    	mov     dh, dl
  1141 00000724 80E20F                  	and     dl, 0Fh
  1142 00000727 C0EE04                  	shr     dh, 4
  1143 0000072A 00F6                    	add     dh, dh
  1144 0000072C 00F2                    	add     dl, dh
  1145 0000072E C0E602                  	shl     dh, 2
  1146 00000731 00F2                    	add     dl, dh
  1147 00000733 8815[BF810000]          	mov     [BreakRow], dl
  1148 00000739 C605[BE810000]40        	mov     byte [Row], 64
  1149 00000740 C3                      	retn
  1150                                  efxsetspeed:
  1151                                  SetSpeed:
  1152 00000741 84D2                    	test    dl,dl
  1153 00000743 7432                    	je      Skip
  1154 00000745 80FA1F                  	cmp     dl,31
  1155 00000748 770D                    	ja      short SetBpm
  1156                                  SetTempo:       
  1157 0000074A 8815[BB810000]          	mov     [Tempo], dl
  1158 00000750 8815[BC810000]          	mov     [TempoWait], dl
  1159 00000756 C3                      	retn
  1160                                  SetBpm:
  1161 00000757 8815[BD810000]          	mov     [Bpm], dl
  1162 0000075D B067                    	mov     al, 103
  1163 0000075F F6E2                    	mul     dl
  1164 00000761 88E3                    	mov     bl, ah
  1165 00000763 30FF                    	xor     bh, bh
  1166 00000765 66A1[030F0000]          	mov     ax, [MixSpeed]
  1167 0000076B 6631D2                  	xor     dx, dx
  1168 0000076E 66F7F3                  	div     bx
  1169 00000771 66A3[C0810000]          	mov     [BpmSamples], ax
  1170                                  Skip:           
  1171 00000777 C3                      	retn
  1172                                  efxarpeggio:
  1173                                  	; 01/10/2017
  1174 00000778 84D2                    	test    dl, dl
  1175                                  	;je	efxnull
  1176 0000077A 74FB                    	je	short Skip
  1177                                  InitArpeggio:
  1178 0000077C 88D6                    	mov     dh, dl
  1179 0000077E 80E20F                  	and     dl, 0Fh
  1180 00000781 C0EE04                  	shr     dh, 4
  1181                                  	; 01/10/2017
  1182                                  	;mov	cx, 36
  1183 00000784 66B95400                	mov	cx, 84 ; 84 notes/periods
  1184 00000788 31DB                    	xor     ebx, ebx
  1185 0000078A 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1186                                  gt_ScanPeriod:
  1187                                  	;cmp	ax, [PeriodTable+bx]
  1188 0000078E 663B83[5C0D0000]        	cmp	ax, [PeriodTable+ebx]
  1189 00000795 7306                    	jae     short SetArp
  1190 00000797 6683C302                	add     bx, 2
  1191 0000079B E2F1                    	loop    gt_ScanPeriod
  1192                                  SetArp:         
  1193 0000079D 6601D2                  	add     dx, dx
  1194 000007A0 00DE                    	add     dh, bl
  1195 000007A2 00DA                    	add     dl, bl
  1196                                  	; 01/10/2017
  1197                                  	;mov	bx, [PeriodTable+bx]
  1198 000007A4 668B9B[5C0D0000]        	mov	bx, [PeriodTable+ebx]
  1199                                  	;add	bx, bx
  1200 000007AB 01DB                    	add	ebx, ebx
  1201                                  	;mov	ax, [PitchTable+bx]
  1202 000007AD 668B83[F8150000]        	mov	ax, [PitchTable+ebx]
  1203 000007B4 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1204 000007B8 88F3                    	mov     bl, dh
  1205 000007BA 30FF                    	xor     bh, bh
  1206 000007BC 668B9B[5C0D0000]        	mov	bx, [PeriodTable+ebx]
  1207                                  	;add	bx, bx
  1208 000007C3 01DB                    	add	ebx, ebx
  1209                                  	;mov	ax, [PitchTable+bx]
  1210 000007C5 668B83[F8150000]        	mov	ax, [PitchTable+ebx]
  1211 000007CC 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1212 000007D0 88D3                    	mov     bl, dl
  1213 000007D2 30FF                    	xor     bh, bh
  1214 000007D4 668B9B[5C0D0000]        	mov	bx, [PeriodTable+ebx]
  1215                                  	;add	bx, bx
  1216 000007DB 01DB                    	add	ebx, ebx
  1217                                  	;mov	ax, [PitchTable+bx]
  1218 000007DD 668B83[F8150000]        	mov	ax, [PitchTable+ebx]
  1219 000007E4 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1220 000007E8 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1221 000007EE C3                      	retn
  1222                                  
  1223                                  efxtremolo:
  1224                                  	; 01/10/2017 (TMODPLAY.ASM)
  1225                                  InitTremolo:
  1226 000007EF 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1227 000007F2 88C4                    	mov     ah, al
  1228 000007F4 66250FF0                	and     ax, 0F00Fh
  1229 000007F8 F6C20F                  	test    dl, 0Fh
  1230 000007FB 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1231 000007FD 08C2                    	or      dl, al
  1232                                  efxtremolof0:
  1233                                  InitTremolo_1: 
  1234 000007FF F6C2F0                  	test    dl, 0F0h
  1235 00000802 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1236 00000804 08E2                    	or      dl, ah
  1237                                  efxtremolof1:
  1238                                  InitTremolo_2:
  1239 00000806 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1240 00000809 66895714                	mov     [edi+TrackInfo.Effect], dx
  1241 0000080D C3                      	retn
  1242                                  
  1243                                  ;--------------------------------------------------------------------------
  1244                                  ; pollmodule - polls the module player
  1245                                  ;--------------------------------------------------------------------------
  1246                                  ;--------------------------------------------------------------------------
  1247                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1248                                  ;--------------------------------------------------------------------------
  1249                                  
  1250                                  pollmodule:
  1251                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1252 0000080E FE0D[BC810000]          	dec     byte [TempoWait]
  1253 00000814 7417                    	jz      short GetTracks
  1254                                  
  1255                                  	;mov	ecx, NumTracks
  1256 00000816 0FB70D[FF0E0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1257 0000081D BF[D0810000]            	mov	edi, Tracks
  1258                                  BeatTracks:
  1259 00000822 E86EFCFFFF              	call	BeatTrack	
  1260 00000827 83C726                  	add	edi, TrackInfo.size
  1261 0000082A E2F6                    	loop	BeatTracks
  1262 0000082C C3                      	retn
  1263                                  GetTracks:
  1264 0000082D A0[BB810000]            	mov     al, [Tempo]
  1265 00000832 A2[BC810000]            	mov     [TempoWait], al
  1266                                  
  1267 00000837 8B35[CC810000]          	mov	esi, [Note]
  1268 0000083D 803D[BE810000]40        	cmp     byte [Row], 64
  1269 00000844 7268                    	jb      short NoPattWrap
  1270                                  
  1271 00000846 8B35[80140000]          	mov	esi, [ModInfo.Patterns]
  1272 0000084C 8A1D[BA810000]          	mov     bl, [OrderPos]
  1273 00000852 3A1D[FE130000]          	cmp     bl, [ModInfo.OrderLen]
  1274 00000858 7214                    	jb      short NoOrderWrap
  1275 0000085A 8A1D[FF130000]          	mov     bl, [ModInfo.ReStart]
  1276 00000860 881D[BA810000]          	mov     [OrderPos], bl
  1277 00000866 3A1D[FE130000]          	cmp     bl, [ModInfo.OrderLen]
  1278 0000086C 7364                    	jae     short NoUpdate
  1279                                  NoOrderWrap:    
  1280                                  	;xor	bh, bh
  1281 0000086E 81E3FF000000            	and	ebx, 0FFh
  1282 00000874 8A9B[00140000]          	mov     bl, [ModInfo.Order+ebx]
  1283                                  	; 05/10/2017
  1284                                  	;shl	ebx, 10 ; *1024
  1285 0000087A 8A0D[FE0E0000]          	mov	cl, [pattern_shift] ; 10 or 11
  1286 00000880 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1287                                  	;
  1288 00000882 01DE                    	add     esi, ebx
  1289 00000884 8A1D[BF810000]          	mov     bl, [BreakRow]
  1290 0000088A 881D[BE810000]          	mov     [Row], bl
  1291                                  	;xor	bh, bh
  1292 00000890 81E3FF000000            	and	ebx, 0FFh
  1293 00000896 883D[BF810000]          	mov     [BreakRow], bh ; 0
  1294 0000089C 66C1E304                	shl     bx, 4
  1295 000008A0 01DE                    	add     esi, ebx
  1296 000008A2 8935[CC810000]          	mov     [Note], esi
  1297 000008A8 FE05[BA810000]          	inc     byte [OrderPos]
  1298                                  NoPattWrap:     
  1299 000008AE FE05[BE810000]          	inc     byte [Row]
  1300                                  
  1301                                  	;cld
  1302                                  	;mov	ecx, NumTracks
  1303 000008B4 0FB70D[FF0E0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1304 000008BB BF[D0810000]            	mov	edi, Tracks
  1305                                  GetTracks_next:
  1306 000008C0 51                      	push	ecx	
  1307 000008C1 E858FDFFFF              	call	GetTrack ; readchannel
  1308 000008C6 59                      	pop	ecx
  1309 000008C7 83C726                  	add	edi, TrackInfo.size
  1310 000008CA E2F4                    	loop	GetTracks_next
  1311                                  
  1312 000008CC 8935[CC810000]          	mov     [Note], esi
  1313                                  NoUpdate:
  1314 000008D2 C3                      	retn
  1315                                  
  1316                                  ;--------------------------------------------------------------------------
  1317                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1318                                  ;  In:
  1319                                  ;   ds:si -  Track Info Address.
  1320                                  ;   ds:di -  Buffer Address.
  1321                                  ;    cx   -  Buffer Size.
  1322                                  ;--------------------------------------------------------------------------
  1323                                  
  1324                                  ; esi = Track info address
  1325                                  ; edi = Buffer address
  1326                                  ; ecx = Buffer size
  1327                                  
  1328                                  MixTrack:
  1329 000008D3 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1330 000008D8 7752                    	ja      short MixLooped
  1331                                  MixNonLooped:   
  1332 000008DA 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1333 000008DC 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1334 000008DF 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1335 000008E3 52                      	push    edx
  1336 000008E4 56                      	push    esi
  1337 000008E5 01D3                    	add     ebx, edx
  1338 000008E7 01D5                    	add     ebp, edx
  1339 000008E9 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1340                                  	; 01/10/2017
  1341                                  	;mov	al, [esi+TrackInfo.Volume]
  1342 000008ED 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1343                                  	; ah = [esi+TrackInfo.VolDiff]
  1344 000008F1 00E0                    	add	al, ah ; ****** 
  1345 000008F3 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1346 000008F7 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1347 000008FA 89DE                    	mov     esi, ebx
  1348 000008FC 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1349 000008FE 88C7                    	mov     bh, al
  1350 00000900 88D0                    	mov     al, dl
  1351 00000902 88F2                    	mov     dl, dh
  1352                                  	;xor	dh, dh
  1353 00000904 81E2FF000000            	and	edx, 0FFh
  1354                                  nlMixSamp:      
  1355 0000090A 39EE                    	cmp     esi, ebp
  1356 0000090C 7311                    	jae     short nlMixBye
  1357 0000090E 8A1E                    	mov     bl, [esi]
  1358                                  	;mov	bl, [VolTable+bx]
  1359 00000910 8A9B[BA300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1360 00000916 001F                    	add     [edi], bl
  1361 00000918 47                      	inc     edi
  1362 00000919 00C4                    	add     ah, al
  1363 0000091B 11D6                    	adc     esi, edx
  1364 0000091D E2EB                    	loop    nlMixSamp
  1365                                  nlMixBye:       
  1366 0000091F 89F3                    	mov     ebx, esi
  1367 00000921 5E                      	pop     esi
  1368 00000922 5A                      	pop     edx
  1369 00000923 29D3                    	sub     ebx, edx
  1370 00000925 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1371 00000928 88661D                  	mov     [esi+TrackInfo.Error], ah
  1372 0000092B C3                      	retn
  1373                                  MixLooped:
  1374 0000092C 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1375 0000092E 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1376 00000931 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1377 00000935 892D[C8810000]          	mov     [BufRep], ebp
  1378                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1379 0000093B 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1380 0000093F 52                      	push    edx
  1381 00000940 56                      	push    esi
  1382 00000941 01D3                    	add     ebx, edx
  1383 00000943 01D5                    	add     ebp, edx
  1384 00000945 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1385                                  	; 01/10/2017
  1386                                  	;mov	al, [esi+TrackInfo.Volume]
  1387 00000949 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1388                                  	; ah = [esi+TrackInfo.VolDiff]
  1389 0000094D 00E0                    	add	al, ah ; ****** 
  1390 0000094F C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1391 00000953 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1392                                  	;mov	si, bx
  1393 00000956 89DE                    	mov	esi, ebx ; 04/09/2017
  1394 00000958 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1395 0000095A 88C7                    	mov     bh, al
  1396 0000095C 88D0                    	mov     al, dl
  1397 0000095E 88F2                    	mov     dl, dh
  1398                                  	;xor	dh, dh
  1399 00000960 81E2FF000000            	and	edx, 0FFh
  1400                                  lpMixSamp:      
  1401 00000966 39EE                    	cmp     esi, ebp
  1402 00000968 7206                    	jb      short lpMixNow
  1403 0000096A 2B35[C8810000]          	sub     esi, [BufRep]
  1404                                  lpMixNow:       
  1405 00000970 8A1E                    	mov     bl, [esi]
  1406                                  	;mov	bl, [VolTable+bx]
  1407 00000972 8A9B[BA300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1408 00000978 001F                    	add     [edi], bl
  1409 0000097A 47                      	inc     edi
  1410 0000097B 00C4                    	add     ah, al
  1411 0000097D 11D6                    	adc	esi, edx
  1412 0000097F E2E5                    	loop    lpMixSamp
  1413                                  lpMixBye:       
  1414                                  ;	mov     ebx, esi
  1415                                  ;	pop     esi
  1416                                  ;	pop     edx
  1417                                  ;	sub     ebx, edx
  1418                                  ;	mov     [esi+TrackInfo.Position], ebx
  1419                                  ;	mov     [esi+TrackInfo.Error], ah
  1420                                  ;	retn
  1421 00000981 EB9C                    	jmp	short nlMixBye
  1422                                  
  1423                                  ;--------------------------------------------------------------------------
  1424                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1425                                  ;  In:
  1426                                  ;    Buffer  - Buffer Address.
  1427                                  ;    Count   - Buffer Size.
  1428                                  ;--------------------------------------------------------------------------
  1429                                  
  1430                                  ;--------------------------------------------------------------------------
  1431                                  ; mixpoll - updates the output buffer
  1432                                  ;--------------------------------------------------------------------------
  1433                                  ;
  1434                                  ;--------------------------------------------------------------------------
  1435                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1436                                  ;  In:
  1437                                  ;    Buffer  - Buffer Address.
  1438                                  ;    Count   - Buffer Size.
  1439                                  ;--------------------------------------------------------------------------
  1440                                  
  1441                                  mixpoll:
  1442                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1443                                  	; edi = buffer address
  1444                                  	; ebx = count
  1445                                  
  1446 00000983 60                      	pushad
  1447                                  
  1448                                  	;cld
  1449                                  NextChunk:      
  1450 00000984 66833D[C6810000]00      	cmp     word [BufLen], 0
  1451 0000098C 754A                    	jne     short CopyChunk
  1452                                  
  1453 0000098E 53                      	push    ebx
  1454 0000098F 57                      	push    edi
  1455                                  MixChunk:       
  1456 00000990 BF[BA710000]            	mov	edi, MixBuffer
  1457 00000995 0FB70D[C0810000]        	movzx	ecx, word [BpmSamples]
  1458                                  	;mov	cx, [BpmSamples]
  1459 0000099C 893D[C2810000]          	mov     [BufPtr], edi
  1460 000009A2 66890D[C6810000]        	mov     [BufLen], cx
  1461                                  
  1462 000009A9 B080                    	mov     al, 80h
  1463 000009AB F3AA                    	rep     stosb
  1464                                  
  1465                                  	;mov	cx, NumTracks
  1466                                  	;mov	cl, NumTracks ; 01/10/2017
  1467 000009AD 8A0D[FF0E0000]          	mov	cl, [numtracks] ; 06/10/2017
  1468 000009B3 BE[AA810000]            	mov	esi, Tracks - TrackInfo.size
  1469                                  GetSamples_next:
  1470 000009B8 51                      	push	ecx
  1471 000009B9 83C626                  	add	esi, TrackInfo.size
  1472 000009BC 668B0D[C6810000]        	mov	cx, [BufLen]
  1473 000009C3 8B3D[C2810000]          	mov	edi, [BufPtr]
  1474 000009C9 E805FFFFFF              	call	MixTrack
  1475 000009CE 59                      	pop	ecx
  1476 000009CF E2E7                    	loop	GetSamples_next	
  1477                                  
  1478 000009D1 E838FEFFFF              	call    UpdateTracks
  1479                                  
  1480 000009D6 5F                      	pop     edi
  1481 000009D7 5B                      	pop     ebx
  1482                                  CopyChunk:      
  1483                                  	;mov	cx, [BufLen]
  1484 000009D8 0FB70D[C6810000]        	movzx	ecx, word [BufLen]
  1485 000009DF 39D9                    	cmp	ecx, ebx
  1486                                  	;cmp	cx, bx
  1487 000009E1 7602                    	jbe     short MoveChunk
  1488                                  	;mov	cx, bx
  1489 000009E3 89D9                    	mov     ecx, ebx
  1490                                  MoveChunk:
  1491 000009E5 8B35[C2810000]          	mov     esi, [BufPtr]
  1492 000009EB 010D[C2810000]          	add     [BufPtr], ecx
  1493 000009F1 66290D[C6810000]        	sub     [BufLen], cx
  1494 000009F8 29CB                    	sub     ebx, ecx
  1495 000009FA F3A4                    	rep     movsb
  1496 000009FC 85DB                    	test    ebx, ebx
  1497 000009FE 7584                    	jnz     short NextChunk
  1498                                  
  1499 00000A00 61                      	popad	
  1500 00000A01 C3                      	retn
  1501                                  
  1502                                  ;--------------------------------------------------------------------------
  1503                                  ; StartPlaying: Initializes the Sound System.
  1504                                  ;  In:
  1505                                  ;   Module Information Resources.
  1506                                  ;--------------------------------------------------------------------------
  1507                                  
  1508                                  StartPlaying:
  1509                                  	; 07/10/2017
  1510 00000A02 60                      	pushad
  1511                                  SetModParms:    
  1512 00000A03 C605[BA810000]00        	mov     byte [OrderPos], 0
  1513 00000A0A C605[BB810000]06        	mov     byte [Tempo], DefTempo
  1514 00000A11 C605[BC810000]06        	mov     byte [TempoWait], DefTempo
  1515 00000A18 C605[BD810000]7D        	mov     byte [Bpm], DefBpm
  1516 00000A1F C605[BE810000]40        	mov     byte [Row], 64
  1517 00000A26 C605[BF810000]00        	mov     byte [BreakRow], 0
  1518 00000A2D 66A1[030F0000]          	mov     ax, [MixSpeed]
  1519 00000A33 31D2                    	xor     edx, edx
  1520 00000A35 66BB3200                	mov     bx, 24*DefBpm/60
  1521 00000A39 66F7F3                  	div     bx
  1522 00000A3C 66A3[C0810000]          	mov     [BpmSamples], ax
  1523                                  ClearTracks:    
  1524 00000A42 BF[D0810000]            	mov     edi, Tracks
  1525                                  	; 06/10/2017
  1526                                  	;mov	ecx, NumTracks*TrackInfo.size
  1527 00000A47 B826000000              	mov	eax, TrackInfo.size
  1528 00000A4C 0FB70D[FF0E0000]        	movzx	ecx, word [numtracks]
  1529 00000A53 F7E1                    	mul	ecx
  1530 00000A55 89C1                    	mov	ecx, eax
  1531 00000A57 31C0                    	xor     eax, eax
  1532                                  	;cld
  1533 00000A59 F3AA                    	rep     stosb
  1534                                  
  1535 00000A5B A3[C2810000]            	mov     [BufPtr], eax
  1536 00000A60 66A3[C6810000]          	mov     [BufLen], ax
  1537                                  MakePitch:
  1538 00000A66 66B80021                	mov     ax, MidCRate
  1539 00000A6A 66BBAC01                	mov     bx, 428
  1540 00000A6E 66F7E3                  	mul     bx
  1541 00000A71 66F735[030F0000]        	div     word [MixSpeed]
  1542 00000A78 30F6                    	xor     dh, dh
  1543 00000A7A 88E2                    	mov     dl, ah
  1544 00000A7C 88C4                    	mov     ah, al
  1545 00000A7E 30C0                    	xor     al, al
  1546                                  	;mov	cx, 857
  1547 00000A80 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1548 00000A84 31DB                    	xor     ebx, ebx
  1549 00000A86 BF[F8150000]            	mov     edi, PitchTable
  1550                                  PitchLoop:      
  1551 00000A8B 50                      	push    eax
  1552 00000A8C 52                      	push    edx
  1553 00000A8D 6639DA                  	cmp     dx, bx
  1554 00000A90 7303                    	jae     short NoDiv
  1555 00000A92 66F7F3                  	div     bx
  1556                                  NoDiv:          
  1557 00000A95 66AB                    	stosw
  1558 00000A97 5A                      	pop     edx
  1559 00000A98 58                      	pop     eax
  1560                                  	;inc	bx
  1561 00000A99 43                      	inc	ebx
  1562 00000A9A E2EF                    	loop    PitchLoop
  1563                                  MakeVolume:     
  1564 00000A9C 66B90041                	mov     cx, 16640
  1565 00000AA0 89CB                    	mov     ebx, ecx
  1566                                  VolLoop:
  1567 00000AA2 664B                    	dec     bx
  1568 00000AA4 88D8                    	mov     al, bl
  1569 00000AA6 F6EF                    	imul    bh
  1570                                  	;mov	[VolTable+bx], ah
  1571 00000AA8 88A3[BA300000]          	mov     [VolTable+ebx], ah
  1572 00000AAE E2F2                    	loop    VolLoop
  1573                                  
  1574 00000AB0 61                      	popad
  1575 00000AB1 C3                      	retn
  1576                                  
  1577                                  ;--------------------------------------------------------------------------
  1578                                  ; StopPlaying: ShutDown the Sound System.
  1579                                  ;--------------------------------------------------------------------------
  1580                                  
  1581                                  StopPlaying:
  1582                                  	; 19/06/2017
  1583                                  	; Stop Playing
  1584                                  	sys	_audio, 0700h
  1584                              <1> 
  1584                              <1> 
  1584                              <1> 
  1584                              <1> 
  1584                              <1>  %if %0 >= 2
  1584 00000AB2 BB00070000          <1>  mov ebx, %2
  1584                              <1>  %if %0 >= 3
  1584                              <1>  mov ecx, %3
  1584                              <1>  %if %0 = 4
  1584                              <1>  mov edx, %4
  1584                              <1>  %endif
  1584                              <1>  %endif
  1584                              <1>  %endif
  1584 00000AB7 B820000000          <1>  mov eax, %1
  1584                              <1> 
  1584 00000ABC CD40                <1>  int 40h
  1585                                  	; Cancel callback service (for user)
  1586                                  	sys	_audio, 0900h
  1586                              <1> 
  1586                              <1> 
  1586                              <1> 
  1586                              <1> 
  1586                              <1>  %if %0 >= 2
  1586 00000ABE BB00090000          <1>  mov ebx, %2
  1586                              <1>  %if %0 >= 3
  1586                              <1>  mov ecx, %3
  1586                              <1>  %if %0 = 4
  1586                              <1>  mov edx, %4
  1586                              <1>  %endif
  1586                              <1>  %endif
  1586                              <1>  %endif
  1586 00000AC3 B820000000          <1>  mov eax, %1
  1586                              <1> 
  1586 00000AC8 CD40                <1>  int 40h
  1587                                  	; Deallocate Audio Buffer (for user)
  1588                                  	sys	_audio, 0A00h
  1588                              <1> 
  1588                              <1> 
  1588                              <1> 
  1588                              <1> 
  1588                              <1>  %if %0 >= 2
  1588 00000ACA BB000A0000          <1>  mov ebx, %2
  1588                              <1>  %if %0 >= 3
  1588                              <1>  mov ecx, %3
  1588                              <1>  %if %0 = 4
  1588                              <1>  mov edx, %4
  1588                              <1>  %endif
  1588                              <1>  %endif
  1588                              <1>  %endif
  1588 00000ACF B820000000          <1>  mov eax, %1
  1588                              <1> 
  1588 00000AD4 CD40                <1>  int 40h
  1589                                  	; Disable Audio Device
  1590                                  	sys	_audio, 0C00h
  1590                              <1> 
  1590                              <1> 
  1590                              <1> 
  1590                              <1> 
  1590                              <1>  %if %0 >= 2
  1590 00000AD6 BB000C0000          <1>  mov ebx, %2
  1590                              <1>  %if %0 >= 3
  1590                              <1>  mov ecx, %3
  1590                              <1>  %if %0 = 4
  1590                              <1>  mov edx, %4
  1590                              <1>  %endif
  1590                              <1>  %endif
  1590                              <1>  %endif
  1590 00000ADB B820000000          <1>  mov eax, %1
  1590                              <1> 
  1590 00000AE0 CD40                <1>  int 40h
  1591                                  
  1592 00000AE2 C3                      	retn
  1593                                  
  1594                                  ; 24/06/2017
  1595                                  ;--------------------------------------------------------------------------
  1596                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1597                                  ;--------------------------------------------------------------------------
  1598                                  ; This Conversion is needed for AC'97 hardware 
  1599                                  ; which ony supports 16 bit stereo samples !
  1600                                  
  1601                                  ; source = temp_buffer (8192 bytes)
  1602                                  ; destination = Audio_Buffer (32768 bytes)
  1603                                  
  1604                                  ConvertSamples:
  1605                                  	; 24/06/2017
  1606 00000AE3 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1607 00000AE8 BE[00100100]            	mov	esi, temp_buffer
  1608 00000AED BF[00900000]            	mov	edi, Audio_Buffer
  1609                                  c_smpl_1:
  1610 00000AF2 AC                      	lodsb	; get 8 bit mono sample
  1611 00000AF3 20C0                    	and	al, al
  1612 00000AF5 7506                    	jnz	short c_smpl_2
  1613 00000AF7 66B80080                	mov	ax, 8000h
  1614 00000AFB EB06                    	jmp	short c_smpl_3
  1615                                  c_smpl_2:
  1616 00000AFD 2C80                    	sub	al, 80h	
  1617 00000AFF 88C4                    	mov	ah, al
  1618 00000B01 28C0                    	sub	al, al
  1619                                  c_smpl_3:	
  1620 00000B03 6689C2                  	mov	dx, ax
  1621 00000B06 C1E010                  	shl	eax, 16
  1622 00000B09 6689D0                  	mov	ax, dx
  1623 00000B0C AB                      	stosd	; save 16 bit stereo sample
  1624 00000B0D E2E3                    	loop 	c_smpl_1
  1625                                  	
  1626 00000B0F C3                      	retn
  1627                                  
  1628                                  ;=============================================================================
  1629                                  ; 
  1630                                  ;=============================================================================
  1631                                  
  1632                                  ;dword2str:
  1633                                  ;	; 13/11/2016 - Erdogan Tan 
  1634                                  ;	; eax = dword value
  1635                                  ;	;
  1636                                  ;	call	dwordtohex
  1637                                  ;	mov	[dword_str], edx
  1638                                  ;	mov	[dword_str+4], eax
  1639                                  ;	mov	si, dword_str
  1640                                  ;	retn
  1641                                  
  1642                                  	; 05/03/2017 (TRDOS 386)
  1643                                  	; trdos386.s (unix386.s) - 10/05/2015
  1644                                  	; Convert binary number to hexadecimal string
  1645                                  
  1646                                  ;bytetohex:
  1647                                  ;	; INPUT ->
  1648                                  ;	; 	AL = byte (binary number)
  1649                                  ;	; OUTPUT ->
  1650                                  ;	;	AX = hexadecimal string
  1651                                  ;	;
  1652                                  ;	push	ebx
  1653                                  ;	movzx	ebx, al
  1654                                  ;	shr	bl, 4
  1655                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1656                                  ;	xchg	bl, al
  1657                                  ;	and	bl, 0Fh
  1658                                  ;	mov	ah, [ebx+hex_chars] 
  1659                                  ;	pop	ebx	
  1660                                  ;	retn
  1661                                  
  1662                                  ;wordtohex:
  1663                                  ;	; INPUT ->
  1664                                  ;	; 	AX = word (binary number)
  1665                                  ;	; OUTPUT ->
  1666                                  ;	;	EAX = hexadecimal string
  1667                                  ;	;
  1668                                  ;	push	ebx
  1669                                  ;	xor	ebx, ebx
  1670                                  ;	xchg	ah, al
  1671                                  ;	push	eax
  1672                                  ;	mov	bl, ah
  1673                                  ;	shr	bl, 4
  1674                                  ;	mov	al, [ebx+hex_chars] 	 	
  1675                                  ;	mov	bl, ah
  1676                                  ;	and	bl, 0Fh
  1677                                  ;	mov	ah, [ebx+hex_chars]
  1678                                  ;	shl	eax, 16
  1679                                  ;	pop	eax
  1680                                  ;	pop	ebx
  1681                                  ;	jmp	short bytetohex
  1682                                  
  1683                                  ;dwordtohex:
  1684                                  ;	; INPUT ->
  1685                                  ;	; 	EAX = dword (binary number)
  1686                                  ;	; OUTPUT ->
  1687                                  ;	;	EDX:EAX = hexadecimal string
  1688                                  ;	;
  1689                                  ;	push	eax
  1690                                  ;	shr	eax, 16
  1691                                  ;	call	wordtohex
  1692                                  ;	mov	edx, eax
  1693                                  ;	pop	eax
  1694                                  ;	call	wordtohex
  1695                                  ;	retn
  1696                                  
  1697                                  	; 24/06/2017
  1698                                  	; 19/06/2017
  1699                                  	; 05/03/2017 (TRDOS 386)
  1700                                  	; 13/11/2016 - Erdogan Tan
  1701                                  write_audio_dev_info:
  1702                                  	; BUS/DEV/FN
  1703                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1704                                  	; DEV/VENDOR
  1705                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1706                                  
  1707 00000B10 8B35[AC0F0000]          	mov	esi, [dev_vendor]
  1708 00000B16 6689F0                  	mov	ax, si
  1709 00000B19 0FB6D8                  	movzx	ebx, al
  1710 00000B1C 88DA                    	mov	dl, bl
  1711 00000B1E 80E30F                  	and	bl, 0Fh
  1712 00000B21 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1713 00000B27 A2[4A0F0000]            	mov	[msgVendorId+3], al
  1714 00000B2C 88D3                    	mov	bl, dl
  1715 00000B2E C0EB04                  	shr	bl, 4
  1716 00000B31 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1717 00000B37 A2[490F0000]            	mov	[msgVendorId+2], al
  1718 00000B3C 88E3                    	mov	bl, ah
  1719 00000B3E 88DA                    	mov	dl, bl
  1720 00000B40 80E30F                  	and	bl, 0Fh
  1721 00000B43 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1722 00000B49 A2[480F0000]            	mov	[msgVendorId+1], al
  1723 00000B4E 88D3                    	mov	bl, dl
  1724 00000B50 C0EB04                  	shr	bl, 4
  1725 00000B53 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1726 00000B59 A2[470F0000]            	mov	[msgVendorId], al
  1727 00000B5E C1EE10                  	shr	esi, 16
  1728 00000B61 6689F0                  	mov	ax, si
  1729 00000B64 88C3                    	mov	bl, al
  1730 00000B66 88DA                    	mov	dl, bl
  1731 00000B68 80E30F                  	and	bl, 0Fh
  1732 00000B6B 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1733 00000B71 A2[5B0F0000]            	mov	[msgDevId+3], al
  1734 00000B76 88D3                    	mov	bl, dl
  1735 00000B78 C0EB04                  	shr	bl, 4
  1736 00000B7B 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1737 00000B81 A2[5A0F0000]            	mov	[msgDevId+2], al
  1738 00000B86 88E3                    	mov	bl, ah
  1739 00000B88 88DA                    	mov	dl, bl
  1740 00000B8A 80E30F                  	and	bl, 0Fh
  1741 00000B8D 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1742 00000B93 A2[590F0000]            	mov	[msgDevId+1], al
  1743 00000B98 88D3                    	mov	bl, dl
  1744 00000B9A C0EB04                  	shr	bl, 4
  1745 00000B9D 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1746 00000BA3 A2[580F0000]            	mov	[msgDevId], al
  1747                                  
  1748 00000BA8 8B35[B00F0000]          	mov	esi, [bus_dev_fn]
  1749 00000BAE C1EE08                  	shr	esi, 8
  1750 00000BB1 6689F0                  	mov	ax, si
  1751 00000BB4 88C3                    	mov	bl, al
  1752 00000BB6 88DA                    	mov	dl, bl
  1753 00000BB8 80E307                  	and	bl, 7 ; bit 0,1,2
  1754 00000BBB 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1755 00000BC1 A2[7F0F0000]            	mov	[msgFncNo+1], al
  1756 00000BC6 88D3                    	mov	bl, dl
  1757 00000BC8 C0EB03                  	shr	bl, 3
  1758 00000BCB 88DA                    	mov	dl, bl
  1759 00000BCD 80E30F                  	and	bl, 0Fh
  1760 00000BD0 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1761 00000BD6 A2[710F0000]            	mov	[msgDevNo+1], al
  1762 00000BDB 88D3                    	mov	bl, dl
  1763 00000BDD C0EB04                  	shr	bl, 4
  1764 00000BE0 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1765 00000BE6 A2[700F0000]            	mov	[msgDevNo], al
  1766 00000BEB 88E3                    	mov	bl, ah
  1767 00000BED 88DA                    	mov	dl, bl
  1768 00000BEF 80E30F                  	and	bl, 0Fh
  1769 00000BF2 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1770 00000BF8 A2[650F0000]            	mov	[msgBusNo+1], al
  1771 00000BFD 88D3                    	mov	bl, dl
  1772 00000BFF C0EB04                  	shr	bl, 4
  1773 00000C02 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1774 00000C08 A2[640F0000]            	mov	[msgBusNo], al
  1775                                  
  1776                                  	; 24/06/2017
  1777 00000C0D 66A1[B80F0000]          	mov	ax, [ac97_NamBar]
  1778 00000C13 88C3                    	mov	bl, al
  1779 00000C15 88DA                    	mov	dl, bl
  1780 00000C17 80E30F                  	and	bl, 0Fh
  1781 00000C1A 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1782 00000C20 A2[8E0F0000]            	mov	[msgNamBar+3], al
  1783 00000C25 88D3                    	mov	bl, dl
  1784 00000C27 C0EB04                  	shr	bl, 4
  1785 00000C2A 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1786 00000C30 A2[8D0F0000]            	mov	[msgNamBar+2], al
  1787 00000C35 88E3                    	mov	bl, ah
  1788 00000C37 88DA                    	mov	dl, bl
  1789 00000C39 80E30F                  	and	bl, 0Fh
  1790 00000C3C 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1791 00000C42 A2[8C0F0000]            	mov	[msgNamBar+1], al
  1792 00000C47 88D3                    	mov	bl, dl
  1793 00000C49 C0EB04                  	shr	bl, 4
  1794 00000C4C 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1795 00000C52 A2[8B0F0000]            	mov	[msgNamBar], al
  1796                                  
  1797 00000C57 66A1[BA0F0000]          	mov	ax, [ac97_NabmBar]
  1798 00000C5D 88C3                    	mov	bl, al
  1799 00000C5F 88DA                    	mov	dl, bl
  1800 00000C61 80E30F                  	and	bl, 0Fh
  1801 00000C64 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1802 00000C6A A2[9E0F0000]            	mov	[msgNabmBar+3], al
  1803 00000C6F 88D3                    	mov	bl, dl
  1804 00000C71 C0EB04                  	shr	bl, 4
  1805 00000C74 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1806 00000C7A A2[9D0F0000]            	mov	[msgNabmBar+2], al
  1807 00000C7F 88E3                    	mov	bl, ah
  1808 00000C81 88DA                    	mov	dl, bl
  1809 00000C83 80E30F                  	and	bl, 0Fh
  1810 00000C86 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1811 00000C8C A2[9C0F0000]            	mov	[msgNabmBar+1], al
  1812 00000C91 88D3                    	mov	bl, dl
  1813 00000C93 C0EB04                  	shr	bl, 4
  1814 00000C96 8A83[050F0000]          	mov	al, [ebx+hex_chars]
  1815 00000C9C A2[9B0F0000]            	mov	[msgNabmBar], al
  1816                                  
  1817                                  	; 24/11/2016
  1818 00000CA1 30E4                    	xor	ah, ah
  1819 00000CA3 A0[BC0F0000]            	mov	al, [ac97_int_ln_reg]
  1820 00000CA8 B10A                    	mov	cl, 10
  1821 00000CAA F6F1                    	div	cl
  1822 00000CAC 660105[A70F0000]        	add	[msgIRQ], ax
  1823 00000CB3 20C0                    	and	al, al
  1824 00000CB5 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1825 00000CB7 A0[A80F0000]            	mov	al, [msgIRQ+1]
  1826 00000CBC B420                    	mov	ah, ' '
  1827 00000CBE 66A3[A70F0000]          	mov	[msgIRQ], ax
  1828                                  _w_ac97imsg_:
  1829                                  	; EBX = Message address
  1830                                  	; ECX = Max. message length (or stop on ZERO character)
  1831                                  	;	(1 to 255)
  1832                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1833                                       	sys 	_msg, msgAC97Info, 255, 07h
  1833                              <1> 
  1833                              <1> 
  1833                              <1> 
  1833                              <1> 
  1833                              <1>  %if %0 >= 2
  1833 00000CC4 BB[160F0000]        <1>  mov ebx, %2
  1833                              <1>  %if %0 >= 3
  1833 00000CC9 B9FF000000          <1>  mov ecx, %3
  1833                              <1>  %if %0 = 4
  1833 00000CCE BA07000000          <1>  mov edx, %4
  1833                              <1>  %endif
  1833                              <1>  %endif
  1833                              <1>  %endif
  1833 00000CD3 B823000000          <1>  mov eax, %1
  1833                              <1> 
  1833 00000CD8 CD40                <1>  int 40h
  1834 00000CDA C3                              retn
  1835                                  
  1836                                  ;=============================================================================
  1837                                  ;               preinitialized data
  1838                                  ;=============================================================================
  1839                                  
  1840                                  ;=============================================================================
  1841                                  ; Protracker effects stuff
  1842                                  ;=============================================================================
  1843                                  
  1844                                  ;-----------------------------------------------------------------------------
  1845                                  ; Effect jump tables
  1846                                  ;-----------------------------------------------------------------------------
  1847                                  
  1848 00000CDB 90                      align 4
  1849                                  
  1850                                  efxtable:
  1851 00000CDC [78070000]              	dd      efxarpeggio	; 0 - arpeggio
  1852 00000CE0 [A5040000]              	dd      efxnull		; 1 - porta up
  1853 00000CE4 [A5040000]              	dd      efxnull		; 2 - porta down
  1854 00000CE8 [C3060000]              	dd      efxtoneporta	; 3 - tone porta
  1855 00000CEC [D2060000]              	dd      efxvibrato	; 4 - vibrato
  1856 00000CF0 [A5040000]              	dd      efxnull		; 5 - tone+slide
  1857 00000CF4 [A5040000]              	dd      efxnull		; 6 - vibrato+slide
  1858 00000CF8 [EF070000]              	dd      efxtremolo	; 7 - tremolo
  1859 00000CFC [A5040000]              	dd      efxnull		; 8 - unused
  1860 00000D00 [FA060000]              	dd      efxsampoffset	; 9 - sample offset
  1861 00000D04 [A5040000]              	dd      efxnull		; A - volume slide
  1862 00000D08 [06070000]              	dd      efxpattjump	; B - pattern jump
  1863 00000D0C [14070000]              	dd      efxsetvolume	; C - set volume
  1864 00000D10 [22070000]              	dd      efxbreak	; D - break pattern
  1865 00000D14 [A5040000]              	dd      efxnull		; E - extra effects
  1866 00000D18 [41070000]              	dd      efxsetspeed	; F - set speed
  1867                                  
  1868                                  efxtable2:
  1869 00000D1C [A6040000]              	dd      efxarpeggio2	; 0 - arpeggio
  1870 00000D20 [C8040000]              	dd      efxportaup	; 1 - porta up
  1871 00000D24 [EE040000]              	dd      efxportadown	; 2 - porta down
  1872 00000D28 [15050000]              	dd      efxtoneporta2	; 3 - tone porta
  1873 00000D2C [4E050000]              	dd      efxvibrato2	; 4 - vibrato
  1874 00000D30 [AA050000]              	dd      efxtoneslide	; 5 - tone+slide
  1875 00000D34 [B7050000]              	dd      efxvibslide	; 6 - vibrato+slide
  1876 00000D38 [DE050000]              	dd      efxtremolo2	; 7 - tremolo
  1877 00000D3C [A5040000]              	dd      efxnull		; 8 - unused
  1878 00000D40 [A5040000]              	dd      efxnull		; 9 - sample offset
  1879 00000D44 [C1050000]              	dd      efxvolslide	; A - volume slide
  1880 00000D48 [A5040000]              	dd      efxnull		; B - pattern jump
  1881 00000D4C [A5040000]              	dd      efxnull		; C - set volume
  1882 00000D50 [A5040000]              	dd      efxnull		; D - break pattern
  1883 00000D54 [A5040000]              	dd      efxnull		; E - extra effects
  1884 00000D58 [A5040000]              	dd      efxnull		; F - set speed
  1885                                  
  1886                                  ;-----------------------------------------------------------------------------
  1887                                  ; Amiga period table
  1888                                  ;-----------------------------------------------------------------------------
  1889                                  
  1890                                  ;PeriodTable0:	
  1891                                  ;	dw	0
  1892                                  PeriodTable:
  1893 00000D5C 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1893 00000D65 0A000A7009E8086808-
  1893 00000D6E F00780071407       
  1894 00000D74 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1894 00000D7D 050005B80474043404-
  1894 00000D86 F803C0038A03       
  1895 00000D8C 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1895 00000D95 0280025C023A021A02-
  1895 00000D9E FC01E001C501       
  1896 00000DA4 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1896 00000DAD 0140012E011D010D01-
  1896 00000DB6 FE00F000E200       
  1897 00000DBC D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1897 00000DC5 00A00097008F008700-
  1897 00000DCE 7F0078007100       
  1898 00000DD4 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1898 00000DDD 0050004B0047004300-
  1898 00000DE6 3F003C003800       
  1899 00000DEC 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1899 00000DF5 002800250023002100-
  1899 00000DFE 1F001E001C00       
  1900                                  
  1901                                  ;-----------------------------------------------------------------------------
  1902                                  ; Sinus wave table
  1903                                  ;-----------------------------------------------------------------------------
  1904                                  
  1905                                  SinTable:
  1906 00000E04 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1906 00000E0D C5D4E1             
  1907 00000E10 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1907 00000E19 E1                 
  1908 00000E1A D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1908 00000E23 19                 
  1909                                  
  1910                                  ;=============================================================================
  1911                                  ; Copyright Strings & Messages
  1912                                  ;=============================================================================
  1913 00000E24 00                      	db	0
  1914                                  msg_2017:
  1915 00000E25 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1915 00000E2E 506C6179657220666F-
  1915 00000E37 72205452444F532033-
  1915 00000E40 383620627920457264-
  1915 00000E49 6F67616E2054616E2E-
  1915 00000E52 20                 
  1916 00000E53 4F63746F6265722032-     	db	'October 2017.',10,13
  1916 00000E5C 3031372E0A0D       
  1917 00000E62 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1917 00000E6B 64706C61792066696C-
  1917 00000E74 656E616D652E6D6F64-
  1917 00000E7D 0A0D00             
  1918 00000E80 31332F31302F323031-     	db	'13/10/2017',10,13,0
  1918 00000E89 370A0D00           
  1919                                  
  1920                                  Credits:
  1921 00000E8D 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1921 00000E96 506C61796572207630-
  1921 00000E9F 2E3162206279204361-
  1921 00000EA8 726C6F732048617361-
  1921 00000EB1 6E2E204A756C792031-
  1921 00000EBA 3939332E           
  1922 00000EBE 0A0D00                  	db	10,13,0
  1923                                  ErrorMesg:
  1924 00000EC1 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  1924 00000ECA 64696E67204D6F6475-
  1924 00000ED3 6C652066696C652E0A-
  1924 00000EDC 0D00               
  1925                                  
  1926                                  ;MsgNotFound: db	'Sound Blaster not found or IRQ error.',10,13,0
  1927                                  ;MsgFound:    db	'Sound Blaster found at Address 2'
  1928                                  ;PortText:    db	'x0h, IRQ '
  1929                                  ;IrqText:     db	'x.',10,13,0
  1930                                  
  1931                                  trdos386_err_msg:
  1932 00000EDE 5452444F5320333836-     	db	'TRDOS 386 System call error !', 10, 13,0
  1932 00000EE7 2053797374656D2063-
  1932 00000EF0 616C6C206572726F72-
  1932 00000EF9 20210A0D00         
  1933                                  
  1934                                  ; 07/10/2017
  1935 00000EFE 0A                      pattern_shift:	db 10
  1936 00000EFF 0400                    numtracks:	dw 4
  1937                                  
  1938                                  ;=============================================================================
  1939                                  ;               PLAYER.ASM - DATA
  1940                                  ;=============================================================================
  1941                                  
  1942 00000F01 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1943 00000F02 08                      bps:		db 8 ; bits per sample (8 or 16)
  1944                                  Sample_Rate:
  1945 00000F03 2256                    MixSpeed:	dw 22050 ; Hz
  1946                                  
  1947                                  ; 13/11/2016
  1948 00000F05 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1948 00000F0E 3941424344454600   
  1949                                  ;
  1950                                  msgAC97Info:	
  1951 00000F16 0D0A                    		db 0Dh, 0Ah
  1952 00000F18 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1952 00000F21 6F20436F6E74726F6C-
  1952 00000F2A 6C6572202620436F64-
  1952 00000F33 656320496E666F0D0A 
  1953 00000F3C 56656E646F72204944-     		db "Vendor ID: "
  1953 00000F45 3A20               
  1954 00000F47 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1954 00000F50 6963652049443A20   
  1955 00000F58 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1956 00000F5F 4275733A20              		db "Bus: "
  1957 00000F64 303068204465766963-     msgBusNo:	db "00h Device: "
  1957 00000F6D 653A20             
  1958 00000F70 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1958 00000F79 696F6E3A20         
  1959 00000F7E 303068                  msgFncNo	db "00h"
  1960 00000F81 0D0A                    		db 0Dh, 0Ah
  1961 00000F83 4E414D4241523A20        		db "NAMBAR: "
  1962 00000F8B 30303030682020          msgNamBar	db "0000h  "
  1963 00000F92 4E41424D4241523A20      		db "NABMBAR: "
  1964 00000F9B 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1964 00000FA4 513A20             
  1965 00000FA7 3030                    msgIRQ:		dw 3030h
  1966 00000FA9 0D0A00                  		db 0Dh, 0Ah, 0
  1967                                  
  1968                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1969                                  ;codec_id:	   dd 0
  1970                                  ;codec_chip_id:	   dd 0
  1971                                  ;codec_vendor_ids: dw 0
  1972                                  ;codec_chip_ids:   dw 0
  1973                                  
  1974                                  ;dword_str:	dd 30303030h, 30303030h
  1975                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1976                                  
  1977                                  ;=============================================================================
  1978                                  ;        	uninitialized data
  1979                                  ;=============================================================================
  1980                                  
  1981                                  bss_start:
  1982                                  
  1983                                  ABSOLUTE bss_start
  1984                                  
  1985                                  alignb 4
  1986                                  
  1987 00000FAC <res 00000004>          dev_vendor:	resd 1
  1988 00000FB0 <res 00000004>          bus_dev_fn:	resd 1
  1989 00000FB4 <res 00000004>          stats_cmd:	resd 1
  1990 00000FB8 <res 00000002>          ac97_NamBar:	resw 1
  1991 00000FBA <res 00000002>          ac97_NabmBar:	resw 1
  1992 00000FBC <res 00000001>          ac97_int_ln_reg: resb 1
  1993 00000FBD <res 00000001>          srb:		resb 1
  1994                                  
  1995                                  ; MODLOAD.ASM
  1996 00000FBE <res 00000004>          FileHandle:	resd 1
  1997 00000FC2 <res 0000043C>          Header:		resb ModHeader.size
  1998                                  
  1999                                  ; MODPLAY.ASM
  2000                                  ;MixSpeed:	    resw 1
  2001                                  
  2002                                  ModInfo:
  2003 000013FE <res 00000001>          ModInfo.OrderLen:   resb 1
  2004 000013FF <res 00000001>          ModInfo.ReStart:    resb 1
  2005 00001400 <res 00000080>          ModInfo.Order:	    resb 128
  2006 00001480 <res 00000004>          ModInfo.Patterns:   resd 1
  2007                                  
  2008 00001484 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2009 000014C2 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2010 00001500 <res 0000003E>          ModInfo.SampLen:    resw 31
  2011 0000153E <res 0000003E>          ModInfo.SampRep:    resw 31
  2012 0000157C <res 0000003E>          ModInfo.SampRepLen: resw 31
  2013 000015BA <res 0000003E>          ModInfo.SampVol:    resw 31
  2014                                  
  2015                                  ; MODPLAY.ASM
  2016                                  PitchTable:	;resw 857
  2017 000015F8 <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2018 000030BA <res 00004100>          VolTable:	resb 16640
  2019 000071BA <res 00001000>          MixBuffer       resb MixBufSize
  2020                                  
  2021                                  ; MODPLAY.ASM
  2022 000081BA <res 00000001>          OrderPos:	resb 1
  2023 000081BB <res 00000001>          Tempo:		resb 1
  2024 000081BC <res 00000001>          TempoWait:	resb 1
  2025 000081BD <res 00000001>          Bpm:		resb 1
  2026 000081BE <res 00000001>          Row:		resb 1
  2027 000081BF <res 00000001>          BreakRow:	resb 1
  2028 000081C0 <res 00000002>          BpmSamples:	resw 1
  2029 000081C2 <res 00000004>          BufPtr:		resd 1
  2030 000081C6 <res 00000002>          BufLen:		resw 1
  2031 000081C8 <res 00000004>          BufRep:		resd 1
  2032 000081CC <res 00000004>          Note:		resd 1
  2033                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2034                                  ; 07/10/2017
  2035 000081D0 <res 00000130>          Tracks:	resb TrackInfo.size*8
  2036                                  
  2037                                  alignb 16
  2038                                  
  2039                                  ; PLAY.ASM
  2040 00008300 <res 00000280>          Scope:		resw 320
  2041 00008580 <res 00000200>          RowOfs:		resw 256
  2042                                  
  2043                                  mod_file_name:
  2044 00008780 <res 00000050>          		resb 80
  2045                                  
  2046 000087D0 <res 00000830>          alignb 4096
  2047                                  
  2048                                  Audio_Buffer:
  2049 00009000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2050                                  temp_buffer:
  2051 00011000 <res 00002000>          		resb BUFFERSIZE / 4 ; 8192
  2052                                  
  2053 00013000 <res 0000D000>          alignb 65536
  2054                                  
  2055                                  DMA_Buffer:
  2056 00020000 <res 00010000>          		resb 65536	
  2057                                  file_buffer:
  2058 00030000 <res 00060000>          		resb 65536*6
  2059                                  EOF:
