     1                                  ; ****************************************************************************
     2                                  ; playmod2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PLAYMOD2.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 05/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 24/06/2017 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Modified from 'wavplay2.s' (11/06/2017)
    14                                  ;
    15                                  ; Modified from 'TINYPLAY.PRG' ('tinyplay.s') source code by Erdogan Tan
    16                                  ;			                     (05/03/2017)
    17                                  ;
    18                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    19                                  ;				      (04/03/2017) 
    20                                  ; Assembler: NASM 2.11
    21                                  ; ----------------------------------------------------------------------------
    22                                  ;	   nasm  playmod.s -l playmod.txt -o PLAYMOD.PRG	
    23                                  ; ****************************************************************************
    24                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    25                                  
    26                                  ; 01/03/2017
    27                                  ; 16/10/2016
    28                                  ; 29/04/2016
    29                                  ; TRDOS 386 system calls (temporary list!)
    30                                  _ver 	equ 0
    31                                  _exit 	equ 1
    32                                  _fork 	equ 2
    33                                  _read 	equ 3
    34                                  _write	equ 4
    35                                  _open	equ 5
    36                                  _close 	equ 6
    37                                  _wait 	equ 7
    38                                  _creat 	equ 8
    39                                  _link 	equ 9
    40                                  _unlink	equ 10
    41                                  _exec	equ 11
    42                                  _chdir	equ 12
    43                                  _time 	equ 13
    44                                  _mkdir 	equ 14
    45                                  _chmod	equ 15
    46                                  _chown	equ 16
    47                                  _break	equ 17
    48                                  _stat	equ 18
    49                                  _seek	equ 19
    50                                  _tell 	equ 20
    51                                  _mount	equ 21
    52                                  _umount	equ 22
    53                                  _setuid	equ 23
    54                                  _getuid	equ 24
    55                                  _stime	equ 25
    56                                  _quit	equ 26	
    57                                  _intr	equ 27
    58                                  _fstat	equ 28
    59                                  _emt 	equ 29
    60                                  _mdate 	equ 30
    61                                  _video 	equ 31
    62                                  _audio	equ 32
    63                                  _timer	equ 33
    64                                  _sleep	equ 34
    65                                  _msg    equ 35
    66                                  _geterr	equ 36
    67                                  _fpsave	equ 37
    68                                  _pri	equ 38
    69                                  _rele	equ 39
    70                                  _fff	equ 40
    71                                  _fnf	equ 41
    72                                  _alloc	equ 42
    73                                  _dalloc equ 43
    74                                  _calbac equ 44		
    75                                  
    76                                  %macro sys 1-4
    77                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    78                                      ; 03/09/2015	
    79                                      ; 13/04/2015
    80                                      ; Retro UNIX 386 v1 system call.	
    81                                      %if %0 >= 2   
    82                                          mov ebx, %2
    83                                          %if %0 >= 3    
    84                                              mov ecx, %3
    85                                              %if %0 = 4
    86                                                 mov edx, %4   
    87                                              %endif
    88                                          %endif
    89                                      %endif
    90                                      mov eax, %1
    91                                      ;int 30h
    92                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    93                                  %endmacro
    94                                  
    95                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    96                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    97                                  
    98                                  ; 19/06/2017
    99                                  BUFFERSIZE equ 32768
   100                                  
   101                                  ; ----------------------------------------------------------------------------
   102                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   103                                  ;	July 14th, 1993.
   104                                  
   105                                  ;=============================================================================
   106                                  ;  
   107                                  ;=============================================================================
   108                                  
   109                                  [BITS 32]
   110                                  [org 0]
   111                                  
   112                                  Start:
   113                                  	; clear bss
   114 00000000 B9[00000900]            	mov	ecx, EOF
   115 00000005 BF[EA0D0000]            	mov	edi, bss_start
   116 0000000A 29F9                    	sub	ecx, edi
   117 0000000C D1E9                    	shr	ecx, 1
   118 0000000E 31C0                    	xor	eax, eax
   119 00000010 F366AB                  	rep	stosw
   120                                  
   121                                  	; Detect (& Enable) VT8233 Audio Device
   122 00000013 E8D7010000              	call    DetectVT8233
   123 00000018 731B                    	jnc     short GetFileName
   124                                  
   125                                  _dev_not_ready:
   126                                  ; couldn't find the audio device!
   127                                  	sys	_msg, noDevMsg, 255, 0Fh
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1>  %if %0 >= 2
   127 0000001A BB[FC010000]        <1>  mov ebx, %2
   127                              <1>  %if %0 >= 3
   127 0000001F B9FF000000          <1>  mov ecx, %3
   127                              <1>  %if %0 = 4
   127 00000024 BA0F000000          <1>  mov edx, %4
   127                              <1>  %endif
   127                              <1>  %endif
   127                              <1>  %endif
   127 00000029 B823000000          <1>  mov eax, %1
   127                              <1> 
   127 0000002E CD40                <1>  int 40h
   128 00000030 E999010000                      jmp     Exit
   129                                  
   130                                  GetFileName:  
   131 00000035 89E6                    	mov	esi, esp
   132 00000037 AD                      	lodsd
   133 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   134                                  		; (program file name & mod file name)
   135 0000003B 0F8296010000            	jb	pmsg_2017 ; nothing to do
   136                                  
   137 00000041 AD                      	lodsd ; program file name address 
   138 00000042 AD                      	lodsd ; mod file name address (file to be read)
   139 00000043 89C6                    	mov	esi, eax
   140 00000045 BF[10710000]            	mov	edi, mod_file_name
   141                                  ScanName:       
   142 0000004A AC                      	lodsb
   143 0000004B 84C0                    	test	al, al
   144 0000004D 0F8484010000            	je	pmsg_2017
   145 00000053 3C20                    	cmp	al, 20h
   146 00000055 74F3                    	je	short ScanName	; scan start of name.
   147 00000057 AA                      	stosb
   148 00000058 B4FF                    	mov	ah, 0FFh
   149                                  a_0:	
   150 0000005A FEC4                    	inc	ah
   151                                  a_1:
   152 0000005C AC                      	lodsb
   153 0000005D AA                      	stosb
   154 0000005E 3C2E                    	cmp	al, '.'
   155 00000060 74F8                    	je	short a_0	
   156 00000062 20C0                    	and	al, al
   157 00000064 75F6                    	jnz	short a_1
   158                                  
   159 00000066 08E4                    	or	ah, ah		; if period NOT found,
   160 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   161                                  SetExt:
   162 0000006A 4F                      	dec	edi
   163 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   164 00000071 C6470400                	mov	byte [edi+4], 0
   165                                  PrintMesg:      
   166                                  	; Prints the Credits Text.
   167                                  	sys	_msg, Credits, 255, 0Fh
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1> 
   167                              <1>  %if %0 >= 2
   167 00000075 BB[6D0C0000]        <1>  mov ebx, %2
   167                              <1>  %if %0 >= 3
   167 0000007A B9FF000000          <1>  mov ecx, %3
   167                              <1>  %if %0 = 4
   167 0000007F BA0F000000          <1>  mov edx, %4
   167                              <1>  %endif
   167                              <1>  %endif
   167                              <1>  %endif
   167 00000084 B823000000          <1>  mov eax, %1
   167                              <1> 
   167 00000089 CD40                <1>  int 40h
   168                                  _1:
   169                                  	; 19/06/2017
   170                                  	; Allocate Audio Buffer (for user)
   171                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 0000008B BB00020000          <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 00000090 B900800000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 00000095 BA[00800000]        <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 0000009A B820000000          <1>  mov eax, %1
   171                              <1> 
   171 0000009F CD40                <1>  int 40h
   172 000000A1 0F82F9000000            	jc	error_exit
   173                                  _2:
   174                                  	; Initialize Audio Device (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[FB0D0000]        <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 0F82DD000000            	jc	error_exit
   181                                  
   182                                  LoadMod:  
   183 000000C3 BF[10710000]            	mov	edi, mod_file_name
   184 000000C8 E8F2010000              	call    LoadModule		; Load the MODule...
   185                                  
   186 000000CD 66833D[FE0D0000]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[A10C0000]        <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 E9DC000000              	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 0F829C000000            	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[FA0D0000]            	mov	[ac97_int_ln_reg], al
   214 00000109 891D[EC0D0000]          	mov	[dev_vendor], ebx
   215 0000010F 890D[F00D0000]          	mov	[bus_dev_fn], ecx
   216 00000115 668915[F80D0000]        	mov	[ac97_io_base], dx
   217                                    
   218 0000011C E866090000              	call	write_audio_dev_info 
   219                                  
   220                                  PlayNow: 
   221 00000121 E88C080000              	call    StartPlaying
   222                                  
   223                                         ; load 32768 bytes into audio buffer
   224 00000126 BF[00800000]            	mov     edi, Audio_Buffer
   225 0000012B BB00800000              	mov	ebx, BUFFERSIZE
   226 00000130 E800080000              	call	GetSamples
   227 00000135 7269                    	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[106F0000]        	mov     [RowOfs+ebx], dx
   235 00000147 668993[126F0000]        	mov     [RowOfs+ebx+2], dx
   236 0000014E 6681C24001              	add     dx, 320
   237 00000153 83C304                  	add     ebx, 4
   238 00000156 E2E8                    	loop    MakeOfs
   239                                  
   240                                  	; Set Master Volume Level
   241                                  	sys	_audio, 0B00h, 1D1Dh
   241                              <1> 
   241                              <1> 
   241                              <1> 
   241                              <1> 
   241                              <1>  %if %0 >= 2
   241 00000158 BB000B0000          <1>  mov ebx, %2
   241                              <1>  %if %0 >= 3
   241 0000015D B91D1D0000          <1>  mov ecx, %3
   241                              <1>  %if %0 = 4
   241                              <1>  mov edx, %4
   241                              <1>  %endif
   241                              <1>  %endif
   241                              <1>  %endif
   241 00000162 B820000000          <1>  mov eax, %1
   241                              <1> 
   241 00000167 CD40                <1>  int 40h
   242                                  
   243                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   244                                  	
   245                                  	; Start	to play
   246 00000169 A0[470D0000]            	mov	al, [bps]
   247 0000016E C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   248 00000171 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   249 00000173 8A1D[460D0000]          	mov	bl, [stmo]
   250 00000179 FECB                    	dec	bl
   251 0000017B 08C3                    	or	bl, al
   252 0000017D 668B0D[480D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   253 00000184 B704                    	mov	bh, 4 ; start to play	
   254                                  	sys	_audio
   254                              <1> 
   254                              <1> 
   254                              <1> 
   254                              <1> 
   254                              <1>  %if %0 >= 2
   254                              <1>  mov ebx, %2
   254                              <1>  %if %0 >= 3
   254                              <1>  mov ecx, %3
   254                              <1>  %if %0 = 4
   254                              <1>  mov edx, %4
   254                              <1>  %endif
   254                              <1>  %endif
   254                              <1>  %endif
   254 00000186 B820000000          <1>  mov eax, %1
   254                              <1> 
   254 0000018B CD40                <1>  int 40h
   255                                      
   256                                  	;; SETUP SIGNAL RESPONSE BYTE
   257                                  	;; 06/03/2017
   258                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   259                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   260                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   261                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   262                                  	;sys	_calbac
   263                                  	;jc	short error_exit
   264                                  
   265                                  	; DIRECT VGA MEMORY ACCESS
   266                                  	; bl = 0, bh = 5
   267                                  	; Direct access/map to VGA memory (0A0000h)
   268                                  
   269                                  	sys	_video, 0500h
   269                              <1> 
   269                              <1> 
   269                              <1> 
   269                              <1> 
   269                              <1>  %if %0 >= 2
   269 0000018D BB00050000          <1>  mov ebx, %2
   269                              <1>  %if %0 >= 3
   269                              <1>  mov ecx, %3
   269                              <1>  %if %0 = 4
   269                              <1>  mov edx, %4
   269                              <1>  %endif
   269                              <1>  %endif
   269                              <1>  %endif
   269 00000192 B81F000000          <1>  mov eax, %1
   269                              <1> 
   269 00000197 CD40                <1>  int 40h
   270 00000199 3D00000A00              	cmp	eax, 0A0000h
   271 0000019E 7418                    	je	short _a3
   272                                  error_exit:
   273                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   273                              <1> 
   273                              <1> 
   273                              <1> 
   273                              <1> 
   273                              <1>  %if %0 >= 2
   273 000001A0 BB[BE0C0000]        <1>  mov ebx, %2
   273                              <1>  %if %0 >= 3
   273 000001A5 B9FF000000          <1>  mov ecx, %3
   273                              <1>  %if %0 = 4
   273 000001AA BA0E000000          <1>  mov edx, %4
   273                              <1>  %endif
   273                              <1>  %endif
   273                              <1>  %endif
   273 000001AF B823000000          <1>  mov eax, %1
   273                              <1> 
   273 000001B4 CD40                <1>  int 40h
   274 000001B6 EB16                    	jmp	short Exit
   275                                  
   276                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   277                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   278                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   279                                  ;       second, or the module will sound "looped".
   280                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   281                                  ;       the polling is called from my routine, and then the irq 0 must be
   282                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   283                                  ;       samples played by the Sound Blaster. Note that some samples are
   284                                  ;       discarded in the next code, just for fun!
   285                                  
   286                                  _a3:
   287 000001B8 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   288 000001BC CD31                    	int     31h
   289                                  
   290 000001BE E870000000              	call	ModPlay ; 13/02/2017
   291                                  
   292                                  _s_exit:
   293 000001C3 E88E080000              	call	StopPlaying	; STOP!
   294                                  
   295 000001C8 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   296 000001CC CD31                    	int     31h
   297                                  Exit:           
   298                                  	;call    FreeModule	; Free MODule core.
   299                                  	
   300                                  	sys 	_exit	; Bye !
   300                              <1> 
   300                              <1> 
   300                              <1> 
   300                              <1> 
   300                              <1>  %if %0 >= 2
   300                              <1>  mov ebx, %2
   300                              <1>  %if %0 >= 3
   300                              <1>  mov ecx, %3
   300                              <1>  %if %0 = 4
   300                              <1>  mov edx, %4
   300                              <1>  %endif
   300                              <1>  %endif
   300                              <1>  %endif
   300 000001CE B801000000          <1>  mov eax, %1
   300                              <1> 
   300 000001D3 CD40                <1>  int 40h
   301                                  here:
   302 000001D5 EBFE                    	jmp	short here
   303                                  
   304                                  pmsg_2017:
   305                                  	sys	_msg, msg_2017, 255, 0Fh
   305                              <1> 
   305                              <1> 
   305                              <1> 
   305                              <1> 
   305                              <1>  %if %0 >= 2
   305 000001D7 BB[080C0000]        <1>  mov ebx, %2
   305                              <1>  %if %0 >= 3
   305 000001DC B9FF000000          <1>  mov ecx, %3
   305                              <1>  %if %0 = 4
   305 000001E1 BA0F000000          <1>  mov edx, %4
   305                              <1>  %endif
   305                              <1>  %endif
   305                              <1>  %endif
   305 000001E6 B823000000          <1>  mov eax, %1
   305                              <1> 
   305 000001EB CD40                <1>  int 40h
   306 000001ED EBDF                    	jmp	short Exit
   307                                  
   308                                  DetectVT8233:
   309                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   310                                          sys	_audio, 0103h
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1> 
   310                              <1>  %if %0 >= 2
   310 000001EF BB03010000          <1>  mov ebx, %2
   310                              <1>  %if %0 >= 3
   310                              <1>  mov ecx, %3
   310                              <1>  %if %0 = 4
   310                              <1>  mov edx, %4
   310                              <1>  %endif
   310                              <1>  %endif
   310                              <1>  %endif
   310 000001F4 B820000000          <1>  mov eax, %1
   310                              <1> 
   310 000001F9 CD40                <1>  int 40h
   311 000001FB C3                      	retn
   312                                  
   313                                  noDevMsg:
   314 000001FC 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   314 00000205 61626C6520746F2066-
   314 0000020E 696E64205649412056-
   314 00000217 543832333320626173-
   314 00000220 656420617564696F20-
   314 00000229 646576696365210D0A-
   314 00000232 00                 
   315                                  
   316                                  ;ac97_int_handler:
   317                                  ;	; 19/06/2017
   318                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   319                                  ;
   320                                  ;	sys	_rele ; return from callback service 
   321                                  ;	; we must not come here !
   322                                  ;	sys	_exit
   323                                  
   324                                  ;=============================================================================
   325                                  ;      
   326                                  ;=============================================================================
   327                                  
   328                                  ModPlay:
   329                                  	; 23/06/2017   
   330                                  	; 21/06/2017
   331                                  	; 19/06/2017
   332                                  
   333                                  	; 05/03/2017 (TRDOS 386)
   334                                  	; 14/02/2017
   335                                  	; 13/02/2017
   336                                  	; 08/12/2016
   337                                  	; 28/11/2016
   338                                  
   339 00000233 EB10                         	jmp	short modp_gs ; 23/06/2017
   340                                  p_loop:
   341 00000235 803D[FB0D0000]00        	cmp	byte [srb], 0
   342 0000023C 7616                    	jna	short q_loop
   343 0000023E C605[FB0D0000]00        	mov	byte [srb], 0
   344                                  modp_gs:
   345 00000245 BF[00800000]            	mov     edi, Audio_Buffer
   346 0000024A BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   347 0000024F E8E1060000              	call    GetSamples
   348                                  q_loop:
   349 00000254 B401                    	mov     ah, 1		; any key pressed?
   350 00000256 CD32                    	int     32h		; no, Loop.
   351 00000258 7405                    	jz	short r_loop
   352                                  
   353 0000025A B400                    	mov     ah, 0		; flush key buffer...
   354 0000025C CD32                    	int     32h
   355                                  q_return:
   356 0000025E C3                      	retn
   357                                  r_loop:
   358                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   359                                  	; 23/06/2017
   360                                  	; 22/06/2017
   361                                  	; bh = 15, get current sound data/samples
   362                                  	; bl = 0, for PCM OUT
   363                                  	; ecx = count of sample/data bytes (1 to 4096)
   364                                  	; edx = destination buffer address 
   365                                  	;	(page aligned address is better)
   366                                  	;
   367                                  	sys	_audio, 0F00h, 320, g_buff
   367                              <1> 
   367                              <1> 
   367                              <1> 
   367                              <1> 
   367                              <1>  %if %0 >= 2
   367 0000025F BB000F0000          <1>  mov ebx, %2
   367                              <1>  %if %0 >= 3
   367 00000264 B940010000          <1>  mov ecx, %3
   367                              <1>  %if %0 = 4
   367 00000269 BA[00000100]        <1>  mov edx, %4
   367                              <1>  %endif
   367                              <1>  %endif
   367                              <1>  %endif
   367 0000026E B820000000          <1>  mov eax, %1
   367                              <1> 
   367 00000273 CD40                <1>  int 40h
   368                                  ScopeLoop:
   369 00000275 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   370                                  	; 19/06/2017
   371 0000027A BE[00000100]            	mov     esi, g_buff	; display current samples
   372 0000027F 31C9                    	xor     ecx, ecx	; to be drawed ...
   373 00000281 31D2                    	xor     edx, edx
   374                                  DrawLoop:       
   375 00000283 89D3                    	mov     ebx, edx	; (save Index)
   376 00000285 668BBB[906C0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   377 0000028C C60700                  	mov     byte [edi], 0	; erase it!
   378                                  	;lodsb
   379                                  	;mov	bl, al
   380 0000028F 8A1E                    	mov	bl, [esi]	; get a sample (8-bit)
   381 00000291 46                      	inc	esi		; calc new pixel address...
   382 00000292 30FF                    	xor     bh, bh
   383 00000294 66D1E3                  	shl     bx, 1
   384 00000297 668BBB[106F0000]        	mov     di, [RowOfs+ebx]
   385 0000029E 6601CF                  	add     di, cx
   386 000002A1 6689D3                  	mov     bx, dx		; (restore Index)
   387 000002A4 6689BB[906C0000]        	mov     [Scope+ebx], di	; save new address...
   388 000002AB C6070A                  	mov     byte [edi], 10	; and DRAW.
   389 000002AE 6683C202                	add     dx, 2		; the next pixel...
   390 000002B2 41                      	inc     ecx
   391 000002B3 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   392 000002B8 72C9                    	jb      short DrawLoop
   393 000002BA E976FFFFFF              	jmp	p_loop
   394                                  
   395                                  
   396                                  ;=============================================================================
   397                                  ;               MODLOAD.ASM
   398                                  ;=============================================================================
   399                                  
   400                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   401                                  ;	July 10th, 1993.
   402                                  
   403                                  ; STRUCTURES
   404                                  
   405                                  struc ModSample
   406 00000000 <res 00000016>          .msName:	resb 22
   407 00000016 <res 00000002>          .msLength:	resw 1
   408 00000018 <res 00000001>          .msFinetune:	resb 1
   409 00000019 <res 00000001>          .msVolume:	resb 1
   410 0000001A <res 00000002>          .msRepeat:	resw 1
   411 0000001C <res 00000002>          .msRepLen:	resw 1
   412                                  .size:
   413                                  endstruc
   414                                  
   415                                  struc ModHeader
   416 00000000 <res 00000014>          .mhName:	resb 20
   417 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   418 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   419 000003B7 <res 00000001>          .mhReStart:	resb 1
   420 000003B8 <res 00000080>          .mhOrder:	resb 128
   421 00000438 <res 00000004>          .mhSign:	resw 2
   422                                  .size:	
   423                                  endstruc
   424                                  
   425                                  struc ModInfoRec
   426 00000000 <res 00000001>          .OrderLen:	resb 1
   427 00000001 <res 00000001>          .ReStart:	resb 1
   428 00000002 <res 00000080>          .Order:	resb 128
   429 00000082 <res 00000004>          .Patterns:	resd 1
   430 00000086 <res 0000003E>          .SampOfs:	resw 31
   431 000000C4 <res 0000003E>          .SampSeg:	resw 31
   432 00000102 <res 0000003E>          .SampLen:	resw 31
   433 00000140 <res 0000003E>          .SampRep:	resw 31
   434 0000017E <res 0000003E>          .SampRepLen:	resw 31
   435 000001BC <res 0000003E>          .SampVol:	resw 31
   436                                  .size:	
   437                                  endstruc
   438                                  
   439                                  ; CODE
   440                                  
   441                                  LoadModule:
   442                                  	; edi = file name address
   443                                  
   444 000002BF 60                      	pushad
   445                                  
   446 000002C0 66C705[FE0D0000]01-     	mov	word [ErrorInfo], 1
   446 000002C8 00                 
   447                                  
   448 000002C9 E88F010000              	call    ClearModInfo
   449                                  OpenFile:       
   450                                  	; ebx = ASCIIZ file name address
   451                                  	; ecx = open mode (0 = open for read)	
   452                                  	sys	_open, edi, 0 ; open for reading
   452                              <1> 
   452                              <1> 
   452                              <1> 
   452                              <1> 
   452                              <1>  %if %0 >= 2
   452 000002CE 89FB                <1>  mov ebx, %2
   452                              <1>  %if %0 >= 3
   452 000002D0 B900000000          <1>  mov ecx, %3
   452                              <1>  %if %0 = 4
   452                              <1>  mov edx, %4
   452                              <1>  %endif
   452                              <1>  %endif
   452                              <1>  %endif
   452 000002D5 B805000000          <1>  mov eax, %1
   452                              <1> 
   452 000002DA CD40                <1>  int 40h
   453 000002DC 0F8279010000            	jc	Failed
   454 000002E2 A3[FC0D0000]            	mov     [FileHandle], eax
   455                                  ReadHeader:
   456                                  	; ebx = File handle
   457                                  	; ecx = Buffer address
   458                                  	; edx = Byte count
   459                                  	sys	_read, [FileHandle], Header, ModHeader.size
   459                              <1> 
   459                              <1> 
   459                              <1> 
   459                              <1> 
   459                              <1>  %if %0 >= 2
   459 000002E7 8B1D[FC0D0000]      <1>  mov ebx, %2
   459                              <1>  %if %0 >= 3
   459 000002ED B9[000E0000]        <1>  mov ecx, %3
   459                              <1>  %if %0 = 4
   459 000002F2 BA3C040000          <1>  mov edx, %4
   459                              <1>  %endif
   459                              <1>  %endif
   459                              <1>  %endif
   459 000002F7 B803000000          <1>  mov eax, %1
   459                              <1> 
   459 000002FC CD40                <1>  int 40h
   460 000002FE 0F824A010000            	jc      CloseFile
   461                                  CheckMK:        
   462 00000304 813D[38120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   462 0000030C 4B2E               
   463 0000030E 7440                    	je      short IsModFile
   464                                  CheckFLT4:
   465 00000310 813D[38120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   465 00000318 5434               
   466 0000031A 7434                    	je      short IsModFile
   467                                  Is15Inst:
   468 0000031C BE[D60F0000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   469 00000321 BF[B6110000]            	mov     edi, Header+ModHeader.mhOrderLen
   470                                  	;cld
   471                                  	;mov	ecx, 130
   472 00000326 66B98200                	mov	cx, 130
   473 0000032A F3A4                    	rep     movsb
   474 0000032C BF[D60F0000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   475 00000331 30C0                    	xor     al, al
   476 00000333 66B9E001                	mov     cx, 16*ModSample.size
   477 00000337 F3AA                    	rep     stosb
   478                                  SeekPatterns:   
   479                                  	; ebx = [FileHandle]
   480                                  	; ecx = offset
   481                                  	; edx = switch (0 = from beginning)
   482                                  	sys	_seek, [FileHandle], 600, 0
   482                              <1> 
   482                              <1> 
   482                              <1> 
   482                              <1> 
   482                              <1>  %if %0 >= 2
   482 00000339 8B1D[FC0D0000]      <1>  mov ebx, %2
   482                              <1>  %if %0 >= 3
   482 0000033F B958020000          <1>  mov ecx, %3
   482                              <1>  %if %0 = 4
   482 00000344 BA00000000          <1>  mov edx, %4
   482                              <1>  %endif
   482                              <1>  %endif
   482                              <1>  %endif
   482 00000349 B813000000          <1>  mov eax, %1
   482                              <1> 
   482 0000034E CD40                <1>  int 40h
   483                                  IsModFile:
   484 00000350 A0[B6110000]            	mov     al, [Header+ModHeader.mhOrderLen]
   485 00000355 A2[3C120000]            	mov     [ModInfo.OrderLen], al
   486                                  
   487 0000035A A0[B7110000]            	mov     al, [Header+ModHeader.mhReStart]
   488 0000035F 3A05[B6110000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   489 00000365 7202                    	jb      short SetReStart
   490 00000367 B07F                    	mov     al, 7Fh
   491                                  SetReStart:
   492 00000369 A2[3D120000]            	mov     [ModInfo.ReStart], al
   493                                  
   494                                  	;mov	ecx, 128
   495 0000036E 66B98000                	mov	cx, 128
   496 00000372 31D2                    	xor     edx, edx
   497 00000374 31DB                    	xor     ebx, ebx
   498                                  CopyOrder:
   499 00000376 8AB3[B8110000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   500 0000037C 88B3[3E120000]          	mov     [ModInfo.Order+ebx], dh
   501 00000382 38D6                    	cmp     dh, dl
   502 00000384 7202                    	jb      short NextOrder
   503 00000386 88F2                    	mov     dl, dh
   504                                  NextOrder:
   505 00000388 43                      	inc     ebx
   506 00000389 E2EB                    	loop    CopyOrder
   507                                  AllocPatterns:  
   508 0000038B 81E2FF000000            	and	edx, 0FFh
   509 00000391 6642                    	inc	dx ; 14/03/2017
   510                                  	; dl = count of 1024 bytes
   511 00000393 C1E20A                  	shl	edx, 10 ; *1024
   512                                  
   513 00000396 89D5                    	mov	ebp, edx
   514                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   515 00000398 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   516                                  	;
   517 0000039D 890D[BE120000]          	mov	[ModInfo.Patterns], ecx
   518                                  	;
   519 000003A3 01CD                    	add	ebp, ecx ; next offset for samples
   520                                  ReadPatterns:  
   521                                  	;mov	ebx, [FileHandle] 
   522                                  	; ebx = File handle
   523                                  	; ecx = Buffer address
   524                                  	; edx = Byte count
   525                                  	sys	_read, [FileHandle]
   525                              <1> 
   525                              <1> 
   525                              <1> 
   525                              <1> 
   525                              <1>  %if %0 >= 2
   525 000003A5 8B1D[FC0D0000]      <1>  mov ebx, %2
   525                              <1>  %if %0 >= 3
   525                              <1>  mov ecx, %3
   525                              <1>  %if %0 = 4
   525                              <1>  mov edx, %4
   525                              <1>  %endif
   525                              <1>  %endif
   525                              <1>  %endif
   525 000003AB B803000000          <1>  mov eax, %1
   525                              <1> 
   525 000003B0 CD40                <1>  int 40h
   526 000003B2 0F8296000000            	jc      CloseFile
   527                                  
   528 000003B8 BE[140E0000]            	mov	esi, Header+ModHeader.mhSamples
   529 000003BD 31FF                    	xor     edi, edi
   530                                  CopySamples:
   531 000003BF 668B4616                	mov     ax, [esi+ModSample.msLength]
   532 000003C3 86C4                    	xchg    al, ah
   533 000003C5 66D1E0                  	shl     ax, 1
   534 000003C8 668987[3E130000]        	mov     [ModInfo.SampLen+edi], ax
   535 000003CF 8A4619                  	mov     al, [esi+ModSample.msVolume]
   536 000003D2 30E4                    	xor     ah, ah
   537 000003D4 668987[F8130000]        	mov     [ModInfo.SampVol+edi], ax
   538 000003DB 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   539 000003DF 86C4                    	xchg    al, ah
   540 000003E1 66D1E0                  	shl     ax, 1
   541 000003E4 668987[7C130000]        	mov     [ModInfo.SampRep+edi], ax
   542 000003EB 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   543 000003EF 86C4                    	xchg    al, ah
   544 000003F1 66D1E0                  	shl     ax, 1
   545 000003F4 668987[BA130000]        	mov     [ModInfo.SampRepLen+edi], ax
   546 000003FB 83C61E                  	add     esi, ModSample.size
   547 000003FE 6683C702                	add     di, 2
   548 00000402 6683FF3E                	cmp     di, 2*31
   549 00000406 72B7                    	jb      short CopySamples
   550                                  
   551 00000408 31F6                    	xor     esi, esi
   552                                  AllocSamples:
   553 0000040A 0FB796[3E130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   554 00000411 09D2                    	or	edx, edx ; byte count
   555 00000413 7426                    	jz      short NextSample
   556 00000415 89E8                    	mov	eax, ebp
   557 00000417 668986[C2120000]        	mov	[ModInfo.SampOfs+esi], ax
   558 0000041E C1E810                  	shr	eax, 16
   559 00000421 668986[00130000]        	mov	[ModInfo.SampSeg+esi], ax
   560 00000428 89E9                    	mov	ecx, ebp
   561 0000042A 01D5                    	add	ebp, edx ; next offset for sample 
   562                                  ReadSample:
   563                                  	;mov	ebx, [FileHandle]
   564                                  	;movzx  edx, [ModInfo.SampLen+esi]
   565                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   566                                  
   567                                  	; ebx = File handle
   568                                  	; ecx = Buffer address
   569                                  	; edx = Byte count
   570                                  	sys	_read, [FileHandle]
   570                              <1> 
   570                              <1> 
   570                              <1> 
   570                              <1> 
   570                              <1>  %if %0 >= 2
   570 0000042C 8B1D[FC0D0000]      <1>  mov ebx, %2
   570                              <1>  %if %0 >= 3
   570                              <1>  mov ecx, %3
   570                              <1>  %if %0 = 4
   570                              <1>  mov edx, %4
   570                              <1>  %endif
   570                              <1>  %endif
   570                              <1>  %endif
   570 00000432 B803000000          <1>  mov eax, %1
   570                              <1> 
   570 00000437 CD40                <1>  int 40h
   571 00000439 7213                    	jc      short CloseFile
   572                                  
   573                                  NextSample:
   574 0000043B 6683C602                	add     si, 2
   575 0000043F 6683FE3E                	cmp     si, 2*31
   576 00000443 72C5                    	jb      short AllocSamples
   577                                  
   578 00000445 66C705[FE0D0000]00-     	mov     word [ErrorInfo], 0
   578 0000044D 00                 
   579                                  CloseFile:      
   580                                  	sys	_close, [FileHandle]
   580                              <1> 
   580                              <1> 
   580                              <1> 
   580                              <1> 
   580                              <1>  %if %0 >= 2
   580 0000044E 8B1D[FC0D0000]      <1>  mov ebx, %2
   580                              <1>  %if %0 >= 3
   580                              <1>  mov ecx, %3
   580                              <1>  %if %0 = 4
   580                              <1>  mov edx, %4
   580                              <1>  %endif
   580                              <1>  %endif
   580                              <1>  %endif
   580 00000454 B806000000          <1>  mov eax, %1
   580                              <1> 
   580 00000459 CD40                <1>  int 40h
   581                                  Failed:         
   582 0000045B 61                      	popad
   583                                  
   584 0000045C C3                      	retn
   585                                  
   586                                  FreeModule:
   587                                  	; Erdogan Tan (13/02/2017)
   588                                  	; nothing to do here for memory de-allocation
   589                                  ClearModInfo:
   590 0000045D 57                      	push	edi
   591 0000045E BF[3C120000]            	mov	edi, ModInfo
   592 00000463 B9FA010000              	mov     ecx, ModInfoRec.size
   593                                  	;cld
   594 00000468 30C0                    	xor     al, al
   595 0000046A F3AA                    	rep     stosb
   596 0000046C 5F                      	pop	edi
   597 0000046D C3                      	retn
   598                                  
   599                                  ;=============================================================================
   600                                  ;               MODPLAY.ASM
   601                                  ;=============================================================================
   602                                  
   603                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   604                                  ;	July 23th, 1993.
   605                                  
   606                                  ; EQUATES
   607                                  
   608                                  NumTracks       equ 4
   609                                  DefTempo        equ 6
   610                                  DefBpm          equ 125
   611                                  MidCRate        equ 8448
   612                                  MixBufSize      equ 4096
   613                                  
   614                                  ; STRUCTURES
   615                                  
   616                                  struc TrackInfo
   617 00000000 <res 00000004>          .Samples:	resd 1
   618 00000004 <res 00000004>          .Position:	resd 1
   619 00000008 <res 00000002>          .Len:	resw 1
   620 0000000A <res 00000002>          .Repeat:	resw 1
   621 0000000C <res 00000002>          .RepLen:	resw 1
   622 0000000E <res 00000001>          .Volume: 	resb 1
   623 0000000F <res 00000001>          .Error:	resb 1
   624 00000010 <res 00000002>          .Period:	resw 1
   625 00000012 <res 00000002>          .Pitch:	resw 1
   626 00000014 <res 00000002>          .Effect:	resw 1
   627 00000016 <res 00000002>          .PortTo:	resw 1
   628 00000018 <res 00000001>          .PortParm:	resb 1
   629 00000019 <res 00000001>          .VibPos:	resb 1
   630 0000001A <res 00000001>          .VibParm:	resb 1
   631 0000001B <res 00000001>          .OldSampOfs:	resb 1
   632 0000001C <res 00000006>          .Arp:	resw 3
   633 00000022 <res 00000002>          .ArpIndex:	resw 1
   634                                  .size:
   635                                  endstruc
   636                                  
   637                                  ; CODE
   638                                  
   639                                  ;--------------------------------------------------------------------------
   640                                  ; BeatTrack:  Process the next beat in one track.
   641                                  ;  In:
   642                                  ;    ds:di -  Track info Address.
   643                                  ;--------------------------------------------------------------------------
   644                                  
   645                                  ; edi = Track info address
   646                                  
   647                                  BeatTrack:
   648 0000046E 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   649 00000472 6685D2                  	test    dx, dx
   650 00000475 743C                    	je      short None
   651 00000477 80FE00                  	cmp     dh, 00h
   652 0000047A 7438                    	je      short Arpeggio
   653 0000047C 80FE01                  	cmp     dh, 01h
   654 0000047F 7451                    	je      short PortUp
   655 00000481 80FE02                  	cmp     dh, 02h
   656 00000484 7471                    	je      short PortDown
   657 00000486 80FE03                  	cmp     dh, 03h
   658 00000489 0F848E000000            	je      TonePort
   659 0000048F 80FE04                  	cmp     dh, 04h
   660 00000492 0F84BD000000            	je      Vibrato
   661 00000498 80FE05                  	cmp     dh, 05h
   662 0000049B 0F840E010000            	je      PortSlide
   663 000004A1 80FE06                  	cmp     dh, 06h
   664 000004A4 0F8412010000            	je      VibSlide
   665 000004AA 80FE0A                  	cmp     dh, 0Ah
   666 000004AD 0F8413010000            	je      VolSlide
   667                                  None:           
   668 000004B3 C3                      	retn
   669                                  Arpeggio:
   670 000004B4 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   671 000004B8 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   672 000004BD 66894712                	mov     [edi+TrackInfo.Pitch], ax
   673 000004C1 6683C302                	add     bx, 2
   674 000004C5 6683FB06                	cmp     bx, 6
   675 000004C9 7202                    	jb      short SetArpIndex
   676 000004CB 31DB                    	xor     ebx, ebx
   677                                  SetArpIndex:
   678 000004CD 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   679 000004D1 C3                      	retn
   680                                  PortUp:
   681 000004D2 30F6                    	xor     dh, dh
   682 000004D4 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   683 000004D8 6629D3                  	sub     bx, dx
   684 000004DB 6683FB71                	cmp     bx, 113
   685 000004DF 7D04                    	jge     short NotSmall
   686 000004E1 66BB7100                	mov     bx, 113
   687                                  NotSmall:
   688 000004E5 66895F10                	mov     [edi+TrackInfo.Period], bx
   689 000004E9 6601DB                  	add     bx, bx
   690 000004EC 66678B87[3614]          	mov     ax, [PitchTable+bx]
   691 000004F2 66894712                	mov     [edi+TrackInfo.Pitch], ax
   692 000004F6 C3                      	retn
   693                                  PortDown:
   694 000004F7 30F6                    	xor     dh, dh
   695 000004F9 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   696 000004FD 6601D3                  	add     bx, dx
   697 00000500 6681FB5803              	cmp     bx, 856
   698 00000505 7E04                    	jle     short NotBig
   699 00000507 66BB5803                	mov     bx, 856
   700 0000050B 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   701 0000050F 6601DB                  	add     bx, bx
   702 00000512 66678B87[3614]          	mov     ax, [PitchTable+bx]
   703 00000518 66894712                	mov     [edi+TrackInfo.Pitch], ax
   704 0000051C C3                      	retn
   705                                  TonePort:
   706 0000051D 30F6                    	xor     dh, dh
   707 0000051F 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   708 00000523 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   709 00000527 6639C3                  	cmp     bx, ax
   710 0000052A 7428                    	je      short NoPort
   711 0000052C 7F0D                    	jg      short PortToUp
   712                                  PortToDown:     
   713 0000052E 6601D3                  	add     bx, dx
   714 00000531 6639C3                  	cmp     bx, ax
   715 00000534 7E0D                    	jle     short SetPort
   716                                  FixPort:        
   717 00000536 6689C3                  	mov     bx, ax
   718 00000539 EB08                    	jmp     short SetPort
   719                                  PortToUp:
   720 0000053B 6629D3                  	sub     bx, dx
   721 0000053E 6639C3                  	cmp     bx, ax
   722 00000541 7CF3                    	jl      short FixPort
   723                                  SetPort:        
   724 00000543 66895F10                	mov     [edi+TrackInfo.Period], bx
   725 00000547 6601DB                  	add     bx, bx
   726 0000054A 66678B87[3614]          	mov     ax, [PitchTable+bx]
   727 00000550 66894712                	mov     [edi+TrackInfo.Pitch], ax
   728                                  NoPort:         
   729 00000554 C3                      	retn
   730                                  Vibrato:
   731 00000555 88D6                    	mov     dh, dl
   732 00000557 80E20F                  	and     dl, 0Fh
   733 0000055A C0EE04                  	shr     dh, 4
   734 0000055D C0E602                  	shl     dh, 2
   735 00000560 007719                  	add     [edi+TrackInfo.VibPos], dh
   736 00000563 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   737 00000566 88F3                    	mov     bl, dh
   738 00000568 C0EB02                  	shr     bl, 2
   739 0000056B 6683E31F                	and     bx, 1Fh
   740 0000056F 678A87[DE0C]            	mov     al, [SinTable+bx]
   741 00000574 F6E2                    	mul     dl
   742 00000576 66D1C0                  	rol     ax, 1
   743 00000579 86C4                    	xchg    al, ah
   744 0000057B 80E401                  	and     ah, 1
   745 0000057E 84F6                    	test    dh, dh
   746 00000580 7903                    	jns     short VibUp
   747 00000582 66F7D8                  	neg     ax
   748                                  VibUp:          
   749 00000585 66034710                	add     ax, [edi+TrackInfo.Period]
   750 00000589 6689C3                  	mov     bx, ax
   751 0000058C 6683FB71                	cmp     bx, 113
   752 00000590 7D04                    	jge     short NoLoVib
   753 00000592 66BB7100                	mov     bx, 113
   754                                  NoLoVib:        
   755 00000596 6681FB5803              	cmp     bx, 856
   756 0000059B 7E04                    	jle     short NoHiVib
   757 0000059D 66BB5803                	mov     bx, 856
   758                                  NoHiVib:        
   759 000005A1 6601DB                  	add     bx, bx
   760 000005A4 66678B87[3614]          	mov     ax, [PitchTable+bx]
   761 000005AA 66894712                	mov     [edi+TrackInfo.Pitch], ax
   762 000005AE C3                      	retn
   763                                  PortSlide:
   764 000005AF E812000000              	call    VolSlide
   765 000005B4 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   766 000005B7 E961FFFFFF              	jmp     TonePort
   767                                  VibSlide:
   768 000005BC E805000000              	call    VolSlide
   769 000005C1 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   770 000005C4 EB8F                    	jmp     short Vibrato
   771                                  VolSlide:
   772 000005C6 88D6                    	mov     dh, dl
   773 000005C8 80E20F                  	and     dl, 0Fh
   774 000005CB C0EE04                  	shr     dh, 4
   775 000005CE 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   776 000005D1 28D0                    	sub     al, dl
   777 000005D3 7D02                    	jge     short NoLoVol
   778 000005D5 30C0                    	xor     al, al
   779                                  NoLoVol:        
   780 000005D7 00F0                    	add     al, dh
   781 000005D9 3C40                    	cmp     al, 64
   782 000005DB 7602                    	jbe     short NoHiVol
   783 000005DD B040                    	mov     al, 64
   784                                  NoHiVol:        
   785 000005DF 88470E                  	mov     [edi+TrackInfo.Volume], al
   786 000005E2 C3                      	retn
   787                                  
   788                                  ;--------------------------------------------------------------------------
   789                                  ; GetTrack:   Get the next Note from a pattern.
   790                                  ;  In:
   791                                  ;    ds:di -  Track info Address.
   792                                  ;    es:si -  Pattern Note Address.
   793                                  ; Out:
   794                                  ;    es:si -  The Next Pattern Note address.
   795                                  ;--------------------------------------------------------------------------
   796                                  
   797                                  ; esi = Pattern note address
   798                                  ; edi = Track info address
   799                                  
   800                                  GetTrack:
   801 000005E3 66AD                    	lodsw
   802 000005E5 86C4                    	xchg    al, ah
   803 000005E7 88E3                    	mov	bl, ah
   804 000005E9 80E40F                  	and     ah, 0Fh
   805 000005EC 6689C1                  	mov     cx, ax
   806 000005EF 66AD                    	lodsw
   807 000005F1 86C4                    	xchg    al, ah
   808 000005F3 88E7                    	mov     bh, ah
   809 000005F5 80E40F                  	and     ah, 0Fh
   810 000005F8 6689C2                  	mov     dx, ax
   811 000005FB 66895714                	mov     [edi+TrackInfo.Effect], dx
   812 000005FF 80E3F0                  	and     bl, 0F0h
   813 00000602 C0EF04                  	shr     bh, 4
   814 00000605 08FB                    	or      bl, bh
   815 00000607 7449                    	je      short SetPeriod
   816                                  SetSample:
   817                                  	;xor    bh, bh
   818 00000609 81E3FF000000            	and	ebx, 0FFh
   819 0000060F 4B                      	dec     ebx
   820 00000610 01DB                    	add     ebx, ebx
   821 00000612 668B83[F8130000]        	mov     ax, [ModInfo.SampVol+ebx]
   822 00000619 88470E                  	mov     [edi+TrackInfo.Volume], al
   823 0000061C 668B83[C2120000]        	mov     ax, [ModInfo.SampOfs+ebx]
   824 00000623 668907                  	mov     [edi+TrackInfo.Samples], ax
   825 00000626 668B83[00130000]        	mov     ax, [ModInfo.SampSeg+ebx]
   826 0000062D 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   827 00000631 668B83[3E130000]        	mov     ax, [ModInfo.SampLen+ebx]
   828 00000638 66894708                	mov     [edi+TrackInfo.Len], ax
   829 0000063C 668B83[7C130000]        	mov     ax, [ModInfo.SampRep+ebx]
   830 00000643 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   831 00000647 668B83[BA130000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   832 0000064E 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   833                                  SetPeriod:      
   834 00000652 6685C9                  	test    cx, cx
   835 00000655 7424                    	jz      short SetEffect
   836                                  
   837 00000657 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   838 0000065B 80FE03                  	cmp     dh, 03h
   839 0000065E 741B                    	je      short SetEffect
   840                                  
   841 00000660 66894F10                	mov     [edi+TrackInfo.Period], cx
   842 00000664 6689CB                  	mov     bx, cx
   843 00000667 6601DB                  	add     bx, bx
   844 0000066A 66678B87[3614]          	mov     ax, [PitchTable+bx]
   845 00000670 66894712                	mov     [edi+TrackInfo.Pitch], ax
   846 00000674 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   847                                  SetEffect:
   848 0000067B 6685D2                  	test    dx, dx
   849 0000067E 7430                    	jz      short InitNone
   850 00000680 80FE00                  	cmp     dh, 00h
   851 00000683 0F84E5000000            	je      InitArpeggio
   852 00000689 80FE03                  	cmp     dh, 03h
   853 0000068C 7423                    	je      short InitTonePort
   854 0000068E 80FE04                  	cmp     dh, 04h
   855 00000691 742D                    	je      short InitVibrato
   856 00000693 80FE09                  	cmp     dh, 09h
   857 00000696 7451                    	je      short SampleOfs
   858 00000698 80FE0B                  	cmp     dh, 0Bh
   859 0000069B 7462                    	je      short PosJump
   860 0000069D 80FE0C                  	cmp     dh, 0Ch
   861 000006A0 746B                    	je      short SetVolume
   862 000006A2 80FE0D                  	cmp     dh, 0Dh
   863 000006A5 7471                    	je      short Break
   864 000006A7 80FE0F                  	cmp     dh, 0Fh
   865 000006AA 0F8487000000            	je      SetSpeed
   866                                  InitNone:
   867 000006B0 C3                      	retn
   868                                  InitTonePort:
   869 000006B1 84D2                    	test    dl, dl
   870 000006B3 7503                    	jnz     short SetPortParm
   871 000006B5 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   872                                  SetPortParm:    
   873 000006B8 885718                  	mov     [edi+TrackInfo.PortParm], dl
   874 000006BB 66895714                	mov     [edi+TrackInfo.Effect], dx
   875 000006BF C3                      	retn
   876                                  InitVibrato:
   877 000006C0 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   878 000006C3 88C4                    	mov     ah, al
   879 000006C5 240F                    	and     al, 0Fh
   880 000006C7 80E4F0                  	and     ah, 0F0h
   881 000006CA F6C20F                  	test    dl, 0Fh
   882 000006CD 7502                    	jne     short OkDepth
   883 000006CF 08C2                    	or      dl, al
   884                                  OkDepth:        
   885 000006D1 F6C2F0                  	test    dl, 0F0h
   886 000006D4 7502                    	jnz     short OkRate
   887 000006D6 08E2                    	or      dl, ah
   888                                  OkRate:         
   889 000006D8 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   890 000006DB 66895714                	mov     [edi+TrackInfo.Effect], dx
   891 000006DF 6685C9                  	test    cx, cx
   892 000006E2 7404                    	jz      short OkPos
   893 000006E4 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   894                                  OkPos:          
   895 000006E8 C3                      	retn
   896                                  SampleOfs:      
   897 000006E9 84D2                    	test    dl, dl
   898 000006EB 7503                    	jnz     short SetSampleOfs
   899 000006ED 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   900                                  SetSampleOfs:
   901 000006F0 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   902 000006F3 88D6                    	mov     dh, dl
   903 000006F5 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   904 000006FB 895704                  	mov     [edi+TrackInfo.Position], edx
   905 000006FE C3                      	retn
   906                                  PosJump:
   907 000006FF 8815[E86B0000]          	mov     [OrderPos], dl
   908 00000705 C605[EC6B0000]40        	mov     byte [Row], 64
   909 0000070C C3                      	retn
   910                                  SetVolume:
   911 0000070D 80FA40                  	cmp     dl, 64
   912 00000710 7602                    	jbe     short OkVol
   913 00000712 B240                    	mov     dl, 64
   914                                  OkVol:
   915 00000714 88570E                  	mov     [edi+TrackInfo.Volume], dl
   916 00000717 C3                      	retn
   917                                  Break:
   918 00000718 88D6                    	mov     dh, dl
   919 0000071A 80E20F                  	and     dl, 0Fh
   920 0000071D C0EE04                  	shr     dh, 4
   921 00000720 00F6                    	add     dh, dh
   922 00000722 00F2                    	add     dl, dh
   923 00000724 C0E602                  	shl     dh, 2
   924 00000727 00F2                    	add     dl, dh
   925 00000729 8815[ED6B0000]          	mov     [BreakRow], dl
   926 0000072F C605[EC6B0000]40        	mov     byte [Row], 64
   927 00000736 C3                      	retn
   928                                  SetSpeed:
   929 00000737 84D2                    	test    dl,dl
   930 00000739 7432                    	je      Skip
   931 0000073B 80FA1F                  	cmp     dl,31
   932 0000073E 770D                    	ja      short SetBpm
   933                                  SetTempo:       
   934 00000740 8815[E96B0000]          	mov     [Tempo], dl
   935 00000746 8815[EA6B0000]          	mov     [TempoWait], dl
   936 0000074C C3                      	retn
   937                                  SetBpm:
   938 0000074D 8815[EB6B0000]          	mov     [Bpm], dl
   939 00000753 B067                    	mov     al, 103
   940 00000755 F6E2                    	mul     dl
   941 00000757 88E3                    	mov     bl, ah
   942 00000759 30FF                    	xor     bh, bh
   943 0000075B 66A1[480D0000]          	mov     ax, [MixSpeed]
   944 00000761 6631D2                  	xor     dx, dx
   945 00000764 66F7F3                  	div     bx
   946 00000767 66A3[EE6B0000]          	mov     [BpmSamples], ax
   947                                  Skip:           
   948 0000076D C3                      	retn
   949                                  InitArpeggio:
   950 0000076E 88D6                    	mov     dh, dl
   951 00000770 80E20F                  	and     dl, 0Fh
   952 00000773 C0EE04                  	shr     dh, 4
   953 00000776 66B92400                	mov     cx, 36
   954 0000077A 31DB                    	xor     ebx, ebx
   955 0000077C 668B4710                	mov     ax, [edi+TrackInfo.Period]
   956                                  gt_ScanPeriod:
   957 00000780 66673B87[FE0C]          	cmp     ax, [PeriodTable+bx]
   958 00000786 7306                    	jae     short SetArp
   959 00000788 6683C302                	add     bx, 2
   960 0000078C E2F2                    	loop    gt_ScanPeriod
   961                                  SetArp:         
   962 0000078E 6601D2                  	add     dx, dx
   963 00000791 00DE                    	add     dh, bl
   964 00000793 00DA                    	add     dl, bl
   965 00000795 66678B9F[FE0C]          	mov     bx, [PeriodTable+bx]
   966 0000079B 6601DB                  	add     bx, bx
   967 0000079E 66678B87[3614]          	mov     ax, [PitchTable+bx]
   968 000007A4 6689471C                	mov     [edi+TrackInfo.Arp], ax
   969 000007A8 88F3                    	mov     bl, dh
   970 000007AA 30FF                    	xor     bh, bh
   971 000007AC 66678B9F[FE0C]          	mov     bx, [PeriodTable+bx]
   972 000007B2 6601DB                  	add     bx, bx
   973 000007B5 66678B87[3614]          	mov     ax, [PitchTable+bx]
   974 000007BB 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
   975 000007BF 88D3                    	mov     bl, dl
   976 000007C1 30FF                    	xor     bh, bh
   977 000007C3 66678B9F[FE0C]          	mov     bx, [PeriodTable+bx]
   978 000007C9 6601DB                  	add     bx, bx
   979 000007CC 66678B87[3614]          	mov     ax, [PitchTable+bx]
   980 000007D2 66894720                	mov     [edi+TrackInfo.Arp+4], ax
   981 000007D6 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
   982 000007DC C3                      	retn
   983                                  
   984                                  ;--------------------------------------------------------------------------
   985                                  ; UpdateTracks:  Main code to process the next tick to be played.
   986                                  ;--------------------------------------------------------------------------
   987                                  
   988                                  UpdateTracks:
   989 000007DD FE0D[EA6B0000]          	dec     byte [TempoWait]
   990 000007E3 7415                    	jz      short GetTracks
   991                                  
   992 000007E5 B904000000              	mov	ecx, NumTracks
   993 000007EA BF[FE6B0000]            	mov	edi, Tracks
   994                                  BeatTracks:
   995 000007EF E87AFCFFFF              	call	BeatTrack	
   996 000007F4 83C724                  	add	edi, TrackInfo.size
   997 000007F7 E2F6                    	loop	BeatTracks
   998 000007F9 C3                      	retn
   999                                  GetTracks:
  1000 000007FA A0[E96B0000]            	mov     al, [Tempo]
  1001 000007FF A2[EA6B0000]            	mov     [TempoWait], al
  1002                                  
  1003 00000804 8B35[FA6B0000]          	mov	esi, [Note]
  1004 0000080A 803D[EC6B0000]40        	cmp     byte [Row], 64
  1005 00000811 7263                    	jb      short NoPattWrap
  1006                                  
  1007 00000813 8B35[BE120000]          	mov	esi, [ModInfo.Patterns]
  1008 00000819 8A1D[E86B0000]          	mov     bl, [OrderPos]
  1009 0000081F 3A1D[3C120000]          	cmp     bl, [ModInfo.OrderLen]
  1010 00000825 7214                    	jb      short NoOrderWrap
  1011 00000827 8A1D[3D120000]          	mov     bl, [ModInfo.ReStart]
  1012 0000082D 881D[E86B0000]          	mov     [OrderPos], bl
  1013 00000833 3A1D[3C120000]          	cmp     bl, [ModInfo.OrderLen]
  1014 00000839 735D                    	jae     short NoUpdate
  1015                                  NoOrderWrap:    
  1016                                  	;xor	bh, bh
  1017 0000083B 81E3FF000000            	and	ebx, 0FFh
  1018 00000841 8A9B[3E120000]          	mov     bl, [ModInfo.Order+ebx]
  1019 00000847 C1E30A                  	shl     ebx, 10 ; *1024
  1020 0000084A 01DE                    	add     esi, ebx
  1021 0000084C 8A1D[ED6B0000]          	mov     bl, [BreakRow]
  1022 00000852 881D[EC6B0000]          	mov     [Row], bl
  1023                                  	;xor     bh, bh
  1024 00000858 81E3FF000000            	and	ebx, 0FFh
  1025 0000085E 883D[ED6B0000]          	mov     [BreakRow], bh ; 0
  1026 00000864 66C1E304                	shl     bx, 4
  1027 00000868 01DE                    	add     esi, ebx
  1028 0000086A 8935[FA6B0000]          	mov     [Note], esi
  1029 00000870 FE05[E86B0000]          	inc     byte [OrderPos]
  1030                                  NoPattWrap:     
  1031 00000876 FE05[EC6B0000]          	inc     byte [Row]
  1032                                  
  1033                                  	;cld
  1034 0000087C B904000000              	mov	ecx, NumTracks
  1035 00000881 BF[FE6B0000]            	mov	edi, Tracks
  1036                                  GetTracks_next:
  1037 00000886 51                      	push	ecx	
  1038 00000887 E857FDFFFF              	call	GetTrack
  1039 0000088C 59                      	pop	ecx
  1040 0000088D 83C724                  	add	edi, TrackInfo.size
  1041 00000890 E2F4                    	loop	GetTracks_next
  1042                                  
  1043 00000892 8935[FA6B0000]          	mov     [Note], esi
  1044                                  NoUpdate:
  1045 00000898 C3                      	retn
  1046                                  
  1047                                  ;--------------------------------------------------------------------------
  1048                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1049                                  ;  In:
  1050                                  ;   ds:si -  Track Info Address.
  1051                                  ;   ds:di -  Buffer Address.
  1052                                  ;    cx   -  Buffer Size.
  1053                                  ;--------------------------------------------------------------------------
  1054                                  
  1055                                  ; esi = Track info address
  1056                                  ; edi = Buffer address
  1057                                  ; ecx = Buffer size
  1058                                  
  1059                                  MixTrack:
  1060 00000899 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1061 0000089E 7748                    	ja      short MixLooped
  1062                                  MixNonLooped:   
  1063 000008A0 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1064 000008A2 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1065 000008A5 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1066 000008A9 52                      	push    edx
  1067 000008AA 56                      	push    esi
  1068 000008AB 01D3                    	add     ebx, edx
  1069 000008AD 01D5                    	add     ebp, edx
  1070 000008AF 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1071 000008B3 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1072 000008B6 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1073 000008B9 89DE                    	mov     esi, ebx
  1074 000008BB 88C7                    	mov     bh, al
  1075 000008BD 88D0                    	mov     al, dl
  1076 000008BF 88F2                    	mov     dl, dh
  1077                                  	;xor	dh, dh
  1078 000008C1 81E2FF000000            	and	edx, 0FFh
  1079                                  nlMixSamp:      
  1080 000008C7 39EE                    	cmp     esi, ebp
  1081 000008C9 7310                    	jae     short nlMixBye
  1082 000008CB 8A1E                    	mov     bl, [esi]
  1083 000008CD 678A9F[E81A]            	mov     bl, [VolTable+bx]
  1084 000008D2 001F                    	add     [edi], bl
  1085 000008D4 47                      	inc     edi
  1086 000008D5 00C4                    	add     ah, al
  1087 000008D7 11D6                    	adc     esi, edx
  1088 000008D9 E2EC                    	loop    nlMixSamp
  1089                                  nlMixBye:       
  1090 000008DB 89F3                    	mov     ebx, esi
  1091 000008DD 5E                      	pop     esi
  1092 000008DE 5A                      	pop     edx
  1093 000008DF 29D3                    	sub     ebx, edx
  1094 000008E1 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1095 000008E4 88660F                  	mov     [esi+TrackInfo.Error], ah
  1096 000008E7 C3                      	retn
  1097                                  MixLooped:
  1098 000008E8 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1099 000008EA 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1100 000008ED 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1101 000008F1 892D[F66B0000]          	mov     [BufRep], ebp
  1102 000008F7 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1103 000008FA 52                      	push    edx
  1104 000008FB 56                      	push    esi
  1105 000008FC 01D3                    	add     ebx, edx
  1106 000008FE 01D5                    	add     ebp, edx
  1107 00000900 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1108 00000904 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1109 00000907 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1110 0000090A 6689DE                  	mov     si, bx
  1111 0000090D 88C7                    	mov     bh, al
  1112 0000090F 88D0                    	mov     al, dl
  1113 00000911 88F2                    	mov     dl, dh
  1114                                  	;xor	dh, dh
  1115 00000913 81E2FF000000            	and	edx, 0FFh
  1116                                  lpMixSamp:      
  1117 00000919 39EE                    	cmp     esi, ebp
  1118 0000091B 7206                    	jb      short lpMixNow
  1119 0000091D 2B35[F66B0000]          	sub     esi, [BufRep]
  1120                                  lpMixNow:       
  1121 00000923 8A1E                    	mov     bl, [esi]
  1122 00000925 678A9F[E81A]            	mov     bl, [VolTable+bx]
  1123 0000092A 001F                    	add     [edi], bl
  1124 0000092C 47                      	inc     edi
  1125 0000092D 00C4                    	add     ah, al
  1126 0000092F 11D6                    	adc	esi, edx
  1127 00000931 E2E6                    	loop    lpMixSamp
  1128                                  lpMixBye:       
  1129                                  ;	mov     ebx, esi
  1130                                  ;	pop     esi
  1131                                  ;	pop     edx
  1132                                  ;	sub     ebx, edx
  1133                                  ;	mov     [esi+TrackInfo.Position], ebx
  1134                                  ;	mov     [esi+TrackInfo.Error], ah
  1135                                  ;	retn
  1136 00000933 EBA6                    	jmp	short nlMixBye
  1137                                  
  1138                                  ;--------------------------------------------------------------------------
  1139                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1140                                  ;  In:
  1141                                  ;    Buffer  - Buffer Address.
  1142                                  ;    Count   - Buffer Size.
  1143                                  ;--------------------------------------------------------------------------
  1144                                  
  1145                                  GetSamples:
  1146                                  	; edi = buffer address
  1147                                  	; ebx = count
  1148                                  
  1149 00000935 60                      	pushad
  1150                                  
  1151                                  	;cld
  1152                                  NextChunk:      
  1153 00000936 66833D[F46B0000]00      	cmp     word [BufLen], 0
  1154 0000093E 7548                    	jne     short CopyChunk
  1155                                  
  1156 00000940 53                      	push    ebx
  1157 00000941 57                      	push    edi
  1158                                  MixChunk:       
  1159 00000942 BF[E85B0000]            	mov	edi, MixBuffer
  1160 00000947 0FB70D[EE6B0000]        	movzx	ecx, word [BpmSamples]
  1161 0000094E 893D[F06B0000]          	mov     [BufPtr], edi
  1162 00000954 66890D[F46B0000]        	mov     [BufLen], cx
  1163                                  
  1164 0000095B B080                    	mov     al, 80h
  1165 0000095D F3AA                    	rep     stosb
  1166                                  
  1167 0000095F 66B90400                	mov	cx, NumTracks
  1168 00000963 BE[DA6B0000]            	mov	esi, Tracks - TrackInfo.size
  1169                                  GetSamples_next:
  1170 00000968 51                      	push	ecx
  1171 00000969 83C624                  	add	esi, TrackInfo.size
  1172 0000096C 668B0D[F46B0000]        	mov	cx, [BufLen]
  1173 00000973 8B3D[F06B0000]          	mov	edi, [BufPtr]
  1174 00000979 E81BFFFFFF              	call	MixTrack
  1175 0000097E 59                      	pop	ecx
  1176 0000097F E2E7                    	loop	GetSamples_next	
  1177                                  
  1178 00000981 E857FEFFFF              	call    UpdateTracks
  1179                                  
  1180 00000986 5F                      	pop     edi
  1181 00000987 5B                      	pop     ebx
  1182                                  CopyChunk:      
  1183                                  	;mov	cx, [BufLen]
  1184 00000988 0FB70D[F46B0000]        	movzx	ecx, word [BufLen]
  1185 0000098F 39D9                    	cmp	ecx, ebx
  1186                                  	;cmp	cx, bx
  1187 00000991 7602                    	jbe     short MoveChunk
  1188                                  	;mov	cx, bx
  1189 00000993 89D9                    	mov     ecx, ebx
  1190                                  MoveChunk:
  1191 00000995 8B35[F06B0000]          	mov     esi, [BufPtr]
  1192 0000099B 010D[F06B0000]          	add     [BufPtr], ecx
  1193 000009A1 66290D[F46B0000]        	sub     [BufLen], cx
  1194 000009A8 29CB                    	sub     ebx, ecx
  1195 000009AA F3A4                    	rep     movsb
  1196 000009AC 85DB                    	test    ebx, ebx
  1197 000009AE 7586                    	jnz     short NextChunk
  1198                                  
  1199 000009B0 61                      	popad
  1200 000009B1 C3                      	retn
  1201                                  
  1202                                  ;--------------------------------------------------------------------------
  1203                                  ; StartPlaying: Initializes the Sound System.
  1204                                  ;  In:
  1205                                  ;   Module Information Resources.
  1206                                  ;--------------------------------------------------------------------------
  1207                                  
  1208                                  StartPlaying:
  1209 000009B2 60                      	pushad
  1210                                  SetModParms:    
  1211 000009B3 C605[E86B0000]00        	mov     byte [OrderPos], 0
  1212 000009BA C605[E96B0000]06        	mov     byte [Tempo], DefTempo
  1213 000009C1 C605[EA6B0000]06        	mov     byte [TempoWait], DefTempo
  1214 000009C8 C605[EB6B0000]7D        	mov     byte [Bpm], DefBpm
  1215 000009CF C605[EC6B0000]40        	mov     byte [Row], 64
  1216 000009D6 C605[ED6B0000]00        	mov     byte [BreakRow], 0
  1217 000009DD 66A1[480D0000]          	mov     ax, [MixSpeed]
  1218 000009E3 31D2                    	xor     edx, edx
  1219 000009E5 66BB3200                	mov     bx, 24*DefBpm/60
  1220 000009E9 66F7F3                  	div     bx
  1221 000009EC 66A3[EE6B0000]          	mov     [BpmSamples], ax
  1222                                  ClearTracks:    
  1223 000009F2 BF[FE6B0000]            	mov     edi, Tracks
  1224 000009F7 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1225 000009FC 31C0                    	xor     eax, eax
  1226                                  	;cld
  1227 000009FE F3AA                    	rep     stosb
  1228                                  
  1229 00000A00 A3[F06B0000]            	mov     [BufPtr], eax
  1230 00000A05 66A3[F46B0000]          	mov     [BufLen], ax
  1231                                  MakePitch:
  1232 00000A0B 66B80021                	mov     ax, MidCRate
  1233 00000A0F 66BBAC01                	mov     bx, 428
  1234 00000A13 66F7E3                  	mul     bx
  1235 00000A16 66F735[480D0000]        	div     word [MixSpeed]
  1236 00000A1D 30F6                    	xor     dh, dh
  1237 00000A1F 88E2                    	mov     dl, ah
  1238 00000A21 88C4                    	mov     ah, al
  1239 00000A23 30C0                    	xor     al, al
  1240 00000A25 66B95903                	mov     cx, 857
  1241 00000A29 31DB                    	xor     ebx, ebx
  1242 00000A2B BF[36140000]            	mov     edi, PitchTable
  1243                                  PitchLoop:      
  1244 00000A30 50                      	push    eax
  1245 00000A31 52                      	push    edx
  1246 00000A32 6639DA                  	cmp     dx, bx
  1247 00000A35 7303                    	jae     short NoDiv
  1248 00000A37 66F7F3                  	div     bx
  1249                                  NoDiv:          
  1250 00000A3A 66AB                    	stosw
  1251 00000A3C 5A                      	pop     edx
  1252 00000A3D 58                      	pop     eax
  1253 00000A3E 43                      	inc     ebx
  1254 00000A3F E2EF                    	loop    PitchLoop
  1255                                  MakeVolume:     
  1256 00000A41 66B90041                	mov     cx, 16640
  1257 00000A45 89CB                    	mov     ebx, ecx
  1258                                  VolLoop:
  1259 00000A47 4B                      	dec     ebx
  1260 00000A48 88D8                    	mov     al, bl
  1261 00000A4A F6EF                    	imul    bh
  1262 00000A4C 88A3[E81A0000]          	mov     [VolTable+ebx], ah
  1263 00000A52 E2F3                    	loop    VolLoop
  1264                                  
  1265 00000A54 61                      	popad
  1266 00000A55 C3                      	retn
  1267                                  
  1268                                  ;--------------------------------------------------------------------------
  1269                                  ; StopPlaying: ShutDown the Sound System.
  1270                                  ;--------------------------------------------------------------------------
  1271                                  
  1272                                  StopPlaying:
  1273                                  	; 19/06/2017
  1274                                  	; Stop Playing
  1275                                  	sys	_audio, 0700h
  1275                              <1> 
  1275                              <1> 
  1275                              <1> 
  1275                              <1> 
  1275                              <1>  %if %0 >= 2
  1275 00000A56 BB00070000          <1>  mov ebx, %2
  1275                              <1>  %if %0 >= 3
  1275                              <1>  mov ecx, %3
  1275                              <1>  %if %0 = 4
  1275                              <1>  mov edx, %4
  1275                              <1>  %endif
  1275                              <1>  %endif
  1275                              <1>  %endif
  1275 00000A5B B820000000          <1>  mov eax, %1
  1275                              <1> 
  1275 00000A60 CD40                <1>  int 40h
  1276                                  	; Cancel callback service (for user)
  1277                                  	sys	_audio, 0900h
  1277                              <1> 
  1277                              <1> 
  1277                              <1> 
  1277                              <1> 
  1277                              <1>  %if %0 >= 2
  1277 00000A62 BB00090000          <1>  mov ebx, %2
  1277                              <1>  %if %0 >= 3
  1277                              <1>  mov ecx, %3
  1277                              <1>  %if %0 = 4
  1277                              <1>  mov edx, %4
  1277                              <1>  %endif
  1277                              <1>  %endif
  1277                              <1>  %endif
  1277 00000A67 B820000000          <1>  mov eax, %1
  1277                              <1> 
  1277 00000A6C CD40                <1>  int 40h
  1278                                  	; Deallocate Audio Buffer (for user)
  1279                                  	sys	_audio, 0A00h
  1279                              <1> 
  1279                              <1> 
  1279                              <1> 
  1279                              <1> 
  1279                              <1>  %if %0 >= 2
  1279 00000A6E BB000A0000          <1>  mov ebx, %2
  1279                              <1>  %if %0 >= 3
  1279                              <1>  mov ecx, %3
  1279                              <1>  %if %0 = 4
  1279                              <1>  mov edx, %4
  1279                              <1>  %endif
  1279                              <1>  %endif
  1279                              <1>  %endif
  1279 00000A73 B820000000          <1>  mov eax, %1
  1279                              <1> 
  1279 00000A78 CD40                <1>  int 40h
  1280                                  	; Disable Audio Device
  1281                                  	sys	_audio, 0C00h
  1281                              <1> 
  1281                              <1> 
  1281                              <1> 
  1281                              <1> 
  1281                              <1>  %if %0 >= 2
  1281 00000A7A BB000C0000          <1>  mov ebx, %2
  1281                              <1>  %if %0 >= 3
  1281                              <1>  mov ecx, %3
  1281                              <1>  %if %0 = 4
  1281                              <1>  mov edx, %4
  1281                              <1>  %endif
  1281                              <1>  %endif
  1281                              <1>  %endif
  1281 00000A7F B820000000          <1>  mov eax, %1
  1281                              <1> 
  1281 00000A84 CD40                <1>  int 40h
  1282                                  
  1283 00000A86 C3                      	retn
  1284                                  
  1285                                  ;=============================================================================
  1286                                  ; 
  1287                                  ;=============================================================================
  1288                                  
  1289                                  ;dword2str:
  1290                                  ;	; 13/11/2016 - Erdogan Tan 
  1291                                  ;	; eax = dword value
  1292                                  ;	;
  1293                                  ;	call	dwordtohex
  1294                                  ;	mov	[dword_str], edx
  1295                                  ;	mov	[dword_str+4], eax
  1296                                  ;	mov	si, dword_str
  1297                                  ;	retn
  1298                                  
  1299                                  	; 05/03/2017 (TRDOS 386)
  1300                                  	; trdos386.s (unix386.s) - 10/05/2015
  1301                                  	; Convert binary number to hexadecimal string
  1302                                  
  1303                                  ;bytetohex:
  1304                                  ;	; INPUT ->
  1305                                  ;	; 	AL = byte (binary number)
  1306                                  ;	; OUTPUT ->
  1307                                  ;	;	AX = hexadecimal string
  1308                                  ;	;
  1309                                  ;	push	ebx
  1310                                  ;	movzx	ebx, al
  1311                                  ;	shr	bl, 4
  1312                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1313                                  ;	xchg	bl, al
  1314                                  ;	and	bl, 0Fh
  1315                                  ;	mov	ah, [ebx+hex_chars] 
  1316                                  ;	pop	ebx	
  1317                                  ;	retn
  1318                                  
  1319                                  ;wordtohex:
  1320                                  ;	; INPUT ->
  1321                                  ;	; 	AX = word (binary number)
  1322                                  ;	; OUTPUT ->
  1323                                  ;	;	EAX = hexadecimal string
  1324                                  ;	;
  1325                                  ;	push	ebx
  1326                                  ;	xor	ebx, ebx
  1327                                  ;	xchg	ah, al
  1328                                  ;	push	eax
  1329                                  ;	mov	bl, ah
  1330                                  ;	shr	bl, 4
  1331                                  ;	mov	al, [ebx+hex_chars] 	 	
  1332                                  ;	mov	bl, ah
  1333                                  ;	and	bl, 0Fh
  1334                                  ;	mov	ah, [ebx+hex_chars]
  1335                                  ;	shl	eax, 16
  1336                                  ;	pop	eax
  1337                                  ;	pop	ebx
  1338                                  ;	jmp	short bytetohex
  1339                                  
  1340                                  ;dwordtohex:
  1341                                  ;	; INPUT ->
  1342                                  ;	; 	EAX = dword (binary number)
  1343                                  ;	; OUTPUT ->
  1344                                  ;	;	EDX:EAX = hexadecimal string
  1345                                  ;	;
  1346                                  ;	push	eax
  1347                                  ;	shr	eax, 16
  1348                                  ;	call	wordtohex
  1349                                  ;	mov	edx, eax
  1350                                  ;	pop	eax
  1351                                  ;	call	wordtohex
  1352                                  ;	retn
  1353                                  
  1354                                  	; 19/06/2017
  1355                                  	; 05/03/2017 (TRDOS 386)
  1356                                  	; 13/11/2016 - Erdogan Tan
  1357                                  write_audio_dev_info:
  1358                                  	; BUS/DEV/FN
  1359                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1360                                  	; DEV/VENDOR
  1361                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1362                                  
  1363 00000A87 8B35[EC0D0000]          	mov	esi, [dev_vendor]
  1364 00000A8D 6689F0                  	mov	ax, si
  1365 00000A90 0FB6D8                  	movzx	ebx, al
  1366 00000A93 88DA                    	mov	dl, bl
  1367 00000A95 80E30F                  	and	bl, 0Fh
  1368 00000A98 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1369 00000A9E A2[8F0D0000]            	mov	[msgVendorId+3], al
  1370 00000AA3 88D3                    	mov	bl, dl
  1371 00000AA5 C0EB04                  	shr	bl, 4
  1372 00000AA8 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1373 00000AAE A2[8E0D0000]            	mov	[msgVendorId+2], al
  1374 00000AB3 88E3                    	mov	bl, ah
  1375 00000AB5 88DA                    	mov	dl, bl
  1376 00000AB7 80E30F                  	and	bl, 0Fh
  1377 00000ABA 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1378 00000AC0 A2[8D0D0000]            	mov	[msgVendorId+1], al
  1379 00000AC5 88D3                    	mov	bl, dl
  1380 00000AC7 C0EB04                  	shr	bl, 4
  1381 00000ACA 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1382 00000AD0 A2[8C0D0000]            	mov	[msgVendorId], al
  1383 00000AD5 C1EE10                  	shr	esi, 16
  1384 00000AD8 6689F0                  	mov	ax, si
  1385 00000ADB 88C3                    	mov	bl, al
  1386 00000ADD 88DA                    	mov	dl, bl
  1387 00000ADF 80E30F                  	and	bl, 0Fh
  1388 00000AE2 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1389 00000AE8 A2[A00D0000]            	mov	[msgDevId+3], al
  1390 00000AED 88D3                    	mov	bl, dl
  1391 00000AEF C0EB04                  	shr	bl, 4
  1392 00000AF2 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1393 00000AF8 A2[9F0D0000]            	mov	[msgDevId+2], al
  1394 00000AFD 88E3                    	mov	bl, ah
  1395 00000AFF 88DA                    	mov	dl, bl
  1396 00000B01 80E30F                  	and	bl, 0Fh
  1397 00000B04 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1398 00000B0A A2[9E0D0000]            	mov	[msgDevId+1], al
  1399 00000B0F 88D3                    	mov	bl, dl
  1400 00000B11 C0EB04                  	shr	bl, 4
  1401 00000B14 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1402 00000B1A A2[9D0D0000]            	mov	[msgDevId], al
  1403                                  
  1404 00000B1F 8B35[F00D0000]          	mov	esi, [bus_dev_fn]
  1405 00000B25 C1EE08                  	shr	esi, 8
  1406 00000B28 6689F0                  	mov	ax, si
  1407 00000B2B 88C3                    	mov	bl, al
  1408 00000B2D 88DA                    	mov	dl, bl
  1409 00000B2F 80E307                  	and	bl, 7 ; bit 0,1,2
  1410 00000B32 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1411 00000B38 A2[C40D0000]            	mov	[msgFncNo+1], al
  1412 00000B3D 88D3                    	mov	bl, dl
  1413 00000B3F C0EB03                  	shr	bl, 3
  1414 00000B42 88DA                    	mov	dl, bl
  1415 00000B44 80E30F                  	and	bl, 0Fh
  1416 00000B47 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1417 00000B4D A2[B60D0000]            	mov	[msgDevNo+1], al
  1418 00000B52 88D3                    	mov	bl, dl
  1419 00000B54 C0EB04                  	shr	bl, 4
  1420 00000B57 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1421 00000B5D A2[B50D0000]            	mov	[msgDevNo], al
  1422 00000B62 88E3                    	mov	bl, ah
  1423 00000B64 88DA                    	mov	dl, bl
  1424 00000B66 80E30F                  	and	bl, 0Fh
  1425 00000B69 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1426 00000B6F A2[AA0D0000]            	mov	[msgBusNo+1], al
  1427 00000B74 88D3                    	mov	bl, dl
  1428 00000B76 C0EB04                  	shr	bl, 4
  1429 00000B79 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1430 00000B7F A2[A90D0000]            	mov	[msgBusNo], al
  1431                                  
  1432 00000B84 66A1[F80D0000]          	mov	ax, [ac97_io_base]
  1433 00000B8A 88C3                    	mov	bl, al
  1434 00000B8C 88DA                    	mov	dl, bl
  1435 00000B8E 80E30F                  	and	bl, 0Fh
  1436 00000B91 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1437 00000B97 A2[DD0D0000]            	mov	[msgIOBaseAddr+3], al
  1438 00000B9C 88D3                    	mov	bl, dl
  1439 00000B9E C0EB04                  	shr	bl, 4
  1440 00000BA1 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1441 00000BA7 A2[DC0D0000]            	mov	[msgIOBaseAddr+2], al
  1442 00000BAC 88E3                    	mov	bl, ah
  1443 00000BAE 88DA                    	mov	dl, bl
  1444 00000BB0 80E30F                  	and	bl, 0Fh
  1445 00000BB3 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1446 00000BB9 A2[DB0D0000]            	mov	[msgIOBaseAddr+1], al
  1447 00000BBE 88D3                    	mov	bl, dl
  1448 00000BC0 C0EB04                  	shr	bl, 4
  1449 00000BC3 8A83[4A0D0000]          	mov	al, [ebx+hex_chars]
  1450 00000BC9 A2[DA0D0000]            	mov	[msgIOBaseAddr], al
  1451                                  
  1452                                  	; 24/11/2016
  1453 00000BCE 30E4                    	xor	ah, ah
  1454 00000BD0 A0[FA0D0000]            	mov	al, [ac97_int_ln_reg]
  1455 00000BD5 B10A                    	mov	cl, 10
  1456 00000BD7 F6F1                    	div	cl
  1457 00000BD9 660105[E50D0000]        	add	[msgIRQ], ax
  1458 00000BE0 20C0                    	and	al, al
  1459 00000BE2 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1460 00000BE4 A0[E60D0000]            	mov	al, [msgIRQ+1]
  1461 00000BE9 B420                    	mov	ah, ' '
  1462 00000BEB 66A3[E50D0000]          	mov	[msgIRQ], ax
  1463                                  _w_ac97imsg_:
  1464                                  	; EBX = Message address
  1465                                  	; ECX = Max. message length (or stop on ZERO character)
  1466                                  	;	(1 to 255)
  1467                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1468                                       	sys 	_msg, msgAC97Info, 255, 07h
  1468                              <1> 
  1468                              <1> 
  1468                              <1> 
  1468                              <1> 
  1468                              <1>  %if %0 >= 2
  1468 00000BF1 BB[5B0D0000]        <1>  mov ebx, %2
  1468                              <1>  %if %0 >= 3
  1468 00000BF6 B9FF000000          <1>  mov ecx, %3
  1468                              <1>  %if %0 = 4
  1468 00000BFB BA07000000          <1>  mov edx, %4
  1468                              <1>  %endif
  1468                              <1>  %endif
  1468                              <1>  %endif
  1468 00000C00 B823000000          <1>  mov eax, %1
  1468                              <1> 
  1468 00000C05 CD40                <1>  int 40h
  1469 00000C07 C3                              retn
  1470                                  
  1471                                  ;=============================================================================
  1472                                  ;               preinitialized data
  1473                                  ;=============================================================================
  1474                                  
  1475                                  ;=============================================================================
  1476                                  ;               PLAY.ASM - DATA
  1477                                  ;=============================================================================
  1478                                  
  1479                                  msg_2017:
  1480 00000C08 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1480 00000C11 506C6179657220666F-
  1480 00000C1A 72205452444F532033-
  1480 00000C23 383620627920457264-
  1480 00000C2C 6F67616E2054616E2E-
  1480 00000C35 20                 
  1481 00000C36 4A756E652032303137-     	db	'June 2017.',10,13
  1481 00000C3F 2E0A0D             
  1482 00000C42 75736167653A20706C-     	db	'usage: playmod filename.mod', 10,13,0
  1482 00000C4B 61796D6F642066696C-
  1482 00000C54 656E616D652E6D6F64-
  1482 00000C5D 0A0D00             
  1483 00000C60 32332F30362F323031-     	db	'23/06/2017',10,13,0
  1483 00000C69 370A0D00           
  1484                                  
  1485 00000C6D 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1485 00000C76 506C61796572207630-
  1485 00000C7F 2E3162206279204361-
  1485 00000C88 726C6F732048617361-
  1485 00000C91 6E2E204A756C792031-
  1485 00000C9A 3939332E           
  1486 00000C9E 0A0D00                  		db	10,13,0
  1487 00000CA1 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1487 00000CAA 64696E67204D6F6475-
  1487 00000CB3 6C652066696C652E0A-
  1487 00000CBC 0D00               
  1488                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1489                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1490                                  ;PortText:	db	'x0h, IRQ '
  1491                                  ;IrqText:	db	'x.',10,13,0
  1492                                  
  1493                                  trdos386_err_msg:
  1494 00000CBE 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1494 00000CC7 2053797374656D2063-
  1494 00000CD0 616C6C206572726F72-
  1494 00000CD9 20210A0D00         
  1495                                  
  1496                                  ;=============================================================================
  1497                                  ;               MODPLAY.ASM - DATA
  1498                                  ;=============================================================================
  1499                                  
  1500                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1501                                  
  1502 00000CDE 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1502 00000CE7 C5D4E1             
  1503 00000CEA ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1503 00000CF3 E1                 
  1504 00000CF4 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1504 00000CFD 19                 
  1505                                  
  1506 00000CFE 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1506 00000D07 0280025C023A021A02-
  1506 00000D10 FC01E001C501       
  1507 00000D16 AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1507 00000D1F 0140012E011D010D01-
  1507 00000D28 FE00F000E200       
  1508 00000D2E D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1508 00000D37 00A00097008F008700-
  1508 00000D40 7F0078007100       
  1509                                  
  1510                                  ;=============================================================================
  1511                                  ;               PLAYER.ASM - DATA
  1512                                  ;=============================================================================
  1513                                  
  1514 00000D46 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1515 00000D47 08                      bps:		db 8 ; bits per sample (8 or 16)
  1516                                  Sample_Rate:
  1517 00000D48 2256                    MixSpeed:	dw 22050 ; Hz
  1518                                  
  1519                                  ; 13/11/2016
  1520 00000D4A 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1520 00000D53 3941424344454600   
  1521                                  msgAC97Info:	
  1522 00000D5B 0D0A                    		db 0Dh, 0Ah
  1523 00000D5D 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1523 00000D66 6F20436F6E74726F6C-
  1523 00000D6F 6C6572202620436F64-
  1523 00000D78 656320496E666F0D0A 
  1524 00000D81 56656E646F72204944-     		db "Vendor ID: "
  1524 00000D8A 3A20               
  1525 00000D8C 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1525 00000D95 6963652049443A20   
  1526 00000D9D 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1527 00000DA4 4275733A20              		db "Bus: "
  1528 00000DA9 303068204465766963-     msgBusNo:	db "00h Device: "
  1528 00000DB2 653A20             
  1529 00000DB5 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1529 00000DBE 696F6E3A20         
  1530 00000DC3 303068                  msgFncNo:	db "00h"
  1531 00000DC6 0D0A                    		db 0Dh, 0Ah
  1532 00000DC8 492F4F204261736520-     		db "I/O Base Address: "
  1532 00000DD1 416464726573733A20 
  1533 00000DDA 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1533 00000DE3 3A20               
  1534 00000DE5 3030                    msgIRQ:		dw 3030h
  1535 00000DE7 0D0A00                  		db 0Dh, 0Ah, 0
  1536                                  ;msgSampleRate:	db "Sample Rate: "
  1537                                  ;msgHertz:	db "00000 Hz ", 0
  1538                                  ;msg8Bits:	db "8 bits ", 0
  1539                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1540                                  ;msg16Bits:	db "16 bits ", "$" 
  1541                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1542                                  
  1543                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1544                                  ;codec_id:	   dd 0
  1545                                  ;codec_chip_id:	   dd 0
  1546                                  ;codec_vendor_ids: dw 0
  1547                                  ;codec_chip_ids:   dw 0
  1548                                  
  1549                                  ;dword_str:	dd 30303030h, 30303030h
  1550                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1551                                  
  1552                                  ;=============================================================================
  1553                                  ;        	uninitialized data
  1554                                  ;=============================================================================
  1555                                  
  1556                                  bss_start:
  1557                                  
  1558                                  ABSOLUTE bss_start
  1559                                  
  1560 00000DEA <res 00000002>          alignb 4
  1561                                  
  1562 00000DEC <res 00000004>          dev_vendor:	resd 1
  1563 00000DF0 <res 00000004>          bus_dev_fn:	resd 1
  1564 00000DF4 <res 00000004>          stats_cmd:	resd 1
  1565 00000DF8 <res 00000002>          ac97_io_base:	resw 1
  1566 00000DFA <res 00000001>          ac97_int_ln_reg: resb 1
  1567 00000DFB <res 00000001>          srb:		resb 1
  1568                                  
  1569                                  ; MODLOAD.ASM
  1570 00000DFC <res 00000002>          FileHandle:	resw 1
  1571 00000DFE <res 00000002>          ErrorInfo:	resw 1
  1572 00000E00 <res 0000043C>          Header:	resb	ModHeader.size
  1573                                  
  1574                                  ; MODPLAY.ASM
  1575                                  ;MixSpeed:	    resw 1
  1576                                  
  1577                                  ModInfo:
  1578 0000123C <res 00000001>          ModInfo.OrderLen:   resb 1
  1579 0000123D <res 00000001>          ModInfo.ReStart:    resb 1
  1580 0000123E <res 00000080>          ModInfo.Order:	    resb 128
  1581 000012BE <res 00000004>          ModInfo.Patterns:   resd 1
  1582                                  
  1583 000012C2 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1584 00001300 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1585 0000133E <res 0000003E>          ModInfo.SampLen:    resw 31
  1586 0000137C <res 0000003E>          ModInfo.SampRep:    resw 31
  1587 000013BA <res 0000003E>          ModInfo.SampRepLen: resw 31
  1588 000013F8 <res 0000003E>          ModInfo.SampVol:    resw 31
  1589                                  
  1590                                  ; MODPLAY.ASM
  1591 00001436 <res 000006B2>          PitchTable:	resw 857
  1592 00001AE8 <res 00004100>          VolTable:	resb 16640
  1593 00005BE8 <res 00001000>          MixBuffer       resb MixBufSize
  1594                                  
  1595                                  ; MODPLAY.ASM
  1596 00006BE8 <res 00000001>          OrderPos:	resb 1
  1597 00006BE9 <res 00000001>          Tempo:		resb 1
  1598 00006BEA <res 00000001>          TempoWait:	resb 1
  1599 00006BEB <res 00000001>          Bpm:		resb 1
  1600 00006BEC <res 00000001>          Row:		resb 1
  1601 00006BED <res 00000001>          BreakRow:	resb 1
  1602 00006BEE <res 00000002>          BpmSamples:	resw 1
  1603 00006BF0 <res 00000004>          BufPtr:		resd 1
  1604 00006BF4 <res 00000002>          BufLen:		resw 1
  1605 00006BF6 <res 00000004>          BufRep:		resd 1
  1606 00006BFA <res 00000004>          Note:		resd 1
  1607 00006BFE <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1608                                  
  1609 00006C8E <res 00000002>          alignb 16
  1610                                  
  1611                                  ; PLAY.ASM
  1612 00006C90 <res 00000280>          Scope:		resw 320
  1613 00006F10 <res 00000200>          RowOfs:		resw 256
  1614                                  
  1615                                  mod_file_name:
  1616 00007110 <res 00000050>          		resb 80
  1617                                  
  1618 00007160 <res 00000EA0>          alignb 4096
  1619                                  
  1620                                  Audio_Buffer:
  1621 00008000 <res 00008000>          		resb 32768
  1622                                  
  1623                                  g_buff:
  1624 00010000 <res 00000140>          		resb 320
  1625 00010140 <res 000000C0>          		resb 192			
  1626                                  
  1627 00010200 <res 0000FE00>          alignb 65536
  1628                                  
  1629                                  file_buffer:
  1630 00020000 <res 00070000>          		resb 65536*7
  1631                                  EOF:
