     1                                  ; ****************************************************************************
     2                                  ; modplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 24/06/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 from 'playwav3.s' (13/06/2017)
    14                                  ;
    15                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    16                                  ;			                     (23/06/2017)
    17                                  ;
    18                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    19                                  ;				      (04/03/2017) 
    20                                  ; Assembler: NASM 2.11
    21                                  ; ----------------------------------------------------------------------------
    22                                  ;	   nasm  modplay.s -l modplay.txt -o MODPLAY.PRG	
    23                                  ; ****************************************************************************
    24                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    25                                  
    26                                  ; 01/03/2017
    27                                  ; 16/10/2016
    28                                  ; 29/04/2016
    29                                  ; TRDOS 386 system calls (temporary list!)
    30                                  _ver 	equ 0
    31                                  _exit 	equ 1
    32                                  _fork 	equ 2
    33                                  _read 	equ 3
    34                                  _write	equ 4
    35                                  _open	equ 5
    36                                  _close 	equ 6
    37                                  _wait 	equ 7
    38                                  _creat 	equ 8
    39                                  _link 	equ 9
    40                                  _unlink	equ 10
    41                                  _exec	equ 11
    42                                  _chdir	equ 12
    43                                  _time 	equ 13
    44                                  _mkdir 	equ 14
    45                                  _chmod	equ 15
    46                                  _chown	equ 16
    47                                  _break	equ 17
    48                                  _stat	equ 18
    49                                  _seek	equ 19
    50                                  _tell 	equ 20
    51                                  _mount	equ 21
    52                                  _umount	equ 22
    53                                  _setuid	equ 23
    54                                  _getuid	equ 24
    55                                  _stime	equ 25
    56                                  _quit	equ 26	
    57                                  _intr	equ 27
    58                                  _fstat	equ 28
    59                                  _emt 	equ 29
    60                                  _mdate 	equ 30
    61                                  _video 	equ 31
    62                                  _audio	equ 32
    63                                  _timer	equ 33
    64                                  _sleep	equ 34
    65                                  _msg    equ 35
    66                                  _geterr	equ 36
    67                                  _fpsave	equ 37
    68                                  _pri	equ 38
    69                                  _rele	equ 39
    70                                  _fff	equ 40
    71                                  _fnf	equ 41
    72                                  _alloc	equ 42
    73                                  _dalloc equ 43
    74                                  _calbac equ 44		
    75                                  
    76                                  %macro sys 1-4
    77                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    78                                      ; 03/09/2015	
    79                                      ; 13/04/2015
    80                                      ; Retro UNIX 386 v1 system call.	
    81                                      %if %0 >= 2   
    82                                          mov ebx, %2
    83                                          %if %0 >= 3    
    84                                              mov ecx, %3
    85                                              %if %0 = 4
    86                                                 mov edx, %4   
    87                                              %endif
    88                                          %endif
    89                                      %endif
    90                                      mov eax, %1
    91                                      ;int 30h
    92                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    93                                  %endmacro
    94                                  
    95                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    96                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    97                                  
    98                                  ; 19/06/2017
    99                                  BUFFERSIZE equ 32768
   100                                  
   101                                  ; ----------------------------------------------------------------------------
   102                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   103                                  ;	July 14th, 1993.
   104                                  
   105                                  ;=============================================================================
   106                                  ;  
   107                                  ;=============================================================================
   108                                  
   109                                  [BITS 32]
   110                                  [org 0]
   111                                  
   112                                  Start:
   113                                  	; clear bss
   114 00000000 B9[00000800]            	mov	ecx, EOF
   115 00000005 BF[8A0E0000]            	mov	edi, bss_start
   116 0000000A 29F9                    	sub	ecx, edi
   117 0000000C D1E9                    	shr	ecx, 1
   118 0000000E 31C0                    	xor	eax, eax
   119 00000010 F366AB                  	rep	stosw
   120                                  
   121                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   122 00000013 E8E2010000              	call    DetectICH
   123 00000018 731B                    	jnc     short GetFileName
   124                                  
   125                                  _dev_not_ready:
   126                                  ; couldn't find the audio device!
   127                                  	sys	_msg, noDevMsg, 255, 0Fh
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1>  %if %0 >= 2
   127 0000001A BB[07020000]        <1>  mov ebx, %2
   127                              <1>  %if %0 >= 3
   127 0000001F B9FF000000          <1>  mov ecx, %3
   127                              <1>  %if %0 = 4
   127 00000024 BA0F000000          <1>  mov edx, %4
   127                              <1>  %endif
   127                              <1>  %endif
   127                              <1>  %endif
   127 00000029 B823000000          <1>  mov eax, %1
   127                              <1> 
   127 0000002E CD40                <1>  int 40h
   128 00000030 E9A4010000                      jmp     Exit
   129                                  
   130                                  GetFileName:  
   131 00000035 89E6                    	mov	esi, esp
   132 00000037 AD                      	lodsd
   133 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   134                                  		; (program file name & mod file name)
   135 0000003B 0F82A1010000            	jb	pmsg_2017 ; nothing to do
   136                                  
   137 00000041 AD                      	lodsd ; program file name address 
   138 00000042 AD                      	lodsd ; mod file name address (file to be read)
   139 00000043 89C6                    	mov	esi, eax
   140 00000045 BF[B0710000]            	mov	edi, mod_file_name
   141                                  ScanName:       
   142 0000004A AC                      	lodsb
   143 0000004B 84C0                    	test	al, al
   144 0000004D 0F848F010000            	je	pmsg_2017
   145 00000053 3C20                    	cmp	al, 20h
   146 00000055 74F3                    	je	short ScanName	; scan start of name.
   147 00000057 AA                      	stosb
   148 00000058 B4FF                    	mov	ah, 0FFh
   149                                  a_0:	
   150 0000005A FEC4                    	inc	ah
   151                                  a_1:
   152 0000005C AC                      	lodsb
   153 0000005D AA                      	stosb
   154 0000005E 3C2E                    	cmp	al, '.'
   155 00000060 74F8                    	je	short a_0	
   156 00000062 20C0                    	and	al, al
   157 00000064 75F6                    	jnz	short a_1
   158                                  
   159 00000066 08E4                    	or	ah, ah		; if period NOT found,
   160 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   161                                  SetExt:
   162 0000006A 4F                      	dec	edi
   163 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   164 00000071 C6470400                	mov	byte [edi+4], 0
   165                                  PrintMesg:      
   166                                  	; Prints the Credits Text.
   167                                  	sys	_msg, Credits, 255, 0Fh
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1>  %if %0 >= 2
   167 00000075 BB[060D0000]        <1>  mov ebx, %2
   167                              <1>  %if %0 >= 3
   167 0000007A B9FF000000          <1>  mov ecx, %3
   167                              <1>  %if %0 = 4
   167 0000007F BA0F000000          <1>  mov edx, %4
   167                              <1>  %endif
   167                              <1>  %endif
   167                              <1>  %endif
   167 00000084 B823000000          <1>  mov eax, %1
   167                              <1> 
   167 00000089 CD40                <1>  int 40h
   168                                  _1:
   169                                  	; 19/06/2017
   170                                  	; Allocate Audio Buffer (for user)
   171                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 0000008B BB00020000          <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 00000090 B900800000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 00000095 BA[00000100]        <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 0000009A B820000000          <1>  mov eax, %1
   171                              <1> 
   171 0000009F CD40                <1>  int 40h
   172 000000A1 0F8204010000            	jc	error_exit
   173                                  _2:
   174                                  	; Initialize Audio Device
   175                                  	sys	_audio, 0301h, 0, ac97_int_handler 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1>  %if %0 >= 2
   175 000000A7 BB01030000          <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   175 000000AC B900000000          <1>  mov ecx, %3
   175                              <1>  %if %0 = 4
   175 000000B1 BA[32020000]        <1>  mov edx, %4
   175                              <1>  %endif
   175                              <1>  %endif
   175                              <1>  %endif
   175 000000B6 B820000000          <1>  mov eax, %1
   175                              <1> 
   175 000000BB CD40                <1>  int 40h
   176 000000BD 0F82E8000000            	jc	error_exit
   177                                  
   178                                  LoadMod:  
   179 000000C3 BF[B0710000]            	mov	edi, mod_file_name
   180 000000C8 E814020000              	call    LoadModule		; Load the MODule...
   181                                  
   182 000000CD 66833D[A00E0000]00      	cmp     word [ErrorInfo], 0	; any error loading?
   183 000000D5 741B                    	je      short short _3
   184                                  
   185                                  	; yes, print error and Exit.
   186                                  
   187                                  	sys	_msg, ErrorMesg, 255, 0Fh
   187                              <1> 
   187                              <1> 
   187                              <1> 
   187                              <1> 
   187                              <1>  %if %0 >= 2
   187 000000D7 BB[3A0D0000]        <1>  mov ebx, %2
   187                              <1>  %if %0 >= 3
   187 000000DC B9FF000000          <1>  mov ecx, %3
   187                              <1>  %if %0 = 4
   187 000000E1 BA0F000000          <1>  mov edx, %4
   187                              <1>  %endif
   187                              <1>  %endif
   187                              <1>  %endif
   187 000000E6 B823000000          <1>  mov eax, %1
   187                              <1> 
   187 000000EB CD40                <1>  int 40h
   188                                  
   189 000000ED E9E7000000              	jmp     Exit
   190                                  
   191                                  _3:
   192                                  	; 10/06/2017
   193                                  	sys	_audio, 0E00h ; get audio controller info
   193                              <1> 
   193                              <1> 
   193                              <1> 
   193                              <1> 
   193                              <1>  %if %0 >= 2
   193 000000F2 BB000E0000          <1>  mov ebx, %2
   193                              <1>  %if %0 >= 3
   193                              <1>  mov ecx, %3
   193                              <1>  %if %0 = 4
   193                              <1>  mov edx, %4
   193                              <1>  %endif
   193                              <1>  %endif
   193                              <1>  %endif
   193 000000F7 B820000000          <1>  mov eax, %1
   193                              <1> 
   193 000000FC CD40                <1>  int 40h
   194 000000FE 0F82A7000000            	jc	error_exit
   195                                  
   196                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   197                                  	;jne	_dev_not_ready	
   198                                  
   199                                  	; EAX = IRQ Number in AL
   200                                  	;	Audio Device Number in AH 
   201                                  	; EBX = DEV/VENDOR ID
   202                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   203                                  	; ECX = BUS/DEV/FN 
   204                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   205                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   206                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   207                                  	;      (Low word, DX = NAMBAR address)
   208                                  
   209 00000104 A2[9C0E0000]            	mov	[ac97_int_ln_reg], al
   210 00000109 891D[8C0E0000]          	mov	[dev_vendor], ebx
   211 0000010F 890D[900E0000]          	mov	[bus_dev_fn], ecx
   212 00000115 668915[980E0000]        	mov	[ac97_NamBar], dx
   213                                  	;mov	[ac97_NamBar], dx
   214                                  	;shr	dx, 16
   215                                  	;mov	[ac97_NabmBar], dx
   216 0000011C 8915[980E0000]          	mov	[ac97_NamBar], edx	
   217                                    
   218 00000122 E8AF090000              	call	write_audio_dev_info 
   219                                  
   220                                  PlayNow: 
   221 00000127 E8A8080000              	call    StartPlaying
   222                                  
   223                                          ; load 32768 bytes into audio buffer
   224                                  	;mov	edi, Audio_Buffer
   225                                  	;mov	ebx, BUFFERSIZE
   226                                  	; 24/06/2017
   227                                          ; load 8192 bytes into audio buffer
   228 0000012C BF[00800100]            	mov	edi, temp_buffer
   229 00000131 BB00200000              	mov	ebx, BUFFERSIZE / 4
   230 00000136 E81C080000              	call	GetSamples
   231 0000013B 726E                    	jc	error_exit
   232                                  
   233                                  	; 24/06/2017
   234                                  	; 8 bit to 16 bit (*2)
   235                                  	; mono to stereo (*2)
   236                                  	; 4* (BUFFERSIZE/4) 
   237                                  	; source = temp_buffer
   238                                  	; destination = Audio_Buffer
   239 0000013D E867090000              	call 	ConvertSamples
   240                                  
   241                                  	;mov	ecx, 128	; Make a lookup table
   242 00000142 B180                    	mov	cl, 128
   243 00000144 31DB                    	xor     ebx, ebx	; for fastest pixel
   244 00000146 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   245                                  MakeOfs:        
   246 0000014B 668993[B06F0000]        	mov     [RowOfs+ebx], dx
   247 00000152 668993[B26F0000]        	mov     [RowOfs+ebx+2], dx
   248 00000159 6681C24001              	add     dx, 320
   249 0000015E 83C304                  	add     ebx, 4
   250 00000161 E2E8                    	loop    MakeOfs
   251                                  
   252                                  	; Set Master Volume Level
   253                                  	sys	_audio, 0B00h, 1D1Dh
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1>  %if %0 >= 2
   253 00000163 BB000B0000          <1>  mov ebx, %2
   253                              <1>  %if %0 >= 3
   253 00000168 B91D1D0000          <1>  mov ecx, %3
   253                              <1>  %if %0 = 4
   253                              <1>  mov edx, %4
   253                              <1>  %endif
   253                              <1>  %endif
   253                              <1>  %endif
   253 0000016D B820000000          <1>  mov eax, %1
   253                              <1> 
   253 00000172 CD40                <1>  int 40h
   254                                  
   255                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   256                                  	
   257                                  	; Start	to play
   258 00000174 A0[E00D0000]            	mov	al, [bps]
   259 00000179 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   260 0000017C D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   261 0000017E 8A1D[DF0D0000]          	mov	bl, [stmo]
   262 00000184 FECB                    	dec	bl
   263 00000186 08C3                    	or	bl, al
   264 00000188 668B0D[E10D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   265 0000018F B704                    	mov	bh, 4 ; start to play	
   266                                  	sys	_audio
   266                              <1> 
   266                              <1> 
   266                              <1> 
   266                              <1> 
   266                              <1>  %if %0 >= 2
   266                              <1>  mov ebx, %2
   266                              <1>  %if %0 >= 3
   266                              <1>  mov ecx, %3
   266                              <1>  %if %0 = 4
   266                              <1>  mov edx, %4
   266                              <1>  %endif
   266                              <1>  %endif
   266                              <1>  %endif
   266 00000191 B820000000          <1>  mov eax, %1
   266                              <1> 
   266 00000196 CD40                <1>  int 40h
   267                                      
   268                                  	;; SETUP SIGNAL RESPONSE BYTE
   269                                  	;; 06/03/2017
   270                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   271                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   272                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   273                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   274                                  	;sys	_calbac
   275                                  	;jc	short error_exit
   276                                  
   277                                  	; DIRECT VGA MEMORY ACCESS
   278                                  	; bl = 0, bh = 5
   279                                  	; Direct access/map to VGA memory (0A0000h)
   280                                  
   281                                  	sys	_video, 0500h
   281                              <1> 
   281                              <1> 
   281                              <1> 
   281                              <1> 
   281                              <1>  %if %0 >= 2
   281 00000198 BB00050000          <1>  mov ebx, %2
   281                              <1>  %if %0 >= 3
   281                              <1>  mov ecx, %3
   281                              <1>  %if %0 = 4
   281                              <1>  mov edx, %4
   281                              <1>  %endif
   281                              <1>  %endif
   281                              <1>  %endif
   281 0000019D B81F000000          <1>  mov eax, %1
   281                              <1> 
   281 000001A2 CD40                <1>  int 40h
   282 000001A4 3D00000A00              	cmp	eax, 0A0000h
   283 000001A9 7418                    	je	short _a3
   284                                  error_exit:
   285                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   285                              <1> 
   285                              <1> 
   285                              <1> 
   285                              <1> 
   285                              <1>  %if %0 >= 2
   285 000001AB BB[570D0000]        <1>  mov ebx, %2
   285                              <1>  %if %0 >= 3
   285 000001B0 B9FF000000          <1>  mov ecx, %3
   285                              <1>  %if %0 = 4
   285 000001B5 BA0E000000          <1>  mov edx, %4
   285                              <1>  %endif
   285                              <1>  %endif
   285                              <1>  %endif
   285 000001BA B823000000          <1>  mov eax, %1
   285                              <1> 
   285 000001BF CD40                <1>  int 40h
   286 000001C1 EB16                    	jmp	short Exit
   287                                  
   288                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   289                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   290                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   291                                  ;       second, or the module will sound "looped".
   292                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   293                                  ;       the polling is called from my routine, and then the irq 0 must be
   294                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   295                                  ;       samples played by the Sound Blaster. Note that some samples are
   296                                  ;       discarded in the next code, just for fun!
   297                                  
   298                                  _a3:
   299 000001C3 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   300 000001C7 CD31                    	int     31h
   301                                  
   302                                  	; 24/06/2017
   303 000001C9 E879000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   304                                  
   305                                  _s_exit:
   306 000001CE E8A5080000              	call	StopPlaying	; STOP!
   307                                  
   308 000001D3 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   309 000001D7 CD31                    	int     31h
   310                                  Exit:           
   311                                  	;call    FreeModule	; Free MODule core.
   312                                  	
   313                                  	sys 	_exit	; Bye !
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1>  %if %0 >= 2
   313                              <1>  mov ebx, %2
   313                              <1>  %if %0 >= 3
   313                              <1>  mov ecx, %3
   313                              <1>  %if %0 = 4
   313                              <1>  mov edx, %4
   313                              <1>  %endif
   313                              <1>  %endif
   313                              <1>  %endif
   313 000001D9 B801000000          <1>  mov eax, %1
   313                              <1> 
   313 000001DE CD40                <1>  int 40h
   314                                  here:
   315 000001E0 EBFE                    	jmp	short here
   316                                  
   317                                  pmsg_2017:
   318                                  	sys	_msg, msg_2017, 255, 0Fh
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1>  %if %0 >= 2
   318 000001E2 BB[A10C0000]        <1>  mov ebx, %2
   318                              <1>  %if %0 >= 3
   318 000001E7 B9FF000000          <1>  mov ecx, %3
   318                              <1>  %if %0 = 4
   318 000001EC BA0F000000          <1>  mov edx, %4
   318                              <1>  %endif
   318                              <1>  %endif
   318                              <1>  %endif
   318 000001F1 B823000000          <1>  mov eax, %1
   318                              <1> 
   318 000001F6 CD40                <1>  int 40h
   319 000001F8 EBDF                    	jmp	short Exit
   320                                  
   321                                  DetectICH:
   322                                  	; 24/06/2017
   323                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   324                                          sys	_audio, 0102h
   324                              <1> 
   324                              <1> 
   324                              <1> 
   324                              <1> 
   324                              <1>  %if %0 >= 2
   324 000001FA BB02010000          <1>  mov ebx, %2
   324                              <1>  %if %0 >= 3
   324                              <1>  mov ecx, %3
   324                              <1>  %if %0 = 4
   324                              <1>  mov edx, %4
   324                              <1>  %endif
   324                              <1>  %endif
   324                              <1>  %endif
   324 000001FF B820000000          <1>  mov eax, %1
   324                              <1> 
   324 00000204 CD40                <1>  int 40h
   325 00000206 C3                      	retn
   326                                  
   327                                  noDevMsg:
   328 00000207 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   328 00000210 61626C6520746F2066-
   328 00000219 696E64204143393720-
   328 00000222 617564696F20646576-
   328 0000022B 696365210D0A00     
   329                                  
   330                                  ac97_int_handler:
   331                                  	; 19/06/2017
   332 00000232 C605[9D0E0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   333                                  
   334                                  	sys	_rele ; return from callback service 
   334                              <1> 
   334                              <1> 
   334                              <1> 
   334                              <1> 
   334                              <1>  %if %0 >= 2
   334                              <1>  mov ebx, %2
   334                              <1>  %if %0 >= 3
   334                              <1>  mov ecx, %3
   334                              <1>  %if %0 = 4
   334                              <1>  mov edx, %4
   334                              <1>  %endif
   334                              <1>  %endif
   334                              <1>  %endif
   334 00000239 B827000000          <1>  mov eax, %1
   334                              <1> 
   334 0000023E CD40                <1>  int 40h
   335                                  	; we must not come here !
   336                                  	sys	_exit
   336                              <1> 
   336                              <1> 
   336                              <1> 
   336                              <1> 
   336                              <1>  %if %0 >= 2
   336                              <1>  mov ebx, %2
   336                              <1>  %if %0 >= 3
   336                              <1>  mov ecx, %3
   336                              <1>  %if %0 = 4
   336                              <1>  mov edx, %4
   336                              <1>  %endif
   336                              <1>  %endif
   336                              <1>  %endif
   336 00000240 B801000000          <1>  mov eax, %1
   336                              <1> 
   336 00000245 CD40                <1>  int 40h
   337                                  
   338                                  ;=============================================================================
   339                                  ;      
   340                                  ;=============================================================================
   341                                  
   342                                  PlayMod:
   343                                  	; 23/06/2017   
   344                                  	; 21/06/2017
   345                                  	; 19/06/2017
   346                                  
   347                                  	; 05/03/2017 (TRDOS 386)
   348                                  	; 14/02/2017
   349                                  	; 13/02/2017
   350                                  	; 08/12/2016
   351                                  	; 28/11/2016
   352                                  
   353 00000247 EB10                         	jmp	short modp_gs ; 23/06/2017
   354                                  p_loop:
   355 00000249 803D[9D0E0000]00        	cmp	byte [srb], 0
   356 00000250 7621                    	jna	short q_loop
   357 00000252 C605[9D0E0000]00        	mov	byte [srb], 0
   358                                  modp_gs:
   359                                  	;mov	edi, Audio_Buffer
   360                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   361                                  	;call	GetSamples
   362                                  
   363                                  	; 24/06/2017
   364                                          ; load 8192 bytes into audio buffer
   365 00000259 BF[00800100]            	mov	edi, temp_buffer
   366 0000025E BB00200000              	mov	ebx, BUFFERSIZE / 4
   367 00000263 E8EF060000              	call	GetSamples
   368 00000268 0F823DFFFFFF            	jc	error_exit
   369                                  
   370                                  	; 24/06/2017
   371                                  	; 8 bit to 16 bit (*2)
   372                                  	; mono to stereo (*2)
   373                                  	; 4* (BUFFERSIZE/4) 
   374                                  	; source = temp_buffer
   375                                  	; destination = Audio_Buffer
   376 0000026E E836080000              	call 	ConvertSamples
   377                                  
   378                                  q_loop:
   379 00000273 B401                    	mov     ah, 1		; any key pressed?
   380 00000275 CD32                    	int     32h		; no, Loop.
   381 00000277 7405                    	jz	short r_loop
   382                                  
   383 00000279 B400                    	mov     ah, 0		; flush key buffer...
   384 0000027B CD32                    	int     32h
   385                                  q_return:
   386 0000027D C3                      	retn
   387                                  r_loop:
   388                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   389                                  	; 23/06/2017
   390                                  	; 22/06/2017
   391                                  	; bh = 15, get current sound data/samples
   392                                  	; bl = 0, for PCM OUT
   393                                  	; ecx = count of sample/data bytes (1 to 4096)
   394                                  	; edx = destination buffer address 
   395                                  	;	(page aligned address is better)
   396                                  	;
   397                                  	sys	_audio, 0F00h, 320*4, g_buff
   397                              <1> 
   397                              <1> 
   397                              <1> 
   397                              <1> 
   397                              <1>  %if %0 >= 2
   397 0000027E BB000F0000          <1>  mov ebx, %2
   397                              <1>  %if %0 >= 3
   397 00000283 B900050000          <1>  mov ecx, %3
   397                              <1>  %if %0 = 4
   397 00000288 BA[00800000]        <1>  mov edx, %4
   397                              <1>  %endif
   397                              <1>  %endif
   397                              <1>  %endif
   397 0000028D B820000000          <1>  mov eax, %1
   397                              <1> 
   397 00000292 CD40                <1>  int 40h
   398                                  ScopeLoop:
   399 00000294 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   400                                  	; 19/06/2017
   401 00000299 BE[00800000]            	mov     esi, g_buff	; display current samples
   402 0000029E 31C9                    	xor     ecx, ecx	; to be drawed ...
   403 000002A0 31D2                    	xor     edx, edx
   404                                  DrawLoop:       
   405 000002A2 89D3                    	mov     ebx, edx	; (save Index)
   406 000002A4 668BBB[306D0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   407 000002AB C60700                  	mov     byte [edi], 0	; erase it!
   408                                  	; 24/06/2017
   409 000002AE AD                      	lodsd
   410 000002AF 80C480                  	add	ah, 80h
   411 000002B2 88E3                    	mov	bl, ah
   412                                  	;
   413 000002B4 30FF                    	xor     bh, bh
   414 000002B6 66D1E3                  	shl     bx, 1
   415 000002B9 668BBB[B06F0000]        	mov     di, [RowOfs+ebx]
   416 000002C0 6601CF                  	add     di, cx
   417 000002C3 6689D3                  	mov     bx, dx		; (restore Index)
   418 000002C6 6689BB[306D0000]        	mov     [Scope+ebx], di	; save new address...
   419 000002CD C6070A                  	mov     byte [edi], 10	; and DRAW.
   420 000002D0 6683C202                	add     dx, 2		; the next pixel...
   421 000002D4 41                      	inc     ecx
   422 000002D5 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   423 000002DA 72C6                    	jb      short DrawLoop
   424 000002DC E968FFFFFF              	jmp	p_loop
   425                                  
   426                                  
   427                                  ;=============================================================================
   428                                  ;               MODLOAD.ASM
   429                                  ;=============================================================================
   430                                  
   431                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   432                                  ;	July 10th, 1993.
   433                                  
   434                                  ; STRUCTURES
   435                                  
   436                                  struc ModSample
   437 00000000 <res 00000016>          .msName:	resb 22
   438 00000016 <res 00000002>          .msLength:	resw 1
   439 00000018 <res 00000001>          .msFinetune:	resb 1
   440 00000019 <res 00000001>          .msVolume:	resb 1
   441 0000001A <res 00000002>          .msRepeat:	resw 1
   442 0000001C <res 00000002>          .msRepLen:	resw 1
   443                                  .size:
   444                                  endstruc
   445                                  
   446                                  struc ModHeader
   447 00000000 <res 00000014>          .mhName:	resb 20
   448 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   449 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   450 000003B7 <res 00000001>          .mhReStart:	resb 1
   451 000003B8 <res 00000080>          .mhOrder:	resb 128
   452 00000438 <res 00000004>          .mhSign:	resw 2
   453                                  .size:	
   454                                  endstruc
   455                                  
   456                                  struc ModInfoRec
   457 00000000 <res 00000001>          .OrderLen:	resb 1
   458 00000001 <res 00000001>          .ReStart:	resb 1
   459 00000002 <res 00000080>          .Order:	resb 128
   460 00000082 <res 00000004>          .Patterns:	resd 1
   461 00000086 <res 0000003E>          .SampOfs:	resw 31
   462 000000C4 <res 0000003E>          .SampSeg:	resw 31
   463 00000102 <res 0000003E>          .SampLen:	resw 31
   464 00000140 <res 0000003E>          .SampRep:	resw 31
   465 0000017E <res 0000003E>          .SampRepLen:	resw 31
   466 000001BC <res 0000003E>          .SampVol:	resw 31
   467                                  .size:	
   468                                  endstruc
   469                                  
   470                                  ; CODE
   471                                  
   472                                  LoadModule:
   473                                  	; edi = file name address
   474                                  
   475 000002E1 60                      	pushad
   476                                  
   477 000002E2 66C705[A00E0000]01-     	mov	word [ErrorInfo], 1
   477 000002EA 00                 
   478                                  
   479 000002EB E88F010000              	call    ClearModInfo
   480                                  OpenFile:       
   481                                  	; ebx = ASCIIZ file name address
   482                                  	; ecx = open mode (0 = open for read)	
   483                                  	sys	_open, edi, 0 ; open for reading
   483                              <1> 
   483                              <1> 
   483                              <1> 
   483                              <1> 
   483                              <1>  %if %0 >= 2
   483 000002F0 89FB                <1>  mov ebx, %2
   483                              <1>  %if %0 >= 3
   483 000002F2 B900000000          <1>  mov ecx, %3
   483                              <1>  %if %0 = 4
   483                              <1>  mov edx, %4
   483                              <1>  %endif
   483                              <1>  %endif
   483                              <1>  %endif
   483 000002F7 B805000000          <1>  mov eax, %1
   483                              <1> 
   483 000002FC CD40                <1>  int 40h
   484 000002FE 0F8279010000            	jc	Failed
   485 00000304 A3[9E0E0000]            	mov     [FileHandle], eax
   486                                  ReadHeader:
   487                                  	; ebx = File handle
   488                                  	; ecx = Buffer address
   489                                  	; edx = Byte count
   490                                  	sys	_read, [FileHandle], Header, ModHeader.size
   490                              <1> 
   490                              <1> 
   490                              <1> 
   490                              <1> 
   490                              <1>  %if %0 >= 2
   490 00000309 8B1D[9E0E0000]      <1>  mov ebx, %2
   490                              <1>  %if %0 >= 3
   490 0000030F B9[A20E0000]        <1>  mov ecx, %3
   490                              <1>  %if %0 = 4
   490 00000314 BA3C040000          <1>  mov edx, %4
   490                              <1>  %endif
   490                              <1>  %endif
   490                              <1>  %endif
   490 00000319 B803000000          <1>  mov eax, %1
   490                              <1> 
   490 0000031E CD40                <1>  int 40h
   491 00000320 0F824A010000            	jc      CloseFile
   492                                  CheckMK:        
   493 00000326 813D[DA120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   493 0000032E 4B2E               
   494 00000330 7440                    	je      short IsModFile
   495                                  CheckFLT4:
   496 00000332 813D[DA120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   496 0000033A 5434               
   497 0000033C 7434                    	je      short IsModFile
   498                                  Is15Inst:
   499 0000033E BE[78100000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   500 00000343 BF[58120000]            	mov     edi, Header+ModHeader.mhOrderLen
   501                                  	;cld
   502                                  	;mov	ecx, 130
   503 00000348 66B98200                	mov	cx, 130
   504 0000034C F3A4                    	rep     movsb
   505 0000034E BF[78100000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   506 00000353 30C0                    	xor     al, al
   507 00000355 66B9E001                	mov     cx, 16*ModSample.size
   508 00000359 F3AA                    	rep     stosb
   509                                  SeekPatterns:   
   510                                  	; ebx = [FileHandle]
   511                                  	; ecx = offset
   512                                  	; edx = switch (0 = from beginning)
   513                                  	sys	_seek, [FileHandle], 600, 0
   513                              <1> 
   513                              <1> 
   513                              <1> 
   513                              <1> 
   513                              <1>  %if %0 >= 2
   513 0000035B 8B1D[9E0E0000]      <1>  mov ebx, %2
   513                              <1>  %if %0 >= 3
   513 00000361 B958020000          <1>  mov ecx, %3
   513                              <1>  %if %0 = 4
   513 00000366 BA00000000          <1>  mov edx, %4
   513                              <1>  %endif
   513                              <1>  %endif
   513                              <1>  %endif
   513 0000036B B813000000          <1>  mov eax, %1
   513                              <1> 
   513 00000370 CD40                <1>  int 40h
   514                                  IsModFile:
   515 00000372 A0[58120000]            	mov     al, [Header+ModHeader.mhOrderLen]
   516 00000377 A2[DE120000]            	mov     [ModInfo.OrderLen], al
   517                                  
   518 0000037C A0[59120000]            	mov     al, [Header+ModHeader.mhReStart]
   519 00000381 3A05[58120000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   520 00000387 7202                    	jb      short SetReStart
   521 00000389 B07F                    	mov     al, 7Fh
   522                                  SetReStart:
   523 0000038B A2[DF120000]            	mov     [ModInfo.ReStart], al
   524                                  
   525                                  	;mov	ecx, 128
   526 00000390 66B98000                	mov	cx, 128
   527 00000394 31D2                    	xor     edx, edx
   528 00000396 31DB                    	xor     ebx, ebx
   529                                  CopyOrder:
   530 00000398 8AB3[5A120000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   531 0000039E 88B3[E0120000]          	mov     [ModInfo.Order+ebx], dh
   532 000003A4 38D6                    	cmp     dh, dl
   533 000003A6 7202                    	jb      short NextOrder
   534 000003A8 88F2                    	mov     dl, dh
   535                                  NextOrder:
   536 000003AA 43                      	inc     ebx
   537 000003AB E2EB                    	loop    CopyOrder
   538                                  AllocPatterns:  
   539 000003AD 81E2FF000000            	and	edx, 0FFh
   540 000003B3 6642                    	inc	dx ; 14/03/2017
   541                                  	; dl = count of 1024 bytes
   542 000003B5 C1E20A                  	shl	edx, 10 ; *1024
   543                                  
   544 000003B8 89D5                    	mov	ebp, edx
   545                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   546 000003BA B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   547                                  	;
   548 000003BF 890D[60130000]          	mov	[ModInfo.Patterns], ecx
   549                                  	;
   550 000003C5 01CD                    	add	ebp, ecx ; next offset for samples
   551                                  ReadPatterns:  
   552                                  	;mov	ebx, [FileHandle] 
   553                                  	; ebx = File handle
   554                                  	; ecx = Buffer address
   555                                  	; edx = Byte count
   556                                  	sys	_read, [FileHandle]
   556                              <1> 
   556                              <1> 
   556                              <1> 
   556                              <1> 
   556                              <1>  %if %0 >= 2
   556 000003C7 8B1D[9E0E0000]      <1>  mov ebx, %2
   556                              <1>  %if %0 >= 3
   556                              <1>  mov ecx, %3
   556                              <1>  %if %0 = 4
   556                              <1>  mov edx, %4
   556                              <1>  %endif
   556                              <1>  %endif
   556                              <1>  %endif
   556 000003CD B803000000          <1>  mov eax, %1
   556                              <1> 
   556 000003D2 CD40                <1>  int 40h
   557 000003D4 0F8296000000            	jc      CloseFile
   558                                  
   559 000003DA BE[B60E0000]            	mov	esi, Header+ModHeader.mhSamples
   560 000003DF 31FF                    	xor     edi, edi
   561                                  CopySamples:
   562 000003E1 668B4616                	mov     ax, [esi+ModSample.msLength]
   563 000003E5 86C4                    	xchg    al, ah
   564 000003E7 66D1E0                  	shl     ax, 1
   565 000003EA 668987[E0130000]        	mov     [ModInfo.SampLen+edi], ax
   566 000003F1 8A4619                  	mov     al, [esi+ModSample.msVolume]
   567 000003F4 30E4                    	xor     ah, ah
   568 000003F6 668987[9A140000]        	mov     [ModInfo.SampVol+edi], ax
   569 000003FD 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   570 00000401 86C4                    	xchg    al, ah
   571 00000403 66D1E0                  	shl     ax, 1
   572 00000406 668987[1E140000]        	mov     [ModInfo.SampRep+edi], ax
   573 0000040D 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   574 00000411 86C4                    	xchg    al, ah
   575 00000413 66D1E0                  	shl     ax, 1
   576 00000416 668987[5C140000]        	mov     [ModInfo.SampRepLen+edi], ax
   577 0000041D 83C61E                  	add     esi, ModSample.size
   578 00000420 6683C702                	add     di, 2
   579 00000424 6683FF3E                	cmp     di, 2*31
   580 00000428 72B7                    	jb      short CopySamples
   581                                  
   582 0000042A 31F6                    	xor     esi, esi
   583                                  AllocSamples:
   584 0000042C 0FB796[E0130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   585 00000433 09D2                    	or	edx, edx ; byte count
   586 00000435 7426                    	jz      short NextSample
   587 00000437 89E8                    	mov	eax, ebp
   588 00000439 668986[64130000]        	mov	[ModInfo.SampOfs+esi], ax
   589 00000440 C1E810                  	shr	eax, 16
   590 00000443 668986[A2130000]        	mov	[ModInfo.SampSeg+esi], ax
   591 0000044A 89E9                    	mov	ecx, ebp
   592 0000044C 01D5                    	add	ebp, edx ; next offset for sample 
   593                                  ReadSample:
   594                                  	;mov	ebx, [FileHandle]
   595                                  	;movzx  edx, [ModInfo.SampLen+esi]
   596                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   597                                  
   598                                  	; ebx = File handle
   599                                  	; ecx = Buffer address
   600                                  	; edx = Byte count
   601                                  	sys	_read, [FileHandle]
   601                              <1> 
   601                              <1> 
   601                              <1> 
   601                              <1> 
   601                              <1>  %if %0 >= 2
   601 0000044E 8B1D[9E0E0000]      <1>  mov ebx, %2
   601                              <1>  %if %0 >= 3
   601                              <1>  mov ecx, %3
   601                              <1>  %if %0 = 4
   601                              <1>  mov edx, %4
   601                              <1>  %endif
   601                              <1>  %endif
   601                              <1>  %endif
   601 00000454 B803000000          <1>  mov eax, %1
   601                              <1> 
   601 00000459 CD40                <1>  int 40h
   602 0000045B 7213                    	jc      short CloseFile
   603                                  
   604                                  NextSample:
   605 0000045D 6683C602                	add     si, 2
   606 00000461 6683FE3E                	cmp     si, 2*31
   607 00000465 72C5                    	jb      short AllocSamples
   608                                  
   609 00000467 66C705[A00E0000]00-     	mov     word [ErrorInfo], 0
   609 0000046F 00                 
   610                                  CloseFile:      
   611                                  	sys	_close, [FileHandle]
   611                              <1> 
   611                              <1> 
   611                              <1> 
   611                              <1> 
   611                              <1>  %if %0 >= 2
   611 00000470 8B1D[9E0E0000]      <1>  mov ebx, %2
   611                              <1>  %if %0 >= 3
   611                              <1>  mov ecx, %3
   611                              <1>  %if %0 = 4
   611                              <1>  mov edx, %4
   611                              <1>  %endif
   611                              <1>  %endif
   611                              <1>  %endif
   611 00000476 B806000000          <1>  mov eax, %1
   611                              <1> 
   611 0000047B CD40                <1>  int 40h
   612                                  Failed:         
   613 0000047D 61                      	popad
   614                                  
   615 0000047E C3                      	retn
   616                                  
   617                                  FreeModule:
   618                                  	; Erdogan Tan (13/02/2017)
   619                                  	; nothing to do here for memory de-allocation
   620                                  ClearModInfo:
   621 0000047F 57                      	push	edi
   622 00000480 BF[DE120000]            	mov	edi, ModInfo
   623 00000485 B9FA010000              	mov     ecx, ModInfoRec.size
   624                                  	;cld
   625 0000048A 30C0                    	xor     al, al
   626 0000048C F3AA                    	rep     stosb
   627 0000048E 5F                      	pop	edi
   628 0000048F C3                      	retn
   629                                  
   630                                  ;=============================================================================
   631                                  ;               MODPLAY.ASM
   632                                  ;=============================================================================
   633                                  
   634                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   635                                  ;	July 23th, 1993.
   636                                  
   637                                  ; EQUATES
   638                                  
   639                                  NumTracks       equ 4
   640                                  DefTempo        equ 6
   641                                  DefBpm          equ 125
   642                                  MidCRate        equ 8448
   643                                  MixBufSize      equ 4096
   644                                  
   645                                  ; STRUCTURES
   646                                  
   647                                  struc TrackInfo
   648 00000000 <res 00000004>          .Samples:	resd 1
   649 00000004 <res 00000004>          .Position:	resd 1
   650 00000008 <res 00000002>          .Len:	resw 1
   651 0000000A <res 00000002>          .Repeat:	resw 1
   652 0000000C <res 00000002>          .RepLen:	resw 1
   653 0000000E <res 00000001>          .Volume: 	resb 1
   654 0000000F <res 00000001>          .Error:	resb 1
   655 00000010 <res 00000002>          .Period:	resw 1
   656 00000012 <res 00000002>          .Pitch:	resw 1
   657 00000014 <res 00000002>          .Effect:	resw 1
   658 00000016 <res 00000002>          .PortTo:	resw 1
   659 00000018 <res 00000001>          .PortParm:	resb 1
   660 00000019 <res 00000001>          .VibPos:	resb 1
   661 0000001A <res 00000001>          .VibParm:	resb 1
   662 0000001B <res 00000001>          .OldSampOfs:	resb 1
   663 0000001C <res 00000006>          .Arp:	resw 3
   664 00000022 <res 00000002>          .ArpIndex:	resw 1
   665                                  .size:
   666                                  endstruc
   667                                  
   668                                  ; CODE
   669                                  
   670                                  ;--------------------------------------------------------------------------
   671                                  ; BeatTrack:  Process the next beat in one track.
   672                                  ;  In:
   673                                  ;    ds:di -  Track info Address.
   674                                  ;--------------------------------------------------------------------------
   675                                  
   676                                  ; edi = Track info address
   677                                  
   678                                  BeatTrack:
   679 00000490 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   680 00000494 6685D2                  	test    dx, dx
   681 00000497 743C                    	je      short None
   682 00000499 80FE00                  	cmp     dh, 00h
   683 0000049C 7438                    	je      short Arpeggio
   684 0000049E 80FE01                  	cmp     dh, 01h
   685 000004A1 7451                    	je      short PortUp
   686 000004A3 80FE02                  	cmp     dh, 02h
   687 000004A6 7471                    	je      short PortDown
   688 000004A8 80FE03                  	cmp     dh, 03h
   689 000004AB 0F848E000000            	je      TonePort
   690 000004B1 80FE04                  	cmp     dh, 04h
   691 000004B4 0F84BD000000            	je      Vibrato
   692 000004BA 80FE05                  	cmp     dh, 05h
   693 000004BD 0F840E010000            	je      PortSlide
   694 000004C3 80FE06                  	cmp     dh, 06h
   695 000004C6 0F8412010000            	je      VibSlide
   696 000004CC 80FE0A                  	cmp     dh, 0Ah
   697 000004CF 0F8413010000            	je      VolSlide
   698                                  None:           
   699 000004D5 C3                      	retn
   700                                  Arpeggio:
   701 000004D6 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   702 000004DA 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   703 000004DF 66894712                	mov     [edi+TrackInfo.Pitch], ax
   704 000004E3 6683C302                	add     bx, 2
   705 000004E7 6683FB06                	cmp     bx, 6
   706 000004EB 7202                    	jb      short SetArpIndex
   707 000004ED 31DB                    	xor     ebx, ebx
   708                                  SetArpIndex:
   709 000004EF 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   710 000004F3 C3                      	retn
   711                                  PortUp:
   712 000004F4 30F6                    	xor     dh, dh
   713 000004F6 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   714 000004FA 6629D3                  	sub     bx, dx
   715 000004FD 6683FB71                	cmp     bx, 113
   716 00000501 7D04                    	jge     short NotSmall
   717 00000503 66BB7100                	mov     bx, 113
   718                                  NotSmall:
   719 00000507 66895F10                	mov     [edi+TrackInfo.Period], bx
   720 0000050B 6601DB                  	add     bx, bx
   721 0000050E 66678B87[D814]          	mov     ax, [PitchTable+bx]
   722 00000514 66894712                	mov     [edi+TrackInfo.Pitch], ax
   723 00000518 C3                      	retn
   724                                  PortDown:
   725 00000519 30F6                    	xor     dh, dh
   726 0000051B 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   727 0000051F 6601D3                  	add     bx, dx
   728 00000522 6681FB5803              	cmp     bx, 856
   729 00000527 7E04                    	jle     short NotBig
   730 00000529 66BB5803                	mov     bx, 856
   731 0000052D 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   732 00000531 6601DB                  	add     bx, bx
   733 00000534 66678B87[D814]          	mov     ax, [PitchTable+bx]
   734 0000053A 66894712                	mov     [edi+TrackInfo.Pitch], ax
   735 0000053E C3                      	retn
   736                                  TonePort:
   737 0000053F 30F6                    	xor     dh, dh
   738 00000541 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   739 00000545 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   740 00000549 6639C3                  	cmp     bx, ax
   741 0000054C 7428                    	je      short NoPort
   742 0000054E 7F0D                    	jg      short PortToUp
   743                                  PortToDown:     
   744 00000550 6601D3                  	add     bx, dx
   745 00000553 6639C3                  	cmp     bx, ax
   746 00000556 7E0D                    	jle     short SetPort
   747                                  FixPort:        
   748 00000558 6689C3                  	mov     bx, ax
   749 0000055B EB08                    	jmp     short SetPort
   750                                  PortToUp:
   751 0000055D 6629D3                  	sub     bx, dx
   752 00000560 6639C3                  	cmp     bx, ax
   753 00000563 7CF3                    	jl      short FixPort
   754                                  SetPort:        
   755 00000565 66895F10                	mov     [edi+TrackInfo.Period], bx
   756 00000569 6601DB                  	add     bx, bx
   757 0000056C 66678B87[D814]          	mov     ax, [PitchTable+bx]
   758 00000572 66894712                	mov     [edi+TrackInfo.Pitch], ax
   759                                  NoPort:         
   760 00000576 C3                      	retn
   761                                  Vibrato:
   762 00000577 88D6                    	mov     dh, dl
   763 00000579 80E20F                  	and     dl, 0Fh
   764 0000057C C0EE04                  	shr     dh, 4
   765 0000057F C0E602                  	shl     dh, 2
   766 00000582 007719                  	add     [edi+TrackInfo.VibPos], dh
   767 00000585 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   768 00000588 88F3                    	mov     bl, dh
   769 0000058A C0EB02                  	shr     bl, 2
   770 0000058D 6683E31F                	and     bx, 1Fh
   771 00000591 678A87[770D]            	mov     al, [SinTable+bx]
   772 00000596 F6E2                    	mul     dl
   773 00000598 66D1C0                  	rol     ax, 1
   774 0000059B 86C4                    	xchg    al, ah
   775 0000059D 80E401                  	and     ah, 1
   776 000005A0 84F6                    	test    dh, dh
   777 000005A2 7903                    	jns     short VibUp
   778 000005A4 66F7D8                  	neg     ax
   779                                  VibUp:          
   780 000005A7 66034710                	add     ax, [edi+TrackInfo.Period]
   781 000005AB 6689C3                  	mov     bx, ax
   782 000005AE 6683FB71                	cmp     bx, 113
   783 000005B2 7D04                    	jge     short NoLoVib
   784 000005B4 66BB7100                	mov     bx, 113
   785                                  NoLoVib:        
   786 000005B8 6681FB5803              	cmp     bx, 856
   787 000005BD 7E04                    	jle     short NoHiVib
   788 000005BF 66BB5803                	mov     bx, 856
   789                                  NoHiVib:        
   790 000005C3 6601DB                  	add     bx, bx
   791 000005C6 66678B87[D814]          	mov     ax, [PitchTable+bx]
   792 000005CC 66894712                	mov     [edi+TrackInfo.Pitch], ax
   793 000005D0 C3                      	retn
   794                                  PortSlide:
   795 000005D1 E812000000              	call    VolSlide
   796 000005D6 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   797 000005D9 E961FFFFFF              	jmp     TonePort
   798                                  VibSlide:
   799 000005DE E805000000              	call    VolSlide
   800 000005E3 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   801 000005E6 EB8F                    	jmp     short Vibrato
   802                                  VolSlide:
   803 000005E8 88D6                    	mov     dh, dl
   804 000005EA 80E20F                  	and     dl, 0Fh
   805 000005ED C0EE04                  	shr     dh, 4
   806 000005F0 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   807 000005F3 28D0                    	sub     al, dl
   808 000005F5 7D02                    	jge     short NoLoVol
   809 000005F7 30C0                    	xor     al, al
   810                                  NoLoVol:        
   811 000005F9 00F0                    	add     al, dh
   812 000005FB 3C40                    	cmp     al, 64
   813 000005FD 7602                    	jbe     short NoHiVol
   814 000005FF B040                    	mov     al, 64
   815                                  NoHiVol:        
   816 00000601 88470E                  	mov     [edi+TrackInfo.Volume], al
   817 00000604 C3                      	retn
   818                                  
   819                                  ;--------------------------------------------------------------------------
   820                                  ; GetTrack:   Get the next Note from a pattern.
   821                                  ;  In:
   822                                  ;    ds:di -  Track info Address.
   823                                  ;    es:si -  Pattern Note Address.
   824                                  ; Out:
   825                                  ;    es:si -  The Next Pattern Note address.
   826                                  ;--------------------------------------------------------------------------
   827                                  
   828                                  ; esi = Pattern note address
   829                                  ; edi = Track info address
   830                                  
   831                                  GetTrack:
   832 00000605 66AD                    	lodsw
   833 00000607 86C4                    	xchg    al, ah
   834 00000609 88E3                    	mov	bl, ah
   835 0000060B 80E40F                  	and     ah, 0Fh
   836 0000060E 6689C1                  	mov     cx, ax
   837 00000611 66AD                    	lodsw
   838 00000613 86C4                    	xchg    al, ah
   839 00000615 88E7                    	mov     bh, ah
   840 00000617 80E40F                  	and     ah, 0Fh
   841 0000061A 6689C2                  	mov     dx, ax
   842 0000061D 66895714                	mov     [edi+TrackInfo.Effect], dx
   843 00000621 80E3F0                  	and     bl, 0F0h
   844 00000624 C0EF04                  	shr     bh, 4
   845 00000627 08FB                    	or      bl, bh
   846 00000629 7449                    	je      short SetPeriod
   847                                  SetSample:
   848                                  	;xor    bh, bh
   849 0000062B 81E3FF000000            	and	ebx, 0FFh
   850 00000631 4B                      	dec     ebx
   851 00000632 01DB                    	add     ebx, ebx
   852 00000634 668B83[9A140000]        	mov     ax, [ModInfo.SampVol+ebx]
   853 0000063B 88470E                  	mov     [edi+TrackInfo.Volume], al
   854 0000063E 668B83[64130000]        	mov     ax, [ModInfo.SampOfs+ebx]
   855 00000645 668907                  	mov     [edi+TrackInfo.Samples], ax
   856 00000648 668B83[A2130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   857 0000064F 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   858 00000653 668B83[E0130000]        	mov     ax, [ModInfo.SampLen+ebx]
   859 0000065A 66894708                	mov     [edi+TrackInfo.Len], ax
   860 0000065E 668B83[1E140000]        	mov     ax, [ModInfo.SampRep+ebx]
   861 00000665 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   862 00000669 668B83[5C140000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   863 00000670 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   864                                  SetPeriod:      
   865 00000674 6685C9                  	test    cx, cx
   866 00000677 7424                    	jz      short SetEffect
   867                                  
   868 00000679 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   869 0000067D 80FE03                  	cmp     dh, 03h
   870 00000680 741B                    	je      short SetEffect
   871                                  
   872 00000682 66894F10                	mov     [edi+TrackInfo.Period], cx
   873 00000686 6689CB                  	mov     bx, cx
   874 00000689 6601DB                  	add     bx, bx
   875 0000068C 66678B87[D814]          	mov     ax, [PitchTable+bx]
   876 00000692 66894712                	mov     [edi+TrackInfo.Pitch], ax
   877 00000696 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   878                                  SetEffect:
   879 0000069D 6685D2                  	test    dx, dx
   880 000006A0 7430                    	jz      short InitNone
   881 000006A2 80FE00                  	cmp     dh, 00h
   882 000006A5 0F84E5000000            	je      InitArpeggio
   883 000006AB 80FE03                  	cmp     dh, 03h
   884 000006AE 7423                    	je      short InitTonePort
   885 000006B0 80FE04                  	cmp     dh, 04h
   886 000006B3 742D                    	je      short InitVibrato
   887 000006B5 80FE09                  	cmp     dh, 09h
   888 000006B8 7451                    	je      short SampleOfs
   889 000006BA 80FE0B                  	cmp     dh, 0Bh
   890 000006BD 7462                    	je      short PosJump
   891 000006BF 80FE0C                  	cmp     dh, 0Ch
   892 000006C2 746B                    	je      short SetVolume
   893 000006C4 80FE0D                  	cmp     dh, 0Dh
   894 000006C7 7471                    	je      short Break
   895 000006C9 80FE0F                  	cmp     dh, 0Fh
   896 000006CC 0F8487000000            	je      SetSpeed
   897                                  InitNone:
   898 000006D2 C3                      	retn
   899                                  InitTonePort:
   900 000006D3 84D2                    	test    dl, dl
   901 000006D5 7503                    	jnz     short SetPortParm
   902 000006D7 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   903                                  SetPortParm:    
   904 000006DA 885718                  	mov     [edi+TrackInfo.PortParm], dl
   905 000006DD 66895714                	mov     [edi+TrackInfo.Effect], dx
   906 000006E1 C3                      	retn
   907                                  InitVibrato:
   908 000006E2 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   909 000006E5 88C4                    	mov     ah, al
   910 000006E7 240F                    	and     al, 0Fh
   911 000006E9 80E4F0                  	and     ah, 0F0h
   912 000006EC F6C20F                  	test    dl, 0Fh
   913 000006EF 7502                    	jne     short OkDepth
   914 000006F1 08C2                    	or      dl, al
   915                                  OkDepth:        
   916 000006F3 F6C2F0                  	test    dl, 0F0h
   917 000006F6 7502                    	jnz     short OkRate
   918 000006F8 08E2                    	or      dl, ah
   919                                  OkRate:         
   920 000006FA 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   921 000006FD 66895714                	mov     [edi+TrackInfo.Effect], dx
   922 00000701 6685C9                  	test    cx, cx
   923 00000704 7404                    	jz      short OkPos
   924 00000706 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   925                                  OkPos:          
   926 0000070A C3                      	retn
   927                                  SampleOfs:      
   928 0000070B 84D2                    	test    dl, dl
   929 0000070D 7503                    	jnz     short SetSampleOfs
   930 0000070F 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   931                                  SetSampleOfs:
   932 00000712 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   933 00000715 88D6                    	mov     dh, dl
   934 00000717 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   935 0000071D 895704                  	mov     [edi+TrackInfo.Position], edx
   936 00000720 C3                      	retn
   937                                  PosJump:
   938 00000721 8815[8A6C0000]          	mov     [OrderPos], dl
   939 00000727 C605[8E6C0000]40        	mov     byte [Row], 64
   940 0000072E C3                      	retn
   941                                  SetVolume:
   942 0000072F 80FA40                  	cmp     dl, 64
   943 00000732 7602                    	jbe     short OkVol
   944 00000734 B240                    	mov     dl, 64
   945                                  OkVol:
   946 00000736 88570E                  	mov     [edi+TrackInfo.Volume], dl
   947 00000739 C3                      	retn
   948                                  Break:
   949 0000073A 88D6                    	mov     dh, dl
   950 0000073C 80E20F                  	and     dl, 0Fh
   951 0000073F C0EE04                  	shr     dh, 4
   952 00000742 00F6                    	add     dh, dh
   953 00000744 00F2                    	add     dl, dh
   954 00000746 C0E602                  	shl     dh, 2
   955 00000749 00F2                    	add     dl, dh
   956 0000074B 8815[8F6C0000]          	mov     [BreakRow], dl
   957 00000751 C605[8E6C0000]40        	mov     byte [Row], 64
   958 00000758 C3                      	retn
   959                                  SetSpeed:
   960 00000759 84D2                    	test    dl,dl
   961 0000075B 7432                    	je      Skip
   962 0000075D 80FA1F                  	cmp     dl,31
   963 00000760 770D                    	ja      short SetBpm
   964                                  SetTempo:       
   965 00000762 8815[8B6C0000]          	mov     [Tempo], dl
   966 00000768 8815[8C6C0000]          	mov     [TempoWait], dl
   967 0000076E C3                      	retn
   968                                  SetBpm:
   969 0000076F 8815[8D6C0000]          	mov     [Bpm], dl
   970 00000775 B067                    	mov     al, 103
   971 00000777 F6E2                    	mul     dl
   972 00000779 88E3                    	mov     bl, ah
   973 0000077B 30FF                    	xor     bh, bh
   974 0000077D 66A1[E10D0000]          	mov     ax, [MixSpeed]
   975 00000783 6631D2                  	xor     dx, dx
   976 00000786 66F7F3                  	div     bx
   977 00000789 66A3[906C0000]          	mov     [BpmSamples], ax
   978                                  Skip:           
   979 0000078F C3                      	retn
   980                                  InitArpeggio:
   981 00000790 88D6                    	mov     dh, dl
   982 00000792 80E20F                  	and     dl, 0Fh
   983 00000795 C0EE04                  	shr     dh, 4
   984 00000798 66B92400                	mov     cx, 36
   985 0000079C 31DB                    	xor     ebx, ebx
   986 0000079E 668B4710                	mov     ax, [edi+TrackInfo.Period]
   987                                  gt_ScanPeriod:
   988 000007A2 66673B87[970D]          	cmp     ax, [PeriodTable+bx]
   989 000007A8 7306                    	jae     short SetArp
   990 000007AA 6683C302                	add     bx, 2
   991 000007AE E2F2                    	loop    gt_ScanPeriod
   992                                  SetArp:         
   993 000007B0 6601D2                  	add     dx, dx
   994 000007B3 00DE                    	add     dh, bl
   995 000007B5 00DA                    	add     dl, bl
   996 000007B7 66678B9F[970D]          	mov     bx, [PeriodTable+bx]
   997 000007BD 6601DB                  	add     bx, bx
   998 000007C0 66678B87[D814]          	mov     ax, [PitchTable+bx]
   999 000007C6 6689471C                	mov     [edi+TrackInfo.Arp], ax
  1000 000007CA 88F3                    	mov     bl, dh
  1001 000007CC 30FF                    	xor     bh, bh
  1002 000007CE 66678B9F[970D]          	mov     bx, [PeriodTable+bx]
  1003 000007D4 6601DB                  	add     bx, bx
  1004 000007D7 66678B87[D814]          	mov     ax, [PitchTable+bx]
  1005 000007DD 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1006 000007E1 88D3                    	mov     bl, dl
  1007 000007E3 30FF                    	xor     bh, bh
  1008 000007E5 66678B9F[970D]          	mov     bx, [PeriodTable+bx]
  1009 000007EB 6601DB                  	add     bx, bx
  1010 000007EE 66678B87[D814]          	mov     ax, [PitchTable+bx]
  1011 000007F4 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1012 000007F8 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1013 000007FE C3                      	retn
  1014                                  
  1015                                  ;--------------------------------------------------------------------------
  1016                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1017                                  ;--------------------------------------------------------------------------
  1018                                  
  1019                                  UpdateTracks:
  1020 000007FF FE0D[8C6C0000]          	dec     byte [TempoWait]
  1021 00000805 7415                    	jz      short GetTracks
  1022                                  
  1023 00000807 B904000000              	mov	ecx, NumTracks
  1024 0000080C BF[A06C0000]            	mov	edi, Tracks
  1025                                  BeatTracks:
  1026 00000811 E87AFCFFFF              	call	BeatTrack	
  1027 00000816 83C724                  	add	edi, TrackInfo.size
  1028 00000819 E2F6                    	loop	BeatTracks
  1029 0000081B C3                      	retn
  1030                                  GetTracks:
  1031 0000081C A0[8B6C0000]            	mov     al, [Tempo]
  1032 00000821 A2[8C6C0000]            	mov     [TempoWait], al
  1033                                  
  1034 00000826 8B35[9C6C0000]          	mov	esi, [Note]
  1035 0000082C 803D[8E6C0000]40        	cmp     byte [Row], 64
  1036 00000833 7263                    	jb      short NoPattWrap
  1037                                  
  1038 00000835 8B35[60130000]          	mov	esi, [ModInfo.Patterns]
  1039 0000083B 8A1D[8A6C0000]          	mov     bl, [OrderPos]
  1040 00000841 3A1D[DE120000]          	cmp     bl, [ModInfo.OrderLen]
  1041 00000847 7214                    	jb      short NoOrderWrap
  1042 00000849 8A1D[DF120000]          	mov     bl, [ModInfo.ReStart]
  1043 0000084F 881D[8A6C0000]          	mov     [OrderPos], bl
  1044 00000855 3A1D[DE120000]          	cmp     bl, [ModInfo.OrderLen]
  1045 0000085B 735D                    	jae     short NoUpdate
  1046                                  NoOrderWrap:    
  1047                                  	;xor	bh, bh
  1048 0000085D 81E3FF000000            	and	ebx, 0FFh
  1049 00000863 8A9B[E0120000]          	mov     bl, [ModInfo.Order+ebx]
  1050 00000869 C1E30A                  	shl     ebx, 10 ; *1024
  1051 0000086C 01DE                    	add     esi, ebx
  1052 0000086E 8A1D[8F6C0000]          	mov     bl, [BreakRow]
  1053 00000874 881D[8E6C0000]          	mov     [Row], bl
  1054                                  	;xor     bh, bh
  1055 0000087A 81E3FF000000            	and	ebx, 0FFh
  1056 00000880 883D[8F6C0000]          	mov     [BreakRow], bh ; 0
  1057 00000886 66C1E304                	shl     bx, 4
  1058 0000088A 01DE                    	add     esi, ebx
  1059 0000088C 8935[9C6C0000]          	mov     [Note], esi
  1060 00000892 FE05[8A6C0000]          	inc     byte [OrderPos]
  1061                                  NoPattWrap:     
  1062 00000898 FE05[8E6C0000]          	inc     byte [Row]
  1063                                  
  1064                                  	;cld
  1065 0000089E B904000000              	mov	ecx, NumTracks
  1066 000008A3 BF[A06C0000]            	mov	edi, Tracks
  1067                                  GetTracks_next:
  1068 000008A8 51                      	push	ecx	
  1069 000008A9 E857FDFFFF              	call	GetTrack
  1070 000008AE 59                      	pop	ecx
  1071 000008AF 83C724                  	add	edi, TrackInfo.size
  1072 000008B2 E2F4                    	loop	GetTracks_next
  1073                                  
  1074 000008B4 8935[9C6C0000]          	mov     [Note], esi
  1075                                  NoUpdate:
  1076 000008BA C3                      	retn
  1077                                  
  1078                                  ;--------------------------------------------------------------------------
  1079                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1080                                  ;  In:
  1081                                  ;   ds:si -  Track Info Address.
  1082                                  ;   ds:di -  Buffer Address.
  1083                                  ;    cx   -  Buffer Size.
  1084                                  ;--------------------------------------------------------------------------
  1085                                  
  1086                                  ; esi = Track info address
  1087                                  ; edi = Buffer address
  1088                                  ; ecx = Buffer size
  1089                                  
  1090                                  MixTrack:
  1091 000008BB 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1092 000008C0 7748                    	ja      short MixLooped
  1093                                  MixNonLooped:   
  1094 000008C2 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1095 000008C4 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1096 000008C7 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1097 000008CB 52                      	push    edx
  1098 000008CC 56                      	push    esi
  1099 000008CD 01D3                    	add     ebx, edx
  1100 000008CF 01D5                    	add     ebp, edx
  1101 000008D1 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1102 000008D5 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1103 000008D8 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1104 000008DB 89DE                    	mov     esi, ebx
  1105 000008DD 88C7                    	mov     bh, al
  1106 000008DF 88D0                    	mov     al, dl
  1107 000008E1 88F2                    	mov     dl, dh
  1108                                  	;xor	dh, dh
  1109 000008E3 81E2FF000000            	and	edx, 0FFh
  1110                                  nlMixSamp:      
  1111 000008E9 39EE                    	cmp     esi, ebp
  1112 000008EB 7310                    	jae     short nlMixBye
  1113 000008ED 8A1E                    	mov     bl, [esi]
  1114 000008EF 678A9F[8A1B]            	mov     bl, [VolTable+bx]
  1115 000008F4 001F                    	add     [edi], bl
  1116 000008F6 47                      	inc     edi
  1117 000008F7 00C4                    	add     ah, al
  1118 000008F9 11D6                    	adc     esi, edx
  1119 000008FB E2EC                    	loop    nlMixSamp
  1120                                  nlMixBye:       
  1121 000008FD 89F3                    	mov     ebx, esi
  1122 000008FF 5E                      	pop     esi
  1123 00000900 5A                      	pop     edx
  1124 00000901 29D3                    	sub     ebx, edx
  1125 00000903 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1126 00000906 88660F                  	mov     [esi+TrackInfo.Error], ah
  1127 00000909 C3                      	retn
  1128                                  MixLooped:
  1129 0000090A 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1130 0000090C 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1131 0000090F 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1132 00000913 892D[986C0000]          	mov     [BufRep], ebp
  1133 00000919 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1134 0000091C 52                      	push    edx
  1135 0000091D 56                      	push    esi
  1136 0000091E 01D3                    	add     ebx, edx
  1137 00000920 01D5                    	add     ebp, edx
  1138 00000922 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1139 00000926 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1140 00000929 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1141 0000092C 6689DE                  	mov     si, bx
  1142 0000092F 88C7                    	mov     bh, al
  1143 00000931 88D0                    	mov     al, dl
  1144 00000933 88F2                    	mov     dl, dh
  1145                                  	;xor	dh, dh
  1146 00000935 81E2FF000000            	and	edx, 0FFh
  1147                                  lpMixSamp:      
  1148 0000093B 39EE                    	cmp     esi, ebp
  1149 0000093D 7206                    	jb      short lpMixNow
  1150 0000093F 2B35[986C0000]          	sub     esi, [BufRep]
  1151                                  lpMixNow:       
  1152 00000945 8A1E                    	mov     bl, [esi]
  1153 00000947 678A9F[8A1B]            	mov     bl, [VolTable+bx]
  1154 0000094C 001F                    	add     [edi], bl
  1155 0000094E 47                      	inc     edi
  1156 0000094F 00C4                    	add     ah, al
  1157 00000951 11D6                    	adc	esi, edx
  1158 00000953 E2E6                    	loop    lpMixSamp
  1159                                  lpMixBye:       
  1160                                  ;	mov     ebx, esi
  1161                                  ;	pop     esi
  1162                                  ;	pop     edx
  1163                                  ;	sub     ebx, edx
  1164                                  ;	mov     [esi+TrackInfo.Position], ebx
  1165                                  ;	mov     [esi+TrackInfo.Error], ah
  1166                                  ;	retn
  1167 00000955 EBA6                    	jmp	short nlMixBye
  1168                                  
  1169                                  ;--------------------------------------------------------------------------
  1170                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1171                                  ;  In:
  1172                                  ;    Buffer  - Buffer Address.
  1173                                  ;    Count   - Buffer Size.
  1174                                  ;--------------------------------------------------------------------------
  1175                                  
  1176                                  GetSamples:
  1177                                  	; edi = buffer address
  1178                                  	; ebx = count
  1179                                  
  1180 00000957 60                      	pushad
  1181                                  
  1182                                  	;cld
  1183                                  NextChunk:      
  1184 00000958 66833D[966C0000]00      	cmp     word [BufLen], 0
  1185 00000960 7548                    	jne     short CopyChunk
  1186                                  
  1187 00000962 53                      	push    ebx
  1188 00000963 57                      	push    edi
  1189                                  MixChunk:       
  1190 00000964 BF[8A5C0000]            	mov	edi, MixBuffer
  1191 00000969 0FB70D[906C0000]        	movzx	ecx, word [BpmSamples]
  1192 00000970 893D[926C0000]          	mov     [BufPtr], edi
  1193 00000976 66890D[966C0000]        	mov     [BufLen], cx
  1194                                  
  1195 0000097D B080                    	mov     al, 80h
  1196 0000097F F3AA                    	rep     stosb
  1197                                  
  1198 00000981 66B90400                	mov	cx, NumTracks
  1199 00000985 BE[7C6C0000]            	mov	esi, Tracks - TrackInfo.size
  1200                                  GetSamples_next:
  1201 0000098A 51                      	push	ecx
  1202 0000098B 83C624                  	add	esi, TrackInfo.size
  1203 0000098E 668B0D[966C0000]        	mov	cx, [BufLen]
  1204 00000995 8B3D[926C0000]          	mov	edi, [BufPtr]
  1205 0000099B E81BFFFFFF              	call	MixTrack
  1206 000009A0 59                      	pop	ecx
  1207 000009A1 E2E7                    	loop	GetSamples_next	
  1208                                  
  1209 000009A3 E857FEFFFF              	call    UpdateTracks
  1210                                  
  1211 000009A8 5F                      	pop     edi
  1212 000009A9 5B                      	pop     ebx
  1213                                  CopyChunk:      
  1214                                  	;mov	cx, [BufLen]
  1215 000009AA 0FB70D[966C0000]        	movzx	ecx, word [BufLen]
  1216 000009B1 39D9                    	cmp	ecx, ebx
  1217                                  	;cmp	cx, bx
  1218 000009B3 7602                    	jbe     short MoveChunk
  1219                                  	;mov	cx, bx
  1220 000009B5 89D9                    	mov     ecx, ebx
  1221                                  MoveChunk:
  1222 000009B7 8B35[926C0000]          	mov     esi, [BufPtr]
  1223 000009BD 010D[926C0000]          	add     [BufPtr], ecx
  1224 000009C3 66290D[966C0000]        	sub     [BufLen], cx
  1225 000009CA 29CB                    	sub     ebx, ecx
  1226 000009CC F3A4                    	rep     movsb
  1227 000009CE 85DB                    	test    ebx, ebx
  1228 000009D0 7586                    	jnz     short NextChunk
  1229                                  
  1230 000009D2 61                      	popad
  1231 000009D3 C3                      	retn
  1232                                  
  1233                                  ;--------------------------------------------------------------------------
  1234                                  ; StartPlaying: Initializes the Sound System.
  1235                                  ;  In:
  1236                                  ;   Module Information Resources.
  1237                                  ;--------------------------------------------------------------------------
  1238                                  
  1239                                  StartPlaying:
  1240 000009D4 60                      	pushad
  1241                                  SetModParms:    
  1242 000009D5 C605[8A6C0000]00        	mov     byte [OrderPos], 0
  1243 000009DC C605[8B6C0000]06        	mov     byte [Tempo], DefTempo
  1244 000009E3 C605[8C6C0000]06        	mov     byte [TempoWait], DefTempo
  1245 000009EA C605[8D6C0000]7D        	mov     byte [Bpm], DefBpm
  1246 000009F1 C605[8E6C0000]40        	mov     byte [Row], 64
  1247 000009F8 C605[8F6C0000]00        	mov     byte [BreakRow], 0
  1248 000009FF 66A1[E10D0000]          	mov     ax, [MixSpeed]
  1249 00000A05 31D2                    	xor     edx, edx
  1250 00000A07 66BB3200                	mov     bx, 24*DefBpm/60
  1251 00000A0B 66F7F3                  	div     bx
  1252 00000A0E 66A3[906C0000]          	mov     [BpmSamples], ax
  1253                                  ClearTracks:    
  1254 00000A14 BF[A06C0000]            	mov     edi, Tracks
  1255 00000A19 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1256 00000A1E 31C0                    	xor     eax, eax
  1257                                  	;cld
  1258 00000A20 F3AA                    	rep     stosb
  1259                                  
  1260 00000A22 A3[926C0000]            	mov     [BufPtr], eax
  1261 00000A27 66A3[966C0000]          	mov     [BufLen], ax
  1262                                  MakePitch:
  1263 00000A2D 66B80021                	mov     ax, MidCRate
  1264 00000A31 66BBAC01                	mov     bx, 428
  1265 00000A35 66F7E3                  	mul     bx
  1266 00000A38 66F735[E10D0000]        	div     word [MixSpeed]
  1267 00000A3F 30F6                    	xor     dh, dh
  1268 00000A41 88E2                    	mov     dl, ah
  1269 00000A43 88C4                    	mov     ah, al
  1270 00000A45 30C0                    	xor     al, al
  1271 00000A47 66B95903                	mov     cx, 857
  1272 00000A4B 31DB                    	xor     ebx, ebx
  1273 00000A4D BF[D8140000]            	mov     edi, PitchTable
  1274                                  PitchLoop:      
  1275 00000A52 50                      	push    eax
  1276 00000A53 52                      	push    edx
  1277 00000A54 6639DA                  	cmp     dx, bx
  1278 00000A57 7303                    	jae     short NoDiv
  1279 00000A59 66F7F3                  	div     bx
  1280                                  NoDiv:          
  1281 00000A5C 66AB                    	stosw
  1282 00000A5E 5A                      	pop     edx
  1283 00000A5F 58                      	pop     eax
  1284 00000A60 43                      	inc     ebx
  1285 00000A61 E2EF                    	loop    PitchLoop
  1286                                  MakeVolume:     
  1287 00000A63 66B90041                	mov     cx, 16640
  1288 00000A67 89CB                    	mov     ebx, ecx
  1289                                  VolLoop:
  1290 00000A69 4B                      	dec     ebx
  1291 00000A6A 88D8                    	mov     al, bl
  1292 00000A6C F6EF                    	imul    bh
  1293 00000A6E 88A3[8A1B0000]          	mov     [VolTable+ebx], ah
  1294 00000A74 E2F3                    	loop    VolLoop
  1295                                  
  1296 00000A76 61                      	popad
  1297 00000A77 C3                      	retn
  1298                                  
  1299                                  ;--------------------------------------------------------------------------
  1300                                  ; StopPlaying: ShutDown the Sound System.
  1301                                  ;--------------------------------------------------------------------------
  1302                                  
  1303                                  StopPlaying:
  1304                                  	; 19/06/2017
  1305                                  	; Stop Playing
  1306                                  	sys	_audio, 0700h
  1306                              <1> 
  1306                              <1> 
  1306                              <1> 
  1306                              <1> 
  1306                              <1>  %if %0 >= 2
  1306 00000A78 BB00070000          <1>  mov ebx, %2
  1306                              <1>  %if %0 >= 3
  1306                              <1>  mov ecx, %3
  1306                              <1>  %if %0 = 4
  1306                              <1>  mov edx, %4
  1306                              <1>  %endif
  1306                              <1>  %endif
  1306                              <1>  %endif
  1306 00000A7D B820000000          <1>  mov eax, %1
  1306                              <1> 
  1306 00000A82 CD40                <1>  int 40h
  1307                                  	; Cancel callback service (for user)
  1308                                  	sys	_audio, 0900h
  1308                              <1> 
  1308                              <1> 
  1308                              <1> 
  1308                              <1> 
  1308                              <1>  %if %0 >= 2
  1308 00000A84 BB00090000          <1>  mov ebx, %2
  1308                              <1>  %if %0 >= 3
  1308                              <1>  mov ecx, %3
  1308                              <1>  %if %0 = 4
  1308                              <1>  mov edx, %4
  1308                              <1>  %endif
  1308                              <1>  %endif
  1308                              <1>  %endif
  1308 00000A89 B820000000          <1>  mov eax, %1
  1308                              <1> 
  1308 00000A8E CD40                <1>  int 40h
  1309                                  	; Deallocate Audio Buffer (for user)
  1310                                  	sys	_audio, 0A00h
  1310                              <1> 
  1310                              <1> 
  1310                              <1> 
  1310                              <1> 
  1310                              <1>  %if %0 >= 2
  1310 00000A90 BB000A0000          <1>  mov ebx, %2
  1310                              <1>  %if %0 >= 3
  1310                              <1>  mov ecx, %3
  1310                              <1>  %if %0 = 4
  1310                              <1>  mov edx, %4
  1310                              <1>  %endif
  1310                              <1>  %endif
  1310                              <1>  %endif
  1310 00000A95 B820000000          <1>  mov eax, %1
  1310                              <1> 
  1310 00000A9A CD40                <1>  int 40h
  1311                                  	; Disable Audio Device
  1312                                  	sys	_audio, 0C00h
  1312                              <1> 
  1312                              <1> 
  1312                              <1> 
  1312                              <1> 
  1312                              <1>  %if %0 >= 2
  1312 00000A9C BB000C0000          <1>  mov ebx, %2
  1312                              <1>  %if %0 >= 3
  1312                              <1>  mov ecx, %3
  1312                              <1>  %if %0 = 4
  1312                              <1>  mov edx, %4
  1312                              <1>  %endif
  1312                              <1>  %endif
  1312                              <1>  %endif
  1312 00000AA1 B820000000          <1>  mov eax, %1
  1312                              <1> 
  1312 00000AA6 CD40                <1>  int 40h
  1313                                  
  1314 00000AA8 C3                      	retn
  1315                                  
  1316                                  ; 24/06/2017
  1317                                  ;--------------------------------------------------------------------------
  1318                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1319                                  ;--------------------------------------------------------------------------
  1320                                  ; This Conversion is needed for AC'97 hardware 
  1321                                  ; which ony supports 16 bit stereo samples !
  1322                                  
  1323                                  ; source = temp_buffer (8192 bytes)
  1324                                  ; destination = Audio_Buffer (32768 bytes)
  1325                                  
  1326                                  ConvertSamples:
  1327                                  	; 24/06/2017
  1328 00000AA9 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1329 00000AAE BE[00800100]            	mov	esi, temp_buffer
  1330 00000AB3 BF[00000100]            	mov	edi, Audio_Buffer
  1331                                  c_smpl_1:
  1332 00000AB8 AC                      	lodsb	; get 8 bit mono sample
  1333 00000AB9 20C0                    	and	al, al
  1334 00000ABB 7506                    	jnz	short c_smpl_2
  1335 00000ABD 66B80080                	mov	ax, 8000h
  1336 00000AC1 EB06                    	jmp	short c_smpl_3
  1337                                  c_smpl_2:
  1338 00000AC3 2C80                    	sub	al, 80h	
  1339 00000AC5 88C4                    	mov	ah, al
  1340 00000AC7 28C0                    	sub	al, al
  1341                                  c_smpl_3:	
  1342 00000AC9 6689C2                  	mov	dx, ax
  1343 00000ACC C1E010                  	shl	eax, 16
  1344 00000ACF 6689D0                  	mov	ax, dx
  1345 00000AD2 AB                      	stosd	; save 16 bit stereo sample
  1346 00000AD3 E2E3                    	loop 	c_smpl_1
  1347                                  	
  1348 00000AD5 C3                      	retn
  1349                                  
  1350                                  ;=============================================================================
  1351                                  ; 
  1352                                  ;=============================================================================
  1353                                  
  1354                                  ;dword2str:
  1355                                  ;	; 13/11/2016 - Erdogan Tan 
  1356                                  ;	; eax = dword value
  1357                                  ;	;
  1358                                  ;	call	dwordtohex
  1359                                  ;	mov	[dword_str], edx
  1360                                  ;	mov	[dword_str+4], eax
  1361                                  ;	mov	si, dword_str
  1362                                  ;	retn
  1363                                  
  1364                                  	; 05/03/2017 (TRDOS 386)
  1365                                  	; trdos386.s (unix386.s) - 10/05/2015
  1366                                  	; Convert binary number to hexadecimal string
  1367                                  
  1368                                  ;bytetohex:
  1369                                  ;	; INPUT ->
  1370                                  ;	; 	AL = byte (binary number)
  1371                                  ;	; OUTPUT ->
  1372                                  ;	;	AX = hexadecimal string
  1373                                  ;	;
  1374                                  ;	push	ebx
  1375                                  ;	movzx	ebx, al
  1376                                  ;	shr	bl, 4
  1377                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1378                                  ;	xchg	bl, al
  1379                                  ;	and	bl, 0Fh
  1380                                  ;	mov	ah, [ebx+hex_chars] 
  1381                                  ;	pop	ebx	
  1382                                  ;	retn
  1383                                  
  1384                                  ;wordtohex:
  1385                                  ;	; INPUT ->
  1386                                  ;	; 	AX = word (binary number)
  1387                                  ;	; OUTPUT ->
  1388                                  ;	;	EAX = hexadecimal string
  1389                                  ;	;
  1390                                  ;	push	ebx
  1391                                  ;	xor	ebx, ebx
  1392                                  ;	xchg	ah, al
  1393                                  ;	push	eax
  1394                                  ;	mov	bl, ah
  1395                                  ;	shr	bl, 4
  1396                                  ;	mov	al, [ebx+hex_chars] 	 	
  1397                                  ;	mov	bl, ah
  1398                                  ;	and	bl, 0Fh
  1399                                  ;	mov	ah, [ebx+hex_chars]
  1400                                  ;	shl	eax, 16
  1401                                  ;	pop	eax
  1402                                  ;	pop	ebx
  1403                                  ;	jmp	short bytetohex
  1404                                  
  1405                                  ;dwordtohex:
  1406                                  ;	; INPUT ->
  1407                                  ;	; 	EAX = dword (binary number)
  1408                                  ;	; OUTPUT ->
  1409                                  ;	;	EDX:EAX = hexadecimal string
  1410                                  ;	;
  1411                                  ;	push	eax
  1412                                  ;	shr	eax, 16
  1413                                  ;	call	wordtohex
  1414                                  ;	mov	edx, eax
  1415                                  ;	pop	eax
  1416                                  ;	call	wordtohex
  1417                                  ;	retn
  1418                                  
  1419                                  	; 24/06/2017
  1420                                  	; 19/06/2017
  1421                                  	; 05/03/2017 (TRDOS 386)
  1422                                  	; 13/11/2016 - Erdogan Tan
  1423                                  write_audio_dev_info:
  1424                                  	; BUS/DEV/FN
  1425                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1426                                  	; DEV/VENDOR
  1427                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1428                                  
  1429 00000AD6 8B35[8C0E0000]          	mov	esi, [dev_vendor]
  1430 00000ADC 6689F0                  	mov	ax, si
  1431 00000ADF 0FB6D8                  	movzx	ebx, al
  1432 00000AE2 88DA                    	mov	dl, bl
  1433 00000AE4 80E30F                  	and	bl, 0Fh
  1434 00000AE7 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1435 00000AED A2[280E0000]            	mov	[msgVendorId+3], al
  1436 00000AF2 88D3                    	mov	bl, dl
  1437 00000AF4 C0EB04                  	shr	bl, 4
  1438 00000AF7 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1439 00000AFD A2[270E0000]            	mov	[msgVendorId+2], al
  1440 00000B02 88E3                    	mov	bl, ah
  1441 00000B04 88DA                    	mov	dl, bl
  1442 00000B06 80E30F                  	and	bl, 0Fh
  1443 00000B09 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1444 00000B0F A2[260E0000]            	mov	[msgVendorId+1], al
  1445 00000B14 88D3                    	mov	bl, dl
  1446 00000B16 C0EB04                  	shr	bl, 4
  1447 00000B19 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1448 00000B1F A2[250E0000]            	mov	[msgVendorId], al
  1449 00000B24 C1EE10                  	shr	esi, 16
  1450 00000B27 6689F0                  	mov	ax, si
  1451 00000B2A 88C3                    	mov	bl, al
  1452 00000B2C 88DA                    	mov	dl, bl
  1453 00000B2E 80E30F                  	and	bl, 0Fh
  1454 00000B31 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1455 00000B37 A2[390E0000]            	mov	[msgDevId+3], al
  1456 00000B3C 88D3                    	mov	bl, dl
  1457 00000B3E C0EB04                  	shr	bl, 4
  1458 00000B41 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1459 00000B47 A2[380E0000]            	mov	[msgDevId+2], al
  1460 00000B4C 88E3                    	mov	bl, ah
  1461 00000B4E 88DA                    	mov	dl, bl
  1462 00000B50 80E30F                  	and	bl, 0Fh
  1463 00000B53 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1464 00000B59 A2[370E0000]            	mov	[msgDevId+1], al
  1465 00000B5E 88D3                    	mov	bl, dl
  1466 00000B60 C0EB04                  	shr	bl, 4
  1467 00000B63 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1468 00000B69 A2[360E0000]            	mov	[msgDevId], al
  1469                                  
  1470 00000B6E 8B35[900E0000]          	mov	esi, [bus_dev_fn]
  1471 00000B74 C1EE08                  	shr	esi, 8
  1472 00000B77 6689F0                  	mov	ax, si
  1473 00000B7A 88C3                    	mov	bl, al
  1474 00000B7C 88DA                    	mov	dl, bl
  1475 00000B7E 80E307                  	and	bl, 7 ; bit 0,1,2
  1476 00000B81 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1477 00000B87 A2[5D0E0000]            	mov	[msgFncNo+1], al
  1478 00000B8C 88D3                    	mov	bl, dl
  1479 00000B8E C0EB03                  	shr	bl, 3
  1480 00000B91 88DA                    	mov	dl, bl
  1481 00000B93 80E30F                  	and	bl, 0Fh
  1482 00000B96 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1483 00000B9C A2[4F0E0000]            	mov	[msgDevNo+1], al
  1484 00000BA1 88D3                    	mov	bl, dl
  1485 00000BA3 C0EB04                  	shr	bl, 4
  1486 00000BA6 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1487 00000BAC A2[4E0E0000]            	mov	[msgDevNo], al
  1488 00000BB1 88E3                    	mov	bl, ah
  1489 00000BB3 88DA                    	mov	dl, bl
  1490 00000BB5 80E30F                  	and	bl, 0Fh
  1491 00000BB8 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1492 00000BBE A2[430E0000]            	mov	[msgBusNo+1], al
  1493 00000BC3 88D3                    	mov	bl, dl
  1494 00000BC5 C0EB04                  	shr	bl, 4
  1495 00000BC8 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1496 00000BCE A2[420E0000]            	mov	[msgBusNo], al
  1497                                  
  1498                                  	; 24/06/2017
  1499 00000BD3 66A1[980E0000]          	mov	ax, [ac97_NamBar]
  1500 00000BD9 88C3                    	mov	bl, al
  1501 00000BDB 88DA                    	mov	dl, bl
  1502 00000BDD 80E30F                  	and	bl, 0Fh
  1503 00000BE0 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1504 00000BE6 A2[6C0E0000]            	mov	[msgNamBar+3], al
  1505 00000BEB 88D3                    	mov	bl, dl
  1506 00000BED C0EB04                  	shr	bl, 4
  1507 00000BF0 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1508 00000BF6 A2[6B0E0000]            	mov	[msgNamBar+2], al
  1509 00000BFB 88E3                    	mov	bl, ah
  1510 00000BFD 88DA                    	mov	dl, bl
  1511 00000BFF 80E30F                  	and	bl, 0Fh
  1512 00000C02 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1513 00000C08 A2[6A0E0000]            	mov	[msgNamBar+1], al
  1514 00000C0D 88D3                    	mov	bl, dl
  1515 00000C0F C0EB04                  	shr	bl, 4
  1516 00000C12 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1517 00000C18 A2[690E0000]            	mov	[msgNamBar], al
  1518                                  
  1519 00000C1D 66A1[9A0E0000]          	mov	ax, [ac97_NabmBar]
  1520 00000C23 88C3                    	mov	bl, al
  1521 00000C25 88DA                    	mov	dl, bl
  1522 00000C27 80E30F                  	and	bl, 0Fh
  1523 00000C2A 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1524 00000C30 A2[7C0E0000]            	mov	[msgNabmBar+3], al
  1525 00000C35 88D3                    	mov	bl, dl
  1526 00000C37 C0EB04                  	shr	bl, 4
  1527 00000C3A 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1528 00000C40 A2[7B0E0000]            	mov	[msgNabmBar+2], al
  1529 00000C45 88E3                    	mov	bl, ah
  1530 00000C47 88DA                    	mov	dl, bl
  1531 00000C49 80E30F                  	and	bl, 0Fh
  1532 00000C4C 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1533 00000C52 A2[7A0E0000]            	mov	[msgNabmBar+1], al
  1534 00000C57 88D3                    	mov	bl, dl
  1535 00000C59 C0EB04                  	shr	bl, 4
  1536 00000C5C 8A83[E30D0000]          	mov	al, [ebx+hex_chars]
  1537 00000C62 A2[790E0000]            	mov	[msgNabmBar], al
  1538                                  
  1539                                  	; 24/11/2016
  1540 00000C67 30E4                    	xor	ah, ah
  1541 00000C69 A0[9C0E0000]            	mov	al, [ac97_int_ln_reg]
  1542 00000C6E B10A                    	mov	cl, 10
  1543 00000C70 F6F1                    	div	cl
  1544 00000C72 660105[850E0000]        	add	[msgIRQ], ax
  1545 00000C79 20C0                    	and	al, al
  1546 00000C7B 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1547 00000C7D A0[860E0000]            	mov	al, [msgIRQ+1]
  1548 00000C82 B420                    	mov	ah, ' '
  1549 00000C84 66A3[850E0000]          	mov	[msgIRQ], ax
  1550                                  _w_ac97imsg_:
  1551                                  	; EBX = Message address
  1552                                  	; ECX = Max. message length (or stop on ZERO character)
  1553                                  	;	(1 to 255)
  1554                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1555                                       	sys 	_msg, msgAC97Info, 255, 07h
  1555                              <1> 
  1555                              <1> 
  1555                              <1> 
  1555                              <1> 
  1555                              <1>  %if %0 >= 2
  1555 00000C8A BB[F40D0000]        <1>  mov ebx, %2
  1555                              <1>  %if %0 >= 3
  1555 00000C8F B9FF000000          <1>  mov ecx, %3
  1555                              <1>  %if %0 = 4
  1555 00000C94 BA07000000          <1>  mov edx, %4
  1555                              <1>  %endif
  1555                              <1>  %endif
  1555                              <1>  %endif
  1555 00000C99 B823000000          <1>  mov eax, %1
  1555                              <1> 
  1555 00000C9E CD40                <1>  int 40h
  1556 00000CA0 C3                              retn
  1557                                  
  1558                                  ;=============================================================================
  1559                                  ;               preinitialized data
  1560                                  ;=============================================================================
  1561                                  
  1562                                  ;=============================================================================
  1563                                  ;               PLAY.ASM - DATA
  1564                                  ;=============================================================================
  1565                                  
  1566                                  msg_2017:
  1567 00000CA1 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1567 00000CAA 506C6179657220666F-
  1567 00000CB3 72205452444F532033-
  1567 00000CBC 383620627920457264-
  1567 00000CC5 6F67616E2054616E2E-
  1567 00000CCE 20                 
  1568 00000CCF 4A756E652032303137-     	db	'June 2017.',10,13
  1568 00000CD8 2E0A0D             
  1569 00000CDB 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1569 00000CE4 64706C61792066696C-
  1569 00000CED 656E616D652E6D6F64-
  1569 00000CF6 0A0D00             
  1570 00000CF9 32342F30362F323031-     	db	'24/06/2017',10,13,0
  1570 00000D02 370A0D00           
  1571                                  
  1572 00000D06 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1572 00000D0F 506C61796572207630-
  1572 00000D18 2E3162206279204361-
  1572 00000D21 726C6F732048617361-
  1572 00000D2A 6E2E204A756C792031-
  1572 00000D33 3939332E           
  1573 00000D37 0A0D00                  		db	10,13,0
  1574 00000D3A 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1574 00000D43 64696E67204D6F6475-
  1574 00000D4C 6C652066696C652E0A-
  1574 00000D55 0D00               
  1575                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1576                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1577                                  ;PortText:	db	'x0h, IRQ '
  1578                                  ;IrqText:	db	'x.',10,13,0
  1579                                  
  1580                                  trdos386_err_msg:
  1581 00000D57 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1581 00000D60 2053797374656D2063-
  1581 00000D69 616C6C206572726F72-
  1581 00000D72 20210A0D00         
  1582                                  
  1583                                  ;=============================================================================
  1584                                  ;               MODPLAY.ASM - DATA
  1585                                  ;=============================================================================
  1586                                  
  1587                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1588                                  
  1589 00000D77 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1589 00000D80 C5D4E1             
  1590 00000D83 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1590 00000D8C E1                 
  1591 00000D8D D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1591 00000D96 19                 
  1592                                  
  1593 00000D97 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1593 00000DA0 0280025C023A021A02-
  1593 00000DA9 FC01E001C501       
  1594 00000DAF AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1594 00000DB8 0140012E011D010D01-
  1594 00000DC1 FE00F000E200       
  1595 00000DC7 D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1595 00000DD0 00A00097008F008700-
  1595 00000DD9 7F0078007100       
  1596                                  
  1597                                  ;=============================================================================
  1598                                  ;               PLAYER.ASM - DATA
  1599                                  ;=============================================================================
  1600                                  
  1601 00000DDF 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1602 00000DE0 08                      bps:		db 8 ; bits per sample (8 or 16)
  1603                                  Sample_Rate:
  1604 00000DE1 2256                    MixSpeed:	dw 22050 ; Hz
  1605                                  
  1606                                  ; 13/11/2016
  1607 00000DE3 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1607 00000DEC 3941424344454600   
  1608                                  ;
  1609                                  msgAC97Info:	
  1610 00000DF4 0D0A                    		db 0Dh, 0Ah
  1611 00000DF6 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1611 00000DFF 6F20436F6E74726F6C-
  1611 00000E08 6C6572202620436F64-
  1611 00000E11 656320496E666F0D0A 
  1612 00000E1A 56656E646F72204944-     		db "Vendor ID: "
  1612 00000E23 3A20               
  1613 00000E25 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1613 00000E2E 6963652049443A20   
  1614 00000E36 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1615 00000E3D 4275733A20              		db "Bus: "
  1616 00000E42 303068204465766963-     msgBusNo:	db "00h Device: "
  1616 00000E4B 653A20             
  1617 00000E4E 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1617 00000E57 696F6E3A20         
  1618 00000E5C 303068                  msgFncNo	db "00h"
  1619 00000E5F 0D0A                    		db 0Dh, 0Ah
  1620 00000E61 4E414D4241523A20        		db "NAMBAR: "
  1621 00000E69 30303030682020          msgNamBar	db "0000h  "
  1622 00000E70 4E41424D4241523A20      		db "NABMBAR: "
  1623 00000E79 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1623 00000E82 513A20             
  1624 00000E85 3030                    msgIRQ:		dw 3030h
  1625 00000E87 0D0A00                  		db 0Dh, 0Ah, 0
  1626                                  
  1627                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1628                                  ;codec_id:	   dd 0
  1629                                  ;codec_chip_id:	   dd 0
  1630                                  ;codec_vendor_ids: dw 0
  1631                                  ;codec_chip_ids:   dw 0
  1632                                  
  1633                                  ;dword_str:	dd 30303030h, 30303030h
  1634                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1635                                  
  1636                                  ;=============================================================================
  1637                                  ;        	uninitialized data
  1638                                  ;=============================================================================
  1639                                  
  1640                                  bss_start:
  1641                                  
  1642                                  ABSOLUTE bss_start
  1643                                  
  1644 00000E8A <res 00000002>          alignb 4
  1645                                  
  1646 00000E8C <res 00000004>          dev_vendor:	resd 1
  1647 00000E90 <res 00000004>          bus_dev_fn:	resd 1
  1648 00000E94 <res 00000004>          stats_cmd:	resd 1
  1649 00000E98 <res 00000002>          ac97_NamBar:	resw 1
  1650 00000E9A <res 00000002>          ac97_NabmBar:	resw 1
  1651 00000E9C <res 00000001>          ac97_int_ln_reg: resb 1
  1652 00000E9D <res 00000001>          srb:		resb 1
  1653                                  
  1654                                  ; MODLOAD.ASM
  1655 00000E9E <res 00000002>          FileHandle:	resw 1
  1656 00000EA0 <res 00000002>          ErrorInfo:	resw 1
  1657 00000EA2 <res 0000043C>          Header:	resb	ModHeader.size
  1658                                  
  1659                                  ; MODPLAY.ASM
  1660                                  ;MixSpeed:	    resw 1
  1661                                  
  1662                                  ModInfo:
  1663 000012DE <res 00000001>          ModInfo.OrderLen:   resb 1
  1664 000012DF <res 00000001>          ModInfo.ReStart:    resb 1
  1665 000012E0 <res 00000080>          ModInfo.Order:	    resb 128
  1666 00001360 <res 00000004>          ModInfo.Patterns:   resd 1
  1667                                  
  1668 00001364 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1669 000013A2 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1670 000013E0 <res 0000003E>          ModInfo.SampLen:    resw 31
  1671 0000141E <res 0000003E>          ModInfo.SampRep:    resw 31
  1672 0000145C <res 0000003E>          ModInfo.SampRepLen: resw 31
  1673 0000149A <res 0000003E>          ModInfo.SampVol:    resw 31
  1674                                  
  1675                                  ; MODPLAY.ASM
  1676 000014D8 <res 000006B2>          PitchTable:	resw 857
  1677 00001B8A <res 00004100>          VolTable:	resb 16640
  1678 00005C8A <res 00001000>          MixBuffer       resb MixBufSize
  1679                                  
  1680                                  ; MODPLAY.ASM
  1681 00006C8A <res 00000001>          OrderPos:	resb 1
  1682 00006C8B <res 00000001>          Tempo:		resb 1
  1683 00006C8C <res 00000001>          TempoWait:	resb 1
  1684 00006C8D <res 00000001>          Bpm:		resb 1
  1685 00006C8E <res 00000001>          Row:		resb 1
  1686 00006C8F <res 00000001>          BreakRow:	resb 1
  1687 00006C90 <res 00000002>          BpmSamples:	resw 1
  1688 00006C92 <res 00000004>          BufPtr:		resd 1
  1689 00006C96 <res 00000002>          BufLen:		resw 1
  1690 00006C98 <res 00000004>          BufRep:		resd 1
  1691 00006C9C <res 00000004>          Note:		resd 1
  1692 00006CA0 <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1693                                  
  1694                                  alignb 16
  1695                                  
  1696                                  ; PLAY.ASM
  1697 00006D30 <res 00000280>          Scope:		resw 320
  1698 00006FB0 <res 00000200>          RowOfs:		resw 256
  1699                                  
  1700                                  mod_file_name:
  1701 000071B0 <res 00000050>          		resb 80
  1702                                  
  1703 00007200 <res 00000E00>          alignb 4096
  1704                                  
  1705                                  g_buff:
  1706 00008000 <res 00000500>          		resb 320*4 ; 24/06/2017
  1707                                  
  1708 00008500 <res 00007B00>          alignb 65536
  1709                                  
  1710                                  Audio_Buffer:
  1711 00010000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1712                                  temp_buffer:
  1713 00018000 <res 00002000>          		resb BUFFERSIZE / 4 ; 8192
  1714                                  
  1715 0001A000 <res 00006000>          alignb 65536
  1716                                  
  1717                                  file_buffer:
  1718 00020000 <res 00060000>          		resb 65536*6
  1719                                  EOF:
