     1                                  ; ****************************************************************************
     2                                  ; modplay2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY2.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 24/06/2017 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Modified from 'playwav3.s' (13/06/2017)
    14                                  ;
    15                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    16                                  ;			                     (23/06/2017)
    17                                  ;
    18                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    19                                  ;				      (04/03/2017) 
    20                                  ; Assembler: NASM 2.11
    21                                  ; ----------------------------------------------------------------------------
    22                                  ;	   nasm  modplay.s -l modplay.txt -o MODPLAY.PRG	
    23                                  ; ****************************************************************************
    24                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    25                                  
    26                                  ; 01/03/2017
    27                                  ; 16/10/2016
    28                                  ; 29/04/2016
    29                                  ; TRDOS 386 system calls (temporary list!)
    30                                  _ver 	equ 0
    31                                  _exit 	equ 1
    32                                  _fork 	equ 2
    33                                  _read 	equ 3
    34                                  _write	equ 4
    35                                  _open	equ 5
    36                                  _close 	equ 6
    37                                  _wait 	equ 7
    38                                  _creat 	equ 8
    39                                  _link 	equ 9
    40                                  _unlink	equ 10
    41                                  _exec	equ 11
    42                                  _chdir	equ 12
    43                                  _time 	equ 13
    44                                  _mkdir 	equ 14
    45                                  _chmod	equ 15
    46                                  _chown	equ 16
    47                                  _break	equ 17
    48                                  _stat	equ 18
    49                                  _seek	equ 19
    50                                  _tell 	equ 20
    51                                  _mount	equ 21
    52                                  _umount	equ 22
    53                                  _setuid	equ 23
    54                                  _getuid	equ 24
    55                                  _stime	equ 25
    56                                  _quit	equ 26	
    57                                  _intr	equ 27
    58                                  _fstat	equ 28
    59                                  _emt 	equ 29
    60                                  _mdate 	equ 30
    61                                  _video 	equ 31
    62                                  _audio	equ 32
    63                                  _timer	equ 33
    64                                  _sleep	equ 34
    65                                  _msg    equ 35
    66                                  _geterr	equ 36
    67                                  _fpsave	equ 37
    68                                  _pri	equ 38
    69                                  _rele	equ 39
    70                                  _fff	equ 40
    71                                  _fnf	equ 41
    72                                  _alloc	equ 42
    73                                  _dalloc equ 43
    74                                  _calbac equ 44		
    75                                  
    76                                  %macro sys 1-4
    77                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    78                                      ; 03/09/2015	
    79                                      ; 13/04/2015
    80                                      ; Retro UNIX 386 v1 system call.	
    81                                      %if %0 >= 2   
    82                                          mov ebx, %2
    83                                          %if %0 >= 3    
    84                                              mov ecx, %3
    85                                              %if %0 = 4
    86                                                 mov edx, %4   
    87                                              %endif
    88                                          %endif
    89                                      %endif
    90                                      mov eax, %1
    91                                      ;int 30h
    92                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    93                                  %endmacro
    94                                  
    95                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    96                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    97                                  
    98                                  ; 19/06/2017
    99                                  BUFFERSIZE equ 32768
   100                                  
   101                                  ; ----------------------------------------------------------------------------
   102                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   103                                  ;	July 14th, 1993.
   104                                  
   105                                  ;=============================================================================
   106                                  ;  
   107                                  ;=============================================================================
   108                                  
   109                                  [BITS 32]
   110                                  [org 0]
   111                                  
   112                                  Start:
   113                                  	; clear bss
   114 00000000 B9[00000800]            	mov	ecx, EOF
   115 00000005 BF[750E0000]            	mov	edi, bss_start
   116 0000000A 29F9                    	sub	ecx, edi
   117 0000000C D1E9                    	shr	ecx, 1
   118 0000000E 31C0                    	xor	eax, eax
   119 00000010 F366AB                  	rep	stosw
   120                                  
   121                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   122 00000013 E8E2010000              	call    DetectICH
   123 00000018 731B                    	jnc     short GetFileName
   124                                  
   125                                  _dev_not_ready:
   126                                  ; couldn't find the audio device!
   127                                  	sys	_msg, noDevMsg, 255, 0Fh
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1>  %if %0 >= 2
   127 0000001A BB[07020000]        <1>  mov ebx, %2
   127                              <1>  %if %0 >= 3
   127 0000001F B9FF000000          <1>  mov ecx, %3
   127                              <1>  %if %0 = 4
   127 00000024 BA0F000000          <1>  mov edx, %4
   127                              <1>  %endif
   127                              <1>  %endif
   127                              <1>  %endif
   127 00000029 B823000000          <1>  mov eax, %1
   127                              <1> 
   127 0000002E CD40                <1>  int 40h
   128 00000030 E9A4010000                      jmp     Exit
   129                                  
   130                                  GetFileName:  
   131 00000035 89E6                    	mov	esi, esp
   132 00000037 AD                      	lodsd
   133 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   134                                  		; (program file name & mod file name)
   135 0000003B 0F82A1010000            	jb	pmsg_2017 ; nothing to do
   136                                  
   137 00000041 AD                      	lodsd ; program file name address 
   138 00000042 AD                      	lodsd ; mod file name address (file to be read)
   139 00000043 89C6                    	mov	esi, eax
   140 00000045 BF[A0710000]            	mov	edi, mod_file_name
   141                                  ScanName:       
   142 0000004A AC                      	lodsb
   143 0000004B 84C0                    	test	al, al
   144 0000004D 0F848F010000            	je	pmsg_2017
   145 00000053 3C20                    	cmp	al, 20h
   146 00000055 74F3                    	je	short ScanName	; scan start of name.
   147 00000057 AA                      	stosb
   148 00000058 B4FF                    	mov	ah, 0FFh
   149                                  a_0:	
   150 0000005A FEC4                    	inc	ah
   151                                  a_1:
   152 0000005C AC                      	lodsb
   153 0000005D AA                      	stosb
   154 0000005E 3C2E                    	cmp	al, '.'
   155 00000060 74F8                    	je	short a_0	
   156 00000062 20C0                    	and	al, al
   157 00000064 75F6                    	jnz	short a_1
   158                                  
   159 00000066 08E4                    	or	ah, ah		; if period NOT found,
   160 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   161                                  SetExt:
   162 0000006A 4F                      	dec	edi
   163 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   164 00000071 C6470400                	mov	byte [edi+4], 0
   165                                  PrintMesg:      
   166                                  	; Prints the Credits Text.
   167                                  	sys	_msg, Credits, 255, 0Fh
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1>  %if %0 >= 2
   167 00000075 BB[F10C0000]        <1>  mov ebx, %2
   167                              <1>  %if %0 >= 3
   167 0000007A B9FF000000          <1>  mov ecx, %3
   167                              <1>  %if %0 = 4
   167 0000007F BA0F000000          <1>  mov edx, %4
   167                              <1>  %endif
   167                              <1>  %endif
   167                              <1>  %endif
   167 00000084 B823000000          <1>  mov eax, %1
   167                              <1> 
   167 00000089 CD40                <1>  int 40h
   168                                  _1:
   169                                  	; 19/06/2017
   170                                  	; Allocate Audio Buffer (for user)
   171                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 0000008B BB00020000          <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 00000090 B900800000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 00000095 BA[00000100]        <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 0000009A B820000000          <1>  mov eax, %1
   171                              <1> 
   171 0000009F CD40                <1>  int 40h
   172 000000A1 0F8204010000            	jc	error_exit
   173                                  _2:
   174                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   175                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   176                                  	;jc	error_exit
   177                                  	
   178                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   179                                  	sys	_audio, 0300h, 1, srb 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1>  %if %0 >= 2
   179 000000A7 BB00030000          <1>  mov ebx, %2
   179                              <1>  %if %0 >= 3
   179 000000AC B901000000          <1>  mov ecx, %3
   179                              <1>  %if %0 = 4
   179 000000B1 BA[890E0000]        <1>  mov edx, %4
   179                              <1>  %endif
   179                              <1>  %endif
   179                              <1>  %endif
   179 000000B6 B820000000          <1>  mov eax, %1
   179                              <1> 
   179 000000BB CD40                <1>  int 40h
   180 000000BD 0F82E8000000            	jc	error_exit
   181                                  
   182                                  LoadMod:  
   183 000000C3 BF[A0710000]            	mov	edi, mod_file_name
   184 000000C8 E8FF010000              	call    LoadModule		; Load the MODule...
   185                                  
   186 000000CD 66833D[8C0E0000]00      	cmp     word [ErrorInfo], 0	; any error loading?
   187 000000D5 741B                    	je      short short _3
   188                                  
   189                                  	; yes, print error and Exit.
   190                                  
   191                                  	sys	_msg, ErrorMesg, 255, 0Fh
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1>  %if %0 >= 2
   191 000000D7 BB[250D0000]        <1>  mov ebx, %2
   191                              <1>  %if %0 >= 3
   191 000000DC B9FF000000          <1>  mov ecx, %3
   191                              <1>  %if %0 = 4
   191 000000E1 BA0F000000          <1>  mov edx, %4
   191                              <1>  %endif
   191                              <1>  %endif
   191                              <1>  %endif
   191 000000E6 B823000000          <1>  mov eax, %1
   191                              <1> 
   191 000000EB CD40                <1>  int 40h
   192                                  
   193 000000ED E9E7000000              	jmp     Exit
   194                                  
   195                                  _3:
   196                                  	; 10/06/2017
   197                                  	sys	_audio, 0E00h ; get audio controller info
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1>  %if %0 >= 2
   197 000000F2 BB000E0000          <1>  mov ebx, %2
   197                              <1>  %if %0 >= 3
   197                              <1>  mov ecx, %3
   197                              <1>  %if %0 = 4
   197                              <1>  mov edx, %4
   197                              <1>  %endif
   197                              <1>  %endif
   197                              <1>  %endif
   197 000000F7 B820000000          <1>  mov eax, %1
   197                              <1> 
   197 000000FC CD40                <1>  int 40h
   198 000000FE 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 00000104 A2[880E0000]            	mov	[ac97_int_ln_reg], al
   214 00000109 891D[780E0000]          	mov	[dev_vendor], ebx
   215 0000010F 890D[7C0E0000]          	mov	[bus_dev_fn], ecx
   216 00000115 668915[840E0000]        	mov	[ac97_NamBar], dx
   217                                  	;mov	[ac97_NamBar], dx
   218                                  	;shr	dx, 16
   219                                  	;mov	[ac97_NabmBar], dx
   220 0000011C 8915[840E0000]          	mov	[ac97_NamBar], edx	
   221                                    
   222 00000122 E89A090000              	call	write_audio_dev_info 
   223                                  
   224                                  PlayNow: 
   225 00000127 E893080000              	call    StartPlaying
   226                                  
   227                                          ; load 32768 bytes into audio buffer
   228                                  	;mov	edi, Audio_Buffer
   229                                  	;mov	ebx, BUFFERSIZE
   230                                  	; 24/06/2017
   231                                          ; load 8192 bytes into audio buffer
   232 0000012C BF[00800100]            	mov	edi, temp_buffer
   233 00000131 BB00200000              	mov	ebx, BUFFERSIZE / 4
   234 00000136 E807080000              	call	GetSamples
   235 0000013B 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 0000013D E852090000              	call 	ConvertSamples
   244                                  
   245                                  	;mov	ecx, 128	; Make a lookup table
   246 00000142 B180                    	mov	cl, 128
   247 00000144 31DB                    	xor     ebx, ebx	; for fastest pixel
   248 00000146 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   249                                  MakeOfs:        
   250 0000014B 668993[A06F0000]        	mov     [RowOfs+ebx], dx
   251 00000152 668993[A26F0000]        	mov     [RowOfs+ebx+2], dx
   252 00000159 6681C24001              	add     dx, 320
   253 0000015E 83C304                  	add     ebx, 4
   254 00000161 E2E8                    	loop    MakeOfs
   255                                  
   256                                  	; Set Master Volume Level
   257                                  	sys	_audio, 0B00h, 1D1Dh
   257                              <1> 
   257                              <1> 
   257                              <1> 
   257                              <1> 
   257                              <1>  %if %0 >= 2
   257 00000163 BB000B0000          <1>  mov ebx, %2
   257                              <1>  %if %0 >= 3
   257 00000168 B91D1D0000          <1>  mov ecx, %3
   257                              <1>  %if %0 = 4
   257                              <1>  mov edx, %4
   257                              <1>  %endif
   257                              <1>  %endif
   257                              <1>  %endif
   257 0000016D B820000000          <1>  mov eax, %1
   257                              <1> 
   257 00000172 CD40                <1>  int 40h
   258                                  
   259                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   260                                  	
   261                                  	; Start	to play
   262 00000174 A0[CB0D0000]            	mov	al, [bps]
   263 00000179 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   264 0000017C D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   265 0000017E 8A1D[CA0D0000]          	mov	bl, [stmo]
   266 00000184 FECB                    	dec	bl
   267 00000186 08C3                    	or	bl, al
   268 00000188 668B0D[CC0D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   269 0000018F B704                    	mov	bh, 4 ; start to play	
   270                                  	sys	_audio
   270                              <1> 
   270                              <1> 
   270                              <1> 
   270                              <1> 
   270                              <1>  %if %0 >= 2
   270                              <1>  mov ebx, %2
   270                              <1>  %if %0 >= 3
   270                              <1>  mov ecx, %3
   270                              <1>  %if %0 = 4
   270                              <1>  mov edx, %4
   270                              <1>  %endif
   270                              <1>  %endif
   270                              <1>  %endif
   270 00000191 B820000000          <1>  mov eax, %1
   270                              <1> 
   270 00000196 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
   285                              <1> 
   285                              <1> 
   285                              <1> 
   285                              <1> 
   285                              <1>  %if %0 >= 2
   285 00000198 BB00050000          <1>  mov ebx, %2
   285                              <1>  %if %0 >= 3
   285                              <1>  mov ecx, %3
   285                              <1>  %if %0 = 4
   285                              <1>  mov edx, %4
   285                              <1>  %endif
   285                              <1>  %endif
   285                              <1>  %endif
   285 0000019D B81F000000          <1>  mov eax, %1
   285                              <1> 
   285 000001A2 CD40                <1>  int 40h
   286 000001A4 3D00000A00              	cmp	eax, 0A0000h
   287 000001A9 7418                    	je	short _a3
   288                                  error_exit:
   289                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   289                              <1> 
   289                              <1> 
   289                              <1> 
   289                              <1> 
   289                              <1>  %if %0 >= 2
   289 000001AB BB[420D0000]        <1>  mov ebx, %2
   289                              <1>  %if %0 >= 3
   289 000001B0 B9FF000000          <1>  mov ecx, %3
   289                              <1>  %if %0 = 4
   289 000001B5 BA0E000000          <1>  mov edx, %4
   289                              <1>  %endif
   289                              <1>  %endif
   289                              <1>  %endif
   289 000001BA B823000000          <1>  mov eax, %1
   289                              <1> 
   289 000001BF CD40                <1>  int 40h
   290 000001C1 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 000001C3 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   304 000001C7 CD31                    	int     31h
   305                                  
   306                                  	; 24/06/2017
   307 000001C9 E864000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   308                                  
   309                                  _s_exit:
   310 000001CE E890080000              	call	StopPlaying	; STOP!
   311                                  
   312 000001D3 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   313 000001D7 CD31                    	int     31h
   314                                  Exit:           
   315                                  	;call    FreeModule	; Free MODule core.
   316                                  	
   317                                  	sys 	_exit	; Bye !
   317                              <1> 
   317                              <1> 
   317                              <1> 
   317                              <1> 
   317                              <1>  %if %0 >= 2
   317                              <1>  mov ebx, %2
   317                              <1>  %if %0 >= 3
   317                              <1>  mov ecx, %3
   317                              <1>  %if %0 = 4
   317                              <1>  mov edx, %4
   317                              <1>  %endif
   317                              <1>  %endif
   317                              <1>  %endif
   317 000001D9 B801000000          <1>  mov eax, %1
   317                              <1> 
   317 000001DE CD40                <1>  int 40h
   318                                  here:
   319 000001E0 EBFE                    	jmp	short here
   320                                  
   321                                  pmsg_2017:
   322                                  	sys	_msg, msg_2017, 255, 0Fh
   322                              <1> 
   322                              <1> 
   322                              <1> 
   322                              <1> 
   322                              <1>  %if %0 >= 2
   322 000001E2 BB[8C0C0000]        <1>  mov ebx, %2
   322                              <1>  %if %0 >= 3
   322 000001E7 B9FF000000          <1>  mov ecx, %3
   322                              <1>  %if %0 = 4
   322 000001EC BA0F000000          <1>  mov edx, %4
   322                              <1>  %endif
   322                              <1>  %endif
   322                              <1>  %endif
   322 000001F1 B823000000          <1>  mov eax, %1
   322                              <1> 
   322 000001F6 CD40                <1>  int 40h
   323 000001F8 EBDF                    	jmp	short Exit
   324                                  
   325                                  DetectICH:
   326                                  	; 24/06/2017
   327                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   328                                          sys	_audio, 0102h
   328                              <1> 
   328                              <1> 
   328                              <1> 
   328                              <1> 
   328                              <1>  %if %0 >= 2
   328 000001FA BB02010000          <1>  mov ebx, %2
   328                              <1>  %if %0 >= 3
   328                              <1>  mov ecx, %3
   328                              <1>  %if %0 = 4
   328                              <1>  mov edx, %4
   328                              <1>  %endif
   328                              <1>  %endif
   328                              <1>  %endif
   328 000001FF B820000000          <1>  mov eax, %1
   328                              <1> 
   328 00000204 CD40                <1>  int 40h
   329 00000206 C3                      	retn
   330                                  
   331                                  noDevMsg:
   332 00000207 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   332 00000210 61626C6520746F2066-
   332 00000219 696E64204143393720-
   332 00000222 617564696F20646576-
   332 0000022B 696365210D0A00     
   333                                  
   334                                  ;ac97_int_handler:
   335                                  ;	; 19/06/2017
   336                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   337                                  ;
   338                                  ;	sys	_rele ; return from callback service 
   339                                  ;	; we must not come here !
   340                                  ;	sys	_exit
   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 00000232 EB10                         	jmp	short modp_gs ; 23/06/2017
   358                                  p_loop:
   359 00000234 803D[890E0000]00        	cmp	byte [srb], 0
   360 0000023B 7621                    	jna	short q_loop
   361 0000023D C605[890E0000]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 00000244 BF[00800100]            	mov	edi, temp_buffer
   370 00000249 BB00200000              	mov	ebx, BUFFERSIZE / 4
   371 0000024E E8EF060000              	call	GetSamples
   372 00000253 0F8252FFFFFF            	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 00000259 E836080000              	call 	ConvertSamples
   381                                  
   382                                  q_loop:
   383 0000025E B401                    	mov     ah, 1		; any key pressed?
   384 00000260 CD32                    	int     32h		; no, Loop.
   385 00000262 7405                    	jz	short r_loop
   386                                  
   387 00000264 B400                    	mov     ah, 0		; flush key buffer...
   388 00000266 CD32                    	int     32h
   389                                  q_return:
   390 00000268 C3                      	retn
   391                                  r_loop:
   392                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   393                                  	; 23/06/2017
   394                                  	; 22/06/2017
   395                                  	; bh = 15, get current sound data/samples
   396                                  	; bl = 0, for PCM OUT
   397                                  	; ecx = count of sample/data bytes (1 to 4096)
   398                                  	; edx = destination buffer address 
   399                                  	;	(page aligned address is better)
   400                                  	;
   401                                  	sys	_audio, 0F00h, 320*4, g_buff
   401                              <1> 
   401                              <1> 
   401                              <1> 
   401                              <1> 
   401                              <1>  %if %0 >= 2
   401 00000269 BB000F0000          <1>  mov ebx, %2
   401                              <1>  %if %0 >= 3
   401 0000026E B900050000          <1>  mov ecx, %3
   401                              <1>  %if %0 = 4
   401 00000273 BA[00800000]        <1>  mov edx, %4
   401                              <1>  %endif
   401                              <1>  %endif
   401                              <1>  %endif
   401 00000278 B820000000          <1>  mov eax, %1
   401                              <1> 
   401 0000027D CD40                <1>  int 40h
   402                                  ScopeLoop:
   403 0000027F BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   404                                  	; 19/06/2017
   405 00000284 BE[00800000]            	mov     esi, g_buff	; display current samples
   406 00000289 31C9                    	xor     ecx, ecx	; to be drawed ...
   407 0000028B 31D2                    	xor     edx, edx
   408                                  DrawLoop:       
   409 0000028D 89D3                    	mov     ebx, edx	; (save Index)
   410 0000028F 668BBB[206D0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   411 00000296 C60700                  	mov     byte [edi], 0	; erase it!
   412                                  	; 24/06/2017
   413 00000299 AD                      	lodsd
   414 0000029A 80C480                  	add	ah, 80h
   415 0000029D 88E3                    	mov	bl, ah
   416                                  	;
   417 0000029F 30FF                    	xor     bh, bh
   418 000002A1 66D1E3                  	shl     bx, 1
   419 000002A4 668BBB[A06F0000]        	mov     di, [RowOfs+ebx]
   420 000002AB 6601CF                  	add     di, cx
   421 000002AE 6689D3                  	mov     bx, dx		; (restore Index)
   422 000002B1 6689BB[206D0000]        	mov     [Scope+ebx], di	; save new address...
   423 000002B8 C6070A                  	mov     byte [edi], 10	; and DRAW.
   424 000002BB 6683C202                	add     dx, 2		; the next pixel...
   425 000002BF 41                      	inc     ecx
   426 000002C0 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   427 000002C5 72C6                    	jb      short DrawLoop
   428 000002C7 E968FFFFFF              	jmp	p_loop
   429                                  
   430                                  
   431                                  ;=============================================================================
   432                                  ;               MODLOAD.ASM
   433                                  ;=============================================================================
   434                                  
   435                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   436                                  ;	July 10th, 1993.
   437                                  
   438                                  ; STRUCTURES
   439                                  
   440                                  struc ModSample
   441 00000000 <res 00000016>          .msName:	resb 22
   442 00000016 <res 00000002>          .msLength:	resw 1
   443 00000018 <res 00000001>          .msFinetune:	resb 1
   444 00000019 <res 00000001>          .msVolume:	resb 1
   445 0000001A <res 00000002>          .msRepeat:	resw 1
   446 0000001C <res 00000002>          .msRepLen:	resw 1
   447                                  .size:
   448                                  endstruc
   449                                  
   450                                  struc ModHeader
   451 00000000 <res 00000014>          .mhName:	resb 20
   452 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   453 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   454 000003B7 <res 00000001>          .mhReStart:	resb 1
   455 000003B8 <res 00000080>          .mhOrder:	resb 128
   456 00000438 <res 00000004>          .mhSign:	resw 2
   457                                  .size:	
   458                                  endstruc
   459                                  
   460                                  struc ModInfoRec
   461 00000000 <res 00000001>          .OrderLen:	resb 1
   462 00000001 <res 00000001>          .ReStart:	resb 1
   463 00000002 <res 00000080>          .Order:	resb 128
   464 00000082 <res 00000004>          .Patterns:	resd 1
   465 00000086 <res 0000003E>          .SampOfs:	resw 31
   466 000000C4 <res 0000003E>          .SampSeg:	resw 31
   467 00000102 <res 0000003E>          .SampLen:	resw 31
   468 00000140 <res 0000003E>          .SampRep:	resw 31
   469 0000017E <res 0000003E>          .SampRepLen:	resw 31
   470 000001BC <res 0000003E>          .SampVol:	resw 31
   471                                  .size:	
   472                                  endstruc
   473                                  
   474                                  ; CODE
   475                                  
   476                                  LoadModule:
   477                                  	; edi = file name address
   478                                  
   479 000002CC 60                      	pushad
   480                                  
   481 000002CD 66C705[8C0E0000]01-     	mov	word [ErrorInfo], 1
   481 000002D5 00                 
   482                                  
   483 000002D6 E88F010000              	call    ClearModInfo
   484                                  OpenFile:       
   485                                  	; ebx = ASCIIZ file name address
   486                                  	; ecx = open mode (0 = open for read)	
   487                                  	sys	_open, edi, 0 ; open for reading
   487                              <1> 
   487                              <1> 
   487                              <1> 
   487                              <1> 
   487                              <1>  %if %0 >= 2
   487 000002DB 89FB                <1>  mov ebx, %2
   487                              <1>  %if %0 >= 3
   487 000002DD B900000000          <1>  mov ecx, %3
   487                              <1>  %if %0 = 4
   487                              <1>  mov edx, %4
   487                              <1>  %endif
   487                              <1>  %endif
   487                              <1>  %endif
   487 000002E2 B805000000          <1>  mov eax, %1
   487                              <1> 
   487 000002E7 CD40                <1>  int 40h
   488 000002E9 0F8279010000            	jc	Failed
   489 000002EF A3[8A0E0000]            	mov     [FileHandle], eax
   490                                  ReadHeader:
   491                                  	; ebx = File handle
   492                                  	; ecx = Buffer address
   493                                  	; edx = Byte count
   494                                  	sys	_read, [FileHandle], Header, ModHeader.size
   494                              <1> 
   494                              <1> 
   494                              <1> 
   494                              <1> 
   494                              <1>  %if %0 >= 2
   494 000002F4 8B1D[8A0E0000]      <1>  mov ebx, %2
   494                              <1>  %if %0 >= 3
   494 000002FA B9[8E0E0000]        <1>  mov ecx, %3
   494                              <1>  %if %0 = 4
   494 000002FF BA3C040000          <1>  mov edx, %4
   494                              <1>  %endif
   494                              <1>  %endif
   494                              <1>  %endif
   494 00000304 B803000000          <1>  mov eax, %1
   494                              <1> 
   494 00000309 CD40                <1>  int 40h
   495 0000030B 0F824A010000            	jc      CloseFile
   496                                  CheckMK:        
   497 00000311 813D[C6120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   497 00000319 4B2E               
   498 0000031B 7440                    	je      short IsModFile
   499                                  CheckFLT4:
   500 0000031D 813D[C6120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   500 00000325 5434               
   501 00000327 7434                    	je      short IsModFile
   502                                  Is15Inst:
   503 00000329 BE[64100000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   504 0000032E BF[44120000]            	mov     edi, Header+ModHeader.mhOrderLen
   505                                  	;cld
   506                                  	;mov	ecx, 130
   507 00000333 66B98200                	mov	cx, 130
   508 00000337 F3A4                    	rep     movsb
   509 00000339 BF[64100000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   510 0000033E 30C0                    	xor     al, al
   511 00000340 66B9E001                	mov     cx, 16*ModSample.size
   512 00000344 F3AA                    	rep     stosb
   513                                  SeekPatterns:   
   514                                  	; ebx = [FileHandle]
   515                                  	; ecx = offset
   516                                  	; edx = switch (0 = from beginning)
   517                                  	sys	_seek, [FileHandle], 600, 0
   517                              <1> 
   517                              <1> 
   517                              <1> 
   517                              <1> 
   517                              <1>  %if %0 >= 2
   517 00000346 8B1D[8A0E0000]      <1>  mov ebx, %2
   517                              <1>  %if %0 >= 3
   517 0000034C B958020000          <1>  mov ecx, %3
   517                              <1>  %if %0 = 4
   517 00000351 BA00000000          <1>  mov edx, %4
   517                              <1>  %endif
   517                              <1>  %endif
   517                              <1>  %endif
   517 00000356 B813000000          <1>  mov eax, %1
   517                              <1> 
   517 0000035B CD40                <1>  int 40h
   518                                  IsModFile:
   519 0000035D A0[44120000]            	mov     al, [Header+ModHeader.mhOrderLen]
   520 00000362 A2[CA120000]            	mov     [ModInfo.OrderLen], al
   521                                  
   522 00000367 A0[45120000]            	mov     al, [Header+ModHeader.mhReStart]
   523 0000036C 3A05[44120000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   524 00000372 7202                    	jb      short SetReStart
   525 00000374 B07F                    	mov     al, 7Fh
   526                                  SetReStart:
   527 00000376 A2[CB120000]            	mov     [ModInfo.ReStart], al
   528                                  
   529                                  	;mov	ecx, 128
   530 0000037B 66B98000                	mov	cx, 128
   531 0000037F 31D2                    	xor     edx, edx
   532 00000381 31DB                    	xor     ebx, ebx
   533                                  CopyOrder:
   534 00000383 8AB3[46120000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   535 00000389 88B3[CC120000]          	mov     [ModInfo.Order+ebx], dh
   536 0000038F 38D6                    	cmp     dh, dl
   537 00000391 7202                    	jb      short NextOrder
   538 00000393 88F2                    	mov     dl, dh
   539                                  NextOrder:
   540 00000395 43                      	inc     ebx
   541 00000396 E2EB                    	loop    CopyOrder
   542                                  AllocPatterns:  
   543 00000398 81E2FF000000            	and	edx, 0FFh
   544 0000039E 6642                    	inc	dx ; 14/03/2017
   545                                  	; dl = count of 1024 bytes
   546 000003A0 C1E20A                  	shl	edx, 10 ; *1024
   547                                  
   548 000003A3 89D5                    	mov	ebp, edx
   549                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   550 000003A5 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   551                                  	;
   552 000003AA 890D[4C130000]          	mov	[ModInfo.Patterns], ecx
   553                                  	;
   554 000003B0 01CD                    	add	ebp, ecx ; next offset for samples
   555                                  ReadPatterns:  
   556                                  	;mov	ebx, [FileHandle] 
   557                                  	; ebx = File handle
   558                                  	; ecx = Buffer address
   559                                  	; edx = Byte count
   560                                  	sys	_read, [FileHandle]
   560                              <1> 
   560                              <1> 
   560                              <1> 
   560                              <1> 
   560                              <1>  %if %0 >= 2
   560 000003B2 8B1D[8A0E0000]      <1>  mov ebx, %2
   560                              <1>  %if %0 >= 3
   560                              <1>  mov ecx, %3
   560                              <1>  %if %0 = 4
   560                              <1>  mov edx, %4
   560                              <1>  %endif
   560                              <1>  %endif
   560                              <1>  %endif
   560 000003B8 B803000000          <1>  mov eax, %1
   560                              <1> 
   560 000003BD CD40                <1>  int 40h
   561 000003BF 0F8296000000            	jc      CloseFile
   562                                  
   563 000003C5 BE[A20E0000]            	mov	esi, Header+ModHeader.mhSamples
   564 000003CA 31FF                    	xor     edi, edi
   565                                  CopySamples:
   566 000003CC 668B4616                	mov     ax, [esi+ModSample.msLength]
   567 000003D0 86C4                    	xchg    al, ah
   568 000003D2 66D1E0                  	shl     ax, 1
   569 000003D5 668987[CC130000]        	mov     [ModInfo.SampLen+edi], ax
   570 000003DC 8A4619                  	mov     al, [esi+ModSample.msVolume]
   571 000003DF 30E4                    	xor     ah, ah
   572 000003E1 668987[86140000]        	mov     [ModInfo.SampVol+edi], ax
   573 000003E8 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   574 000003EC 86C4                    	xchg    al, ah
   575 000003EE 66D1E0                  	shl     ax, 1
   576 000003F1 668987[0A140000]        	mov     [ModInfo.SampRep+edi], ax
   577 000003F8 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   578 000003FC 86C4                    	xchg    al, ah
   579 000003FE 66D1E0                  	shl     ax, 1
   580 00000401 668987[48140000]        	mov     [ModInfo.SampRepLen+edi], ax
   581 00000408 83C61E                  	add     esi, ModSample.size
   582 0000040B 6683C702                	add     di, 2
   583 0000040F 6683FF3E                	cmp     di, 2*31
   584 00000413 72B7                    	jb      short CopySamples
   585                                  
   586 00000415 31F6                    	xor     esi, esi
   587                                  AllocSamples:
   588 00000417 0FB796[CC130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   589 0000041E 09D2                    	or	edx, edx ; byte count
   590 00000420 7426                    	jz      short NextSample
   591 00000422 89E8                    	mov	eax, ebp
   592 00000424 668986[50130000]        	mov	[ModInfo.SampOfs+esi], ax
   593 0000042B C1E810                  	shr	eax, 16
   594 0000042E 668986[8E130000]        	mov	[ModInfo.SampSeg+esi], ax
   595 00000435 89E9                    	mov	ecx, ebp
   596 00000437 01D5                    	add	ebp, edx ; next offset for sample 
   597                                  ReadSample:
   598                                  	;mov	ebx, [FileHandle]
   599                                  	;movzx  edx, [ModInfo.SampLen+esi]
   600                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   601                                  
   602                                  	; ebx = File handle
   603                                  	; ecx = Buffer address
   604                                  	; edx = Byte count
   605                                  	sys	_read, [FileHandle]
   605                              <1> 
   605                              <1> 
   605                              <1> 
   605                              <1> 
   605                              <1>  %if %0 >= 2
   605 00000439 8B1D[8A0E0000]      <1>  mov ebx, %2
   605                              <1>  %if %0 >= 3
   605                              <1>  mov ecx, %3
   605                              <1>  %if %0 = 4
   605                              <1>  mov edx, %4
   605                              <1>  %endif
   605                              <1>  %endif
   605                              <1>  %endif
   605 0000043F B803000000          <1>  mov eax, %1
   605                              <1> 
   605 00000444 CD40                <1>  int 40h
   606 00000446 7213                    	jc      short CloseFile
   607                                  
   608                                  NextSample:
   609 00000448 6683C602                	add     si, 2
   610 0000044C 6683FE3E                	cmp     si, 2*31
   611 00000450 72C5                    	jb      short AllocSamples
   612                                  
   613 00000452 66C705[8C0E0000]00-     	mov     word [ErrorInfo], 0
   613 0000045A 00                 
   614                                  CloseFile:      
   615                                  	sys	_close, [FileHandle]
   615                              <1> 
   615                              <1> 
   615                              <1> 
   615                              <1> 
   615                              <1>  %if %0 >= 2
   615 0000045B 8B1D[8A0E0000]      <1>  mov ebx, %2
   615                              <1>  %if %0 >= 3
   615                              <1>  mov ecx, %3
   615                              <1>  %if %0 = 4
   615                              <1>  mov edx, %4
   615                              <1>  %endif
   615                              <1>  %endif
   615                              <1>  %endif
   615 00000461 B806000000          <1>  mov eax, %1
   615                              <1> 
   615 00000466 CD40                <1>  int 40h
   616                                  Failed:         
   617 00000468 61                      	popad
   618                                  
   619 00000469 C3                      	retn
   620                                  
   621                                  FreeModule:
   622                                  	; Erdogan Tan (13/02/2017)
   623                                  	; nothing to do here for memory de-allocation
   624                                  ClearModInfo:
   625 0000046A 57                      	push	edi
   626 0000046B BF[CA120000]            	mov	edi, ModInfo
   627 00000470 B9FA010000              	mov     ecx, ModInfoRec.size
   628                                  	;cld
   629 00000475 30C0                    	xor     al, al
   630 00000477 F3AA                    	rep     stosb
   631 00000479 5F                      	pop	edi
   632 0000047A C3                      	retn
   633                                  
   634                                  ;=============================================================================
   635                                  ;               MODPLAY.ASM
   636                                  ;=============================================================================
   637                                  
   638                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   639                                  ;	July 23th, 1993.
   640                                  
   641                                  ; EQUATES
   642                                  
   643                                  NumTracks       equ 4
   644                                  DefTempo        equ 6
   645                                  DefBpm          equ 125
   646                                  MidCRate        equ 8448
   647                                  MixBufSize      equ 4096
   648                                  
   649                                  ; STRUCTURES
   650                                  
   651                                  struc TrackInfo
   652 00000000 <res 00000004>          .Samples:	resd 1
   653 00000004 <res 00000004>          .Position:	resd 1
   654 00000008 <res 00000002>          .Len:	resw 1
   655 0000000A <res 00000002>          .Repeat:	resw 1
   656 0000000C <res 00000002>          .RepLen:	resw 1
   657 0000000E <res 00000001>          .Volume: 	resb 1
   658 0000000F <res 00000001>          .Error:	resb 1
   659 00000010 <res 00000002>          .Period:	resw 1
   660 00000012 <res 00000002>          .Pitch:	resw 1
   661 00000014 <res 00000002>          .Effect:	resw 1
   662 00000016 <res 00000002>          .PortTo:	resw 1
   663 00000018 <res 00000001>          .PortParm:	resb 1
   664 00000019 <res 00000001>          .VibPos:	resb 1
   665 0000001A <res 00000001>          .VibParm:	resb 1
   666 0000001B <res 00000001>          .OldSampOfs:	resb 1
   667 0000001C <res 00000006>          .Arp:	resw 3
   668 00000022 <res 00000002>          .ArpIndex:	resw 1
   669                                  .size:
   670                                  endstruc
   671                                  
   672                                  ; CODE
   673                                  
   674                                  ;--------------------------------------------------------------------------
   675                                  ; BeatTrack:  Process the next beat in one track.
   676                                  ;  In:
   677                                  ;    ds:di -  Track info Address.
   678                                  ;--------------------------------------------------------------------------
   679                                  
   680                                  ; edi = Track info address
   681                                  
   682                                  BeatTrack:
   683 0000047B 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   684 0000047F 6685D2                  	test    dx, dx
   685 00000482 743C                    	je      short None
   686 00000484 80FE00                  	cmp     dh, 00h
   687 00000487 7438                    	je      short Arpeggio
   688 00000489 80FE01                  	cmp     dh, 01h
   689 0000048C 7451                    	je      short PortUp
   690 0000048E 80FE02                  	cmp     dh, 02h
   691 00000491 7471                    	je      short PortDown
   692 00000493 80FE03                  	cmp     dh, 03h
   693 00000496 0F848E000000            	je      TonePort
   694 0000049C 80FE04                  	cmp     dh, 04h
   695 0000049F 0F84BD000000            	je      Vibrato
   696 000004A5 80FE05                  	cmp     dh, 05h
   697 000004A8 0F840E010000            	je      PortSlide
   698 000004AE 80FE06                  	cmp     dh, 06h
   699 000004B1 0F8412010000            	je      VibSlide
   700 000004B7 80FE0A                  	cmp     dh, 0Ah
   701 000004BA 0F8413010000            	je      VolSlide
   702                                  None:           
   703 000004C0 C3                      	retn
   704                                  Arpeggio:
   705 000004C1 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   706 000004C5 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   707 000004CA 66894712                	mov     [edi+TrackInfo.Pitch], ax
   708 000004CE 6683C302                	add     bx, 2
   709 000004D2 6683FB06                	cmp     bx, 6
   710 000004D6 7202                    	jb      short SetArpIndex
   711 000004D8 31DB                    	xor     ebx, ebx
   712                                  SetArpIndex:
   713 000004DA 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   714 000004DE C3                      	retn
   715                                  PortUp:
   716 000004DF 30F6                    	xor     dh, dh
   717 000004E1 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   718 000004E5 6629D3                  	sub     bx, dx
   719 000004E8 6683FB71                	cmp     bx, 113
   720 000004EC 7D04                    	jge     short NotSmall
   721 000004EE 66BB7100                	mov     bx, 113
   722                                  NotSmall:
   723 000004F2 66895F10                	mov     [edi+TrackInfo.Period], bx
   724 000004F6 6601DB                  	add     bx, bx
   725 000004F9 66678B87[C414]          	mov     ax, [PitchTable+bx]
   726 000004FF 66894712                	mov     [edi+TrackInfo.Pitch], ax
   727 00000503 C3                      	retn
   728                                  PortDown:
   729 00000504 30F6                    	xor     dh, dh
   730 00000506 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   731 0000050A 6601D3                  	add     bx, dx
   732 0000050D 6681FB5803              	cmp     bx, 856
   733 00000512 7E04                    	jle     short NotBig
   734 00000514 66BB5803                	mov     bx, 856
   735 00000518 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   736 0000051C 6601DB                  	add     bx, bx
   737 0000051F 66678B87[C414]          	mov     ax, [PitchTable+bx]
   738 00000525 66894712                	mov     [edi+TrackInfo.Pitch], ax
   739 00000529 C3                      	retn
   740                                  TonePort:
   741 0000052A 30F6                    	xor     dh, dh
   742 0000052C 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   743 00000530 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   744 00000534 6639C3                  	cmp     bx, ax
   745 00000537 7428                    	je      short NoPort
   746 00000539 7F0D                    	jg      short PortToUp
   747                                  PortToDown:     
   748 0000053B 6601D3                  	add     bx, dx
   749 0000053E 6639C3                  	cmp     bx, ax
   750 00000541 7E0D                    	jle     short SetPort
   751                                  FixPort:        
   752 00000543 6689C3                  	mov     bx, ax
   753 00000546 EB08                    	jmp     short SetPort
   754                                  PortToUp:
   755 00000548 6629D3                  	sub     bx, dx
   756 0000054B 6639C3                  	cmp     bx, ax
   757 0000054E 7CF3                    	jl      short FixPort
   758                                  SetPort:        
   759 00000550 66895F10                	mov     [edi+TrackInfo.Period], bx
   760 00000554 6601DB                  	add     bx, bx
   761 00000557 66678B87[C414]          	mov     ax, [PitchTable+bx]
   762 0000055D 66894712                	mov     [edi+TrackInfo.Pitch], ax
   763                                  NoPort:         
   764 00000561 C3                      	retn
   765                                  Vibrato:
   766 00000562 88D6                    	mov     dh, dl
   767 00000564 80E20F                  	and     dl, 0Fh
   768 00000567 C0EE04                  	shr     dh, 4
   769 0000056A C0E602                  	shl     dh, 2
   770 0000056D 007719                  	add     [edi+TrackInfo.VibPos], dh
   771 00000570 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   772 00000573 88F3                    	mov     bl, dh
   773 00000575 C0EB02                  	shr     bl, 2
   774 00000578 6683E31F                	and     bx, 1Fh
   775 0000057C 678A87[620D]            	mov     al, [SinTable+bx]
   776 00000581 F6E2                    	mul     dl
   777 00000583 66D1C0                  	rol     ax, 1
   778 00000586 86C4                    	xchg    al, ah
   779 00000588 80E401                  	and     ah, 1
   780 0000058B 84F6                    	test    dh, dh
   781 0000058D 7903                    	jns     short VibUp
   782 0000058F 66F7D8                  	neg     ax
   783                                  VibUp:          
   784 00000592 66034710                	add     ax, [edi+TrackInfo.Period]
   785 00000596 6689C3                  	mov     bx, ax
   786 00000599 6683FB71                	cmp     bx, 113
   787 0000059D 7D04                    	jge     short NoLoVib
   788 0000059F 66BB7100                	mov     bx, 113
   789                                  NoLoVib:        
   790 000005A3 6681FB5803              	cmp     bx, 856
   791 000005A8 7E04                    	jle     short NoHiVib
   792 000005AA 66BB5803                	mov     bx, 856
   793                                  NoHiVib:        
   794 000005AE 6601DB                  	add     bx, bx
   795 000005B1 66678B87[C414]          	mov     ax, [PitchTable+bx]
   796 000005B7 66894712                	mov     [edi+TrackInfo.Pitch], ax
   797 000005BB C3                      	retn
   798                                  PortSlide:
   799 000005BC E812000000              	call    VolSlide
   800 000005C1 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   801 000005C4 E961FFFFFF              	jmp     TonePort
   802                                  VibSlide:
   803 000005C9 E805000000              	call    VolSlide
   804 000005CE 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   805 000005D1 EB8F                    	jmp     short Vibrato
   806                                  VolSlide:
   807 000005D3 88D6                    	mov     dh, dl
   808 000005D5 80E20F                  	and     dl, 0Fh
   809 000005D8 C0EE04                  	shr     dh, 4
   810 000005DB 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   811 000005DE 28D0                    	sub     al, dl
   812 000005E0 7D02                    	jge     short NoLoVol
   813 000005E2 30C0                    	xor     al, al
   814                                  NoLoVol:        
   815 000005E4 00F0                    	add     al, dh
   816 000005E6 3C40                    	cmp     al, 64
   817 000005E8 7602                    	jbe     short NoHiVol
   818 000005EA B040                    	mov     al, 64
   819                                  NoHiVol:        
   820 000005EC 88470E                  	mov     [edi+TrackInfo.Volume], al
   821 000005EF C3                      	retn
   822                                  
   823                                  ;--------------------------------------------------------------------------
   824                                  ; GetTrack:   Get the next Note from a pattern.
   825                                  ;  In:
   826                                  ;    ds:di -  Track info Address.
   827                                  ;    es:si -  Pattern Note Address.
   828                                  ; Out:
   829                                  ;    es:si -  The Next Pattern Note address.
   830                                  ;--------------------------------------------------------------------------
   831                                  
   832                                  ; esi = Pattern note address
   833                                  ; edi = Track info address
   834                                  
   835                                  GetTrack:
   836 000005F0 66AD                    	lodsw
   837 000005F2 86C4                    	xchg    al, ah
   838 000005F4 88E3                    	mov	bl, ah
   839 000005F6 80E40F                  	and     ah, 0Fh
   840 000005F9 6689C1                  	mov     cx, ax
   841 000005FC 66AD                    	lodsw
   842 000005FE 86C4                    	xchg    al, ah
   843 00000600 88E7                    	mov     bh, ah
   844 00000602 80E40F                  	and     ah, 0Fh
   845 00000605 6689C2                  	mov     dx, ax
   846 00000608 66895714                	mov     [edi+TrackInfo.Effect], dx
   847 0000060C 80E3F0                  	and     bl, 0F0h
   848 0000060F C0EF04                  	shr     bh, 4
   849 00000612 08FB                    	or      bl, bh
   850 00000614 7449                    	je      short SetPeriod
   851                                  SetSample:
   852                                  	;xor    bh, bh
   853 00000616 81E3FF000000            	and	ebx, 0FFh
   854 0000061C 4B                      	dec     ebx
   855 0000061D 01DB                    	add     ebx, ebx
   856 0000061F 668B83[86140000]        	mov     ax, [ModInfo.SampVol+ebx]
   857 00000626 88470E                  	mov     [edi+TrackInfo.Volume], al
   858 00000629 668B83[50130000]        	mov     ax, [ModInfo.SampOfs+ebx]
   859 00000630 668907                  	mov     [edi+TrackInfo.Samples], ax
   860 00000633 668B83[8E130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   861 0000063A 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   862 0000063E 668B83[CC130000]        	mov     ax, [ModInfo.SampLen+ebx]
   863 00000645 66894708                	mov     [edi+TrackInfo.Len], ax
   864 00000649 668B83[0A140000]        	mov     ax, [ModInfo.SampRep+ebx]
   865 00000650 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   866 00000654 668B83[48140000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   867 0000065B 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   868                                  SetPeriod:      
   869 0000065F 6685C9                  	test    cx, cx
   870 00000662 7424                    	jz      short SetEffect
   871                                  
   872 00000664 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   873 00000668 80FE03                  	cmp     dh, 03h
   874 0000066B 741B                    	je      short SetEffect
   875                                  
   876 0000066D 66894F10                	mov     [edi+TrackInfo.Period], cx
   877 00000671 6689CB                  	mov     bx, cx
   878 00000674 6601DB                  	add     bx, bx
   879 00000677 66678B87[C414]          	mov     ax, [PitchTable+bx]
   880 0000067D 66894712                	mov     [edi+TrackInfo.Pitch], ax
   881 00000681 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   882                                  SetEffect:
   883 00000688 6685D2                  	test    dx, dx
   884 0000068B 7430                    	jz      short InitNone
   885 0000068D 80FE00                  	cmp     dh, 00h
   886 00000690 0F84E5000000            	je      InitArpeggio
   887 00000696 80FE03                  	cmp     dh, 03h
   888 00000699 7423                    	je      short InitTonePort
   889 0000069B 80FE04                  	cmp     dh, 04h
   890 0000069E 742D                    	je      short InitVibrato
   891 000006A0 80FE09                  	cmp     dh, 09h
   892 000006A3 7451                    	je      short SampleOfs
   893 000006A5 80FE0B                  	cmp     dh, 0Bh
   894 000006A8 7462                    	je      short PosJump
   895 000006AA 80FE0C                  	cmp     dh, 0Ch
   896 000006AD 746B                    	je      short SetVolume
   897 000006AF 80FE0D                  	cmp     dh, 0Dh
   898 000006B2 7471                    	je      short Break
   899 000006B4 80FE0F                  	cmp     dh, 0Fh
   900 000006B7 0F8487000000            	je      SetSpeed
   901                                  InitNone:
   902 000006BD C3                      	retn
   903                                  InitTonePort:
   904 000006BE 84D2                    	test    dl, dl
   905 000006C0 7503                    	jnz     short SetPortParm
   906 000006C2 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   907                                  SetPortParm:    
   908 000006C5 885718                  	mov     [edi+TrackInfo.PortParm], dl
   909 000006C8 66895714                	mov     [edi+TrackInfo.Effect], dx
   910 000006CC C3                      	retn
   911                                  InitVibrato:
   912 000006CD 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   913 000006D0 88C4                    	mov     ah, al
   914 000006D2 240F                    	and     al, 0Fh
   915 000006D4 80E4F0                  	and     ah, 0F0h
   916 000006D7 F6C20F                  	test    dl, 0Fh
   917 000006DA 7502                    	jne     short OkDepth
   918 000006DC 08C2                    	or      dl, al
   919                                  OkDepth:        
   920 000006DE F6C2F0                  	test    dl, 0F0h
   921 000006E1 7502                    	jnz     short OkRate
   922 000006E3 08E2                    	or      dl, ah
   923                                  OkRate:         
   924 000006E5 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   925 000006E8 66895714                	mov     [edi+TrackInfo.Effect], dx
   926 000006EC 6685C9                  	test    cx, cx
   927 000006EF 7404                    	jz      short OkPos
   928 000006F1 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   929                                  OkPos:          
   930 000006F5 C3                      	retn
   931                                  SampleOfs:      
   932 000006F6 84D2                    	test    dl, dl
   933 000006F8 7503                    	jnz     short SetSampleOfs
   934 000006FA 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   935                                  SetSampleOfs:
   936 000006FD 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   937 00000700 88D6                    	mov     dh, dl
   938 00000702 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   939 00000708 895704                  	mov     [edi+TrackInfo.Position], edx
   940 0000070B C3                      	retn
   941                                  PosJump:
   942 0000070C 8815[766C0000]          	mov     [OrderPos], dl
   943 00000712 C605[7A6C0000]40        	mov     byte [Row], 64
   944 00000719 C3                      	retn
   945                                  SetVolume:
   946 0000071A 80FA40                  	cmp     dl, 64
   947 0000071D 7602                    	jbe     short OkVol
   948 0000071F B240                    	mov     dl, 64
   949                                  OkVol:
   950 00000721 88570E                  	mov     [edi+TrackInfo.Volume], dl
   951 00000724 C3                      	retn
   952                                  Break:
   953 00000725 88D6                    	mov     dh, dl
   954 00000727 80E20F                  	and     dl, 0Fh
   955 0000072A C0EE04                  	shr     dh, 4
   956 0000072D 00F6                    	add     dh, dh
   957 0000072F 00F2                    	add     dl, dh
   958 00000731 C0E602                  	shl     dh, 2
   959 00000734 00F2                    	add     dl, dh
   960 00000736 8815[7B6C0000]          	mov     [BreakRow], dl
   961 0000073C C605[7A6C0000]40        	mov     byte [Row], 64
   962 00000743 C3                      	retn
   963                                  SetSpeed:
   964 00000744 84D2                    	test    dl,dl
   965 00000746 7432                    	je      Skip
   966 00000748 80FA1F                  	cmp     dl,31
   967 0000074B 770D                    	ja      short SetBpm
   968                                  SetTempo:       
   969 0000074D 8815[776C0000]          	mov     [Tempo], dl
   970 00000753 8815[786C0000]          	mov     [TempoWait], dl
   971 00000759 C3                      	retn
   972                                  SetBpm:
   973 0000075A 8815[796C0000]          	mov     [Bpm], dl
   974 00000760 B067                    	mov     al, 103
   975 00000762 F6E2                    	mul     dl
   976 00000764 88E3                    	mov     bl, ah
   977 00000766 30FF                    	xor     bh, bh
   978 00000768 66A1[CC0D0000]          	mov     ax, [MixSpeed]
   979 0000076E 6631D2                  	xor     dx, dx
   980 00000771 66F7F3                  	div     bx
   981 00000774 66A3[7C6C0000]          	mov     [BpmSamples], ax
   982                                  Skip:           
   983 0000077A C3                      	retn
   984                                  InitArpeggio:
   985 0000077B 88D6                    	mov     dh, dl
   986 0000077D 80E20F                  	and     dl, 0Fh
   987 00000780 C0EE04                  	shr     dh, 4
   988 00000783 66B92400                	mov     cx, 36
   989 00000787 31DB                    	xor     ebx, ebx
   990 00000789 668B4710                	mov     ax, [edi+TrackInfo.Period]
   991                                  gt_ScanPeriod:
   992 0000078D 66673B87[820D]          	cmp     ax, [PeriodTable+bx]
   993 00000793 7306                    	jae     short SetArp
   994 00000795 6683C302                	add     bx, 2
   995 00000799 E2F2                    	loop    gt_ScanPeriod
   996                                  SetArp:         
   997 0000079B 6601D2                  	add     dx, dx
   998 0000079E 00DE                    	add     dh, bl
   999 000007A0 00DA                    	add     dl, bl
  1000 000007A2 66678B9F[820D]          	mov     bx, [PeriodTable+bx]
  1001 000007A8 6601DB                  	add     bx, bx
  1002 000007AB 66678B87[C414]          	mov     ax, [PitchTable+bx]
  1003 000007B1 6689471C                	mov     [edi+TrackInfo.Arp], ax
  1004 000007B5 88F3                    	mov     bl, dh
  1005 000007B7 30FF                    	xor     bh, bh
  1006 000007B9 66678B9F[820D]          	mov     bx, [PeriodTable+bx]
  1007 000007BF 6601DB                  	add     bx, bx
  1008 000007C2 66678B87[C414]          	mov     ax, [PitchTable+bx]
  1009 000007C8 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1010 000007CC 88D3                    	mov     bl, dl
  1011 000007CE 30FF                    	xor     bh, bh
  1012 000007D0 66678B9F[820D]          	mov     bx, [PeriodTable+bx]
  1013 000007D6 6601DB                  	add     bx, bx
  1014 000007D9 66678B87[C414]          	mov     ax, [PitchTable+bx]
  1015 000007DF 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1016 000007E3 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1017 000007E9 C3                      	retn
  1018                                  
  1019                                  ;--------------------------------------------------------------------------
  1020                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1021                                  ;--------------------------------------------------------------------------
  1022                                  
  1023                                  UpdateTracks:
  1024 000007EA FE0D[786C0000]          	dec     byte [TempoWait]
  1025 000007F0 7415                    	jz      short GetTracks
  1026                                  
  1027 000007F2 B904000000              	mov	ecx, NumTracks
  1028 000007F7 BF[8C6C0000]            	mov	edi, Tracks
  1029                                  BeatTracks:
  1030 000007FC E87AFCFFFF              	call	BeatTrack	
  1031 00000801 83C724                  	add	edi, TrackInfo.size
  1032 00000804 E2F6                    	loop	BeatTracks
  1033 00000806 C3                      	retn
  1034                                  GetTracks:
  1035 00000807 A0[776C0000]            	mov     al, [Tempo]
  1036 0000080C A2[786C0000]            	mov     [TempoWait], al
  1037                                  
  1038 00000811 8B35[886C0000]          	mov	esi, [Note]
  1039 00000817 803D[7A6C0000]40        	cmp     byte [Row], 64
  1040 0000081E 7263                    	jb      short NoPattWrap
  1041                                  
  1042 00000820 8B35[4C130000]          	mov	esi, [ModInfo.Patterns]
  1043 00000826 8A1D[766C0000]          	mov     bl, [OrderPos]
  1044 0000082C 3A1D[CA120000]          	cmp     bl, [ModInfo.OrderLen]
  1045 00000832 7214                    	jb      short NoOrderWrap
  1046 00000834 8A1D[CB120000]          	mov     bl, [ModInfo.ReStart]
  1047 0000083A 881D[766C0000]          	mov     [OrderPos], bl
  1048 00000840 3A1D[CA120000]          	cmp     bl, [ModInfo.OrderLen]
  1049 00000846 735D                    	jae     short NoUpdate
  1050                                  NoOrderWrap:    
  1051                                  	;xor	bh, bh
  1052 00000848 81E3FF000000            	and	ebx, 0FFh
  1053 0000084E 8A9B[CC120000]          	mov     bl, [ModInfo.Order+ebx]
  1054 00000854 C1E30A                  	shl     ebx, 10 ; *1024
  1055 00000857 01DE                    	add     esi, ebx
  1056 00000859 8A1D[7B6C0000]          	mov     bl, [BreakRow]
  1057 0000085F 881D[7A6C0000]          	mov     [Row], bl
  1058                                  	;xor     bh, bh
  1059 00000865 81E3FF000000            	and	ebx, 0FFh
  1060 0000086B 883D[7B6C0000]          	mov     [BreakRow], bh ; 0
  1061 00000871 66C1E304                	shl     bx, 4
  1062 00000875 01DE                    	add     esi, ebx
  1063 00000877 8935[886C0000]          	mov     [Note], esi
  1064 0000087D FE05[766C0000]          	inc     byte [OrderPos]
  1065                                  NoPattWrap:     
  1066 00000883 FE05[7A6C0000]          	inc     byte [Row]
  1067                                  
  1068                                  	;cld
  1069 00000889 B904000000              	mov	ecx, NumTracks
  1070 0000088E BF[8C6C0000]            	mov	edi, Tracks
  1071                                  GetTracks_next:
  1072 00000893 51                      	push	ecx	
  1073 00000894 E857FDFFFF              	call	GetTrack
  1074 00000899 59                      	pop	ecx
  1075 0000089A 83C724                  	add	edi, TrackInfo.size
  1076 0000089D E2F4                    	loop	GetTracks_next
  1077                                  
  1078 0000089F 8935[886C0000]          	mov     [Note], esi
  1079                                  NoUpdate:
  1080 000008A5 C3                      	retn
  1081                                  
  1082                                  ;--------------------------------------------------------------------------
  1083                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1084                                  ;  In:
  1085                                  ;   ds:si -  Track Info Address.
  1086                                  ;   ds:di -  Buffer Address.
  1087                                  ;    cx   -  Buffer Size.
  1088                                  ;--------------------------------------------------------------------------
  1089                                  
  1090                                  ; esi = Track info address
  1091                                  ; edi = Buffer address
  1092                                  ; ecx = Buffer size
  1093                                  
  1094                                  MixTrack:
  1095 000008A6 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1096 000008AB 7748                    	ja      short MixLooped
  1097                                  MixNonLooped:   
  1098 000008AD 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1099 000008AF 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1100 000008B2 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1101 000008B6 52                      	push    edx
  1102 000008B7 56                      	push    esi
  1103 000008B8 01D3                    	add     ebx, edx
  1104 000008BA 01D5                    	add     ebp, edx
  1105 000008BC 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1106 000008C0 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1107 000008C3 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1108 000008C6 89DE                    	mov     esi, ebx
  1109 000008C8 88C7                    	mov     bh, al
  1110 000008CA 88D0                    	mov     al, dl
  1111 000008CC 88F2                    	mov     dl, dh
  1112                                  	;xor	dh, dh
  1113 000008CE 81E2FF000000            	and	edx, 0FFh
  1114                                  nlMixSamp:      
  1115 000008D4 39EE                    	cmp     esi, ebp
  1116 000008D6 7310                    	jae     short nlMixBye
  1117 000008D8 8A1E                    	mov     bl, [esi]
  1118 000008DA 678A9F[761B]            	mov     bl, [VolTable+bx]
  1119 000008DF 001F                    	add     [edi], bl
  1120 000008E1 47                      	inc     edi
  1121 000008E2 00C4                    	add     ah, al
  1122 000008E4 11D6                    	adc     esi, edx
  1123 000008E6 E2EC                    	loop    nlMixSamp
  1124                                  nlMixBye:       
  1125 000008E8 89F3                    	mov     ebx, esi
  1126 000008EA 5E                      	pop     esi
  1127 000008EB 5A                      	pop     edx
  1128 000008EC 29D3                    	sub     ebx, edx
  1129 000008EE 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1130 000008F1 88660F                  	mov     [esi+TrackInfo.Error], ah
  1131 000008F4 C3                      	retn
  1132                                  MixLooped:
  1133 000008F5 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1134 000008F7 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1135 000008FA 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1136 000008FE 892D[846C0000]          	mov     [BufRep], ebp
  1137 00000904 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1138 00000907 52                      	push    edx
  1139 00000908 56                      	push    esi
  1140 00000909 01D3                    	add     ebx, edx
  1141 0000090B 01D5                    	add     ebp, edx
  1142 0000090D 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1143 00000911 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1144 00000914 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1145 00000917 6689DE                  	mov     si, bx
  1146 0000091A 88C7                    	mov     bh, al
  1147 0000091C 88D0                    	mov     al, dl
  1148 0000091E 88F2                    	mov     dl, dh
  1149                                  	;xor	dh, dh
  1150 00000920 81E2FF000000            	and	edx, 0FFh
  1151                                  lpMixSamp:      
  1152 00000926 39EE                    	cmp     esi, ebp
  1153 00000928 7206                    	jb      short lpMixNow
  1154 0000092A 2B35[846C0000]          	sub     esi, [BufRep]
  1155                                  lpMixNow:       
  1156 00000930 8A1E                    	mov     bl, [esi]
  1157 00000932 678A9F[761B]            	mov     bl, [VolTable+bx]
  1158 00000937 001F                    	add     [edi], bl
  1159 00000939 47                      	inc     edi
  1160 0000093A 00C4                    	add     ah, al
  1161 0000093C 11D6                    	adc	esi, edx
  1162 0000093E E2E6                    	loop    lpMixSamp
  1163                                  lpMixBye:       
  1164                                  ;	mov     ebx, esi
  1165                                  ;	pop     esi
  1166                                  ;	pop     edx
  1167                                  ;	sub     ebx, edx
  1168                                  ;	mov     [esi+TrackInfo.Position], ebx
  1169                                  ;	mov     [esi+TrackInfo.Error], ah
  1170                                  ;	retn
  1171 00000940 EBA6                    	jmp	short nlMixBye
  1172                                  
  1173                                  ;--------------------------------------------------------------------------
  1174                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1175                                  ;  In:
  1176                                  ;    Buffer  - Buffer Address.
  1177                                  ;    Count   - Buffer Size.
  1178                                  ;--------------------------------------------------------------------------
  1179                                  
  1180                                  GetSamples:
  1181                                  	; edi = buffer address
  1182                                  	; ebx = count
  1183                                  
  1184 00000942 60                      	pushad
  1185                                  
  1186                                  	;cld
  1187                                  NextChunk:      
  1188 00000943 66833D[826C0000]00      	cmp     word [BufLen], 0
  1189 0000094B 7548                    	jne     short CopyChunk
  1190                                  
  1191 0000094D 53                      	push    ebx
  1192 0000094E 57                      	push    edi
  1193                                  MixChunk:       
  1194 0000094F BF[765C0000]            	mov	edi, MixBuffer
  1195 00000954 0FB70D[7C6C0000]        	movzx	ecx, word [BpmSamples]
  1196 0000095B 893D[7E6C0000]          	mov     [BufPtr], edi
  1197 00000961 66890D[826C0000]        	mov     [BufLen], cx
  1198                                  
  1199 00000968 B080                    	mov     al, 80h
  1200 0000096A F3AA                    	rep     stosb
  1201                                  
  1202 0000096C 66B90400                	mov	cx, NumTracks
  1203 00000970 BE[686C0000]            	mov	esi, Tracks - TrackInfo.size
  1204                                  GetSamples_next:
  1205 00000975 51                      	push	ecx
  1206 00000976 83C624                  	add	esi, TrackInfo.size
  1207 00000979 668B0D[826C0000]        	mov	cx, [BufLen]
  1208 00000980 8B3D[7E6C0000]          	mov	edi, [BufPtr]
  1209 00000986 E81BFFFFFF              	call	MixTrack
  1210 0000098B 59                      	pop	ecx
  1211 0000098C E2E7                    	loop	GetSamples_next	
  1212                                  
  1213 0000098E E857FEFFFF              	call    UpdateTracks
  1214                                  
  1215 00000993 5F                      	pop     edi
  1216 00000994 5B                      	pop     ebx
  1217                                  CopyChunk:      
  1218                                  	;mov	cx, [BufLen]
  1219 00000995 0FB70D[826C0000]        	movzx	ecx, word [BufLen]
  1220 0000099C 39D9                    	cmp	ecx, ebx
  1221                                  	;cmp	cx, bx
  1222 0000099E 7602                    	jbe     short MoveChunk
  1223                                  	;mov	cx, bx
  1224 000009A0 89D9                    	mov     ecx, ebx
  1225                                  MoveChunk:
  1226 000009A2 8B35[7E6C0000]          	mov     esi, [BufPtr]
  1227 000009A8 010D[7E6C0000]          	add     [BufPtr], ecx
  1228 000009AE 66290D[826C0000]        	sub     [BufLen], cx
  1229 000009B5 29CB                    	sub     ebx, ecx
  1230 000009B7 F3A4                    	rep     movsb
  1231 000009B9 85DB                    	test    ebx, ebx
  1232 000009BB 7586                    	jnz     short NextChunk
  1233                                  
  1234 000009BD 61                      	popad
  1235 000009BE C3                      	retn
  1236                                  
  1237                                  ;--------------------------------------------------------------------------
  1238                                  ; StartPlaying: Initializes the Sound System.
  1239                                  ;  In:
  1240                                  ;   Module Information Resources.
  1241                                  ;--------------------------------------------------------------------------
  1242                                  
  1243                                  StartPlaying:
  1244 000009BF 60                      	pushad
  1245                                  SetModParms:    
  1246 000009C0 C605[766C0000]00        	mov     byte [OrderPos], 0
  1247 000009C7 C605[776C0000]06        	mov     byte [Tempo], DefTempo
  1248 000009CE C605[786C0000]06        	mov     byte [TempoWait], DefTempo
  1249 000009D5 C605[796C0000]7D        	mov     byte [Bpm], DefBpm
  1250 000009DC C605[7A6C0000]40        	mov     byte [Row], 64
  1251 000009E3 C605[7B6C0000]00        	mov     byte [BreakRow], 0
  1252 000009EA 66A1[CC0D0000]          	mov     ax, [MixSpeed]
  1253 000009F0 31D2                    	xor     edx, edx
  1254 000009F2 66BB3200                	mov     bx, 24*DefBpm/60
  1255 000009F6 66F7F3                  	div     bx
  1256 000009F9 66A3[7C6C0000]          	mov     [BpmSamples], ax
  1257                                  ClearTracks:    
  1258 000009FF BF[8C6C0000]            	mov     edi, Tracks
  1259 00000A04 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1260 00000A09 31C0                    	xor     eax, eax
  1261                                  	;cld
  1262 00000A0B F3AA                    	rep     stosb
  1263                                  
  1264 00000A0D A3[7E6C0000]            	mov     [BufPtr], eax
  1265 00000A12 66A3[826C0000]          	mov     [BufLen], ax
  1266                                  MakePitch:
  1267 00000A18 66B80021                	mov     ax, MidCRate
  1268 00000A1C 66BBAC01                	mov     bx, 428
  1269 00000A20 66F7E3                  	mul     bx
  1270 00000A23 66F735[CC0D0000]        	div     word [MixSpeed]
  1271 00000A2A 30F6                    	xor     dh, dh
  1272 00000A2C 88E2                    	mov     dl, ah
  1273 00000A2E 88C4                    	mov     ah, al
  1274 00000A30 30C0                    	xor     al, al
  1275 00000A32 66B95903                	mov     cx, 857
  1276 00000A36 31DB                    	xor     ebx, ebx
  1277 00000A38 BF[C4140000]            	mov     edi, PitchTable
  1278                                  PitchLoop:      
  1279 00000A3D 50                      	push    eax
  1280 00000A3E 52                      	push    edx
  1281 00000A3F 6639DA                  	cmp     dx, bx
  1282 00000A42 7303                    	jae     short NoDiv
  1283 00000A44 66F7F3                  	div     bx
  1284                                  NoDiv:          
  1285 00000A47 66AB                    	stosw
  1286 00000A49 5A                      	pop     edx
  1287 00000A4A 58                      	pop     eax
  1288 00000A4B 43                      	inc     ebx
  1289 00000A4C E2EF                    	loop    PitchLoop
  1290                                  MakeVolume:     
  1291 00000A4E 66B90041                	mov     cx, 16640
  1292 00000A52 89CB                    	mov     ebx, ecx
  1293                                  VolLoop:
  1294 00000A54 4B                      	dec     ebx
  1295 00000A55 88D8                    	mov     al, bl
  1296 00000A57 F6EF                    	imul    bh
  1297 00000A59 88A3[761B0000]          	mov     [VolTable+ebx], ah
  1298 00000A5F E2F3                    	loop    VolLoop
  1299                                  
  1300 00000A61 61                      	popad
  1301 00000A62 C3                      	retn
  1302                                  
  1303                                  ;--------------------------------------------------------------------------
  1304                                  ; StopPlaying: ShutDown the Sound System.
  1305                                  ;--------------------------------------------------------------------------
  1306                                  
  1307                                  StopPlaying:
  1308                                  	; 19/06/2017
  1309                                  	; Stop Playing
  1310                                  	sys	_audio, 0700h
  1310                              <1> 
  1310                              <1> 
  1310                              <1> 
  1310                              <1> 
  1310                              <1>  %if %0 >= 2
  1310 00000A63 BB00070000          <1>  mov ebx, %2
  1310                              <1>  %if %0 >= 3
  1310                              <1>  mov ecx, %3
  1310                              <1>  %if %0 = 4
  1310                              <1>  mov edx, %4
  1310                              <1>  %endif
  1310                              <1>  %endif
  1310                              <1>  %endif
  1310 00000A68 B820000000          <1>  mov eax, %1
  1310                              <1> 
  1310 00000A6D CD40                <1>  int 40h
  1311                                  	; Cancel callback service (for user)
  1312                                  	sys	_audio, 0900h
  1312                              <1> 
  1312                              <1> 
  1312                              <1> 
  1312                              <1> 
  1312                              <1>  %if %0 >= 2
  1312 00000A6F BB00090000          <1>  mov ebx, %2
  1312                              <1>  %if %0 >= 3
  1312                              <1>  mov ecx, %3
  1312                              <1>  %if %0 = 4
  1312                              <1>  mov edx, %4
  1312                              <1>  %endif
  1312                              <1>  %endif
  1312                              <1>  %endif
  1312 00000A74 B820000000          <1>  mov eax, %1
  1312                              <1> 
  1312 00000A79 CD40                <1>  int 40h
  1313                                  	; Deallocate Audio Buffer (for user)
  1314                                  	sys	_audio, 0A00h
  1314                              <1> 
  1314                              <1> 
  1314                              <1> 
  1314                              <1> 
  1314                              <1>  %if %0 >= 2
  1314 00000A7B BB000A0000          <1>  mov ebx, %2
  1314                              <1>  %if %0 >= 3
  1314                              <1>  mov ecx, %3
  1314                              <1>  %if %0 = 4
  1314                              <1>  mov edx, %4
  1314                              <1>  %endif
  1314                              <1>  %endif
  1314                              <1>  %endif
  1314 00000A80 B820000000          <1>  mov eax, %1
  1314                              <1> 
  1314 00000A85 CD40                <1>  int 40h
  1315                                  	; Disable Audio Device
  1316                                  	sys	_audio, 0C00h
  1316                              <1> 
  1316                              <1> 
  1316                              <1> 
  1316                              <1> 
  1316                              <1>  %if %0 >= 2
  1316 00000A87 BB000C0000          <1>  mov ebx, %2
  1316                              <1>  %if %0 >= 3
  1316                              <1>  mov ecx, %3
  1316                              <1>  %if %0 = 4
  1316                              <1>  mov edx, %4
  1316                              <1>  %endif
  1316                              <1>  %endif
  1316                              <1>  %endif
  1316 00000A8C B820000000          <1>  mov eax, %1
  1316                              <1> 
  1316 00000A91 CD40                <1>  int 40h
  1317                                  
  1318 00000A93 C3                      	retn
  1319                                  
  1320                                  ; 24/06/2017
  1321                                  ;--------------------------------------------------------------------------
  1322                                  ; ConvertSamples: Convert 8 bit mono samples to 16 bit stereo samples
  1323                                  ;--------------------------------------------------------------------------
  1324                                  ; This Conversion is needed for AC'97 hardware 
  1325                                  ; which ony supports 16 bit stereo samples !
  1326                                  
  1327                                  ; source = temp_buffer (8192 bytes)
  1328                                  ; destination = Audio_Buffer (32768 bytes)
  1329                                  
  1330                                  ConvertSamples:
  1331                                  	; 24/06/2017
  1332 00000A94 B900200000              	mov	ecx, BUFFERSIZE /4  ; 8192
  1333 00000A99 BE[00800100]            	mov	esi, temp_buffer
  1334 00000A9E BF[00000100]            	mov	edi, Audio_Buffer
  1335                                  c_smpl_1:
  1336 00000AA3 AC                      	lodsb	; get 8 bit mono sample
  1337 00000AA4 20C0                    	and	al, al
  1338 00000AA6 7506                    	jnz	short c_smpl_2
  1339 00000AA8 66B80080                	mov	ax, 8000h
  1340 00000AAC EB06                    	jmp	short c_smpl_3
  1341                                  c_smpl_2:
  1342 00000AAE 2C80                    	sub	al, 80h	
  1343 00000AB0 88C4                    	mov	ah, al
  1344 00000AB2 28C0                    	sub	al, al
  1345                                  c_smpl_3:	
  1346 00000AB4 6689C2                  	mov	dx, ax
  1347 00000AB7 C1E010                  	shl	eax, 16
  1348 00000ABA 6689D0                  	mov	ax, dx
  1349 00000ABD AB                      	stosd	; save 16 bit stereo sample
  1350 00000ABE E2E3                    	loop 	c_smpl_1
  1351                                  	
  1352 00000AC0 C3                      	retn
  1353                                  
  1354                                  ;=============================================================================
  1355                                  ; 
  1356                                  ;=============================================================================
  1357                                  
  1358                                  ;dword2str:
  1359                                  ;	; 13/11/2016 - Erdogan Tan 
  1360                                  ;	; eax = dword value
  1361                                  ;	;
  1362                                  ;	call	dwordtohex
  1363                                  ;	mov	[dword_str], edx
  1364                                  ;	mov	[dword_str+4], eax
  1365                                  ;	mov	si, dword_str
  1366                                  ;	retn
  1367                                  
  1368                                  	; 05/03/2017 (TRDOS 386)
  1369                                  	; trdos386.s (unix386.s) - 10/05/2015
  1370                                  	; Convert binary number to hexadecimal string
  1371                                  
  1372                                  ;bytetohex:
  1373                                  ;	; INPUT ->
  1374                                  ;	; 	AL = byte (binary number)
  1375                                  ;	; OUTPUT ->
  1376                                  ;	;	AX = hexadecimal string
  1377                                  ;	;
  1378                                  ;	push	ebx
  1379                                  ;	movzx	ebx, al
  1380                                  ;	shr	bl, 4
  1381                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1382                                  ;	xchg	bl, al
  1383                                  ;	and	bl, 0Fh
  1384                                  ;	mov	ah, [ebx+hex_chars] 
  1385                                  ;	pop	ebx	
  1386                                  ;	retn
  1387                                  
  1388                                  ;wordtohex:
  1389                                  ;	; INPUT ->
  1390                                  ;	; 	AX = word (binary number)
  1391                                  ;	; OUTPUT ->
  1392                                  ;	;	EAX = hexadecimal string
  1393                                  ;	;
  1394                                  ;	push	ebx
  1395                                  ;	xor	ebx, ebx
  1396                                  ;	xchg	ah, al
  1397                                  ;	push	eax
  1398                                  ;	mov	bl, ah
  1399                                  ;	shr	bl, 4
  1400                                  ;	mov	al, [ebx+hex_chars] 	 	
  1401                                  ;	mov	bl, ah
  1402                                  ;	and	bl, 0Fh
  1403                                  ;	mov	ah, [ebx+hex_chars]
  1404                                  ;	shl	eax, 16
  1405                                  ;	pop	eax
  1406                                  ;	pop	ebx
  1407                                  ;	jmp	short bytetohex
  1408                                  
  1409                                  ;dwordtohex:
  1410                                  ;	; INPUT ->
  1411                                  ;	; 	EAX = dword (binary number)
  1412                                  ;	; OUTPUT ->
  1413                                  ;	;	EDX:EAX = hexadecimal string
  1414                                  ;	;
  1415                                  ;	push	eax
  1416                                  ;	shr	eax, 16
  1417                                  ;	call	wordtohex
  1418                                  ;	mov	edx, eax
  1419                                  ;	pop	eax
  1420                                  ;	call	wordtohex
  1421                                  ;	retn
  1422                                  
  1423                                  	; 24/06/2017
  1424                                  	; 19/06/2017
  1425                                  	; 05/03/2017 (TRDOS 386)
  1426                                  	; 13/11/2016 - Erdogan Tan
  1427                                  write_audio_dev_info:
  1428                                  	; BUS/DEV/FN
  1429                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1430                                  	; DEV/VENDOR
  1431                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1432                                  
  1433 00000AC1 8B35[780E0000]          	mov	esi, [dev_vendor]
  1434 00000AC7 6689F0                  	mov	ax, si
  1435 00000ACA 0FB6D8                  	movzx	ebx, al
  1436 00000ACD 88DA                    	mov	dl, bl
  1437 00000ACF 80E30F                  	and	bl, 0Fh
  1438 00000AD2 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1439 00000AD8 A2[130E0000]            	mov	[msgVendorId+3], al
  1440 00000ADD 88D3                    	mov	bl, dl
  1441 00000ADF C0EB04                  	shr	bl, 4
  1442 00000AE2 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1443 00000AE8 A2[120E0000]            	mov	[msgVendorId+2], al
  1444 00000AED 88E3                    	mov	bl, ah
  1445 00000AEF 88DA                    	mov	dl, bl
  1446 00000AF1 80E30F                  	and	bl, 0Fh
  1447 00000AF4 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1448 00000AFA A2[110E0000]            	mov	[msgVendorId+1], al
  1449 00000AFF 88D3                    	mov	bl, dl
  1450 00000B01 C0EB04                  	shr	bl, 4
  1451 00000B04 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1452 00000B0A A2[100E0000]            	mov	[msgVendorId], al
  1453 00000B0F C1EE10                  	shr	esi, 16
  1454 00000B12 6689F0                  	mov	ax, si
  1455 00000B15 88C3                    	mov	bl, al
  1456 00000B17 88DA                    	mov	dl, bl
  1457 00000B19 80E30F                  	and	bl, 0Fh
  1458 00000B1C 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1459 00000B22 A2[240E0000]            	mov	[msgDevId+3], al
  1460 00000B27 88D3                    	mov	bl, dl
  1461 00000B29 C0EB04                  	shr	bl, 4
  1462 00000B2C 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1463 00000B32 A2[230E0000]            	mov	[msgDevId+2], al
  1464 00000B37 88E3                    	mov	bl, ah
  1465 00000B39 88DA                    	mov	dl, bl
  1466 00000B3B 80E30F                  	and	bl, 0Fh
  1467 00000B3E 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1468 00000B44 A2[220E0000]            	mov	[msgDevId+1], al
  1469 00000B49 88D3                    	mov	bl, dl
  1470 00000B4B C0EB04                  	shr	bl, 4
  1471 00000B4E 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1472 00000B54 A2[210E0000]            	mov	[msgDevId], al
  1473                                  
  1474 00000B59 8B35[7C0E0000]          	mov	esi, [bus_dev_fn]
  1475 00000B5F C1EE08                  	shr	esi, 8
  1476 00000B62 6689F0                  	mov	ax, si
  1477 00000B65 88C3                    	mov	bl, al
  1478 00000B67 88DA                    	mov	dl, bl
  1479 00000B69 80E307                  	and	bl, 7 ; bit 0,1,2
  1480 00000B6C 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1481 00000B72 A2[480E0000]            	mov	[msgFncNo+1], al
  1482 00000B77 88D3                    	mov	bl, dl
  1483 00000B79 C0EB03                  	shr	bl, 3
  1484 00000B7C 88DA                    	mov	dl, bl
  1485 00000B7E 80E30F                  	and	bl, 0Fh
  1486 00000B81 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1487 00000B87 A2[3A0E0000]            	mov	[msgDevNo+1], al
  1488 00000B8C 88D3                    	mov	bl, dl
  1489 00000B8E C0EB04                  	shr	bl, 4
  1490 00000B91 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1491 00000B97 A2[390E0000]            	mov	[msgDevNo], al
  1492 00000B9C 88E3                    	mov	bl, ah
  1493 00000B9E 88DA                    	mov	dl, bl
  1494 00000BA0 80E30F                  	and	bl, 0Fh
  1495 00000BA3 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1496 00000BA9 A2[2E0E0000]            	mov	[msgBusNo+1], al
  1497 00000BAE 88D3                    	mov	bl, dl
  1498 00000BB0 C0EB04                  	shr	bl, 4
  1499 00000BB3 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1500 00000BB9 A2[2D0E0000]            	mov	[msgBusNo], al
  1501                                  
  1502                                  	; 24/06/2017
  1503 00000BBE 66A1[840E0000]          	mov	ax, [ac97_NamBar]
  1504 00000BC4 88C3                    	mov	bl, al
  1505 00000BC6 88DA                    	mov	dl, bl
  1506 00000BC8 80E30F                  	and	bl, 0Fh
  1507 00000BCB 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1508 00000BD1 A2[570E0000]            	mov	[msgNamBar+3], al
  1509 00000BD6 88D3                    	mov	bl, dl
  1510 00000BD8 C0EB04                  	shr	bl, 4
  1511 00000BDB 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1512 00000BE1 A2[560E0000]            	mov	[msgNamBar+2], al
  1513 00000BE6 88E3                    	mov	bl, ah
  1514 00000BE8 88DA                    	mov	dl, bl
  1515 00000BEA 80E30F                  	and	bl, 0Fh
  1516 00000BED 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1517 00000BF3 A2[550E0000]            	mov	[msgNamBar+1], al
  1518 00000BF8 88D3                    	mov	bl, dl
  1519 00000BFA C0EB04                  	shr	bl, 4
  1520 00000BFD 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1521 00000C03 A2[540E0000]            	mov	[msgNamBar], al
  1522                                  
  1523 00000C08 66A1[860E0000]          	mov	ax, [ac97_NabmBar]
  1524 00000C0E 88C3                    	mov	bl, al
  1525 00000C10 88DA                    	mov	dl, bl
  1526 00000C12 80E30F                  	and	bl, 0Fh
  1527 00000C15 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1528 00000C1B A2[670E0000]            	mov	[msgNabmBar+3], al
  1529 00000C20 88D3                    	mov	bl, dl
  1530 00000C22 C0EB04                  	shr	bl, 4
  1531 00000C25 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1532 00000C2B A2[660E0000]            	mov	[msgNabmBar+2], al
  1533 00000C30 88E3                    	mov	bl, ah
  1534 00000C32 88DA                    	mov	dl, bl
  1535 00000C34 80E30F                  	and	bl, 0Fh
  1536 00000C37 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1537 00000C3D A2[650E0000]            	mov	[msgNabmBar+1], al
  1538 00000C42 88D3                    	mov	bl, dl
  1539 00000C44 C0EB04                  	shr	bl, 4
  1540 00000C47 8A83[CE0D0000]          	mov	al, [ebx+hex_chars]
  1541 00000C4D A2[640E0000]            	mov	[msgNabmBar], al
  1542                                  
  1543                                  	; 24/11/2016
  1544 00000C52 30E4                    	xor	ah, ah
  1545 00000C54 A0[880E0000]            	mov	al, [ac97_int_ln_reg]
  1546 00000C59 B10A                    	mov	cl, 10
  1547 00000C5B F6F1                    	div	cl
  1548 00000C5D 660105[700E0000]        	add	[msgIRQ], ax
  1549 00000C64 20C0                    	and	al, al
  1550 00000C66 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1551 00000C68 A0[710E0000]            	mov	al, [msgIRQ+1]
  1552 00000C6D B420                    	mov	ah, ' '
  1553 00000C6F 66A3[700E0000]          	mov	[msgIRQ], ax
  1554                                  _w_ac97imsg_:
  1555                                  	; EBX = Message address
  1556                                  	; ECX = Max. message length (or stop on ZERO character)
  1557                                  	;	(1 to 255)
  1558                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1559                                       	sys 	_msg, msgAC97Info, 255, 07h
  1559                              <1> 
  1559                              <1> 
  1559                              <1> 
  1559                              <1> 
  1559                              <1>  %if %0 >= 2
  1559 00000C75 BB[DF0D0000]        <1>  mov ebx, %2
  1559                              <1>  %if %0 >= 3
  1559 00000C7A B9FF000000          <1>  mov ecx, %3
  1559                              <1>  %if %0 = 4
  1559 00000C7F BA07000000          <1>  mov edx, %4
  1559                              <1>  %endif
  1559                              <1>  %endif
  1559                              <1>  %endif
  1559 00000C84 B823000000          <1>  mov eax, %1
  1559                              <1> 
  1559 00000C89 CD40                <1>  int 40h
  1560 00000C8B C3                              retn
  1561                                  
  1562                                  ;=============================================================================
  1563                                  ;               preinitialized data
  1564                                  ;=============================================================================
  1565                                  
  1566                                  ;=============================================================================
  1567                                  ;               PLAY.ASM - DATA
  1568                                  ;=============================================================================
  1569                                  
  1570                                  msg_2017:
  1571 00000C8C 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1571 00000C95 506C6179657220666F-
  1571 00000C9E 72205452444F532033-
  1571 00000CA7 383620627920457264-
  1571 00000CB0 6F67616E2054616E2E-
  1571 00000CB9 20                 
  1572 00000CBA 4A756E652032303137-     	db	'June 2017.',10,13
  1572 00000CC3 2E0A0D             
  1573 00000CC6 75736167653A206D6F-     	db	'usage: modplay filename.mod', 10,13,0
  1573 00000CCF 64706C61792066696C-
  1573 00000CD8 656E616D652E6D6F64-
  1573 00000CE1 0A0D00             
  1574 00000CE4 32342F30362F323031-     	db	'24/06/2017',10,13,0
  1574 00000CED 370A0D00           
  1575                                  
  1576 00000CF1 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1576 00000CFA 506C61796572207630-
  1576 00000D03 2E3162206279204361-
  1576 00000D0C 726C6F732048617361-
  1576 00000D15 6E2E204A756C792031-
  1576 00000D1E 3939332E           
  1577 00000D22 0A0D00                  		db	10,13,0
  1578 00000D25 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1578 00000D2E 64696E67204D6F6475-
  1578 00000D37 6C652066696C652E0A-
  1578 00000D40 0D00               
  1579                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1580                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1581                                  ;PortText:	db	'x0h, IRQ '
  1582                                  ;IrqText:	db	'x.',10,13,0
  1583                                  
  1584                                  trdos386_err_msg:
  1585 00000D42 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1585 00000D4B 2053797374656D2063-
  1585 00000D54 616C6C206572726F72-
  1585 00000D5D 20210A0D00         
  1586                                  
  1587                                  ;=============================================================================
  1588                                  ;               MODPLAY.ASM - DATA
  1589                                  ;=============================================================================
  1590                                  
  1591                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1592                                  
  1593 00000D62 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1593 00000D6B C5D4E1             
  1594 00000D6E ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1594 00000D77 E1                 
  1595 00000D78 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1595 00000D81 19                 
  1596                                  
  1597 00000D82 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1597 00000D8B 0280025C023A021A02-
  1597 00000D94 FC01E001C501       
  1598 00000D9A AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1598 00000DA3 0140012E011D010D01-
  1598 00000DAC FE00F000E200       
  1599 00000DB2 D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1599 00000DBB 00A00097008F008700-
  1599 00000DC4 7F0078007100       
  1600                                  
  1601                                  ;=============================================================================
  1602                                  ;               PLAYER.ASM - DATA
  1603                                  ;=============================================================================
  1604                                  
  1605 00000DCA 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1606 00000DCB 08                      bps:		db 8 ; bits per sample (8 or 16)
  1607                                  Sample_Rate:
  1608 00000DCC 2256                    MixSpeed:	dw 22050 ; Hz
  1609                                  
  1610                                  ; 13/11/2016
  1611 00000DCE 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1611 00000DD7 3941424344454600   
  1612                                  ;
  1613                                  msgAC97Info:	
  1614 00000DDF 0D0A                    		db 0Dh, 0Ah
  1615 00000DE1 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1615 00000DEA 6F20436F6E74726F6C-
  1615 00000DF3 6C6572202620436F64-
  1615 00000DFC 656320496E666F0D0A 
  1616 00000E05 56656E646F72204944-     		db "Vendor ID: "
  1616 00000E0E 3A20               
  1617 00000E10 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1617 00000E19 6963652049443A20   
  1618 00000E21 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1619 00000E28 4275733A20              		db "Bus: "
  1620 00000E2D 303068204465766963-     msgBusNo:	db "00h Device: "
  1620 00000E36 653A20             
  1621 00000E39 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1621 00000E42 696F6E3A20         
  1622 00000E47 303068                  msgFncNo	db "00h"
  1623 00000E4A 0D0A                    		db 0Dh, 0Ah
  1624 00000E4C 4E414D4241523A20        		db "NAMBAR: "
  1625 00000E54 30303030682020          msgNamBar	db "0000h  "
  1626 00000E5B 4E41424D4241523A20      		db "NABMBAR: "
  1627 00000E64 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  1627 00000E6D 513A20             
  1628 00000E70 3030                    msgIRQ:		dw 3030h
  1629 00000E72 0D0A00                  		db 0Dh, 0Ah, 0
  1630                                  
  1631                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1632                                  ;codec_id:	   dd 0
  1633                                  ;codec_chip_id:	   dd 0
  1634                                  ;codec_vendor_ids: dw 0
  1635                                  ;codec_chip_ids:   dw 0
  1636                                  
  1637                                  ;dword_str:	dd 30303030h, 30303030h
  1638                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1639                                  
  1640                                  ;=============================================================================
  1641                                  ;        	uninitialized data
  1642                                  ;=============================================================================
  1643                                  
  1644                                  bss_start:
  1645                                  
  1646                                  ABSOLUTE bss_start
  1647                                  
  1648 00000E75 <res 00000003>          alignb 4
  1649                                  
  1650 00000E78 <res 00000004>          dev_vendor:	resd 1
  1651 00000E7C <res 00000004>          bus_dev_fn:	resd 1
  1652 00000E80 <res 00000004>          stats_cmd:	resd 1
  1653 00000E84 <res 00000002>          ac97_NamBar:	resw 1
  1654 00000E86 <res 00000002>          ac97_NabmBar:	resw 1
  1655 00000E88 <res 00000001>          ac97_int_ln_reg: resb 1
  1656 00000E89 <res 00000001>          srb:		resb 1
  1657                                  
  1658                                  ; MODLOAD.ASM
  1659 00000E8A <res 00000002>          FileHandle:	resw 1
  1660 00000E8C <res 00000002>          ErrorInfo:	resw 1
  1661 00000E8E <res 0000043C>          Header:	resb	ModHeader.size
  1662                                  
  1663                                  ; MODPLAY.ASM
  1664                                  ;MixSpeed:	    resw 1
  1665                                  
  1666                                  ModInfo:
  1667 000012CA <res 00000001>          ModInfo.OrderLen:   resb 1
  1668 000012CB <res 00000001>          ModInfo.ReStart:    resb 1
  1669 000012CC <res 00000080>          ModInfo.Order:	    resb 128
  1670 0000134C <res 00000004>          ModInfo.Patterns:   resd 1
  1671                                  
  1672 00001350 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1673 0000138E <res 0000003E>          ModInfo.SampSeg:    resw 31
  1674 000013CC <res 0000003E>          ModInfo.SampLen:    resw 31
  1675 0000140A <res 0000003E>          ModInfo.SampRep:    resw 31
  1676 00001448 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1677 00001486 <res 0000003E>          ModInfo.SampVol:    resw 31
  1678                                  
  1679                                  ; MODPLAY.ASM
  1680 000014C4 <res 000006B2>          PitchTable:	resw 857
  1681 00001B76 <res 00004100>          VolTable:	resb 16640
  1682 00005C76 <res 00001000>          MixBuffer       resb MixBufSize
  1683                                  
  1684                                  ; MODPLAY.ASM
  1685 00006C76 <res 00000001>          OrderPos:	resb 1
  1686 00006C77 <res 00000001>          Tempo:		resb 1
  1687 00006C78 <res 00000001>          TempoWait:	resb 1
  1688 00006C79 <res 00000001>          Bpm:		resb 1
  1689 00006C7A <res 00000001>          Row:		resb 1
  1690 00006C7B <res 00000001>          BreakRow:	resb 1
  1691 00006C7C <res 00000002>          BpmSamples:	resw 1
  1692 00006C7E <res 00000004>          BufPtr:		resd 1
  1693 00006C82 <res 00000002>          BufLen:		resw 1
  1694 00006C84 <res 00000004>          BufRep:		resd 1
  1695 00006C88 <res 00000004>          Note:		resd 1
  1696 00006C8C <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1697                                  
  1698 00006D1C <res 00000004>          alignb 16
  1699                                  
  1700                                  ; PLAY.ASM
  1701 00006D20 <res 00000280>          Scope:		resw 320
  1702 00006FA0 <res 00000200>          RowOfs:		resw 256
  1703                                  
  1704                                  mod_file_name:
  1705 000071A0 <res 00000050>          		resb 80
  1706                                  
  1707 000071F0 <res 00000E10>          alignb 4096
  1708                                  
  1709                                  g_buff:
  1710 00008000 <res 00000500>          		resb 320*4 ; 24/06/2017
  1711                                  
  1712 00008500 <res 00007B00>          alignb 65536
  1713                                  
  1714                                  Audio_Buffer:
  1715 00010000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1716                                  temp_buffer:
  1717 00018000 <res 00002000>          		resb BUFFERSIZE / 4 ; 8192
  1718                                  
  1719 0001A000 <res 00006000>          alignb 65536
  1720                                  
  1721                                  file_buffer:
  1722 00020000 <res 00060000>          		resb 65536*6
  1723                                  EOF:
