     1                                  ; ****************************************************************************
     2                                  ; playmod3.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PLAYMOD3.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[00000800]            	mov	ecx, EOF
   115 00000005 BF[080E0000]            	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 E8ED010000              	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[12020000]        <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 E9AF010000                      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 0F82AC010000            	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 0F849A010000            	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[8B0C0000]        <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 0F820F010000            	jc	error_exit
   173                                  _2:
   174                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   175                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   176                                  	;jc	error_exit
   177                                  	
   178                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   179                                  	sys	_audio, 0300h, 1, srb 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1>  %if %0 >= 2
   179 000000A7 BB00030000          <1>  mov ebx, %2
   179                              <1>  %if %0 >= 3
   179 000000AC B901000000          <1>  mov ecx, %3
   179                              <1>  %if %0 = 4
   179 000000B1 BA[170E0000]        <1>  mov edx, %4
   179                              <1>  %endif
   179                              <1>  %endif
   179                              <1>  %endif
   179 000000B6 B820000000          <1>  mov eax, %1
   179                              <1> 
   179 000000BB CD40                <1>  int 40h
   180 000000BD 0F82F3000000            	jc	error_exit
   181                                  
   182                                  LoadMod:  
   183 000000C3 BF[30710000]            	mov	edi, mod_file_name
   184 000000C8 E810020000              	call    LoadModule		; Load the MODule...
   185                                  
   186 000000CD 66833D[1A0E0000]00      	cmp     word [ErrorInfo], 0	; any error loading?
   187 000000D5 741B                    	je      short short _3
   188                                  
   189                                  	; yes, print error and Exit.
   190                                  
   191                                  	sys	_msg, ErrorMesg, 255, 0Fh
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1>  %if %0 >= 2
   191 000000D7 BB[BF0C0000]        <1>  mov ebx, %2
   191                              <1>  %if %0 >= 3
   191 000000DC B9FF000000          <1>  mov ecx, %3
   191                              <1>  %if %0 = 4
   191 000000E1 BA0F000000          <1>  mov edx, %4
   191                              <1>  %endif
   191                              <1>  %endif
   191                              <1>  %endif
   191 000000E6 B823000000          <1>  mov eax, %1
   191                              <1> 
   191 000000EB CD40                <1>  int 40h
   192                                  
   193 000000ED E9F2000000              	jmp     Exit
   194                                  
   195                                  _3:
   196                                  	; 10/06/2017
   197                                  	sys	_audio, 0E00h ; get audio controller info
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1> 
   197                              <1>  %if %0 >= 2
   197 000000F2 BB000E0000          <1>  mov ebx, %2
   197                              <1>  %if %0 >= 3
   197                              <1>  mov ecx, %3
   197                              <1>  %if %0 = 4
   197                              <1>  mov edx, %4
   197                              <1>  %endif
   197                              <1>  %endif
   197                              <1>  %endif
   197 000000F7 B820000000          <1>  mov eax, %1
   197                              <1> 
   197 000000FC CD40                <1>  int 40h
   198 000000FE 0F82B2000000            	jc	error_exit
   199                                  
   200                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   201                                  	;jne	_dev_not_ready	
   202                                  
   203                                  	; EAX = IRQ Number in AL
   204                                  	;	Audio Device Number in AH 
   205                                  	; EBX = DEV/VENDOR ID
   206                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   207                                  	; ECX = BUS/DEV/FN 
   208                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   209                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   210                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   211                                  	;      (Low word, DX = NAMBAR address)
   212                                  
   213 00000104 A2[160E0000]            	mov	[ac97_int_ln_reg], al
   214 00000109 891D[080E0000]          	mov	[dev_vendor], ebx
   215 0000010F 890D[0C0E0000]          	mov	[bus_dev_fn], ecx
   216 00000115 668915[140E0000]        	mov	[ac97_io_base], dx
   217                                    
   218 0000011C E884090000              	call	write_audio_dev_info 
   219                                  
   220                                  PlayNow: 
   221 00000121 E8AA080000              	call    StartPlaying
   222                                  
   223                                         ; load 32768 bytes into audio buffer
   224 00000126 BF[00800000]            	mov     edi, Audio_Buffer
   225 0000012B BB00800000              	mov	ebx, BUFFERSIZE
   226 00000130 E81E080000              	call	GetSamples
   227 00000135 727F                    	jc	error_exit
   228                                  
   229                                  	;mov	ecx, 128	; Make a lookup table
   230 00000137 B180                    	mov	cl, 128
   231 00000139 31DB                    	xor     ebx, ebx	; for fastest pixel
   232 0000013B BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   233                                  MakeOfs:        
   234 00000140 668993[306F0000]        	mov     [RowOfs+ebx], dx
   235 00000147 668993[326F0000]        	mov     [RowOfs+ebx+2], dx
   236 0000014E 6681C24001              	add     dx, 320
   237 00000153 83C304                  	add     ebx, 4
   238 00000156 E2E8                    	loop    MakeOfs
   239                                  
   240                                  	; 23/06/2017
   241                                  	; Map DMA buffer to user's memory space
   242                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
   242                              <1> 
   242                              <1> 
   242                              <1> 
   242                              <1> 
   242                              <1>  %if %0 >= 2
   242 00000158 BB000D0000          <1>  mov ebx, %2
   242                              <1>  %if %0 >= 3
   242 0000015D B900000100          <1>  mov ecx, %3
   242                              <1>  %if %0 = 4
   242 00000162 BA[00000100]        <1>  mov edx, %4
   242                              <1>  %endif
   242                              <1>  %endif
   242                              <1>  %endif
   242 00000167 B820000000          <1>  mov eax, %1
   242                              <1> 
   242 0000016C CD40                <1>  int 40h
   243                                  	;jc	error_exit
   244                                  
   245                                  	; Set Master Volume Level
   246                                  	sys	_audio, 0B00h, 1D1Dh
   246                              <1> 
   246                              <1> 
   246                              <1> 
   246                              <1> 
   246                              <1>  %if %0 >= 2
   246 0000016E BB000B0000          <1>  mov ebx, %2
   246                              <1>  %if %0 >= 3
   246 00000173 B91D1D0000          <1>  mov ecx, %3
   246                              <1>  %if %0 = 4
   246                              <1>  mov edx, %4
   246                              <1>  %endif
   246                              <1>  %endif
   246                              <1>  %endif
   246 00000178 B820000000          <1>  mov eax, %1
   246                              <1> 
   246 0000017D CD40                <1>  int 40h
   247                                  
   248                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   249                                  	
   250                                  	; Start	to play
   251 0000017F A0[650D0000]            	mov	al, [bps]
   252 00000184 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   253 00000187 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   254 00000189 8A1D[640D0000]          	mov	bl, [stmo]
   255 0000018F FECB                    	dec	bl
   256 00000191 08C3                    	or	bl, al
   257 00000193 668B0D[660D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   258 0000019A B704                    	mov	bh, 4 ; start to play	
   259                                  	sys	_audio
   259                              <1> 
   259                              <1> 
   259                              <1> 
   259                              <1> 
   259                              <1>  %if %0 >= 2
   259                              <1>  mov ebx, %2
   259                              <1>  %if %0 >= 3
   259                              <1>  mov ecx, %3
   259                              <1>  %if %0 = 4
   259                              <1>  mov edx, %4
   259                              <1>  %endif
   259                              <1>  %endif
   259                              <1>  %endif
   259 0000019C B820000000          <1>  mov eax, %1
   259                              <1> 
   259 000001A1 CD40                <1>  int 40h
   260                                      
   261                                  	;; SETUP SIGNAL RESPONSE BYTE
   262                                  	;; 06/03/2017
   263                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   264                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   265                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   266                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   267                                  	;sys	_calbac
   268                                  	;jc	short error_exit
   269                                  
   270                                  	; DIRECT VGA MEMORY ACCESS
   271                                  	; bl = 0, bh = 5
   272                                  	; Direct access/map to VGA memory (0A0000h)
   273                                  
   274                                  	sys	_video, 0500h
   274                              <1> 
   274                              <1> 
   274                              <1> 
   274                              <1> 
   274                              <1>  %if %0 >= 2
   274 000001A3 BB00050000          <1>  mov ebx, %2
   274                              <1>  %if %0 >= 3
   274                              <1>  mov ecx, %3
   274                              <1>  %if %0 = 4
   274                              <1>  mov edx, %4
   274                              <1>  %endif
   274                              <1>  %endif
   274                              <1>  %endif
   274 000001A8 B81F000000          <1>  mov eax, %1
   274                              <1> 
   274 000001AD CD40                <1>  int 40h
   275 000001AF 3D00000A00              	cmp	eax, 0A0000h
   276 000001B4 7418                    	je	short _a3
   277                                  error_exit:
   278                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1>  %if %0 >= 2
   278 000001B6 BB[DC0C0000]        <1>  mov ebx, %2
   278                              <1>  %if %0 >= 3
   278 000001BB B9FF000000          <1>  mov ecx, %3
   278                              <1>  %if %0 = 4
   278 000001C0 BA0E000000          <1>  mov edx, %4
   278                              <1>  %endif
   278                              <1>  %endif
   278                              <1>  %endif
   278 000001C5 B823000000          <1>  mov eax, %1
   278                              <1> 
   278 000001CA CD40                <1>  int 40h
   279 000001CC EB16                    	jmp	short Exit
   280                                  
   281                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   282                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   283                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   284                                  ;       second, or the module will sound "looped".
   285                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   286                                  ;       the polling is called from my routine, and then the irq 0 must be
   287                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   288                                  ;       samples played by the Sound Blaster. Note that some samples are
   289                                  ;       discarded in the next code, just for fun!
   290                                  
   291                                  _a3:
   292 000001CE 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   293 000001D2 CD31                    	int     31h
   294                                  
   295 000001D4 E870000000              	call	ModPlay ; 13/02/2017
   296                                  
   297                                  _s_exit:
   298 000001D9 E896080000              	call	StopPlaying	; STOP!
   299                                  
   300 000001DE 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   301 000001E2 CD31                    	int     31h
   302                                  Exit:           
   303                                  	;call    FreeModule	; Free MODule core.
   304                                  	
   305                                  	sys 	_exit	; Bye !
   305                              <1> 
   305                              <1> 
   305                              <1> 
   305                              <1> 
   305                              <1>  %if %0 >= 2
   305                              <1>  mov ebx, %2
   305                              <1>  %if %0 >= 3
   305                              <1>  mov ecx, %3
   305                              <1>  %if %0 = 4
   305                              <1>  mov edx, %4
   305                              <1>  %endif
   305                              <1>  %endif
   305                              <1>  %endif
   305 000001E4 B801000000          <1>  mov eax, %1
   305                              <1> 
   305 000001E9 CD40                <1>  int 40h
   306                                  here:
   307 000001EB EBFE                    	jmp	short here
   308                                  
   309                                  pmsg_2017:
   310                                  	sys	_msg, msg_2017, 255, 0Fh
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1>  %if %0 >= 2
   310 000001ED BB[260C0000]        <1>  mov ebx, %2
   310                              <1>  %if %0 >= 3
   310 000001F2 B9FF000000          <1>  mov ecx, %3
   310                              <1>  %if %0 = 4
   310 000001F7 BA0F000000          <1>  mov edx, %4
   310                              <1>  %endif
   310                              <1>  %endif
   310                              <1>  %endif
   310 000001FC B823000000          <1>  mov eax, %1
   310                              <1> 
   310 00000201 CD40                <1>  int 40h
   311 00000203 EBDF                    	jmp	short Exit
   312                                  
   313                                  DetectVT8233:
   314                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   315                                          sys	_audio, 0103h
   315                              <1> 
   315                              <1> 
   315                              <1> 
   315                              <1> 
   315                              <1>  %if %0 >= 2
   315 00000205 BB03010000          <1>  mov ebx, %2
   315                              <1>  %if %0 >= 3
   315                              <1>  mov ecx, %3
   315                              <1>  %if %0 = 4
   315                              <1>  mov edx, %4
   315                              <1>  %endif
   315                              <1>  %endif
   315                              <1>  %endif
   315 0000020A B820000000          <1>  mov eax, %1
   315                              <1> 
   315 0000020F CD40                <1>  int 40h
   316 00000211 C3                      	retn
   317                                  
   318                                  noDevMsg:
   319 00000212 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   319 0000021B 61626C6520746F2066-
   319 00000224 696E64205649412056-
   319 0000022D 543832333320626173-
   319 00000236 656420617564696F20-
   319 0000023F 646576696365210D0A-
   319 00000248 00                 
   320                                  
   321                                  ;ac97_int_handler:
   322                                  ;	; 19/06/2017
   323                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   324                                  ;
   325                                  ;	sys	_rele ; return from callback service 
   326                                  ;	; we must not come here !
   327                                  ;	sys	_exit
   328                                  
   329                                  ;=============================================================================
   330                                  ;      
   331                                  ;=============================================================================
   332                                  
   333                                  ModPlay:
   334                                  	; 23/06/2017   
   335                                  	; 21/06/2017
   336                                  	; 19/06/2017
   337                                  
   338                                  	; 05/03/2017 (TRDOS 386)
   339                                  	; 14/02/2017
   340                                  	; 13/02/2017
   341                                  	; 08/12/2016
   342                                  	; 28/11/2016
   343                                  
   344 00000249 EB10                         	jmp	short modp_gs ; 23/06/2017
   345                                  p_loop:
   346 0000024B 803D[170E0000]00        	cmp	byte [srb], 0
   347 00000252 7616                    	jna	short q_loop
   348 00000254 C605[170E0000]00        	mov	byte [srb], 0
   349                                  modp_gs:
   350 0000025B BF[00800000]            	mov     edi, Audio_Buffer
   351 00000260 BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   352 00000265 E8E9060000              	call    GetSamples
   353                                  q_loop:
   354 0000026A B401                    	mov     ah, 1		; any key pressed?
   355 0000026C CD32                    	int     32h		; no, Loop.
   356 0000026E 7405                    	jz	short r_loop
   357                                  
   358 00000270 B400                    	mov     ah, 0		; flush key buffer...
   359 00000272 CD32                    	int     32h
   360                                  q_return:
   361 00000274 C3                      	retn
   362                                  r_loop:
   363                                  	; Get Current DMA buffer Pointer 
   364                                  	; 23/06/2017
   365                                  	; bh = 15, get current pointer (DMA buffer offset)
   366                                  	; bl = 0, for PCM OUT
   367                                  	; ecx = 0
   368                                  	;
   369                                  	sys	_audio, 0F00h, 0
   369                              <1> 
   369                              <1> 
   369                              <1> 
   369                              <1> 
   369                              <1>  %if %0 >= 2
   369 00000275 BB000F0000          <1>  mov ebx, %2
   369                              <1>  %if %0 >= 3
   369 0000027A B900000000          <1>  mov ecx, %3
   369                              <1>  %if %0 = 4
   369                              <1>  mov edx, %4
   369                              <1>  %endif
   369                              <1>  %endif
   369                              <1>  %endif
   369 0000027F B820000000          <1>  mov eax, %1
   369                              <1> 
   369 00000284 CD40                <1>  int 40h
   370                                  ScopeLoop:
   371 00000286 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   372                                  	; 23/06/2017
   373 0000028B BE[00000100]            	mov	esi, DMA_Buffer
   374 00000290 01C6                    	add     esi, eax	; add offset value
   375                                  	;
   376                                  	; 24/06/2017
   377 00000292 B9[C0FE0100]            	mov	ecx, DMA_Buffer + (65536 - 320) 
   378 00000297 39CE                    	cmp	esi, ecx 
   379 00000299 7602                    	jna	short _4
   380 0000029B 89CE                    	mov	esi, ecx
   381                                  _4:
   382 0000029D 31C9                    	xor     ecx, ecx	; to be drawed ...
   383 0000029F 31D2                    	xor     edx, edx
   384                                  DrawLoop:       
   385 000002A1 89D3                    	mov     ebx, edx	; (save Index)
   386 000002A3 668BBB[B06C0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   387 000002AA C60700                  	mov     byte [edi], 0	; erase it!
   388                                  	;lodsb
   389                                  	;mov	bl, al
   390 000002AD 8A1E                    	mov	bl, [esi]	; get a sample (8-bit)
   391 000002AF 46                      	inc	esi		; calc new pixel address...
   392 000002B0 30FF                    	xor     bh, bh
   393 000002B2 66D1E3                  	shl     bx, 1
   394 000002B5 668BBB[306F0000]        	mov     di, [RowOfs+ebx]
   395 000002BC 6601CF                  	add     di, cx
   396 000002BF 6689D3                  	mov     bx, dx		; (restore Index)
   397 000002C2 6689BB[B06C0000]        	mov     [Scope+ebx], di	; save new address...
   398 000002C9 C6070A                  	mov     byte [edi], 10	; and DRAW.
   399 000002CC 6683C202                	add     dx, 2		; the next pixel...
   400 000002D0 41                      	inc     ecx
   401 000002D1 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   402 000002D6 72C9                    	jb      short DrawLoop
   403 000002D8 E96EFFFFFF              	jmp	p_loop
   404                                  
   405                                  
   406                                  ;=============================================================================
   407                                  ;               MODLOAD.ASM
   408                                  ;=============================================================================
   409                                  
   410                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   411                                  ;	July 10th, 1993.
   412                                  
   413                                  ; STRUCTURES
   414                                  
   415                                  struc ModSample
   416 00000000 <res 00000016>          .msName:	resb 22
   417 00000016 <res 00000002>          .msLength:	resw 1
   418 00000018 <res 00000001>          .msFinetune:	resb 1
   419 00000019 <res 00000001>          .msVolume:	resb 1
   420 0000001A <res 00000002>          .msRepeat:	resw 1
   421 0000001C <res 00000002>          .msRepLen:	resw 1
   422                                  .size:
   423                                  endstruc
   424                                  
   425                                  struc ModHeader
   426 00000000 <res 00000014>          .mhName:	resb 20
   427 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   428 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   429 000003B7 <res 00000001>          .mhReStart:	resb 1
   430 000003B8 <res 00000080>          .mhOrder:	resb 128
   431 00000438 <res 00000004>          .mhSign:	resw 2
   432                                  .size:	
   433                                  endstruc
   434                                  
   435                                  struc ModInfoRec
   436 00000000 <res 00000001>          .OrderLen:	resb 1
   437 00000001 <res 00000001>          .ReStart:	resb 1
   438 00000002 <res 00000080>          .Order:	resb 128
   439 00000082 <res 00000004>          .Patterns:	resd 1
   440 00000086 <res 0000003E>          .SampOfs:	resw 31
   441 000000C4 <res 0000003E>          .SampSeg:	resw 31
   442 00000102 <res 0000003E>          .SampLen:	resw 31
   443 00000140 <res 0000003E>          .SampRep:	resw 31
   444 0000017E <res 0000003E>          .SampRepLen:	resw 31
   445 000001BC <res 0000003E>          .SampVol:	resw 31
   446                                  .size:	
   447                                  endstruc
   448                                  
   449                                  ; CODE
   450                                  
   451                                  LoadModule:
   452                                  	; edi = file name address
   453                                  
   454 000002DD 60                      	pushad
   455                                  
   456 000002DE 66C705[1A0E0000]01-     	mov	word [ErrorInfo], 1
   456 000002E6 00                 
   457                                  
   458 000002E7 E88F010000              	call    ClearModInfo
   459                                  OpenFile:       
   460                                  	; ebx = ASCIIZ file name address
   461                                  	; ecx = open mode (0 = open for read)	
   462                                  	sys	_open, edi, 0 ; open for reading
   462                              <1> 
   462                              <1> 
   462                              <1> 
   462                              <1> 
   462                              <1>  %if %0 >= 2
   462 000002EC 89FB                <1>  mov ebx, %2
   462                              <1>  %if %0 >= 3
   462 000002EE B900000000          <1>  mov ecx, %3
   462                              <1>  %if %0 = 4
   462                              <1>  mov edx, %4
   462                              <1>  %endif
   462                              <1>  %endif
   462                              <1>  %endif
   462 000002F3 B805000000          <1>  mov eax, %1
   462                              <1> 
   462 000002F8 CD40                <1>  int 40h
   463 000002FA 0F8279010000            	jc	Failed
   464 00000300 A3[180E0000]            	mov     [FileHandle], eax
   465                                  ReadHeader:
   466                                  	; ebx = File handle
   467                                  	; ecx = Buffer address
   468                                  	; edx = Byte count
   469                                  	sys	_read, [FileHandle], Header, ModHeader.size
   469                              <1> 
   469                              <1> 
   469                              <1> 
   469                              <1> 
   469                              <1>  %if %0 >= 2
   469 00000305 8B1D[180E0000]      <1>  mov ebx, %2
   469                              <1>  %if %0 >= 3
   469 0000030B B9[1C0E0000]        <1>  mov ecx, %3
   469                              <1>  %if %0 = 4
   469 00000310 BA3C040000          <1>  mov edx, %4
   469                              <1>  %endif
   469                              <1>  %endif
   469                              <1>  %endif
   469 00000315 B803000000          <1>  mov eax, %1
   469                              <1> 
   469 0000031A CD40                <1>  int 40h
   470 0000031C 0F824A010000            	jc      CloseFile
   471                                  CheckMK:        
   472 00000322 813D[54120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   472 0000032A 4B2E               
   473 0000032C 7440                    	je      short IsModFile
   474                                  CheckFLT4:
   475 0000032E 813D[54120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   475 00000336 5434               
   476 00000338 7434                    	je      short IsModFile
   477                                  Is15Inst:
   478 0000033A BE[F20F0000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   479 0000033F BF[D2110000]            	mov     edi, Header+ModHeader.mhOrderLen
   480                                  	;cld
   481                                  	;mov	ecx, 130
   482 00000344 66B98200                	mov	cx, 130
   483 00000348 F3A4                    	rep     movsb
   484 0000034A BF[F20F0000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   485 0000034F 30C0                    	xor     al, al
   486 00000351 66B9E001                	mov     cx, 16*ModSample.size
   487 00000355 F3AA                    	rep     stosb
   488                                  SeekPatterns:   
   489                                  	; ebx = [FileHandle]
   490                                  	; ecx = offset
   491                                  	; edx = switch (0 = from beginning)
   492                                  	sys	_seek, [FileHandle], 600, 0
   492                              <1> 
   492                              <1> 
   492                              <1> 
   492                              <1> 
   492                              <1>  %if %0 >= 2
   492 00000357 8B1D[180E0000]      <1>  mov ebx, %2
   492                              <1>  %if %0 >= 3
   492 0000035D B958020000          <1>  mov ecx, %3
   492                              <1>  %if %0 = 4
   492 00000362 BA00000000          <1>  mov edx, %4
   492                              <1>  %endif
   492                              <1>  %endif
   492                              <1>  %endif
   492 00000367 B813000000          <1>  mov eax, %1
   492                              <1> 
   492 0000036C CD40                <1>  int 40h
   493                                  IsModFile:
   494 0000036E A0[D2110000]            	mov     al, [Header+ModHeader.mhOrderLen]
   495 00000373 A2[58120000]            	mov     [ModInfo.OrderLen], al
   496                                  
   497 00000378 A0[D3110000]            	mov     al, [Header+ModHeader.mhReStart]
   498 0000037D 3A05[D2110000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   499 00000383 7202                    	jb      short SetReStart
   500 00000385 B07F                    	mov     al, 7Fh
   501                                  SetReStart:
   502 00000387 A2[59120000]            	mov     [ModInfo.ReStart], al
   503                                  
   504                                  	;mov	ecx, 128
   505 0000038C 66B98000                	mov	cx, 128
   506 00000390 31D2                    	xor     edx, edx
   507 00000392 31DB                    	xor     ebx, ebx
   508                                  CopyOrder:
   509 00000394 8AB3[D4110000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   510 0000039A 88B3[5A120000]          	mov     [ModInfo.Order+ebx], dh
   511 000003A0 38D6                    	cmp     dh, dl
   512 000003A2 7202                    	jb      short NextOrder
   513 000003A4 88F2                    	mov     dl, dh
   514                                  NextOrder:
   515 000003A6 43                      	inc     ebx
   516 000003A7 E2EB                    	loop    CopyOrder
   517                                  AllocPatterns:  
   518 000003A9 81E2FF000000            	and	edx, 0FFh
   519 000003AF 6642                    	inc	dx ; 14/03/2017
   520                                  	; dl = count of 1024 bytes
   521 000003B1 C1E20A                  	shl	edx, 10 ; *1024
   522                                  
   523 000003B4 89D5                    	mov	ebp, edx
   524                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   525 000003B6 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   526                                  	;
   527 000003BB 890D[DA120000]          	mov	[ModInfo.Patterns], ecx
   528                                  	;
   529 000003C1 01CD                    	add	ebp, ecx ; next offset for samples
   530                                  ReadPatterns:  
   531                                  	;mov	ebx, [FileHandle] 
   532                                  	; ebx = File handle
   533                                  	; ecx = Buffer address
   534                                  	; edx = Byte count
   535                                  	sys	_read, [FileHandle]
   535                              <1> 
   535                              <1> 
   535                              <1> 
   535                              <1> 
   535                              <1>  %if %0 >= 2
   535 000003C3 8B1D[180E0000]      <1>  mov ebx, %2
   535                              <1>  %if %0 >= 3
   535                              <1>  mov ecx, %3
   535                              <1>  %if %0 = 4
   535                              <1>  mov edx, %4
   535                              <1>  %endif
   535                              <1>  %endif
   535                              <1>  %endif
   535 000003C9 B803000000          <1>  mov eax, %1
   535                              <1> 
   535 000003CE CD40                <1>  int 40h
   536 000003D0 0F8296000000            	jc      CloseFile
   537                                  
   538 000003D6 BE[300E0000]            	mov	esi, Header+ModHeader.mhSamples
   539 000003DB 31FF                    	xor     edi, edi
   540                                  CopySamples:
   541 000003DD 668B4616                	mov     ax, [esi+ModSample.msLength]
   542 000003E1 86C4                    	xchg    al, ah
   543 000003E3 66D1E0                  	shl     ax, 1
   544 000003E6 668987[5A130000]        	mov     [ModInfo.SampLen+edi], ax
   545 000003ED 8A4619                  	mov     al, [esi+ModSample.msVolume]
   546 000003F0 30E4                    	xor     ah, ah
   547 000003F2 668987[14140000]        	mov     [ModInfo.SampVol+edi], ax
   548 000003F9 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   549 000003FD 86C4                    	xchg    al, ah
   550 000003FF 66D1E0                  	shl     ax, 1
   551 00000402 668987[98130000]        	mov     [ModInfo.SampRep+edi], ax
   552 00000409 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   553 0000040D 86C4                    	xchg    al, ah
   554 0000040F 66D1E0                  	shl     ax, 1
   555 00000412 668987[D6130000]        	mov     [ModInfo.SampRepLen+edi], ax
   556 00000419 83C61E                  	add     esi, ModSample.size
   557 0000041C 6683C702                	add     di, 2
   558 00000420 6683FF3E                	cmp     di, 2*31
   559 00000424 72B7                    	jb      short CopySamples
   560                                  
   561 00000426 31F6                    	xor     esi, esi
   562                                  AllocSamples:
   563 00000428 0FB796[5A130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   564 0000042F 09D2                    	or	edx, edx ; byte count
   565 00000431 7426                    	jz      short NextSample
   566 00000433 89E8                    	mov	eax, ebp
   567 00000435 668986[DE120000]        	mov	[ModInfo.SampOfs+esi], ax
   568 0000043C C1E810                  	shr	eax, 16
   569 0000043F 668986[1C130000]        	mov	[ModInfo.SampSeg+esi], ax
   570 00000446 89E9                    	mov	ecx, ebp
   571 00000448 01D5                    	add	ebp, edx ; next offset for sample 
   572                                  ReadSample:
   573                                  	;mov	ebx, [FileHandle]
   574                                  	;movzx  edx, [ModInfo.SampLen+esi]
   575                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   576                                  
   577                                  	; ebx = File handle
   578                                  	; ecx = Buffer address
   579                                  	; edx = Byte count
   580                                  	sys	_read, [FileHandle]
   580                              <1> 
   580                              <1> 
   580                              <1> 
   580                              <1> 
   580                              <1>  %if %0 >= 2
   580 0000044A 8B1D[180E0000]      <1>  mov ebx, %2
   580                              <1>  %if %0 >= 3
   580                              <1>  mov ecx, %3
   580                              <1>  %if %0 = 4
   580                              <1>  mov edx, %4
   580                              <1>  %endif
   580                              <1>  %endif
   580                              <1>  %endif
   580 00000450 B803000000          <1>  mov eax, %1
   580                              <1> 
   580 00000455 CD40                <1>  int 40h
   581 00000457 7213                    	jc      short CloseFile
   582                                  
   583                                  NextSample:
   584 00000459 6683C602                	add     si, 2
   585 0000045D 6683FE3E                	cmp     si, 2*31
   586 00000461 72C5                    	jb      short AllocSamples
   587                                  
   588 00000463 66C705[1A0E0000]00-     	mov     word [ErrorInfo], 0
   588 0000046B 00                 
   589                                  CloseFile:      
   590                                  	sys	_close, [FileHandle]
   590                              <1> 
   590                              <1> 
   590                              <1> 
   590                              <1> 
   590                              <1>  %if %0 >= 2
   590 0000046C 8B1D[180E0000]      <1>  mov ebx, %2
   590                              <1>  %if %0 >= 3
   590                              <1>  mov ecx, %3
   590                              <1>  %if %0 = 4
   590                              <1>  mov edx, %4
   590                              <1>  %endif
   590                              <1>  %endif
   590                              <1>  %endif
   590 00000472 B806000000          <1>  mov eax, %1
   590                              <1> 
   590 00000477 CD40                <1>  int 40h
   591                                  Failed:         
   592 00000479 61                      	popad
   593                                  
   594 0000047A C3                      	retn
   595                                  
   596                                  FreeModule:
   597                                  	; Erdogan Tan (13/02/2017)
   598                                  	; nothing to do here for memory de-allocation
   599                                  ClearModInfo:
   600 0000047B 57                      	push	edi
   601 0000047C BF[58120000]            	mov	edi, ModInfo
   602 00000481 B9FA010000              	mov     ecx, ModInfoRec.size
   603                                  	;cld
   604 00000486 30C0                    	xor     al, al
   605 00000488 F3AA                    	rep     stosb
   606 0000048A 5F                      	pop	edi
   607 0000048B C3                      	retn
   608                                  
   609                                  ;=============================================================================
   610                                  ;               MODPLAY.ASM
   611                                  ;=============================================================================
   612                                  
   613                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   614                                  ;	July 23th, 1993.
   615                                  
   616                                  ; EQUATES
   617                                  
   618                                  NumTracks       equ 4
   619                                  DefTempo        equ 6
   620                                  DefBpm          equ 125
   621                                  MidCRate        equ 8448
   622                                  MixBufSize      equ 4096
   623                                  
   624                                  ; STRUCTURES
   625                                  
   626                                  struc TrackInfo
   627 00000000 <res 00000004>          .Samples:	resd 1
   628 00000004 <res 00000004>          .Position:	resd 1
   629 00000008 <res 00000002>          .Len:	resw 1
   630 0000000A <res 00000002>          .Repeat:	resw 1
   631 0000000C <res 00000002>          .RepLen:	resw 1
   632 0000000E <res 00000001>          .Volume: 	resb 1
   633 0000000F <res 00000001>          .Error:	resb 1
   634 00000010 <res 00000002>          .Period:	resw 1
   635 00000012 <res 00000002>          .Pitch:	resw 1
   636 00000014 <res 00000002>          .Effect:	resw 1
   637 00000016 <res 00000002>          .PortTo:	resw 1
   638 00000018 <res 00000001>          .PortParm:	resb 1
   639 00000019 <res 00000001>          .VibPos:	resb 1
   640 0000001A <res 00000001>          .VibParm:	resb 1
   641 0000001B <res 00000001>          .OldSampOfs:	resb 1
   642 0000001C <res 00000006>          .Arp:	resw 3
   643 00000022 <res 00000002>          .ArpIndex:	resw 1
   644                                  .size:
   645                                  endstruc
   646                                  
   647                                  ; CODE
   648                                  
   649                                  ;--------------------------------------------------------------------------
   650                                  ; BeatTrack:  Process the next beat in one track.
   651                                  ;  In:
   652                                  ;    ds:di -  Track info Address.
   653                                  ;--------------------------------------------------------------------------
   654                                  
   655                                  ; edi = Track info address
   656                                  
   657                                  BeatTrack:
   658 0000048C 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   659 00000490 6685D2                  	test    dx, dx
   660 00000493 743C                    	je      short None
   661 00000495 80FE00                  	cmp     dh, 00h
   662 00000498 7438                    	je      short Arpeggio
   663 0000049A 80FE01                  	cmp     dh, 01h
   664 0000049D 7451                    	je      short PortUp
   665 0000049F 80FE02                  	cmp     dh, 02h
   666 000004A2 7471                    	je      short PortDown
   667 000004A4 80FE03                  	cmp     dh, 03h
   668 000004A7 0F848E000000            	je      TonePort
   669 000004AD 80FE04                  	cmp     dh, 04h
   670 000004B0 0F84BD000000            	je      Vibrato
   671 000004B6 80FE05                  	cmp     dh, 05h
   672 000004B9 0F840E010000            	je      PortSlide
   673 000004BF 80FE06                  	cmp     dh, 06h
   674 000004C2 0F8412010000            	je      VibSlide
   675 000004C8 80FE0A                  	cmp     dh, 0Ah
   676 000004CB 0F8413010000            	je      VolSlide
   677                                  None:           
   678 000004D1 C3                      	retn
   679                                  Arpeggio:
   680 000004D2 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   681 000004D6 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   682 000004DB 66894712                	mov     [edi+TrackInfo.Pitch], ax
   683 000004DF 6683C302                	add     bx, 2
   684 000004E3 6683FB06                	cmp     bx, 6
   685 000004E7 7202                    	jb      short SetArpIndex
   686 000004E9 31DB                    	xor     ebx, ebx
   687                                  SetArpIndex:
   688 000004EB 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   689 000004EF C3                      	retn
   690                                  PortUp:
   691 000004F0 30F6                    	xor     dh, dh
   692 000004F2 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   693 000004F6 6629D3                  	sub     bx, dx
   694 000004F9 6683FB71                	cmp     bx, 113
   695 000004FD 7D04                    	jge     short NotSmall
   696 000004FF 66BB7100                	mov     bx, 113
   697                                  NotSmall:
   698 00000503 66895F10                	mov     [edi+TrackInfo.Period], bx
   699 00000507 6601DB                  	add     bx, bx
   700 0000050A 66678B87[5214]          	mov     ax, [PitchTable+bx]
   701 00000510 66894712                	mov     [edi+TrackInfo.Pitch], ax
   702 00000514 C3                      	retn
   703                                  PortDown:
   704 00000515 30F6                    	xor     dh, dh
   705 00000517 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   706 0000051B 6601D3                  	add     bx, dx
   707 0000051E 6681FB5803              	cmp     bx, 856
   708 00000523 7E04                    	jle     short NotBig
   709 00000525 66BB5803                	mov     bx, 856
   710 00000529 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   711 0000052D 6601DB                  	add     bx, bx
   712 00000530 66678B87[5214]          	mov     ax, [PitchTable+bx]
   713 00000536 66894712                	mov     [edi+TrackInfo.Pitch], ax
   714 0000053A C3                      	retn
   715                                  TonePort:
   716 0000053B 30F6                    	xor     dh, dh
   717 0000053D 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   718 00000541 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   719 00000545 6639C3                  	cmp     bx, ax
   720 00000548 7428                    	je      short NoPort
   721 0000054A 7F0D                    	jg      short PortToUp
   722                                  PortToDown:     
   723 0000054C 6601D3                  	add     bx, dx
   724 0000054F 6639C3                  	cmp     bx, ax
   725 00000552 7E0D                    	jle     short SetPort
   726                                  FixPort:        
   727 00000554 6689C3                  	mov     bx, ax
   728 00000557 EB08                    	jmp     short SetPort
   729                                  PortToUp:
   730 00000559 6629D3                  	sub     bx, dx
   731 0000055C 6639C3                  	cmp     bx, ax
   732 0000055F 7CF3                    	jl      short FixPort
   733                                  SetPort:        
   734 00000561 66895F10                	mov     [edi+TrackInfo.Period], bx
   735 00000565 6601DB                  	add     bx, bx
   736 00000568 66678B87[5214]          	mov     ax, [PitchTable+bx]
   737 0000056E 66894712                	mov     [edi+TrackInfo.Pitch], ax
   738                                  NoPort:         
   739 00000572 C3                      	retn
   740                                  Vibrato:
   741 00000573 88D6                    	mov     dh, dl
   742 00000575 80E20F                  	and     dl, 0Fh
   743 00000578 C0EE04                  	shr     dh, 4
   744 0000057B C0E602                  	shl     dh, 2
   745 0000057E 007719                  	add     [edi+TrackInfo.VibPos], dh
   746 00000581 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   747 00000584 88F3                    	mov     bl, dh
   748 00000586 C0EB02                  	shr     bl, 2
   749 00000589 6683E31F                	and     bx, 1Fh
   750 0000058D 678A87[FC0C]            	mov     al, [SinTable+bx]
   751 00000592 F6E2                    	mul     dl
   752 00000594 66D1C0                  	rol     ax, 1
   753 00000597 86C4                    	xchg    al, ah
   754 00000599 80E401                  	and     ah, 1
   755 0000059C 84F6                    	test    dh, dh
   756 0000059E 7903                    	jns     short VibUp
   757 000005A0 66F7D8                  	neg     ax
   758                                  VibUp:          
   759 000005A3 66034710                	add     ax, [edi+TrackInfo.Period]
   760 000005A7 6689C3                  	mov     bx, ax
   761 000005AA 6683FB71                	cmp     bx, 113
   762 000005AE 7D04                    	jge     short NoLoVib
   763 000005B0 66BB7100                	mov     bx, 113
   764                                  NoLoVib:        
   765 000005B4 6681FB5803              	cmp     bx, 856
   766 000005B9 7E04                    	jle     short NoHiVib
   767 000005BB 66BB5803                	mov     bx, 856
   768                                  NoHiVib:        
   769 000005BF 6601DB                  	add     bx, bx
   770 000005C2 66678B87[5214]          	mov     ax, [PitchTable+bx]
   771 000005C8 66894712                	mov     [edi+TrackInfo.Pitch], ax
   772 000005CC C3                      	retn
   773                                  PortSlide:
   774 000005CD E812000000              	call    VolSlide
   775 000005D2 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   776 000005D5 E961FFFFFF              	jmp     TonePort
   777                                  VibSlide:
   778 000005DA E805000000              	call    VolSlide
   779 000005DF 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   780 000005E2 EB8F                    	jmp     short Vibrato
   781                                  VolSlide:
   782 000005E4 88D6                    	mov     dh, dl
   783 000005E6 80E20F                  	and     dl, 0Fh
   784 000005E9 C0EE04                  	shr     dh, 4
   785 000005EC 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   786 000005EF 28D0                    	sub     al, dl
   787 000005F1 7D02                    	jge     short NoLoVol
   788 000005F3 30C0                    	xor     al, al
   789                                  NoLoVol:        
   790 000005F5 00F0                    	add     al, dh
   791 000005F7 3C40                    	cmp     al, 64
   792 000005F9 7602                    	jbe     short NoHiVol
   793 000005FB B040                    	mov     al, 64
   794                                  NoHiVol:        
   795 000005FD 88470E                  	mov     [edi+TrackInfo.Volume], al
   796 00000600 C3                      	retn
   797                                  
   798                                  ;--------------------------------------------------------------------------
   799                                  ; GetTrack:   Get the next Note from a pattern.
   800                                  ;  In:
   801                                  ;    ds:di -  Track info Address.
   802                                  ;    es:si -  Pattern Note Address.
   803                                  ; Out:
   804                                  ;    es:si -  The Next Pattern Note address.
   805                                  ;--------------------------------------------------------------------------
   806                                  
   807                                  ; esi = Pattern note address
   808                                  ; edi = Track info address
   809                                  
   810                                  GetTrack:
   811 00000601 66AD                    	lodsw
   812 00000603 86C4                    	xchg    al, ah
   813 00000605 88E3                    	mov	bl, ah
   814 00000607 80E40F                  	and     ah, 0Fh
   815 0000060A 6689C1                  	mov     cx, ax
   816 0000060D 66AD                    	lodsw
   817 0000060F 86C4                    	xchg    al, ah
   818 00000611 88E7                    	mov     bh, ah
   819 00000613 80E40F                  	and     ah, 0Fh
   820 00000616 6689C2                  	mov     dx, ax
   821 00000619 66895714                	mov     [edi+TrackInfo.Effect], dx
   822 0000061D 80E3F0                  	and     bl, 0F0h
   823 00000620 C0EF04                  	shr     bh, 4
   824 00000623 08FB                    	or      bl, bh
   825 00000625 7449                    	je      short SetPeriod
   826                                  SetSample:
   827                                  	;xor    bh, bh
   828 00000627 81E3FF000000            	and	ebx, 0FFh
   829 0000062D 4B                      	dec     ebx
   830 0000062E 01DB                    	add     ebx, ebx
   831 00000630 668B83[14140000]        	mov     ax, [ModInfo.SampVol+ebx]
   832 00000637 88470E                  	mov     [edi+TrackInfo.Volume], al
   833 0000063A 668B83[DE120000]        	mov     ax, [ModInfo.SampOfs+ebx]
   834 00000641 668907                  	mov     [edi+TrackInfo.Samples], ax
   835 00000644 668B83[1C130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   836 0000064B 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   837 0000064F 668B83[5A130000]        	mov     ax, [ModInfo.SampLen+ebx]
   838 00000656 66894708                	mov     [edi+TrackInfo.Len], ax
   839 0000065A 668B83[98130000]        	mov     ax, [ModInfo.SampRep+ebx]
   840 00000661 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   841 00000665 668B83[D6130000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   842 0000066C 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   843                                  SetPeriod:      
   844 00000670 6685C9                  	test    cx, cx
   845 00000673 7424                    	jz      short SetEffect
   846                                  
   847 00000675 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   848 00000679 80FE03                  	cmp     dh, 03h
   849 0000067C 741B                    	je      short SetEffect
   850                                  
   851 0000067E 66894F10                	mov     [edi+TrackInfo.Period], cx
   852 00000682 6689CB                  	mov     bx, cx
   853 00000685 6601DB                  	add     bx, bx
   854 00000688 66678B87[5214]          	mov     ax, [PitchTable+bx]
   855 0000068E 66894712                	mov     [edi+TrackInfo.Pitch], ax
   856 00000692 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   857                                  SetEffect:
   858 00000699 6685D2                  	test    dx, dx
   859 0000069C 7430                    	jz      short InitNone
   860 0000069E 80FE00                  	cmp     dh, 00h
   861 000006A1 0F84E5000000            	je      InitArpeggio
   862 000006A7 80FE03                  	cmp     dh, 03h
   863 000006AA 7423                    	je      short InitTonePort
   864 000006AC 80FE04                  	cmp     dh, 04h
   865 000006AF 742D                    	je      short InitVibrato
   866 000006B1 80FE09                  	cmp     dh, 09h
   867 000006B4 7451                    	je      short SampleOfs
   868 000006B6 80FE0B                  	cmp     dh, 0Bh
   869 000006B9 7462                    	je      short PosJump
   870 000006BB 80FE0C                  	cmp     dh, 0Ch
   871 000006BE 746B                    	je      short SetVolume
   872 000006C0 80FE0D                  	cmp     dh, 0Dh
   873 000006C3 7471                    	je      short Break
   874 000006C5 80FE0F                  	cmp     dh, 0Fh
   875 000006C8 0F8487000000            	je      SetSpeed
   876                                  InitNone:
   877 000006CE C3                      	retn
   878                                  InitTonePort:
   879 000006CF 84D2                    	test    dl, dl
   880 000006D1 7503                    	jnz     short SetPortParm
   881 000006D3 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   882                                  SetPortParm:    
   883 000006D6 885718                  	mov     [edi+TrackInfo.PortParm], dl
   884 000006D9 66895714                	mov     [edi+TrackInfo.Effect], dx
   885 000006DD C3                      	retn
   886                                  InitVibrato:
   887 000006DE 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   888 000006E1 88C4                    	mov     ah, al
   889 000006E3 240F                    	and     al, 0Fh
   890 000006E5 80E4F0                  	and     ah, 0F0h
   891 000006E8 F6C20F                  	test    dl, 0Fh
   892 000006EB 7502                    	jne     short OkDepth
   893 000006ED 08C2                    	or      dl, al
   894                                  OkDepth:        
   895 000006EF F6C2F0                  	test    dl, 0F0h
   896 000006F2 7502                    	jnz     short OkRate
   897 000006F4 08E2                    	or      dl, ah
   898                                  OkRate:         
   899 000006F6 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   900 000006F9 66895714                	mov     [edi+TrackInfo.Effect], dx
   901 000006FD 6685C9                  	test    cx, cx
   902 00000700 7404                    	jz      short OkPos
   903 00000702 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   904                                  OkPos:          
   905 00000706 C3                      	retn
   906                                  SampleOfs:      
   907 00000707 84D2                    	test    dl, dl
   908 00000709 7503                    	jnz     short SetSampleOfs
   909 0000070B 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   910                                  SetSampleOfs:
   911 0000070E 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   912 00000711 88D6                    	mov     dh, dl
   913 00000713 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   914 00000719 895704                  	mov     [edi+TrackInfo.Position], edx
   915 0000071C C3                      	retn
   916                                  PosJump:
   917 0000071D 8815[046C0000]          	mov     [OrderPos], dl
   918 00000723 C605[086C0000]40        	mov     byte [Row], 64
   919 0000072A C3                      	retn
   920                                  SetVolume:
   921 0000072B 80FA40                  	cmp     dl, 64
   922 0000072E 7602                    	jbe     short OkVol
   923 00000730 B240                    	mov     dl, 64
   924                                  OkVol:
   925 00000732 88570E                  	mov     [edi+TrackInfo.Volume], dl
   926 00000735 C3                      	retn
   927                                  Break:
   928 00000736 88D6                    	mov     dh, dl
   929 00000738 80E20F                  	and     dl, 0Fh
   930 0000073B C0EE04                  	shr     dh, 4
   931 0000073E 00F6                    	add     dh, dh
   932 00000740 00F2                    	add     dl, dh
   933 00000742 C0E602                  	shl     dh, 2
   934 00000745 00F2                    	add     dl, dh
   935 00000747 8815[096C0000]          	mov     [BreakRow], dl
   936 0000074D C605[086C0000]40        	mov     byte [Row], 64
   937 00000754 C3                      	retn
   938                                  SetSpeed:
   939 00000755 84D2                    	test    dl,dl
   940 00000757 7432                    	je      Skip
   941 00000759 80FA1F                  	cmp     dl,31
   942 0000075C 770D                    	ja      short SetBpm
   943                                  SetTempo:       
   944 0000075E 8815[056C0000]          	mov     [Tempo], dl
   945 00000764 8815[066C0000]          	mov     [TempoWait], dl
   946 0000076A C3                      	retn
   947                                  SetBpm:
   948 0000076B 8815[076C0000]          	mov     [Bpm], dl
   949 00000771 B067                    	mov     al, 103
   950 00000773 F6E2                    	mul     dl
   951 00000775 88E3                    	mov     bl, ah
   952 00000777 30FF                    	xor     bh, bh
   953 00000779 66A1[660D0000]          	mov     ax, [MixSpeed]
   954 0000077F 6631D2                  	xor     dx, dx
   955 00000782 66F7F3                  	div     bx
   956 00000785 66A3[0A6C0000]          	mov     [BpmSamples], ax
   957                                  Skip:           
   958 0000078B C3                      	retn
   959                                  InitArpeggio:
   960 0000078C 88D6                    	mov     dh, dl
   961 0000078E 80E20F                  	and     dl, 0Fh
   962 00000791 C0EE04                  	shr     dh, 4
   963 00000794 66B92400                	mov     cx, 36
   964 00000798 31DB                    	xor     ebx, ebx
   965 0000079A 668B4710                	mov     ax, [edi+TrackInfo.Period]
   966                                  gt_ScanPeriod:
   967 0000079E 66673B87[1C0D]          	cmp     ax, [PeriodTable+bx]
   968 000007A4 7306                    	jae     short SetArp
   969 000007A6 6683C302                	add     bx, 2
   970 000007AA E2F2                    	loop    gt_ScanPeriod
   971                                  SetArp:         
   972 000007AC 6601D2                  	add     dx, dx
   973 000007AF 00DE                    	add     dh, bl
   974 000007B1 00DA                    	add     dl, bl
   975 000007B3 66678B9F[1C0D]          	mov     bx, [PeriodTable+bx]
   976 000007B9 6601DB                  	add     bx, bx
   977 000007BC 66678B87[5214]          	mov     ax, [PitchTable+bx]
   978 000007C2 6689471C                	mov     [edi+TrackInfo.Arp], ax
   979 000007C6 88F3                    	mov     bl, dh
   980 000007C8 30FF                    	xor     bh, bh
   981 000007CA 66678B9F[1C0D]          	mov     bx, [PeriodTable+bx]
   982 000007D0 6601DB                  	add     bx, bx
   983 000007D3 66678B87[5214]          	mov     ax, [PitchTable+bx]
   984 000007D9 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
   985 000007DD 88D3                    	mov     bl, dl
   986 000007DF 30FF                    	xor     bh, bh
   987 000007E1 66678B9F[1C0D]          	mov     bx, [PeriodTable+bx]
   988 000007E7 6601DB                  	add     bx, bx
   989 000007EA 66678B87[5214]          	mov     ax, [PitchTable+bx]
   990 000007F0 66894720                	mov     [edi+TrackInfo.Arp+4], ax
   991 000007F4 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
   992 000007FA C3                      	retn
   993                                  
   994                                  ;--------------------------------------------------------------------------
   995                                  ; UpdateTracks:  Main code to process the next tick to be played.
   996                                  ;--------------------------------------------------------------------------
   997                                  
   998                                  UpdateTracks:
   999 000007FB FE0D[066C0000]          	dec     byte [TempoWait]
  1000 00000801 7415                    	jz      short GetTracks
  1001                                  
  1002 00000803 B904000000              	mov	ecx, NumTracks
  1003 00000808 BF[1A6C0000]            	mov	edi, Tracks
  1004                                  BeatTracks:
  1005 0000080D E87AFCFFFF              	call	BeatTrack	
  1006 00000812 83C724                  	add	edi, TrackInfo.size
  1007 00000815 E2F6                    	loop	BeatTracks
  1008 00000817 C3                      	retn
  1009                                  GetTracks:
  1010 00000818 A0[056C0000]            	mov     al, [Tempo]
  1011 0000081D A2[066C0000]            	mov     [TempoWait], al
  1012                                  
  1013 00000822 8B35[166C0000]          	mov	esi, [Note]
  1014 00000828 803D[086C0000]40        	cmp     byte [Row], 64
  1015 0000082F 7263                    	jb      short NoPattWrap
  1016                                  
  1017 00000831 8B35[DA120000]          	mov	esi, [ModInfo.Patterns]
  1018 00000837 8A1D[046C0000]          	mov     bl, [OrderPos]
  1019 0000083D 3A1D[58120000]          	cmp     bl, [ModInfo.OrderLen]
  1020 00000843 7214                    	jb      short NoOrderWrap
  1021 00000845 8A1D[59120000]          	mov     bl, [ModInfo.ReStart]
  1022 0000084B 881D[046C0000]          	mov     [OrderPos], bl
  1023 00000851 3A1D[58120000]          	cmp     bl, [ModInfo.OrderLen]
  1024 00000857 735D                    	jae     short NoUpdate
  1025                                  NoOrderWrap:    
  1026                                  	;xor	bh, bh
  1027 00000859 81E3FF000000            	and	ebx, 0FFh
  1028 0000085F 8A9B[5A120000]          	mov     bl, [ModInfo.Order+ebx]
  1029 00000865 C1E30A                  	shl     ebx, 10 ; *1024
  1030 00000868 01DE                    	add     esi, ebx
  1031 0000086A 8A1D[096C0000]          	mov     bl, [BreakRow]
  1032 00000870 881D[086C0000]          	mov     [Row], bl
  1033                                  	;xor     bh, bh
  1034 00000876 81E3FF000000            	and	ebx, 0FFh
  1035 0000087C 883D[096C0000]          	mov     [BreakRow], bh ; 0
  1036 00000882 66C1E304                	shl     bx, 4
  1037 00000886 01DE                    	add     esi, ebx
  1038 00000888 8935[166C0000]          	mov     [Note], esi
  1039 0000088E FE05[046C0000]          	inc     byte [OrderPos]
  1040                                  NoPattWrap:     
  1041 00000894 FE05[086C0000]          	inc     byte [Row]
  1042                                  
  1043                                  	;cld
  1044 0000089A B904000000              	mov	ecx, NumTracks
  1045 0000089F BF[1A6C0000]            	mov	edi, Tracks
  1046                                  GetTracks_next:
  1047 000008A4 51                      	push	ecx	
  1048 000008A5 E857FDFFFF              	call	GetTrack
  1049 000008AA 59                      	pop	ecx
  1050 000008AB 83C724                  	add	edi, TrackInfo.size
  1051 000008AE E2F4                    	loop	GetTracks_next
  1052                                  
  1053 000008B0 8935[166C0000]          	mov     [Note], esi
  1054                                  NoUpdate:
  1055 000008B6 C3                      	retn
  1056                                  
  1057                                  ;--------------------------------------------------------------------------
  1058                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1059                                  ;  In:
  1060                                  ;   ds:si -  Track Info Address.
  1061                                  ;   ds:di -  Buffer Address.
  1062                                  ;    cx   -  Buffer Size.
  1063                                  ;--------------------------------------------------------------------------
  1064                                  
  1065                                  ; esi = Track info address
  1066                                  ; edi = Buffer address
  1067                                  ; ecx = Buffer size
  1068                                  
  1069                                  MixTrack:
  1070 000008B7 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1071 000008BC 7748                    	ja      short MixLooped
  1072                                  MixNonLooped:   
  1073 000008BE 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1074 000008C0 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1075 000008C3 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1076 000008C7 52                      	push    edx
  1077 000008C8 56                      	push    esi
  1078 000008C9 01D3                    	add     ebx, edx
  1079 000008CB 01D5                    	add     ebp, edx
  1080 000008CD 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1081 000008D1 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1082 000008D4 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1083 000008D7 89DE                    	mov     esi, ebx
  1084 000008D9 88C7                    	mov     bh, al
  1085 000008DB 88D0                    	mov     al, dl
  1086 000008DD 88F2                    	mov     dl, dh
  1087                                  	;xor	dh, dh
  1088 000008DF 81E2FF000000            	and	edx, 0FFh
  1089                                  nlMixSamp:      
  1090 000008E5 39EE                    	cmp     esi, ebp
  1091 000008E7 7310                    	jae     short nlMixBye
  1092 000008E9 8A1E                    	mov     bl, [esi]
  1093 000008EB 678A9F[041B]            	mov     bl, [VolTable+bx]
  1094 000008F0 001F                    	add     [edi], bl
  1095 000008F2 47                      	inc     edi
  1096 000008F3 00C4                    	add     ah, al
  1097 000008F5 11D6                    	adc     esi, edx
  1098 000008F7 E2EC                    	loop    nlMixSamp
  1099                                  nlMixBye:       
  1100 000008F9 89F3                    	mov     ebx, esi
  1101 000008FB 5E                      	pop     esi
  1102 000008FC 5A                      	pop     edx
  1103 000008FD 29D3                    	sub     ebx, edx
  1104 000008FF 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1105 00000902 88660F                  	mov     [esi+TrackInfo.Error], ah
  1106 00000905 C3                      	retn
  1107                                  MixLooped:
  1108 00000906 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1109 00000908 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1110 0000090B 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1111 0000090F 892D[126C0000]          	mov     [BufRep], ebp
  1112 00000915 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1113 00000918 52                      	push    edx
  1114 00000919 56                      	push    esi
  1115 0000091A 01D3                    	add     ebx, edx
  1116 0000091C 01D5                    	add     ebp, edx
  1117 0000091E 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1118 00000922 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1119 00000925 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1120 00000928 6689DE                  	mov     si, bx
  1121 0000092B 88C7                    	mov     bh, al
  1122 0000092D 88D0                    	mov     al, dl
  1123 0000092F 88F2                    	mov     dl, dh
  1124                                  	;xor	dh, dh
  1125 00000931 81E2FF000000            	and	edx, 0FFh
  1126                                  lpMixSamp:      
  1127 00000937 39EE                    	cmp     esi, ebp
  1128 00000939 7206                    	jb      short lpMixNow
  1129 0000093B 2B35[126C0000]          	sub     esi, [BufRep]
  1130                                  lpMixNow:       
  1131 00000941 8A1E                    	mov     bl, [esi]
  1132 00000943 678A9F[041B]            	mov     bl, [VolTable+bx]
  1133 00000948 001F                    	add     [edi], bl
  1134 0000094A 47                      	inc     edi
  1135 0000094B 00C4                    	add     ah, al
  1136 0000094D 11D6                    	adc	esi, edx
  1137 0000094F E2E6                    	loop    lpMixSamp
  1138                                  lpMixBye:       
  1139                                  ;	mov     ebx, esi
  1140                                  ;	pop     esi
  1141                                  ;	pop     edx
  1142                                  ;	sub     ebx, edx
  1143                                  ;	mov     [esi+TrackInfo.Position], ebx
  1144                                  ;	mov     [esi+TrackInfo.Error], ah
  1145                                  ;	retn
  1146 00000951 EBA6                    	jmp	short nlMixBye
  1147                                  
  1148                                  ;--------------------------------------------------------------------------
  1149                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1150                                  ;  In:
  1151                                  ;    Buffer  - Buffer Address.
  1152                                  ;    Count   - Buffer Size.
  1153                                  ;--------------------------------------------------------------------------
  1154                                  
  1155                                  GetSamples:
  1156                                  	; edi = buffer address
  1157                                  	; ebx = count
  1158                                  
  1159 00000953 60                      	pushad
  1160                                  
  1161                                  	;cld
  1162                                  NextChunk:      
  1163 00000954 66833D[106C0000]00      	cmp     word [BufLen], 0
  1164 0000095C 7548                    	jne     short CopyChunk
  1165                                  
  1166 0000095E 53                      	push    ebx
  1167 0000095F 57                      	push    edi
  1168                                  MixChunk:       
  1169 00000960 BF[045C0000]            	mov	edi, MixBuffer
  1170 00000965 0FB70D[0A6C0000]        	movzx	ecx, word [BpmSamples]
  1171 0000096C 893D[0C6C0000]          	mov     [BufPtr], edi
  1172 00000972 66890D[106C0000]        	mov     [BufLen], cx
  1173                                  
  1174 00000979 B080                    	mov     al, 80h
  1175 0000097B F3AA                    	rep     stosb
  1176                                  
  1177 0000097D 66B90400                	mov	cx, NumTracks
  1178 00000981 BE[F66B0000]            	mov	esi, Tracks - TrackInfo.size
  1179                                  GetSamples_next:
  1180 00000986 51                      	push	ecx
  1181 00000987 83C624                  	add	esi, TrackInfo.size
  1182 0000098A 668B0D[106C0000]        	mov	cx, [BufLen]
  1183 00000991 8B3D[0C6C0000]          	mov	edi, [BufPtr]
  1184 00000997 E81BFFFFFF              	call	MixTrack
  1185 0000099C 59                      	pop	ecx
  1186 0000099D E2E7                    	loop	GetSamples_next	
  1187                                  
  1188 0000099F E857FEFFFF              	call    UpdateTracks
  1189                                  
  1190 000009A4 5F                      	pop     edi
  1191 000009A5 5B                      	pop     ebx
  1192                                  CopyChunk:      
  1193                                  	;mov	cx, [BufLen]
  1194 000009A6 0FB70D[106C0000]        	movzx	ecx, word [BufLen]
  1195 000009AD 39D9                    	cmp	ecx, ebx
  1196                                  	;cmp	cx, bx
  1197 000009AF 7602                    	jbe     short MoveChunk
  1198                                  	;mov	cx, bx
  1199 000009B1 89D9                    	mov     ecx, ebx
  1200                                  MoveChunk:
  1201 000009B3 8B35[0C6C0000]          	mov     esi, [BufPtr]
  1202 000009B9 010D[0C6C0000]          	add     [BufPtr], ecx
  1203 000009BF 66290D[106C0000]        	sub     [BufLen], cx
  1204 000009C6 29CB                    	sub     ebx, ecx
  1205 000009C8 F3A4                    	rep     movsb
  1206 000009CA 85DB                    	test    ebx, ebx
  1207 000009CC 7586                    	jnz     short NextChunk
  1208                                  
  1209 000009CE 61                      	popad
  1210 000009CF C3                      	retn
  1211                                  
  1212                                  ;--------------------------------------------------------------------------
  1213                                  ; StartPlaying: Initializes the Sound System.
  1214                                  ;  In:
  1215                                  ;   Module Information Resources.
  1216                                  ;--------------------------------------------------------------------------
  1217                                  
  1218                                  StartPlaying:
  1219 000009D0 60                      	pushad
  1220                                  SetModParms:    
  1221 000009D1 C605[046C0000]00        	mov     byte [OrderPos], 0
  1222 000009D8 C605[056C0000]06        	mov     byte [Tempo], DefTempo
  1223 000009DF C605[066C0000]06        	mov     byte [TempoWait], DefTempo
  1224 000009E6 C605[076C0000]7D        	mov     byte [Bpm], DefBpm
  1225 000009ED C605[086C0000]40        	mov     byte [Row], 64
  1226 000009F4 C605[096C0000]00        	mov     byte [BreakRow], 0
  1227 000009FB 66A1[660D0000]          	mov     ax, [MixSpeed]
  1228 00000A01 31D2                    	xor     edx, edx
  1229 00000A03 66BB3200                	mov     bx, 24*DefBpm/60
  1230 00000A07 66F7F3                  	div     bx
  1231 00000A0A 66A3[0A6C0000]          	mov     [BpmSamples], ax
  1232                                  ClearTracks:    
  1233 00000A10 BF[1A6C0000]            	mov     edi, Tracks
  1234 00000A15 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1235 00000A1A 31C0                    	xor     eax, eax
  1236                                  	;cld
  1237 00000A1C F3AA                    	rep     stosb
  1238                                  
  1239 00000A1E A3[0C6C0000]            	mov     [BufPtr], eax
  1240 00000A23 66A3[106C0000]          	mov     [BufLen], ax
  1241                                  MakePitch:
  1242 00000A29 66B80021                	mov     ax, MidCRate
  1243 00000A2D 66BBAC01                	mov     bx, 428
  1244 00000A31 66F7E3                  	mul     bx
  1245 00000A34 66F735[660D0000]        	div     word [MixSpeed]
  1246 00000A3B 30F6                    	xor     dh, dh
  1247 00000A3D 88E2                    	mov     dl, ah
  1248 00000A3F 88C4                    	mov     ah, al
  1249 00000A41 30C0                    	xor     al, al
  1250 00000A43 66B95903                	mov     cx, 857
  1251 00000A47 31DB                    	xor     ebx, ebx
  1252 00000A49 BF[52140000]            	mov     edi, PitchTable
  1253                                  PitchLoop:      
  1254 00000A4E 50                      	push    eax
  1255 00000A4F 52                      	push    edx
  1256 00000A50 6639DA                  	cmp     dx, bx
  1257 00000A53 7303                    	jae     short NoDiv
  1258 00000A55 66F7F3                  	div     bx
  1259                                  NoDiv:          
  1260 00000A58 66AB                    	stosw
  1261 00000A5A 5A                      	pop     edx
  1262 00000A5B 58                      	pop     eax
  1263 00000A5C 43                      	inc     ebx
  1264 00000A5D E2EF                    	loop    PitchLoop
  1265                                  MakeVolume:     
  1266 00000A5F 66B90041                	mov     cx, 16640
  1267 00000A63 89CB                    	mov     ebx, ecx
  1268                                  VolLoop:
  1269 00000A65 4B                      	dec     ebx
  1270 00000A66 88D8                    	mov     al, bl
  1271 00000A68 F6EF                    	imul    bh
  1272 00000A6A 88A3[041B0000]          	mov     [VolTable+ebx], ah
  1273 00000A70 E2F3                    	loop    VolLoop
  1274                                  
  1275 00000A72 61                      	popad
  1276 00000A73 C3                      	retn
  1277                                  
  1278                                  ;--------------------------------------------------------------------------
  1279                                  ; StopPlaying: ShutDown the Sound System.
  1280                                  ;--------------------------------------------------------------------------
  1281                                  
  1282                                  StopPlaying:
  1283                                  	; 19/06/2017
  1284                                  	; Stop Playing
  1285                                  	sys	_audio, 0700h
  1285                              <1> 
  1285                              <1> 
  1285                              <1> 
  1285                              <1> 
  1285                              <1>  %if %0 >= 2
  1285 00000A74 BB00070000          <1>  mov ebx, %2
  1285                              <1>  %if %0 >= 3
  1285                              <1>  mov ecx, %3
  1285                              <1>  %if %0 = 4
  1285                              <1>  mov edx, %4
  1285                              <1>  %endif
  1285                              <1>  %endif
  1285                              <1>  %endif
  1285 00000A79 B820000000          <1>  mov eax, %1
  1285                              <1> 
  1285 00000A7E CD40                <1>  int 40h
  1286                                  	; Cancel callback service (for user)
  1287                                  	sys	_audio, 0900h
  1287                              <1> 
  1287                              <1> 
  1287                              <1> 
  1287                              <1> 
  1287                              <1>  %if %0 >= 2
  1287 00000A80 BB00090000          <1>  mov ebx, %2
  1287                              <1>  %if %0 >= 3
  1287                              <1>  mov ecx, %3
  1287                              <1>  %if %0 = 4
  1287                              <1>  mov edx, %4
  1287                              <1>  %endif
  1287                              <1>  %endif
  1287                              <1>  %endif
  1287 00000A85 B820000000          <1>  mov eax, %1
  1287                              <1> 
  1287 00000A8A CD40                <1>  int 40h
  1288                                  	; Deallocate Audio Buffer (for user)
  1289                                  	sys	_audio, 0A00h
  1289                              <1> 
  1289                              <1> 
  1289                              <1> 
  1289                              <1> 
  1289                              <1>  %if %0 >= 2
  1289 00000A8C BB000A0000          <1>  mov ebx, %2
  1289                              <1>  %if %0 >= 3
  1289                              <1>  mov ecx, %3
  1289                              <1>  %if %0 = 4
  1289                              <1>  mov edx, %4
  1289                              <1>  %endif
  1289                              <1>  %endif
  1289                              <1>  %endif
  1289 00000A91 B820000000          <1>  mov eax, %1
  1289                              <1> 
  1289 00000A96 CD40                <1>  int 40h
  1290                                  	; Disable Audio Device
  1291                                  	sys	_audio, 0C00h
  1291                              <1> 
  1291                              <1> 
  1291                              <1> 
  1291                              <1> 
  1291                              <1>  %if %0 >= 2
  1291 00000A98 BB000C0000          <1>  mov ebx, %2
  1291                              <1>  %if %0 >= 3
  1291                              <1>  mov ecx, %3
  1291                              <1>  %if %0 = 4
  1291                              <1>  mov edx, %4
  1291                              <1>  %endif
  1291                              <1>  %endif
  1291                              <1>  %endif
  1291 00000A9D B820000000          <1>  mov eax, %1
  1291                              <1> 
  1291 00000AA2 CD40                <1>  int 40h
  1292                                  
  1293 00000AA4 C3                      	retn
  1294                                  
  1295                                  ;=============================================================================
  1296                                  ; 
  1297                                  ;=============================================================================
  1298                                  
  1299                                  ;dword2str:
  1300                                  ;	; 13/11/2016 - Erdogan Tan 
  1301                                  ;	; eax = dword value
  1302                                  ;	;
  1303                                  ;	call	dwordtohex
  1304                                  ;	mov	[dword_str], edx
  1305                                  ;	mov	[dword_str+4], eax
  1306                                  ;	mov	si, dword_str
  1307                                  ;	retn
  1308                                  
  1309                                  	; 05/03/2017 (TRDOS 386)
  1310                                  	; trdos386.s (unix386.s) - 10/05/2015
  1311                                  	; Convert binary number to hexadecimal string
  1312                                  
  1313                                  ;bytetohex:
  1314                                  ;	; INPUT ->
  1315                                  ;	; 	AL = byte (binary number)
  1316                                  ;	; OUTPUT ->
  1317                                  ;	;	AX = hexadecimal string
  1318                                  ;	;
  1319                                  ;	push	ebx
  1320                                  ;	movzx	ebx, al
  1321                                  ;	shr	bl, 4
  1322                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1323                                  ;	xchg	bl, al
  1324                                  ;	and	bl, 0Fh
  1325                                  ;	mov	ah, [ebx+hex_chars] 
  1326                                  ;	pop	ebx	
  1327                                  ;	retn
  1328                                  
  1329                                  ;wordtohex:
  1330                                  ;	; INPUT ->
  1331                                  ;	; 	AX = word (binary number)
  1332                                  ;	; OUTPUT ->
  1333                                  ;	;	EAX = hexadecimal string
  1334                                  ;	;
  1335                                  ;	push	ebx
  1336                                  ;	xor	ebx, ebx
  1337                                  ;	xchg	ah, al
  1338                                  ;	push	eax
  1339                                  ;	mov	bl, ah
  1340                                  ;	shr	bl, 4
  1341                                  ;	mov	al, [ebx+hex_chars] 	 	
  1342                                  ;	mov	bl, ah
  1343                                  ;	and	bl, 0Fh
  1344                                  ;	mov	ah, [ebx+hex_chars]
  1345                                  ;	shl	eax, 16
  1346                                  ;	pop	eax
  1347                                  ;	pop	ebx
  1348                                  ;	jmp	short bytetohex
  1349                                  
  1350                                  ;dwordtohex:
  1351                                  ;	; INPUT ->
  1352                                  ;	; 	EAX = dword (binary number)
  1353                                  ;	; OUTPUT ->
  1354                                  ;	;	EDX:EAX = hexadecimal string
  1355                                  ;	;
  1356                                  ;	push	eax
  1357                                  ;	shr	eax, 16
  1358                                  ;	call	wordtohex
  1359                                  ;	mov	edx, eax
  1360                                  ;	pop	eax
  1361                                  ;	call	wordtohex
  1362                                  ;	retn
  1363                                  
  1364                                  	; 19/06/2017
  1365                                  	; 05/03/2017 (TRDOS 386)
  1366                                  	; 13/11/2016 - Erdogan Tan
  1367                                  write_audio_dev_info:
  1368                                  	; BUS/DEV/FN
  1369                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1370                                  	; DEV/VENDOR
  1371                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1372                                  
  1373 00000AA5 8B35[080E0000]          	mov	esi, [dev_vendor]
  1374 00000AAB 6689F0                  	mov	ax, si
  1375 00000AAE 0FB6D8                  	movzx	ebx, al
  1376 00000AB1 88DA                    	mov	dl, bl
  1377 00000AB3 80E30F                  	and	bl, 0Fh
  1378 00000AB6 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1379 00000ABC A2[AD0D0000]            	mov	[msgVendorId+3], al
  1380 00000AC1 88D3                    	mov	bl, dl
  1381 00000AC3 C0EB04                  	shr	bl, 4
  1382 00000AC6 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1383 00000ACC A2[AC0D0000]            	mov	[msgVendorId+2], al
  1384 00000AD1 88E3                    	mov	bl, ah
  1385 00000AD3 88DA                    	mov	dl, bl
  1386 00000AD5 80E30F                  	and	bl, 0Fh
  1387 00000AD8 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1388 00000ADE A2[AB0D0000]            	mov	[msgVendorId+1], al
  1389 00000AE3 88D3                    	mov	bl, dl
  1390 00000AE5 C0EB04                  	shr	bl, 4
  1391 00000AE8 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1392 00000AEE A2[AA0D0000]            	mov	[msgVendorId], al
  1393 00000AF3 C1EE10                  	shr	esi, 16
  1394 00000AF6 6689F0                  	mov	ax, si
  1395 00000AF9 88C3                    	mov	bl, al
  1396 00000AFB 88DA                    	mov	dl, bl
  1397 00000AFD 80E30F                  	and	bl, 0Fh
  1398 00000B00 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1399 00000B06 A2[BE0D0000]            	mov	[msgDevId+3], al
  1400 00000B0B 88D3                    	mov	bl, dl
  1401 00000B0D C0EB04                  	shr	bl, 4
  1402 00000B10 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1403 00000B16 A2[BD0D0000]            	mov	[msgDevId+2], al
  1404 00000B1B 88E3                    	mov	bl, ah
  1405 00000B1D 88DA                    	mov	dl, bl
  1406 00000B1F 80E30F                  	and	bl, 0Fh
  1407 00000B22 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1408 00000B28 A2[BC0D0000]            	mov	[msgDevId+1], al
  1409 00000B2D 88D3                    	mov	bl, dl
  1410 00000B2F C0EB04                  	shr	bl, 4
  1411 00000B32 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1412 00000B38 A2[BB0D0000]            	mov	[msgDevId], al
  1413                                  
  1414 00000B3D 8B35[0C0E0000]          	mov	esi, [bus_dev_fn]
  1415 00000B43 C1EE08                  	shr	esi, 8
  1416 00000B46 6689F0                  	mov	ax, si
  1417 00000B49 88C3                    	mov	bl, al
  1418 00000B4B 88DA                    	mov	dl, bl
  1419 00000B4D 80E307                  	and	bl, 7 ; bit 0,1,2
  1420 00000B50 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1421 00000B56 A2[E20D0000]            	mov	[msgFncNo+1], al
  1422 00000B5B 88D3                    	mov	bl, dl
  1423 00000B5D C0EB03                  	shr	bl, 3
  1424 00000B60 88DA                    	mov	dl, bl
  1425 00000B62 80E30F                  	and	bl, 0Fh
  1426 00000B65 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1427 00000B6B A2[D40D0000]            	mov	[msgDevNo+1], al
  1428 00000B70 88D3                    	mov	bl, dl
  1429 00000B72 C0EB04                  	shr	bl, 4
  1430 00000B75 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1431 00000B7B A2[D30D0000]            	mov	[msgDevNo], al
  1432 00000B80 88E3                    	mov	bl, ah
  1433 00000B82 88DA                    	mov	dl, bl
  1434 00000B84 80E30F                  	and	bl, 0Fh
  1435 00000B87 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1436 00000B8D A2[C80D0000]            	mov	[msgBusNo+1], al
  1437 00000B92 88D3                    	mov	bl, dl
  1438 00000B94 C0EB04                  	shr	bl, 4
  1439 00000B97 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1440 00000B9D A2[C70D0000]            	mov	[msgBusNo], al
  1441                                  
  1442 00000BA2 66A1[140E0000]          	mov	ax, [ac97_io_base]
  1443 00000BA8 88C3                    	mov	bl, al
  1444 00000BAA 88DA                    	mov	dl, bl
  1445 00000BAC 80E30F                  	and	bl, 0Fh
  1446 00000BAF 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1447 00000BB5 A2[FB0D0000]            	mov	[msgIOBaseAddr+3], al
  1448 00000BBA 88D3                    	mov	bl, dl
  1449 00000BBC C0EB04                  	shr	bl, 4
  1450 00000BBF 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1451 00000BC5 A2[FA0D0000]            	mov	[msgIOBaseAddr+2], al
  1452 00000BCA 88E3                    	mov	bl, ah
  1453 00000BCC 88DA                    	mov	dl, bl
  1454 00000BCE 80E30F                  	and	bl, 0Fh
  1455 00000BD1 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1456 00000BD7 A2[F90D0000]            	mov	[msgIOBaseAddr+1], al
  1457 00000BDC 88D3                    	mov	bl, dl
  1458 00000BDE C0EB04                  	shr	bl, 4
  1459 00000BE1 8A83[680D0000]          	mov	al, [ebx+hex_chars]
  1460 00000BE7 A2[F80D0000]            	mov	[msgIOBaseAddr], al
  1461                                  
  1462                                  	; 24/11/2016
  1463 00000BEC 30E4                    	xor	ah, ah
  1464 00000BEE A0[160E0000]            	mov	al, [ac97_int_ln_reg]
  1465 00000BF3 B10A                    	mov	cl, 10
  1466 00000BF5 F6F1                    	div	cl
  1467 00000BF7 660105[030E0000]        	add	[msgIRQ], ax
  1468 00000BFE 20C0                    	and	al, al
  1469 00000C00 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1470 00000C02 A0[040E0000]            	mov	al, [msgIRQ+1]
  1471 00000C07 B420                    	mov	ah, ' '
  1472 00000C09 66A3[030E0000]          	mov	[msgIRQ], ax
  1473                                  _w_ac97imsg_:
  1474                                  	; EBX = Message address
  1475                                  	; ECX = Max. message length (or stop on ZERO character)
  1476                                  	;	(1 to 255)
  1477                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1478                                       	sys 	_msg, msgAC97Info, 255, 07h
  1478                              <1> 
  1478                              <1> 
  1478                              <1> 
  1478                              <1> 
  1478                              <1>  %if %0 >= 2
  1478 00000C0F BB[790D0000]        <1>  mov ebx, %2
  1478                              <1>  %if %0 >= 3
  1478 00000C14 B9FF000000          <1>  mov ecx, %3
  1478                              <1>  %if %0 = 4
  1478 00000C19 BA07000000          <1>  mov edx, %4
  1478                              <1>  %endif
  1478                              <1>  %endif
  1478                              <1>  %endif
  1478 00000C1E B823000000          <1>  mov eax, %1
  1478                              <1> 
  1478 00000C23 CD40                <1>  int 40h
  1479 00000C25 C3                              retn
  1480                                  
  1481                                  ;=============================================================================
  1482                                  ;               preinitialized data
  1483                                  ;=============================================================================
  1484                                  
  1485                                  ;=============================================================================
  1486                                  ;               PLAY.ASM - DATA
  1487                                  ;=============================================================================
  1488                                  
  1489                                  msg_2017:
  1490 00000C26 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1490 00000C2F 506C6179657220666F-
  1490 00000C38 72205452444F532033-
  1490 00000C41 383620627920457264-
  1490 00000C4A 6F67616E2054616E2E-
  1490 00000C53 20                 
  1491 00000C54 4A756E652032303137-     	db	'June 2017.',10,13
  1491 00000C5D 2E0A0D             
  1492 00000C60 75736167653A20706C-     	db	'usage: playmod filename.mod', 10,13,0
  1492 00000C69 61796D6F642066696C-
  1492 00000C72 656E616D652E6D6F64-
  1492 00000C7B 0A0D00             
  1493 00000C7E 32332F30362F323031-     	db	'23/06/2017',10,13,0
  1493 00000C87 370A0D00           
  1494                                  
  1495 00000C8B 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1495 00000C94 506C61796572207630-
  1495 00000C9D 2E3162206279204361-
  1495 00000CA6 726C6F732048617361-
  1495 00000CAF 6E2E204A756C792031-
  1495 00000CB8 3939332E           
  1496 00000CBC 0A0D00                  		db	10,13,0
  1497 00000CBF 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1497 00000CC8 64696E67204D6F6475-
  1497 00000CD1 6C652066696C652E0A-
  1497 00000CDA 0D00               
  1498                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1499                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1500                                  ;PortText:	db	'x0h, IRQ '
  1501                                  ;IrqText:	db	'x.',10,13,0
  1502                                  
  1503                                  trdos386_err_msg:
  1504 00000CDC 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1504 00000CE5 2053797374656D2063-
  1504 00000CEE 616C6C206572726F72-
  1504 00000CF7 20210A0D00         
  1505                                  
  1506                                  ;=============================================================================
  1507                                  ;               MODPLAY.ASM - DATA
  1508                                  ;=============================================================================
  1509                                  
  1510                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1511                                  
  1512 00000CFC 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1512 00000D05 C5D4E1             
  1513 00000D08 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1513 00000D11 E1                 
  1514 00000D12 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1514 00000D1B 19                 
  1515                                  
  1516 00000D1C 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1516 00000D25 0280025C023A021A02-
  1516 00000D2E FC01E001C501       
  1517 00000D34 AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1517 00000D3D 0140012E011D010D01-
  1517 00000D46 FE00F000E200       
  1518 00000D4C D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1518 00000D55 00A00097008F008700-
  1518 00000D5E 7F0078007100       
  1519                                  
  1520                                  ;=============================================================================
  1521                                  ;               PLAYER.ASM - DATA
  1522                                  ;=============================================================================
  1523                                  
  1524 00000D64 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1525 00000D65 08                      bps:		db 8 ; bits per sample (8 or 16)
  1526                                  Sample_Rate:
  1527 00000D66 2256                    MixSpeed:	dw 22050 ; Hz
  1528                                  
  1529                                  ; 13/11/2016
  1530 00000D68 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1530 00000D71 3941424344454600   
  1531                                  msgAC97Info:	
  1532 00000D79 0D0A                    		db 0Dh, 0Ah
  1533 00000D7B 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1533 00000D84 6F20436F6E74726F6C-
  1533 00000D8D 6C6572202620436F64-
  1533 00000D96 656320496E666F0D0A 
  1534 00000D9F 56656E646F72204944-     		db "Vendor ID: "
  1534 00000DA8 3A20               
  1535 00000DAA 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1535 00000DB3 6963652049443A20   
  1536 00000DBB 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1537 00000DC2 4275733A20              		db "Bus: "
  1538 00000DC7 303068204465766963-     msgBusNo:	db "00h Device: "
  1538 00000DD0 653A20             
  1539 00000DD3 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1539 00000DDC 696F6E3A20         
  1540 00000DE1 303068                  msgFncNo:	db "00h"
  1541 00000DE4 0D0A                    		db 0Dh, 0Ah
  1542 00000DE6 492F4F204261736520-     		db "I/O Base Address: "
  1542 00000DEF 416464726573733A20 
  1543 00000DF8 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1543 00000E01 3A20               
  1544 00000E03 3030                    msgIRQ:		dw 3030h
  1545 00000E05 0D0A00                  		db 0Dh, 0Ah, 0
  1546                                  ;msgSampleRate:	db "Sample Rate: "
  1547                                  ;msgHertz:	db "00000 Hz ", 0
  1548                                  ;msg8Bits:	db "8 bits ", 0
  1549                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1550                                  ;msg16Bits:	db "16 bits ", "$" 
  1551                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1552                                  
  1553                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1554                                  ;codec_id:	   dd 0
  1555                                  ;codec_chip_id:	   dd 0
  1556                                  ;codec_vendor_ids: dw 0
  1557                                  ;codec_chip_ids:   dw 0
  1558                                  
  1559                                  ;dword_str:	dd 30303030h, 30303030h
  1560                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1561                                  
  1562                                  ;=============================================================================
  1563                                  ;        	uninitialized data
  1564                                  ;=============================================================================
  1565                                  
  1566                                  bss_start:
  1567                                  
  1568                                  ABSOLUTE bss_start
  1569                                  
  1570                                  alignb 4
  1571                                  
  1572 00000E08 <res 00000004>          dev_vendor:	resd 1
  1573 00000E0C <res 00000004>          bus_dev_fn:	resd 1
  1574 00000E10 <res 00000004>          stats_cmd:	resd 1
  1575 00000E14 <res 00000002>          ac97_io_base:	resw 1
  1576 00000E16 <res 00000001>          ac97_int_ln_reg: resb 1
  1577 00000E17 <res 00000001>          srb:		resb 1
  1578                                  
  1579                                  ; MODLOAD.ASM
  1580 00000E18 <res 00000002>          FileHandle:	resw 1
  1581 00000E1A <res 00000002>          ErrorInfo:	resw 1
  1582 00000E1C <res 0000043C>          Header:	resb	ModHeader.size
  1583                                  
  1584                                  ; MODPLAY.ASM
  1585                                  ;MixSpeed:	    resw 1
  1586                                  
  1587                                  ModInfo:
  1588 00001258 <res 00000001>          ModInfo.OrderLen:   resb 1
  1589 00001259 <res 00000001>          ModInfo.ReStart:    resb 1
  1590 0000125A <res 00000080>          ModInfo.Order:	    resb 128
  1591 000012DA <res 00000004>          ModInfo.Patterns:   resd 1
  1592                                  
  1593 000012DE <res 0000003E>          ModInfo.SampOfs:    resw 31
  1594 0000131C <res 0000003E>          ModInfo.SampSeg:    resw 31
  1595 0000135A <res 0000003E>          ModInfo.SampLen:    resw 31
  1596 00001398 <res 0000003E>          ModInfo.SampRep:    resw 31
  1597 000013D6 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1598 00001414 <res 0000003E>          ModInfo.SampVol:    resw 31
  1599                                  
  1600                                  ; MODPLAY.ASM
  1601 00001452 <res 000006B2>          PitchTable:	resw 857
  1602 00001B04 <res 00004100>          VolTable:	resb 16640
  1603 00005C04 <res 00001000>          MixBuffer       resb MixBufSize
  1604                                  
  1605                                  ; MODPLAY.ASM
  1606 00006C04 <res 00000001>          OrderPos:	resb 1
  1607 00006C05 <res 00000001>          Tempo:		resb 1
  1608 00006C06 <res 00000001>          TempoWait:	resb 1
  1609 00006C07 <res 00000001>          Bpm:		resb 1
  1610 00006C08 <res 00000001>          Row:		resb 1
  1611 00006C09 <res 00000001>          BreakRow:	resb 1
  1612 00006C0A <res 00000002>          BpmSamples:	resw 1
  1613 00006C0C <res 00000004>          BufPtr:		resd 1
  1614 00006C10 <res 00000002>          BufLen:		resw 1
  1615 00006C12 <res 00000004>          BufRep:		resd 1
  1616 00006C16 <res 00000004>          Note:		resd 1
  1617 00006C1A <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1618                                  
  1619 00006CAA <res 00000006>          alignb 16
  1620                                  
  1621                                  ; PLAY.ASM
  1622 00006CB0 <res 00000280>          Scope:		resw 320
  1623 00006F30 <res 00000200>          RowOfs:		resw 256
  1624                                  
  1625                                  mod_file_name:
  1626 00007130 <res 00000050>          		resb 80
  1627                                  
  1628 00007180 <res 00000E80>          alignb 4096
  1629                                  
  1630                                  Audio_Buffer:
  1631 00008000 <res 00008000>          		resb 32768
  1632                                  
  1633                                  alignb 65536
  1634                                  
  1635 00010000 <res 00010000>          DMA_Buffer:	resb 65536
  1636                                  
  1637                                  file_buffer:
  1638 00020000 <res 00060000>          		resb 65536*6
  1639                                  EOF:
