     1                                  ; ****************************************************************************
     2                                  ; modplay2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY2.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[00000800]            	mov	ecx, EOF
   119 00000005 BF[900F0000]            	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 E800020000              	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[25020000]        <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 E9C2010000                      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 0F82BF010000            	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[70870000]            	mov	edi, mod_file_name
   145                                  ScanName:       
   146 0000004A AC                      	lodsb
   147 0000004B 84C0                    	test	al, al
   148 0000004D 0F84AD010000            	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[710E0000]        <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[00000100]        <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 0F8222010000            	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[A10F0000]        <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 0F8206010000            	jc	error_exit
   185                                  
   186                                  LoadMod:  
   187 000000C3 BF[70870000]            	mov	edi, mod_file_name
   188 000000C8 E81B020000              	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[A50E0000]        <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 E90D010000              	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 0F82CD000000            	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[A00F0000]            	mov	[ac97_int_ln_reg], al
   217 00000101 891D[900F0000]          	mov	[dev_vendor], ebx
   218 00000107 890D[940F0000]          	mov	[bus_dev_fn], ecx
   219 0000010D 668915[9C0F0000]        	mov	[ac97_NamBar], dx
   220                                  	;mov	[ac97_NamBar], dx
   221                                  	;shr	dx, 16
   222                                  	;mov	[ac97_NabmBar], dx
   223 00000114 8915[9C0F0000]          	mov	[ac97_NamBar], edx	
   224                                    
   225 0000011A E8D3090000              	call	write_audio_dev_info 
   226                                  
   227                                  PlayNow: 
   228 0000011F E8C0080000              	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[00800100]            	mov	edi, temp_buffer
   236 00000129 BB00200000              	mov	ebx, BUFFERSIZE / 4
   237 0000012E E832080000              	call	GetSamples
   238 00000133 0F8290000000            	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 E887090000              	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[70850000]        	mov     [RowOfs+ebx], dx
   254 0000014E 668993[72850000]        	mov     [RowOfs+ebx+2], dx
   255 00000155 6681C24001              	add     dx, 320
   256 0000015A 83C304                  	add     ebx, 4
   257 0000015D E2E8                    	loop    MakeOfs
   258                                  
   259                                  	; Set Master Volume Level
   260                                  	sys	_audio, 0B00h, 1D1Dh
   260                              <1> 
   260                              <1> 
   260                              <1> 
   260                              <1> 
   260                              <1>  %if %0 >= 2
   260 0000015F BB000B0000          <1>  mov ebx, %2
   260                              <1>  %if %0 >= 3
   260 00000164 B91D1D0000          <1>  mov ecx, %3
   260                              <1>  %if %0 = 4
   260                              <1>  mov edx, %4
   260                              <1>  %endif
   260                              <1>  %endif
   260                              <1>  %endif
   260 00000169 B820000000          <1>  mov eax, %1
   260                              <1> 
   260 0000016E CD40                <1>  int 40h
   261                                  
   262                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   263                                  	
   264                                  	; Start	to play
   265 00000170 A0[E60E0000]            	mov	al, [bps]
   266 00000175 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   267 00000178 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   268 0000017A 8A1D[E50E0000]          	mov	bl, [stmo]
   269 00000180 FECB                    	dec	bl
   270 00000182 08C3                    	or	bl, al
   271 00000184 668B0D[E70E0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   272 0000018B B704                    	mov	bh, 4 ; start to play	
   273                                  	sys	_audio
   273                              <1> 
   273                              <1> 
   273                              <1> 
   273                              <1> 
   273                              <1>  %if %0 >= 2
   273                              <1>  mov ebx, %2
   273                              <1>  %if %0 >= 3
   273                              <1>  mov ecx, %3
   273                              <1>  %if %0 = 4
   273                              <1>  mov edx, %4
   273                              <1>  %endif
   273                              <1>  %endif
   273                              <1>  %endif
   273 0000018D B820000000          <1>  mov eax, %1
   273                              <1> 
   273 00000192 CD40                <1>  int 40h
   274                                  
   275                                  	; 13/10/2017
   276                                          ; load 8192 bytes into audio buffer
   277 00000194 BF[00800100]                    mov	edi, temp_buffer
   278 00000199 BB00200000              	mov	ebx, BUFFERSIZE / 4
   279 0000019E E8C2070000              	call	GetSamples
   280 000001A3 7224                    	jc	error_exit
   281                                  
   282                                  	; 8 bit to 16 bit (*2)
   283                                  	; mono to stereo (*2)
   284                                  	; 4* (BUFFERSIZE/4) 
   285                                  	; source = temp_buffer
   286                                  	; destination = Audio_Buffer
   287 000001A5 E81B090000              	call 	ConvertSamples
   288                                  
   289                                  	; bh = 16 : update (current) dma half buffer
   290                                  	; bl = 0  : then switch to the next half buffer
   291                                  	sys	_audio, 1000h
   291                              <1> 
   291                              <1> 
   291                              <1> 
   291                              <1> 
   291                              <1>  %if %0 >= 2
   291 000001AA BB00100000          <1>  mov ebx, %2
   291                              <1>  %if %0 >= 3
   291                              <1>  mov ecx, %3
   291                              <1>  %if %0 = 4
   291                              <1>  mov edx, %4
   291                              <1>  %endif
   291                              <1>  %endif
   291                              <1>  %endif
   291 000001AF B820000000          <1>  mov eax, %1
   291                              <1> 
   291 000001B4 CD40                <1>  int 40h
   292                                      
   293                                  	;; SETUP SIGNAL RESPONSE BYTE
   294                                  	;; 06/03/2017
   295                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   296                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   297                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   298                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   299                                  	;sys	_calbac
   300                                  	;jc	short error_exit
   301                                  
   302                                  	; DIRECT VGA MEMORY ACCESS
   303                                  	; bl = 0, bh = 5
   304                                  	; Direct access/map to VGA memory (0A0000h)
   305                                  
   306                                  	sys	_video, 0500h
   306                              <1> 
   306                              <1> 
   306                              <1> 
   306                              <1> 
   306                              <1>  %if %0 >= 2
   306 000001B6 BB00050000          <1>  mov ebx, %2
   306                              <1>  %if %0 >= 3
   306                              <1>  mov ecx, %3
   306                              <1>  %if %0 = 4
   306                              <1>  mov edx, %4
   306                              <1>  %endif
   306                              <1>  %endif
   306                              <1>  %endif
   306 000001BB B81F000000          <1>  mov eax, %1
   306                              <1> 
   306 000001C0 CD40                <1>  int 40h
   307 000001C2 3D00000A00              	cmp	eax, 0A0000h
   308 000001C7 7418                    	je	short _a3
   309                                  error_exit:
   310                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1>  %if %0 >= 2
   310 000001C9 BB[C20E0000]        <1>  mov ebx, %2
   310                              <1>  %if %0 >= 3
   310 000001CE B9FF000000          <1>  mov ecx, %3
   310                              <1>  %if %0 = 4
   310 000001D3 BA0E000000          <1>  mov edx, %4
   310                              <1>  %endif
   310                              <1>  %endif
   310                              <1>  %endif
   310 000001D8 B823000000          <1>  mov eax, %1
   310                              <1> 
   310 000001DD CD40                <1>  int 40h
   311 000001DF EB16                    	jmp	short Exit
   312                                  
   313                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   314                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   315                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   316                                  ;       second, or the module will sound "looped".
   317                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   318                                  ;       the polling is called from my routine, and then the irq 0 must be
   319                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   320                                  ;       samples played by the Sound Blaster. Note that some samples are
   321                                  ;       discarded in the next code, just for fun!
   322                                  
   323                                  _a3:
   324 000001E1 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   325 000001E5 CD31                    	int     31h
   326                                  
   327                                  	; 24/06/2017
   328 000001E7 E864000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   329                                  
   330                                  _s_exit:
   331 000001EC E8A3080000              	call	StopPlaying	; STOP!
   332                                  
   333 000001F1 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   334 000001F5 CD31                    	int     31h
   335                                  Exit:           
   336                                  	;call    FreeModule	; Free MODule core.
   337                                  	
   338                                  	sys 	_exit	; Bye !
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1>  %if %0 >= 2
   338                              <1>  mov ebx, %2
   338                              <1>  %if %0 >= 3
   338                              <1>  mov ecx, %3
   338                              <1>  %if %0 = 4
   338                              <1>  mov edx, %4
   338                              <1>  %endif
   338                              <1>  %endif
   338                              <1>  %endif
   338 000001F7 B801000000          <1>  mov eax, %1
   338                              <1> 
   338 000001FC CD40                <1>  int 40h
   339                                  here:
   340 000001FE EBFE                    	jmp	short here
   341                                  
   342                                  pmsg_2017:
   343                                  	sys	_msg, msg_2017, 255, 0Fh
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1> 
   343                              <1>  %if %0 >= 2
   343 00000200 BB[090E0000]        <1>  mov ebx, %2
   343                              <1>  %if %0 >= 3
   343 00000205 B9FF000000          <1>  mov ecx, %3
   343                              <1>  %if %0 = 4
   343 0000020A BA0F000000          <1>  mov edx, %4
   343                              <1>  %endif
   343                              <1>  %endif
   343                              <1>  %endif
   343 0000020F B823000000          <1>  mov eax, %1
   343                              <1> 
   343 00000214 CD40                <1>  int 40h
   344 00000216 EBDF                    	jmp	short Exit
   345                                  
   346                                  DetectICH:
   347                                  	; 24/06/2017
   348                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   349                                          sys	_audio, 0102h
   349                              <1> 
   349                              <1> 
   349                              <1> 
   349                              <1> 
   349                              <1>  %if %0 >= 2
   349 00000218 BB02010000          <1>  mov ebx, %2
   349                              <1>  %if %0 >= 3
   349                              <1>  mov ecx, %3
   349                              <1>  %if %0 = 4
   349                              <1>  mov edx, %4
   349                              <1>  %endif
   349                              <1>  %endif
   349                              <1>  %endif
   349 0000021D B820000000          <1>  mov eax, %1
   349                              <1> 
   349 00000222 CD40                <1>  int 40h
   350 00000224 C3                      	retn
   351                                  
   352                                  noDevMsg:
   353 00000225 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   353 0000022E 61626C6520746F2066-
   353 00000237 696E64204143393720-
   353 00000240 617564696F20646576-
   353 00000249 696365210D0A00     
   354                                  
   355                                  ;ac97_int_handler:
   356                                  ;	; 19/06/2017
   357                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   358                                  ;
   359                                  ;	sys	_rele ; return from callback service 
   360                                  ;	; we must not come here !
   361                                  ;	sys	_exit
   362                                  
   363                                  ;=============================================================================
   364                                  ;      
   365                                  ;=============================================================================
   366                                  
   367                                  PlayMod:
   368                                  	; 13/10/2017
   369                                  	; 23/06/2017   
   370                                  	; 21/06/2017
   371                                  	; 19/06/2017
   372                                  
   373                                  	; 05/03/2017 (TRDOS 386)
   374                                  	; 14/02/2017
   375                                  	; 13/02/2017
   376                                  	; 08/12/2016
   377                                  	; 28/11/2016
   378                                  
   379                                  	; 13/10/2017
   380                                  	;jmp	short modp_gs ; 23/06/2017
   381                                  p_loop:
   382 00000250 803D[A10F0000]00        	cmp	byte [srb], 0
   383 00000257 7621                    	jna	short q_loop
   384 00000259 C605[A10F0000]00        	mov	byte [srb], 0
   385                                  modp_gs:
   386                                  	;mov	edi, Audio_Buffer
   387                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   388                                  	;call	GetSamples
   389                                  
   390                                  	; 24/06/2017
   391                                          ; load 8192 bytes into audio buffer
   392 00000260 BF[00800100]            	mov	edi, temp_buffer
   393 00000265 BB00200000              	mov	ebx, BUFFERSIZE / 4
   394 0000026A E8F6060000              	call	GetSamples
   395 0000026F 0F8254FFFFFF            	jc	error_exit
   396                                  
   397                                  	; 24/06/2017
   398                                  	; 8 bit to 16 bit (*2)
   399                                  	; mono to stereo (*2)
   400                                  	; 4* (BUFFERSIZE/4) 
   401                                  	; source = temp_buffer
   402                                  	; destination = Audio_Buffer
   403 00000275 E84B080000              	call 	ConvertSamples
   404                                  
   405                                  q_loop:
   406 0000027A B401                    	mov     ah, 1	; any key pressed?
   407 0000027C CD32                    	int     32h	; no, Loop.
   408 0000027E 7405                    	jz	short r_loop
   409                                  
   410 00000280 B400                    	mov     ah, 0	; flush key buffer...
   411 00000282 CD32                    	int     32h
   412                                  q_return:
   413 00000284 C3                      	retn
   414                                  r_loop:
   415                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   416                                  	; 23/06/2017
   417                                  	; 22/06/2017
   418                                  	; bh = 15, get current sound data/samples
   419                                  	; bl = 0, for PCM OUT
   420                                  	; ecx = count of sample/data bytes (1 to 4096)
   421                                  	; edx = destination buffer address 
   422                                  	;	(page aligned address is better)
   423                                  	;
   424                                  	sys	_audio, 0F00h, 320*4, g_buff
   424                              <1> 
   424                              <1> 
   424                              <1> 
   424                              <1> 
   424                              <1>  %if %0 >= 2
   424 00000285 BB000F0000          <1>  mov ebx, %2
   424                              <1>  %if %0 >= 3
   424 0000028A B900050000          <1>  mov ecx, %3
   424                              <1>  %if %0 = 4
   424 0000028F BA[00900000]        <1>  mov edx, %4
   424                              <1>  %endif
   424                              <1>  %endif
   424                              <1>  %endif
   424 00000294 B820000000          <1>  mov eax, %1
   424                              <1> 
   424 00000299 CD40                <1>  int 40h
   425                                  ScopeLoop:
   426 0000029B BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   427                                  	; 19/06/2017
   428 000002A0 BE[00900000]            	mov     esi, g_buff	; display current samples
   429 000002A5 31C9                    	xor     ecx, ecx	; to be drawed ...
   430 000002A7 31D2                    	xor     edx, edx
   431                                  DrawLoop:       
   432 000002A9 89D3                    	mov     ebx, edx	; (save Index)
   433 000002AB 668BBB[F0820000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   434 000002B2 C60700                  	mov     byte [edi], 0	; erase it!
   435                                  	; 24/06/2017
   436 000002B5 AD                      	lodsd
   437 000002B6 80C480                  	add	ah, 80h
   438 000002B9 88E3                    	mov	bl, ah
   439                                  	;
   440 000002BB 30FF                    	xor     bh, bh
   441 000002BD 66D1E3                  	shl     bx, 1
   442 000002C0 668BBB[70850000]        	mov     di, [RowOfs+ebx]
   443 000002C7 6601CF                  	add     di, cx
   444 000002CA 6689D3                  	mov     bx, dx	; (restore Index)
   445 000002CD 6689BB[F0820000]        	mov     [Scope+ebx], di	; save new address...
   446 000002D4 C6070A                  	mov     byte [edi], 10	; and DRAW.
   447 000002D7 6683C202                	add     dx, 2	; the next pixel...
   448 000002DB 41                      	inc     ecx
   449 000002DC 6681F94001              	cmp     cx, 320	; 320 pixels drawed?
   450 000002E1 72C6                    	jb      short DrawLoop
   451 000002E3 E968FFFFFF              	jmp	p_loop
   452                                  
   453                                  
   454                                  ;=============================================================================
   455                                  ;               MODLOAD.ASM
   456                                  ;=============================================================================
   457                                  
   458                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   459                                  ;	July 10th, 1993.
   460                                  
   461                                  ; STRUCTURES
   462                                  
   463                                  struc ModSample
   464 00000000 <res 00000016>          .msName:	resb 22
   465 00000016 <res 00000002>          .msLength:	resw 1
   466 00000018 <res 00000001>          .msFinetune:	resb 1
   467 00000019 <res 00000001>          .msVolume:	resb 1
   468 0000001A <res 00000002>          .msRepeat:	resw 1
   469 0000001C <res 00000002>          .msRepLen:	resw 1
   470                                  .size:
   471                                  endstruc
   472                                  
   473                                  struc ModHeader
   474 00000000 <res 00000014>          .mhName:	resb 20
   475 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   476 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   477 000003B7 <res 00000001>          .mhReStart:	resb 1
   478 000003B8 <res 00000080>          .mhOrder:	resb 128
   479 00000438 <res 00000004>          .mhSign:	resw 2
   480                                  .size:	
   481                                  endstruc
   482                                  
   483                                  struc ModInfoRec
   484 00000000 <res 00000001>          .OrderLen:	resb 1
   485 00000001 <res 00000001>          .ReStart:	resb 1
   486 00000002 <res 00000080>          .Order:	resb 128
   487 00000082 <res 00000004>          .Patterns:	resd 1
   488 00000086 <res 0000003E>          .SampOfs:	resw 31
   489 000000C4 <res 0000003E>          .SampSeg:	resw 31
   490 00000102 <res 0000003E>          .SampLen:	resw 31
   491 00000140 <res 0000003E>          .SampRep:	resw 31
   492 0000017E <res 0000003E>          .SampRepLen:	resw 31
   493 000001BC <res 0000003E>          .SampVol:	resw 31
   494                                  .size:	
   495                                  endstruc
   496                                  
   497                                  ; CODE
   498                                  
   499                                  ; 07/10/2017 (modplay2.s)
   500                                  ; tinyply3.s
   501                                  ; 06/10/2017
   502                                  ; 04/10/2017
   503                                  ; /* MOD FileFormat */
   504                                  
   505                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   506                                  ID_FLT4 equ 34544C46h ; "FLT4"
   507                                  ID_8CHN equ 4E484338h ; "8CHN"
   508                                  ID_FLT8 equ 34544C46h ; "FLT8"
   509                                  
   510                                  ; CODE
   511                                  
   512                                  LoadModule:
   513                                  	; edi = file name address
   514                                  
   515 000002E8 60                      	pushad
   516                                  
   517 000002E9 E878010000              	call    ClearModInfo
   518                                  OpenFile:       
   519                                  	; ebx = ASCIIZ file name address
   520                                  	; ecx = open mode (0 = open for read)	
   521                                  	sys	_open, edi, 0 ; open for reading
   521                              <1> 
   521                              <1> 
   521                              <1> 
   521                              <1> 
   521                              <1>  %if %0 >= 2
   521 000002EE 89FB                <1>  mov ebx, %2
   521                              <1>  %if %0 >= 3
   521 000002F0 B900000000          <1>  mov ecx, %3
   521                              <1>  %if %0 = 4
   521                              <1>  mov edx, %4
   521                              <1>  %endif
   521                              <1>  %endif
   521                              <1>  %endif
   521 000002F5 B805000000          <1>  mov eax, %1
   521                              <1> 
   521 000002FA CD40                <1>  int 40h
   522 000002FC 0F8262010000            	jc	Failed
   523 00000302 A3[A20F0000]            	mov     [FileHandle], eax
   524                                  ReadHeader:
   525                                  	; ebx = File handle
   526                                  	; ecx = Buffer address
   527                                  	; edx = Byte count
   528                                  	sys	_read, [FileHandle], Header, ModHeader.size
   528                              <1> 
   528                              <1> 
   528                              <1> 
   528                              <1> 
   528                              <1>  %if %0 >= 2
   528 00000307 8B1D[A20F0000]      <1>  mov ebx, %2
   528                              <1>  %if %0 >= 3
   528 0000030D B9[A60F0000]        <1>  mov ecx, %3
   528                              <1>  %if %0 = 4
   528 00000312 BA3C040000          <1>  mov edx, %4
   528                              <1>  %endif
   528                              <1>  %endif
   528                              <1>  %endif
   528 00000317 B803000000          <1>  mov eax, %1
   528                              <1> 
   528 0000031C CD40                <1>  int 40h
   529 0000031E 0F8231010000            	jc      CloseFile
   530                                  CheckMK:  
   531                                  	; 04/10/2017
   532 00000324 A1[DE130000]            	mov	eax, [Header+ModHeader.mhSign]
   533                                        
   534 00000329 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   535                                  	;je	short Is4chnMod
   536 0000032E 742B                    	je	short IsModFile
   537                                  CheckFLT4:
   538 00000330 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   539                                  	;je	short Is4chnMod
   540 00000335 7424                    	je	short IsModFile
   541                                  Check8CHN:
   542 00000337 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   543 0000033C 740D                    	je	short Is8chnMod
   544                                  CheckFLT8:
   545 0000033E 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   546                                  	; 06/10/2017
   547 00000343 7406                    	je	short Is8chnMod
   548 00000345 F9                      	stc
   549 00000346 E90A010000              	jmp	CloseFile
   550                                  Is8chnMod:
   551 0000034B C605[E30E0000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   552 00000352 C605[E20E0000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   553 00000359 EB00                    	jmp	short IsModFile
   554                                  ;Is4chnMod:
   555                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   556                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   557                                  
   558                                  IsModFile:
   559 0000035B A0[5C130000]            	mov     al, [Header+ModHeader.mhOrderLen]
   560 00000360 A2[E2130000]            	mov     [ModInfo.OrderLen], al
   561                                  
   562 00000365 A0[5D130000]            	mov     al, [Header+ModHeader.mhReStart]
   563 0000036A 3A05[5C130000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   564 00000370 7202                    	jb      short SetReStart
   565 00000372 B07F                    	mov     al, 7Fh
   566                                  SetReStart:
   567 00000374 A2[E3130000]            	mov     [ModInfo.ReStart], al
   568                                  
   569                                  	;mov	ecx, 128
   570 00000379 66B98000                	mov	cx, 128
   571 0000037D 31D2                    	xor     edx, edx
   572 0000037F 31DB                    	xor     ebx, ebx
   573                                  CopyOrder:
   574 00000381 8AB3[5E130000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   575 00000387 88B3[E4130000]          	mov     [ModInfo.Order+ebx], dh
   576 0000038D 38D6                    	cmp     dh, dl
   577 0000038F 7202                    	jb      short NextOrder
   578 00000391 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   579                                  NextOrder:
   580 00000393 43                      	inc     ebx
   581 00000394 E2EB                    	loop    CopyOrder
   582                                  AllocPatterns:  
   583 00000396 81E2FF000000            	and	edx, 0FFh
   584                                  	; 04/10/2017
   585                                  	;inx	dx  ; 12/03/2017
   586 0000039C FEC2                    	inc	dl
   587                                  	; dl = number of patterns (04/07/2017)
   588 0000039E 8A0D[E20E0000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   589 000003A4 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   590                                  	     ; *2048 ; (byte count of patterns *64*8*4)
   591                                  	;
   592 000003A6 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   593                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   594 000003A8 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   595                                  	;
   596 000003AD 890D[64140000]          	mov	[ModInfo.Patterns], ecx
   597                                  	;
   598 000003B3 01CD                    	add	ebp, ecx ; next offset for samples
   599                                  ReadPatterns:  
   600                                  	;mov	ebx, [FileHandle] 
   601                                  	; ebx = File handle
   602                                  	; ecx = Buffer address
   603                                  	; edx = Byte count
   604                                  	sys	_read, [FileHandle]
   604                              <1> 
   604                              <1> 
   604                              <1> 
   604                              <1> 
   604                              <1>  %if %0 >= 2
   604 000003B5 8B1D[A20F0000]      <1>  mov ebx, %2
   604                              <1>  %if %0 >= 3
   604                              <1>  mov ecx, %3
   604                              <1>  %if %0 = 4
   604                              <1>  mov edx, %4
   604                              <1>  %endif
   604                              <1>  %endif
   604                              <1>  %endif
   604 000003BB B803000000          <1>  mov eax, %1
   604                              <1> 
   604 000003C0 CD40                <1>  int 40h
   605 000003C2 0F828D000000            	jc      CloseFile
   606                                  
   607                                  	; patterns have been loaded here... (04/07/2017)
   608                                  
   609 000003C8 BE[BA0F0000]            	mov	esi, Header+ModHeader.mhSamples
   610 000003CD 31FF                    	xor     edi, edi
   611                                  CopySamples:
   612 000003CF 668B4616                	mov     ax, [esi+ModSample.msLength]
   613 000003D3 86C4                    	xchg    al, ah
   614 000003D5 66D1E0                  	shl     ax, 1
   615 000003D8 668987[E4140000]        	mov     [ModInfo.SampLen+edi], ax
   616 000003DF 8A4619                  	mov     al, [esi+ModSample.msVolume]
   617 000003E2 30E4                    	xor     ah, ah
   618 000003E4 668987[9E150000]        	mov     [ModInfo.SampVol+edi], ax
   619 000003EB 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   620 000003EF 86C4                    	xchg    al, ah
   621 000003F1 66D1E0                  	shl     ax, 1
   622 000003F4 668987[22150000]        	mov     [ModInfo.SampRep+edi], ax
   623 000003FB 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   624 000003FF 86C4                    	xchg    al, ah
   625 00000401 66D1E0                  	shl     ax, 1
   626 00000404 668987[60150000]        	mov     [ModInfo.SampRepLen+edi], ax
   627 0000040B 83C61E                  	add     esi, ModSample.size
   628 0000040E 6683C702                	add     di, 2
   629 00000412 6683FF3E                	cmp     di, 2*31
   630 00000416 72B7                    	jb      short CopySamples
   631                                  
   632 00000418 31F6                    	xor     esi, esi
   633                                  AllocSamples:
   634 0000041A 0FB796[E4140000]        	movzx	edx, word [ModInfo.SampLen+esi]
   635                                  	; 07/10/2017
   636                                  	;shr	dx, 4 ; ***
   637 00000421 21D2                    	and	edx, edx
   638 00000423 7426                    	jz      short NextSample
   639                                  	;inc	dx  ; number of paragraphs ; ***
   640                                  	;shl	dx, 4 ; ***
   641 00000425 89E8                    	mov	eax, ebp
   642 00000427 668986[68140000]        	mov	[ModInfo.SampOfs+esi], ax
   643 0000042E C1E810                  	shr	eax, 16
   644 00000431 668986[A6140000]        	mov	[ModInfo.SampSeg+esi], ax
   645 00000438 89E9                    	mov	ecx, ebp
   646 0000043A 01D5                    	add	ebp, edx ; next offset for sample 
   647                                  ReadSample:
   648                                  	;mov	ebx, [FileHandle]
   649                                  	;movzx  edx, [ModInfo.SampLen+esi]
   650                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   651                                  
   652                                  	; ebx = File handle
   653                                  	; ecx = Buffer address
   654                                  	; edx = Byte count
   655                                  	sys	_read, [FileHandle]
   655                              <1> 
   655                              <1> 
   655                              <1> 
   655                              <1> 
   655                              <1>  %if %0 >= 2
   655 0000043C 8B1D[A20F0000]      <1>  mov ebx, %2
   655                              <1>  %if %0 >= 3
   655                              <1>  mov ecx, %3
   655                              <1>  %if %0 = 4
   655                              <1>  mov edx, %4
   655                              <1>  %endif
   655                              <1>  %endif
   655                              <1>  %endif
   655 00000442 B803000000          <1>  mov eax, %1
   655                              <1> 
   655 00000447 CD40                <1>  int 40h
   656 00000449 720A                    	jc      short CloseFile
   657                                  
   658                                  NextSample:
   659 0000044B 6683C602                	add     si, 2
   660 0000044F 6683FE3E                	cmp     si, 2*31
   661 00000453 72C5                    	jb      short AllocSamples
   662                                  CloseFile:      
   663 00000455 9C                      	pushf
   664                                  	sys	_close, [FileHandle]
   664                              <1> 
   664                              <1> 
   664                              <1> 
   664                              <1> 
   664                              <1>  %if %0 >= 2
   664 00000456 8B1D[A20F0000]      <1>  mov ebx, %2
   664                              <1>  %if %0 >= 3
   664                              <1>  mov ecx, %3
   664                              <1>  %if %0 = 4
   664                              <1>  mov edx, %4
   664                              <1>  %endif
   664                              <1>  %endif
   664                              <1>  %endif
   664 0000045C B806000000          <1>  mov eax, %1
   664                              <1> 
   664 00000461 CD40                <1>  int 40h
   665 00000463 9D                      	popf
   666                                  Failed:       
   667 00000464 61                      	popad
   668 00000465 C3                      	retn
   669                                  
   670                                  FreeModule:
   671                                  	; Erdogan Tan (13/02/2017)
   672                                  	; nothing to do here for memory de-allocation
   673                                  ClearModInfo:
   674 00000466 57                      	push	edi
   675 00000467 BF[E2130000]            	mov	edi, ModInfo
   676 0000046C B9FA010000              	mov     ecx, ModInfoRec.size
   677                                  	;cld
   678 00000471 30C0                    	xor     al, al
   679 00000473 F3AA                    	rep     stosb
   680 00000475 5F                      	pop	edi
   681 00000476 C3                      	retn
   682                                  
   683                                  ;=============================================================================
   684                                  ;               MODPLAY.ASM
   685                                  ;=============================================================================
   686                                  
   687                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   688                                  ;	July 23th, 1993.
   689                                  
   690                                  ; EQUATES
   691                                  
   692                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   693                                  DefTempo        equ 6
   694                                  DefBpm          equ 125
   695                                  MidCRate        equ 8448
   696                                  MixBufSize      equ 4096
   697                                  
   698                                  ; STRUCTURES
   699                                  
   700                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   701 00000000 <res 00000004>          .Samples:	resd 1
   702                                  ;.Position:	resw 1
   703 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   704 00000008 <res 00000002>          .Len:	resw 1
   705 0000000A <res 00000002>          .Repeat:	resw 1
   706 0000000C <res 00000002>          .RepLen:	resw 1
   707 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   708 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   709                                  ;.Error:	resb 1
   710                                  ;.Reserved:	resb 1 ; 01/10/2017
   711 00000010 <res 00000002>          .Period:	resw 1 ; Period
   712 00000012 <res 00000002>          .Pitch:	resw 1 
   713 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   714 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   715 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   716 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   717 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   718 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   719 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   720                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   721 0000001D <res 00000001>          .Error:	resb 1 ; 01/10/2017
   722 0000001E <res 00000006>          .Arp:	resw 3
   723 00000024 <res 00000002>          .ArpIndex:	resw 1
   724                                  .size:	; 38 bytes ; 01/10/2017 -  TRDOS 386
   725                                  endstruc
   726                                  
   727                                  ; CODE
   728                                  
   729                                  ;--------------------------------------------------------------------------
   730                                  ; updatechannel - update the track using the current effect
   731                                  ;--------------------------------------------------------------------------
   732                                  ; 
   733                                  ;--------------------------------------------------------------------------
   734                                  ; BeatTrack:  Process the next beat in one track.
   735                                  ;  In:
   736                                  ;    ds:di -  Track info Address.
   737                                  ;--------------------------------------------------------------------------
   738                                  
   739                                  ; edi = Track info address
   740                                  
   741                                  updatechannel:
   742                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   743                                  
   744 00000477 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   745                                  
   746                                  	;test   dx, dx
   747                                  	;je     short None
   748                                  	;cmp    dh, 00h
   749                                  	;je     short Arpeggio
   750                                  	;cmp    dh, 01h
   751                                  	;je     short PortUp
   752                                  	;cmp    dh, 02h
   753                                  	;je     short PortDown
   754                                  	;cmp    dh, 03h
   755                                  	;je     TonePort
   756                                  	;cmp    dh, 04h
   757                                  	;je     Vibrato
   758                                  	;cmp    dh, 05h
   759                                  	;je     PortSlide
   760                                  	;cmp    dh, 06h
   761                                  	;je     VibSlide
   762                                  	;cmp    dh, 0Ah
   763                                  	;je     VolSlide
   764                                  	;retn
   765                                  
   766 0000047B 0FB6C6                  	movzx	eax, dh
   767 0000047E 240F                    	and	al, 0Fh
   768 00000480 FF2485[000D0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   769                                  efxnull:
   770                                  None:           
   771 00000487 C3                      	retn
   772                                  efxarpeggio2:
   773                                  	; 01/10/2017
   774 00000488 84D2                    	test    dl, dl
   775 0000048A 74FB                    	jz      short efxnull
   776                                  Arpeggio:
   777 0000048C 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   778 00000490 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   779 00000495 66894712                	mov     [edi+TrackInfo.Pitch], ax
   780 00000499 6683C302                	add     bx, 2
   781 0000049D 6683FB06                	cmp     bx, 6
   782 000004A1 7202                    	jb      short SetArpIndex
   783 000004A3 31DB                    	xor     ebx, ebx
   784                                  SetArpIndex:
   785 000004A5 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   786 000004A9 C3                      	retn
   787                                  efxportaup:
   788                                  PortUp:
   789 000004AA 30F6                    	xor     dh, dh
   790                                  	;mov	bx, [edi+TrackInfo.Period]
   791 000004AC 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   792 000004B0 6629D3                  	sub     bx, dx
   793                                  	;cmp	bx, 113
   794 000004B3 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   795 000004B7 7D04                    	jge     short NotSmall
   796                                  	;mov	bx, 113
   797 000004B9 66BB1C00                	mov	bx, 28 ; 01/10/2017
   798                                  NotSmall:
   799 000004BD 66895F10                	mov     [edi+TrackInfo.Period], bx
   800 000004C1 6601DB                  	add     bx, bx
   801                                  	;mov	ax, [PitchTable+bx]
   802 000004C4 668B83[DC150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   803 000004CB 66894712                	mov     [edi+TrackInfo.Pitch], ax
   804 000004CF C3                      	retn
   805                                  efxportadown:
   806                                  PortDown:
   807 000004D0 30F6                    	xor     dh, dh
   808                                  	;mov	bx, [edi+TrackInfo.Period]
   809 000004D2 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   810 000004D6 6601D3                  	add     bx, dx
   811 000004D9 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   812                                  	;cmp	bx, 856
   813 000004DE 7E04                    	jle     short NotBig
   814                                  	;mov	bx, 856
   815 000004E0 66BB600D                	mov	bx, 3424 ; 01/10/2017
   816                                  NotBig:         
   817 000004E4 66895F10                	mov     [edi+TrackInfo.Period], bx
   818 000004E8 6601DB                  	add     bx, bx
   819                                  	;mov	ax, [PitchTable+bx]
   820 000004EB 668B83[DC150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   821 000004F2 66894712                	mov     [edi+TrackInfo.Pitch], ax
   822 000004F6 C3                      	retn
   823                                  efxtoneporta2:
   824                                  TonePort:
   825 000004F7 30F6                    	xor     dh, dh
   826 000004F9 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   827                                  	;mov	bx, [edi+TrackInfo.Period]
   828 000004FD 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   829 00000501 6639C3                  	cmp     bx, ax
   830 00000504 7429                    	je      short NoPort
   831 00000506 7F0D                    	jg      short PortToUp
   832                                  PortToDown:     
   833 00000508 6601D3                  	add     bx, dx
   834 0000050B 6639C3                  	cmp     bx, ax
   835 0000050E 7E0D                    	jle     short SetPort
   836                                  FixPort:        
   837 00000510 6689C3                  	mov     bx, ax
   838 00000513 EB08                    	jmp     short SetPort
   839                                  PortToUp:
   840 00000515 6629D3                  	sub     bx, dx
   841 00000518 6639C3                  	cmp     bx, ax
   842 0000051B 7CF3                    	jl      short FixPort
   843                                  SetPort:        
   844 0000051D 66895F10                	mov     [edi+TrackInfo.Period], bx
   845 00000521 6601DB                  	add     bx, bx
   846                                  	;mov	ax, [PitchTable+bx]
   847 00000524 668B83[DC150000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   848 0000052B 66894712                	mov     [edi+TrackInfo.Pitch], ax
   849                                  NoPort:         
   850 0000052F C3                      	retn
   851                                  efxvibrato2:
   852                                  	; 01/10/2017
   853                                  Vibrato:
   854 00000530 88D6                    	mov     dh, dl
   855                                  	;and	dl, 0Fh
   856                                  	;shr	dh, 4
   857                                  	;shl	dh, 2
   858 00000532 6681E20FF0              	and     dx, 0F00Fh
   859 00000537 C0EE02                  	shr     dh, 2
   860                                  	;add	[edi+TrackInfo.VibPos], dh
   861                                  	;mov	dh, [edi+TrackInfo.VibPos]
   862                                  	;mov	bl, dh
   863 0000053A 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   864 0000053D 007719                  	add	[edi+TrackInfo.VibPos], dh
   865 00000540 88DE                    	mov	dh, bl ; 01/10/2017
   866 00000542 C0EB02                  	shr     bl, 2
   867                                  	;and	bx, 1Fh
   868                                  	;mov	al, [SinTable+bx]
   869 00000545 83E31F                  	and	ebx, 1Fh
   870 00000548 8A83[E80D0000]          	mov	al, [SinTable+ebx]
   871 0000054E F6E2                    	mul     dl
   872                                  	;rol	ax, 1
   873                                  	;xchg	al, ah
   874                                  	;and	ah, 1
   875 00000550 66C1E807                	shr	ax, 7
   876 00000554 84F6                    	test    dh, dh
   877 00000556 7903                    	jns     short VibUp
   878 00000558 66F7D8                  	neg     ax
   879                                  VibUp:          
   880 0000055B 66034710                	add     ax, [edi+TrackInfo.Period]
   881 0000055F 6689C3                  	mov	bx, ax
   882                                  	;movzx	ebx, ax
   883 00000562 6683FB71                	cmp     bx, 113
   884                                  	;cmp	bx, 113
   885 00000566 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   886 0000056A 7D06                    	jge     short NoLoVib
   887                                  	;mov	bx, 113
   888 0000056C 66BB1C00                	mov	bx, 28	; 01/10/2017
   889 00000570 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   890                                  NoLoVib:        
   891 00000572 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   892                                  	;cmp	bx, 856
   893 00000577 7E04                    	jle     short NoHiVib
   894                                  	;mov	bx, 856
   895 00000579 66BB600D                	mov	bx, 3424 ; 01/10/2017
   896                                  NoHiVib:        
   897 0000057D 6601DB                  	add     bx, bx
   898                                  	;mov	ax, [PitchTable+bx]
   899 00000580 668B83[DC150000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   900 00000587 66894712                	mov     [edi+TrackInfo.Pitch], ax
   901 0000058B C3                      	retn
   902                                  efxtoneslide:
   903                                  PortSlide:
   904 0000058C E812000000              	call    VolSlide
   905 00000591 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   906 00000594 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   907                                  efxvibslide:
   908                                  VibSlide:
   909 00000599 E805000000              	call    VolSlide
   910 0000059E 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   911 000005A1 EB8D                    	jmp     short Vibrato  ; efxvibrato2
   912                                  efxvolslide:
   913                                  VolSlide:
   914 000005A3 88D6                    	mov     dh, dl
   915 000005A5 80E20F                  	and     dl, 0Fh
   916 000005A8 C0EE04                  	shr     dh, 4
   917 000005AB 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   918 000005AE 28D0                    	sub     al, dl
   919 000005B0 7D02                    	jge     short NoLoVol
   920 000005B2 30C0                    	xor     al, al
   921                                  NoLoVol:        
   922 000005B4 00F0                    	add     al, dh
   923 000005B6 3C40                    	cmp     al, 64
   924 000005B8 7602                    	jbe     short NoHiVol
   925 000005BA B040                    	mov     al, 64
   926                                  NoHiVol:        
   927 000005BC 88470E                  	mov     [edi+TrackInfo.Volume], al
   928 000005BF C3                      	retn
   929                                  
   930                                  efxtremolo2:
   931                                  	; 01/10/2017 (TMODPLAY.ASM)
   932                                  Tremolo:
   933 000005C0 88D6                    	mov     dh, dl
   934 000005C2 6681E20FF0              	and     dx, 0F00Fh
   935 000005C7 C0EE02                  	shr     dh, 2
   936 000005CA 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
   937 000005CD 00771B                  	add	[edi+TrackInfo.TremPos], dh
   938 000005D0 88DE                    	mov	dh, bl
   939 000005D2 C0EB02                  	shr     bl, 2
   940                                  	; 01/10/2017 - TRDOS 386
   941                                  	;and	bx, 1Fh
   942 000005D5 83E31F                  	and	ebx, 1Fh 
   943                                  	;mov	al, [SinTable+bx]
   944 000005D8 8A83[E80D0000]          	mov     al, [SinTable+ebx]
   945 000005DE F6E2                    	mul     dl
   946 000005E0 66C1E806                	shr	ax, 6
   947 000005E4 84F6                    	test    dh, dh
   948 000005E6 7D03                    	jge	short Tremolo_1 ; efxtremolof2
   949 000005E8 66F7D8                  	neg     ax
   950                                  efxtremolof2:
   951                                  Tremolo_1:      
   952 000005EB 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
   953 000005EE 00E0                    	add     al, ah
   954 000005F0 7D02                    	jge     short Tremolo_2 ; efxtremolof3
   955 000005F2 30C0                    	xor     al, al
   956                                  efxtremolof3:
   957                                  Tremolo_2:       
   958 000005F4 3C40                    	cmp     al, 64 ; 40h
   959 000005F6 7E02                    	jle     short Tremolo_3 ; efxtremolof4
   960 000005F8 B040                    	mov     al, 64 ; 40h
   961                                  efxtremolof4:
   962                                  Tremolo_3:       
   963 000005FA 28E0                    	sub	al, ah  ; ****** 
   964 000005FC 88470F                  	mov     [edi+TrackInfo.VolDiff], al
   965 000005FF C3                      	retn	
   966                                  
   967                                  ;--------------------------------------------------------------------------
   968                                  ; readchannel - read the next note event from the pattern sheet
   969                                  ;--------------------------------------------------------------------------
   970                                  ;
   971                                  ;--------------------------------------------------------------------------
   972                                  ; GetTrack:   Get the next Note from a pattern.
   973                                  ;  In:
   974                                  ;    ds:di -  Track info Address.
   975                                  ;    es:si -  Pattern Note Address.
   976                                  ; Out:
   977                                  ;    es:si -  The Next Pattern Note address.
   978                                  ;--------------------------------------------------------------------------
   979                                  
   980                                  ; esi = Pattern note address
   981                                  ; edi = Track info address
   982                                  
   983                                  readchannel:
   984                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
   985 00000600 66AD                    	lodsw
   986 00000602 86C4                    	xchg    al, ah
   987 00000604 88E3                    	mov	bl, ah
   988 00000606 80E40F                  	and     ah, 0Fh
   989 00000609 6689C1                  	mov     cx, ax
   990 0000060C 66AD                    	lodsw
   991 0000060E 86C4                    	xchg    al, ah
   992 00000610 88E7                    	mov     bh, ah
   993 00000612 80E40F                  	and     ah, 0Fh
   994 00000615 6689C2                  	mov     dx, ax
   995 00000618 66895714                	mov     [edi+TrackInfo.Effect], dx
   996                                  	; 01/10/2017 - TRDOS 386
   997                                  	;and	bl, 0F0h
   998 0000061C 81E3F0FF0000            	and	ebx, 0FFF0h
   999 00000622 C0EF04                  	shr     bh, 4
  1000 00000625 08FB                    	or      bl, bh
  1001 00000627 7446                    	jz      short SetPeriod
  1002                                  SetSample:
  1003 00000629 30FF                    	xor	bh, bh
  1004                                  	;and	ebx, 0FFh
  1005 0000062B FECB                    	dec     bl
  1006 0000062D 01DB                    	add     ebx, ebx
  1007 0000062F 668B83[9E150000]        	mov     ax, [ModInfo.SampVol+ebx]
  1008 00000636 88470E                  	mov     [edi+TrackInfo.Volume], al
  1009 00000639 668B83[68140000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1010 00000640 668907                  	mov     [edi+TrackInfo.Samples], ax
  1011 00000643 668B83[A6140000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1012 0000064A 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1013 0000064E 668B83[E4140000]        	mov     ax, [ModInfo.SampLen+ebx]
  1014 00000655 66894708                	mov     [edi+TrackInfo.Len], ax
  1015 00000659 668B83[22150000]        	mov     ax, [ModInfo.SampRep+ebx]
  1016 00000660 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1017 00000664 668B83[60150000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1018 0000066B 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1019                                  SetPeriod:      
  1020 0000066F 6685C9                  	test    cx, cx
  1021 00000672 7425                    	jz      short SetEffect
  1022                                  
  1023 00000674 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1024                                  	
  1025 00000678 80FE03                  	cmp     dh, 03h
  1026                                  	;je	short SetEffect
  1027 0000067B 7428                    	je	short efxtoneporta ; 01/10/2017
  1028                                  
  1029 0000067D 66894F10                	mov     [edi+TrackInfo.Period], cx
  1030                                  	;movzx	ebx, cx
  1031 00000681 6689CB                  	mov     bx, cx
  1032 00000684 6601DB                  	add     bx, bx
  1033                                  	;mov	ax, [PitchTable+bx]
  1034 00000687 668B83[DC150000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1035 0000068E 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1036 00000692 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1037                                  SetEffect:
  1038                                  	;test	dx, dx
  1039                                  	;je	short InitNone
  1040                                  	;cmp	dh, 00h
  1041                                  	;je	InitArpeggio
  1042                                  	;cmp	dh, 03h
  1043                                  	;je	short InitTonePort
  1044                                  	;cmp	dh, 04h
  1045                                  	;je	short InitVibrato
  1046                                  	;cmp	dh, 09h
  1047                                  	;je	short SampleOfs
  1048                                  	;cmp	dh, 0Bh
  1049                                  	;je	short PosJump
  1050                                  	;cmp	dh, 0Ch
  1051                                  	;je	short SetVolume
  1052                                  	;cmp	dh, 0Dh
  1053                                  	;je	short Break
  1054                                  	;cmp	dh, 0Fh
  1055                                  	;je	SetSpeed
  1056                                  	;retn
  1057                                  
  1058                                  	; 01/10/2017 (TMODPLAY.ASM)
  1059                                  	
  1060                                  	; dx = [di+TrackInfo.Effect]
  1061                                  	
  1062 00000699 0FB6C6                  	movzx	eax, dh
  1063 0000069C 240F                    	and	al, 0Fh
  1064 0000069E FF2485[C00C0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1065                                  ;efxnull:
  1066                                  ;InitNone:
  1067                                  ;	retn
  1068                                  efxtoneporta:
  1069                                  	; 01/10/2017
  1070                                  	; cx = period
  1071                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1072                                  InitTonePort:
  1073 000006A5 84D2                    	test    dl, dl
  1074 000006A7 7503                    	jnz     short SetPortParm
  1075 000006A9 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1076                                  SetPortParm:    
  1077 000006AC 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1078 000006AF 66895714                	mov     [edi+TrackInfo.Effect], dx
  1079 000006B3 C3                      	retn
  1080                                  efxvibrato:
  1081                                  InitVibrato:
  1082 000006B4 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1083 000006B7 88C4                    	mov     ah, al
  1084                                  	;and	al, 0Fh
  1085                                  	;and	ah, 0F0h
  1086 000006B9 66250FF0                	and	ax, 0F00Fh
  1087 000006BD F6C20F                  	test    dl, 0Fh
  1088 000006C0 7502                    	jne     short OkDepth
  1089 000006C2 08C2                    	or      dl, al
  1090                                  OkDepth:        
  1091 000006C4 F6C2F0                  	test    dl, 0F0h
  1092 000006C7 7502                    	jnz     short OkRate
  1093 000006C9 08E2                    	or      dl, ah
  1094                                  OkRate:         
  1095 000006CB 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1096 000006CE 66895714                	mov     [edi+TrackInfo.Effect], dx
  1097 000006D2 6685C9                  	test    cx, cx
  1098 000006D5 7404                    	jz      short OkPos
  1099 000006D7 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1100                                  OkPos:          
  1101 000006DB C3                      	retn
  1102                                  efxsampoffset:
  1103                                  	; 01/10/2017 ; *******
  1104                                  SampleOfs:         
  1105                                  ;	test    dl, dl
  1106                                  ;	jnz     short SetSampleOfs
  1107                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1108                                  ;SetSampleOfs:
  1109                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1110 000006DC 88D6                    	mov     dh, dl
  1111 000006DE 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1112 000006E4 895704                  	mov     [edi+TrackInfo.Position], edx
  1113 000006E7 C3                      	retn
  1114                                  efxpattjump:
  1115                                  PosJump:
  1116 000006E8 8815[9E810000]          	mov     [OrderPos], dl
  1117 000006EE C605[A2810000]40        	mov     byte [Row], 64
  1118 000006F5 C3                      	retn
  1119                                  efxsetvolume:
  1120                                  SetVolume:
  1121 000006F6 80FA40                  	cmp     dl, 64
  1122 000006F9 7602                    	jbe     short OkVol
  1123 000006FB B240                    	mov     dl, 64
  1124                                  OkVol:
  1125                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1126 000006FD 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1127                                  	;mov	[edi+TrackInfo.Volume], dl
  1128 000006FF 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1129 00000703 C3                      	retn
  1130                                  efxbreak:
  1131                                  Break:
  1132 00000704 88D6                    	mov     dh, dl
  1133 00000706 80E20F                  	and     dl, 0Fh
  1134 00000709 C0EE04                  	shr     dh, 4
  1135 0000070C 00F6                    	add     dh, dh
  1136 0000070E 00F2                    	add     dl, dh
  1137 00000710 C0E602                  	shl     dh, 2
  1138 00000713 00F2                    	add     dl, dh
  1139 00000715 8815[A3810000]          	mov     [BreakRow], dl
  1140 0000071B C605[A2810000]40        	mov     byte [Row], 64
  1141 00000722 C3                      	retn
  1142                                  efxsetspeed:
  1143                                  SetSpeed:
  1144 00000723 84D2                    	test    dl,dl
  1145 00000725 7432                    	je      Skip
  1146 00000727 80FA1F                  	cmp     dl,31
  1147 0000072A 770D                    	ja      short SetBpm
  1148                                  SetTempo:       
  1149 0000072C 8815[9F810000]          	mov     [Tempo], dl
  1150 00000732 8815[A0810000]          	mov     [TempoWait], dl
  1151 00000738 C3                      	retn
  1152                                  SetBpm:
  1153 00000739 8815[A1810000]          	mov     [Bpm], dl
  1154 0000073F B067                    	mov     al, 103
  1155 00000741 F6E2                    	mul     dl
  1156 00000743 88E3                    	mov     bl, ah
  1157 00000745 30FF                    	xor     bh, bh
  1158 00000747 66A1[E70E0000]          	mov     ax, [MixSpeed]
  1159 0000074D 6631D2                  	xor     dx, dx
  1160 00000750 66F7F3                  	div     bx
  1161 00000753 66A3[A4810000]          	mov     [BpmSamples], ax
  1162                                  Skip:           
  1163 00000759 C3                      	retn
  1164                                  efxarpeggio:
  1165                                  	; 01/10/2017
  1166 0000075A 84D2                    	test    dl, dl
  1167                                  	;je	efxnull
  1168 0000075C 74FB                    	je	short Skip
  1169                                  InitArpeggio:
  1170 0000075E 88D6                    	mov     dh, dl
  1171 00000760 80E20F                  	and     dl, 0Fh
  1172 00000763 C0EE04                  	shr     dh, 4
  1173                                  	; 01/10/2017
  1174                                  	;mov	cx, 36
  1175 00000766 66B95400                	mov	cx, 84 ; 84 notes/periods
  1176 0000076A 31DB                    	xor     ebx, ebx
  1177 0000076C 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1178                                  gt_ScanPeriod:
  1179                                  	;cmp	ax, [PeriodTable+bx]
  1180 00000770 663B83[400D0000]        	cmp	ax, [PeriodTable+ebx]
  1181 00000777 7306                    	jae     short SetArp
  1182 00000779 6683C302                	add     bx, 2
  1183 0000077D E2F1                    	loop    gt_ScanPeriod
  1184                                  SetArp:         
  1185 0000077F 6601D2                  	add     dx, dx
  1186 00000782 00DE                    	add     dh, bl
  1187 00000784 00DA                    	add     dl, bl
  1188                                  	; 01/10/2017
  1189                                  	;mov	bx, [PeriodTable+bx]
  1190 00000786 668B9B[400D0000]        	mov	bx, [PeriodTable+ebx]
  1191                                  	;add	bx, bx
  1192 0000078D 01DB                    	add	ebx, ebx
  1193                                  	;mov	ax, [PitchTable+bx]
  1194 0000078F 668B83[DC150000]        	mov	ax, [PitchTable+ebx]
  1195 00000796 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1196 0000079A 88F3                    	mov     bl, dh
  1197 0000079C 30FF                    	xor     bh, bh
  1198 0000079E 668B9B[400D0000]        	mov	bx, [PeriodTable+ebx]
  1199                                  	;add	bx, bx
  1200 000007A5 01DB                    	add	ebx, ebx
  1201                                  	;mov	ax, [PitchTable+bx]
  1202 000007A7 668B83[DC150000]        	mov	ax, [PitchTable+ebx]
  1203 000007AE 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1204 000007B2 88D3                    	mov     bl, dl
  1205 000007B4 30FF                    	xor     bh, bh
  1206 000007B6 668B9B[400D0000]        	mov	bx, [PeriodTable+ebx]
  1207                                  	;add	bx, bx
  1208 000007BD 01DB                    	add	ebx, ebx
  1209                                  	;mov	ax, [PitchTable+bx]
  1210 000007BF 668B83[DC150000]        	mov	ax, [PitchTable+ebx]
  1211 000007C6 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1212 000007CA 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1213 000007D0 C3                      	retn
  1214                                  
  1215                                  efxtremolo:
  1216                                  	; 01/10/2017 (TMODPLAY.ASM)
  1217                                  InitTremolo:
  1218 000007D1 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1219 000007D4 88C4                    	mov     ah, al
  1220 000007D6 66250FF0                	and     ax, 0F00Fh
  1221 000007DA F6C20F                  	test    dl, 0Fh
  1222 000007DD 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1223 000007DF 08C2                    	or      dl, al
  1224                                  efxtremolof0:
  1225                                  InitTremolo_1: 
  1226 000007E1 F6C2F0                  	test    dl, 0F0h
  1227 000007E4 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1228 000007E6 08E2                    	or      dl, ah
  1229                                  efxtremolof1:
  1230                                  InitTremolo_2:
  1231 000007E8 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1232 000007EB 66895714                	mov     [edi+TrackInfo.Effect], dx
  1233 000007EF C3                      	retn
  1234                                  
  1235                                  ;--------------------------------------------------------------------------
  1236                                  ; pollmodule - polls the module player
  1237                                  ;--------------------------------------------------------------------------
  1238                                  ;--------------------------------------------------------------------------
  1239                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1240                                  ;--------------------------------------------------------------------------
  1241                                  
  1242                                  pollmodule:
  1243                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1244 000007F0 FE0D[A0810000]          	dec     byte [TempoWait]
  1245 000007F6 7417                    	jz      short GetTracks
  1246                                  
  1247                                  	;mov	ecx, NumTracks
  1248 000007F8 0FB70D[E30E0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1249 000007FF BF[B4810000]            	mov	edi, Tracks
  1250                                  BeatTracks:
  1251 00000804 E86EFCFFFF              	call	BeatTrack	
  1252 00000809 83C726                  	add	edi, TrackInfo.size
  1253 0000080C E2F6                    	loop	BeatTracks
  1254 0000080E C3                      	retn
  1255                                  GetTracks:
  1256 0000080F A0[9F810000]            	mov     al, [Tempo]
  1257 00000814 A2[A0810000]            	mov     [TempoWait], al
  1258                                  
  1259 00000819 8B35[B0810000]          	mov	esi, [Note]
  1260 0000081F 803D[A2810000]40        	cmp     byte [Row], 64
  1261 00000826 7268                    	jb      short NoPattWrap
  1262                                  
  1263 00000828 8B35[64140000]          	mov	esi, [ModInfo.Patterns]
  1264 0000082E 8A1D[9E810000]          	mov     bl, [OrderPos]
  1265 00000834 3A1D[E2130000]          	cmp     bl, [ModInfo.OrderLen]
  1266 0000083A 7214                    	jb      short NoOrderWrap
  1267 0000083C 8A1D[E3130000]          	mov     bl, [ModInfo.ReStart]
  1268 00000842 881D[9E810000]          	mov     [OrderPos], bl
  1269 00000848 3A1D[E2130000]          	cmp     bl, [ModInfo.OrderLen]
  1270 0000084E 7364                    	jae     short NoUpdate
  1271                                  NoOrderWrap:    
  1272                                  	;xor	bh, bh
  1273 00000850 81E3FF000000            	and	ebx, 0FFh
  1274 00000856 8A9B[E4130000]          	mov     bl, [ModInfo.Order+ebx]
  1275                                  	; 05/10/2017
  1276                                  	;shl	ebx, 10 ; *1024
  1277 0000085C 8A0D[E20E0000]          	mov	cl, [pattern_shift] ; 10 or 11
  1278 00000862 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1279                                  	;
  1280 00000864 01DE                    	add     esi, ebx
  1281 00000866 8A1D[A3810000]          	mov     bl, [BreakRow]
  1282 0000086C 881D[A2810000]          	mov     [Row], bl
  1283                                  	;xor	bh, bh
  1284 00000872 81E3FF000000            	and	ebx, 0FFh
  1285 00000878 883D[A3810000]          	mov     [BreakRow], bh ; 0
  1286 0000087E 66C1E304                	shl     bx, 4
  1287 00000882 01DE                    	add     esi, ebx
  1288 00000884 8935[B0810000]          	mov     [Note], esi
  1289 0000088A FE05[9E810000]          	inc     byte [OrderPos]
  1290                                  NoPattWrap:     
  1291 00000890 FE05[A2810000]          	inc     byte [Row]
  1292                                  
  1293                                  	;cld
  1294                                  	;mov	ecx, NumTracks
  1295 00000896 0FB70D[E30E0000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1296 0000089D BF[B4810000]            	mov	edi, Tracks
  1297                                  GetTracks_next:
  1298 000008A2 51                      	push	ecx	
  1299 000008A3 E858FDFFFF              	call	GetTrack ; readchannel
  1300 000008A8 59                      	pop	ecx
  1301 000008A9 83C726                  	add	edi, TrackInfo.size
  1302 000008AC E2F4                    	loop	GetTracks_next
  1303                                  
  1304 000008AE 8935[B0810000]          	mov     [Note], esi
  1305                                  NoUpdate:
  1306 000008B4 C3                      	retn
  1307                                  
  1308                                  ;--------------------------------------------------------------------------
  1309                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1310                                  ;  In:
  1311                                  ;   ds:si -  Track Info Address.
  1312                                  ;   ds:di -  Buffer Address.
  1313                                  ;    cx   -  Buffer Size.
  1314                                  ;--------------------------------------------------------------------------
  1315                                  
  1316                                  ; esi = Track info address
  1317                                  ; edi = Buffer address
  1318                                  ; ecx = Buffer size
  1319                                  
  1320                                  MixTrack:
  1321 000008B5 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1322 000008BA 7752                    	ja      short MixLooped
  1323                                  MixNonLooped:   
  1324 000008BC 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1325 000008BE 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1326 000008C1 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1327 000008C5 52                      	push    edx
  1328 000008C6 56                      	push    esi
  1329 000008C7 01D3                    	add     ebx, edx
  1330 000008C9 01D5                    	add     ebp, edx
  1331 000008CB 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1332                                  	; 01/10/2017
  1333                                  	;mov	al, [esi+TrackInfo.Volume]
  1334 000008CF 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1335                                  	; ah = [esi+TrackInfo.VolDiff]
  1336 000008D3 00E0                    	add	al, ah ; ****** 
  1337 000008D5 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1338 000008D9 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1339 000008DC 89DE                    	mov     esi, ebx
  1340 000008DE 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1341 000008E0 88C7                    	mov     bh, al
  1342 000008E2 88D0                    	mov     al, dl
  1343 000008E4 88F2                    	mov     dl, dh
  1344                                  	;xor	dh, dh
  1345 000008E6 81E2FF000000            	and	edx, 0FFh
  1346                                  nlMixSamp:      
  1347 000008EC 39EE                    	cmp     esi, ebp
  1348 000008EE 7311                    	jae     short nlMixBye
  1349 000008F0 8A1E                    	mov     bl, [esi]
  1350                                  	;mov	bl, [VolTable+bx]
  1351 000008F2 8A9B[9E300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1352 000008F8 001F                    	add     [edi], bl
  1353 000008FA 47                      	inc     edi
  1354 000008FB 00C4                    	add     ah, al
  1355 000008FD 11D6                    	adc     esi, edx
  1356 000008FF E2EB                    	loop    nlMixSamp
  1357                                  nlMixBye:       
  1358 00000901 89F3                    	mov     ebx, esi
  1359 00000903 5E                      	pop     esi
  1360 00000904 5A                      	pop     edx
  1361 00000905 29D3                    	sub     ebx, edx
  1362 00000907 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1363 0000090A 88661D                  	mov     [esi+TrackInfo.Error], ah
  1364 0000090D C3                      	retn
  1365                                  MixLooped:
  1366 0000090E 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1367 00000910 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1368 00000913 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1369 00000917 892D[AC810000]          	mov     [BufRep], ebp
  1370                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1371 0000091D 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1372 00000921 52                      	push    edx
  1373 00000922 56                      	push    esi
  1374 00000923 01D3                    	add     ebx, edx
  1375 00000925 01D5                    	add     ebp, edx
  1376 00000927 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1377                                  	; 01/10/2017
  1378                                  	;mov	al, [esi+TrackInfo.Volume]
  1379 0000092B 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1380                                  	; ah = [esi+TrackInfo.VolDiff]
  1381 0000092F 00E0                    	add	al, ah ; ****** 
  1382 00000931 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1383 00000935 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1384                                  	;mov	si, bx
  1385 00000938 89DE                    	mov	esi, ebx ; 04/09/2017
  1386 0000093A 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1387 0000093C 88C7                    	mov     bh, al
  1388 0000093E 88D0                    	mov     al, dl
  1389 00000940 88F2                    	mov     dl, dh
  1390                                  	;xor	dh, dh
  1391 00000942 81E2FF000000            	and	edx, 0FFh
  1392                                  lpMixSamp:      
  1393 00000948 39EE                    	cmp     esi, ebp
  1394 0000094A 7206                    	jb      short lpMixNow
  1395 0000094C 2B35[AC810000]          	sub     esi, [BufRep]
  1396                                  lpMixNow:       
  1397 00000952 8A1E                    	mov     bl, [esi]
  1398                                  	;mov	bl, [VolTable+bx]
  1399 00000954 8A9B[9E300000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1400 0000095A 001F                    	add     [edi], bl
  1401 0000095C 47                      	inc     edi
  1402 0000095D 00C4                    	add     ah, al
  1403 0000095F 11D6                    	adc	esi, edx
  1404 00000961 E2E5                    	loop    lpMixSamp
  1405                                  lpMixBye:       
  1406                                  ;	mov     ebx, esi
  1407                                  ;	pop     esi
  1408                                  ;	pop     edx
  1409                                  ;	sub     ebx, edx
  1410                                  ;	mov     [esi+TrackInfo.Position], ebx
  1411                                  ;	mov     [esi+TrackInfo.Error], ah
  1412                                  ;	retn
  1413 00000963 EB9C                    	jmp	short nlMixBye
  1414                                  
  1415                                  ;--------------------------------------------------------------------------
  1416                                  ; mixpoll - updates the output buffer
  1417                                  ;--------------------------------------------------------------------------
  1418                                  ;
  1419                                  ;--------------------------------------------------------------------------
  1420                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1421                                  ;  In:
  1422                                  ;    Buffer  - Buffer Address.
  1423                                  ;    Count   - Buffer Size.
  1424                                  ;--------------------------------------------------------------------------
  1425                                  
  1426                                  mixpoll:
  1427                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1428                                  	; edi = buffer address
  1429                                  	; ebx = count
  1430                                  
  1431 00000965 60                      	pushad
  1432                                  
  1433                                  	;cld
  1434                                  NextChunk:      
  1435 00000966 66833D[AA810000]00      	cmp     word [BufLen], 0
  1436 0000096E 754A                    	jne     short CopyChunk
  1437                                  
  1438 00000970 53                      	push    ebx
  1439 00000971 57                      	push    edi
  1440                                  MixChunk:       
  1441 00000972 BF[9E710000]            	mov	edi, MixBuffer
  1442 00000977 0FB70D[A4810000]        	movzx	ecx, word [BpmSamples]
  1443                                  	;mov	cx, [BpmSamples]
  1444 0000097E 893D[A6810000]          	mov     [BufPtr], edi
  1445 00000984 66890D[AA810000]        	mov     [BufLen], cx
  1446                                  
  1447 0000098B B080                    	mov     al, 80h
  1448 0000098D F3AA                    	rep     stosb
  1449                                  
  1450                                  	;mov	cx, NumTracks
  1451                                  	;mov	cl, NumTracks ; 01/10/2017
  1452 0000098F 8A0D[E30E0000]          	mov	cl, [numtracks] ; 06/10/2017
  1453 00000995 BE[8E810000]            	mov	esi, Tracks - TrackInfo.size
  1454                                  GetSamples_next:
  1455 0000099A 51                      	push	ecx
  1456 0000099B 83C626                  	add	esi, TrackInfo.size
  1457 0000099E 668B0D[AA810000]        	mov	cx, [BufLen]
  1458 000009A5 8B3D[A6810000]          	mov	edi, [BufPtr]
  1459 000009AB E805FFFFFF              	call	MixTrack
  1460 000009B0 59                      	pop	ecx
  1461 000009B1 E2E7                    	loop	GetSamples_next	
  1462                                  
  1463 000009B3 E838FEFFFF              	call    UpdateTracks
  1464                                  
  1465 000009B8 5F                      	pop     edi
  1466 000009B9 5B                      	pop     ebx
  1467                                  CopyChunk:      
  1468                                  	;mov	cx, [BufLen]
  1469 000009BA 0FB70D[AA810000]        	movzx	ecx, word [BufLen]
  1470 000009C1 39D9                    	cmp	ecx, ebx
  1471                                  	;cmp	cx, bx
  1472 000009C3 7602                    	jbe     short MoveChunk
  1473                                  	;mov	cx, bx
  1474 000009C5 89D9                    	mov     ecx, ebx
  1475                                  MoveChunk:
  1476 000009C7 8B35[A6810000]          	mov     esi, [BufPtr]
  1477 000009CD 010D[A6810000]          	add     [BufPtr], ecx
  1478 000009D3 66290D[AA810000]        	sub     [BufLen], cx
  1479 000009DA 29CB                    	sub     ebx, ecx
  1480 000009DC F3A4                    	rep     movsb
  1481 000009DE 85DB                    	test    ebx, ebx
  1482 000009E0 7584                    	jnz     short NextChunk
  1483                                  
  1484 000009E2 61                      	popad	
  1485 000009E3 C3                      	retn
  1486                                  
  1487                                  
  1488                                  ;--------------------------------------------------------------------------
  1489                                  ; StartPlaying: Initializes the Sound System.
  1490                                  ;  In:
  1491                                  ;   Module Information Resources.
  1492                                  ;--------------------------------------------------------------------------
  1493                                  
  1494                                  StartPlaying:
  1495                                  	; 07/10/2017
  1496 000009E4 60                      	pushad
  1497                                  SetModParms:    
  1498 000009E5 C605[9E810000]00        	mov     byte [OrderPos], 0
  1499 000009EC C605[9F810000]06        	mov     byte [Tempo], DefTempo
  1500 000009F3 C605[A0810000]06        	mov     byte [TempoWait], DefTempo
  1501 000009FA C605[A1810000]7D        	mov     byte [Bpm], DefBpm
  1502 00000A01 C605[A2810000]40        	mov     byte [Row], 64
  1503 00000A08 C605[A3810000]00        	mov     byte [BreakRow], 0
  1504 00000A0F 66A1[E70E0000]          	mov     ax, [MixSpeed]
  1505 00000A15 31D2                    	xor     edx, edx
  1506 00000A17 66BB3200                	mov     bx, 24*DefBpm/60
  1507 00000A1B 66F7F3                  	div     bx
  1508 00000A1E 66A3[A4810000]          	mov     [BpmSamples], ax
  1509                                  ClearTracks:    
  1510 00000A24 BF[B4810000]            	mov     edi, Tracks
  1511                                  	; 06/10/2017
  1512                                  	;mov	ecx, NumTracks*TrackInfo.size
  1513 00000A29 B826000000              	mov	eax, TrackInfo.size
  1514 00000A2E 0FB70D[E30E0000]        	movzx	ecx, word [numtracks]
  1515 00000A35 F7E1                    	mul	ecx
  1516 00000A37 89C1                    	mov	ecx, eax
  1517 00000A39 31C0                    	xor     eax, eax
  1518                                  	;cld
  1519 00000A3B F3AA                    	rep     stosb
  1520                                  
  1521 00000A3D A3[A6810000]            	mov     [BufPtr], eax
  1522 00000A42 66A3[AA810000]          	mov     [BufLen], ax
  1523                                  MakePitch:
  1524 00000A48 66B80021                	mov     ax, MidCRate
  1525 00000A4C 66BBAC01                	mov     bx, 428
  1526 00000A50 66F7E3                  	mul     bx
  1527 00000A53 66F735[E70E0000]        	div     word [MixSpeed]
  1528 00000A5A 30F6                    	xor     dh, dh
  1529 00000A5C 88E2                    	mov     dl, ah
  1530 00000A5E 88C4                    	mov     ah, al
  1531 00000A60 30C0                    	xor     al, al
  1532                                  	;mov	cx, 857
  1533 00000A62 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1534 00000A66 31DB                    	xor     ebx, ebx
  1535 00000A68 BF[DC150000]            	mov     edi, PitchTable
  1536                                  PitchLoop:      
  1537 00000A6D 50                      	push    eax
  1538 00000A6E 52                      	push    edx
  1539 00000A6F 6639DA                  	cmp     dx, bx
  1540 00000A72 7303                    	jae     short NoDiv
  1541 00000A74 66F7F3                  	div     bx
  1542                                  NoDiv:          
  1543 00000A77 66AB                    	stosw
  1544 00000A79 5A                      	pop     edx
  1545 00000A7A 58                      	pop     eax
  1546                                  	;inc	bx
  1547 00000A7B 43                      	inc	ebx
  1548 00000A7C E2EF                    	loop    PitchLoop
  1549                                  MakeVolume:     
  1550 00000A7E 66B90041                	mov     cx, 16640
  1551 00000A82 89CB                    	mov     ebx, ecx
  1552                                  VolLoop:
  1553 00000A84 664B                    	dec     bx
  1554 00000A86 88D8                    	mov     al, bl
  1555 00000A88 F6EF                    	imul    bh
  1556                                  	;mov	[VolTable+bx], ah
  1557 00000A8A 88A3[9E300000]          	mov     [VolTable+ebx], ah
  1558 00000A90 E2F2                    	loop    VolLoop
  1559                                  
  1560 00000A92 61                      	popad
  1561 00000A93 C3                      	retn
  1562                                  
  1563                                  ;--------------------------------------------------------------------------
  1564                                  ; StopPlaying: ShutDown the Sound System.
  1565                                  ;--------------------------------------------------------------------------
  1566                                  
  1567                                  StopPlaying:
  1568                                  	; 19/06/2017
  1569                                  	; Stop Playing
  1570                                  	sys 	_audio, 0700h
  1570                              <1> 
  1570                              <1> 
  1570                              <1> 
  1570                              <1> 
  1570                              <1>  %if %0 >= 2
  1570 00000A94 BB00070000          <1>  mov ebx, %2
  1570                              <1>  %if %0 >= 3
  1570                              <1>  mov ecx, %3
  1570                              <1>  %if %0 = 4
  1570                              <1>  mov edx, %4
  1570                              <1>  %endif
  1570                              <1>  %endif
  1570                              <1>  %endif
  1570 00000A99 B820000000          <1>  mov eax, %1
  1570                              <1> 
  1570 00000A9E CD40                <1>  int 40h
  1571                                  	; Cancel callback service (for user)
  1572                                  	sys	_audio, 0900h
  1572                              <1> 
  1572                              <1> 
  1572                              <1> 
  1572                              <1> 
  1572                              <1>  %if %0 >= 2
  1572 00000AA0 BB00090000          <1>  mov ebx, %2
  1572                              <1>  %if %0 >= 3
  1572                              <1>  mov ecx, %3
  1572                              <1>  %if %0 = 4
  1572                              <1>  mov edx, %4
  1572                              <1>  %endif
  1572                              <1>  %endif
  1572                              <1>  %endif
  1572 00000AA5 B820000000          <1>  mov eax, %1
  1572                              <1> 
  1572 00000AAA CD40                <1>  int 40h
  1573                                  	; Deallocate Audio Buffer (for user)
  1574                                  	sys	_audio, 0A00h
  1574                              <1> 
  1574                              <1> 
  1574                              <1> 
  1574                              <1> 
  1574                              <1>  %if %0 >= 2
  1574 00000AAC BB000A0000          <1>  mov ebx, %2
  1574                              <1>  %if %0 >= 3
  1574                              <1>  mov ecx, %3
  1574                              <1>  %if %0 = 4
  1574                              <1>  mov edx, %4
  1574                              <1>  %endif
  1574                              <1>  %endif
  1574                              <1>  %endif
  1574 00000AB1 B820000000          <1>  mov eax, %1
  1574                              <1> 
  1574 00000AB6 CD40                <1>  int 40h
  1575                                  	; Disable Audio Device
  1576                                  	sys	_audio, 0C00h
  1576                              <1> 
  1576                              <1> 
  1576                              <1> 
  1576                              <1> 
  1576                              <1>  %if %0 >= 2
  1576 00000AB8 BB000C0000          <1>  mov ebx, %2
  1576                              <1>  %if %0 >= 3
  1576                              <1>  mov ecx, %3
  1576                              <1>  %if %0 = 4
  1576                              <1>  mov edx, %4
  1576                              <1>  %endif
  1576                              <1>  %endif
  1576                              <1>  %endif
  1576 00000ABD B820000000          <1>  mov eax, %1
  1576                              <1> 
  1576 00000AC2 CD40                <1>  int 40h
  1577                                  
  1578 00000AC4 C3                      	retn
  1579                                  
  1580                                  ; 24/06/2017
  1581                                  ;--------------------------------------------------------------------------
  1582                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1583                                  ;--------------------------------------------------------------------------
  1584                                  ; This Conversion is needed for AC'97 hardware 
  1585                                  ; which ony supports 16 bit stereo samples !
  1586                                  
  1587                                  ; source = temp_buffer (8192 bytes)
  1588                                  ; destination = Audio_Buffer (32768 bytes)
  1589                                  
  1590                                  ConvertSamples:
  1591                                  	; 24/06/2017
  1592 00000AC5 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1593 00000ACA BE[00800100]            	mov	esi, temp_buffer
  1594 00000ACF BF[00000100]            	mov	edi, Audio_Buffer
  1595                                  c_smpl_1:
  1596 00000AD4 AC                      	lodsb	; get 8 bit mono sample
  1597 00000AD5 20C0                    	and	al, al
  1598 00000AD7 7506                    	jnz	short c_smpl_2
  1599 00000AD9 66B80080                	mov	ax, 8000h
  1600 00000ADD EB06                    	jmp	short c_smpl_3
  1601                                  c_smpl_2:
  1602 00000ADF 2C80                    	sub	al, 80h	
  1603 00000AE1 88C4                    	mov	ah, al
  1604 00000AE3 28C0                    	sub	al, al
  1605                                  c_smpl_3:	
  1606 00000AE5 6689C2                  	mov	dx, ax
  1607 00000AE8 C1E010                  	shl	eax, 16
  1608 00000AEB 6689D0                  	mov	ax, dx
  1609 00000AEE AB                      	stosd	; save 16 bit stereo sample
  1610 00000AEF E2E3                    	loop 	c_smpl_1
  1611                                  	
  1612 00000AF1 C3                      	retn
  1613                                  
  1614                                  ;=============================================================================
  1615                                  ; 
  1616                                  ;=============================================================================
  1617                                  
  1618                                  ;dword2str:
  1619                                  ;	; 13/11/2016 - Erdogan Tan 
  1620                                  ;	; eax = dword value
  1621                                  ;	;
  1622                                  ;	call	dwordtohex
  1623                                  ;	mov	[dword_str], edx
  1624                                  ;	mov	[dword_str+4], eax
  1625                                  ;	mov	si, dword_str
  1626                                  ;	retn
  1627                                  
  1628                                  	; 05/03/2017 (TRDOS 386)
  1629                                  	; trdos386.s (unix386.s) - 10/05/2015
  1630                                  	; Convert binary number to hexadecimal string
  1631                                  
  1632                                  ;bytetohex:
  1633                                  ;	; INPUT ->
  1634                                  ;	; 	AL = byte (binary number)
  1635                                  ;	; OUTPUT ->
  1636                                  ;	;	AX = hexadecimal string
  1637                                  ;	;
  1638                                  ;	push	ebx
  1639                                  ;	movzx	ebx, al
  1640                                  ;	shr	bl, 4
  1641                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1642                                  ;	xchg	bl, al
  1643                                  ;	and	bl, 0Fh
  1644                                  ;	mov	ah, [ebx+hex_chars] 
  1645                                  ;	pop	ebx	
  1646                                  ;	retn
  1647                                  
  1648                                  ;wordtohex:
  1649                                  ;	; INPUT ->
  1650                                  ;	; 	AX = word (binary number)
  1651                                  ;	; OUTPUT ->
  1652                                  ;	;	EAX = hexadecimal string
  1653                                  ;	;
  1654                                  ;	push	ebx
  1655                                  ;	xor	ebx, ebx
  1656                                  ;	xchg	ah, al
  1657                                  ;	push	eax
  1658                                  ;	mov	bl, ah
  1659                                  ;	shr	bl, 4
  1660                                  ;	mov	al, [ebx+hex_chars] 	 	
  1661                                  ;	mov	bl, ah
  1662                                  ;	and	bl, 0Fh
  1663                                  ;	mov	ah, [ebx+hex_chars]
  1664                                  ;	shl	eax, 16
  1665                                  ;	pop	eax
  1666                                  ;	pop	ebx
  1667                                  ;	jmp	short bytetohex
  1668                                  
  1669                                  ;dwordtohex:
  1670                                  ;	; INPUT ->
  1671                                  ;	; 	EAX = dword (binary number)
  1672                                  ;	; OUTPUT ->
  1673                                  ;	;	EDX:EAX = hexadecimal string
  1674                                  ;	;
  1675                                  ;	push	eax
  1676                                  ;	shr	eax, 16
  1677                                  ;	call	wordtohex
  1678                                  ;	mov	edx, eax
  1679                                  ;	pop	eax
  1680                                  ;	call	wordtohex
  1681                                  ;	retn
  1682                                  
  1683                                  	; 24/06/2017
  1684                                  	; 19/06/2017
  1685                                  	; 05/03/2017 (TRDOS 386)
  1686                                  	; 13/11/2016 - Erdogan Tan
  1687                                  write_audio_dev_info:
  1688                                  	; BUS/DEV/FN
  1689                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1690                                  	; DEV/VENDOR
  1691                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1692                                  
  1693 00000AF2 8B35[900F0000]          	mov	esi, [dev_vendor]
  1694 00000AF8 6689F0                  	mov	ax, si
  1695 00000AFB 0FB6D8                  	movzx	ebx, al
  1696 00000AFE 88DA                    	mov	dl, bl
  1697 00000B00 80E30F                  	and	bl, 0Fh
  1698 00000B03 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1699 00000B09 A2[2E0F0000]            	mov	[msgVendorId+3], al
  1700 00000B0E 88D3                    	mov	bl, dl
  1701 00000B10 C0EB04                  	shr	bl, 4
  1702 00000B13 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1703 00000B19 A2[2D0F0000]            	mov	[msgVendorId+2], al
  1704 00000B1E 88E3                    	mov	bl, ah
  1705 00000B20 88DA                    	mov	dl, bl
  1706 00000B22 80E30F                  	and	bl, 0Fh
  1707 00000B25 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1708 00000B2B A2[2C0F0000]            	mov	[msgVendorId+1], al
  1709 00000B30 88D3                    	mov	bl, dl
  1710 00000B32 C0EB04                  	shr	bl, 4
  1711 00000B35 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1712 00000B3B A2[2B0F0000]            	mov	[msgVendorId], al
  1713 00000B40 C1EE10                  	shr	esi, 16
  1714 00000B43 6689F0                  	mov	ax, si
  1715 00000B46 88C3                    	mov	bl, al
  1716 00000B48 88DA                    	mov	dl, bl
  1717 00000B4A 80E30F                  	and	bl, 0Fh
  1718 00000B4D 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1719 00000B53 A2[3F0F0000]            	mov	[msgDevId+3], al
  1720 00000B58 88D3                    	mov	bl, dl
  1721 00000B5A C0EB04                  	shr	bl, 4
  1722 00000B5D 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1723 00000B63 A2[3E0F0000]            	mov	[msgDevId+2], al
  1724 00000B68 88E3                    	mov	bl, ah
  1725 00000B6A 88DA                    	mov	dl, bl
  1726 00000B6C 80E30F                  	and	bl, 0Fh
  1727 00000B6F 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1728 00000B75 A2[3D0F0000]            	mov	[msgDevId+1], al
  1729 00000B7A 88D3                    	mov	bl, dl
  1730 00000B7C C0EB04                  	shr	bl, 4
  1731 00000B7F 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1732 00000B85 A2[3C0F0000]            	mov	[msgDevId], al
  1733                                  
  1734 00000B8A 8B35[940F0000]          	mov	esi, [bus_dev_fn]
  1735 00000B90 C1EE08                  	shr	esi, 8
  1736 00000B93 6689F0                  	mov	ax, si
  1737 00000B96 88C3                    	mov	bl, al
  1738 00000B98 88DA                    	mov	dl, bl
  1739 00000B9A 80E307                  	and	bl, 7 ; bit 0,1,2
  1740 00000B9D 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1741 00000BA3 A2[630F0000]            	mov	[msgFncNo+1], al
  1742 00000BA8 88D3                    	mov	bl, dl
  1743 00000BAA C0EB03                  	shr	bl, 3
  1744 00000BAD 88DA                    	mov	dl, bl
  1745 00000BAF 80E30F                  	and	bl, 0Fh
  1746 00000BB2 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1747 00000BB8 A2[550F0000]            	mov	[msgDevNo+1], al
  1748 00000BBD 88D3                    	mov	bl, dl
  1749 00000BBF C0EB04                  	shr	bl, 4
  1750 00000BC2 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1751 00000BC8 A2[540F0000]            	mov	[msgDevNo], al
  1752 00000BCD 88E3                    	mov	bl, ah
  1753 00000BCF 88DA                    	mov	dl, bl
  1754 00000BD1 80E30F                  	and	bl, 0Fh
  1755 00000BD4 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1756 00000BDA A2[490F0000]            	mov	[msgBusNo+1], al
  1757 00000BDF 88D3                    	mov	bl, dl
  1758 00000BE1 C0EB04                  	shr	bl, 4
  1759 00000BE4 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1760 00000BEA A2[480F0000]            	mov	[msgBusNo], al
  1761                                  
  1762                                  	; 24/06/2017
  1763 00000BEF 66A1[9C0F0000]          	mov	ax, [ac97_NamBar]
  1764 00000BF5 88C3                    	mov	bl, al
  1765 00000BF7 88DA                    	mov	dl, bl
  1766 00000BF9 80E30F                  	and	bl, 0Fh
  1767 00000BFC 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1768 00000C02 A2[720F0000]            	mov	[msgNamBar+3], al
  1769 00000C07 88D3                    	mov	bl, dl
  1770 00000C09 C0EB04                  	shr	bl, 4
  1771 00000C0C 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1772 00000C12 A2[710F0000]            	mov	[msgNamBar+2], al
  1773 00000C17 88E3                    	mov	bl, ah
  1774 00000C19 88DA                    	mov	dl, bl
  1775 00000C1B 80E30F                  	and	bl, 0Fh
  1776 00000C1E 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1777 00000C24 A2[700F0000]            	mov	[msgNamBar+1], al
  1778 00000C29 88D3                    	mov	bl, dl
  1779 00000C2B C0EB04                  	shr	bl, 4
  1780 00000C2E 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1781 00000C34 A2[6F0F0000]            	mov	[msgNamBar], al
  1782                                  
  1783 00000C39 66A1[9E0F0000]          	mov	ax, [ac97_NabmBar]
  1784 00000C3F 88C3                    	mov	bl, al
  1785 00000C41 88DA                    	mov	dl, bl
  1786 00000C43 80E30F                  	and	bl, 0Fh
  1787 00000C46 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1788 00000C4C A2[820F0000]            	mov	[msgNabmBar+3], al
  1789 00000C51 88D3                    	mov	bl, dl
  1790 00000C53 C0EB04                  	shr	bl, 4
  1791 00000C56 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1792 00000C5C A2[810F0000]            	mov	[msgNabmBar+2], al
  1793 00000C61 88E3                    	mov	bl, ah
  1794 00000C63 88DA                    	mov	dl, bl
  1795 00000C65 80E30F                  	and	bl, 0Fh
  1796 00000C68 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1797 00000C6E A2[800F0000]            	mov	[msgNabmBar+1], al
  1798 00000C73 88D3                    	mov	bl, dl
  1799 00000C75 C0EB04                  	shr	bl, 4
  1800 00000C78 8A83[E90E0000]          	mov	al, [ebx+hex_chars]
  1801 00000C7E A2[7F0F0000]            	mov	[msgNabmBar], al
  1802                                  
  1803                                  	; 24/11/2016
  1804 00000C83 30E4                    	xor	ah, ah
  1805 00000C85 A0[A00F0000]            	mov	al, [ac97_int_ln_reg]
  1806 00000C8A B10A                    	mov	cl, 10
  1807 00000C8C F6F1                    	div	cl
  1808 00000C8E 660105[8B0F0000]        	add	[msgIRQ], ax
  1809 00000C95 20C0                    	and	al, al
  1810 00000C97 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1811 00000C99 A0[8C0F0000]            	mov	al, [msgIRQ+1]
  1812 00000C9E B420                    	mov	ah, ' '
  1813 00000CA0 66A3[8B0F0000]          	mov	[msgIRQ], ax
  1814                                  _w_ac97imsg_:
  1815                                  	; EBX = Message address
  1816                                  	; ECX = Max. message length (or stop on ZERO character)
  1817                                  	;	(1 to 255)
  1818                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1819                                       	sys 	_msg, msgAC97Info, 255, 07h
  1819                              <1> 
  1819                              <1> 
  1819                              <1> 
  1819                              <1> 
  1819                              <1>  %if %0 >= 2
  1819 00000CA6 BB[FA0E0000]        <1>  mov ebx, %2
  1819                              <1>  %if %0 >= 3
  1819 00000CAB B9FF000000          <1>  mov ecx, %3
  1819                              <1>  %if %0 = 4
  1819 00000CB0 BA07000000          <1>  mov edx, %4
  1819                              <1>  %endif
  1819                              <1>  %endif
  1819                              <1>  %endif
  1819 00000CB5 B823000000          <1>  mov eax, %1
  1819                              <1> 
  1819 00000CBA CD40                <1>  int 40h
  1820 00000CBC C3                              retn
  1821                                  
  1822                                  ;=============================================================================
  1823                                  ;               preinitialized data
  1824                                  ;=============================================================================
  1825                                  
  1826                                  ;=============================================================================
  1827                                  ; Protracker effects stuff
  1828                                  ;=============================================================================
  1829                                  
  1830                                  ;-----------------------------------------------------------------------------
  1831                                  ; Effect jump tables
  1832                                  ;-----------------------------------------------------------------------------
  1833                                  
  1834 00000CBD 90<rept>                align 4
  1835                                  
  1836                                  efxtable:
  1837 00000CC0 [5A070000]              	dd      efxarpeggio	; 0 - arpeggio
  1838 00000CC4 [87040000]              	dd      efxnull		; 1 - porta up
  1839 00000CC8 [87040000]              	dd      efxnull		; 2 - porta down
  1840 00000CCC [A5060000]              	dd      efxtoneporta	; 3 - tone porta
  1841 00000CD0 [B4060000]              	dd      efxvibrato	; 4 - vibrato
  1842 00000CD4 [87040000]              	dd      efxnull		; 5 - tone+slide
  1843 00000CD8 [87040000]              	dd      efxnull		; 6 - vibrato+slide
  1844 00000CDC [D1070000]              	dd      efxtremolo	; 7 - tremolo
  1845 00000CE0 [87040000]              	dd      efxnull		; 8 - unused
  1846 00000CE4 [DC060000]              	dd      efxsampoffset	; 9 - sample offset
  1847 00000CE8 [87040000]              	dd      efxnull		; A - volume slide
  1848 00000CEC [E8060000]              	dd      efxpattjump	; B - pattern jump
  1849 00000CF0 [F6060000]              	dd      efxsetvolume	; C - set volume
  1850 00000CF4 [04070000]              	dd      efxbreak	; D - break pattern
  1851 00000CF8 [87040000]              	dd      efxnull		; E - extra effects
  1852 00000CFC [23070000]              	dd      efxsetspeed	; F - set speed
  1853                                  
  1854                                  efxtable2:
  1855 00000D00 [88040000]              	dd      efxarpeggio2	; 0 - arpeggio
  1856 00000D04 [AA040000]              	dd      efxportaup	; 1 - porta up
  1857 00000D08 [D0040000]              	dd      efxportadown	; 2 - porta down
  1858 00000D0C [F7040000]              	dd      efxtoneporta2	; 3 - tone porta
  1859 00000D10 [30050000]              	dd      efxvibrato2	; 4 - vibrato
  1860 00000D14 [8C050000]              	dd      efxtoneslide	; 5 - tone+slide
  1861 00000D18 [99050000]              	dd      efxvibslide	; 6 - vibrato+slide
  1862 00000D1C [C0050000]              	dd      efxtremolo2	; 7 - tremolo
  1863 00000D20 [87040000]              	dd      efxnull		; 8 - unused
  1864 00000D24 [87040000]              	dd      efxnull		; 9 - sample offset
  1865 00000D28 [A3050000]              	dd      efxvolslide	; A - volume slide
  1866 00000D2C [87040000]              	dd      efxnull		; B - pattern jump
  1867 00000D30 [87040000]              	dd      efxnull		; C - set volume
  1868 00000D34 [87040000]              	dd      efxnull		; D - break pattern
  1869 00000D38 [87040000]              	dd      efxnull		; E - extra effects
  1870 00000D3C [87040000]              	dd      efxnull		; F - set speed
  1871                                  
  1872                                  ;-----------------------------------------------------------------------------
  1873                                  ; Amiga period table
  1874                                  ;-----------------------------------------------------------------------------
  1875                                  
  1876                                  ;PeriodTable0:	
  1877                                  ;	dw	0
  1878                                  PeriodTable:
  1879 00000D40 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  1879 00000D49 0A000A7009E8086808-
  1879 00000D52 F00780071407       
  1880 00000D58 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  1880 00000D61 050005B80474043404-
  1880 00000D6A F803C0038A03       
  1881 00000D70 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1881 00000D79 0280025C023A021A02-
  1881 00000D82 FC01E001C501       
  1882 00000D88 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  1882 00000D91 0140012E011D010D01-
  1882 00000D9A FE00F000E200       
  1883 00000DA0 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  1883 00000DA9 00A00097008F008700-
  1883 00000DB2 7F0078007100       
  1884 00000DB8 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  1884 00000DC1 0050004B0047004300-
  1884 00000DCA 3F003C003800       
  1885 00000DD0 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  1885 00000DD9 002800250023002100-
  1885 00000DE2 1F001E001C00       
  1886                                  
  1887                                  ;-----------------------------------------------------------------------------
  1888                                  ; Sinus wave table
  1889                                  ;-----------------------------------------------------------------------------
  1890                                  
  1891                                  SinTable:
  1892 00000DE8 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  1892 00000DF1 C5D4E1             
  1893 00000DF4 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  1893 00000DFD E1                 
  1894 00000DFE D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  1894 00000E07 19                 
  1895                                  
  1896                                  ;=============================================================================
  1897                                  ; Copyright Strings & Messages
  1898                                  ;=============================================================================
  1899 00000E08 00                      	db	0
  1900                                  msg_2017:
  1901 00000E09 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1901 00000E12 506C6179657220666F-
  1901 00000E1B 72205452444F532033-
  1901 00000E24 383620627920457264-
  1901 00000E2D 6F67616E2054616E2E-
  1901 00000E36 20                 
  1902 00000E37 4F63746F6265722032-     	db	'October 2017.',10,13
  1902 00000E40 3031372E0A0D       
  1903 00000E46 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1903 00000E4F 64706C61792066696C-
  1903 00000E58 656E616D652E6D6F64-
  1903 00000E61 0A0D00             
  1904 00000E64 31332F31302F323031-     	db	'13/10/2017',10,13,0
  1904 00000E6D 370A0D00           
  1905                                  
  1906                                  Credits:
  1907 00000E71 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1907 00000E7A 506C61796572207630-
  1907 00000E83 2E3162206279204361-
  1907 00000E8C 726C6F732048617361-
  1907 00000E95 6E2E204A756C792031-
  1907 00000E9E 3939332E           
  1908 00000EA2 0A0D00                  	db	10,13,0
  1909                                  ErrorMesg:
  1910 00000EA5 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  1910 00000EAE 64696E67204D6F6475-
  1910 00000EB7 6C652066696C652E0A-
  1910 00000EC0 0D00               
  1911                                  
  1912                                  ;MsgNotFound: db	'Sound Blaster not found or IRQ error.',10,13,0
  1913                                  ;MsgFound:    db	'Sound Blaster found at Address 2'
  1914                                  ;PortText:    db	'x0h, IRQ '
  1915                                  ;IrqText:     db	'x.',10,13,0
  1916                                  
  1917                                  trdos386_err_msg:
  1918 00000EC2 5452444F5320333836-     	db	'TRDOS 386 System call error !', 10, 13,0
  1918 00000ECB 2053797374656D2063-
  1918 00000ED4 616C6C206572726F72-
  1918 00000EDD 20210A0D00         
  1919                                  
  1920                                  ; 07/10/2017
  1921 00000EE2 0A                      pattern_shift:	db 10
  1922 00000EE3 0400                    numtracks:	dw 4
  1923                                  
  1924                                  ;=============================================================================
  1925                                  ;               PLAYER.ASM - DATA
  1926                                  ;=============================================================================
  1927                                  
  1928 00000EE5 01                      stmo:	db 1 ; stereo (2) or mono (1)  
  1929 00000EE6 08                      bps:	db 8 ; bits per sample (8 or 16)
  1930                                  Sample_Rate:
  1931                                  MixSpeed: 
  1932 00000EE7 2256                    	dw 22050 ; Hz
  1933                                  
  1934                                  ; 13/11/2016
  1935 00000EE9 303132333435363738-     hex_chars: db "0123456789ABCDEF", 0
  1935 00000EF2 3941424344454600   
  1936                                  ;
  1937                                  msgAC97Info:	
  1938 00000EFA 0D0A                    	db 0Dh, 0Ah
  1939 00000EFC 414339372041756469-     	db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1939 00000F05 6F20436F6E74726F6C-
  1939 00000F0E 6C6572202620436F64-
  1939 00000F17 656320496E666F0D0A 
  1940 00000F20 56656E646F72204944-     	db "Vendor ID: "
  1940 00000F29 3A20               
  1941                                  msgVendorId:
  1942 00000F2B 303030306820446576-     	db "0000h Device ID: "
  1942 00000F34 6963652049443A20   
  1943                                  msgDevId:
  1944 00000F3C 30303030680D0A          	db "0000h", 0Dh, 0Ah
  1945 00000F43 4275733A20              	db "Bus: "
  1946                                  msgBusNo:
  1947 00000F48 303068204465766963-     	db "00h Device: "
  1947 00000F51 653A20             
  1948                                  msgDevNo:
  1949 00000F54 3030682046756E6374-     	db "00h Function: "
  1949 00000F5D 696F6E3A20         
  1950                                  msgFncNo:
  1951 00000F62 303068                  	db "00h"
  1952 00000F65 0D0A                    	db 0Dh, 0Ah
  1953 00000F67 4E414D4241523A20        	db "NAMBAR: "
  1954                                  msgNamBar:
  1955 00000F6F 30303030682020          	db "0000h  "
  1956 00000F76 4E41424D4241523A20      	db "NABMBAR: "
  1957                                  msgNabmBar:
  1958 00000F7F 303030306820204952-     	db "0000h  IRQ: "
  1958 00000F88 513A20             
  1959                                  msgIRQ:	
  1960 00000F8B 3030                    	dw 3030h
  1961 00000F8D 0D0A00                  	db 0Dh, 0Ah, 0
  1962                                  
  1963                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1964                                  ;codec_id:	   dd 0
  1965                                  ;codec_chip_id:	   dd 0
  1966                                  ;codec_vendor_ids: dw 0
  1967                                  ;codec_chip_ids:   dw 0
  1968                                  
  1969                                  ;dword_str:	dd 30303030h, 30303030h
  1970                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1971                                  
  1972                                  ;=============================================================================
  1973                                  ;        	uninitialized data
  1974                                  ;=============================================================================
  1975                                  
  1976                                  bss_start:
  1977                                  
  1978                                  ABSOLUTE bss_start
  1979                                  
  1980                                  alignb 4
  1981                                  
  1982 00000F90 <res 00000004>          dev_vendor:	resd 1
  1983 00000F94 <res 00000004>          bus_dev_fn:	resd 1
  1984 00000F98 <res 00000004>          stats_cmd:	resd 1
  1985 00000F9C <res 00000002>          ac97_NamBar:	resw 1
  1986 00000F9E <res 00000002>          ac97_NabmBar:	resw 1
  1987 00000FA0 <res 00000001>          ac97_int_ln_reg: resb 1
  1988 00000FA1 <res 00000001>          srb:	resb 1
  1989                                  
  1990                                  ; MODLOAD.ASM
  1991 00000FA2 <res 00000004>          FileHandle:	resd 1
  1992 00000FA6 <res 0000043C>          Header:		resb ModHeader.size
  1993                                  
  1994                                  ; MODPLAY.ASM
  1995                                  ;MixSpeed:	    resw 1
  1996                                  
  1997                                  ModInfo:
  1998 000013E2 <res 00000001>          ModInfo.OrderLen:   resb 1
  1999 000013E3 <res 00000001>          ModInfo.ReStart:    resb 1
  2000 000013E4 <res 00000080>          ModInfo.Order:	    resb 128
  2001 00001464 <res 00000004>          ModInfo.Patterns:   resd 1
  2002                                  
  2003 00001468 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2004 000014A6 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2005 000014E4 <res 0000003E>          ModInfo.SampLen:    resw 31
  2006 00001522 <res 0000003E>          ModInfo.SampRep:    resw 31
  2007 00001560 <res 0000003E>          ModInfo.SampRepLen: resw 31
  2008 0000159E <res 0000003E>          ModInfo.SampVol:    resw 31
  2009                                  
  2010                                  ; MODPLAY.ASM
  2011                                  PitchTable: ;resw 857
  2012 000015DC <res 00001AC2>          	    resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2013 0000309E <res 00004100>          VolTable:   resb 16640
  2014 0000719E <res 00001000>          MixBuffer   resb MixBufSize
  2015                                  
  2016                                  ; MODPLAY.ASM
  2017 0000819E <res 00000001>          OrderPos: resb 1
  2018 0000819F <res 00000001>          Tempo:	resb 1
  2019 000081A0 <res 00000001>          TempoWait: resb 1
  2020 000081A1 <res 00000001>          Bpm:	resb 1
  2021 000081A2 <res 00000001>          Row:	resb 1
  2022 000081A3 <res 00000001>          BreakRow: resb 1
  2023 000081A4 <res 00000002>          BpmSamples: resw 1
  2024 000081A6 <res 00000004>          BufPtr:	resd 1
  2025 000081AA <res 00000002>          BufLen:	resw 1
  2026 000081AC <res 00000004>          BufRep:	resd 1
  2027 000081B0 <res 00000004>          Note:	resd 1
  2028                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2029                                  ; 06/10/2017
  2030 000081B4 <res 00000130>          Tracks:	resb TrackInfo.size*8
  2031                                  
  2032 000082E4 <res 0000000C>          alignb 16
  2033                                  
  2034                                  ; PLAY.ASM
  2035 000082F0 <res 00000280>          Scope:	resw 320
  2036 00008570 <res 00000200>          RowOfs:	resw 256
  2037                                  
  2038                                  mod_file_name:
  2039 00008770 <res 00000050>          	resb 80
  2040                                  
  2041 000087C0 <res 00000840>          alignb 4096
  2042                                  
  2043                                  g_buff:
  2044 00009000 <res 00000500>          	resb 320*4 ; 24/06/2017
  2045                                  
  2046 00009500 <res 00006B00>          alignb 65536
  2047                                  
  2048                                  Audio_Buffer:
  2049 00010000 <res 00008000>          	resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2050                                  temp_buffer:
  2051 00018000 <res 00002000>          	resb BUFFERSIZE / 4 ; 8192
  2052                                  
  2053 0001A000 <res 00006000>          alignb 65536
  2054                                  
  2055                                  file_buffer:
  2056 00020000 <res 00060000>          	resb 65536*6
  2057                                  EOF:
