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