     1                                  ; ****************************************************************************
     2                                  ; modplay.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 06/06/2024 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Modified by using the source code of 'tinyplay.s' ('TINYPLAY.PRG') 
    14                                  ; by Erdogan Tan (07/10/2017)
    15                                  ;
    16                                  ; Modified from 'playwav3.s' (13/06/2017)
    17                                  ;
    18                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    19                                  ;			                     (23/06/2017)
    20                                  ;
    21                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    22                                  ;				      (04/03/2017) 
    23                                  ; Assembler: NASM 2.11
    24                                  ; ----------------------------------------------------------------------------
    25                                  ;	   nasm  modplay.s -l modplay.txt -o MODPLAY.PRG	
    26                                  ; ****************************************************************************
    27                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    28                                  
    29                                  ; 14/07/2020
    30                                  ; 31/12/2017
    31                                  ; TRDOS 386 (v2.0) system calls
    32                                  _ver 	equ 0
    33                                  _exit 	equ 1
    34                                  _fork 	equ 2
    35                                  _read 	equ 3
    36                                  _write	equ 4
    37                                  _open	equ 5
    38                                  _close 	equ 6
    39                                  _wait 	equ 7
    40                                  _create	equ 8
    41                                  _rename	equ 9
    42                                  _delete	equ 10
    43                                  _exec	equ 11
    44                                  _chdir	equ 12
    45                                  _time 	equ 13
    46                                  _mkdir 	equ 14
    47                                  _chmod	equ 15
    48                                  _rmdir	equ 16
    49                                  _break	equ 17
    50                                  _drive	equ 18
    51                                  _seek	equ 19
    52                                  _tell 	equ 20
    53                                  _memory	equ 21
    54                                  _prompt	equ 22
    55                                  _path	equ 23
    56                                  _env	equ 24
    57                                  _stime	equ 25
    58                                  _quit	equ 26
    59                                  _intr	equ 27
    60                                  _dir	equ 28
    61                                  _emt 	equ 29
    62                                  _ldrvt 	equ 30
    63                                  _video 	equ 31
    64                                  _audio	equ 32
    65                                  _timer	equ 33
    66                                  _sleep	equ 34
    67                                  _msg    equ 35
    68                                  _geterr	equ 36
    69                                  _fpstat	equ 37
    70                                  _pri	equ 38
    71                                  _rele	equ 39
    72                                  _fff	equ 40
    73                                  _fnf	equ 41
    74                                  _alloc	equ 42
    75                                  _dalloc equ 43
    76                                  _calbac equ 44
    77                                  _dma	equ 45		
    78                                  
    79                                  %macro sys 1-4
    80                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    81                                      ; 03/09/2015	
    82                                      ; 13/04/2015
    83                                      ; Retro UNIX 386 v1 system call.	
    84                                      %if %0 >= 2   
    85                                          mov ebx, %2
    86                                          %if %0 >= 3    
    87                                              mov ecx, %3
    88                                              %if %0 = 4
    89                                                 mov edx, %4   
    90                                              %endif
    91                                          %endif
    92                                      %endif
    93                                      mov eax, %1
    94                                      ;int 30h
    95                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    96                                  %endmacro
    97                                  
    98                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    99                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   100                                  
   101                                  ; 19/06/2017
   102                                  ;BUFFERSIZE equ 32768
   103                                  ; 06/06/2024
   104                                  BUFFERSIZE equ 320*4*16 ; 20480
   105                                  
   106                                  ; ----------------------------------------------------------------------------
   107                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   108                                  ;	July 14th, 1993.
   109                                  
   110                                  ;=============================================================================
   111                                  ;  
   112                                  ;=============================================================================
   113                                  
   114                                  [BITS 32]
   115                                  [org 0]
   116                                  
   117                                  Start:
   118                                  	; clear bss
   119 00000000 B9[00000800]            	mov	ecx, EOF
   120 00000005 BF[AE0E0000]            	mov	edi, bss_start
   121 0000000A 29F9                    	sub	ecx, edi
   122 0000000C D1E9                    	shr	ecx, 1
   123 0000000E 31C0                    	xor	eax, eax
   124 00000010 F366AB                  	rep	stosw
   125                                  
   126                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   127 00000013 E8DA010000              	call    DetectICH
   128 00000018 731B                    	jnc     short GetFileName
   129                                  
   130                                  _dev_not_ready:
   131                                  ; couldn't find the audio device!
   132                                  	sys	_msg, noDevMsg, 255, 0Fh
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 0000001A BB[FF010000]        <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 0000001F B9FF000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 00000024 BA0F000000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000029 B823000000          <1>  mov eax, %1
    94                              <1> 
    95 0000002E CD40                <1>  int 40h
   133 00000030 E99C010000                      jmp     Exit
   134                                  
   135                                  GetFileName:  
   136 00000035 89E6                    	mov	esi, esp
   137 00000037 AD                      	lodsd
   138 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   139                                  		; (program file name & mod file name)
   140 0000003B 0F8299010000            	jb	pmsg_2017 ; nothing to do
   141                                  
   142 00000041 AD                      	lodsd ; program file name address 
   143 00000042 AD                      	lodsd ; mod file name address (file to be read)
   144 00000043 89C6                    	mov	esi, eax
   145 00000045 BF[E0710000]            	mov	edi, mod_file_name
   146                                  ScanName:       
   147 0000004A AC                      	lodsb
   148 0000004B 84C0                    	test	al, al
   149 0000004D 0F8487010000            	je	pmsg_2017
   150 00000053 3C20                    	cmp	al, 20h
   151 00000055 74F3                    	je	short ScanName	; scan start of name.
   152 00000057 AA                      	stosb
   153 00000058 B4FF                    	mov	ah, 0FFh
   154                                  a_0:	
   155 0000005A FEC4                    	inc	ah
   156                                  a_1:
   157 0000005C AC                      	lodsb
   158 0000005D AA                      	stosb
   159 0000005E 3C2E                    	cmp	al, '.'
   160 00000060 74F8                    	je	short a_0	
   161 00000062 20C0                    	and	al, al
   162 00000064 75F6                    	jnz	short a_1
   163                                  
   164 00000066 08E4                    	or	ah, ah		; if period NOT found,
   165 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   166                                  SetExt:
   167 0000006A 4F                      	dec	edi
   168 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   169 00000071 C6470400                	mov	byte [edi+4], 0
   170                                  PrintMesg:      
   171                                  	; Prints the Credits Text.
   172                                  	sys	_msg, Credits, 255, 0Fh
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000075 BB[2A0D0000]        <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 0000007A B9FF000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 0000007F BA0F000000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000084 B823000000          <1>  mov eax, %1
    94                              <1> 
    95 00000089 CD40                <1>  int 40h
   173                                  _1:
   174                                  	; 19/06/2017
   175                                  	; Allocate Audio Buffer (for user)
   176                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 0000008B BB00020000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 00000090 B900500000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 00000095 BA[00000100]        <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 0000009A B820000000          <1>  mov eax, %1
    94                              <1> 
    95 0000009F CD40                <1>  int 40h
   177 000000A1 0F82FC000000            	jc	error_exit
   178                                  _2:
   179                                  	; Initialize Audio Device
   180                                  	sys	_audio, 0301h, 0, ac97_int_handler 
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000000A7 BB01030000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 000000AC B900000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 000000B1 BA[2A020000]        <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000000B6 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 000000BB CD40                <1>  int 40h
   181 000000BD 0F82E0000000            	jc	error_exit
   182                                  
   183                                  LoadMod:  
   184 000000C3 BF[E0710000]            	mov	edi, mod_file_name
   185 000000C8 E861020000              	call    LoadModule		; Load the MODule...
   186                                  	; 08/10/2017
   187 000000CD 731B                    	jnc	short _3		; any error loading?
   188                                  
   189                                  	; yes, print error and Exit.
   190                                  
   191                                  	sys	_msg, ErrorMesg, 255, 0Fh
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000000CF BB[5E0D0000]        <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 000000D4 B9FF000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 000000D9 BA0F000000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000000DE B823000000          <1>  mov eax, %1
    94                              <1> 
    95 000000E3 CD40                <1>  int 40h
   192                                  
   193 000000E5 E9E7000000              	jmp     Exit
   194                                  
   195                                  _3:
   196                                  	; 10/06/2017
   197                                  	sys	_audio, 0E00h ; get audio controller info
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000000EA BB000E0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000000EF B820000000          <1>  mov eax, %1
    94                              <1> 
    95 000000F4 CD40                <1>  int 40h
   198 000000F6 0F82A7000000            	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 000000FC A2[C00E0000]            	mov	[ac97_int_ln_reg], al
   214 00000101 891D[B00E0000]          	mov	[dev_vendor], ebx
   215 00000107 890D[B40E0000]          	mov	[bus_dev_fn], ecx
   216 0000010D 668915[BC0E0000]        	mov	[ac97_NamBar], dx
   217                                  	;mov	[ac97_NamBar], dx
   218                                  	;shr	dx, 16
   219                                  	;mov	[ac97_NabmBar], dx
   220 00000114 8915[BC0E0000]          	mov	[ac97_NamBar], edx	
   221                                    
   222 0000011A E8C1090000              	call	write_audio_dev_info 
   223                                  
   224                                  PlayNow: 
   225 0000011F E8BA080000              	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 00000124 BF[00500100]            	mov	edi, temp_buffer
   233 00000129 BB00140000              	mov	ebx, BUFFERSIZE / 4
   234 0000012E E82E080000              	call	GetSamples
   235 00000133 726E                    	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 00000135 E879090000              	call 	ConvertSamples
   244                                  
   245                                  	;mov	ecx, 128	; Make a lookup table
   246 0000013A B180                    	mov	cl, 128
   247 0000013C 31DB                    	xor     ebx, ebx	; for fastest pixel
   248 0000013E BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   249                                  MakeOfs:        
   250 00000143 668993[E06F0000]        	mov     [RowOfs+ebx], dx
   251 0000014A 668993[E26F0000]        	mov     [RowOfs+ebx+2], dx
   252 00000151 6681C24001              	add     dx, 320
   253 00000156 83C304                  	add     ebx, 4
   254 00000159 E2E8                    	loop    MakeOfs
   255                                  
   256                                  	; Set Master Volume Level
   257                                  	sys	_audio, 0B00h, 1D1Dh
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 0000015B BB000B0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 00000160 B91D1D0000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000165 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 0000016A CD40                <1>  int 40h
   258                                  
   259                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   260                                  	
   261                                  	; Start	to play
   262 0000016C A0[040E0000]            	mov	al, [bps]
   263 00000171 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   264 00000174 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   265 00000176 8A1D[030E0000]          	mov	bl, [stmo]
   266 0000017C FECB                    	dec	bl
   267 0000017E 08C3                    	or	bl, al
   268 00000180 668B0D[050E0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   269 00000187 B704                    	mov	bh, 4 ; start to play	
   270                                  	sys	_audio
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85                              <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000189 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 0000018E CD40                <1>  int 40h
   271                                      
   272                                  	;; SETUP SIGNAL RESPONSE BYTE
   273                                  	;; 06/03/2017
   274                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   275                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   276                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   277                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   278                                  	;sys	_calbac
   279                                  	;jc	short error_exit
   280                                  
   281                                  	; DIRECT VGA MEMORY ACCESS
   282                                  	; bl = 0, bh = 5
   283                                  	; Direct access/map to VGA memory (0A0000h)
   284                                  
   285                                  	sys	_video, 0500h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000190 BB00050000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000195 B81F000000          <1>  mov eax, %1
    94                              <1> 
    95 0000019A CD40                <1>  int 40h
   286 0000019C 3D00000A00              	cmp	eax, 0A0000h
   287 000001A1 7418                    	je	short _a3
   288                                  error_exit:
   289                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000001A3 BB[7B0D0000]        <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 000001A8 B9FF000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 000001AD BA0E000000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000001B2 B823000000          <1>  mov eax, %1
    94                              <1> 
    95 000001B7 CD40                <1>  int 40h
   290 000001B9 EB16                    	jmp	short Exit
   291                                  
   292                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   293                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   294                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   295                                  ;       second, or the module will sound "looped".
   296                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   297                                  ;       the polling is called from my routine, and then the irq 0 must be
   298                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   299                                  ;       samples played by the Sound Blaster. Note that some samples are
   300                                  ;       discarded in the next code, just for fun!
   301                                  
   302                                  _a3:
   303 000001BB 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   304 000001BF CD31                    	int     31h
   305                                  
   306                                  	; 24/06/2017
   307 000001C1 E879000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   308                                  
   309                                  _s_exit:
   310 000001C6 E8B7080000              	call	StopPlaying	; STOP!
   311                                  
   312 000001CB 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   313 000001CF CD31                    	int     31h
   314                                  Exit:           
   315                                  	;call    FreeModule	; Free MODule core.
   316                                  	
   317                                  	sys 	_exit	; Bye !
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85                              <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000001D1 B801000000          <1>  mov eax, %1
    94                              <1> 
    95 000001D6 CD40                <1>  int 40h
   318                                  here:
   319 000001D8 EBFE                    	jmp	short here
   320                                  
   321                                  pmsg_2017:
   322                                  	sys	_msg, msg_2017, 255, 0Fh
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000001DA BB[AB0C0000]        <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 000001DF B9FF000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 000001E4 BA0F000000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000001E9 B823000000          <1>  mov eax, %1
    94                              <1> 
    95 000001EE CD40                <1>  int 40h
   323 000001F0 EBDF                    	jmp	short Exit
   324                                  
   325                                  DetectICH:
   326                                  	; 24/06/2017
   327                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   328                                          sys	_audio, 0102h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000001F2 BB02010000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000001F7 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 000001FC CD40                <1>  int 40h
   329 000001FE C3                      	retn
   330                                  
   331                                  noDevMsg:
   332 000001FF 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   332 00000208 61626C6520746F2066-
   332 00000211 696E64204143393720-
   332 0000021A 617564696F20646576-
   332 00000223 696365210D0A00     
   333                                  
   334                                  ac97_int_handler:
   335                                  	; 19/06/2017
   336 0000022A C605[C10E0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   337                                  
   338                                  	sys	_rele ; return from callback service 
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85                              <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000231 B827000000          <1>  mov eax, %1
    94                              <1> 
    95 00000236 CD40                <1>  int 40h
   339                                  	; we must not come here !
   340                                  	sys	_exit
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85                              <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000238 B801000000          <1>  mov eax, %1
    94                              <1> 
    95 0000023D CD40                <1>  int 40h
   341                                  
   342                                  ;=============================================================================
   343                                  ;      
   344                                  ;=============================================================================
   345                                  
   346                                  PlayMod:
   347                                  	; 23/06/2017   
   348                                  	; 21/06/2017
   349                                  	; 19/06/2017
   350                                  
   351                                  	; 05/03/2017 (TRDOS 386)
   352                                  	; 14/02/2017
   353                                  	; 13/02/2017
   354                                  	; 08/12/2016
   355                                  	; 28/11/2016
   356                                  
   357 0000023F EB10                         	jmp	short modp_gs ; 23/06/2017
   358                                  p_loop:
   359 00000241 803D[C10E0000]00        	cmp	byte [srb], 0
   360 00000248 7621                    	jna	short q_loop
   361 0000024A C605[C10E0000]00        	mov	byte [srb], 0
   362                                  modp_gs:
   363                                  	;mov	edi, Audio_Buffer
   364                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   365                                  	;call	GetSamples
   366                                  
   367                                  	; 24/06/2017
   368                                          ; load 8192 bytes into audio buffer
   369 00000251 BF[00500100]            	mov	edi, temp_buffer
   370 00000256 BB00140000              	mov	ebx, BUFFERSIZE / 4
   371 0000025B E801070000              	call	GetSamples
   372 00000260 0F823DFFFFFF            	jc	error_exit
   373                                  
   374                                  	; 24/06/2017
   375                                  	; 8 bit to 16 bit (*2)
   376                                  	; mono to stereo (*2)
   377                                  	; 4* (BUFFERSIZE/4) 
   378                                  	; source = temp_buffer
   379                                  	; destination = Audio_Buffer
   380 00000266 E848080000              	call 	ConvertSamples
   381                                  
   382                                  q_loop:
   383 0000026B B401                    	mov     ah, 1		; any key pressed?
   384 0000026D CD32                    	int     32h		; no, Loop.
   385 0000026F 7440                    	jz	short r_loop
   386                                  
   387 00000271 B400                    	mov     ah, 0		; flush key buffer...
   388 00000273 CD32                    	int     32h
   389                                  
   390                                  ;q_return:
   391                                  	;retn
   392                                  
   393                                  	;;;;
   394                                  	; 06/06/2024
   395 00000275 3C2B                    	cmp	al, '+' ; increase sound volume
   396 00000277 7405                    	je	short inc_volume_level
   397 00000279 3C2D                    	cmp	al, '-'
   398 0000027B 7424                    	je	short dec_volume_level
   399                                  
   400                                  q_return:
   401 0000027D C3                      	retn
   402                                  
   403                                  inc_volume_level:
   404 0000027E 8A0D[B0020000]          	mov	cl, [volume_level]
   405 00000284 80F91F                  	cmp	cl, 1Fh ; 31
   406 00000287 7328                    	jnb	short r_loop
   407 00000289 FEC1                    	inc	cl
   408                                  change_volume_level:
   409 0000028B 880D[B0020000]          	mov	[volume_level], cl
   410 00000291 88CD                    	mov	ch, cl
   411                                  	; Set Master Volume Level
   412                                  	sys	_audio, 0B00h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000293 BB000B0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000298 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 0000029D CD40                <1>  int 40h
   413 0000029F EB10                    	jmp	short r_loop
   414                                  dec_volume_level:
   415 000002A1 8A0D[B0020000]          	mov	cl, [volume_level]
   416 000002A7 80F901                  	cmp	cl, 1 ; 1
   417 000002AA 7605                    	jna	short r_loop
   418 000002AC FEC9                    	dec	cl
   419 000002AE EBDB                    	jmp	short change_volume_level
   420                                  	
   421 000002B0 1D                      volume_level: db 1Dh
   422                                  	;;;;
   423                                  
   424                                  r_loop:
   425                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   426                                  	; 23/06/2017
   427                                  	; 22/06/2017
   428                                  	; bh = 15, get current sound data/samples
   429                                  	; bl = 0, for PCM OUT
   430                                  	; ecx = count of sample/data bytes (1 to 4096)
   431                                  	; edx = destination buffer address 
   432                                  	;	(page aligned address is better)
   433                                  	;
   434                                  
   435                                  	; 06/06/2024
   436                                  	; Get Current DMA buffer Pointer 
   437                                  	sys	_audio, 0F00h, 0
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000002B1 BB000F0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 000002B6 B900000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000002BB B820000000          <1>  mov eax, %1
    94                              <1> 
    95 000002C0 CD40                <1>  int 40h
   438 000002C2 83E00F                  	and	eax, 0Fh 
   439 000002C5 0F8576FFFFFF            	jnz	p_loop
   440                                  
   441                                  	; Get Current Sound Data
   442                                  	sys	_audio, 0F00h, 320*4, g_buff
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000002CB BB000F0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 000002D0 B900050000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 000002D5 BA[00800000]        <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000002DA B820000000          <1>  mov eax, %1
    94                              <1> 
    95 000002DF CD40                <1>  int 40h
   443                                  ScopeLoop:
   444 000002E1 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   445                                  	; 19/06/2017
   446 000002E6 BE[00800000]            	mov	esi, g_buff	; display current samples
   447 000002EB 31C9                    	xor	ecx, ecx	; to be drawed ...
   448 000002ED 31D2                    	xor	edx, edx
   449                                  DrawLoop:  
   450 000002EF 89D3                    	mov	ebx, edx	; (save Index)
   451 000002F1 668BBB[606D0000]        	mov	di, [Scope+ebx]	; get old SCOPE pixel address
   452 000002F8 C60700                  	mov	byte [edi], 0	; erase it!
   453                                  	; 24/06/2017
   454 000002FB AD                      	lodsd
   455 000002FC 80C480                  	add	ah, 80h
   456 000002FF 88E3                    	mov	bl, ah
   457                                  	;
   458 00000301 30FF                    	xor	bh, bh
   459 00000303 66D1E3                  	shl	bx, 1
   460 00000306 668BBB[E06F0000]        	mov	di, [RowOfs+ebx]
   461 0000030D 6601CF                  	add	di, cx
   462 00000310 6689D3                  	mov	bx, dx		; (restore Index)
   463 00000313 6689BB[606D0000]        	mov	[Scope+ebx], di	; save new address...
   464 0000031A C6070A                  	mov	byte [edi], 10	; and DRAW.
   465 0000031D 6683C202                	add	dx, 2		; the next pixel...
   466 00000321 41                      	inc	ecx
   467 00000322 6681F94001              	cmp	cx, 320		; 320 pixels drawed?
   468 00000327 72C6                    	jb	short DrawLoop
   469 00000329 E913FFFFFF              	jmp	p_loop
   470                                  
   471                                  ;=============================================================================
   472                                  ;               MODLOAD.ASM
   473                                  ;=============================================================================
   474                                  
   475                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   476                                  ;	July 10th, 1993.
   477                                  
   478                                  ; STRUCTURES
   479                                  
   480                                  struc ModSample
   481 00000000 <res 16h>               .msName:	resb 22
   482 00000016 ????                    .msLength:	resw 1
   483 00000018 ??                      .msFinetune:	resb 1
   484 00000019 ??                      .msVolume:	resb 1
   485 0000001A ????                    .msRepeat:	resw 1
   486 0000001C ????                    .msRepLen:	resw 1
   487                                  .size:
   488                                  endstruc
   489                                  
   490                                  struc ModHeader
   491 00000000 <res 14h>               .mhName:	resb 20
   492 00000014 <res 3A2h>              .mhSamples:	resb ModSample.size*31
   493 000003B6 ??                      .mhOrderLen:	resb 1
   494 000003B7 ??                      .mhReStart:	resb 1
   495 000003B8 <res 80h>               .mhOrder:	resb 128
   496 00000438 ????????                .mhSign:	resw 2
   497                                  .size:	
   498                                  endstruc
   499                                  
   500                                  struc ModInfoRec
   501 00000000 ??                      .OrderLen:	resb 1
   502 00000001 ??                      .ReStart:	resb 1
   503 00000002 <res 80h>               .Order:	resb 128
   504 00000082 ????????                .Patterns:	resd 1
   505 00000086 <res 3Eh>               .SampOfs:	resw 31
   506 000000C4 <res 3Eh>               .SampSeg:	resw 31
   507 00000102 <res 3Eh>               .SampLen:	resw 31
   508 00000140 <res 3Eh>               .SampRep:	resw 31
   509 0000017E <res 3Eh>               .SampRepLen:	resw 31
   510 000001BC <res 3Eh>               .SampVol:	resw 31
   511                                  .size:	
   512                                  endstruc
   513                                  
   514                                  ; CODE
   515                                  
   516                                  ; 07/10/2017 (modplay.s)
   517                                  
   518                                  LoadModule:
   519                                  	; edi = file name address
   520                                  
   521 0000032E 60                      	pushad
   522                                  	
   523                                  	;call    ClearModInfo ; 07/10/2017 (not necessary.)
   524                                  OpenFile:       
   525                                  	; ebx = ASCIIZ file name address
   526                                  	; ecx = open mode (0 = open for read)	
   527                                  	sys	_open, edi, 0 ; open for reading
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 0000032F 89FB                <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 00000331 B900000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000336 B805000000          <1>  mov eax, %1
    94                              <1> 
    95 0000033B CD40                <1>  int 40h
   528 0000033D 0F8244010000            	jc	Failed
   529 00000343 A3[C20E0000]            	mov     [FileHandle], eax
   530                                  ReadHeader:
   531                                  	; ebx = File handle
   532                                  	; ecx = Buffer address
   533                                  	; edx = Byte count
   534                                  	sys	_read, [FileHandle], Header, ModHeader.size
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000348 8B1D[C20E0000]      <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 0000034E B9[C60E0000]        <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 00000353 BA3C040000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000358 B803000000          <1>  mov eax, %1
    94                              <1> 
    95 0000035D CD40                <1>  int 40h
   535 0000035F 0F8213010000            	jc      CloseFile
   536                                  CheckMK:        
   537 00000365 813D[FE120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   537 0000036D 4B2E               
   538 0000036F 7412                    	je      short IsModFile
   539                                  CheckFLT4:
   540 00000371 813D[FE120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   540 00000379 5434               
   541 0000037B 7406                    	je      short IsModFile
   542                                  	; 07/10/2017
   543 0000037D F9                      	stc
   544 0000037E E9F5000000              	jmp	CloseFile
   545                                  IsModFile:
   546 00000383 A0[7C120000]            	mov     al, [Header+ModHeader.mhOrderLen]
   547 00000388 A2[02130000]            	mov     [ModInfo.OrderLen], al
   548                                  
   549 0000038D A0[7D120000]            	mov     al, [Header+ModHeader.mhReStart]
   550 00000392 3A05[7C120000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   551 00000398 7202                    	jb      short SetReStart
   552 0000039A B07F                    	mov     al, 7Fh
   553                                  SetReStart:
   554 0000039C A2[03130000]            	mov     [ModInfo.ReStart], al
   555                                  
   556                                  	;mov	ecx, 128
   557 000003A1 66B98000                	mov	cx, 128
   558 000003A5 31D2                    	xor     edx, edx
   559 000003A7 31DB                    	xor     ebx, ebx
   560                                  CopyOrder:
   561 000003A9 8AB3[7E120000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   562 000003AF 88B3[04130000]          	mov     [ModInfo.Order+ebx], dh
   563 000003B5 38D6                    	cmp     dh, dl
   564 000003B7 7202                    	jb      short NextOrder
   565 000003B9 88F2                    	mov     dl, dh
   566                                  NextOrder:
   567 000003BB 43                      	inc     ebx
   568 000003BC E2EB                    	loop    CopyOrder
   569                                  AllocPatterns:  
   570 000003BE 81E2FF000000            	and	edx, 0FFh
   571                                  	;inc	dx
   572 000003C4 FEC2                    	inc	dl  ; 07/10/2017
   573                                  	; dl = count of 1024 bytes ; count of patterns (04/07/2017)
   574 000003C6 C1E20A                  	shl	edx, 10 ; *1024 ; (count of patterns *64*16)
   575                                  
   576 000003C9 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   577                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   578 000003CB B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   579                                  	;
   580 000003D0 890D[84130000]          	mov	[ModInfo.Patterns], ecx
   581                                  	;
   582 000003D6 01CD                    	add	ebp, ecx ; next offset for samples
   583                                  ReadPatterns:  
   584                                  	;mov	ebx, [FileHandle] 
   585                                  	; ebx = File handle
   586                                  	; ecx = Buffer address
   587                                  	; edx = Byte count
   588                                  	sys	_read, [FileHandle]
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 000003D8 8B1D[C20E0000]      <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 000003DE B803000000          <1>  mov eax, %1
    94                              <1> 
    95 000003E3 CD40                <1>  int 40h
   589 000003E5 0F828D000000            	jc      CloseFile
   590                                  
   591                                  	; paterns have been loaded here... (04/07/2017)
   592                                  
   593 000003EB BE[DA0E0000]            	mov	esi, Header+ModHeader.mhSamples
   594 000003F0 31FF                    	xor     edi, edi
   595                                  CopySamples:
   596 000003F2 668B4616                	mov     ax, [esi+ModSample.msLength]
   597 000003F6 86C4                    	xchg    al, ah
   598 000003F8 66D1E0                  	shl     ax, 1
   599 000003FB 668987[04140000]        	mov     [ModInfo.SampLen+edi], ax
   600 00000402 8A4619                  	mov     al, [esi+ModSample.msVolume]
   601 00000405 30E4                    	xor     ah, ah
   602 00000407 668987[BE140000]        	mov     [ModInfo.SampVol+edi], ax
   603 0000040E 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   604 00000412 86C4                    	xchg    al, ah
   605 00000414 66D1E0                  	shl     ax, 1
   606 00000417 668987[42140000]        	mov     [ModInfo.SampRep+edi], ax
   607 0000041E 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   608 00000422 86C4                    	xchg    al, ah
   609 00000424 66D1E0                  	shl     ax, 1
   610 00000427 668987[80140000]        	mov     [ModInfo.SampRepLen+edi], ax
   611 0000042E 83C61E                  	add     esi, ModSample.size
   612 00000431 6683C702                	add     di, 2
   613 00000435 6683FF3E                	cmp     di, 2*31
   614 00000439 72B7                    	jb      short CopySamples
   615                                  
   616 0000043B 31F6                    	xor     esi, esi
   617                                  AllocSamples:
   618 0000043D 0FB796[04140000]        	movzx	edx, word [ModInfo.SampLen+esi]
   619                                  	; 07/10/2017
   620                                  	;shr	dx, 4 ; ***
   621 00000444 21D2                    	and	edx, edx
   622 00000446 7426                    	jz      short NextSample
   623                                  	;inc	dx  ; number of paragraphs ; ***
   624                                  	;shl	dx, 4 ; ***
   625 00000448 89E8                    	mov	eax, ebp
   626 0000044A 668986[88130000]        	mov	[ModInfo.SampOfs+esi], ax
   627 00000451 C1E810                  	shr	eax, 16
   628 00000454 668986[C6130000]        	mov	[ModInfo.SampSeg+esi], ax
   629 0000045B 89E9                    	mov	ecx, ebp
   630 0000045D 01D5                    	add	ebp, edx ; next offset for sample 
   631                                  ReadSample:
   632                                  	;mov	ebx, [FileHandle]
   633                                  	;movzx  edx, [ModInfo.SampLen+esi]
   634                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   635                                  
   636                                  	; ebx = File handle
   637                                  	; ecx = Buffer address
   638                                  	; edx = Byte count
   639                                  	sys	_read, [FileHandle]
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 0000045F 8B1D[C20E0000]      <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000465 B803000000          <1>  mov eax, %1
    94                              <1> 
    95 0000046A CD40                <1>  int 40h
   640 0000046C 720A                    	jc      short CloseFile
   641                                  
   642                                  NextSample:
   643 0000046E 6683C602                	add     si, 2
   644 00000472 6683FE3E                	cmp     si, 2*31
   645 00000476 72C5                    	jb      short AllocSamples
   646                                  CloseFile:      
   647 00000478 9C                      	pushf
   648                                  	sys	_close, [FileHandle]
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000479 8B1D[C20E0000]      <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 0000047F B806000000          <1>  mov eax, %1
    94                              <1> 
    95 00000484 CD40                <1>  int 40h
   649 00000486 9D                      	popf
   650                                  Failed:         
   651 00000487 61                      	popad
   652                                  
   653 00000488 C3                      	retn
   654                                  
   655                                  FreeModule:
   656                                  	; Erdogan Tan (13/02/2017)
   657                                  	; nothing to do here for memory de-allocation
   658                                  ClearModInfo:
   659 00000489 57                      	push	edi
   660 0000048A BF[02130000]            	mov	edi, ModInfo
   661 0000048F B9FA010000              	mov     ecx, ModInfoRec.size
   662                                  	;cld
   663 00000494 30C0                    	xor     al, al
   664 00000496 F3AA                    	rep     stosb
   665 00000498 5F                      	pop	edi
   666 00000499 C3                      	retn
   667                                  
   668                                  ;=============================================================================
   669                                  ;               MODPLAY.ASM
   670                                  ;=============================================================================
   671                                  
   672                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   673                                  ;	July 23th, 1993.
   674                                  
   675                                  ; EQUATES
   676                                  
   677                                  NumTracks       equ 4
   678                                  DefTempo        equ 6
   679                                  DefBpm          equ 125
   680                                  MidCRate        equ 8448
   681                                  MixBufSize      equ 4096
   682                                  
   683                                  ; STRUCTURES
   684                                  
   685                                  struc TrackInfo
   686 00000000 ????????                .Samples:	resd 1
   687 00000004 ????????                .Position:	resd 1
   688 00000008 ????                    .Len:	resw 1
   689 0000000A ????                    .Repeat:	resw 1
   690 0000000C ????                    .RepLen:	resw 1
   691 0000000E ??                      .Volume: 	resb 1
   692 0000000F ??                      .Error:	resb 1
   693 00000010 ????                    .Period:	resw 1
   694 00000012 ????                    .Pitch:	resw 1
   695 00000014 ????                    .Effect:	resw 1
   696 00000016 ????                    .PortTo:	resw 1
   697 00000018 ??                      .PortParm:	resb 1
   698 00000019 ??                      .VibPos:	resb 1
   699 0000001A ??                      .VibParm:	resb 1
   700 0000001B ??                      .OldSampOfs:	resb 1
   701 0000001C ????????????            .Arp:	resw 3
   702 00000022 ????                    .ArpIndex:	resw 1
   703                                  .size:
   704                                  endstruc
   705                                  
   706                                  ; CODE
   707                                  
   708                                  ;--------------------------------------------------------------------------
   709                                  ; BeatTrack:  Process the next beat in one track.
   710                                  ;  In:
   711                                  ;    ds:di -  Track info Address.
   712                                  ;--------------------------------------------------------------------------
   713                                  
   714                                  ; edi = Track info address
   715                                  
   716                                  BeatTrack:
   717 0000049A 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   718 0000049E 6685D2                  	test    dx, dx
   719 000004A1 743C                    	je      short None
   720 000004A3 80FE00                  	cmp     dh, 00h
   721 000004A6 7438                    	je      short Arpeggio
   722 000004A8 80FE01                  	cmp     dh, 01h
   723 000004AB 7451                    	je      short PortUp
   724 000004AD 80FE02                  	cmp     dh, 02h
   725 000004B0 7471                    	je      short PortDown
   726 000004B2 80FE03                  	cmp     dh, 03h
   727 000004B5 0F848E000000            	je      TonePort
   728 000004BB 80FE04                  	cmp     dh, 04h
   729 000004BE 0F84BD000000            	je      Vibrato
   730 000004C4 80FE05                  	cmp     dh, 05h
   731 000004C7 0F840E010000            	je      PortSlide
   732 000004CD 80FE06                  	cmp     dh, 06h
   733 000004D0 0F8412010000            	je      VibSlide
   734 000004D6 80FE0A                  	cmp     dh, 0Ah
   735 000004D9 0F8413010000            	je      VolSlide
   736                                  None:           
   737 000004DF C3                      	retn
   738                                  Arpeggio:
   739 000004E0 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   740 000004E4 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   741 000004E9 66894712                	mov     [edi+TrackInfo.Pitch], ax
   742 000004ED 6683C302                	add     bx, 2
   743 000004F1 6683FB06                	cmp     bx, 6
   744 000004F5 7202                    	jb      short SetArpIndex
   745 000004F7 31DB                    	xor     ebx, ebx
   746                                  SetArpIndex:
   747 000004F9 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   748 000004FD C3                      	retn
   749                                  PortUp:
   750 000004FE 30F6                    	xor     dh, dh
   751 00000500 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   752 00000504 6629D3                  	sub     bx, dx
   753 00000507 6683FB71                	cmp     bx, 113
   754 0000050B 7D04                    	jge     short NotSmall
   755 0000050D 66BB7100                	mov     bx, 113
   756                                  NotSmall:
   757 00000511 66895F10                	mov     [edi+TrackInfo.Period], bx
   758 00000515 6601DB                  	add     bx, bx
   759 00000518 66678B87[FC14]          	mov     ax, [PitchTable+bx]
   760 0000051E 66894712                	mov     [edi+TrackInfo.Pitch], ax
   761 00000522 C3                      	retn
   762                                  PortDown:
   763 00000523 30F6                    	xor     dh, dh
   764 00000525 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   765 00000529 6601D3                  	add     bx, dx
   766 0000052C 6681FB5803              	cmp     bx, 856
   767 00000531 7E04                    	jle     short NotBig
   768 00000533 66BB5803                	mov     bx, 856
   769 00000537 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   770 0000053B 6601DB                  	add     bx, bx
   771 0000053E 66678B87[FC14]          	mov     ax, [PitchTable+bx]
   772 00000544 66894712                	mov     [edi+TrackInfo.Pitch], ax
   773 00000548 C3                      	retn
   774                                  TonePort:
   775 00000549 30F6                    	xor     dh, dh
   776 0000054B 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   777 0000054F 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   778 00000553 6639C3                  	cmp     bx, ax
   779 00000556 7428                    	je      short NoPort
   780 00000558 7F0D                    	jg      short PortToUp
   781                                  PortToDown:     
   782 0000055A 6601D3                  	add     bx, dx
   783 0000055D 6639C3                  	cmp     bx, ax
   784 00000560 7E0D                    	jle     short SetPort
   785                                  FixPort:        
   786 00000562 6689C3                  	mov     bx, ax
   787 00000565 EB08                    	jmp     short SetPort
   788                                  PortToUp:
   789 00000567 6629D3                  	sub     bx, dx
   790 0000056A 6639C3                  	cmp     bx, ax
   791 0000056D 7CF3                    	jl      short FixPort
   792                                  SetPort:        
   793 0000056F 66895F10                	mov     [edi+TrackInfo.Period], bx
   794 00000573 6601DB                  	add     bx, bx
   795 00000576 66678B87[FC14]          	mov     ax, [PitchTable+bx]
   796 0000057C 66894712                	mov     [edi+TrackInfo.Pitch], ax
   797                                  NoPort:         
   798 00000580 C3                      	retn
   799                                  Vibrato:
   800 00000581 88D6                    	mov     dh, dl
   801 00000583 80E20F                  	and     dl, 0Fh
   802 00000586 C0EE04                  	shr     dh, 4
   803 00000589 C0E602                  	shl     dh, 2
   804 0000058C 007719                  	add     [edi+TrackInfo.VibPos], dh
   805 0000058F 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   806 00000592 88F3                    	mov     bl, dh
   807 00000594 C0EB02                  	shr     bl, 2
   808 00000597 6683E31F                	and     bx, 1Fh
   809 0000059B 678A87[9B0D]            	mov     al, [SinTable+bx]
   810 000005A0 F6E2                    	mul     dl
   811 000005A2 66D1C0                  	rol     ax, 1
   812 000005A5 86C4                    	xchg    al, ah
   813 000005A7 80E401                  	and     ah, 1
   814 000005AA 84F6                    	test    dh, dh
   815 000005AC 7903                    	jns     short VibUp
   816 000005AE 66F7D8                  	neg     ax
   817                                  VibUp:          
   818 000005B1 66034710                	add     ax, [edi+TrackInfo.Period]
   819 000005B5 6689C3                  	mov     bx, ax
   820 000005B8 6683FB71                	cmp     bx, 113
   821 000005BC 7D04                    	jge     short NoLoVib
   822 000005BE 66BB7100                	mov     bx, 113
   823                                  NoLoVib:        
   824 000005C2 6681FB5803              	cmp     bx, 856
   825 000005C7 7E04                    	jle     short NoHiVib
   826 000005C9 66BB5803                	mov     bx, 856
   827                                  NoHiVib:        
   828 000005CD 6601DB                  	add     bx, bx
   829 000005D0 66678B87[FC14]          	mov     ax, [PitchTable+bx]
   830 000005D6 66894712                	mov     [edi+TrackInfo.Pitch], ax
   831 000005DA C3                      	retn
   832                                  PortSlide:
   833 000005DB E812000000              	call    VolSlide
   834 000005E0 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   835 000005E3 E961FFFFFF              	jmp     TonePort
   836                                  VibSlide:
   837 000005E8 E805000000              	call    VolSlide
   838 000005ED 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   839 000005F0 EB8F                    	jmp     short Vibrato
   840                                  VolSlide:
   841 000005F2 88D6                    	mov     dh, dl
   842 000005F4 80E20F                  	and     dl, 0Fh
   843 000005F7 C0EE04                  	shr     dh, 4
   844 000005FA 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   845 000005FD 28D0                    	sub     al, dl
   846 000005FF 7D02                    	jge     short NoLoVol
   847 00000601 30C0                    	xor     al, al
   848                                  NoLoVol:        
   849 00000603 00F0                    	add     al, dh
   850 00000605 3C40                    	cmp     al, 64
   851 00000607 7602                    	jbe     short NoHiVol
   852 00000609 B040                    	mov     al, 64
   853                                  NoHiVol:        
   854 0000060B 88470E                  	mov     [edi+TrackInfo.Volume], al
   855 0000060E C3                      	retn
   856                                  
   857                                  ;--------------------------------------------------------------------------
   858                                  ; GetTrack:   Get the next Note from a pattern.
   859                                  ;  In:
   860                                  ;    ds:di -  Track info Address.
   861                                  ;    es:si -  Pattern Note Address.
   862                                  ; Out:
   863                                  ;    es:si -  The Next Pattern Note address.
   864                                  ;--------------------------------------------------------------------------
   865                                  
   866                                  ; esi = Pattern note address
   867                                  ; edi = Track info address
   868                                  
   869                                  GetTrack:
   870 0000060F 66AD                    	lodsw
   871 00000611 86C4                    	xchg    al, ah
   872 00000613 88E3                    	mov	bl, ah
   873 00000615 80E40F                  	and     ah, 0Fh
   874 00000618 6689C1                  	mov     cx, ax
   875 0000061B 66AD                    	lodsw
   876 0000061D 86C4                    	xchg    al, ah
   877 0000061F 88E7                    	mov     bh, ah
   878 00000621 80E40F                  	and     ah, 0Fh
   879 00000624 6689C2                  	mov     dx, ax
   880 00000627 66895714                	mov     [edi+TrackInfo.Effect], dx
   881 0000062B 80E3F0                  	and     bl, 0F0h
   882 0000062E C0EF04                  	shr     bh, 4
   883 00000631 08FB                    	or      bl, bh
   884 00000633 7449                    	je      short SetPeriod
   885                                  SetSample:
   886                                  	;xor    bh, bh
   887 00000635 81E3FF000000            	and	ebx, 0FFh
   888 0000063B 4B                      	dec     ebx
   889 0000063C 01DB                    	add     ebx, ebx
   890 0000063E 668B83[BE140000]        	mov     ax, [ModInfo.SampVol+ebx]
   891 00000645 88470E                  	mov     [edi+TrackInfo.Volume], al
   892 00000648 668B83[88130000]        	mov     ax, [ModInfo.SampOfs+ebx]
   893 0000064F 668907                  	mov     [edi+TrackInfo.Samples], ax
   894 00000652 668B83[C6130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   895 00000659 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   896 0000065D 668B83[04140000]        	mov     ax, [ModInfo.SampLen+ebx]
   897 00000664 66894708                	mov     [edi+TrackInfo.Len], ax
   898 00000668 668B83[42140000]        	mov     ax, [ModInfo.SampRep+ebx]
   899 0000066F 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   900 00000673 668B83[80140000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   901 0000067A 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   902                                  SetPeriod:      
   903 0000067E 6685C9                  	test    cx, cx
   904 00000681 7424                    	jz      short SetEffect
   905                                  
   906 00000683 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   907 00000687 80FE03                  	cmp     dh, 03h
   908 0000068A 741B                    	je      short SetEffect
   909                                  
   910 0000068C 66894F10                	mov     [edi+TrackInfo.Period], cx
   911 00000690 6689CB                  	mov     bx, cx
   912 00000693 6601DB                  	add     bx, bx
   913 00000696 66678B87[FC14]          	mov     ax, [PitchTable+bx]
   914 0000069C 66894712                	mov     [edi+TrackInfo.Pitch], ax
   915 000006A0 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   916                                  SetEffect:
   917 000006A7 6685D2                  	test    dx, dx
   918 000006AA 7430                    	jz      short InitNone
   919 000006AC 80FE00                  	cmp     dh, 00h
   920 000006AF 0F84E5000000            	je      InitArpeggio
   921 000006B5 80FE03                  	cmp     dh, 03h
   922 000006B8 7423                    	je      short InitTonePort
   923 000006BA 80FE04                  	cmp     dh, 04h
   924 000006BD 742D                    	je      short InitVibrato
   925 000006BF 80FE09                  	cmp     dh, 09h
   926 000006C2 7451                    	je      short SampleOfs
   927 000006C4 80FE0B                  	cmp     dh, 0Bh
   928 000006C7 7462                    	je      short PosJump
   929 000006C9 80FE0C                  	cmp     dh, 0Ch
   930 000006CC 746B                    	je      short SetVolume
   931 000006CE 80FE0D                  	cmp     dh, 0Dh
   932 000006D1 7471                    	je      short Break
   933 000006D3 80FE0F                  	cmp     dh, 0Fh
   934 000006D6 0F8487000000            	je      SetSpeed
   935                                  InitNone:
   936 000006DC C3                      	retn
   937                                  InitTonePort:
   938 000006DD 84D2                    	test    dl, dl
   939 000006DF 7503                    	jnz     short SetPortParm
   940 000006E1 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   941                                  SetPortParm:    
   942 000006E4 885718                  	mov     [edi+TrackInfo.PortParm], dl
   943 000006E7 66895714                	mov     [edi+TrackInfo.Effect], dx
   944 000006EB C3                      	retn
   945                                  InitVibrato:
   946 000006EC 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   947 000006EF 88C4                    	mov     ah, al
   948 000006F1 240F                    	and     al, 0Fh
   949 000006F3 80E4F0                  	and     ah, 0F0h
   950 000006F6 F6C20F                  	test    dl, 0Fh
   951 000006F9 7502                    	jne     short OkDepth
   952 000006FB 08C2                    	or      dl, al
   953                                  OkDepth:        
   954 000006FD F6C2F0                  	test    dl, 0F0h
   955 00000700 7502                    	jnz     short OkRate
   956 00000702 08E2                    	or      dl, ah
   957                                  OkRate:         
   958 00000704 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   959 00000707 66895714                	mov     [edi+TrackInfo.Effect], dx
   960 0000070B 6685C9                  	test    cx, cx
   961 0000070E 7404                    	jz      short OkPos
   962 00000710 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   963                                  OkPos:          
   964 00000714 C3                      	retn
   965                                  SampleOfs:      
   966 00000715 84D2                    	test    dl, dl
   967 00000717 7503                    	jnz     short SetSampleOfs
   968 00000719 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   969                                  SetSampleOfs:
   970 0000071C 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   971 0000071F 88D6                    	mov     dh, dl
   972 00000721 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   973 00000727 895704                  	mov     [edi+TrackInfo.Position], edx
   974 0000072A C3                      	retn
   975                                  PosJump:
   976 0000072B 8815[AE6C0000]          	mov     [OrderPos], dl
   977 00000731 C605[B26C0000]40        	mov     byte [Row], 64
   978 00000738 C3                      	retn
   979                                  SetVolume:
   980 00000739 80FA40                  	cmp     dl, 64
   981 0000073C 7602                    	jbe     short OkVol
   982 0000073E B240                    	mov     dl, 64
   983                                  OkVol:
   984 00000740 88570E                  	mov     [edi+TrackInfo.Volume], dl
   985 00000743 C3                      	retn
   986                                  Break:
   987 00000744 88D6                    	mov     dh, dl
   988 00000746 80E20F                  	and     dl, 0Fh
   989 00000749 C0EE04                  	shr     dh, 4
   990 0000074C 00F6                    	add     dh, dh
   991 0000074E 00F2                    	add     dl, dh
   992 00000750 C0E602                  	shl     dh, 2
   993 00000753 00F2                    	add     dl, dh
   994 00000755 8815[B36C0000]          	mov     [BreakRow], dl
   995 0000075B C605[B26C0000]40        	mov     byte [Row], 64
   996 00000762 C3                      	retn
   997                                  SetSpeed:
   998 00000763 84D2                    	test    dl,dl
   999 00000765 7432                    	je      Skip
  1000 00000767 80FA1F                  	cmp     dl,31
  1001 0000076A 770D                    	ja      short SetBpm
  1002                                  SetTempo:       
  1003 0000076C 8815[AF6C0000]          	mov     [Tempo], dl
  1004 00000772 8815[B06C0000]          	mov     [TempoWait], dl
  1005 00000778 C3                      	retn
  1006                                  SetBpm:
  1007 00000779 8815[B16C0000]          	mov     [Bpm], dl
  1008 0000077F B067                    	mov     al, 103
  1009 00000781 F6E2                    	mul     dl
  1010 00000783 88E3                    	mov     bl, ah
  1011 00000785 30FF                    	xor     bh, bh
  1012 00000787 66A1[050E0000]          	mov     ax, [MixSpeed]
  1013 0000078D 6631D2                  	xor     dx, dx
  1014 00000790 66F7F3                  	div     bx
  1015 00000793 66A3[B46C0000]          	mov     [BpmSamples], ax
  1016                                  Skip:           
  1017 00000799 C3                      	retn
  1018                                  InitArpeggio:
  1019 0000079A 88D6                    	mov     dh, dl
  1020 0000079C 80E20F                  	and     dl, 0Fh
  1021 0000079F C0EE04                  	shr     dh, 4
  1022 000007A2 66B92400                	mov     cx, 36
  1023 000007A6 31DB                    	xor     ebx, ebx
  1024 000007A8 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1025                                  gt_ScanPeriod:
  1026 000007AC 66673B87[BB0D]          	cmp     ax, [PeriodTable+bx]
  1027 000007B2 7306                    	jae     short SetArp
  1028 000007B4 6683C302                	add     bx, 2
  1029 000007B8 E2F2                    	loop    gt_ScanPeriod
  1030                                  SetArp:         
  1031 000007BA 6601D2                  	add     dx, dx
  1032 000007BD 00DE                    	add     dh, bl
  1033 000007BF 00DA                    	add     dl, bl
  1034 000007C1 66678B9F[BB0D]          	mov     bx, [PeriodTable+bx]
  1035 000007C7 6601DB                  	add     bx, bx
  1036 000007CA 66678B87[FC14]          	mov     ax, [PitchTable+bx]
  1037 000007D0 6689471C                	mov     [edi+TrackInfo.Arp], ax
  1038 000007D4 88F3                    	mov     bl, dh
  1039 000007D6 30FF                    	xor     bh, bh
  1040 000007D8 66678B9F[BB0D]          	mov     bx, [PeriodTable+bx]
  1041 000007DE 6601DB                  	add     bx, bx
  1042 000007E1 66678B87[FC14]          	mov     ax, [PitchTable+bx]
  1043 000007E7 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1044 000007EB 88D3                    	mov     bl, dl
  1045 000007ED 30FF                    	xor     bh, bh
  1046 000007EF 66678B9F[BB0D]          	mov     bx, [PeriodTable+bx]
  1047 000007F5 6601DB                  	add     bx, bx
  1048 000007F8 66678B87[FC14]          	mov     ax, [PitchTable+bx]
  1049 000007FE 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1050 00000802 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1051 00000808 C3                      	retn
  1052                                  
  1053                                  ;--------------------------------------------------------------------------
  1054                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1055                                  ;--------------------------------------------------------------------------
  1056                                  
  1057                                  UpdateTracks:
  1058 00000809 FE0D[B06C0000]          	dec     byte [TempoWait]
  1059 0000080F 7415                    	jz      short GetTracks
  1060                                  
  1061 00000811 B904000000              	mov	ecx, NumTracks
  1062 00000816 BF[C46C0000]            	mov	edi, Tracks
  1063                                  BeatTracks:
  1064 0000081B E87AFCFFFF              	call	BeatTrack	
  1065 00000820 83C724                  	add	edi, TrackInfo.size
  1066 00000823 E2F6                    	loop	BeatTracks
  1067 00000825 C3                      	retn
  1068                                  GetTracks:
  1069 00000826 A0[AF6C0000]            	mov     al, [Tempo]
  1070 0000082B A2[B06C0000]            	mov     [TempoWait], al
  1071                                  
  1072 00000830 8B35[C06C0000]          	mov	esi, [Note]
  1073 00000836 803D[B26C0000]40        	cmp     byte [Row], 64
  1074 0000083D 7263                    	jb      short NoPattWrap
  1075                                  
  1076 0000083F 8B35[84130000]          	mov	esi, [ModInfo.Patterns]
  1077 00000845 8A1D[AE6C0000]          	mov     bl, [OrderPos]
  1078 0000084B 3A1D[02130000]          	cmp     bl, [ModInfo.OrderLen]
  1079 00000851 7214                    	jb      short NoOrderWrap
  1080 00000853 8A1D[03130000]          	mov     bl, [ModInfo.ReStart]
  1081 00000859 881D[AE6C0000]          	mov     [OrderPos], bl
  1082 0000085F 3A1D[02130000]          	cmp     bl, [ModInfo.OrderLen]
  1083 00000865 735D                    	jae     short NoUpdate
  1084                                  NoOrderWrap:    
  1085                                  	;xor	bh, bh
  1086 00000867 81E3FF000000            	and	ebx, 0FFh
  1087 0000086D 8A9B[04130000]          	mov     bl, [ModInfo.Order+ebx]
  1088 00000873 C1E30A                  	shl     ebx, 10 ; *1024
  1089 00000876 01DE                    	add     esi, ebx
  1090 00000878 8A1D[B36C0000]          	mov     bl, [BreakRow]
  1091 0000087E 881D[B26C0000]          	mov     [Row], bl
  1092                                  	;xor     bh, bh
  1093 00000884 81E3FF000000            	and	ebx, 0FFh
  1094 0000088A 883D[B36C0000]          	mov     [BreakRow], bh ; 0
  1095 00000890 66C1E304                	shl     bx, 4
  1096 00000894 01DE                    	add     esi, ebx
  1097 00000896 8935[C06C0000]          	mov     [Note], esi
  1098 0000089C FE05[AE6C0000]          	inc     byte [OrderPos]
  1099                                  NoPattWrap:     
  1100 000008A2 FE05[B26C0000]          	inc     byte [Row]
  1101                                  
  1102                                  	;cld
  1103 000008A8 B904000000              	mov	ecx, NumTracks
  1104 000008AD BF[C46C0000]            	mov	edi, Tracks
  1105                                  GetTracks_next:
  1106 000008B2 51                      	push	ecx	
  1107 000008B3 E857FDFFFF              	call	GetTrack
  1108 000008B8 59                      	pop	ecx
  1109 000008B9 83C724                  	add	edi, TrackInfo.size
  1110 000008BC E2F4                    	loop	GetTracks_next
  1111                                  
  1112 000008BE 8935[C06C0000]          	mov     [Note], esi
  1113                                  NoUpdate:
  1114 000008C4 C3                      	retn
  1115                                  
  1116                                  ;--------------------------------------------------------------------------
  1117                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1118                                  ;  In:
  1119                                  ;   ds:si -  Track Info Address.
  1120                                  ;   ds:di -  Buffer Address.
  1121                                  ;    cx   -  Buffer Size.
  1122                                  ;--------------------------------------------------------------------------
  1123                                  
  1124                                  ; esi = Track info address
  1125                                  ; edi = Buffer address
  1126                                  ; ecx = Buffer size
  1127                                  
  1128                                  MixTrack:
  1129 000008C5 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1130 000008CA 7748                    	ja      short MixLooped
  1131                                  MixNonLooped:   
  1132 000008CC 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1133 000008CE 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1134 000008D1 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1135 000008D5 52                      	push    edx
  1136 000008D6 56                      	push    esi
  1137 000008D7 01D3                    	add     ebx, edx
  1138 000008D9 01D5                    	add     ebp, edx
  1139 000008DB 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1140 000008DF 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1141 000008E2 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1142 000008E5 89DE                    	mov     esi, ebx
  1143 000008E7 88C7                    	mov     bh, al
  1144 000008E9 88D0                    	mov     al, dl
  1145 000008EB 88F2                    	mov     dl, dh
  1146                                  	;xor	dh, dh
  1147 000008ED 81E2FF000000            	and	edx, 0FFh
  1148                                  nlMixSamp:      
  1149 000008F3 39EE                    	cmp     esi, ebp
  1150 000008F5 7310                    	jae     short nlMixBye
  1151 000008F7 8A1E                    	mov     bl, [esi]
  1152 000008F9 678A9F[AE1B]            	mov     bl, [VolTable+bx]
  1153 000008FE 001F                    	add     [edi], bl
  1154 00000900 47                      	inc     edi
  1155 00000901 00C4                    	add     ah, al
  1156 00000903 11D6                    	adc     esi, edx
  1157 00000905 E2EC                    	loop    nlMixSamp
  1158                                  nlMixBye:       
  1159 00000907 89F3                    	mov     ebx, esi
  1160 00000909 5E                      	pop     esi
  1161 0000090A 5A                      	pop     edx
  1162 0000090B 29D3                    	sub     ebx, edx
  1163 0000090D 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1164 00000910 88660F                  	mov     [esi+TrackInfo.Error], ah
  1165 00000913 C3                      	retn
  1166                                  MixLooped:
  1167 00000914 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1168 00000916 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1169 00000919 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1170 0000091D 892D[BC6C0000]          	mov     [BufRep], ebp
  1171                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1172 00000923 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1173 00000927 52                      	push    edx
  1174 00000928 56                      	push    esi
  1175 00000929 01D3                    	add     ebx, edx
  1176 0000092B 01D5                    	add     ebp, edx
  1177 0000092D 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1178 00000931 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1179 00000934 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1180                                  	;mov    si, bx
  1181 00000937 89DE                    	mov	esi, ebx ; 04/09/2017
  1182 00000939 88C7                    	mov     bh, al
  1183 0000093B 88D0                    	mov     al, dl
  1184 0000093D 88F2                    	mov     dl, dh
  1185                                  	;xor	dh, dh
  1186 0000093F 81E2FF000000            	and	edx, 0FFh
  1187                                  lpMixSamp:      
  1188 00000945 39EE                    	cmp     esi, ebp
  1189 00000947 7206                    	jb      short lpMixNow
  1190 00000949 2B35[BC6C0000]          	sub     esi, [BufRep]
  1191                                  lpMixNow:       
  1192 0000094F 8A1E                    	mov     bl, [esi]
  1193 00000951 678A9F[AE1B]            	mov     bl, [VolTable+bx]
  1194 00000956 001F                    	add     [edi], bl
  1195 00000958 47                      	inc     edi
  1196 00000959 00C4                    	add     ah, al
  1197 0000095B 11D6                    	adc	esi, edx
  1198 0000095D E2E6                    	loop    lpMixSamp
  1199                                  lpMixBye:       
  1200                                  ;	mov     ebx, esi
  1201                                  ;	pop     esi
  1202                                  ;	pop     edx
  1203                                  ;	sub     ebx, edx
  1204                                  ;	mov     [esi+TrackInfo.Position], ebx
  1205                                  ;	mov     [esi+TrackInfo.Error], ah
  1206                                  ;	retn
  1207 0000095F EBA6                    	jmp	short nlMixBye
  1208                                  
  1209                                  ;--------------------------------------------------------------------------
  1210                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1211                                  ;  In:
  1212                                  ;    Buffer  - Buffer Address.
  1213                                  ;    Count   - Buffer Size.
  1214                                  ;--------------------------------------------------------------------------
  1215                                  
  1216                                  GetSamples:
  1217                                  	; edi = buffer address
  1218                                  	; ebx = count
  1219                                  
  1220 00000961 60                      	pushad
  1221                                  
  1222                                  	;cld
  1223                                  NextChunk:      
  1224 00000962 66833D[BA6C0000]00      	cmp     word [BufLen], 0
  1225 0000096A 7548                    	jne     short CopyChunk
  1226                                  
  1227 0000096C 53                      	push    ebx
  1228 0000096D 57                      	push    edi
  1229                                  MixChunk:       
  1230 0000096E BF[AE5C0000]            	mov	edi, MixBuffer
  1231 00000973 0FB70D[B46C0000]        	movzx	ecx, word [BpmSamples]
  1232 0000097A 893D[B66C0000]          	mov     [BufPtr], edi
  1233 00000980 66890D[BA6C0000]        	mov     [BufLen], cx
  1234                                  
  1235 00000987 B080                    	mov     al, 80h
  1236 00000989 F3AA                    	rep     stosb
  1237                                  
  1238 0000098B 66B90400                	mov	cx, NumTracks
  1239 0000098F BE[A06C0000]            	mov	esi, Tracks - TrackInfo.size
  1240                                  GetSamples_next:
  1241 00000994 51                      	push	ecx
  1242 00000995 83C624                  	add	esi, TrackInfo.size
  1243 00000998 668B0D[BA6C0000]        	mov	cx, [BufLen]
  1244 0000099F 8B3D[B66C0000]          	mov	edi, [BufPtr]
  1245 000009A5 E81BFFFFFF              	call	MixTrack
  1246 000009AA 59                      	pop	ecx
  1247 000009AB E2E7                    	loop	GetSamples_next	
  1248                                  
  1249 000009AD E857FEFFFF              	call    UpdateTracks
  1250                                  
  1251 000009B2 5F                      	pop     edi
  1252 000009B3 5B                      	pop     ebx
  1253                                  CopyChunk:      
  1254                                  	;mov	cx, [BufLen]
  1255 000009B4 0FB70D[BA6C0000]        	movzx	ecx, word [BufLen]
  1256 000009BB 39D9                    	cmp	ecx, ebx
  1257                                  	;cmp	cx, bx
  1258 000009BD 7602                    	jbe     short MoveChunk
  1259                                  	;mov	cx, bx
  1260 000009BF 89D9                    	mov     ecx, ebx
  1261                                  MoveChunk:
  1262 000009C1 8B35[B66C0000]          	mov     esi, [BufPtr]
  1263 000009C7 010D[B66C0000]          	add     [BufPtr], ecx
  1264 000009CD 66290D[BA6C0000]        	sub     [BufLen], cx
  1265 000009D4 29CB                    	sub     ebx, ecx
  1266 000009D6 F3A4                    	rep     movsb
  1267 000009D8 85DB                    	test    ebx, ebx
  1268 000009DA 7586                    	jnz     short NextChunk
  1269                                  
  1270 000009DC 61                      	popad
  1271 000009DD C3                      	retn
  1272                                  
  1273                                  ;--------------------------------------------------------------------------
  1274                                  ; StartPlaying: Initializes the Sound System.
  1275                                  ;  In:
  1276                                  ;   Module Information Resources.
  1277                                  ;--------------------------------------------------------------------------
  1278                                  
  1279                                  StartPlaying:
  1280 000009DE 60                      	pushad
  1281                                  SetModParms:    
  1282 000009DF C605[AE6C0000]00        	mov     byte [OrderPos], 0
  1283 000009E6 C605[AF6C0000]06        	mov     byte [Tempo], DefTempo
  1284 000009ED C605[B06C0000]06        	mov     byte [TempoWait], DefTempo
  1285 000009F4 C605[B16C0000]7D        	mov     byte [Bpm], DefBpm
  1286 000009FB C605[B26C0000]40        	mov     byte [Row], 64
  1287 00000A02 C605[B36C0000]00        	mov     byte [BreakRow], 0
  1288 00000A09 66A1[050E0000]          	mov     ax, [MixSpeed]
  1289 00000A0F 31D2                    	xor     edx, edx
  1290 00000A11 66BB3200                	mov     bx, 24*DefBpm/60
  1291 00000A15 66F7F3                  	div     bx
  1292 00000A18 66A3[B46C0000]          	mov     [BpmSamples], ax
  1293                                  ClearTracks:    
  1294 00000A1E BF[C46C0000]            	mov     edi, Tracks
  1295 00000A23 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1296 00000A28 31C0                    	xor     eax, eax
  1297                                  	;cld
  1298 00000A2A F3AA                    	rep     stosb
  1299                                  
  1300 00000A2C A3[B66C0000]            	mov     [BufPtr], eax
  1301 00000A31 66A3[BA6C0000]          	mov     [BufLen], ax
  1302                                  MakePitch:
  1303 00000A37 66B80021                	mov     ax, MidCRate
  1304 00000A3B 66BBAC01                	mov     bx, 428
  1305 00000A3F 66F7E3                  	mul     bx
  1306 00000A42 66F735[050E0000]        	div     word [MixSpeed]
  1307 00000A49 30F6                    	xor     dh, dh
  1308 00000A4B 88E2                    	mov     dl, ah
  1309 00000A4D 88C4                    	mov     ah, al
  1310 00000A4F 30C0                    	xor     al, al
  1311 00000A51 66B95903                	mov     cx, 857
  1312 00000A55 31DB                    	xor     ebx, ebx
  1313 00000A57 BF[FC140000]            	mov     edi, PitchTable
  1314                                  PitchLoop:      
  1315 00000A5C 50                      	push    eax
  1316 00000A5D 52                      	push    edx
  1317 00000A5E 6639DA                  	cmp     dx, bx
  1318 00000A61 7303                    	jae     short NoDiv
  1319 00000A63 66F7F3                  	div     bx
  1320                                  NoDiv:          
  1321 00000A66 66AB                    	stosw
  1322 00000A68 5A                      	pop     edx
  1323 00000A69 58                      	pop     eax
  1324 00000A6A 43                      	inc     ebx
  1325 00000A6B E2EF                    	loop    PitchLoop
  1326                                  MakeVolume:     
  1327 00000A6D 66B90041                	mov     cx, 16640
  1328 00000A71 89CB                    	mov     ebx, ecx
  1329                                  VolLoop:
  1330 00000A73 4B                      	dec     ebx
  1331 00000A74 88D8                    	mov     al, bl
  1332 00000A76 F6EF                    	imul    bh
  1333 00000A78 88A3[AE1B0000]          	mov     [VolTable+ebx], ah
  1334 00000A7E E2F3                    	loop    VolLoop
  1335                                  
  1336 00000A80 61                      	popad
  1337 00000A81 C3                      	retn
  1338                                  
  1339                                  ;--------------------------------------------------------------------------
  1340                                  ; StopPlaying: ShutDown the Sound System.
  1341                                  ;--------------------------------------------------------------------------
  1342                                  
  1343                                  StopPlaying:
  1344                                  	; 19/06/2017
  1345                                  	; Stop Playing
  1346                                  	sys	_audio, 0700h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000A82 BB00070000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000A87 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 00000A8C CD40                <1>  int 40h
  1347                                  	; Cancel callback service (for user)
  1348                                  	sys	_audio, 0900h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000A8E BB00090000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000A93 B820000000          <1>  mov eax, %1
    94                              <1> 
    95 00000A98 CD40                <1>  int 40h
  1349                                  	; Deallocate Audio Buffer (for user)
  1350                                  	sys	_audio, 0A00h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000A9A BB000A0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000A9F B820000000          <1>  mov eax, %1
    94                              <1> 
    95 00000AA4 CD40                <1>  int 40h
  1351                                  	; Disable Audio Device
  1352                                  	sys	_audio, 0C00h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000AA6 BB000C0000          <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87                              <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89                              <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000AAB B820000000          <1>  mov eax, %1
    94                              <1> 
    95 00000AB0 CD40                <1>  int 40h
  1353                                  
  1354 00000AB2 C3                      	retn
  1355                                  
  1356                                  ; 24/06/2017
  1357                                  ;--------------------------------------------------------------------------
  1358                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1359                                  ;--------------------------------------------------------------------------
  1360                                  ; This Conversion is needed for AC'97 hardware 
  1361                                  ; which ony supports 16 bit stereo samples !
  1362                                  
  1363                                  ; source = temp_buffer (8192 bytes)
  1364                                  ; destination = Audio_Buffer (32768 bytes)
  1365                                  
  1366                                  ConvertSamples:
  1367                                  	; 24/06/2017
  1368 00000AB3 B900140000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1369 00000AB8 BE[00500100]            	mov	esi, temp_buffer
  1370 00000ABD BF[00000100]            	mov	edi, Audio_Buffer
  1371                                  c_smpl_1:
  1372 00000AC2 AC                      	lodsb	; get 8 bit mono sample
  1373 00000AC3 20C0                    	and	al, al
  1374 00000AC5 7506                    	jnz	short c_smpl_2
  1375 00000AC7 66B80080                	mov	ax, 8000h
  1376 00000ACB EB06                    	jmp	short c_smpl_3
  1377                                  c_smpl_2:
  1378 00000ACD 2C80                    	sub	al, 80h	
  1379 00000ACF 88C4                    	mov	ah, al
  1380 00000AD1 28C0                    	sub	al, al
  1381                                  c_smpl_3:	
  1382 00000AD3 6689C2                  	mov	dx, ax
  1383 00000AD6 C1E010                  	shl	eax, 16
  1384 00000AD9 6689D0                  	mov	ax, dx
  1385 00000ADC AB                      	stosd	; save 16 bit stereo sample
  1386 00000ADD E2E3                    	loop 	c_smpl_1
  1387                                  	
  1388 00000ADF C3                      	retn
  1389                                  
  1390                                  ;=============================================================================
  1391                                  ; 
  1392                                  ;=============================================================================
  1393                                  
  1394                                  ;dword2str:
  1395                                  ;	; 13/11/2016 - Erdogan Tan 
  1396                                  ;	; eax = dword value
  1397                                  ;	;
  1398                                  ;	call	dwordtohex
  1399                                  ;	mov	[dword_str], edx
  1400                                  ;	mov	[dword_str+4], eax
  1401                                  ;	mov	si, dword_str
  1402                                  ;	retn
  1403                                  
  1404                                  	; 05/03/2017 (TRDOS 386)
  1405                                  	; trdos386.s (unix386.s) - 10/05/2015
  1406                                  	; Convert binary number to hexadecimal string
  1407                                  
  1408                                  ;bytetohex:
  1409                                  ;	; INPUT ->
  1410                                  ;	; 	AL = byte (binary number)
  1411                                  ;	; OUTPUT ->
  1412                                  ;	;	AX = hexadecimal string
  1413                                  ;	;
  1414                                  ;	push	ebx
  1415                                  ;	movzx	ebx, al
  1416                                  ;	shr	bl, 4
  1417                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1418                                  ;	xchg	bl, al
  1419                                  ;	and	bl, 0Fh
  1420                                  ;	mov	ah, [ebx+hex_chars] 
  1421                                  ;	pop	ebx	
  1422                                  ;	retn
  1423                                  
  1424                                  ;wordtohex:
  1425                                  ;	; INPUT ->
  1426                                  ;	; 	AX = word (binary number)
  1427                                  ;	; OUTPUT ->
  1428                                  ;	;	EAX = hexadecimal string
  1429                                  ;	;
  1430                                  ;	push	ebx
  1431                                  ;	xor	ebx, ebx
  1432                                  ;	xchg	ah, al
  1433                                  ;	push	eax
  1434                                  ;	mov	bl, ah
  1435                                  ;	shr	bl, 4
  1436                                  ;	mov	al, [ebx+hex_chars] 	 	
  1437                                  ;	mov	bl, ah
  1438                                  ;	and	bl, 0Fh
  1439                                  ;	mov	ah, [ebx+hex_chars]
  1440                                  ;	shl	eax, 16
  1441                                  ;	pop	eax
  1442                                  ;	pop	ebx
  1443                                  ;	jmp	short bytetohex
  1444                                  
  1445                                  ;dwordtohex:
  1446                                  ;	; INPUT ->
  1447                                  ;	; 	EAX = dword (binary number)
  1448                                  ;	; OUTPUT ->
  1449                                  ;	;	EDX:EAX = hexadecimal string
  1450                                  ;	;
  1451                                  ;	push	eax
  1452                                  ;	shr	eax, 16
  1453                                  ;	call	wordtohex
  1454                                  ;	mov	edx, eax
  1455                                  ;	pop	eax
  1456                                  ;	call	wordtohex
  1457                                  ;	retn
  1458                                  
  1459                                  	; 24/06/2017
  1460                                  	; 19/06/2017
  1461                                  	; 05/03/2017 (TRDOS 386)
  1462                                  	; 13/11/2016 - Erdogan Tan
  1463                                  write_audio_dev_info:
  1464                                  	; BUS/DEV/FN
  1465                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1466                                  	; DEV/VENDOR
  1467                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1468                                  
  1469 00000AE0 8B35[B00E0000]          	mov	esi, [dev_vendor]
  1470 00000AE6 6689F0                  	mov	ax, si
  1471 00000AE9 0FB6D8                  	movzx	ebx, al
  1472 00000AEC 88DA                    	mov	dl, bl
  1473 00000AEE 80E30F                  	and	bl, 0Fh
  1474 00000AF1 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1475 00000AF7 A2[4C0E0000]            	mov	[msgVendorId+3], al
  1476 00000AFC 88D3                    	mov	bl, dl
  1477 00000AFE C0EB04                  	shr	bl, 4
  1478 00000B01 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1479 00000B07 A2[4B0E0000]            	mov	[msgVendorId+2], al
  1480 00000B0C 88E3                    	mov	bl, ah
  1481 00000B0E 88DA                    	mov	dl, bl
  1482 00000B10 80E30F                  	and	bl, 0Fh
  1483 00000B13 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1484 00000B19 A2[4A0E0000]            	mov	[msgVendorId+1], al
  1485 00000B1E 88D3                    	mov	bl, dl
  1486 00000B20 C0EB04                  	shr	bl, 4
  1487 00000B23 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1488 00000B29 A2[490E0000]            	mov	[msgVendorId], al
  1489 00000B2E C1EE10                  	shr	esi, 16
  1490 00000B31 6689F0                  	mov	ax, si
  1491 00000B34 88C3                    	mov	bl, al
  1492 00000B36 88DA                    	mov	dl, bl
  1493 00000B38 80E30F                  	and	bl, 0Fh
  1494 00000B3B 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1495 00000B41 A2[5D0E0000]            	mov	[msgDevId+3], al
  1496 00000B46 88D3                    	mov	bl, dl
  1497 00000B48 C0EB04                  	shr	bl, 4
  1498 00000B4B 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1499 00000B51 A2[5C0E0000]            	mov	[msgDevId+2], al
  1500 00000B56 88E3                    	mov	bl, ah
  1501 00000B58 88DA                    	mov	dl, bl
  1502 00000B5A 80E30F                  	and	bl, 0Fh
  1503 00000B5D 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1504 00000B63 A2[5B0E0000]            	mov	[msgDevId+1], al
  1505 00000B68 88D3                    	mov	bl, dl
  1506 00000B6A C0EB04                  	shr	bl, 4
  1507 00000B6D 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1508 00000B73 A2[5A0E0000]            	mov	[msgDevId], al
  1509                                  
  1510 00000B78 8B35[B40E0000]          	mov	esi, [bus_dev_fn]
  1511 00000B7E C1EE08                  	shr	esi, 8
  1512 00000B81 6689F0                  	mov	ax, si
  1513 00000B84 88C3                    	mov	bl, al
  1514 00000B86 88DA                    	mov	dl, bl
  1515 00000B88 80E307                  	and	bl, 7 ; bit 0,1,2
  1516 00000B8B 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1517 00000B91 A2[810E0000]            	mov	[msgFncNo+1], al
  1518 00000B96 88D3                    	mov	bl, dl
  1519 00000B98 C0EB03                  	shr	bl, 3
  1520 00000B9B 88DA                    	mov	dl, bl
  1521 00000B9D 80E30F                  	and	bl, 0Fh
  1522 00000BA0 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1523 00000BA6 A2[730E0000]            	mov	[msgDevNo+1], al
  1524 00000BAB 88D3                    	mov	bl, dl
  1525 00000BAD C0EB04                  	shr	bl, 4
  1526 00000BB0 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1527 00000BB6 A2[720E0000]            	mov	[msgDevNo], al
  1528 00000BBB 88E3                    	mov	bl, ah
  1529 00000BBD 88DA                    	mov	dl, bl
  1530 00000BBF 80E30F                  	and	bl, 0Fh
  1531 00000BC2 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1532 00000BC8 A2[670E0000]            	mov	[msgBusNo+1], al
  1533 00000BCD 88D3                    	mov	bl, dl
  1534 00000BCF C0EB04                  	shr	bl, 4
  1535 00000BD2 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1536 00000BD8 A2[660E0000]            	mov	[msgBusNo], al
  1537                                  
  1538                                  	; 24/06/2017
  1539 00000BDD 66A1[BC0E0000]          	mov	ax, [ac97_NamBar]
  1540 00000BE3 88C3                    	mov	bl, al
  1541 00000BE5 88DA                    	mov	dl, bl
  1542 00000BE7 80E30F                  	and	bl, 0Fh
  1543 00000BEA 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1544 00000BF0 A2[900E0000]            	mov	[msgNamBar+3], al
  1545 00000BF5 88D3                    	mov	bl, dl
  1546 00000BF7 C0EB04                  	shr	bl, 4
  1547 00000BFA 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1548 00000C00 A2[8F0E0000]            	mov	[msgNamBar+2], al
  1549 00000C05 88E3                    	mov	bl, ah
  1550 00000C07 88DA                    	mov	dl, bl
  1551 00000C09 80E30F                  	and	bl, 0Fh
  1552 00000C0C 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1553 00000C12 A2[8E0E0000]            	mov	[msgNamBar+1], al
  1554 00000C17 88D3                    	mov	bl, dl
  1555 00000C19 C0EB04                  	shr	bl, 4
  1556 00000C1C 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1557 00000C22 A2[8D0E0000]            	mov	[msgNamBar], al
  1558                                  
  1559 00000C27 66A1[BE0E0000]          	mov	ax, [ac97_NabmBar]
  1560 00000C2D 88C3                    	mov	bl, al
  1561 00000C2F 88DA                    	mov	dl, bl
  1562 00000C31 80E30F                  	and	bl, 0Fh
  1563 00000C34 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1564 00000C3A A2[A00E0000]            	mov	[msgNabmBar+3], al
  1565 00000C3F 88D3                    	mov	bl, dl
  1566 00000C41 C0EB04                  	shr	bl, 4
  1567 00000C44 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1568 00000C4A A2[9F0E0000]            	mov	[msgNabmBar+2], al
  1569 00000C4F 88E3                    	mov	bl, ah
  1570 00000C51 88DA                    	mov	dl, bl
  1571 00000C53 80E30F                  	and	bl, 0Fh
  1572 00000C56 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1573 00000C5C A2[9E0E0000]            	mov	[msgNabmBar+1], al
  1574 00000C61 88D3                    	mov	bl, dl
  1575 00000C63 C0EB04                  	shr	bl, 4
  1576 00000C66 8A83[070E0000]          	mov	al, [ebx+hex_chars]
  1577 00000C6C A2[9D0E0000]            	mov	[msgNabmBar], al
  1578                                  
  1579                                  	; 24/11/2016
  1580 00000C71 30E4                    	xor	ah, ah
  1581 00000C73 A0[C00E0000]            	mov	al, [ac97_int_ln_reg]
  1582 00000C78 B10A                    	mov	cl, 10
  1583 00000C7A F6F1                    	div	cl
  1584 00000C7C 660105[A90E0000]        	add	[msgIRQ], ax
  1585 00000C83 20C0                    	and	al, al
  1586 00000C85 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1587 00000C87 A0[AA0E0000]            	mov	al, [msgIRQ+1]
  1588 00000C8C B420                    	mov	ah, ' '
  1589 00000C8E 66A3[A90E0000]          	mov	[msgIRQ], ax
  1590                                  _w_ac97imsg_:
  1591                                  	; EBX = Message address
  1592                                  	; ECX = Max. message length (or stop on ZERO character)
  1593                                  	;	(1 to 255)
  1594                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1595                                       	sys 	_msg, msgAC97Info, 255, 07h
    80                              <1> 
    81                              <1> 
    82                              <1> 
    83                              <1> 
    84                              <1>  %if %0 >= 2
    85 00000C94 BB[180E0000]        <1>  mov ebx, %2
    86                              <1>  %if %0 >= 3
    87 00000C99 B9FF000000          <1>  mov ecx, %3
    88                              <1>  %if %0 = 4
    89 00000C9E BA07000000          <1>  mov edx, %4
    90                              <1>  %endif
    91                              <1>  %endif
    92                              <1>  %endif
    93 00000CA3 B823000000          <1>  mov eax, %1
    94                              <1> 
    95 00000CA8 CD40                <1>  int 40h
  1596 00000CAA C3                              retn
  1597                                  
  1598                                  ;=============================================================================
  1599                                  ;               preinitialized data
  1600                                  ;=============================================================================
  1601                                  
  1602                                  ;=============================================================================
  1603                                  ;               PLAY.ASM - DATA
  1604                                  ;=============================================================================
  1605                                  
  1606                                  msg_2017:
  1607 00000CAB 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1607 00000CB4 506C6179657220666F-
  1607 00000CBD 72205452444F532033-
  1607 00000CC6 383620627920457264-
  1607 00000CCF 6F67616E2054616E2E-
  1607 00000CD8 20                 
  1608                                  	;db	'October 2017.',10,13
  1609 00000CD9 4A756E652032303234-     	db	'June 2024.',10,13
  1609 00000CE2 2E0A0D             
  1610 00000CE5 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1610 00000CEE 64706C61792066696C-
  1610 00000CF7 656E616D652E6D6F64-
  1610 00000D00 0A0D00             
  1611 00000D03 30382F31302F323031-     	db	'08/10/2017',10,13,0
  1611 00000D0C 370A0D00           
  1612 00000D10 30322F30362F323032-     	db	'02/06/2024',10,13,0
  1612 00000D19 340A0D00           
  1613 00000D1D 30362F30362F323032-     	db	'06/06/2024',10,13,0
  1613 00000D26 340A0D00           
  1614                                  
  1615 00000D2A 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1615 00000D33 506C61796572207630-
  1615 00000D3C 2E3162206279204361-
  1615 00000D45 726C6F732048617361-
  1615 00000D4E 6E2E204A756C792031-
  1615 00000D57 3939332E           
  1616 00000D5B 0A0D00                  		db	10,13,0
  1617 00000D5E 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1617 00000D67 64696E67204D6F6475-
  1617 00000D70 6C652066696C652E0A-
  1617 00000D79 0D00               
  1618                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1619                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1620                                  ;PortText:	db	'x0h, IRQ '
  1621                                  ;IrqText:	db	'x.',10,13,0
  1622                                  
  1623                                  trdos386_err_msg:
  1624 00000D7B 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1624 00000D84 2053797374656D2063-
  1624 00000D8D 616C6C206572726F72-
  1624 00000D96 20210A0D00         
  1625                                  
  1626                                  ;=============================================================================
  1627                                  ;               MODPLAY.ASM - DATA
  1628                                  ;=============================================================================
  1629                                  
  1630                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1631                                  
  1632 00000D9B 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1632 00000DA4 C5D4E1             
  1633 00000DA7 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1633 00000DB0 E1                 
  1634 00000DB1 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1634 00000DBA 19                 
  1635                                  
  1636 00000DBB 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1636 00000DC4 0280025C023A021A02-
  1636 00000DCD FC01E001C501       
  1637 00000DD3 AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1637 00000DDC 0140012E011D010D01-
  1637 00000DE5 FE00F000E200       
  1638 00000DEB D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1638 00000DF4 00A00097008F008700-
  1638 00000DFD 7F0078007100       
  1639                                  
  1640                                  ;=============================================================================
  1641                                  ;               PLAYER.ASM - DATA
  1642                                  ;=============================================================================
  1643                                  
  1644 00000E03 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1645 00000E04 08                      bps:		db 8 ; bits per sample (8 or 16)
  1646                                  Sample_Rate:
  1647                                  MixSpeed:	;dw 22050 ; Hz
  1648                                  		; 02/06/2024
  1649 00000E05 80BB                    		dw 48000  ; Hz	
  1650                                  
  1651                                  ; 13/11/2016
  1652 00000E07 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1652 00000E10 3941424344454600   
  1653                                  ;
  1654                                  msgAC97Info:	
  1655 00000E18 0D0A                    		db 0Dh, 0Ah
  1656 00000E1A 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1656 00000E23 6F20436F6E74726F6C-
  1656 00000E2C 6C6572202620436F64-
  1656 00000E35 656320496E666F0D0A 
  1657 00000E3E 56656E646F72204944-     		db "Vendor ID: "
  1657 00000E47 3A20               
  1658 00000E49 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1658 00000E52 6963652049443A20   
  1659 00000E5A 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1660 00000E61 4275733A20              		db "Bus: "
  1661 00000E66 303068204465766963-     msgBusNo:	db "00h Device: "
  1661 00000E6F 653A20             
  1662 00000E72 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1662 00000E7B 696F6E3A20         
  1663 00000E80 303068                  msgFncNo	db "00h"
  1664 00000E83 0D0A                    		db 0Dh, 0Ah
  1665 00000E85 4E414D4241523A20        		db "NAMBAR: "
  1666 00000E8D 30303030682020          msgNamBar	db "0000h  "
  1667 00000E94 4E41424D4241523A20      		db "NABMBAR: "
  1668 00000E9D 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1668 00000EA6 513A20             
  1669 00000EA9 3030                    msgIRQ:		dw 3030h
  1670 00000EAB 0D0A00                  		db 0Dh, 0Ah, 0
  1671                                  
  1672                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1673                                  ;codec_id:	   dd 0
  1674                                  ;codec_chip_id:	   dd 0
  1675                                  ;codec_vendor_ids: dw 0
  1676                                  ;codec_chip_ids:   dw 0
  1677                                  
  1678                                  ;dword_str:	dd 30303030h, 30303030h
  1679                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1680                                  
  1681                                  ;=============================================================================
  1682                                  ;        	uninitialized data
  1683                                  ;=============================================================================
  1684                                  
  1685                                  bss_start:
  1686                                  
  1687                                  ABSOLUTE bss_start
  1688                                  
  1689 00000EAE ????                    alignb 4
  1690                                  
  1691 00000EB0 ????????                dev_vendor:	resd 1
  1692 00000EB4 ????????                bus_dev_fn:	resd 1
  1693 00000EB8 ????????                stats_cmd:	resd 1
  1694 00000EBC ????                    ac97_NamBar:	resw 1
  1695 00000EBE ????                    ac97_NabmBar:	resw 1
  1696 00000EC0 ??                      ac97_int_ln_reg: resb 1
  1697 00000EC1 ??                      srb:		resb 1
  1698                                  
  1699                                  ; MODLOAD.ASM
  1700 00000EC2 ????????                FileHandle:	resd 1
  1701 00000EC6 <res 43Ch>              Header:		resb ModHeader.size
  1702                                  
  1703                                  ; MODPLAY.ASM
  1704                                  ;MixSpeed:	    resw 1
  1705                                  
  1706                                  ModInfo:
  1707 00001302 ??                      ModInfo.OrderLen:   resb 1
  1708 00001303 ??                      ModInfo.ReStart:    resb 1
  1709 00001304 <res 80h>               ModInfo.Order:	    resb 128
  1710 00001384 ????????                ModInfo.Patterns:   resd 1
  1711                                  
  1712 00001388 <res 3Eh>               ModInfo.SampOfs:    resw 31
  1713 000013C6 <res 3Eh>               ModInfo.SampSeg:    resw 31
  1714 00001404 <res 3Eh>               ModInfo.SampLen:    resw 31
  1715 00001442 <res 3Eh>               ModInfo.SampRep:    resw 31
  1716 00001480 <res 3Eh>               ModInfo.SampRepLen: resw 31
  1717 000014BE <res 3Eh>               ModInfo.SampVol:    resw 31
  1718                                  
  1719                                  ; MODPLAY.ASM
  1720 000014FC <res 6B2h>              PitchTable:	resw 857
  1721 00001BAE <res 4100h>             VolTable:	resb 16640
  1722 00005CAE <res 1000h>             MixBuffer       resb MixBufSize
  1723                                  
  1724                                  ; MODPLAY.ASM
  1725 00006CAE ??                      OrderPos:	resb 1
  1726 00006CAF ??                      Tempo:		resb 1
  1727 00006CB0 ??                      TempoWait:	resb 1
  1728 00006CB1 ??                      Bpm:		resb 1
  1729 00006CB2 ??                      Row:		resb 1
  1730 00006CB3 ??                      BreakRow:	resb 1
  1731 00006CB4 ????                    BpmSamples:	resw 1
  1732 00006CB6 ????????                BufPtr:		resd 1
  1733 00006CBA ????                    BufLen:		resw 1
  1734 00006CBC ????????                BufRep:		resd 1
  1735 00006CC0 ????????                Note:		resd 1
  1736 00006CC4 <res 90h>               Tracks:		resb TrackInfo.size*NumTracks
  1737                                  
  1738 00006D54 <res Ch>                alignb 16
  1739                                  
  1740                                  ; PLAY.ASM
  1741 00006D60 <res 280h>              Scope:		resw 320
  1742 00006FE0 <res 200h>              RowOfs:		resw 256
  1743                                  
  1744                                  mod_file_name:
  1745 000071E0 <res 50h>               		resb 80
  1746                                  
  1747 00007230 <res DD0h>              alignb 4096
  1748                                  
  1749                                  g_buff:
  1750 00008000 <res 500h>              		resb 320*4 ; 24/06/2017
  1751                                  
  1752 00008500 <res 7B00h>             alignb 65536
  1753                                  
  1754                                  Audio_Buffer:
  1755 00010000 <res 5000h>             		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1756                                  temp_buffer:
  1757 00015000 <res 1400h>             		resb BUFFERSIZE / 4 ; 8192
  1758                                  
  1759 00016400 <res 9C00h>             alignb 65536
  1760                                  
  1761                                  file_buffer:
  1762 00020000 <res 60000h>            		resb 65536*6
  1763                                  EOF:
