     1                                  ; ****************************************************************************
     2                                  ; modplay3.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY3.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 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[00000900]            	mov	ecx, EOF
   115 00000005 BF[970E0000]            	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 E8FC010000              	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[21020000]        <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 E9BE010000                      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 0F82BB010000            	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[C0710000]            	mov	edi, mod_file_name
   141                                  ScanName:       
   142 0000004A AC                      	lodsb
   143 0000004B 84C0                    	test	al, al
   144 0000004D 0F84A9010000            	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[130D0000]        <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[00800000]        <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 0F821E010000            	jc	error_exit
   173                                  _2:
   174                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   175                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   176                                  	;jc	error_exit
   177                                  	
   178                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   179                                  	sys	_audio, 0300h, 1, srb 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1>  %if %0 >= 2
   179 000000A7 BB00030000          <1>  mov ebx, %2
   179                              <1>  %if %0 >= 3
   179 000000AC B901000000          <1>  mov ecx, %3
   179                              <1>  %if %0 = 4
   179 000000B1 BA[A90E0000]        <1>  mov edx, %4
   179                              <1>  %endif
   179                              <1>  %endif
   179                              <1>  %endif
   179 000000B6 B820000000          <1>  mov eax, %1
   179                              <1> 
   179 000000BB CD40                <1>  int 40h
   180 000000BD 0F8202010000            	jc	error_exit
   181                                  
   182                                  LoadMod:  
   183 000000C3 BF[C0710000]            	mov	edi, mod_file_name
   184 000000C8 E821020000              	call    LoadModule		; Load the MODule...
   185                                  
   186 000000CD 66833D[AC0E0000]00      	cmp     word [ErrorInfo], 0	; any error loading?
   187 000000D5 741B                    	je      short short _3
   188                                  
   189                                  	; yes, print error and Exit.
   190                                  
   191                                  	sys	_msg, ErrorMesg, 255, 0Fh
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1>  %if %0 >= 2
   191 000000D7 BB[470D0000]        <1>  mov ebx, %2
   191                              <1>  %if %0 >= 3
   191 000000DC B9FF000000          <1>  mov ecx, %3
   191                              <1>  %if %0 = 4
   191 000000E1 BA0F000000          <1>  mov edx, %4
   191                              <1>  %endif
   191                              <1>  %endif
   191                              <1>  %endif
   191 000000E6 B823000000          <1>  mov eax, %1
   191                              <1> 
   191 000000EB CD40                <1>  int 40h
   192                                  
   193 000000ED E901010000              	jmp     Exit
   194                                  
   195                                  _3:
   196                                  	; 10/06/2017
   197                                  	sys	_audio, 0E00h ; get audio controller info
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1>  %if %0 >= 2
   197 000000F2 BB000E0000          <1>  mov ebx, %2
   197                              <1>  %if %0 >= 3
   197                              <1>  mov ecx, %3
   197                              <1>  %if %0 = 4
   197                              <1>  mov edx, %4
   197                              <1>  %endif
   197                              <1>  %endif
   197                              <1>  %endif
   197 000000F7 B820000000          <1>  mov eax, %1
   197                              <1> 
   197 000000FC CD40                <1>  int 40h
   198 000000FE 0F82C1000000            	jc	error_exit
   199                                  
   200                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   201                                  	;jne	_dev_not_ready	
   202                                  
   203                                  	; EAX = IRQ Number in AL
   204                                  	;	Audio Device Number in AH 
   205                                  	; EBX = DEV/VENDOR ID
   206                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   207                                  	; ECX = BUS/DEV/FN 
   208                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   209                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   210                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   211                                  	;      (Low word, DX = NAMBAR address)
   212                                  
   213 00000104 A2[A80E0000]            	mov	[ac97_int_ln_reg], al
   214 00000109 891D[980E0000]          	mov	[dev_vendor], ebx
   215 0000010F 890D[9C0E0000]          	mov	[bus_dev_fn], ecx
   216 00000115 668915[A40E0000]        	mov	[ac97_NamBar], dx
   217                                  	;mov	[ac97_NamBar], dx
   218                                  	;shr	dx, 16
   219                                  	;mov	[ac97_NabmBar], dx
   220 0000011C 8915[A40E0000]          	mov	[ac97_NamBar], edx	
   221                                    
   222 00000122 E8BC090000              	call	write_audio_dev_info 
   223                                  
   224                                  PlayNow: 
   225 00000127 E8B5080000              	call    StartPlaying
   226                                  
   227                                          ; load 32768 bytes into audio buffer
   228                                  	;mov	edi, Audio_Buffer
   229                                  	;mov	ebx, BUFFERSIZE
   230                                  	; 24/06/2017
   231                                          ; load 8192 bytes into audio buffer
   232 0000012C BF[00000100]            	mov	edi, temp_buffer
   233 00000131 BB00200000              	mov	ebx, BUFFERSIZE / 4
   234 00000136 E829080000              	call	GetSamples
   235 0000013B 0F8284000000            	jc	error_exit
   236                                  
   237                                  	; 24/06/2017
   238                                  	; 8 bit to 16 bit (*2)
   239                                  	; mono to stereo (*2)
   240                                  	; 4* (BUFFERSIZE/4) 
   241                                  	; source = temp_buffer
   242                                  	; destination = Audio_Buffer
   243 00000141 E870090000              	call 	ConvertSamples
   244                                  
   245                                  	;mov	ecx, 128	; Make a lookup table
   246 00000146 B180                    	mov	cl, 128
   247 00000148 31DB                    	xor     ebx, ebx	; for fastest pixel
   248 0000014A BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   249                                  MakeOfs:        
   250 0000014F 668993[C06F0000]        	mov     [RowOfs+ebx], dx
   251 00000156 668993[C26F0000]        	mov     [RowOfs+ebx+2], dx
   252 0000015D 6681C24001              	add     dx, 320
   253 00000162 83C304                  	add     ebx, 4
   254 00000165 E2E8                    	loop    MakeOfs
   255                                  
   256                                  	; 23/06/2017
   257                                  	; Map DMA buffer to user's memory space
   258                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
   258                              <1> 
   258                              <1> 
   258                              <1> 
   258                              <1> 
   258                              <1>  %if %0 >= 2
   258 00000167 BB000D0000          <1>  mov ebx, %2
   258                              <1>  %if %0 >= 3
   258 0000016C B900000100          <1>  mov ecx, %3
   258                              <1>  %if %0 = 4
   258 00000171 BA[00000200]        <1>  mov edx, %4
   258                              <1>  %endif
   258                              <1>  %endif
   258                              <1>  %endif
   258 00000176 B820000000          <1>  mov eax, %1
   258                              <1> 
   258 0000017B CD40                <1>  int 40h
   259                                  	;jc	error_exit
   260                                  
   261                                  	; Set Master Volume Level
   262                                  	sys	_audio, 0B00h, 1D1Dh
   262                              <1> 
   262                              <1> 
   262                              <1> 
   262                              <1> 
   262                              <1>  %if %0 >= 2
   262 0000017D BB000B0000          <1>  mov ebx, %2
   262                              <1>  %if %0 >= 3
   262 00000182 B91D1D0000          <1>  mov ecx, %3
   262                              <1>  %if %0 = 4
   262                              <1>  mov edx, %4
   262                              <1>  %endif
   262                              <1>  %endif
   262                              <1>  %endif
   262 00000187 B820000000          <1>  mov eax, %1
   262                              <1> 
   262 0000018C CD40                <1>  int 40h
   263                                  
   264                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   265                                  	
   266                                  	; Start	to play
   267 0000018E A0[ED0D0000]            	mov	al, [bps]
   268 00000193 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   269 00000196 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   270 00000198 8A1D[EC0D0000]          	mov	bl, [stmo]
   271 0000019E FECB                    	dec	bl
   272 000001A0 08C3                    	or	bl, al
   273 000001A2 668B0D[EE0D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   274 000001A9 B704                    	mov	bh, 4 ; start to play	
   275                                  	sys	_audio
   275                              <1> 
   275                              <1> 
   275                              <1> 
   275                              <1> 
   275                              <1>  %if %0 >= 2
   275                              <1>  mov ebx, %2
   275                              <1>  %if %0 >= 3
   275                              <1>  mov ecx, %3
   275                              <1>  %if %0 = 4
   275                              <1>  mov edx, %4
   275                              <1>  %endif
   275                              <1>  %endif
   275                              <1>  %endif
   275 000001AB B820000000          <1>  mov eax, %1
   275                              <1> 
   275 000001B0 CD40                <1>  int 40h
   276                                      
   277                                  	;; SETUP SIGNAL RESPONSE BYTE
   278                                  	;; 06/03/2017
   279                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   280                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   281                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   282                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   283                                  	;sys	_calbac
   284                                  	;jc	short error_exit
   285                                  
   286                                  	; DIRECT VGA MEMORY ACCESS
   287                                  	; bl = 0, bh = 5
   288                                  	; Direct access/map to VGA memory (0A0000h)
   289                                  
   290                                  	sys	_video, 0500h
   290                              <1> 
   290                              <1> 
   290                              <1> 
   290                              <1> 
   290                              <1>  %if %0 >= 2
   290 000001B2 BB00050000          <1>  mov ebx, %2
   290                              <1>  %if %0 >= 3
   290                              <1>  mov ecx, %3
   290                              <1>  %if %0 = 4
   290                              <1>  mov edx, %4
   290                              <1>  %endif
   290                              <1>  %endif
   290                              <1>  %endif
   290 000001B7 B81F000000          <1>  mov eax, %1
   290                              <1> 
   290 000001BC CD40                <1>  int 40h
   291 000001BE 3D00000A00              	cmp	eax, 0A0000h
   292 000001C3 7418                    	je	short _a3
   293                                  error_exit:
   294                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   294                              <1> 
   294                              <1> 
   294                              <1> 
   294                              <1> 
   294                              <1>  %if %0 >= 2
   294 000001C5 BB[640D0000]        <1>  mov ebx, %2
   294                              <1>  %if %0 >= 3
   294 000001CA B9FF000000          <1>  mov ecx, %3
   294                              <1>  %if %0 = 4
   294 000001CF BA0E000000          <1>  mov edx, %4
   294                              <1>  %endif
   294                              <1>  %endif
   294                              <1>  %endif
   294 000001D4 B823000000          <1>  mov eax, %1
   294                              <1> 
   294 000001D9 CD40                <1>  int 40h
   295 000001DB EB16                    	jmp	short Exit
   296                                  
   297                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   298                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   299                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   300                                  ;       second, or the module will sound "looped".
   301                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   302                                  ;       the polling is called from my routine, and then the irq 0 must be
   303                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   304                                  ;       samples played by the Sound Blaster. Note that some samples are
   305                                  ;       discarded in the next code, just for fun!
   306                                  
   307                                  _a3:
   308 000001DD 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   309 000001E1 CD31                    	int     31h
   310                                  
   311                                  	; 24/06/2017
   312 000001E3 E864000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   313                                  
   314                                  _s_exit:
   315 000001E8 E898080000              	call	StopPlaying	; STOP!
   316                                  
   317 000001ED 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   318 000001F1 CD31                    	int     31h
   319                                  Exit:           
   320                                  	;call    FreeModule	; Free MODule core.
   321                                  	
   322                                  	sys 	_exit	; Bye !
   322                              <1> 
   322                              <1> 
   322                              <1> 
   322                              <1> 
   322                              <1>  %if %0 >= 2
   322                              <1>  mov ebx, %2
   322                              <1>  %if %0 >= 3
   322                              <1>  mov ecx, %3
   322                              <1>  %if %0 = 4
   322                              <1>  mov edx, %4
   322                              <1>  %endif
   322                              <1>  %endif
   322                              <1>  %endif
   322 000001F3 B801000000          <1>  mov eax, %1
   322                              <1> 
   322 000001F8 CD40                <1>  int 40h
   323                                  here:
   324 000001FA EBFE                    	jmp	short here
   325                                  
   326                                  pmsg_2017:
   327                                  	sys	_msg, msg_2017, 255, 0Fh
   327                              <1> 
   327                              <1> 
   327                              <1> 
   327                              <1> 
   327                              <1>  %if %0 >= 2
   327 000001FC BB[AE0C0000]        <1>  mov ebx, %2
   327                              <1>  %if %0 >= 3
   327 00000201 B9FF000000          <1>  mov ecx, %3
   327                              <1>  %if %0 = 4
   327 00000206 BA0F000000          <1>  mov edx, %4
   327                              <1>  %endif
   327                              <1>  %endif
   327                              <1>  %endif
   327 0000020B B823000000          <1>  mov eax, %1
   327                              <1> 
   327 00000210 CD40                <1>  int 40h
   328 00000212 EBDF                    	jmp	short Exit
   329                                  
   330                                  DetectICH:
   331                                  	; 24/06/2017
   332                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   333                                          sys	_audio, 0102h
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1>  %if %0 >= 2
   333 00000214 BB02010000          <1>  mov ebx, %2
   333                              <1>  %if %0 >= 3
   333                              <1>  mov ecx, %3
   333                              <1>  %if %0 = 4
   333                              <1>  mov edx, %4
   333                              <1>  %endif
   333                              <1>  %endif
   333                              <1>  %endif
   333 00000219 B820000000          <1>  mov eax, %1
   333                              <1> 
   333 0000021E CD40                <1>  int 40h
   334 00000220 C3                      	retn
   335                                  
   336                                  noDevMsg:
   337 00000221 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   337 0000022A 61626C6520746F2066-
   337 00000233 696E64204143393720-
   337 0000023C 617564696F20646576-
   337 00000245 696365210D0A00     
   338                                  
   339                                  ;ac97_int_handler:
   340                                  ;	; 19/06/2017
   341                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   342                                  ;
   343                                  ;	sys	_rele ; return from callback service 
   344                                  ;	; we must not come here !
   345                                  ;	sys	_exit
   346                                  
   347                                  ;=============================================================================
   348                                  ;      
   349                                  ;=============================================================================
   350                                  
   351                                  PlayMod:
   352                                  	; 23/06/2017   
   353                                  	; 21/06/2017
   354                                  	; 19/06/2017
   355                                  
   356                                  	; 05/03/2017 (TRDOS 386)
   357                                  	; 14/02/2017
   358                                  	; 13/02/2017
   359                                  	; 08/12/2016
   360                                  	; 28/11/2016
   361                                  
   362 0000024C EB10                         	jmp	short modp_gs ; 23/06/2017
   363                                  p_loop:
   364 0000024E 803D[A90E0000]00        	cmp	byte [srb], 0
   365 00000255 7621                    	jna	short q_loop
   366 00000257 C605[A90E0000]00        	mov	byte [srb], 0
   367                                  modp_gs:
   368                                  	;mov	edi, Audio_Buffer
   369                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   370                                  	;call	GetSamples
   371                                  
   372                                  	; 24/06/2017
   373                                          ; load 8192 bytes into audio buffer
   374 0000025E BF[00000100]            	mov	edi, temp_buffer
   375 00000263 BB00200000              	mov	ebx, BUFFERSIZE / 4
   376 00000268 E8F7060000              	call	GetSamples
   377 0000026D 0F8252FFFFFF            	jc	error_exit
   378                                  
   379                                  	; 24/06/2017
   380                                  	; 8 bit to 16 bit (*2)
   381                                  	; mono to stereo (*2)
   382                                  	; 4* (BUFFERSIZE/4) 
   383                                  	; source = temp_buffer
   384                                  	; destination = Audio_Buffer
   385 00000273 E83E080000              	call 	ConvertSamples
   386                                  
   387                                  q_loop:
   388 00000278 B401                    	mov     ah, 1		; any key pressed?
   389 0000027A CD32                    	int     32h		; no, Loop.
   390 0000027C 7405                    	jz	short r_loop
   391                                  
   392 0000027E B400                    	mov     ah, 0		; flush key buffer...
   393 00000280 CD32                    	int     32h
   394                                  q_return:
   395 00000282 C3                      	retn
   396                                  r_loop:
   397                                  	; Get Current DMA buffer Pointer 
   398                                  	; 23/06/2017
   399                                  	; bh = 15, get current pointer (DMA buffer offset)
   400                                  	; bl = 0, for PCM OUT
   401                                  	; ecx = 0
   402                                  	;
   403                                  	sys	_audio, 0F00h, 0
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1>  %if %0 >= 2
   403 00000283 BB000F0000          <1>  mov ebx, %2
   403                              <1>  %if %0 >= 3
   403 00000288 B900000000          <1>  mov ecx, %3
   403                              <1>  %if %0 = 4
   403                              <1>  mov edx, %4
   403                              <1>  %endif
   403                              <1>  %endif
   403                              <1>  %endif
   403 0000028D B820000000          <1>  mov eax, %1
   403                              <1> 
   403 00000292 CD40                <1>  int 40h
   404                                  ScopeLoop:
   405 00000294 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   406                                  	; 23/06/2017
   407 00000299 BE[00000200]            	mov     esi, DMA_Buffer
   408 0000029E 01C6                    	add     esi, eax	; add offset value
   409                                  	; 24/06/2017
   410 000002A0 B9[00FB0200]            	mov	ecx, DMA_Buffer + (65536 - (320*4))
   411 000002A5 39CE                    	cmp	esi, ecx 
   412 000002A7 7602                    	jna	short _4
   413 000002A9 89CE                    	mov	esi, ecx
   414                                  _4:
   415 000002AB 31C9                    	xor     ecx, ecx	; to be drawed ...
   416 000002AD 31D2                    	xor     edx, edx
   417                                  DrawLoop:       
   418 000002AF 89D3                    	mov     ebx, edx	; (save Index)
   419 000002B1 668BBB[406D0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   420 000002B8 C60700                  	mov     byte [edi], 0	; erase it!
   421                                  	; 24/06/2017
   422 000002BB AD                      	lodsd
   423 000002BC 80C480                  	add	ah, 80h
   424 000002BF 88E3                    	mov	bl, ah
   425                                  	;
   426 000002C1 30FF                    	xor     bh, bh
   427 000002C3 66D1E3                  	shl     bx, 1
   428 000002C6 668BBB[C06F0000]        	mov     di, [RowOfs+ebx]
   429 000002CD 6601CF                  	add     di, cx
   430 000002D0 6689D3                  	mov     bx, dx		; (restore Index)
   431 000002D3 6689BB[406D0000]        	mov     [Scope+ebx], di	; save new address...
   432 000002DA C6070A                  	mov     byte [edi], 10	; and DRAW.
   433 000002DD 6683C202                	add     dx, 2		; the next pixel...
   434 000002E1 41                      	inc     ecx
   435 000002E2 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   436 000002E7 72C6                    	jb      short DrawLoop
   437 000002E9 E960FFFFFF              	jmp	p_loop
   438                                  
   439                                  
   440                                  ;=============================================================================
   441                                  ;               MODLOAD.ASM
   442                                  ;=============================================================================
   443                                  
   444                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   445                                  ;	July 10th, 1993.
   446                                  
   447                                  ; STRUCTURES
   448                                  
   449                                  struc ModSample
   450 00000000 <res 00000016>          .msName:	resb 22
   451 00000016 <res 00000002>          .msLength:	resw 1
   452 00000018 <res 00000001>          .msFinetune:	resb 1
   453 00000019 <res 00000001>          .msVolume:	resb 1
   454 0000001A <res 00000002>          .msRepeat:	resw 1
   455 0000001C <res 00000002>          .msRepLen:	resw 1
   456                                  .size:
   457                                  endstruc
   458                                  
   459                                  struc ModHeader
   460 00000000 <res 00000014>          .mhName:	resb 20
   461 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   462 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   463 000003B7 <res 00000001>          .mhReStart:	resb 1
   464 000003B8 <res 00000080>          .mhOrder:	resb 128
   465 00000438 <res 00000004>          .mhSign:	resw 2
   466                                  .size:	
   467                                  endstruc
   468                                  
   469                                  struc ModInfoRec
   470 00000000 <res 00000001>          .OrderLen:	resb 1
   471 00000001 <res 00000001>          .ReStart:	resb 1
   472 00000002 <res 00000080>          .Order:	resb 128
   473 00000082 <res 00000004>          .Patterns:	resd 1
   474 00000086 <res 0000003E>          .SampOfs:	resw 31
   475 000000C4 <res 0000003E>          .SampSeg:	resw 31
   476 00000102 <res 0000003E>          .SampLen:	resw 31
   477 00000140 <res 0000003E>          .SampRep:	resw 31
   478 0000017E <res 0000003E>          .SampRepLen:	resw 31
   479 000001BC <res 0000003E>          .SampVol:	resw 31
   480                                  .size:	
   481                                  endstruc
   482                                  
   483                                  ; CODE
   484                                  
   485                                  LoadModule:
   486                                  	; edi = file name address
   487                                  
   488 000002EE 60                      	pushad
   489                                  
   490 000002EF 66C705[AC0E0000]01-     	mov	word [ErrorInfo], 1
   490 000002F7 00                 
   491                                  
   492 000002F8 E88F010000              	call    ClearModInfo
   493                                  OpenFile:       
   494                                  	; ebx = ASCIIZ file name address
   495                                  	; ecx = open mode (0 = open for read)	
   496                                  	sys	_open, edi, 0 ; open for reading
   496                              <1> 
   496                              <1> 
   496                              <1> 
   496                              <1> 
   496                              <1>  %if %0 >= 2
   496 000002FD 89FB                <1>  mov ebx, %2
   496                              <1>  %if %0 >= 3
   496 000002FF B900000000          <1>  mov ecx, %3
   496                              <1>  %if %0 = 4
   496                              <1>  mov edx, %4
   496                              <1>  %endif
   496                              <1>  %endif
   496                              <1>  %endif
   496 00000304 B805000000          <1>  mov eax, %1
   496                              <1> 
   496 00000309 CD40                <1>  int 40h
   497 0000030B 0F8279010000            	jc	Failed
   498 00000311 A3[AA0E0000]            	mov     [FileHandle], eax
   499                                  ReadHeader:
   500                                  	; ebx = File handle
   501                                  	; ecx = Buffer address
   502                                  	; edx = Byte count
   503                                  	sys	_read, [FileHandle], Header, ModHeader.size
   503                              <1> 
   503                              <1> 
   503                              <1> 
   503                              <1> 
   503                              <1>  %if %0 >= 2
   503 00000316 8B1D[AA0E0000]      <1>  mov ebx, %2
   503                              <1>  %if %0 >= 3
   503 0000031C B9[AE0E0000]        <1>  mov ecx, %3
   503                              <1>  %if %0 = 4
   503 00000321 BA3C040000          <1>  mov edx, %4
   503                              <1>  %endif
   503                              <1>  %endif
   503                              <1>  %endif
   503 00000326 B803000000          <1>  mov eax, %1
   503                              <1> 
   503 0000032B CD40                <1>  int 40h
   504 0000032D 0F824A010000            	jc      CloseFile
   505                                  CheckMK:        
   506 00000333 813D[E6120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   506 0000033B 4B2E               
   507 0000033D 7440                    	je      short IsModFile
   508                                  CheckFLT4:
   509 0000033F 813D[E6120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   509 00000347 5434               
   510 00000349 7434                    	je      short IsModFile
   511                                  Is15Inst:
   512 0000034B BE[84100000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   513 00000350 BF[64120000]            	mov     edi, Header+ModHeader.mhOrderLen
   514                                  	;cld
   515                                  	;mov	ecx, 130
   516 00000355 66B98200                	mov	cx, 130
   517 00000359 F3A4                    	rep     movsb
   518 0000035B BF[84100000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   519 00000360 30C0                    	xor     al, al
   520 00000362 66B9E001                	mov     cx, 16*ModSample.size
   521 00000366 F3AA                    	rep     stosb
   522                                  SeekPatterns:   
   523                                  	; ebx = [FileHandle]
   524                                  	; ecx = offset
   525                                  	; edx = switch (0 = from beginning)
   526                                  	sys	_seek, [FileHandle], 600, 0
   526                              <1> 
   526                              <1> 
   526                              <1> 
   526                              <1> 
   526                              <1>  %if %0 >= 2
   526 00000368 8B1D[AA0E0000]      <1>  mov ebx, %2
   526                              <1>  %if %0 >= 3
   526 0000036E B958020000          <1>  mov ecx, %3
   526                              <1>  %if %0 = 4
   526 00000373 BA00000000          <1>  mov edx, %4
   526                              <1>  %endif
   526                              <1>  %endif
   526                              <1>  %endif
   526 00000378 B813000000          <1>  mov eax, %1
   526                              <1> 
   526 0000037D CD40                <1>  int 40h
   527                                  IsModFile:
   528 0000037F A0[64120000]            	mov     al, [Header+ModHeader.mhOrderLen]
   529 00000384 A2[EA120000]            	mov     [ModInfo.OrderLen], al
   530                                  
   531 00000389 A0[65120000]            	mov     al, [Header+ModHeader.mhReStart]
   532 0000038E 3A05[64120000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   533 00000394 7202                    	jb      short SetReStart
   534 00000396 B07F                    	mov     al, 7Fh
   535                                  SetReStart:
   536 00000398 A2[EB120000]            	mov     [ModInfo.ReStart], al
   537                                  
   538                                  	;mov	ecx, 128
   539 0000039D 66B98000                	mov	cx, 128
   540 000003A1 31D2                    	xor     edx, edx
   541 000003A3 31DB                    	xor     ebx, ebx
   542                                  CopyOrder:
   543 000003A5 8AB3[66120000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   544 000003AB 88B3[EC120000]          	mov     [ModInfo.Order+ebx], dh
   545 000003B1 38D6                    	cmp     dh, dl
   546 000003B3 7202                    	jb      short NextOrder
   547 000003B5 88F2                    	mov     dl, dh
   548                                  NextOrder:
   549 000003B7 43                      	inc     ebx
   550 000003B8 E2EB                    	loop    CopyOrder
   551                                  AllocPatterns:  
   552 000003BA 81E2FF000000            	and	edx, 0FFh
   553 000003C0 6642                    	inc	dx ; 14/03/2017
   554                                  	; dl = count of 1024 bytes
   555 000003C2 C1E20A                  	shl	edx, 10 ; *1024
   556                                  
   557 000003C5 89D5                    	mov	ebp, edx
   558                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   559 000003C7 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   560                                  	;
   561 000003CC 890D[6C130000]          	mov	[ModInfo.Patterns], ecx
   562                                  	;
   563 000003D2 01CD                    	add	ebp, ecx ; next offset for samples
   564                                  ReadPatterns:  
   565                                  	;mov	ebx, [FileHandle] 
   566                                  	; ebx = File handle
   567                                  	; ecx = Buffer address
   568                                  	; edx = Byte count
   569                                  	sys	_read, [FileHandle]
   569                              <1> 
   569                              <1> 
   569                              <1> 
   569                              <1> 
   569                              <1>  %if %0 >= 2
   569 000003D4 8B1D[AA0E0000]      <1>  mov ebx, %2
   569                              <1>  %if %0 >= 3
   569                              <1>  mov ecx, %3
   569                              <1>  %if %0 = 4
   569                              <1>  mov edx, %4
   569                              <1>  %endif
   569                              <1>  %endif
   569                              <1>  %endif
   569 000003DA B803000000          <1>  mov eax, %1
   569                              <1> 
   569 000003DF CD40                <1>  int 40h
   570 000003E1 0F8296000000            	jc      CloseFile
   571                                  
   572 000003E7 BE[C20E0000]            	mov	esi, Header+ModHeader.mhSamples
   573 000003EC 31FF                    	xor     edi, edi
   574                                  CopySamples:
   575 000003EE 668B4616                	mov     ax, [esi+ModSample.msLength]
   576 000003F2 86C4                    	xchg    al, ah
   577 000003F4 66D1E0                  	shl     ax, 1
   578 000003F7 668987[EC130000]        	mov     [ModInfo.SampLen+edi], ax
   579 000003FE 8A4619                  	mov     al, [esi+ModSample.msVolume]
   580 00000401 30E4                    	xor     ah, ah
   581 00000403 668987[A6140000]        	mov     [ModInfo.SampVol+edi], ax
   582 0000040A 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   583 0000040E 86C4                    	xchg    al, ah
   584 00000410 66D1E0                  	shl     ax, 1
   585 00000413 668987[2A140000]        	mov     [ModInfo.SampRep+edi], ax
   586 0000041A 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   587 0000041E 86C4                    	xchg    al, ah
   588 00000420 66D1E0                  	shl     ax, 1
   589 00000423 668987[68140000]        	mov     [ModInfo.SampRepLen+edi], ax
   590 0000042A 83C61E                  	add     esi, ModSample.size
   591 0000042D 6683C702                	add     di, 2
   592 00000431 6683FF3E                	cmp     di, 2*31
   593 00000435 72B7                    	jb      short CopySamples
   594                                  
   595 00000437 31F6                    	xor     esi, esi
   596                                  AllocSamples:
   597 00000439 0FB796[EC130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   598 00000440 09D2                    	or	edx, edx ; byte count
   599 00000442 7426                    	jz      short NextSample
   600 00000444 89E8                    	mov	eax, ebp
   601 00000446 668986[70130000]        	mov	[ModInfo.SampOfs+esi], ax
   602 0000044D C1E810                  	shr	eax, 16
   603 00000450 668986[AE130000]        	mov	[ModInfo.SampSeg+esi], ax
   604 00000457 89E9                    	mov	ecx, ebp
   605 00000459 01D5                    	add	ebp, edx ; next offset for sample 
   606                                  ReadSample:
   607                                  	;mov	ebx, [FileHandle]
   608                                  	;movzx  edx, [ModInfo.SampLen+esi]
   609                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   610                                  
   611                                  	; ebx = File handle
   612                                  	; ecx = Buffer address
   613                                  	; edx = Byte count
   614                                  	sys	_read, [FileHandle]
   614                              <1> 
   614                              <1> 
   614                              <1> 
   614                              <1> 
   614                              <1>  %if %0 >= 2
   614 0000045B 8B1D[AA0E0000]      <1>  mov ebx, %2
   614                              <1>  %if %0 >= 3
   614                              <1>  mov ecx, %3
   614                              <1>  %if %0 = 4
   614                              <1>  mov edx, %4
   614                              <1>  %endif
   614                              <1>  %endif
   614                              <1>  %endif
   614 00000461 B803000000          <1>  mov eax, %1
   614                              <1> 
   614 00000466 CD40                <1>  int 40h
   615 00000468 7213                    	jc      short CloseFile
   616                                  
   617                                  NextSample:
   618 0000046A 6683C602                	add     si, 2
   619 0000046E 6683FE3E                	cmp     si, 2*31
   620 00000472 72C5                    	jb      short AllocSamples
   621                                  
   622 00000474 66C705[AC0E0000]00-     	mov     word [ErrorInfo], 0
   622 0000047C 00                 
   623                                  CloseFile:      
   624                                  	sys	_close, [FileHandle]
   624                              <1> 
   624                              <1> 
   624                              <1> 
   624                              <1> 
   624                              <1>  %if %0 >= 2
   624 0000047D 8B1D[AA0E0000]      <1>  mov ebx, %2
   624                              <1>  %if %0 >= 3
   624                              <1>  mov ecx, %3
   624                              <1>  %if %0 = 4
   624                              <1>  mov edx, %4
   624                              <1>  %endif
   624                              <1>  %endif
   624                              <1>  %endif
   624 00000483 B806000000          <1>  mov eax, %1
   624                              <1> 
   624 00000488 CD40                <1>  int 40h
   625                                  Failed:         
   626 0000048A 61                      	popad
   627                                  
   628 0000048B C3                      	retn
   629                                  
   630                                  FreeModule:
   631                                  	; Erdogan Tan (13/02/2017)
   632                                  	; nothing to do here for memory de-allocation
   633                                  ClearModInfo:
   634 0000048C 57                      	push	edi
   635 0000048D BF[EA120000]            	mov	edi, ModInfo
   636 00000492 B9FA010000              	mov     ecx, ModInfoRec.size
   637                                  	;cld
   638 00000497 30C0                    	xor     al, al
   639 00000499 F3AA                    	rep     stosb
   640 0000049B 5F                      	pop	edi
   641 0000049C C3                      	retn
   642                                  
   643                                  ;=============================================================================
   644                                  ;               MODPLAY.ASM
   645                                  ;=============================================================================
   646                                  
   647                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   648                                  ;	July 23th, 1993.
   649                                  
   650                                  ; EQUATES
   651                                  
   652                                  NumTracks       equ 4
   653                                  DefTempo        equ 6
   654                                  DefBpm          equ 125
   655                                  MidCRate        equ 8448
   656                                  MixBufSize      equ 4096
   657                                  
   658                                  ; STRUCTURES
   659                                  
   660                                  struc TrackInfo
   661 00000000 <res 00000004>          .Samples:	resd 1
   662 00000004 <res 00000004>          .Position:	resd 1
   663 00000008 <res 00000002>          .Len:	resw 1
   664 0000000A <res 00000002>          .Repeat:	resw 1
   665 0000000C <res 00000002>          .RepLen:	resw 1
   666 0000000E <res 00000001>          .Volume: 	resb 1
   667 0000000F <res 00000001>          .Error:	resb 1
   668 00000010 <res 00000002>          .Period:	resw 1
   669 00000012 <res 00000002>          .Pitch:	resw 1
   670 00000014 <res 00000002>          .Effect:	resw 1
   671 00000016 <res 00000002>          .PortTo:	resw 1
   672 00000018 <res 00000001>          .PortParm:	resb 1
   673 00000019 <res 00000001>          .VibPos:	resb 1
   674 0000001A <res 00000001>          .VibParm:	resb 1
   675 0000001B <res 00000001>          .OldSampOfs:	resb 1
   676 0000001C <res 00000006>          .Arp:	resw 3
   677 00000022 <res 00000002>          .ArpIndex:	resw 1
   678                                  .size:
   679                                  endstruc
   680                                  
   681                                  ; CODE
   682                                  
   683                                  ;--------------------------------------------------------------------------
   684                                  ; BeatTrack:  Process the next beat in one track.
   685                                  ;  In:
   686                                  ;    ds:di -  Track info Address.
   687                                  ;--------------------------------------------------------------------------
   688                                  
   689                                  ; edi = Track info address
   690                                  
   691                                  BeatTrack:
   692 0000049D 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   693 000004A1 6685D2                  	test    dx, dx
   694 000004A4 743C                    	je      short None
   695 000004A6 80FE00                  	cmp     dh, 00h
   696 000004A9 7438                    	je      short Arpeggio
   697 000004AB 80FE01                  	cmp     dh, 01h
   698 000004AE 7451                    	je      short PortUp
   699 000004B0 80FE02                  	cmp     dh, 02h
   700 000004B3 7471                    	je      short PortDown
   701 000004B5 80FE03                  	cmp     dh, 03h
   702 000004B8 0F848E000000            	je      TonePort
   703 000004BE 80FE04                  	cmp     dh, 04h
   704 000004C1 0F84BD000000            	je      Vibrato
   705 000004C7 80FE05                  	cmp     dh, 05h
   706 000004CA 0F840E010000            	je      PortSlide
   707 000004D0 80FE06                  	cmp     dh, 06h
   708 000004D3 0F8412010000            	je      VibSlide
   709 000004D9 80FE0A                  	cmp     dh, 0Ah
   710 000004DC 0F8413010000            	je      VolSlide
   711                                  None:           
   712 000004E2 C3                      	retn
   713                                  Arpeggio:
   714 000004E3 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   715 000004E7 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   716 000004EC 66894712                	mov     [edi+TrackInfo.Pitch], ax
   717 000004F0 6683C302                	add     bx, 2
   718 000004F4 6683FB06                	cmp     bx, 6
   719 000004F8 7202                    	jb      short SetArpIndex
   720 000004FA 31DB                    	xor     ebx, ebx
   721                                  SetArpIndex:
   722 000004FC 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   723 00000500 C3                      	retn
   724                                  PortUp:
   725 00000501 30F6                    	xor     dh, dh
   726 00000503 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   727 00000507 6629D3                  	sub     bx, dx
   728 0000050A 6683FB71                	cmp     bx, 113
   729 0000050E 7D04                    	jge     short NotSmall
   730 00000510 66BB7100                	mov     bx, 113
   731                                  NotSmall:
   732 00000514 66895F10                	mov     [edi+TrackInfo.Period], bx
   733 00000518 6601DB                  	add     bx, bx
   734 0000051B 66678B87[E414]          	mov     ax, [PitchTable+bx]
   735 00000521 66894712                	mov     [edi+TrackInfo.Pitch], ax
   736 00000525 C3                      	retn
   737                                  PortDown:
   738 00000526 30F6                    	xor     dh, dh
   739 00000528 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   740 0000052C 6601D3                  	add     bx, dx
   741 0000052F 6681FB5803              	cmp     bx, 856
   742 00000534 7E04                    	jle     short NotBig
   743 00000536 66BB5803                	mov     bx, 856
   744 0000053A 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   745 0000053E 6601DB                  	add     bx, bx
   746 00000541 66678B87[E414]          	mov     ax, [PitchTable+bx]
   747 00000547 66894712                	mov     [edi+TrackInfo.Pitch], ax
   748 0000054B C3                      	retn
   749                                  TonePort:
   750 0000054C 30F6                    	xor     dh, dh
   751 0000054E 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   752 00000552 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   753 00000556 6639C3                  	cmp     bx, ax
   754 00000559 7428                    	je      short NoPort
   755 0000055B 7F0D                    	jg      short PortToUp
   756                                  PortToDown:     
   757 0000055D 6601D3                  	add     bx, dx
   758 00000560 6639C3                  	cmp     bx, ax
   759 00000563 7E0D                    	jle     short SetPort
   760                                  FixPort:        
   761 00000565 6689C3                  	mov     bx, ax
   762 00000568 EB08                    	jmp     short SetPort
   763                                  PortToUp:
   764 0000056A 6629D3                  	sub     bx, dx
   765 0000056D 6639C3                  	cmp     bx, ax
   766 00000570 7CF3                    	jl      short FixPort
   767                                  SetPort:        
   768 00000572 66895F10                	mov     [edi+TrackInfo.Period], bx
   769 00000576 6601DB                  	add     bx, bx
   770 00000579 66678B87[E414]          	mov     ax, [PitchTable+bx]
   771 0000057F 66894712                	mov     [edi+TrackInfo.Pitch], ax
   772                                  NoPort:         
   773 00000583 C3                      	retn
   774                                  Vibrato:
   775 00000584 88D6                    	mov     dh, dl
   776 00000586 80E20F                  	and     dl, 0Fh
   777 00000589 C0EE04                  	shr     dh, 4
   778 0000058C C0E602                  	shl     dh, 2
   779 0000058F 007719                  	add     [edi+TrackInfo.VibPos], dh
   780 00000592 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   781 00000595 88F3                    	mov     bl, dh
   782 00000597 C0EB02                  	shr     bl, 2
   783 0000059A 6683E31F                	and     bx, 1Fh
   784 0000059E 678A87[840D]            	mov     al, [SinTable+bx]
   785 000005A3 F6E2                    	mul     dl
   786 000005A5 66D1C0                  	rol     ax, 1
   787 000005A8 86C4                    	xchg    al, ah
   788 000005AA 80E401                  	and     ah, 1
   789 000005AD 84F6                    	test    dh, dh
   790 000005AF 7903                    	jns     short VibUp
   791 000005B1 66F7D8                  	neg     ax
   792                                  VibUp:          
   793 000005B4 66034710                	add     ax, [edi+TrackInfo.Period]
   794 000005B8 6689C3                  	mov     bx, ax
   795 000005BB 6683FB71                	cmp     bx, 113
   796 000005BF 7D04                    	jge     short NoLoVib
   797 000005C1 66BB7100                	mov     bx, 113
   798                                  NoLoVib:        
   799 000005C5 6681FB5803              	cmp     bx, 856
   800 000005CA 7E04                    	jle     short NoHiVib
   801 000005CC 66BB5803                	mov     bx, 856
   802                                  NoHiVib:        
   803 000005D0 6601DB                  	add     bx, bx
   804 000005D3 66678B87[E414]          	mov     ax, [PitchTable+bx]
   805 000005D9 66894712                	mov     [edi+TrackInfo.Pitch], ax
   806 000005DD C3                      	retn
   807                                  PortSlide:
   808 000005DE E812000000              	call    VolSlide
   809 000005E3 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   810 000005E6 E961FFFFFF              	jmp     TonePort
   811                                  VibSlide:
   812 000005EB E805000000              	call    VolSlide
   813 000005F0 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   814 000005F3 EB8F                    	jmp     short Vibrato
   815                                  VolSlide:
   816 000005F5 88D6                    	mov     dh, dl
   817 000005F7 80E20F                  	and     dl, 0Fh
   818 000005FA C0EE04                  	shr     dh, 4
   819 000005FD 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   820 00000600 28D0                    	sub     al, dl
   821 00000602 7D02                    	jge     short NoLoVol
   822 00000604 30C0                    	xor     al, al
   823                                  NoLoVol:        
   824 00000606 00F0                    	add     al, dh
   825 00000608 3C40                    	cmp     al, 64
   826 0000060A 7602                    	jbe     short NoHiVol
   827 0000060C B040                    	mov     al, 64
   828                                  NoHiVol:        
   829 0000060E 88470E                  	mov     [edi+TrackInfo.Volume], al
   830 00000611 C3                      	retn
   831                                  
   832                                  ;--------------------------------------------------------------------------
   833                                  ; GetTrack:   Get the next Note from a pattern.
   834                                  ;  In:
   835                                  ;    ds:di -  Track info Address.
   836                                  ;    es:si -  Pattern Note Address.
   837                                  ; Out:
   838                                  ;    es:si -  The Next Pattern Note address.
   839                                  ;--------------------------------------------------------------------------
   840                                  
   841                                  ; esi = Pattern note address
   842                                  ; edi = Track info address
   843                                  
   844                                  GetTrack:
   845 00000612 66AD                    	lodsw
   846 00000614 86C4                    	xchg    al, ah
   847 00000616 88E3                    	mov	bl, ah
   848 00000618 80E40F                  	and     ah, 0Fh
   849 0000061B 6689C1                  	mov     cx, ax
   850 0000061E 66AD                    	lodsw
   851 00000620 86C4                    	xchg    al, ah
   852 00000622 88E7                    	mov     bh, ah
   853 00000624 80E40F                  	and     ah, 0Fh
   854 00000627 6689C2                  	mov     dx, ax
   855 0000062A 66895714                	mov     [edi+TrackInfo.Effect], dx
   856 0000062E 80E3F0                  	and     bl, 0F0h
   857 00000631 C0EF04                  	shr     bh, 4
   858 00000634 08FB                    	or      bl, bh
   859 00000636 7449                    	je      short SetPeriod
   860                                  SetSample:
   861                                  	;xor    bh, bh
   862 00000638 81E3FF000000            	and	ebx, 0FFh
   863 0000063E 4B                      	dec     ebx
   864 0000063F 01DB                    	add     ebx, ebx
   865 00000641 668B83[A6140000]        	mov     ax, [ModInfo.SampVol+ebx]
   866 00000648 88470E                  	mov     [edi+TrackInfo.Volume], al
   867 0000064B 668B83[70130000]        	mov     ax, [ModInfo.SampOfs+ebx]
   868 00000652 668907                  	mov     [edi+TrackInfo.Samples], ax
   869 00000655 668B83[AE130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   870 0000065C 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   871 00000660 668B83[EC130000]        	mov     ax, [ModInfo.SampLen+ebx]
   872 00000667 66894708                	mov     [edi+TrackInfo.Len], ax
   873 0000066B 668B83[2A140000]        	mov     ax, [ModInfo.SampRep+ebx]
   874 00000672 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   875 00000676 668B83[68140000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   876 0000067D 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   877                                  SetPeriod:      
   878 00000681 6685C9                  	test    cx, cx
   879 00000684 7424                    	jz      short SetEffect
   880                                  
   881 00000686 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   882 0000068A 80FE03                  	cmp     dh, 03h
   883 0000068D 741B                    	je      short SetEffect
   884                                  
   885 0000068F 66894F10                	mov     [edi+TrackInfo.Period], cx
   886 00000693 6689CB                  	mov     bx, cx
   887 00000696 6601DB                  	add     bx, bx
   888 00000699 66678B87[E414]          	mov     ax, [PitchTable+bx]
   889 0000069F 66894712                	mov     [edi+TrackInfo.Pitch], ax
   890 000006A3 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   891                                  SetEffect:
   892 000006AA 6685D2                  	test    dx, dx
   893 000006AD 7430                    	jz      short InitNone
   894 000006AF 80FE00                  	cmp     dh, 00h
   895 000006B2 0F84E5000000            	je      InitArpeggio
   896 000006B8 80FE03                  	cmp     dh, 03h
   897 000006BB 7423                    	je      short InitTonePort
   898 000006BD 80FE04                  	cmp     dh, 04h
   899 000006C0 742D                    	je      short InitVibrato
   900 000006C2 80FE09                  	cmp     dh, 09h
   901 000006C5 7451                    	je      short SampleOfs
   902 000006C7 80FE0B                  	cmp     dh, 0Bh
   903 000006CA 7462                    	je      short PosJump
   904 000006CC 80FE0C                  	cmp     dh, 0Ch
   905 000006CF 746B                    	je      short SetVolume
   906 000006D1 80FE0D                  	cmp     dh, 0Dh
   907 000006D4 7471                    	je      short Break
   908 000006D6 80FE0F                  	cmp     dh, 0Fh
   909 000006D9 0F8487000000            	je      SetSpeed
   910                                  InitNone:
   911 000006DF C3                      	retn
   912                                  InitTonePort:
   913 000006E0 84D2                    	test    dl, dl
   914 000006E2 7503                    	jnz     short SetPortParm
   915 000006E4 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   916                                  SetPortParm:    
   917 000006E7 885718                  	mov     [edi+TrackInfo.PortParm], dl
   918 000006EA 66895714                	mov     [edi+TrackInfo.Effect], dx
   919 000006EE C3                      	retn
   920                                  InitVibrato:
   921 000006EF 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   922 000006F2 88C4                    	mov     ah, al
   923 000006F4 240F                    	and     al, 0Fh
   924 000006F6 80E4F0                  	and     ah, 0F0h
   925 000006F9 F6C20F                  	test    dl, 0Fh
   926 000006FC 7502                    	jne     short OkDepth
   927 000006FE 08C2                    	or      dl, al
   928                                  OkDepth:        
   929 00000700 F6C2F0                  	test    dl, 0F0h
   930 00000703 7502                    	jnz     short OkRate
   931 00000705 08E2                    	or      dl, ah
   932                                  OkRate:         
   933 00000707 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   934 0000070A 66895714                	mov     [edi+TrackInfo.Effect], dx
   935 0000070E 6685C9                  	test    cx, cx
   936 00000711 7404                    	jz      short OkPos
   937 00000713 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   938                                  OkPos:          
   939 00000717 C3                      	retn
   940                                  SampleOfs:      
   941 00000718 84D2                    	test    dl, dl
   942 0000071A 7503                    	jnz     short SetSampleOfs
   943 0000071C 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   944                                  SetSampleOfs:
   945 0000071F 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   946 00000722 88D6                    	mov     dh, dl
   947 00000724 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   948 0000072A 895704                  	mov     [edi+TrackInfo.Position], edx
   949 0000072D C3                      	retn
   950                                  PosJump:
   951 0000072E 8815[966C0000]          	mov     [OrderPos], dl
   952 00000734 C605[9A6C0000]40        	mov     byte [Row], 64
   953 0000073B C3                      	retn
   954                                  SetVolume:
   955 0000073C 80FA40                  	cmp     dl, 64
   956 0000073F 7602                    	jbe     short OkVol
   957 00000741 B240                    	mov     dl, 64
   958                                  OkVol:
   959 00000743 88570E                  	mov     [edi+TrackInfo.Volume], dl
   960 00000746 C3                      	retn
   961                                  Break:
   962 00000747 88D6                    	mov     dh, dl
   963 00000749 80E20F                  	and     dl, 0Fh
   964 0000074C C0EE04                  	shr     dh, 4
   965 0000074F 00F6                    	add     dh, dh
   966 00000751 00F2                    	add     dl, dh
   967 00000753 C0E602                  	shl     dh, 2
   968 00000756 00F2                    	add     dl, dh
   969 00000758 8815[9B6C0000]          	mov     [BreakRow], dl
   970 0000075E C605[9A6C0000]40        	mov     byte [Row], 64
   971 00000765 C3                      	retn
   972                                  SetSpeed:
   973 00000766 84D2                    	test    dl,dl
   974 00000768 7432                    	je      Skip
   975 0000076A 80FA1F                  	cmp     dl,31
   976 0000076D 770D                    	ja      short SetBpm
   977                                  SetTempo:       
   978 0000076F 8815[976C0000]          	mov     [Tempo], dl
   979 00000775 8815[986C0000]          	mov     [TempoWait], dl
   980 0000077B C3                      	retn
   981                                  SetBpm:
   982 0000077C 8815[996C0000]          	mov     [Bpm], dl
   983 00000782 B067                    	mov     al, 103
   984 00000784 F6E2                    	mul     dl
   985 00000786 88E3                    	mov     bl, ah
   986 00000788 30FF                    	xor     bh, bh
   987 0000078A 66A1[EE0D0000]          	mov     ax, [MixSpeed]
   988 00000790 6631D2                  	xor     dx, dx
   989 00000793 66F7F3                  	div     bx
   990 00000796 66A3[9C6C0000]          	mov     [BpmSamples], ax
   991                                  Skip:           
   992 0000079C C3                      	retn
   993                                  InitArpeggio:
   994 0000079D 88D6                    	mov     dh, dl
   995 0000079F 80E20F                  	and     dl, 0Fh
   996 000007A2 C0EE04                  	shr     dh, 4
   997 000007A5 66B92400                	mov     cx, 36
   998 000007A9 31DB                    	xor     ebx, ebx
   999 000007AB 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1000                                  gt_ScanPeriod:
  1001 000007AF 66673B87[A40D]          	cmp     ax, [PeriodTable+bx]
  1002 000007B5 7306                    	jae     short SetArp
  1003 000007B7 6683C302                	add     bx, 2
  1004 000007BB E2F2                    	loop    gt_ScanPeriod
  1005                                  SetArp:         
  1006 000007BD 6601D2                  	add     dx, dx
  1007 000007C0 00DE                    	add     dh, bl
  1008 000007C2 00DA                    	add     dl, bl
  1009 000007C4 66678B9F[A40D]          	mov     bx, [PeriodTable+bx]
  1010 000007CA 6601DB                  	add     bx, bx
  1011 000007CD 66678B87[E414]          	mov     ax, [PitchTable+bx]
  1012 000007D3 6689471C                	mov     [edi+TrackInfo.Arp], ax
  1013 000007D7 88F3                    	mov     bl, dh
  1014 000007D9 30FF                    	xor     bh, bh
  1015 000007DB 66678B9F[A40D]          	mov     bx, [PeriodTable+bx]
  1016 000007E1 6601DB                  	add     bx, bx
  1017 000007E4 66678B87[E414]          	mov     ax, [PitchTable+bx]
  1018 000007EA 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1019 000007EE 88D3                    	mov     bl, dl
  1020 000007F0 30FF                    	xor     bh, bh
  1021 000007F2 66678B9F[A40D]          	mov     bx, [PeriodTable+bx]
  1022 000007F8 6601DB                  	add     bx, bx
  1023 000007FB 66678B87[E414]          	mov     ax, [PitchTable+bx]
  1024 00000801 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1025 00000805 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1026 0000080B C3                      	retn
  1027                                  
  1028                                  ;--------------------------------------------------------------------------
  1029                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1030                                  ;--------------------------------------------------------------------------
  1031                                  
  1032                                  UpdateTracks:
  1033 0000080C FE0D[986C0000]          	dec     byte [TempoWait]
  1034 00000812 7415                    	jz      short GetTracks
  1035                                  
  1036 00000814 B904000000              	mov	ecx, NumTracks
  1037 00000819 BF[AC6C0000]            	mov	edi, Tracks
  1038                                  BeatTracks:
  1039 0000081E E87AFCFFFF              	call	BeatTrack	
  1040 00000823 83C724                  	add	edi, TrackInfo.size
  1041 00000826 E2F6                    	loop	BeatTracks
  1042 00000828 C3                      	retn
  1043                                  GetTracks:
  1044 00000829 A0[976C0000]            	mov     al, [Tempo]
  1045 0000082E A2[986C0000]            	mov     [TempoWait], al
  1046                                  
  1047 00000833 8B35[A86C0000]          	mov	esi, [Note]
  1048 00000839 803D[9A6C0000]40        	cmp     byte [Row], 64
  1049 00000840 7263                    	jb      short NoPattWrap
  1050                                  
  1051 00000842 8B35[6C130000]          	mov	esi, [ModInfo.Patterns]
  1052 00000848 8A1D[966C0000]          	mov     bl, [OrderPos]
  1053 0000084E 3A1D[EA120000]          	cmp     bl, [ModInfo.OrderLen]
  1054 00000854 7214                    	jb      short NoOrderWrap
  1055 00000856 8A1D[EB120000]          	mov     bl, [ModInfo.ReStart]
  1056 0000085C 881D[966C0000]          	mov     [OrderPos], bl
  1057 00000862 3A1D[EA120000]          	cmp     bl, [ModInfo.OrderLen]
  1058 00000868 735D                    	jae     short NoUpdate
  1059                                  NoOrderWrap:    
  1060                                  	;xor	bh, bh
  1061 0000086A 81E3FF000000            	and	ebx, 0FFh
  1062 00000870 8A9B[EC120000]          	mov     bl, [ModInfo.Order+ebx]
  1063 00000876 C1E30A                  	shl     ebx, 10 ; *1024
  1064 00000879 01DE                    	add     esi, ebx
  1065 0000087B 8A1D[9B6C0000]          	mov     bl, [BreakRow]
  1066 00000881 881D[9A6C0000]          	mov     [Row], bl
  1067                                  	;xor     bh, bh
  1068 00000887 81E3FF000000            	and	ebx, 0FFh
  1069 0000088D 883D[9B6C0000]          	mov     [BreakRow], bh ; 0
  1070 00000893 66C1E304                	shl     bx, 4
  1071 00000897 01DE                    	add     esi, ebx
  1072 00000899 8935[A86C0000]          	mov     [Note], esi
  1073 0000089F FE05[966C0000]          	inc     byte [OrderPos]
  1074                                  NoPattWrap:     
  1075 000008A5 FE05[9A6C0000]          	inc     byte [Row]
  1076                                  
  1077                                  	;cld
  1078 000008AB B904000000              	mov	ecx, NumTracks
  1079 000008B0 BF[AC6C0000]            	mov	edi, Tracks
  1080                                  GetTracks_next:
  1081 000008B5 51                      	push	ecx	
  1082 000008B6 E857FDFFFF              	call	GetTrack
  1083 000008BB 59                      	pop	ecx
  1084 000008BC 83C724                  	add	edi, TrackInfo.size
  1085 000008BF E2F4                    	loop	GetTracks_next
  1086                                  
  1087 000008C1 8935[A86C0000]          	mov     [Note], esi
  1088                                  NoUpdate:
  1089 000008C7 C3                      	retn
  1090                                  
  1091                                  ;--------------------------------------------------------------------------
  1092                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1093                                  ;  In:
  1094                                  ;   ds:si -  Track Info Address.
  1095                                  ;   ds:di -  Buffer Address.
  1096                                  ;    cx   -  Buffer Size.
  1097                                  ;--------------------------------------------------------------------------
  1098                                  
  1099                                  ; esi = Track info address
  1100                                  ; edi = Buffer address
  1101                                  ; ecx = Buffer size
  1102                                  
  1103                                  MixTrack:
  1104 000008C8 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1105 000008CD 7748                    	ja      short MixLooped
  1106                                  MixNonLooped:   
  1107 000008CF 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1108 000008D1 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1109 000008D4 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1110 000008D8 52                      	push    edx
  1111 000008D9 56                      	push    esi
  1112 000008DA 01D3                    	add     ebx, edx
  1113 000008DC 01D5                    	add     ebp, edx
  1114 000008DE 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1115 000008E2 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1116 000008E5 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1117 000008E8 89DE                    	mov     esi, ebx
  1118 000008EA 88C7                    	mov     bh, al
  1119 000008EC 88D0                    	mov     al, dl
  1120 000008EE 88F2                    	mov     dl, dh
  1121                                  	;xor	dh, dh
  1122 000008F0 81E2FF000000            	and	edx, 0FFh
  1123                                  nlMixSamp:      
  1124 000008F6 39EE                    	cmp     esi, ebp
  1125 000008F8 7310                    	jae     short nlMixBye
  1126 000008FA 8A1E                    	mov     bl, [esi]
  1127 000008FC 678A9F[961B]            	mov     bl, [VolTable+bx]
  1128 00000901 001F                    	add     [edi], bl
  1129 00000903 47                      	inc     edi
  1130 00000904 00C4                    	add     ah, al
  1131 00000906 11D6                    	adc     esi, edx
  1132 00000908 E2EC                    	loop    nlMixSamp
  1133                                  nlMixBye:       
  1134 0000090A 89F3                    	mov     ebx, esi
  1135 0000090C 5E                      	pop     esi
  1136 0000090D 5A                      	pop     edx
  1137 0000090E 29D3                    	sub     ebx, edx
  1138 00000910 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1139 00000913 88660F                  	mov     [esi+TrackInfo.Error], ah
  1140 00000916 C3                      	retn
  1141                                  MixLooped:
  1142 00000917 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1143 00000919 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1144 0000091C 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1145 00000920 892D[A46C0000]          	mov     [BufRep], ebp
  1146 00000926 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1147 00000929 52                      	push    edx
  1148 0000092A 56                      	push    esi
  1149 0000092B 01D3                    	add     ebx, edx
  1150 0000092D 01D5                    	add     ebp, edx
  1151 0000092F 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1152 00000933 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1153 00000936 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1154 00000939 6689DE                  	mov     si, bx
  1155 0000093C 88C7                    	mov     bh, al
  1156 0000093E 88D0                    	mov     al, dl
  1157 00000940 88F2                    	mov     dl, dh
  1158                                  	;xor	dh, dh
  1159 00000942 81E2FF000000            	and	edx, 0FFh
  1160                                  lpMixSamp:      
  1161 00000948 39EE                    	cmp     esi, ebp
  1162 0000094A 7206                    	jb      short lpMixNow
  1163 0000094C 2B35[A46C0000]          	sub     esi, [BufRep]
  1164                                  lpMixNow:       
  1165 00000952 8A1E                    	mov     bl, [esi]
  1166 00000954 678A9F[961B]            	mov     bl, [VolTable+bx]
  1167 00000959 001F                    	add     [edi], bl
  1168 0000095B 47                      	inc     edi
  1169 0000095C 00C4                    	add     ah, al
  1170 0000095E 11D6                    	adc	esi, edx
  1171 00000960 E2E6                    	loop    lpMixSamp
  1172                                  lpMixBye:       
  1173                                  ;	mov     ebx, esi
  1174                                  ;	pop     esi
  1175                                  ;	pop     edx
  1176                                  ;	sub     ebx, edx
  1177                                  ;	mov     [esi+TrackInfo.Position], ebx
  1178                                  ;	mov     [esi+TrackInfo.Error], ah
  1179                                  ;	retn
  1180 00000962 EBA6                    	jmp	short nlMixBye
  1181                                  
  1182                                  ;--------------------------------------------------------------------------
  1183                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1184                                  ;  In:
  1185                                  ;    Buffer  - Buffer Address.
  1186                                  ;    Count   - Buffer Size.
  1187                                  ;--------------------------------------------------------------------------
  1188                                  
  1189                                  GetSamples:
  1190                                  	; edi = buffer address
  1191                                  	; ebx = count
  1192                                  
  1193 00000964 60                      	pushad
  1194                                  
  1195                                  	;cld
  1196                                  NextChunk:      
  1197 00000965 66833D[A26C0000]00      	cmp     word [BufLen], 0
  1198 0000096D 7548                    	jne     short CopyChunk
  1199                                  
  1200 0000096F 53                      	push    ebx
  1201 00000970 57                      	push    edi
  1202                                  MixChunk:       
  1203 00000971 BF[965C0000]            	mov	edi, MixBuffer
  1204 00000976 0FB70D[9C6C0000]        	movzx	ecx, word [BpmSamples]
  1205 0000097D 893D[9E6C0000]          	mov     [BufPtr], edi
  1206 00000983 66890D[A26C0000]        	mov     [BufLen], cx
  1207                                  
  1208 0000098A B080                    	mov     al, 80h
  1209 0000098C F3AA                    	rep     stosb
  1210                                  
  1211 0000098E 66B90400                	mov	cx, NumTracks
  1212 00000992 BE[886C0000]            	mov	esi, Tracks - TrackInfo.size
  1213                                  GetSamples_next:
  1214 00000997 51                      	push	ecx
  1215 00000998 83C624                  	add	esi, TrackInfo.size
  1216 0000099B 668B0D[A26C0000]        	mov	cx, [BufLen]
  1217 000009A2 8B3D[9E6C0000]          	mov	edi, [BufPtr]
  1218 000009A8 E81BFFFFFF              	call	MixTrack
  1219 000009AD 59                      	pop	ecx
  1220 000009AE E2E7                    	loop	GetSamples_next	
  1221                                  
  1222 000009B0 E857FEFFFF              	call    UpdateTracks
  1223                                  
  1224 000009B5 5F                      	pop     edi
  1225 000009B6 5B                      	pop     ebx
  1226                                  CopyChunk:      
  1227                                  	;mov	cx, [BufLen]
  1228 000009B7 0FB70D[A26C0000]        	movzx	ecx, word [BufLen]
  1229 000009BE 39D9                    	cmp	ecx, ebx
  1230                                  	;cmp	cx, bx
  1231 000009C0 7602                    	jbe     short MoveChunk
  1232                                  	;mov	cx, bx
  1233 000009C2 89D9                    	mov     ecx, ebx
  1234                                  MoveChunk:
  1235 000009C4 8B35[9E6C0000]          	mov     esi, [BufPtr]
  1236 000009CA 010D[9E6C0000]          	add     [BufPtr], ecx
  1237 000009D0 66290D[A26C0000]        	sub     [BufLen], cx
  1238 000009D7 29CB                    	sub     ebx, ecx
  1239 000009D9 F3A4                    	rep     movsb
  1240 000009DB 85DB                    	test    ebx, ebx
  1241 000009DD 7586                    	jnz     short NextChunk
  1242                                  
  1243 000009DF 61                      	popad
  1244 000009E0 C3                      	retn
  1245                                  
  1246                                  ;--------------------------------------------------------------------------
  1247                                  ; StartPlaying: Initializes the Sound System.
  1248                                  ;  In:
  1249                                  ;   Module Information Resources.
  1250                                  ;--------------------------------------------------------------------------
  1251                                  
  1252                                  StartPlaying:
  1253 000009E1 60                      	pushad
  1254                                  SetModParms:    
  1255 000009E2 C605[966C0000]00        	mov     byte [OrderPos], 0
  1256 000009E9 C605[976C0000]06        	mov     byte [Tempo], DefTempo
  1257 000009F0 C605[986C0000]06        	mov     byte [TempoWait], DefTempo
  1258 000009F7 C605[996C0000]7D        	mov     byte [Bpm], DefBpm
  1259 000009FE C605[9A6C0000]40        	mov     byte [Row], 64
  1260 00000A05 C605[9B6C0000]00        	mov     byte [BreakRow], 0
  1261 00000A0C 66A1[EE0D0000]          	mov     ax, [MixSpeed]
  1262 00000A12 31D2                    	xor     edx, edx
  1263 00000A14 66BB3200                	mov     bx, 24*DefBpm/60
  1264 00000A18 66F7F3                  	div     bx
  1265 00000A1B 66A3[9C6C0000]          	mov     [BpmSamples], ax
  1266                                  ClearTracks:    
  1267 00000A21 BF[AC6C0000]            	mov     edi, Tracks
  1268 00000A26 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1269 00000A2B 31C0                    	xor     eax, eax
  1270                                  	;cld
  1271 00000A2D F3AA                    	rep     stosb
  1272                                  
  1273 00000A2F A3[9E6C0000]            	mov     [BufPtr], eax
  1274 00000A34 66A3[A26C0000]          	mov     [BufLen], ax
  1275                                  MakePitch:
  1276 00000A3A 66B80021                	mov     ax, MidCRate
  1277 00000A3E 66BBAC01                	mov     bx, 428
  1278 00000A42 66F7E3                  	mul     bx
  1279 00000A45 66F735[EE0D0000]        	div     word [MixSpeed]
  1280 00000A4C 30F6                    	xor     dh, dh
  1281 00000A4E 88E2                    	mov     dl, ah
  1282 00000A50 88C4                    	mov     ah, al
  1283 00000A52 30C0                    	xor     al, al
  1284 00000A54 66B95903                	mov     cx, 857
  1285 00000A58 31DB                    	xor     ebx, ebx
  1286 00000A5A BF[E4140000]            	mov     edi, PitchTable
  1287                                  PitchLoop:      
  1288 00000A5F 50                      	push    eax
  1289 00000A60 52                      	push    edx
  1290 00000A61 6639DA                  	cmp     dx, bx
  1291 00000A64 7303                    	jae     short NoDiv
  1292 00000A66 66F7F3                  	div     bx
  1293                                  NoDiv:          
  1294 00000A69 66AB                    	stosw
  1295 00000A6B 5A                      	pop     edx
  1296 00000A6C 58                      	pop     eax
  1297 00000A6D 43                      	inc     ebx
  1298 00000A6E E2EF                    	loop    PitchLoop
  1299                                  MakeVolume:     
  1300 00000A70 66B90041                	mov     cx, 16640
  1301 00000A74 89CB                    	mov     ebx, ecx
  1302                                  VolLoop:
  1303 00000A76 4B                      	dec     ebx
  1304 00000A77 88D8                    	mov     al, bl
  1305 00000A79 F6EF                    	imul    bh
  1306 00000A7B 88A3[961B0000]          	mov     [VolTable+ebx], ah
  1307 00000A81 E2F3                    	loop    VolLoop
  1308                                  
  1309 00000A83 61                      	popad
  1310 00000A84 C3                      	retn
  1311                                  
  1312                                  ;--------------------------------------------------------------------------
  1313                                  ; StopPlaying: ShutDown the Sound System.
  1314                                  ;--------------------------------------------------------------------------
  1315                                  
  1316                                  StopPlaying:
  1317                                  	; 19/06/2017
  1318                                  	; Stop Playing
  1319                                  	sys	_audio, 0700h
  1319                              <1> 
  1319                              <1> 
  1319                              <1> 
  1319                              <1> 
  1319                              <1>  %if %0 >= 2
  1319 00000A85 BB00070000          <1>  mov ebx, %2
  1319                              <1>  %if %0 >= 3
  1319                              <1>  mov ecx, %3
  1319                              <1>  %if %0 = 4
  1319                              <1>  mov edx, %4
  1319                              <1>  %endif
  1319                              <1>  %endif
  1319                              <1>  %endif
  1319 00000A8A B820000000          <1>  mov eax, %1
  1319                              <1> 
  1319 00000A8F CD40                <1>  int 40h
  1320                                  	; Cancel callback service (for user)
  1321                                  	sys	_audio, 0900h
  1321                              <1> 
  1321                              <1> 
  1321                              <1> 
  1321                              <1> 
  1321                              <1>  %if %0 >= 2
  1321 00000A91 BB00090000          <1>  mov ebx, %2
  1321                              <1>  %if %0 >= 3
  1321                              <1>  mov ecx, %3
  1321                              <1>  %if %0 = 4
  1321                              <1>  mov edx, %4
  1321                              <1>  %endif
  1321                              <1>  %endif
  1321                              <1>  %endif
  1321 00000A96 B820000000          <1>  mov eax, %1
  1321                              <1> 
  1321 00000A9B CD40                <1>  int 40h
  1322                                  	; Deallocate Audio Buffer (for user)
  1323                                  	sys	_audio, 0A00h
  1323                              <1> 
  1323                              <1> 
  1323                              <1> 
  1323                              <1> 
  1323                              <1>  %if %0 >= 2
  1323 00000A9D BB000A0000          <1>  mov ebx, %2
  1323                              <1>  %if %0 >= 3
  1323                              <1>  mov ecx, %3
  1323                              <1>  %if %0 = 4
  1323                              <1>  mov edx, %4
  1323                              <1>  %endif
  1323                              <1>  %endif
  1323                              <1>  %endif
  1323 00000AA2 B820000000          <1>  mov eax, %1
  1323                              <1> 
  1323 00000AA7 CD40                <1>  int 40h
  1324                                  	; Disable Audio Device
  1325                                  	sys	_audio, 0C00h
  1325                              <1> 
  1325                              <1> 
  1325                              <1> 
  1325                              <1> 
  1325                              <1>  %if %0 >= 2
  1325 00000AA9 BB000C0000          <1>  mov ebx, %2
  1325                              <1>  %if %0 >= 3
  1325                              <1>  mov ecx, %3
  1325                              <1>  %if %0 = 4
  1325                              <1>  mov edx, %4
  1325                              <1>  %endif
  1325                              <1>  %endif
  1325                              <1>  %endif
  1325 00000AAE B820000000          <1>  mov eax, %1
  1325                              <1> 
  1325 00000AB3 CD40                <1>  int 40h
  1326                                  
  1327 00000AB5 C3                      	retn
  1328                                  
  1329                                  ; 24/06/2017
  1330                                  ;--------------------------------------------------------------------------
  1331                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1332                                  ;--------------------------------------------------------------------------
  1333                                  ; This Conversion is needed for AC'97 hardware 
  1334                                  ; which ony supports 16 bit stereo samples !
  1335                                  
  1336                                  ; source = temp_buffer (8192 bytes)
  1337                                  ; destination = Audio_Buffer (32768 bytes)
  1338                                  
  1339                                  ConvertSamples:
  1340                                  	; 24/06/2017
  1341 00000AB6 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1342 00000ABB BE[00000100]            	mov	esi, temp_buffer
  1343 00000AC0 BF[00800000]            	mov	edi, Audio_Buffer
  1344                                  c_smpl_1:
  1345 00000AC5 AC                      	lodsb	; get 8 bit mono sample
  1346 00000AC6 20C0                    	and	al, al
  1347 00000AC8 7506                    	jnz	short c_smpl_2
  1348 00000ACA 66B80080                	mov	ax, 8000h
  1349 00000ACE EB06                    	jmp	short c_smpl_3
  1350                                  c_smpl_2:
  1351 00000AD0 2C80                    	sub	al, 80h	
  1352 00000AD2 88C4                    	mov	ah, al
  1353 00000AD4 28C0                    	sub	al, al
  1354                                  c_smpl_3:	
  1355 00000AD6 6689C2                  	mov	dx, ax
  1356 00000AD9 C1E010                  	shl	eax, 16
  1357 00000ADC 6689D0                  	mov	ax, dx
  1358 00000ADF AB                      	stosd	; save 16 bit stereo sample
  1359 00000AE0 E2E3                    	loop 	c_smpl_1
  1360                                  	
  1361 00000AE2 C3                      	retn
  1362                                  
  1363                                  ;=============================================================================
  1364                                  ; 
  1365                                  ;=============================================================================
  1366                                  
  1367                                  ;dword2str:
  1368                                  ;	; 13/11/2016 - Erdogan Tan 
  1369                                  ;	; eax = dword value
  1370                                  ;	;
  1371                                  ;	call	dwordtohex
  1372                                  ;	mov	[dword_str], edx
  1373                                  ;	mov	[dword_str+4], eax
  1374                                  ;	mov	si, dword_str
  1375                                  ;	retn
  1376                                  
  1377                                  	; 05/03/2017 (TRDOS 386)
  1378                                  	; trdos386.s (unix386.s) - 10/05/2015
  1379                                  	; Convert binary number to hexadecimal string
  1380                                  
  1381                                  ;bytetohex:
  1382                                  ;	; INPUT ->
  1383                                  ;	; 	AL = byte (binary number)
  1384                                  ;	; OUTPUT ->
  1385                                  ;	;	AX = hexadecimal string
  1386                                  ;	;
  1387                                  ;	push	ebx
  1388                                  ;	movzx	ebx, al
  1389                                  ;	shr	bl, 4
  1390                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1391                                  ;	xchg	bl, al
  1392                                  ;	and	bl, 0Fh
  1393                                  ;	mov	ah, [ebx+hex_chars] 
  1394                                  ;	pop	ebx	
  1395                                  ;	retn
  1396                                  
  1397                                  ;wordtohex:
  1398                                  ;	; INPUT ->
  1399                                  ;	; 	AX = word (binary number)
  1400                                  ;	; OUTPUT ->
  1401                                  ;	;	EAX = hexadecimal string
  1402                                  ;	;
  1403                                  ;	push	ebx
  1404                                  ;	xor	ebx, ebx
  1405                                  ;	xchg	ah, al
  1406                                  ;	push	eax
  1407                                  ;	mov	bl, ah
  1408                                  ;	shr	bl, 4
  1409                                  ;	mov	al, [ebx+hex_chars] 	 	
  1410                                  ;	mov	bl, ah
  1411                                  ;	and	bl, 0Fh
  1412                                  ;	mov	ah, [ebx+hex_chars]
  1413                                  ;	shl	eax, 16
  1414                                  ;	pop	eax
  1415                                  ;	pop	ebx
  1416                                  ;	jmp	short bytetohex
  1417                                  
  1418                                  ;dwordtohex:
  1419                                  ;	; INPUT ->
  1420                                  ;	; 	EAX = dword (binary number)
  1421                                  ;	; OUTPUT ->
  1422                                  ;	;	EDX:EAX = hexadecimal string
  1423                                  ;	;
  1424                                  ;	push	eax
  1425                                  ;	shr	eax, 16
  1426                                  ;	call	wordtohex
  1427                                  ;	mov	edx, eax
  1428                                  ;	pop	eax
  1429                                  ;	call	wordtohex
  1430                                  ;	retn
  1431                                  
  1432                                  	; 24/06/2017
  1433                                  	; 19/06/2017
  1434                                  	; 05/03/2017 (TRDOS 386)
  1435                                  	; 13/11/2016 - Erdogan Tan
  1436                                  write_audio_dev_info:
  1437                                  	; BUS/DEV/FN
  1438                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1439                                  	; DEV/VENDOR
  1440                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1441                                  
  1442 00000AE3 8B35[980E0000]          	mov	esi, [dev_vendor]
  1443 00000AE9 6689F0                  	mov	ax, si
  1444 00000AEC 0FB6D8                  	movzx	ebx, al
  1445 00000AEF 88DA                    	mov	dl, bl
  1446 00000AF1 80E30F                  	and	bl, 0Fh
  1447 00000AF4 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1448 00000AFA A2[350E0000]            	mov	[msgVendorId+3], al
  1449 00000AFF 88D3                    	mov	bl, dl
  1450 00000B01 C0EB04                  	shr	bl, 4
  1451 00000B04 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1452 00000B0A A2[340E0000]            	mov	[msgVendorId+2], al
  1453 00000B0F 88E3                    	mov	bl, ah
  1454 00000B11 88DA                    	mov	dl, bl
  1455 00000B13 80E30F                  	and	bl, 0Fh
  1456 00000B16 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1457 00000B1C A2[330E0000]            	mov	[msgVendorId+1], al
  1458 00000B21 88D3                    	mov	bl, dl
  1459 00000B23 C0EB04                  	shr	bl, 4
  1460 00000B26 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1461 00000B2C A2[320E0000]            	mov	[msgVendorId], al
  1462 00000B31 C1EE10                  	shr	esi, 16
  1463 00000B34 6689F0                  	mov	ax, si
  1464 00000B37 88C3                    	mov	bl, al
  1465 00000B39 88DA                    	mov	dl, bl
  1466 00000B3B 80E30F                  	and	bl, 0Fh
  1467 00000B3E 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1468 00000B44 A2[460E0000]            	mov	[msgDevId+3], al
  1469 00000B49 88D3                    	mov	bl, dl
  1470 00000B4B C0EB04                  	shr	bl, 4
  1471 00000B4E 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1472 00000B54 A2[450E0000]            	mov	[msgDevId+2], al
  1473 00000B59 88E3                    	mov	bl, ah
  1474 00000B5B 88DA                    	mov	dl, bl
  1475 00000B5D 80E30F                  	and	bl, 0Fh
  1476 00000B60 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1477 00000B66 A2[440E0000]            	mov	[msgDevId+1], al
  1478 00000B6B 88D3                    	mov	bl, dl
  1479 00000B6D C0EB04                  	shr	bl, 4
  1480 00000B70 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1481 00000B76 A2[430E0000]            	mov	[msgDevId], al
  1482                                  
  1483 00000B7B 8B35[9C0E0000]          	mov	esi, [bus_dev_fn]
  1484 00000B81 C1EE08                  	shr	esi, 8
  1485 00000B84 6689F0                  	mov	ax, si
  1486 00000B87 88C3                    	mov	bl, al
  1487 00000B89 88DA                    	mov	dl, bl
  1488 00000B8B 80E307                  	and	bl, 7 ; bit 0,1,2
  1489 00000B8E 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1490 00000B94 A2[6A0E0000]            	mov	[msgFncNo+1], al
  1491 00000B99 88D3                    	mov	bl, dl
  1492 00000B9B C0EB03                  	shr	bl, 3
  1493 00000B9E 88DA                    	mov	dl, bl
  1494 00000BA0 80E30F                  	and	bl, 0Fh
  1495 00000BA3 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1496 00000BA9 A2[5C0E0000]            	mov	[msgDevNo+1], al
  1497 00000BAE 88D3                    	mov	bl, dl
  1498 00000BB0 C0EB04                  	shr	bl, 4
  1499 00000BB3 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1500 00000BB9 A2[5B0E0000]            	mov	[msgDevNo], al
  1501 00000BBE 88E3                    	mov	bl, ah
  1502 00000BC0 88DA                    	mov	dl, bl
  1503 00000BC2 80E30F                  	and	bl, 0Fh
  1504 00000BC5 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1505 00000BCB A2[500E0000]            	mov	[msgBusNo+1], al
  1506 00000BD0 88D3                    	mov	bl, dl
  1507 00000BD2 C0EB04                  	shr	bl, 4
  1508 00000BD5 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1509 00000BDB A2[4F0E0000]            	mov	[msgBusNo], al
  1510                                  
  1511                                  	; 24/06/2017
  1512 00000BE0 66A1[A40E0000]          	mov	ax, [ac97_NamBar]
  1513 00000BE6 88C3                    	mov	bl, al
  1514 00000BE8 88DA                    	mov	dl, bl
  1515 00000BEA 80E30F                  	and	bl, 0Fh
  1516 00000BED 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1517 00000BF3 A2[790E0000]            	mov	[msgNamBar+3], al
  1518 00000BF8 88D3                    	mov	bl, dl
  1519 00000BFA C0EB04                  	shr	bl, 4
  1520 00000BFD 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1521 00000C03 A2[780E0000]            	mov	[msgNamBar+2], al
  1522 00000C08 88E3                    	mov	bl, ah
  1523 00000C0A 88DA                    	mov	dl, bl
  1524 00000C0C 80E30F                  	and	bl, 0Fh
  1525 00000C0F 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1526 00000C15 A2[770E0000]            	mov	[msgNamBar+1], al
  1527 00000C1A 88D3                    	mov	bl, dl
  1528 00000C1C C0EB04                  	shr	bl, 4
  1529 00000C1F 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1530 00000C25 A2[760E0000]            	mov	[msgNamBar], al
  1531                                  
  1532 00000C2A 66A1[A60E0000]          	mov	ax, [ac97_NabmBar]
  1533 00000C30 88C3                    	mov	bl, al
  1534 00000C32 88DA                    	mov	dl, bl
  1535 00000C34 80E30F                  	and	bl, 0Fh
  1536 00000C37 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1537 00000C3D A2[890E0000]            	mov	[msgNabmBar+3], al
  1538 00000C42 88D3                    	mov	bl, dl
  1539 00000C44 C0EB04                  	shr	bl, 4
  1540 00000C47 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1541 00000C4D A2[880E0000]            	mov	[msgNabmBar+2], al
  1542 00000C52 88E3                    	mov	bl, ah
  1543 00000C54 88DA                    	mov	dl, bl
  1544 00000C56 80E30F                  	and	bl, 0Fh
  1545 00000C59 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1546 00000C5F A2[870E0000]            	mov	[msgNabmBar+1], al
  1547 00000C64 88D3                    	mov	bl, dl
  1548 00000C66 C0EB04                  	shr	bl, 4
  1549 00000C69 8A83[F00D0000]          	mov	al, [ebx+hex_chars]
  1550 00000C6F A2[860E0000]            	mov	[msgNabmBar], al
  1551                                  
  1552                                  	; 24/11/2016
  1553 00000C74 30E4                    	xor	ah, ah
  1554 00000C76 A0[A80E0000]            	mov	al, [ac97_int_ln_reg]
  1555 00000C7B B10A                    	mov	cl, 10
  1556 00000C7D F6F1                    	div	cl
  1557 00000C7F 660105[920E0000]        	add	[msgIRQ], ax
  1558 00000C86 20C0                    	and	al, al
  1559 00000C88 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1560 00000C8A A0[930E0000]            	mov	al, [msgIRQ+1]
  1561 00000C8F B420                    	mov	ah, ' '
  1562 00000C91 66A3[920E0000]          	mov	[msgIRQ], ax
  1563                                  _w_ac97imsg_:
  1564                                  	; EBX = Message address
  1565                                  	; ECX = Max. message length (or stop on ZERO character)
  1566                                  	;	(1 to 255)
  1567                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1568                                       	sys 	_msg, msgAC97Info, 255, 07h
  1568                              <1> 
  1568                              <1> 
  1568                              <1> 
  1568                              <1> 
  1568                              <1>  %if %0 >= 2
  1568 00000C97 BB[010E0000]        <1>  mov ebx, %2
  1568                              <1>  %if %0 >= 3
  1568 00000C9C B9FF000000          <1>  mov ecx, %3
  1568                              <1>  %if %0 = 4
  1568 00000CA1 BA07000000          <1>  mov edx, %4
  1568                              <1>  %endif
  1568                              <1>  %endif
  1568                              <1>  %endif
  1568 00000CA6 B823000000          <1>  mov eax, %1
  1568                              <1> 
  1568 00000CAB CD40                <1>  int 40h
  1569 00000CAD C3                              retn
  1570                                  
  1571                                  ;=============================================================================
  1572                                  ;               preinitialized data
  1573                                  ;=============================================================================
  1574                                  
  1575                                  ;=============================================================================
  1576                                  ;               PLAY.ASM - DATA
  1577                                  ;=============================================================================
  1578                                  
  1579                                  msg_2017:
  1580 00000CAE 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1580 00000CB7 506C6179657220666F-
  1580 00000CC0 72205452444F532033-
  1580 00000CC9 383620627920457264-
  1580 00000CD2 6F67616E2054616E2E-
  1580 00000CDB 20                 
  1581 00000CDC 4A756E652032303137-     	db	'June 2017.',10,13
  1581 00000CE5 2E0A0D             
  1582 00000CE8 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1582 00000CF1 64706C61792066696C-
  1582 00000CFA 656E616D652E6D6F64-
  1582 00000D03 0A0D00             
  1583 00000D06 32342F30362F323031-     	db	'24/06/2017',10,13,0
  1583 00000D0F 370A0D00           
  1584                                  
  1585 00000D13 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1585 00000D1C 506C61796572207630-
  1585 00000D25 2E3162206279204361-
  1585 00000D2E 726C6F732048617361-
  1585 00000D37 6E2E204A756C792031-
  1585 00000D40 3939332E           
  1586 00000D44 0A0D00                  		db	10,13,0
  1587 00000D47 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1587 00000D50 64696E67204D6F6475-
  1587 00000D59 6C652066696C652E0A-
  1587 00000D62 0D00               
  1588                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1589                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1590                                  ;PortText:	db	'x0h, IRQ '
  1591                                  ;IrqText:	db	'x.',10,13,0
  1592                                  
  1593                                  trdos386_err_msg:
  1594 00000D64 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1594 00000D6D 2053797374656D2063-
  1594 00000D76 616C6C206572726F72-
  1594 00000D7F 20210A0D00         
  1595                                  
  1596                                  ;=============================================================================
  1597                                  ;               MODPLAY.ASM - DATA
  1598                                  ;=============================================================================
  1599                                  
  1600                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1601                                  
  1602 00000D84 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1602 00000D8D C5D4E1             
  1603 00000D90 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1603 00000D99 E1                 
  1604 00000D9A D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1604 00000DA3 19                 
  1605                                  
  1606 00000DA4 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1606 00000DAD 0280025C023A021A02-
  1606 00000DB6 FC01E001C501       
  1607 00000DBC AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1607 00000DC5 0140012E011D010D01-
  1607 00000DCE FE00F000E200       
  1608 00000DD4 D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1608 00000DDD 00A00097008F008700-
  1608 00000DE6 7F0078007100       
  1609                                  
  1610                                  ;=============================================================================
  1611                                  ;               PLAYER.ASM - DATA
  1612                                  ;=============================================================================
  1613                                  
  1614 00000DEC 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1615 00000DED 08                      bps:		db 8 ; bits per sample (8 or 16)
  1616                                  Sample_Rate:
  1617 00000DEE 2256                    MixSpeed:	dw 22050 ; Hz
  1618                                  
  1619                                  ; 13/11/2016
  1620 00000DF0 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1620 00000DF9 3941424344454600   
  1621                                  ;
  1622                                  msgAC97Info:	
  1623 00000E01 0D0A                    		db 0Dh, 0Ah
  1624 00000E03 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1624 00000E0C 6F20436F6E74726F6C-
  1624 00000E15 6C6572202620436F64-
  1624 00000E1E 656320496E666F0D0A 
  1625 00000E27 56656E646F72204944-     		db "Vendor ID: "
  1625 00000E30 3A20               
  1626 00000E32 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1626 00000E3B 6963652049443A20   
  1627 00000E43 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1628 00000E4A 4275733A20              		db "Bus: "
  1629 00000E4F 303068204465766963-     msgBusNo:	db "00h Device: "
  1629 00000E58 653A20             
  1630 00000E5B 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1630 00000E64 696F6E3A20         
  1631 00000E69 303068                  msgFncNo	db "00h"
  1632 00000E6C 0D0A                    		db 0Dh, 0Ah
  1633 00000E6E 4E414D4241523A20        		db "NAMBAR: "
  1634 00000E76 30303030682020          msgNamBar	db "0000h  "
  1635 00000E7D 4E41424D4241523A20      		db "NABMBAR: "
  1636 00000E86 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1636 00000E8F 513A20             
  1637 00000E92 3030                    msgIRQ:		dw 3030h
  1638 00000E94 0D0A00                  		db 0Dh, 0Ah, 0
  1639                                  
  1640                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1641                                  ;codec_id:	   dd 0
  1642                                  ;codec_chip_id:	   dd 0
  1643                                  ;codec_vendor_ids: dw 0
  1644                                  ;codec_chip_ids:   dw 0
  1645                                  
  1646                                  ;dword_str:	dd 30303030h, 30303030h
  1647                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1648                                  
  1649                                  ;=============================================================================
  1650                                  ;        	uninitialized data
  1651                                  ;=============================================================================
  1652                                  
  1653                                  bss_start:
  1654                                  
  1655                                  ABSOLUTE bss_start
  1656                                  
  1657 00000E97 <res 00000001>          alignb 4
  1658                                  
  1659 00000E98 <res 00000004>          dev_vendor:	resd 1
  1660 00000E9C <res 00000004>          bus_dev_fn:	resd 1
  1661 00000EA0 <res 00000004>          stats_cmd:	resd 1
  1662 00000EA4 <res 00000002>          ac97_NamBar:	resw 1
  1663 00000EA6 <res 00000002>          ac97_NabmBar:	resw 1
  1664 00000EA8 <res 00000001>          ac97_int_ln_reg: resb 1
  1665 00000EA9 <res 00000001>          srb:		resb 1
  1666                                  
  1667                                  ; MODLOAD.ASM
  1668 00000EAA <res 00000002>          FileHandle:	resw 1
  1669 00000EAC <res 00000002>          ErrorInfo:	resw 1
  1670 00000EAE <res 0000043C>          Header:	resb	ModHeader.size
  1671                                  
  1672                                  ; MODPLAY.ASM
  1673                                  ;MixSpeed:	    resw 1
  1674                                  
  1675                                  ModInfo:
  1676 000012EA <res 00000001>          ModInfo.OrderLen:   resb 1
  1677 000012EB <res 00000001>          ModInfo.ReStart:    resb 1
  1678 000012EC <res 00000080>          ModInfo.Order:	    resb 128
  1679 0000136C <res 00000004>          ModInfo.Patterns:   resd 1
  1680                                  
  1681 00001370 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1682 000013AE <res 0000003E>          ModInfo.SampSeg:    resw 31
  1683 000013EC <res 0000003E>          ModInfo.SampLen:    resw 31
  1684 0000142A <res 0000003E>          ModInfo.SampRep:    resw 31
  1685 00001468 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1686 000014A6 <res 0000003E>          ModInfo.SampVol:    resw 31
  1687                                  
  1688                                  ; MODPLAY.ASM
  1689 000014E4 <res 000006B2>          PitchTable:	resw 857
  1690 00001B96 <res 00004100>          VolTable:	resb 16640
  1691 00005C96 <res 00001000>          MixBuffer       resb MixBufSize
  1692                                  
  1693                                  ; MODPLAY.ASM
  1694 00006C96 <res 00000001>          OrderPos:	resb 1
  1695 00006C97 <res 00000001>          Tempo:		resb 1
  1696 00006C98 <res 00000001>          TempoWait:	resb 1
  1697 00006C99 <res 00000001>          Bpm:		resb 1
  1698 00006C9A <res 00000001>          Row:		resb 1
  1699 00006C9B <res 00000001>          BreakRow:	resb 1
  1700 00006C9C <res 00000002>          BpmSamples:	resw 1
  1701 00006C9E <res 00000004>          BufPtr:		resd 1
  1702 00006CA2 <res 00000002>          BufLen:		resw 1
  1703 00006CA4 <res 00000004>          BufRep:		resd 1
  1704 00006CA8 <res 00000004>          Note:		resd 1
  1705 00006CAC <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1706                                  
  1707 00006D3C <res 00000004>          alignb 16
  1708                                  
  1709                                  ; PLAY.ASM
  1710 00006D40 <res 00000280>          Scope:		resw 320
  1711 00006FC0 <res 00000200>          RowOfs:		resw 256
  1712                                  
  1713                                  mod_file_name:
  1714 000071C0 <res 00000050>          		resb 80
  1715                                  
  1716 00007210 <res 00000DF0>          alignb 4096
  1717                                  
  1718                                  Audio_Buffer:
  1719 00008000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1720                                  temp_buffer:
  1721 00010000 <res 00002000>          		resb BUFFERSIZE / 4 ; 8192
  1722                                  
  1723 00012000 <res 0000E000>          alignb 65536
  1724                                  
  1725                                  DMA_Buffer:
  1726 00020000 <res 00010000>          		resb 65536	
  1727                                  file_buffer:
  1728 00030000 <res 00060000>          		resb 65536*6
  1729                                  EOF:
