     1                                  ; ****************************************************************************
     2                                  ; playmod.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PLAYMOD.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 05/03/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 'wavplay2.s' (11/06/2017)
    14                                  ;
    15                                  ; Modified from 'TINYPLAY.PRG' ('tinyplay.s') source code by Erdogan Tan
    16                                  ;			                     (05/03/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  playmod.s -l playmod.txt -o PLAYMOD.PRG	
    23                                  ; ****************************************************************************
    24                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    25                                  
    26                                  ; 01/03/2017
    27                                  ; 16/10/2016
    28                                  ; 29/04/2016
    29                                  ; TRDOS 386 system calls (temporary list!)
    30                                  _ver 	equ 0
    31                                  _exit 	equ 1
    32                                  _fork 	equ 2
    33                                  _read 	equ 3
    34                                  _write	equ 4
    35                                  _open	equ 5
    36                                  _close 	equ 6
    37                                  _wait 	equ 7
    38                                  _creat 	equ 8
    39                                  _link 	equ 9
    40                                  _unlink	equ 10
    41                                  _exec	equ 11
    42                                  _chdir	equ 12
    43                                  _time 	equ 13
    44                                  _mkdir 	equ 14
    45                                  _chmod	equ 15
    46                                  _chown	equ 16
    47                                  _break	equ 17
    48                                  _stat	equ 18
    49                                  _seek	equ 19
    50                                  _tell 	equ 20
    51                                  _mount	equ 21
    52                                  _umount	equ 22
    53                                  _setuid	equ 23
    54                                  _getuid	equ 24
    55                                  _stime	equ 25
    56                                  _quit	equ 26	
    57                                  _intr	equ 27
    58                                  _fstat	equ 28
    59                                  _emt 	equ 29
    60                                  _mdate 	equ 30
    61                                  _video 	equ 31
    62                                  _audio	equ 32
    63                                  _timer	equ 33
    64                                  _sleep	equ 34
    65                                  _msg    equ 35
    66                                  _geterr	equ 36
    67                                  _fpsave	equ 37
    68                                  _pri	equ 38
    69                                  _rele	equ 39
    70                                  _fff	equ 40
    71                                  _fnf	equ 41
    72                                  _alloc	equ 42
    73                                  _dalloc equ 43
    74                                  _calbac equ 44		
    75                                  
    76                                  %macro sys 1-4
    77                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    78                                      ; 03/09/2015	
    79                                      ; 13/04/2015
    80                                      ; Retro UNIX 386 v1 system call.	
    81                                      %if %0 >= 2   
    82                                          mov ebx, %2
    83                                          %if %0 >= 3    
    84                                              mov ecx, %3
    85                                              %if %0 = 4
    86                                                 mov edx, %4   
    87                                              %endif
    88                                          %endif
    89                                      %endif
    90                                      mov eax, %1
    91                                      ;int 30h
    92                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    93                                  %endmacro
    94                                  
    95                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    96                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    97                                  
    98                                  ; 19/06/2017
    99                                  BUFFERSIZE equ 32768
   100                                  
   101                                  ; ----------------------------------------------------------------------------
   102                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   103                                  ;	July 14th, 1993.
   104                                  
   105                                  ;=============================================================================
   106                                  ;  
   107                                  ;=============================================================================
   108                                  
   109                                  [BITS 32]
   110                                  [org 0]
   111                                  
   112                                  Start:
   113                                  	; clear bss
   114 00000000 B9[00000900]            	mov	ecx, EOF
   115 00000005 BF[FF0D0000]            	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) VT8233 Audio Device
   122 00000013 E8D7010000              	call    DetectVT8233
   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[FC010000]        <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 E999010000                      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 0F8296010000            	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[30710000]            	mov	edi, mod_file_name
   141                                  ScanName:       
   142 0000004A AC                      	lodsb
   143 0000004B 84C0                    	test	al, al
   144 0000004D 0F8484010000            	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[820C0000]        <1>  mov ebx, %2
   167                              <1>  %if %0 >= 3
   167 0000007A B9FF000000          <1>  mov ecx, %3
   167                              <1>  %if %0 = 4
   167 0000007F BA0F000000          <1>  mov edx, %4
   167                              <1>  %endif
   167                              <1>  %endif
   167                              <1>  %endif
   167 00000084 B823000000          <1>  mov eax, %1
   167                              <1> 
   167 00000089 CD40                <1>  int 40h
   168                                  _1:
   169                                  	; 19/06/2017
   170                                  	; Allocate Audio Buffer (for user)
   171                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 0000008B BB00020000          <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 00000090 B900800000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 00000095 BA[00800000]        <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 0000009A B820000000          <1>  mov eax, %1
   171                              <1> 
   171 0000009F CD40                <1>  int 40h
   172 000000A1 0F82F9000000            	jc	error_exit
   173                                  _2:
   174                                  	; Initialize Audio Device
   175                                  	sys	_audio, 0301h, 0, ac97_int_handler 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1>  %if %0 >= 2
   175 000000A7 BB01030000          <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   175 000000AC B900000000          <1>  mov ecx, %3
   175                              <1>  %if %0 = 4
   175 000000B1 BA[33020000]        <1>  mov edx, %4
   175                              <1>  %endif
   175                              <1>  %endif
   175                              <1>  %endif
   175 000000B6 B820000000          <1>  mov eax, %1
   175                              <1> 
   175 000000BB CD40                <1>  int 40h
   176 000000BD 0F82DD000000            	jc	error_exit
   177                                  
   178                                  LoadMod:  
   179 000000C3 BF[30710000]            	mov	edi, mod_file_name
   180 000000C8 E807020000              	call    LoadModule		; Load the MODule...
   181                                  
   182 000000CD 66833D[120E0000]00      	cmp     word [ErrorInfo], 0	; any error loading?
   183 000000D5 741B                    	je      short short _3
   184                                  
   185                                  	; yes, print error and Exit.
   186                                  
   187                                  	sys	_msg, ErrorMesg, 255, 0Fh
   187                              <1> 
   187                              <1> 
   187                              <1> 
   187                              <1> 
   187                              <1>  %if %0 >= 2
   187 000000D7 BB[B60C0000]        <1>  mov ebx, %2
   187                              <1>  %if %0 >= 3
   187 000000DC B9FF000000          <1>  mov ecx, %3
   187                              <1>  %if %0 = 4
   187 000000E1 BA0F000000          <1>  mov edx, %4
   187                              <1>  %endif
   187                              <1>  %endif
   187                              <1>  %endif
   187 000000E6 B823000000          <1>  mov eax, %1
   187                              <1> 
   187 000000EB CD40                <1>  int 40h
   188                                  
   189 000000ED E9DC000000              	jmp     Exit
   190                                  
   191                                  _3:
   192                                  	; 10/06/2017
   193                                  	sys	_audio, 0E00h ; get audio controller info
   193                              <1> 
   193                              <1> 
   193                              <1> 
   193                              <1> 
   193                              <1>  %if %0 >= 2
   193 000000F2 BB000E0000          <1>  mov ebx, %2
   193                              <1>  %if %0 >= 3
   193                              <1>  mov ecx, %3
   193                              <1>  %if %0 = 4
   193                              <1>  mov edx, %4
   193                              <1>  %endif
   193                              <1>  %endif
   193                              <1>  %endif
   193 000000F7 B820000000          <1>  mov eax, %1
   193                              <1> 
   193 000000FC CD40                <1>  int 40h
   194 000000FE 0F829C000000            	jc	error_exit
   195                                  
   196                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   197                                  	;jne	_dev_not_ready	
   198                                  
   199                                  	; EAX = IRQ Number in AL
   200                                  	;	Audio Device Number in AH 
   201                                  	; EBX = DEV/VENDOR ID
   202                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   203                                  	; ECX = BUS/DEV/FN 
   204                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   205                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   206                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   207                                  	;      (Low word, DX = NAMBAR address)
   208                                  
   209 00000104 A2[0E0E0000]            	mov	[ac97_int_ln_reg], al
   210 00000109 891D[000E0000]          	mov	[dev_vendor], ebx
   211 0000010F 890D[040E0000]          	mov	[bus_dev_fn], ecx
   212 00000115 668915[0C0E0000]        	mov	[ac97_io_base], dx
   213                                    
   214 0000011C E87B090000              	call	write_audio_dev_info 
   215                                  
   216                                  PlayNow: 
   217 00000121 E8A1080000              	call    StartPlaying
   218                                  
   219                                         ; load 32768 bytes into audio buffer
   220 00000126 BF[00800000]            	mov     edi, Audio_Buffer
   221 0000012B BB00800000              	mov	ebx, BUFFERSIZE
   222 00000130 E815080000              	call	GetSamples
   223 00000135 7269                    	jc	error_exit
   224                                  
   225                                  	;mov	ecx, 128	; Make a lookup table
   226 00000137 B180                    	mov	cl, 128
   227 00000139 31DB                    	xor     ebx, ebx	; for fastest pixel
   228 0000013B BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   229                                  MakeOfs:        
   230 00000140 668993[306F0000]        	mov     [RowOfs+ebx], dx
   231 00000147 668993[326F0000]        	mov     [RowOfs+ebx+2], dx
   232 0000014E 6681C24001              	add     dx, 320
   233 00000153 83C304                  	add     ebx, 4
   234 00000156 E2E8                    	loop    MakeOfs
   235                                  
   236                                  	; Set Master Volume Level
   237                                  	sys	_audio, 0B00h, 1D1Dh
   237                              <1> 
   237                              <1> 
   237                              <1> 
   237                              <1> 
   237                              <1>  %if %0 >= 2
   237 00000158 BB000B0000          <1>  mov ebx, %2
   237                              <1>  %if %0 >= 3
   237 0000015D B91D1D0000          <1>  mov ecx, %3
   237                              <1>  %if %0 = 4
   237                              <1>  mov edx, %4
   237                              <1>  %endif
   237                              <1>  %endif
   237                              <1>  %endif
   237 00000162 B820000000          <1>  mov eax, %1
   237                              <1> 
   237 00000167 CD40                <1>  int 40h
   238                                  
   239                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   240                                  	
   241                                  	; Start	to play
   242 00000169 A0[5C0D0000]            	mov	al, [bps]
   243 0000016E C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   244 00000171 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   245 00000173 8A1D[5B0D0000]          	mov	bl, [stmo]
   246 00000179 FECB                    	dec	bl
   247 0000017B 08C3                    	or	bl, al
   248 0000017D 668B0D[5D0D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   249 00000184 B704                    	mov	bh, 4 ; start to play	
   250                                  	sys	_audio
   250                              <1> 
   250                              <1> 
   250                              <1> 
   250                              <1> 
   250                              <1>  %if %0 >= 2
   250                              <1>  mov ebx, %2
   250                              <1>  %if %0 >= 3
   250                              <1>  mov ecx, %3
   250                              <1>  %if %0 = 4
   250                              <1>  mov edx, %4
   250                              <1>  %endif
   250                              <1>  %endif
   250                              <1>  %endif
   250 00000186 B820000000          <1>  mov eax, %1
   250                              <1> 
   250 0000018B CD40                <1>  int 40h
   251                                      
   252                                  	;; SETUP SIGNAL RESPONSE BYTE
   253                                  	;; 06/03/2017
   254                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   255                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   256                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   257                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   258                                  	;sys	_calbac
   259                                  	;jc	short error_exit
   260                                  
   261                                  	; DIRECT VGA MEMORY ACCESS
   262                                  	; bl = 0, bh = 5
   263                                  	; Direct access/map to VGA memory (0A0000h)
   264                                  
   265                                  	sys	_video, 0500h
   265                              <1> 
   265                              <1> 
   265                              <1> 
   265                              <1> 
   265                              <1>  %if %0 >= 2
   265 0000018D BB00050000          <1>  mov ebx, %2
   265                              <1>  %if %0 >= 3
   265                              <1>  mov ecx, %3
   265                              <1>  %if %0 = 4
   265                              <1>  mov edx, %4
   265                              <1>  %endif
   265                              <1>  %endif
   265                              <1>  %endif
   265 00000192 B81F000000          <1>  mov eax, %1
   265                              <1> 
   265 00000197 CD40                <1>  int 40h
   266 00000199 3D00000A00              	cmp	eax, 0A0000h
   267 0000019E 7418                    	je	short _a3
   268                                  error_exit:
   269                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   269                              <1> 
   269                              <1> 
   269                              <1> 
   269                              <1> 
   269                              <1>  %if %0 >= 2
   269 000001A0 BB[D30C0000]        <1>  mov ebx, %2
   269                              <1>  %if %0 >= 3
   269 000001A5 B9FF000000          <1>  mov ecx, %3
   269                              <1>  %if %0 = 4
   269 000001AA BA0E000000          <1>  mov edx, %4
   269                              <1>  %endif
   269                              <1>  %endif
   269                              <1>  %endif
   269 000001AF B823000000          <1>  mov eax, %1
   269                              <1> 
   269 000001B4 CD40                <1>  int 40h
   270 000001B6 EB16                    	jmp	short Exit
   271                                  
   272                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   273                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   274                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   275                                  ;       second, or the module will sound "looped".
   276                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   277                                  ;       the polling is called from my routine, and then the irq 0 must be
   278                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   279                                  ;       samples played by the Sound Blaster. Note that some samples are
   280                                  ;       discarded in the next code, just for fun!
   281                                  
   282                                  _a3:
   283 000001B8 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   284 000001BC CD31                    	int     31h
   285                                  
   286 000001BE E885000000              	call	ModPlay ; 13/02/2017
   287                                  
   288                                  _s_exit:
   289 000001C3 E8A3080000              	call	StopPlaying	; STOP!
   290                                  
   291 000001C8 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   292 000001CC CD31                    	int     31h
   293                                  Exit:           
   294                                  	;call    FreeModule	; Free MODule core.
   295                                  	
   296                                  	sys 	_exit	; Bye !
   296                              <1> 
   296                              <1> 
   296                              <1> 
   296                              <1> 
   296                              <1>  %if %0 >= 2
   296                              <1>  mov ebx, %2
   296                              <1>  %if %0 >= 3
   296                              <1>  mov ecx, %3
   296                              <1>  %if %0 = 4
   296                              <1>  mov edx, %4
   296                              <1>  %endif
   296                              <1>  %endif
   296                              <1>  %endif
   296 000001CE B801000000          <1>  mov eax, %1
   296                              <1> 
   296 000001D3 CD40                <1>  int 40h
   297                                  here:
   298 000001D5 EBFE                    	jmp	short here
   299                                  
   300                                  pmsg_2017:
   301                                  	sys	_msg, msg_2017, 255, 0Fh
   301                              <1> 
   301                              <1> 
   301                              <1> 
   301                              <1> 
   301                              <1>  %if %0 >= 2
   301 000001D7 BB[1D0C0000]        <1>  mov ebx, %2
   301                              <1>  %if %0 >= 3
   301 000001DC B9FF000000          <1>  mov ecx, %3
   301                              <1>  %if %0 = 4
   301 000001E1 BA0F000000          <1>  mov edx, %4
   301                              <1>  %endif
   301                              <1>  %endif
   301                              <1>  %endif
   301 000001E6 B823000000          <1>  mov eax, %1
   301                              <1> 
   301 000001EB CD40                <1>  int 40h
   302 000001ED EBDF                    	jmp	short Exit
   303                                  
   304                                  DetectVT8233:
   305                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   306                                          sys	_audio, 0103h
   306                              <1> 
   306                              <1> 
   306                              <1> 
   306                              <1> 
   306                              <1>  %if %0 >= 2
   306 000001EF BB03010000          <1>  mov ebx, %2
   306                              <1>  %if %0 >= 3
   306                              <1>  mov ecx, %3
   306                              <1>  %if %0 = 4
   306                              <1>  mov edx, %4
   306                              <1>  %endif
   306                              <1>  %endif
   306                              <1>  %endif
   306 000001F4 B820000000          <1>  mov eax, %1
   306                              <1> 
   306 000001F9 CD40                <1>  int 40h
   307 000001FB C3                      	retn
   308                                  
   309                                  noDevMsg:
   310 000001FC 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   310 00000205 61626C6520746F2066-
   310 0000020E 696E64205649412056-
   310 00000217 543832333320626173-
   310 00000220 656420617564696F20-
   310 00000229 646576696365210D0A-
   310 00000232 00                 
   311                                  
   312                                  ac97_int_handler:
   313                                  	; 19/06/2017
   314 00000233 C605[0F0E0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   315                                  
   316                                  	sys	_rele ; return from callback service 
   316                              <1> 
   316                              <1> 
   316                              <1> 
   316                              <1> 
   316                              <1>  %if %0 >= 2
   316                              <1>  mov ebx, %2
   316                              <1>  %if %0 >= 3
   316                              <1>  mov ecx, %3
   316                              <1>  %if %0 = 4
   316                              <1>  mov edx, %4
   316                              <1>  %endif
   316                              <1>  %endif
   316                              <1>  %endif
   316 0000023A B827000000          <1>  mov eax, %1
   316                              <1> 
   316 0000023F CD40                <1>  int 40h
   317                                  	; we must not come here !
   318                                  	sys	_exit
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1>  %if %0 >= 2
   318                              <1>  mov ebx, %2
   318                              <1>  %if %0 >= 3
   318                              <1>  mov ecx, %3
   318                              <1>  %if %0 = 4
   318                              <1>  mov edx, %4
   318                              <1>  %endif
   318                              <1>  %endif
   318                              <1>  %endif
   318 00000241 B801000000          <1>  mov eax, %1
   318                              <1> 
   318 00000246 CD40                <1>  int 40h
   319                                  
   320                                  ;=============================================================================
   321                                  ;      
   322                                  ;=============================================================================
   323                                  
   324                                  ModPlay:
   325                                  	; 23/06/2017   
   326                                  	; 21/06/2017
   327                                  	; 19/06/2017
   328                                  
   329                                  	; 05/03/2017 (TRDOS 386)
   330                                  	; 14/02/2017
   331                                  	; 13/02/2017
   332                                  	; 08/12/2016
   333                                  	; 28/11/2016
   334                                  
   335 00000248 EB10                         	jmp	short modp_gs ; 23/06/2017
   336                                  p_loop:
   337 0000024A 803D[0F0E0000]00        	cmp	byte [srb], 0
   338 00000251 7616                    	jna	short q_loop
   339 00000253 C605[0F0E0000]00        	mov	byte [srb], 0
   340                                  modp_gs:
   341 0000025A BF[00800000]            	mov     edi, Audio_Buffer
   342 0000025F BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   343 00000264 E8E1060000              	call    GetSamples
   344                                  q_loop:
   345 00000269 B401                    	mov     ah, 1		; any key pressed?
   346 0000026B CD32                    	int     32h		; no, Loop.
   347 0000026D 7405                    	jz	short r_loop
   348                                  
   349 0000026F B400                    	mov     ah, 0		; flush key buffer...
   350 00000271 CD32                    	int     32h
   351                                  q_return:
   352 00000273 C3                      	retn
   353                                  r_loop:
   354                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   355                                  	; 23/06/2017
   356                                  	; 22/06/2017
   357                                  	; bh = 15, get current sound data/samples
   358                                  	; bl = 0, for PCM OUT
   359                                  	; ecx = count of sample/data bytes (1 to 4096)
   360                                  	; edx = destination buffer address 
   361                                  	;	(page aligned address is better)
   362                                  	;
   363                                  	sys	_audio, 0F00h, 320, g_buff
   363                              <1> 
   363                              <1> 
   363                              <1> 
   363                              <1> 
   363                              <1>  %if %0 >= 2
   363 00000274 BB000F0000          <1>  mov ebx, %2
   363                              <1>  %if %0 >= 3
   363 00000279 B940010000          <1>  mov ecx, %3
   363                              <1>  %if %0 = 4
   363 0000027E BA[00000100]        <1>  mov edx, %4
   363                              <1>  %endif
   363                              <1>  %endif
   363                              <1>  %endif
   363 00000283 B820000000          <1>  mov eax, %1
   363                              <1> 
   363 00000288 CD40                <1>  int 40h
   364                                  ScopeLoop:
   365 0000028A BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   366                                  	; 19/06/2017
   367 0000028F BE[00000100]            	mov     esi, g_buff	; display current samples
   368 00000294 31C9                    	xor     ecx, ecx	; to be drawed ...
   369 00000296 31D2                    	xor     edx, edx
   370                                  DrawLoop:       
   371 00000298 89D3                    	mov     ebx, edx	; (save Index)
   372 0000029A 668BBB[B06C0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   373 000002A1 C60700                  	mov     byte [edi], 0	; erase it!
   374                                  	;lodsb
   375                                  	;mov	bl, al
   376 000002A4 8A1E                    	mov	bl, [esi]	; get a sample (8-bit)
   377 000002A6 46                      	inc	esi		; calc new pixel address...
   378 000002A7 30FF                    	xor     bh, bh
   379 000002A9 66D1E3                  	shl     bx, 1
   380 000002AC 668BBB[306F0000]        	mov     di, [RowOfs+ebx]
   381 000002B3 6601CF                  	add     di, cx
   382 000002B6 6689D3                  	mov     bx, dx		; (restore Index)
   383 000002B9 6689BB[B06C0000]        	mov     [Scope+ebx], di	; save new address...
   384 000002C0 C6070A                  	mov     byte [edi], 10	; and DRAW.
   385 000002C3 6683C202                	add     dx, 2		; the next pixel...
   386 000002C7 41                      	inc     ecx
   387 000002C8 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   388 000002CD 72C9                    	jb      short DrawLoop
   389 000002CF E976FFFFFF              	jmp	p_loop
   390                                  
   391                                  
   392                                  ;=============================================================================
   393                                  ;               MODLOAD.ASM
   394                                  ;=============================================================================
   395                                  
   396                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   397                                  ;	July 10th, 1993.
   398                                  
   399                                  ; STRUCTURES
   400                                  
   401                                  struc ModSample
   402 00000000 <res 00000016>          .msName:	resb 22
   403 00000016 <res 00000002>          .msLength:	resw 1
   404 00000018 <res 00000001>          .msFinetune:	resb 1
   405 00000019 <res 00000001>          .msVolume:	resb 1
   406 0000001A <res 00000002>          .msRepeat:	resw 1
   407 0000001C <res 00000002>          .msRepLen:	resw 1
   408                                  .size:
   409                                  endstruc
   410                                  
   411                                  struc ModHeader
   412 00000000 <res 00000014>          .mhName:	resb 20
   413 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   414 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   415 000003B7 <res 00000001>          .mhReStart:	resb 1
   416 000003B8 <res 00000080>          .mhOrder:	resb 128
   417 00000438 <res 00000004>          .mhSign:	resw 2
   418                                  .size:	
   419                                  endstruc
   420                                  
   421                                  struc ModInfoRec
   422 00000000 <res 00000001>          .OrderLen:	resb 1
   423 00000001 <res 00000001>          .ReStart:	resb 1
   424 00000002 <res 00000080>          .Order:	resb 128
   425 00000082 <res 00000004>          .Patterns:	resd 1
   426 00000086 <res 0000003E>          .SampOfs:	resw 31
   427 000000C4 <res 0000003E>          .SampSeg:	resw 31
   428 00000102 <res 0000003E>          .SampLen:	resw 31
   429 00000140 <res 0000003E>          .SampRep:	resw 31
   430 0000017E <res 0000003E>          .SampRepLen:	resw 31
   431 000001BC <res 0000003E>          .SampVol:	resw 31
   432                                  .size:	
   433                                  endstruc
   434                                  
   435                                  ; CODE
   436                                  
   437                                  LoadModule:
   438                                  	; edi = file name address
   439                                  
   440 000002D4 60                      	pushad
   441                                  
   442 000002D5 66C705[120E0000]01-     	mov	word [ErrorInfo], 1
   442 000002DD 00                 
   443                                  
   444 000002DE E88F010000              	call    ClearModInfo
   445                                  OpenFile:       
   446                                  	; ebx = ASCIIZ file name address
   447                                  	; ecx = open mode (0 = open for read)	
   448                                  	sys	_open, edi, 0 ; open for reading
   448                              <1> 
   448                              <1> 
   448                              <1> 
   448                              <1> 
   448                              <1>  %if %0 >= 2
   448 000002E3 89FB                <1>  mov ebx, %2
   448                              <1>  %if %0 >= 3
   448 000002E5 B900000000          <1>  mov ecx, %3
   448                              <1>  %if %0 = 4
   448                              <1>  mov edx, %4
   448                              <1>  %endif
   448                              <1>  %endif
   448                              <1>  %endif
   448 000002EA B805000000          <1>  mov eax, %1
   448                              <1> 
   448 000002EF CD40                <1>  int 40h
   449 000002F1 0F8279010000            	jc	Failed
   450 000002F7 A3[100E0000]            	mov     [FileHandle], eax
   451                                  ReadHeader:
   452                                  	; ebx = File handle
   453                                  	; ecx = Buffer address
   454                                  	; edx = Byte count
   455                                  	sys	_read, [FileHandle], Header, ModHeader.size
   455                              <1> 
   455                              <1> 
   455                              <1> 
   455                              <1> 
   455                              <1>  %if %0 >= 2
   455 000002FC 8B1D[100E0000]      <1>  mov ebx, %2
   455                              <1>  %if %0 >= 3
   455 00000302 B9[140E0000]        <1>  mov ecx, %3
   455                              <1>  %if %0 = 4
   455 00000307 BA3C040000          <1>  mov edx, %4
   455                              <1>  %endif
   455                              <1>  %endif
   455                              <1>  %endif
   455 0000030C B803000000          <1>  mov eax, %1
   455                              <1> 
   455 00000311 CD40                <1>  int 40h
   456 00000313 0F824A010000            	jc      CloseFile
   457                                  CheckMK:        
   458 00000319 813D[4C120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   458 00000321 4B2E               
   459 00000323 7440                    	je      short IsModFile
   460                                  CheckFLT4:
   461 00000325 813D[4C120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   461 0000032D 5434               
   462 0000032F 7434                    	je      short IsModFile
   463                                  Is15Inst:
   464 00000331 BE[EA0F0000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   465 00000336 BF[CA110000]            	mov     edi, Header+ModHeader.mhOrderLen
   466                                  	;cld
   467                                  	;mov	ecx, 130
   468 0000033B 66B98200                	mov	cx, 130
   469 0000033F F3A4                    	rep     movsb
   470 00000341 BF[EA0F0000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   471 00000346 30C0                    	xor     al, al
   472 00000348 66B9E001                	mov     cx, 16*ModSample.size
   473 0000034C F3AA                    	rep     stosb
   474                                  SeekPatterns:   
   475                                  	; ebx = [FileHandle]
   476                                  	; ecx = offset
   477                                  	; edx = switch (0 = from beginning)
   478                                  	sys	_seek, [FileHandle], 600, 0
   478                              <1> 
   478                              <1> 
   478                              <1> 
   478                              <1> 
   478                              <1>  %if %0 >= 2
   478 0000034E 8B1D[100E0000]      <1>  mov ebx, %2
   478                              <1>  %if %0 >= 3
   478 00000354 B958020000          <1>  mov ecx, %3
   478                              <1>  %if %0 = 4
   478 00000359 BA00000000          <1>  mov edx, %4
   478                              <1>  %endif
   478                              <1>  %endif
   478                              <1>  %endif
   478 0000035E B813000000          <1>  mov eax, %1
   478                              <1> 
   478 00000363 CD40                <1>  int 40h
   479                                  IsModFile:
   480 00000365 A0[CA110000]            	mov     al, [Header+ModHeader.mhOrderLen]
   481 0000036A A2[50120000]            	mov     [ModInfo.OrderLen], al
   482                                  
   483 0000036F A0[CB110000]            	mov     al, [Header+ModHeader.mhReStart]
   484 00000374 3A05[CA110000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   485 0000037A 7202                    	jb      short SetReStart
   486 0000037C B07F                    	mov     al, 7Fh
   487                                  SetReStart:
   488 0000037E A2[51120000]            	mov     [ModInfo.ReStart], al
   489                                  
   490                                  	;mov	ecx, 128
   491 00000383 66B98000                	mov	cx, 128
   492 00000387 31D2                    	xor     edx, edx
   493 00000389 31DB                    	xor     ebx, ebx
   494                                  CopyOrder:
   495 0000038B 8AB3[CC110000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   496 00000391 88B3[52120000]          	mov     [ModInfo.Order+ebx], dh
   497 00000397 38D6                    	cmp     dh, dl
   498 00000399 7202                    	jb      short NextOrder
   499 0000039B 88F2                    	mov     dl, dh
   500                                  NextOrder:
   501 0000039D 43                      	inc     ebx
   502 0000039E E2EB                    	loop    CopyOrder
   503                                  AllocPatterns:  
   504 000003A0 81E2FF000000            	and	edx, 0FFh
   505 000003A6 6642                    	inc	dx ; 14/03/2017
   506                                  	; dl = count of 1024 bytes
   507 000003A8 C1E20A                  	shl	edx, 10 ; *1024
   508                                  
   509 000003AB 89D5                    	mov	ebp, edx
   510                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   511 000003AD B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   512                                  	;
   513 000003B2 890D[D2120000]          	mov	[ModInfo.Patterns], ecx
   514                                  	;
   515 000003B8 01CD                    	add	ebp, ecx ; next offset for samples
   516                                  ReadPatterns:  
   517                                  	;mov	ebx, [FileHandle] 
   518                                  	; ebx = File handle
   519                                  	; ecx = Buffer address
   520                                  	; edx = Byte count
   521                                  	sys	_read, [FileHandle]
   521                              <1> 
   521                              <1> 
   521                              <1> 
   521                              <1> 
   521                              <1>  %if %0 >= 2
   521 000003BA 8B1D[100E0000]      <1>  mov ebx, %2
   521                              <1>  %if %0 >= 3
   521                              <1>  mov ecx, %3
   521                              <1>  %if %0 = 4
   521                              <1>  mov edx, %4
   521                              <1>  %endif
   521                              <1>  %endif
   521                              <1>  %endif
   521 000003C0 B803000000          <1>  mov eax, %1
   521                              <1> 
   521 000003C5 CD40                <1>  int 40h
   522 000003C7 0F8296000000            	jc      CloseFile
   523                                  
   524 000003CD BE[280E0000]            	mov	esi, Header+ModHeader.mhSamples
   525 000003D2 31FF                    	xor     edi, edi
   526                                  CopySamples:
   527 000003D4 668B4616                	mov     ax, [esi+ModSample.msLength]
   528 000003D8 86C4                    	xchg    al, ah
   529 000003DA 66D1E0                  	shl     ax, 1
   530 000003DD 668987[52130000]        	mov     [ModInfo.SampLen+edi], ax
   531 000003E4 8A4619                  	mov     al, [esi+ModSample.msVolume]
   532 000003E7 30E4                    	xor     ah, ah
   533 000003E9 668987[0C140000]        	mov     [ModInfo.SampVol+edi], ax
   534 000003F0 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   535 000003F4 86C4                    	xchg    al, ah
   536 000003F6 66D1E0                  	shl     ax, 1
   537 000003F9 668987[90130000]        	mov     [ModInfo.SampRep+edi], ax
   538 00000400 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   539 00000404 86C4                    	xchg    al, ah
   540 00000406 66D1E0                  	shl     ax, 1
   541 00000409 668987[CE130000]        	mov     [ModInfo.SampRepLen+edi], ax
   542 00000410 83C61E                  	add     esi, ModSample.size
   543 00000413 6683C702                	add     di, 2
   544 00000417 6683FF3E                	cmp     di, 2*31
   545 0000041B 72B7                    	jb      short CopySamples
   546                                  
   547 0000041D 31F6                    	xor     esi, esi
   548                                  AllocSamples:
   549 0000041F 0FB796[52130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   550 00000426 09D2                    	or	edx, edx ; byte count
   551 00000428 7426                    	jz      short NextSample
   552 0000042A 89E8                    	mov	eax, ebp
   553 0000042C 668986[D6120000]        	mov	[ModInfo.SampOfs+esi], ax
   554 00000433 C1E810                  	shr	eax, 16
   555 00000436 668986[14130000]        	mov	[ModInfo.SampSeg+esi], ax
   556 0000043D 89E9                    	mov	ecx, ebp
   557 0000043F 01D5                    	add	ebp, edx ; next offset for sample 
   558                                  ReadSample:
   559                                  	;mov	ebx, [FileHandle]
   560                                  	;movzx  edx, [ModInfo.SampLen+esi]
   561                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   562                                  
   563                                  	; ebx = File handle
   564                                  	; ecx = Buffer address
   565                                  	; edx = Byte count
   566                                  	sys	_read, [FileHandle]
   566                              <1> 
   566                              <1> 
   566                              <1> 
   566                              <1> 
   566                              <1>  %if %0 >= 2
   566 00000441 8B1D[100E0000]      <1>  mov ebx, %2
   566                              <1>  %if %0 >= 3
   566                              <1>  mov ecx, %3
   566                              <1>  %if %0 = 4
   566                              <1>  mov edx, %4
   566                              <1>  %endif
   566                              <1>  %endif
   566                              <1>  %endif
   566 00000447 B803000000          <1>  mov eax, %1
   566                              <1> 
   566 0000044C CD40                <1>  int 40h
   567 0000044E 7213                    	jc      short CloseFile
   568                                  
   569                                  NextSample:
   570 00000450 6683C602                	add     si, 2
   571 00000454 6683FE3E                	cmp     si, 2*31
   572 00000458 72C5                    	jb      short AllocSamples
   573                                  
   574 0000045A 66C705[120E0000]00-     	mov     word [ErrorInfo], 0
   574 00000462 00                 
   575                                  CloseFile:      
   576                                  	sys	_close, [FileHandle]
   576                              <1> 
   576                              <1> 
   576                              <1> 
   576                              <1> 
   576                              <1>  %if %0 >= 2
   576 00000463 8B1D[100E0000]      <1>  mov ebx, %2
   576                              <1>  %if %0 >= 3
   576                              <1>  mov ecx, %3
   576                              <1>  %if %0 = 4
   576                              <1>  mov edx, %4
   576                              <1>  %endif
   576                              <1>  %endif
   576                              <1>  %endif
   576 00000469 B806000000          <1>  mov eax, %1
   576                              <1> 
   576 0000046E CD40                <1>  int 40h
   577                                  Failed:         
   578 00000470 61                      	popad
   579                                  
   580 00000471 C3                      	retn
   581                                  
   582                                  FreeModule:
   583                                  	; Erdogan Tan (13/02/2017)
   584                                  	; nothing to do here for memory de-allocation
   585                                  ClearModInfo:
   586 00000472 57                      	push	edi
   587 00000473 BF[50120000]            	mov	edi, ModInfo
   588 00000478 B9FA010000              	mov     ecx, ModInfoRec.size
   589                                  	;cld
   590 0000047D 30C0                    	xor     al, al
   591 0000047F F3AA                    	rep     stosb
   592 00000481 5F                      	pop	edi
   593 00000482 C3                      	retn
   594                                  
   595                                  ;=============================================================================
   596                                  ;               MODPLAY.ASM
   597                                  ;=============================================================================
   598                                  
   599                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   600                                  ;	July 23th, 1993.
   601                                  
   602                                  ; EQUATES
   603                                  
   604                                  NumTracks       equ 4
   605                                  DefTempo        equ 6
   606                                  DefBpm          equ 125
   607                                  MidCRate        equ 8448
   608                                  MixBufSize      equ 4096
   609                                  
   610                                  ; STRUCTURES
   611                                  
   612                                  struc TrackInfo
   613 00000000 <res 00000004>          .Samples:	resd 1
   614 00000004 <res 00000004>          .Position:	resd 1
   615 00000008 <res 00000002>          .Len:	resw 1
   616 0000000A <res 00000002>          .Repeat:	resw 1
   617 0000000C <res 00000002>          .RepLen:	resw 1
   618 0000000E <res 00000001>          .Volume: 	resb 1
   619 0000000F <res 00000001>          .Error:	resb 1
   620 00000010 <res 00000002>          .Period:	resw 1
   621 00000012 <res 00000002>          .Pitch:	resw 1
   622 00000014 <res 00000002>          .Effect:	resw 1
   623 00000016 <res 00000002>          .PortTo:	resw 1
   624 00000018 <res 00000001>          .PortParm:	resb 1
   625 00000019 <res 00000001>          .VibPos:	resb 1
   626 0000001A <res 00000001>          .VibParm:	resb 1
   627 0000001B <res 00000001>          .OldSampOfs:	resb 1
   628 0000001C <res 00000006>          .Arp:	resw 3
   629 00000022 <res 00000002>          .ArpIndex:	resw 1
   630                                  .size:
   631                                  endstruc
   632                                  
   633                                  ; CODE
   634                                  
   635                                  ;--------------------------------------------------------------------------
   636                                  ; BeatTrack:  Process the next beat in one track.
   637                                  ;  In:
   638                                  ;    ds:di -  Track info Address.
   639                                  ;--------------------------------------------------------------------------
   640                                  
   641                                  ; edi = Track info address
   642                                  
   643                                  BeatTrack:
   644 00000483 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   645 00000487 6685D2                  	test    dx, dx
   646 0000048A 743C                    	je      short None
   647 0000048C 80FE00                  	cmp     dh, 00h
   648 0000048F 7438                    	je      short Arpeggio
   649 00000491 80FE01                  	cmp     dh, 01h
   650 00000494 7451                    	je      short PortUp
   651 00000496 80FE02                  	cmp     dh, 02h
   652 00000499 7471                    	je      short PortDown
   653 0000049B 80FE03                  	cmp     dh, 03h
   654 0000049E 0F848E000000            	je      TonePort
   655 000004A4 80FE04                  	cmp     dh, 04h
   656 000004A7 0F84BD000000            	je      Vibrato
   657 000004AD 80FE05                  	cmp     dh, 05h
   658 000004B0 0F840E010000            	je      PortSlide
   659 000004B6 80FE06                  	cmp     dh, 06h
   660 000004B9 0F8412010000            	je      VibSlide
   661 000004BF 80FE0A                  	cmp     dh, 0Ah
   662 000004C2 0F8413010000            	je      VolSlide
   663                                  None:           
   664 000004C8 C3                      	retn
   665                                  Arpeggio:
   666 000004C9 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   667 000004CD 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   668 000004D2 66894712                	mov     [edi+TrackInfo.Pitch], ax
   669 000004D6 6683C302                	add     bx, 2
   670 000004DA 6683FB06                	cmp     bx, 6
   671 000004DE 7202                    	jb      short SetArpIndex
   672 000004E0 31DB                    	xor     ebx, ebx
   673                                  SetArpIndex:
   674 000004E2 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   675 000004E6 C3                      	retn
   676                                  PortUp:
   677 000004E7 30F6                    	xor     dh, dh
   678 000004E9 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   679 000004ED 6629D3                  	sub     bx, dx
   680 000004F0 6683FB71                	cmp     bx, 113
   681 000004F4 7D04                    	jge     short NotSmall
   682 000004F6 66BB7100                	mov     bx, 113
   683                                  NotSmall:
   684 000004FA 66895F10                	mov     [edi+TrackInfo.Period], bx
   685 000004FE 6601DB                  	add     bx, bx
   686 00000501 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   687 00000507 66894712                	mov     [edi+TrackInfo.Pitch], ax
   688 0000050B C3                      	retn
   689                                  PortDown:
   690 0000050C 30F6                    	xor     dh, dh
   691 0000050E 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   692 00000512 6601D3                  	add     bx, dx
   693 00000515 6681FB5803              	cmp     bx, 856
   694 0000051A 7E04                    	jle     short NotBig
   695 0000051C 66BB5803                	mov     bx, 856
   696 00000520 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   697 00000524 6601DB                  	add     bx, bx
   698 00000527 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   699 0000052D 66894712                	mov     [edi+TrackInfo.Pitch], ax
   700 00000531 C3                      	retn
   701                                  TonePort:
   702 00000532 30F6                    	xor     dh, dh
   703 00000534 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   704 00000538 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   705 0000053C 6639C3                  	cmp     bx, ax
   706 0000053F 7428                    	je      short NoPort
   707 00000541 7F0D                    	jg      short PortToUp
   708                                  PortToDown:     
   709 00000543 6601D3                  	add     bx, dx
   710 00000546 6639C3                  	cmp     bx, ax
   711 00000549 7E0D                    	jle     short SetPort
   712                                  FixPort:        
   713 0000054B 6689C3                  	mov     bx, ax
   714 0000054E EB08                    	jmp     short SetPort
   715                                  PortToUp:
   716 00000550 6629D3                  	sub     bx, dx
   717 00000553 6639C3                  	cmp     bx, ax
   718 00000556 7CF3                    	jl      short FixPort
   719                                  SetPort:        
   720 00000558 66895F10                	mov     [edi+TrackInfo.Period], bx
   721 0000055C 6601DB                  	add     bx, bx
   722 0000055F 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   723 00000565 66894712                	mov     [edi+TrackInfo.Pitch], ax
   724                                  NoPort:         
   725 00000569 C3                      	retn
   726                                  Vibrato:
   727 0000056A 88D6                    	mov     dh, dl
   728 0000056C 80E20F                  	and     dl, 0Fh
   729 0000056F C0EE04                  	shr     dh, 4
   730 00000572 C0E602                  	shl     dh, 2
   731 00000575 007719                  	add     [edi+TrackInfo.VibPos], dh
   732 00000578 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   733 0000057B 88F3                    	mov     bl, dh
   734 0000057D C0EB02                  	shr     bl, 2
   735 00000580 6683E31F                	and     bx, 1Fh
   736 00000584 678A87[F30C]            	mov     al, [SinTable+bx]
   737 00000589 F6E2                    	mul     dl
   738 0000058B 66D1C0                  	rol     ax, 1
   739 0000058E 86C4                    	xchg    al, ah
   740 00000590 80E401                  	and     ah, 1
   741 00000593 84F6                    	test    dh, dh
   742 00000595 7903                    	jns     short VibUp
   743 00000597 66F7D8                  	neg     ax
   744                                  VibUp:          
   745 0000059A 66034710                	add     ax, [edi+TrackInfo.Period]
   746 0000059E 6689C3                  	mov     bx, ax
   747 000005A1 6683FB71                	cmp     bx, 113
   748 000005A5 7D04                    	jge     short NoLoVib
   749 000005A7 66BB7100                	mov     bx, 113
   750                                  NoLoVib:        
   751 000005AB 6681FB5803              	cmp     bx, 856
   752 000005B0 7E04                    	jle     short NoHiVib
   753 000005B2 66BB5803                	mov     bx, 856
   754                                  NoHiVib:        
   755 000005B6 6601DB                  	add     bx, bx
   756 000005B9 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   757 000005BF 66894712                	mov     [edi+TrackInfo.Pitch], ax
   758 000005C3 C3                      	retn
   759                                  PortSlide:
   760 000005C4 E812000000              	call    VolSlide
   761 000005C9 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   762 000005CC E961FFFFFF              	jmp     TonePort
   763                                  VibSlide:
   764 000005D1 E805000000              	call    VolSlide
   765 000005D6 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   766 000005D9 EB8F                    	jmp     short Vibrato
   767                                  VolSlide:
   768 000005DB 88D6                    	mov     dh, dl
   769 000005DD 80E20F                  	and     dl, 0Fh
   770 000005E0 C0EE04                  	shr     dh, 4
   771 000005E3 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   772 000005E6 28D0                    	sub     al, dl
   773 000005E8 7D02                    	jge     short NoLoVol
   774 000005EA 30C0                    	xor     al, al
   775                                  NoLoVol:        
   776 000005EC 00F0                    	add     al, dh
   777 000005EE 3C40                    	cmp     al, 64
   778 000005F0 7602                    	jbe     short NoHiVol
   779 000005F2 B040                    	mov     al, 64
   780                                  NoHiVol:        
   781 000005F4 88470E                  	mov     [edi+TrackInfo.Volume], al
   782 000005F7 C3                      	retn
   783                                  
   784                                  ;--------------------------------------------------------------------------
   785                                  ; GetTrack:   Get the next Note from a pattern.
   786                                  ;  In:
   787                                  ;    ds:di -  Track info Address.
   788                                  ;    es:si -  Pattern Note Address.
   789                                  ; Out:
   790                                  ;    es:si -  The Next Pattern Note address.
   791                                  ;--------------------------------------------------------------------------
   792                                  
   793                                  ; esi = Pattern note address
   794                                  ; edi = Track info address
   795                                  
   796                                  GetTrack:
   797 000005F8 66AD                    	lodsw
   798 000005FA 86C4                    	xchg    al, ah
   799 000005FC 88E3                    	mov	bl, ah
   800 000005FE 80E40F                  	and     ah, 0Fh
   801 00000601 6689C1                  	mov     cx, ax
   802 00000604 66AD                    	lodsw
   803 00000606 86C4                    	xchg    al, ah
   804 00000608 88E7                    	mov     bh, ah
   805 0000060A 80E40F                  	and     ah, 0Fh
   806 0000060D 6689C2                  	mov     dx, ax
   807 00000610 66895714                	mov     [edi+TrackInfo.Effect], dx
   808 00000614 80E3F0                  	and     bl, 0F0h
   809 00000617 C0EF04                  	shr     bh, 4
   810 0000061A 08FB                    	or      bl, bh
   811 0000061C 7449                    	je      short SetPeriod
   812                                  SetSample:
   813                                  	;xor    bh, bh
   814 0000061E 81E3FF000000            	and	ebx, 0FFh
   815 00000624 4B                      	dec     ebx
   816 00000625 01DB                    	add     ebx, ebx
   817 00000627 668B83[0C140000]        	mov     ax, [ModInfo.SampVol+ebx]
   818 0000062E 88470E                  	mov     [edi+TrackInfo.Volume], al
   819 00000631 668B83[D6120000]        	mov     ax, [ModInfo.SampOfs+ebx]
   820 00000638 668907                  	mov     [edi+TrackInfo.Samples], ax
   821 0000063B 668B83[14130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   822 00000642 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   823 00000646 668B83[52130000]        	mov     ax, [ModInfo.SampLen+ebx]
   824 0000064D 66894708                	mov     [edi+TrackInfo.Len], ax
   825 00000651 668B83[90130000]        	mov     ax, [ModInfo.SampRep+ebx]
   826 00000658 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   827 0000065C 668B83[CE130000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   828 00000663 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   829                                  SetPeriod:      
   830 00000667 6685C9                  	test    cx, cx
   831 0000066A 7424                    	jz      short SetEffect
   832                                  
   833 0000066C 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   834 00000670 80FE03                  	cmp     dh, 03h
   835 00000673 741B                    	je      short SetEffect
   836                                  
   837 00000675 66894F10                	mov     [edi+TrackInfo.Period], cx
   838 00000679 6689CB                  	mov     bx, cx
   839 0000067C 6601DB                  	add     bx, bx
   840 0000067F 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   841 00000685 66894712                	mov     [edi+TrackInfo.Pitch], ax
   842 00000689 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   843                                  SetEffect:
   844 00000690 6685D2                  	test    dx, dx
   845 00000693 7430                    	jz      short InitNone
   846 00000695 80FE00                  	cmp     dh, 00h
   847 00000698 0F84E5000000            	je      InitArpeggio
   848 0000069E 80FE03                  	cmp     dh, 03h
   849 000006A1 7423                    	je      short InitTonePort
   850 000006A3 80FE04                  	cmp     dh, 04h
   851 000006A6 742D                    	je      short InitVibrato
   852 000006A8 80FE09                  	cmp     dh, 09h
   853 000006AB 7451                    	je      short SampleOfs
   854 000006AD 80FE0B                  	cmp     dh, 0Bh
   855 000006B0 7462                    	je      short PosJump
   856 000006B2 80FE0C                  	cmp     dh, 0Ch
   857 000006B5 746B                    	je      short SetVolume
   858 000006B7 80FE0D                  	cmp     dh, 0Dh
   859 000006BA 7471                    	je      short Break
   860 000006BC 80FE0F                  	cmp     dh, 0Fh
   861 000006BF 0F8487000000            	je      SetSpeed
   862                                  InitNone:
   863 000006C5 C3                      	retn
   864                                  InitTonePort:
   865 000006C6 84D2                    	test    dl, dl
   866 000006C8 7503                    	jnz     short SetPortParm
   867 000006CA 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   868                                  SetPortParm:    
   869 000006CD 885718                  	mov     [edi+TrackInfo.PortParm], dl
   870 000006D0 66895714                	mov     [edi+TrackInfo.Effect], dx
   871 000006D4 C3                      	retn
   872                                  InitVibrato:
   873 000006D5 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   874 000006D8 88C4                    	mov     ah, al
   875 000006DA 240F                    	and     al, 0Fh
   876 000006DC 80E4F0                  	and     ah, 0F0h
   877 000006DF F6C20F                  	test    dl, 0Fh
   878 000006E2 7502                    	jne     short OkDepth
   879 000006E4 08C2                    	or      dl, al
   880                                  OkDepth:        
   881 000006E6 F6C2F0                  	test    dl, 0F0h
   882 000006E9 7502                    	jnz     short OkRate
   883 000006EB 08E2                    	or      dl, ah
   884                                  OkRate:         
   885 000006ED 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   886 000006F0 66895714                	mov     [edi+TrackInfo.Effect], dx
   887 000006F4 6685C9                  	test    cx, cx
   888 000006F7 7404                    	jz      short OkPos
   889 000006F9 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   890                                  OkPos:          
   891 000006FD C3                      	retn
   892                                  SampleOfs:      
   893 000006FE 84D2                    	test    dl, dl
   894 00000700 7503                    	jnz     short SetSampleOfs
   895 00000702 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   896                                  SetSampleOfs:
   897 00000705 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   898 00000708 88D6                    	mov     dh, dl
   899 0000070A 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   900 00000710 895704                  	mov     [edi+TrackInfo.Position], edx
   901 00000713 C3                      	retn
   902                                  PosJump:
   903 00000714 8815[FC6B0000]          	mov     [OrderPos], dl
   904 0000071A C605[006C0000]40        	mov     byte [Row], 64
   905 00000721 C3                      	retn
   906                                  SetVolume:
   907 00000722 80FA40                  	cmp     dl, 64
   908 00000725 7602                    	jbe     short OkVol
   909 00000727 B240                    	mov     dl, 64
   910                                  OkVol:
   911 00000729 88570E                  	mov     [edi+TrackInfo.Volume], dl
   912 0000072C C3                      	retn
   913                                  Break:
   914 0000072D 88D6                    	mov     dh, dl
   915 0000072F 80E20F                  	and     dl, 0Fh
   916 00000732 C0EE04                  	shr     dh, 4
   917 00000735 00F6                    	add     dh, dh
   918 00000737 00F2                    	add     dl, dh
   919 00000739 C0E602                  	shl     dh, 2
   920 0000073C 00F2                    	add     dl, dh
   921 0000073E 8815[016C0000]          	mov     [BreakRow], dl
   922 00000744 C605[006C0000]40        	mov     byte [Row], 64
   923 0000074B C3                      	retn
   924                                  SetSpeed:
   925 0000074C 84D2                    	test    dl,dl
   926 0000074E 7432                    	je      Skip
   927 00000750 80FA1F                  	cmp     dl,31
   928 00000753 770D                    	ja      short SetBpm
   929                                  SetTempo:       
   930 00000755 8815[FD6B0000]          	mov     [Tempo], dl
   931 0000075B 8815[FE6B0000]          	mov     [TempoWait], dl
   932 00000761 C3                      	retn
   933                                  SetBpm:
   934 00000762 8815[FF6B0000]          	mov     [Bpm], dl
   935 00000768 B067                    	mov     al, 103
   936 0000076A F6E2                    	mul     dl
   937 0000076C 88E3                    	mov     bl, ah
   938 0000076E 30FF                    	xor     bh, bh
   939 00000770 66A1[5D0D0000]          	mov     ax, [MixSpeed]
   940 00000776 6631D2                  	xor     dx, dx
   941 00000779 66F7F3                  	div     bx
   942 0000077C 66A3[026C0000]          	mov     [BpmSamples], ax
   943                                  Skip:           
   944 00000782 C3                      	retn
   945                                  InitArpeggio:
   946 00000783 88D6                    	mov     dh, dl
   947 00000785 80E20F                  	and     dl, 0Fh
   948 00000788 C0EE04                  	shr     dh, 4
   949 0000078B 66B92400                	mov     cx, 36
   950 0000078F 31DB                    	xor     ebx, ebx
   951 00000791 668B4710                	mov     ax, [edi+TrackInfo.Period]
   952                                  gt_ScanPeriod:
   953 00000795 66673B87[130D]          	cmp     ax, [PeriodTable+bx]
   954 0000079B 7306                    	jae     short SetArp
   955 0000079D 6683C302                	add     bx, 2
   956 000007A1 E2F2                    	loop    gt_ScanPeriod
   957                                  SetArp:         
   958 000007A3 6601D2                  	add     dx, dx
   959 000007A6 00DE                    	add     dh, bl
   960 000007A8 00DA                    	add     dl, bl
   961 000007AA 66678B9F[130D]          	mov     bx, [PeriodTable+bx]
   962 000007B0 6601DB                  	add     bx, bx
   963 000007B3 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   964 000007B9 6689471C                	mov     [edi+TrackInfo.Arp], ax
   965 000007BD 88F3                    	mov     bl, dh
   966 000007BF 30FF                    	xor     bh, bh
   967 000007C1 66678B9F[130D]          	mov     bx, [PeriodTable+bx]
   968 000007C7 6601DB                  	add     bx, bx
   969 000007CA 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   970 000007D0 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
   971 000007D4 88D3                    	mov     bl, dl
   972 000007D6 30FF                    	xor     bh, bh
   973 000007D8 66678B9F[130D]          	mov     bx, [PeriodTable+bx]
   974 000007DE 6601DB                  	add     bx, bx
   975 000007E1 66678B87[4A14]          	mov     ax, [PitchTable+bx]
   976 000007E7 66894720                	mov     [edi+TrackInfo.Arp+4], ax
   977 000007EB 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
   978 000007F1 C3                      	retn
   979                                  
   980                                  ;--------------------------------------------------------------------------
   981                                  ; UpdateTracks:  Main code to process the next tick to be played.
   982                                  ;--------------------------------------------------------------------------
   983                                  
   984                                  UpdateTracks:
   985 000007F2 FE0D[FE6B0000]          	dec     byte [TempoWait]
   986 000007F8 7415                    	jz      short GetTracks
   987                                  
   988 000007FA B904000000              	mov	ecx, NumTracks
   989 000007FF BF[126C0000]            	mov	edi, Tracks
   990                                  BeatTracks:
   991 00000804 E87AFCFFFF              	call	BeatTrack	
   992 00000809 83C724                  	add	edi, TrackInfo.size
   993 0000080C E2F6                    	loop	BeatTracks
   994 0000080E C3                      	retn
   995                                  GetTracks:
   996 0000080F A0[FD6B0000]            	mov     al, [Tempo]
   997 00000814 A2[FE6B0000]            	mov     [TempoWait], al
   998                                  
   999 00000819 8B35[0E6C0000]          	mov	esi, [Note]
  1000 0000081F 803D[006C0000]40        	cmp     byte [Row], 64
  1001 00000826 7263                    	jb      short NoPattWrap
  1002                                  
  1003 00000828 8B35[D2120000]          	mov	esi, [ModInfo.Patterns]
  1004 0000082E 8A1D[FC6B0000]          	mov     bl, [OrderPos]
  1005 00000834 3A1D[50120000]          	cmp     bl, [ModInfo.OrderLen]
  1006 0000083A 7214                    	jb      short NoOrderWrap
  1007 0000083C 8A1D[51120000]          	mov     bl, [ModInfo.ReStart]
  1008 00000842 881D[FC6B0000]          	mov     [OrderPos], bl
  1009 00000848 3A1D[50120000]          	cmp     bl, [ModInfo.OrderLen]
  1010 0000084E 735D                    	jae     short NoUpdate
  1011                                  NoOrderWrap:    
  1012                                  	;xor	bh, bh
  1013 00000850 81E3FF000000            	and	ebx, 0FFh
  1014 00000856 8A9B[52120000]          	mov     bl, [ModInfo.Order+ebx]
  1015 0000085C C1E30A                  	shl     ebx, 10 ; *1024
  1016 0000085F 01DE                    	add     esi, ebx
  1017 00000861 8A1D[016C0000]          	mov     bl, [BreakRow]
  1018 00000867 881D[006C0000]          	mov     [Row], bl
  1019                                  	;xor     bh, bh
  1020 0000086D 81E3FF000000            	and	ebx, 0FFh
  1021 00000873 883D[016C0000]          	mov     [BreakRow], bh ; 0
  1022 00000879 66C1E304                	shl     bx, 4
  1023 0000087D 01DE                    	add     esi, ebx
  1024 0000087F 8935[0E6C0000]          	mov     [Note], esi
  1025 00000885 FE05[FC6B0000]          	inc     byte [OrderPos]
  1026                                  NoPattWrap:     
  1027 0000088B FE05[006C0000]          	inc     byte [Row]
  1028                                  
  1029                                  	;cld
  1030 00000891 B904000000              	mov	ecx, NumTracks
  1031 00000896 BF[126C0000]            	mov	edi, Tracks
  1032                                  GetTracks_next:
  1033 0000089B 51                      	push	ecx	
  1034 0000089C E857FDFFFF              	call	GetTrack
  1035 000008A1 59                      	pop	ecx
  1036 000008A2 83C724                  	add	edi, TrackInfo.size
  1037 000008A5 E2F4                    	loop	GetTracks_next
  1038                                  
  1039 000008A7 8935[0E6C0000]          	mov     [Note], esi
  1040                                  NoUpdate:
  1041 000008AD C3                      	retn
  1042                                  
  1043                                  ;--------------------------------------------------------------------------
  1044                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1045                                  ;  In:
  1046                                  ;   ds:si -  Track Info Address.
  1047                                  ;   ds:di -  Buffer Address.
  1048                                  ;    cx   -  Buffer Size.
  1049                                  ;--------------------------------------------------------------------------
  1050                                  
  1051                                  ; esi = Track info address
  1052                                  ; edi = Buffer address
  1053                                  ; ecx = Buffer size
  1054                                  
  1055                                  MixTrack:
  1056 000008AE 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1057 000008B3 7748                    	ja      short MixLooped
  1058                                  MixNonLooped:   
  1059 000008B5 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1060 000008B7 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1061 000008BA 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1062 000008BE 52                      	push    edx
  1063 000008BF 56                      	push    esi
  1064 000008C0 01D3                    	add     ebx, edx
  1065 000008C2 01D5                    	add     ebp, edx
  1066 000008C4 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1067 000008C8 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1068 000008CB 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1069 000008CE 89DE                    	mov     esi, ebx
  1070 000008D0 88C7                    	mov     bh, al
  1071 000008D2 88D0                    	mov     al, dl
  1072 000008D4 88F2                    	mov     dl, dh
  1073                                  	;xor	dh, dh
  1074 000008D6 81E2FF000000            	and	edx, 0FFh
  1075                                  nlMixSamp:      
  1076 000008DC 39EE                    	cmp     esi, ebp
  1077 000008DE 7310                    	jae     short nlMixBye
  1078 000008E0 8A1E                    	mov     bl, [esi]
  1079 000008E2 678A9F[FC1A]            	mov     bl, [VolTable+bx]
  1080 000008E7 001F                    	add     [edi], bl
  1081 000008E9 47                      	inc     edi
  1082 000008EA 00C4                    	add     ah, al
  1083 000008EC 11D6                    	adc     esi, edx
  1084 000008EE E2EC                    	loop    nlMixSamp
  1085                                  nlMixBye:       
  1086 000008F0 89F3                    	mov     ebx, esi
  1087 000008F2 5E                      	pop     esi
  1088 000008F3 5A                      	pop     edx
  1089 000008F4 29D3                    	sub     ebx, edx
  1090 000008F6 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1091 000008F9 88660F                  	mov     [esi+TrackInfo.Error], ah
  1092 000008FC C3                      	retn
  1093                                  MixLooped:
  1094 000008FD 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1095 000008FF 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1096 00000902 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1097 00000906 892D[0A6C0000]          	mov     [BufRep], ebp
  1098 0000090C 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1099 0000090F 52                      	push    edx
  1100 00000910 56                      	push    esi
  1101 00000911 01D3                    	add     ebx, edx
  1102 00000913 01D5                    	add     ebp, edx
  1103 00000915 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1104 00000919 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1105 0000091C 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1106 0000091F 6689DE                  	mov     si, bx
  1107 00000922 88C7                    	mov     bh, al
  1108 00000924 88D0                    	mov     al, dl
  1109 00000926 88F2                    	mov     dl, dh
  1110                                  	;xor	dh, dh
  1111 00000928 81E2FF000000            	and	edx, 0FFh
  1112                                  lpMixSamp:      
  1113 0000092E 39EE                    	cmp     esi, ebp
  1114 00000930 7206                    	jb      short lpMixNow
  1115 00000932 2B35[0A6C0000]          	sub     esi, [BufRep]
  1116                                  lpMixNow:       
  1117 00000938 8A1E                    	mov     bl, [esi]
  1118 0000093A 678A9F[FC1A]            	mov     bl, [VolTable+bx]
  1119 0000093F 001F                    	add     [edi], bl
  1120 00000941 47                      	inc     edi
  1121 00000942 00C4                    	add     ah, al
  1122 00000944 11D6                    	adc	esi, edx
  1123 00000946 E2E6                    	loop    lpMixSamp
  1124                                  lpMixBye:       
  1125                                  ;	mov     ebx, esi
  1126                                  ;	pop     esi
  1127                                  ;	pop     edx
  1128                                  ;	sub     ebx, edx
  1129                                  ;	mov     [esi+TrackInfo.Position], ebx
  1130                                  ;	mov     [esi+TrackInfo.Error], ah
  1131                                  ;	retn
  1132 00000948 EBA6                    	jmp	short nlMixBye
  1133                                  
  1134                                  ;--------------------------------------------------------------------------
  1135                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1136                                  ;  In:
  1137                                  ;    Buffer  - Buffer Address.
  1138                                  ;    Count   - Buffer Size.
  1139                                  ;--------------------------------------------------------------------------
  1140                                  
  1141                                  GetSamples:
  1142                                  	; edi = buffer address
  1143                                  	; ebx = count
  1144                                  
  1145 0000094A 60                      	pushad
  1146                                  
  1147                                  	;cld
  1148                                  NextChunk:      
  1149 0000094B 66833D[086C0000]00      	cmp     word [BufLen], 0
  1150 00000953 7548                    	jne     short CopyChunk
  1151                                  
  1152 00000955 53                      	push    ebx
  1153 00000956 57                      	push    edi
  1154                                  MixChunk:       
  1155 00000957 BF[FC5B0000]            	mov	edi, MixBuffer
  1156 0000095C 0FB70D[026C0000]        	movzx	ecx, word [BpmSamples]
  1157 00000963 893D[046C0000]          	mov     [BufPtr], edi
  1158 00000969 66890D[086C0000]        	mov     [BufLen], cx
  1159                                  
  1160 00000970 B080                    	mov     al, 80h
  1161 00000972 F3AA                    	rep     stosb
  1162                                  
  1163 00000974 66B90400                	mov	cx, NumTracks
  1164 00000978 BE[EE6B0000]            	mov	esi, Tracks - TrackInfo.size
  1165                                  GetSamples_next:
  1166 0000097D 51                      	push	ecx
  1167 0000097E 83C624                  	add	esi, TrackInfo.size
  1168 00000981 668B0D[086C0000]        	mov	cx, [BufLen]
  1169 00000988 8B3D[046C0000]          	mov	edi, [BufPtr]
  1170 0000098E E81BFFFFFF              	call	MixTrack
  1171 00000993 59                      	pop	ecx
  1172 00000994 E2E7                    	loop	GetSamples_next	
  1173                                  
  1174 00000996 E857FEFFFF              	call    UpdateTracks
  1175                                  
  1176 0000099B 5F                      	pop     edi
  1177 0000099C 5B                      	pop     ebx
  1178                                  CopyChunk:      
  1179                                  	;mov	cx, [BufLen]
  1180 0000099D 0FB70D[086C0000]        	movzx	ecx, word [BufLen]
  1181 000009A4 39D9                    	cmp	ecx, ebx
  1182                                  	;cmp	cx, bx
  1183 000009A6 7602                    	jbe     short MoveChunk
  1184                                  	;mov	cx, bx
  1185 000009A8 89D9                    	mov     ecx, ebx
  1186                                  MoveChunk:
  1187 000009AA 8B35[046C0000]          	mov     esi, [BufPtr]
  1188 000009B0 010D[046C0000]          	add     [BufPtr], ecx
  1189 000009B6 66290D[086C0000]        	sub     [BufLen], cx
  1190 000009BD 29CB                    	sub     ebx, ecx
  1191 000009BF F3A4                    	rep     movsb
  1192 000009C1 85DB                    	test    ebx, ebx
  1193 000009C3 7586                    	jnz     short NextChunk
  1194                                  
  1195 000009C5 61                      	popad
  1196 000009C6 C3                      	retn
  1197                                  
  1198                                  ;--------------------------------------------------------------------------
  1199                                  ; StartPlaying: Initializes the Sound System.
  1200                                  ;  In:
  1201                                  ;   Module Information Resources.
  1202                                  ;--------------------------------------------------------------------------
  1203                                  
  1204                                  StartPlaying:
  1205 000009C7 60                      	pushad
  1206                                  SetModParms:    
  1207 000009C8 C605[FC6B0000]00        	mov     byte [OrderPos], 0
  1208 000009CF C605[FD6B0000]06        	mov     byte [Tempo], DefTempo
  1209 000009D6 C605[FE6B0000]06        	mov     byte [TempoWait], DefTempo
  1210 000009DD C605[FF6B0000]7D        	mov     byte [Bpm], DefBpm
  1211 000009E4 C605[006C0000]40        	mov     byte [Row], 64
  1212 000009EB C605[016C0000]00        	mov     byte [BreakRow], 0
  1213 000009F2 66A1[5D0D0000]          	mov     ax, [MixSpeed]
  1214 000009F8 31D2                    	xor     edx, edx
  1215 000009FA 66BB3200                	mov     bx, 24*DefBpm/60
  1216 000009FE 66F7F3                  	div     bx
  1217 00000A01 66A3[026C0000]          	mov     [BpmSamples], ax
  1218                                  ClearTracks:    
  1219 00000A07 BF[126C0000]            	mov     edi, Tracks
  1220 00000A0C B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1221 00000A11 31C0                    	xor     eax, eax
  1222                                  	;cld
  1223 00000A13 F3AA                    	rep     stosb
  1224                                  
  1225 00000A15 A3[046C0000]            	mov     [BufPtr], eax
  1226 00000A1A 66A3[086C0000]          	mov     [BufLen], ax
  1227                                  MakePitch:
  1228 00000A20 66B80021                	mov     ax, MidCRate
  1229 00000A24 66BBAC01                	mov     bx, 428
  1230 00000A28 66F7E3                  	mul     bx
  1231 00000A2B 66F735[5D0D0000]        	div     word [MixSpeed]
  1232 00000A32 30F6                    	xor     dh, dh
  1233 00000A34 88E2                    	mov     dl, ah
  1234 00000A36 88C4                    	mov     ah, al
  1235 00000A38 30C0                    	xor     al, al
  1236 00000A3A 66B95903                	mov     cx, 857
  1237 00000A3E 31DB                    	xor     ebx, ebx
  1238 00000A40 BF[4A140000]            	mov     edi, PitchTable
  1239                                  PitchLoop:      
  1240 00000A45 50                      	push    eax
  1241 00000A46 52                      	push    edx
  1242 00000A47 6639DA                  	cmp     dx, bx
  1243 00000A4A 7303                    	jae     short NoDiv
  1244 00000A4C 66F7F3                  	div     bx
  1245                                  NoDiv:          
  1246 00000A4F 66AB                    	stosw
  1247 00000A51 5A                      	pop     edx
  1248 00000A52 58                      	pop     eax
  1249 00000A53 43                      	inc     ebx
  1250 00000A54 E2EF                    	loop    PitchLoop
  1251                                  MakeVolume:     
  1252 00000A56 66B90041                	mov     cx, 16640
  1253 00000A5A 89CB                    	mov     ebx, ecx
  1254                                  VolLoop:
  1255 00000A5C 4B                      	dec     ebx
  1256 00000A5D 88D8                    	mov     al, bl
  1257 00000A5F F6EF                    	imul    bh
  1258 00000A61 88A3[FC1A0000]          	mov     [VolTable+ebx], ah
  1259 00000A67 E2F3                    	loop    VolLoop
  1260                                  
  1261 00000A69 61                      	popad
  1262 00000A6A C3                      	retn
  1263                                  
  1264                                  ;--------------------------------------------------------------------------
  1265                                  ; StopPlaying: ShutDown the Sound System.
  1266                                  ;--------------------------------------------------------------------------
  1267                                  
  1268                                  StopPlaying:
  1269                                  	; 19/06/2017
  1270                                  	; Stop Playing
  1271                                  	sys	_audio, 0700h
  1271                              <1> 
  1271                              <1> 
  1271                              <1> 
  1271                              <1> 
  1271                              <1>  %if %0 >= 2
  1271 00000A6B BB00070000          <1>  mov ebx, %2
  1271                              <1>  %if %0 >= 3
  1271                              <1>  mov ecx, %3
  1271                              <1>  %if %0 = 4
  1271                              <1>  mov edx, %4
  1271                              <1>  %endif
  1271                              <1>  %endif
  1271                              <1>  %endif
  1271 00000A70 B820000000          <1>  mov eax, %1
  1271                              <1> 
  1271 00000A75 CD40                <1>  int 40h
  1272                                  	; Cancel callback service (for user)
  1273                                  	sys	_audio, 0900h
  1273                              <1> 
  1273                              <1> 
  1273                              <1> 
  1273                              <1> 
  1273                              <1>  %if %0 >= 2
  1273 00000A77 BB00090000          <1>  mov ebx, %2
  1273                              <1>  %if %0 >= 3
  1273                              <1>  mov ecx, %3
  1273                              <1>  %if %0 = 4
  1273                              <1>  mov edx, %4
  1273                              <1>  %endif
  1273                              <1>  %endif
  1273                              <1>  %endif
  1273 00000A7C B820000000          <1>  mov eax, %1
  1273                              <1> 
  1273 00000A81 CD40                <1>  int 40h
  1274                                  	; Deallocate Audio Buffer (for user)
  1275                                  	sys	_audio, 0A00h
  1275                              <1> 
  1275                              <1> 
  1275                              <1> 
  1275                              <1> 
  1275                              <1>  %if %0 >= 2
  1275 00000A83 BB000A0000          <1>  mov ebx, %2
  1275                              <1>  %if %0 >= 3
  1275                              <1>  mov ecx, %3
  1275                              <1>  %if %0 = 4
  1275                              <1>  mov edx, %4
  1275                              <1>  %endif
  1275                              <1>  %endif
  1275                              <1>  %endif
  1275 00000A88 B820000000          <1>  mov eax, %1
  1275                              <1> 
  1275 00000A8D CD40                <1>  int 40h
  1276                                  	; Disable Audio Device
  1277                                  	sys	_audio, 0C00h
  1277                              <1> 
  1277                              <1> 
  1277                              <1> 
  1277                              <1> 
  1277                              <1>  %if %0 >= 2
  1277 00000A8F BB000C0000          <1>  mov ebx, %2
  1277                              <1>  %if %0 >= 3
  1277                              <1>  mov ecx, %3
  1277                              <1>  %if %0 = 4
  1277                              <1>  mov edx, %4
  1277                              <1>  %endif
  1277                              <1>  %endif
  1277                              <1>  %endif
  1277 00000A94 B820000000          <1>  mov eax, %1
  1277                              <1> 
  1277 00000A99 CD40                <1>  int 40h
  1278                                  
  1279 00000A9B C3                      	retn
  1280                                  
  1281                                  ;=============================================================================
  1282                                  ; 
  1283                                  ;=============================================================================
  1284                                  
  1285                                  ;dword2str:
  1286                                  ;	; 13/11/2016 - Erdogan Tan 
  1287                                  ;	; eax = dword value
  1288                                  ;	;
  1289                                  ;	call	dwordtohex
  1290                                  ;	mov	[dword_str], edx
  1291                                  ;	mov	[dword_str+4], eax
  1292                                  ;	mov	si, dword_str
  1293                                  ;	retn
  1294                                  
  1295                                  	; 05/03/2017 (TRDOS 386)
  1296                                  	; trdos386.s (unix386.s) - 10/05/2015
  1297                                  	; Convert binary number to hexadecimal string
  1298                                  
  1299                                  ;bytetohex:
  1300                                  ;	; INPUT ->
  1301                                  ;	; 	AL = byte (binary number)
  1302                                  ;	; OUTPUT ->
  1303                                  ;	;	AX = hexadecimal string
  1304                                  ;	;
  1305                                  ;	push	ebx
  1306                                  ;	movzx	ebx, al
  1307                                  ;	shr	bl, 4
  1308                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1309                                  ;	xchg	bl, al
  1310                                  ;	and	bl, 0Fh
  1311                                  ;	mov	ah, [ebx+hex_chars] 
  1312                                  ;	pop	ebx	
  1313                                  ;	retn
  1314                                  
  1315                                  ;wordtohex:
  1316                                  ;	; INPUT ->
  1317                                  ;	; 	AX = word (binary number)
  1318                                  ;	; OUTPUT ->
  1319                                  ;	;	EAX = hexadecimal string
  1320                                  ;	;
  1321                                  ;	push	ebx
  1322                                  ;	xor	ebx, ebx
  1323                                  ;	xchg	ah, al
  1324                                  ;	push	eax
  1325                                  ;	mov	bl, ah
  1326                                  ;	shr	bl, 4
  1327                                  ;	mov	al, [ebx+hex_chars] 	 	
  1328                                  ;	mov	bl, ah
  1329                                  ;	and	bl, 0Fh
  1330                                  ;	mov	ah, [ebx+hex_chars]
  1331                                  ;	shl	eax, 16
  1332                                  ;	pop	eax
  1333                                  ;	pop	ebx
  1334                                  ;	jmp	short bytetohex
  1335                                  
  1336                                  ;dwordtohex:
  1337                                  ;	; INPUT ->
  1338                                  ;	; 	EAX = dword (binary number)
  1339                                  ;	; OUTPUT ->
  1340                                  ;	;	EDX:EAX = hexadecimal string
  1341                                  ;	;
  1342                                  ;	push	eax
  1343                                  ;	shr	eax, 16
  1344                                  ;	call	wordtohex
  1345                                  ;	mov	edx, eax
  1346                                  ;	pop	eax
  1347                                  ;	call	wordtohex
  1348                                  ;	retn
  1349                                  
  1350                                  	; 19/06/2017
  1351                                  	; 05/03/2017 (TRDOS 386)
  1352                                  	; 13/11/2016 - Erdogan Tan
  1353                                  write_audio_dev_info:
  1354                                  	; BUS/DEV/FN
  1355                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1356                                  	; DEV/VENDOR
  1357                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1358                                  
  1359 00000A9C 8B35[000E0000]          	mov	esi, [dev_vendor]
  1360 00000AA2 6689F0                  	mov	ax, si
  1361 00000AA5 0FB6D8                  	movzx	ebx, al
  1362 00000AA8 88DA                    	mov	dl, bl
  1363 00000AAA 80E30F                  	and	bl, 0Fh
  1364 00000AAD 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1365 00000AB3 A2[A40D0000]            	mov	[msgVendorId+3], al
  1366 00000AB8 88D3                    	mov	bl, dl
  1367 00000ABA C0EB04                  	shr	bl, 4
  1368 00000ABD 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1369 00000AC3 A2[A30D0000]            	mov	[msgVendorId+2], al
  1370 00000AC8 88E3                    	mov	bl, ah
  1371 00000ACA 88DA                    	mov	dl, bl
  1372 00000ACC 80E30F                  	and	bl, 0Fh
  1373 00000ACF 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1374 00000AD5 A2[A20D0000]            	mov	[msgVendorId+1], al
  1375 00000ADA 88D3                    	mov	bl, dl
  1376 00000ADC C0EB04                  	shr	bl, 4
  1377 00000ADF 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1378 00000AE5 A2[A10D0000]            	mov	[msgVendorId], al
  1379 00000AEA C1EE10                  	shr	esi, 16
  1380 00000AED 6689F0                  	mov	ax, si
  1381 00000AF0 88C3                    	mov	bl, al
  1382 00000AF2 88DA                    	mov	dl, bl
  1383 00000AF4 80E30F                  	and	bl, 0Fh
  1384 00000AF7 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1385 00000AFD A2[B50D0000]            	mov	[msgDevId+3], al
  1386 00000B02 88D3                    	mov	bl, dl
  1387 00000B04 C0EB04                  	shr	bl, 4
  1388 00000B07 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1389 00000B0D A2[B40D0000]            	mov	[msgDevId+2], al
  1390 00000B12 88E3                    	mov	bl, ah
  1391 00000B14 88DA                    	mov	dl, bl
  1392 00000B16 80E30F                  	and	bl, 0Fh
  1393 00000B19 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1394 00000B1F A2[B30D0000]            	mov	[msgDevId+1], al
  1395 00000B24 88D3                    	mov	bl, dl
  1396 00000B26 C0EB04                  	shr	bl, 4
  1397 00000B29 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1398 00000B2F A2[B20D0000]            	mov	[msgDevId], al
  1399                                  
  1400 00000B34 8B35[040E0000]          	mov	esi, [bus_dev_fn]
  1401 00000B3A C1EE08                  	shr	esi, 8
  1402 00000B3D 6689F0                  	mov	ax, si
  1403 00000B40 88C3                    	mov	bl, al
  1404 00000B42 88DA                    	mov	dl, bl
  1405 00000B44 80E307                  	and	bl, 7 ; bit 0,1,2
  1406 00000B47 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1407 00000B4D A2[D90D0000]            	mov	[msgFncNo+1], al
  1408 00000B52 88D3                    	mov	bl, dl
  1409 00000B54 C0EB03                  	shr	bl, 3
  1410 00000B57 88DA                    	mov	dl, bl
  1411 00000B59 80E30F                  	and	bl, 0Fh
  1412 00000B5C 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1413 00000B62 A2[CB0D0000]            	mov	[msgDevNo+1], al
  1414 00000B67 88D3                    	mov	bl, dl
  1415 00000B69 C0EB04                  	shr	bl, 4
  1416 00000B6C 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1417 00000B72 A2[CA0D0000]            	mov	[msgDevNo], al
  1418 00000B77 88E3                    	mov	bl, ah
  1419 00000B79 88DA                    	mov	dl, bl
  1420 00000B7B 80E30F                  	and	bl, 0Fh
  1421 00000B7E 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1422 00000B84 A2[BF0D0000]            	mov	[msgBusNo+1], al
  1423 00000B89 88D3                    	mov	bl, dl
  1424 00000B8B C0EB04                  	shr	bl, 4
  1425 00000B8E 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1426 00000B94 A2[BE0D0000]            	mov	[msgBusNo], al
  1427                                  
  1428 00000B99 66A1[0C0E0000]          	mov	ax, [ac97_io_base]
  1429 00000B9F 88C3                    	mov	bl, al
  1430 00000BA1 88DA                    	mov	dl, bl
  1431 00000BA3 80E30F                  	and	bl, 0Fh
  1432 00000BA6 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1433 00000BAC A2[F20D0000]            	mov	[msgIOBaseAddr+3], al
  1434 00000BB1 88D3                    	mov	bl, dl
  1435 00000BB3 C0EB04                  	shr	bl, 4
  1436 00000BB6 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1437 00000BBC A2[F10D0000]            	mov	[msgIOBaseAddr+2], al
  1438 00000BC1 88E3                    	mov	bl, ah
  1439 00000BC3 88DA                    	mov	dl, bl
  1440 00000BC5 80E30F                  	and	bl, 0Fh
  1441 00000BC8 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1442 00000BCE A2[F00D0000]            	mov	[msgIOBaseAddr+1], al
  1443 00000BD3 88D3                    	mov	bl, dl
  1444 00000BD5 C0EB04                  	shr	bl, 4
  1445 00000BD8 8A83[5F0D0000]          	mov	al, [ebx+hex_chars]
  1446 00000BDE A2[EF0D0000]            	mov	[msgIOBaseAddr], al
  1447                                  
  1448                                  	; 24/11/2016
  1449 00000BE3 30E4                    	xor	ah, ah
  1450 00000BE5 A0[0E0E0000]            	mov	al, [ac97_int_ln_reg]
  1451 00000BEA B10A                    	mov	cl, 10
  1452 00000BEC F6F1                    	div	cl
  1453 00000BEE 660105[FA0D0000]        	add	[msgIRQ], ax
  1454 00000BF5 20C0                    	and	al, al
  1455 00000BF7 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1456 00000BF9 A0[FB0D0000]            	mov	al, [msgIRQ+1]
  1457 00000BFE B420                    	mov	ah, ' '
  1458 00000C00 66A3[FA0D0000]          	mov	[msgIRQ], ax
  1459                                  _w_ac97imsg_:
  1460                                  	; EBX = Message address
  1461                                  	; ECX = Max. message length (or stop on ZERO character)
  1462                                  	;	(1 to 255)
  1463                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1464                                       	sys 	_msg, msgAC97Info, 255, 07h
  1464                              <1> 
  1464                              <1> 
  1464                              <1> 
  1464                              <1> 
  1464                              <1>  %if %0 >= 2
  1464 00000C06 BB[700D0000]        <1>  mov ebx, %2
  1464                              <1>  %if %0 >= 3
  1464 00000C0B B9FF000000          <1>  mov ecx, %3
  1464                              <1>  %if %0 = 4
  1464 00000C10 BA07000000          <1>  mov edx, %4
  1464                              <1>  %endif
  1464                              <1>  %endif
  1464                              <1>  %endif
  1464 00000C15 B823000000          <1>  mov eax, %1
  1464                              <1> 
  1464 00000C1A CD40                <1>  int 40h
  1465 00000C1C C3                              retn
  1466                                  
  1467                                  ;=============================================================================
  1468                                  ;               preinitialized data
  1469                                  ;=============================================================================
  1470                                  
  1471                                  ;=============================================================================
  1472                                  ;               PLAY.ASM - DATA
  1473                                  ;=============================================================================
  1474                                  
  1475                                  msg_2017:
  1476 00000C1D 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1476 00000C26 506C6179657220666F-
  1476 00000C2F 72205452444F532033-
  1476 00000C38 383620627920457264-
  1476 00000C41 6F67616E2054616E2E-
  1476 00000C4A 20                 
  1477 00000C4B 4A756E652032303137-     	db	'June 2017.',10,13
  1477 00000C54 2E0A0D             
  1478 00000C57 75736167653A20706C-     	db	'usage: playmod filename.mod', 10,13,0
  1478 00000C60 61796D6F642066696C-
  1478 00000C69 656E616D652E6D6F64-
  1478 00000C72 0A0D00             
  1479 00000C75 32332F30362F323031-     	db	'23/06/2017',10,13,0
  1479 00000C7E 370A0D00           
  1480                                  
  1481 00000C82 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1481 00000C8B 506C61796572207630-
  1481 00000C94 2E3162206279204361-
  1481 00000C9D 726C6F732048617361-
  1481 00000CA6 6E2E204A756C792031-
  1481 00000CAF 3939332E           
  1482 00000CB3 0A0D00                  		db	10,13,0
  1483 00000CB6 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1483 00000CBF 64696E67204D6F6475-
  1483 00000CC8 6C652066696C652E0A-
  1483 00000CD1 0D00               
  1484                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1485                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1486                                  ;PortText:	db	'x0h, IRQ '
  1487                                  ;IrqText:	db	'x.',10,13,0
  1488                                  
  1489                                  trdos386_err_msg:
  1490 00000CD3 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1490 00000CDC 2053797374656D2063-
  1490 00000CE5 616C6C206572726F72-
  1490 00000CEE 20210A0D00         
  1491                                  
  1492                                  ;=============================================================================
  1493                                  ;               MODPLAY.ASM - DATA
  1494                                  ;=============================================================================
  1495                                  
  1496                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1497                                  
  1498 00000CF3 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1498 00000CFC C5D4E1             
  1499 00000CFF ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1499 00000D08 E1                 
  1500 00000D09 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1500 00000D12 19                 
  1501                                  
  1502 00000D13 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1502 00000D1C 0280025C023A021A02-
  1502 00000D25 FC01E001C501       
  1503 00000D2B AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1503 00000D34 0140012E011D010D01-
  1503 00000D3D FE00F000E200       
  1504 00000D43 D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1504 00000D4C 00A00097008F008700-
  1504 00000D55 7F0078007100       
  1505                                  
  1506                                  ;=============================================================================
  1507                                  ;               PLAYER.ASM - DATA
  1508                                  ;=============================================================================
  1509                                  
  1510 00000D5B 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1511 00000D5C 08                      bps:		db 8 ; bits per sample (8 or 16)
  1512                                  Sample_Rate:
  1513 00000D5D 2256                    MixSpeed:	dw 22050 ; Hz
  1514                                  
  1515                                  ; 13/11/2016
  1516 00000D5F 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1516 00000D68 3941424344454600   
  1517                                  msgAC97Info:	
  1518 00000D70 0D0A                    		db 0Dh, 0Ah
  1519 00000D72 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1519 00000D7B 6F20436F6E74726F6C-
  1519 00000D84 6C6572202620436F64-
  1519 00000D8D 656320496E666F0D0A 
  1520 00000D96 56656E646F72204944-     		db "Vendor ID: "
  1520 00000D9F 3A20               
  1521 00000DA1 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1521 00000DAA 6963652049443A20   
  1522 00000DB2 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1523 00000DB9 4275733A20              		db "Bus: "
  1524 00000DBE 303068204465766963-     msgBusNo:	db "00h Device: "
  1524 00000DC7 653A20             
  1525 00000DCA 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1525 00000DD3 696F6E3A20         
  1526 00000DD8 303068                  msgFncNo:	db "00h"
  1527 00000DDB 0D0A                    		db 0Dh, 0Ah
  1528 00000DDD 492F4F204261736520-     		db "I/O Base Address: "
  1528 00000DE6 416464726573733A20 
  1529 00000DEF 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1529 00000DF8 3A20               
  1530 00000DFA 3030                    msgIRQ:		dw 3030h
  1531 00000DFC 0D0A00                  		db 0Dh, 0Ah, 0
  1532                                  ;msgSampleRate:	db "Sample Rate: "
  1533                                  ;msgHertz:	db "00000 Hz ", 0
  1534                                  ;msg8Bits:	db "8 bits ", 0
  1535                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1536                                  ;msg16Bits:	db "16 bits ", "$" 
  1537                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1538                                  
  1539                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1540                                  ;codec_id:	   dd 0
  1541                                  ;codec_chip_id:	   dd 0
  1542                                  ;codec_vendor_ids: dw 0
  1543                                  ;codec_chip_ids:   dw 0
  1544                                  
  1545                                  ;dword_str:	dd 30303030h, 30303030h
  1546                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1547                                  
  1548                                  ;=============================================================================
  1549                                  ;        	uninitialized data
  1550                                  ;=============================================================================
  1551                                  
  1552                                  bss_start:
  1553                                  
  1554                                  ABSOLUTE bss_start
  1555                                  
  1556 00000DFF <res 00000001>          alignb 4
  1557                                  
  1558 00000E00 <res 00000004>          dev_vendor:	resd 1
  1559 00000E04 <res 00000004>          bus_dev_fn:	resd 1
  1560 00000E08 <res 00000004>          stats_cmd:	resd 1
  1561 00000E0C <res 00000002>          ac97_io_base:	resw 1
  1562 00000E0E <res 00000001>          ac97_int_ln_reg: resb 1
  1563 00000E0F <res 00000001>          srb:		resb 1
  1564                                  
  1565                                  ; MODLOAD.ASM
  1566 00000E10 <res 00000002>          FileHandle:	resw 1
  1567 00000E12 <res 00000002>          ErrorInfo:	resw 1
  1568 00000E14 <res 0000043C>          Header:	resb	ModHeader.size
  1569                                  
  1570                                  ; MODPLAY.ASM
  1571                                  ;MixSpeed:	    resw 1
  1572                                  
  1573                                  ModInfo:
  1574 00001250 <res 00000001>          ModInfo.OrderLen:   resb 1
  1575 00001251 <res 00000001>          ModInfo.ReStart:    resb 1
  1576 00001252 <res 00000080>          ModInfo.Order:	    resb 128
  1577 000012D2 <res 00000004>          ModInfo.Patterns:   resd 1
  1578                                  
  1579 000012D6 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1580 00001314 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1581 00001352 <res 0000003E>          ModInfo.SampLen:    resw 31
  1582 00001390 <res 0000003E>          ModInfo.SampRep:    resw 31
  1583 000013CE <res 0000003E>          ModInfo.SampRepLen: resw 31
  1584 0000140C <res 0000003E>          ModInfo.SampVol:    resw 31
  1585                                  
  1586                                  ; MODPLAY.ASM
  1587 0000144A <res 000006B2>          PitchTable:	resw 857
  1588 00001AFC <res 00004100>          VolTable:	resb 16640
  1589 00005BFC <res 00001000>          MixBuffer       resb MixBufSize
  1590                                  
  1591                                  ; MODPLAY.ASM
  1592 00006BFC <res 00000001>          OrderPos:	resb 1
  1593 00006BFD <res 00000001>          Tempo:		resb 1
  1594 00006BFE <res 00000001>          TempoWait:	resb 1
  1595 00006BFF <res 00000001>          Bpm:		resb 1
  1596 00006C00 <res 00000001>          Row:		resb 1
  1597 00006C01 <res 00000001>          BreakRow:	resb 1
  1598 00006C02 <res 00000002>          BpmSamples:	resw 1
  1599 00006C04 <res 00000004>          BufPtr:		resd 1
  1600 00006C08 <res 00000002>          BufLen:		resw 1
  1601 00006C0A <res 00000004>          BufRep:		resd 1
  1602 00006C0E <res 00000004>          Note:		resd 1
  1603 00006C12 <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1604                                  
  1605 00006CA2 <res 0000000E>          alignb 16
  1606                                  
  1607                                  ; PLAY.ASM
  1608 00006CB0 <res 00000280>          Scope:		resw 320
  1609 00006F30 <res 00000200>          RowOfs:		resw 256
  1610                                  
  1611                                  mod_file_name:
  1612 00007130 <res 00000050>          		resb 80
  1613                                  
  1614 00007180 <res 00000E80>          alignb 4096
  1615                                  
  1616                                  Audio_Buffer:
  1617 00008000 <res 00008000>          		resb 32768
  1618                                  
  1619                                  g_buff:
  1620 00010000 <res 00000140>          		resb 320
  1621 00010140 <res 000000C0>          		resb 192			
  1622                                  
  1623 00010200 <res 0000FE00>          alignb 65536
  1624                                  
  1625                                  file_buffer:
  1626 00020000 <res 00070000>          		resb 65536*7
  1627                                  EOF:
