     1                                  ; ****************************************************************************
     2                                  ; playmod.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PLAYMOD.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 05/03/2017
     7                                  ;
     8                                  ; [ Last Modification: 08/10/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 by using the source code of 'tinyplay.s' ('TINYPLAY.PRG') 
    14                                  ; by Erdogan Tan (07/10/2017)
    15                                  ;
    16                                  ; Modified from 'wavplay2.s' (11/06/2017)
    17                                  ;
    18                                  ; Modified from 'TINYPLAY.PRG' ('tinyplay.s') source code by Erdogan Tan
    19                                  ;			                     (05/03/2017)
    20                                  ;
    21                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    22                                  ;				      (04/03/2017) 
    23                                  ; Assembler: NASM 2.11
    24                                  ; ----------------------------------------------------------------------------
    25                                  ;	   nasm  playmod.s -l playmod.txt -o PLAYMOD.PRG	
    26                                  ; ****************************************************************************
    27                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    28                                  ; TMODYPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    29                                  
    30                                  ; 01/03/2017
    31                                  ; 16/10/2016
    32                                  ; 29/04/2016
    33                                  ; TRDOS 386 system calls (temporary list!)
    34                                  _ver 	equ 0
    35                                  _exit 	equ 1
    36                                  _fork 	equ 2
    37                                  _read 	equ 3
    38                                  _write	equ 4
    39                                  _open	equ 5
    40                                  _close 	equ 6
    41                                  _wait 	equ 7
    42                                  _creat 	equ 8
    43                                  _link 	equ 9
    44                                  _unlink	equ 10
    45                                  _exec	equ 11
    46                                  _chdir	equ 12
    47                                  _time 	equ 13
    48                                  _mkdir 	equ 14
    49                                  _chmod	equ 15
    50                                  _chown	equ 16
    51                                  _break	equ 17
    52                                  _stat	equ 18
    53                                  _seek	equ 19
    54                                  _tell 	equ 20
    55                                  _mount	equ 21
    56                                  _umount	equ 22
    57                                  _setuid	equ 23
    58                                  _getuid	equ 24
    59                                  _stime	equ 25
    60                                  _quit	equ 26	
    61                                  _intr	equ 27
    62                                  _fstat	equ 28
    63                                  _emt 	equ 29
    64                                  _mdate 	equ 30
    65                                  _video 	equ 31
    66                                  _audio	equ 32
    67                                  _timer	equ 33
    68                                  _sleep	equ 34
    69                                  _msg    equ 35
    70                                  _geterr	equ 36
    71                                  _fpsave	equ 37
    72                                  _pri	equ 38
    73                                  _rele	equ 39
    74                                  _fff	equ 40
    75                                  _fnf	equ 41
    76                                  _alloc	equ 42
    77                                  _dalloc equ 43
    78                                  _calbac equ 44		
    79                                  
    80                                  %macro sys 1-4
    81                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    82                                      ; 03/09/2015	
    83                                      ; 13/04/2015
    84                                      ; Retro UNIX 386 v1 system call.	
    85                                      %if %0 >= 2   
    86                                          mov ebx, %2
    87                                          %if %0 >= 3    
    88                                              mov ecx, %3
    89                                              %if %0 = 4
    90                                                 mov edx, %4   
    91                                              %endif
    92                                          %endif
    93                                      %endif
    94                                      mov eax, %1
    95                                      ;int 30h
    96                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    97                                  %endmacro
    98                                  
    99                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   100                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   101                                  
   102                                  ; 19/06/2017
   103                                  BUFFERSIZE equ 32768
   104                                  
   105                                  ; ----------------------------------------------------------------------------
   106                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   107                                  ;	July 14th, 1993.
   108                                  
   109                                  ;=============================================================================
   110                                  ;  
   111                                  ;=============================================================================
   112                                  
   113                                  [BITS 32]
   114                                  [org 0]
   115                                  
   116                                  Start:
   117                                  	; clear bss
   118 00000000 B9[00000900]            	mov	ecx, EOF
   119 00000005 BF[B70D0000]            	mov	edi, bss_start
   120 0000000A 29F9                    	sub	ecx, edi
   121 0000000C D1E9                    	shr	ecx, 1
   122 0000000E 31C0                    	xor	eax, eax
   123 00000010 F366AB                  	rep	stosw
   124                                  
   125                                  	; Detect (& Enable) VT8233 Audio Device
   126 00000013 E8CF010000              	call    DetectVT8233
   127 00000018 731B                    	jnc     short GetFileName
   128                                  
   129                                  _dev_not_ready:
   130                                  ; couldn't find the audio device!
   131                                  	sys	_msg, noDevMsg, 255, 0Fh
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1> 
   131                              <1>  %if %0 >= 2
   131 0000001A BB[F4010000]        <1>  mov ebx, %2
   131                              <1>  %if %0 >= 3
   131 0000001F B9FF000000          <1>  mov ecx, %3
   131                              <1>  %if %0 = 4
   131 00000024 BA0F000000          <1>  mov edx, %4
   131                              <1>  %endif
   131                              <1>  %endif
   131                              <1>  %endif
   131 00000029 B823000000          <1>  mov eax, %1
   131                              <1> 
   131 0000002E CD40                <1>  int 40h
   132 00000030 E991010000                      jmp     Exit
   133                                  
   134                                  GetFileName:  
   135 00000035 89E6                    	mov	esi, esp
   136 00000037 AD                      	lodsd
   137 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   138                                  		; (program file name & mod file name)
   139 0000003B 0F828E010000            	jb	pmsg_2017 ; nothing to do
   140                                  
   141 00000041 AD                      	lodsd ; program file name address 
   142 00000042 AD                      	lodsd ; mod file name address (file to be read)
   143 00000043 89C6                    	mov	esi, eax
   144 00000045 BF[E0700000]            	mov	edi, mod_file_name
   145                                  ScanName:       
   146 0000004A AC                      	lodsb
   147 0000004B 84C0                    	test	al, al
   148 0000004D 0F847C010000            	je	pmsg_2017
   149 00000053 3C20                    	cmp	al, 20h
   150 00000055 74F3                    	je	short ScanName	; scan start of name.
   151 00000057 AA                      	stosb
   152 00000058 B4FF                    	mov	ah, 0FFh
   153                                  a_0:	
   154 0000005A FEC4                    	inc	ah
   155                                  a_1:
   156 0000005C AC                      	lodsb
   157 0000005D AA                      	stosb
   158 0000005E 3C2E                    	cmp	al, '.'
   159 00000060 74F8                    	je	short a_0	
   160 00000062 20C0                    	and	al, al
   161 00000064 75F6                    	jnz	short a_1
   162                                  
   163 00000066 08E4                    	or	ah, ah		; if period NOT found,
   164 00000068 750B                    	jnz	short PrintMesg	; then add a .MOD extension.
   165                                  SetExt:
   166 0000006A 4F                      	dec	edi
   167 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   168 00000071 C6470400                	mov	byte [edi+4], 0
   169                                  PrintMesg:      
   170                                  	; Prints the Credits Text.
   171                                  	sys	_msg, Credits, 255, 0Fh
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1> 
   171                              <1>  %if %0 >= 2
   171 00000075 BB[3A0C0000]        <1>  mov ebx, %2
   171                              <1>  %if %0 >= 3
   171 0000007A B9FF000000          <1>  mov ecx, %3
   171                              <1>  %if %0 = 4
   171 0000007F BA0F000000          <1>  mov edx, %4
   171                              <1>  %endif
   171                              <1>  %endif
   171                              <1>  %endif
   171 00000084 B823000000          <1>  mov eax, %1
   171                              <1> 
   171 00000089 CD40                <1>  int 40h
   172                                  _1:
   173                                  	; 19/06/2017
   174                                  	; Allocate Audio Buffer (for user)
   175                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1> 
   175                              <1>  %if %0 >= 2
   175 0000008B BB00020000          <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   175 00000090 B900800000          <1>  mov ecx, %3
   175                              <1>  %if %0 = 4
   175 00000095 BA[00800000]        <1>  mov edx, %4
   175                              <1>  %endif
   175                              <1>  %endif
   175                              <1>  %endif
   175 0000009A B820000000          <1>  mov eax, %1
   175                              <1> 
   175 0000009F CD40                <1>  int 40h
   176 000000A1 0F82F1000000            	jc	error_exit
   177                                  _2:
   178                                  	; Initialize Audio Device
   179                                  	sys	_audio, 0301h, 0, ac97_int_handler 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1> 
   179                              <1>  %if %0 >= 2
   179 000000A7 BB01030000          <1>  mov ebx, %2
   179                              <1>  %if %0 >= 3
   179 000000AC B900000000          <1>  mov ecx, %3
   179                              <1>  %if %0 = 4
   179 000000B1 BA[2B020000]        <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 0F82D5000000            	jc	error_exit
   181                                  
   182                                  LoadMod:  
   183 000000C3 BF[E0700000]            	mov	edi, mod_file_name
   184 000000C8 E8FF010000              	call    LoadModule		; Load the MODule...
   185                                  	; 08/10/2017
   186 000000CD 731B                    	jnc	short _3		; any error loading?
   187                                  
   188                                  	; yes, print error and Exit.
   189                                  
   190                                  	sys	_msg, ErrorMesg, 255, 0Fh
   190                              <1> 
   190                              <1> 
   190                              <1> 
   190                              <1> 
   190                              <1>  %if %0 >= 2
   190 000000CF BB[6E0C0000]        <1>  mov ebx, %2
   190                              <1>  %if %0 >= 3
   190 000000D4 B9FF000000          <1>  mov ecx, %3
   190                              <1>  %if %0 = 4
   190 000000D9 BA0F000000          <1>  mov edx, %4
   190                              <1>  %endif
   190                              <1>  %endif
   190                              <1>  %endif
   190 000000DE B823000000          <1>  mov eax, %1
   190                              <1> 
   190 000000E3 CD40                <1>  int 40h
   191                                  
   192 000000E5 E9DC000000              	jmp     Exit
   193                                  
   194                                  _3:
   195                                  	; 10/06/2017
   196                                  	sys	_audio, 0E00h ; get audio controller info
   196                              <1> 
   196                              <1> 
   196                              <1> 
   196                              <1> 
   196                              <1>  %if %0 >= 2
   196 000000EA BB000E0000          <1>  mov ebx, %2
   196                              <1>  %if %0 >= 3
   196                              <1>  mov ecx, %3
   196                              <1>  %if %0 = 4
   196                              <1>  mov edx, %4
   196                              <1>  %endif
   196                              <1>  %endif
   196                              <1>  %endif
   196 000000EF B820000000          <1>  mov eax, %1
   196                              <1> 
   196 000000F4 CD40                <1>  int 40h
   197 000000F6 0F829C000000            	jc	error_exit
   198                                  
   199                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   200                                  	;jne	_dev_not_ready	
   201                                  
   202                                  	; EAX = IRQ Number in AL
   203                                  	;	Audio Device Number in AH 
   204                                  	; EBX = DEV/VENDOR ID
   205                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   206                                  	; ECX = BUS/DEV/FN 
   207                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   208                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   209                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   210                                  	;      (Low word, DX = NAMBAR address)
   211                                  
   212 000000FC A2[C60D0000]            	mov	[ac97_int_ln_reg], al
   213 00000101 891D[B80D0000]          	mov	[dev_vendor], ebx
   214 00000107 890D[BC0D0000]          	mov	[bus_dev_fn], ecx
   215 0000010D 668915[C40D0000]        	mov	[ac97_io_base], dx
   216                                    
   217 00000114 E838090000              	call	write_audio_dev_info 
   218                                  
   219                                  PlayNow: 
   220 00000119 E85E080000              	call    StartPlaying
   221                                  
   222                                         ; load 32768 bytes into audio buffer
   223 0000011E BF[00800000]            	mov     edi, Audio_Buffer
   224 00000123 BB00800000              	mov	ebx, BUFFERSIZE
   225 00000128 E8D2070000              	call	GetSamples
   226 0000012D 7269                    	jc	error_exit
   227                                  
   228                                  	;mov	ecx, 128	; Make a lookup table
   229 0000012F B180                    	mov	cl, 128
   230 00000131 31DB                    	xor     ebx, ebx	; for fastest pixel
   231 00000133 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   232                                  MakeOfs:        
   233 00000138 668993[E06E0000]        	mov     [RowOfs+ebx], dx
   234 0000013F 668993[E26E0000]        	mov     [RowOfs+ebx+2], dx
   235 00000146 6681C24001              	add     dx, 320
   236 0000014B 83C304                  	add     ebx, 4
   237 0000014E E2E8                    	loop    MakeOfs
   238                                  
   239                                  	; Set Master Volume Level
   240                                  	sys	_audio, 0B00h, 1D1Dh
   240                              <1> 
   240                              <1> 
   240                              <1> 
   240                              <1> 
   240                              <1>  %if %0 >= 2
   240 00000150 BB000B0000          <1>  mov ebx, %2
   240                              <1>  %if %0 >= 3
   240 00000155 B91D1D0000          <1>  mov ecx, %3
   240                              <1>  %if %0 = 4
   240                              <1>  mov edx, %4
   240                              <1>  %endif
   240                              <1>  %endif
   240                              <1>  %endif
   240 0000015A B820000000          <1>  mov eax, %1
   240                              <1> 
   240 0000015F CD40                <1>  int 40h
   241                                  
   242                                  	;mov     word [MixSpeed], 22050	; Mixing at 22.050 kHz
   243                                  	
   244                                  	; Start	to play
   245 00000161 A0[140D0000]            	mov	al, [bps]
   246 00000166 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   247 00000169 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   248 0000016B 8A1D[130D0000]          	mov	bl, [stmo]
   249 00000171 FECB                    	dec	bl
   250 00000173 08C3                    	or	bl, al
   251 00000175 668B0D[150D0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   252 0000017C B704                    	mov	bh, 4 ; start to play	
   253                                  	sys	_audio
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1>  %if %0 >= 2
   253                              <1>  mov ebx, %2
   253                              <1>  %if %0 >= 3
   253                              <1>  mov ecx, %3
   253                              <1>  %if %0 = 4
   253                              <1>  mov edx, %4
   253                              <1>  %endif
   253                              <1>  %endif
   253                              <1>  %endif
   253 0000017E B820000000          <1>  mov eax, %1
   253                              <1> 
   253 00000183 CD40                <1>  int 40h
   254                                      
   255                                  	;; SETUP SIGNAL RESPONSE BYTE
   256                                  	;; 06/03/2017
   257                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   258                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   259                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   260                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   261                                  	;sys	_calbac
   262                                  	;jc	short error_exit
   263                                  
   264                                  	; DIRECT VGA MEMORY ACCESS
   265                                  	; bl = 0, bh = 5
   266                                  	; Direct access/map to VGA memory (0A0000h)
   267                                  
   268                                  	sys	_video, 0500h
   268                              <1> 
   268                              <1> 
   268                              <1> 
   268                              <1> 
   268                              <1>  %if %0 >= 2
   268 00000185 BB00050000          <1>  mov ebx, %2
   268                              <1>  %if %0 >= 3
   268                              <1>  mov ecx, %3
   268                              <1>  %if %0 = 4
   268                              <1>  mov edx, %4
   268                              <1>  %endif
   268                              <1>  %endif
   268                              <1>  %endif
   268 0000018A B81F000000          <1>  mov eax, %1
   268                              <1> 
   268 0000018F CD40                <1>  int 40h
   269 00000191 3D00000A00              	cmp	eax, 0A0000h
   270 00000196 7418                    	je	short _a3
   271                                  error_exit:
   272                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   272                              <1> 
   272                              <1> 
   272                              <1> 
   272                              <1> 
   272                              <1>  %if %0 >= 2
   272 00000198 BB[8B0C0000]        <1>  mov ebx, %2
   272                              <1>  %if %0 >= 3
   272 0000019D B9FF000000          <1>  mov ecx, %3
   272                              <1>  %if %0 = 4
   272 000001A2 BA0E000000          <1>  mov edx, %4
   272                              <1>  %endif
   272                              <1>  %endif
   272                              <1>  %endif
   272 000001A7 B823000000          <1>  mov eax, %1
   272                              <1> 
   272 000001AC CD40                <1>  int 40h
   273 000001AE EB16                    	jmp	short Exit
   274                                  
   275                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   276                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   277                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   278                                  ;       second, or the module will sound "looped".
   279                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   280                                  ;       the polling is called from my routine, and then the irq 0 must be
   281                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   282                                  ;       samples played by the Sound Blaster. Note that some samples are
   283                                  ;       discarded in the next code, just for fun!
   284                                  
   285                                  _a3:
   286 000001B0 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   287 000001B4 CD31                    	int     31h
   288                                  
   289 000001B6 E885000000              	call	ModPlay ; 13/02/2017
   290                                  
   291                                  _s_exit:
   292 000001BB E860080000              	call	StopPlaying	; STOP!
   293                                  
   294 000001C0 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   295 000001C4 CD31                    	int     31h
   296                                  Exit:           
   297                                  	;call    FreeModule	; Free MODule core.
   298                                  	
   299                                  	sys 	_exit	; Bye !
   299                              <1> 
   299                              <1> 
   299                              <1> 
   299                              <1> 
   299                              <1>  %if %0 >= 2
   299                              <1>  mov ebx, %2
   299                              <1>  %if %0 >= 3
   299                              <1>  mov ecx, %3
   299                              <1>  %if %0 = 4
   299                              <1>  mov edx, %4
   299                              <1>  %endif
   299                              <1>  %endif
   299                              <1>  %endif
   299 000001C6 B801000000          <1>  mov eax, %1
   299                              <1> 
   299 000001CB CD40                <1>  int 40h
   300                                  here:
   301 000001CD EBFE                    	jmp	short here
   302                                  
   303                                  pmsg_2017:
   304                                  	sys	_msg, msg_2017, 255, 0Fh
   304                              <1> 
   304                              <1> 
   304                              <1> 
   304                              <1> 
   304                              <1>  %if %0 >= 2
   304 000001CF BB[D20B0000]        <1>  mov ebx, %2
   304                              <1>  %if %0 >= 3
   304 000001D4 B9FF000000          <1>  mov ecx, %3
   304                              <1>  %if %0 = 4
   304 000001D9 BA0F000000          <1>  mov edx, %4
   304                              <1>  %endif
   304                              <1>  %endif
   304                              <1>  %endif
   304 000001DE B823000000          <1>  mov eax, %1
   304                              <1> 
   304 000001E3 CD40                <1>  int 40h
   305 000001E5 EBDF                    	jmp	short Exit
   306                                  
   307                                  DetectVT8233:
   308                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   309                                          sys	_audio, 0103h
   309                              <1> 
   309                              <1> 
   309                              <1> 
   309                              <1> 
   309                              <1>  %if %0 >= 2
   309 000001E7 BB03010000          <1>  mov ebx, %2
   309                              <1>  %if %0 >= 3
   309                              <1>  mov ecx, %3
   309                              <1>  %if %0 = 4
   309                              <1>  mov edx, %4
   309                              <1>  %endif
   309                              <1>  %endif
   309                              <1>  %endif
   309 000001EC B820000000          <1>  mov eax, %1
   309                              <1> 
   309 000001F1 CD40                <1>  int 40h
   310 000001F3 C3                      	retn
   311                                  
   312                                  noDevMsg:
   313 000001F4 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   313 000001FD 61626C6520746F2066-
   313 00000206 696E64205649412056-
   313 0000020F 543832333320626173-
   313 00000218 656420617564696F20-
   313 00000221 646576696365210D0A-
   313 0000022A 00                 
   314                                  
   315                                  ac97_int_handler:
   316                                  	; 19/06/2017
   317 0000022B C605[C70D0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   318                                  
   319                                  	sys	_rele ; return from callback service 
   319                              <1> 
   319                              <1> 
   319                              <1> 
   319                              <1> 
   319                              <1>  %if %0 >= 2
   319                              <1>  mov ebx, %2
   319                              <1>  %if %0 >= 3
   319                              <1>  mov ecx, %3
   319                              <1>  %if %0 = 4
   319                              <1>  mov edx, %4
   319                              <1>  %endif
   319                              <1>  %endif
   319                              <1>  %endif
   319 00000232 B827000000          <1>  mov eax, %1
   319                              <1> 
   319 00000237 CD40                <1>  int 40h
   320                                  	; we must not come here !
   321                                  	sys	_exit
   321                              <1> 
   321                              <1> 
   321                              <1> 
   321                              <1> 
   321                              <1>  %if %0 >= 2
   321                              <1>  mov ebx, %2
   321                              <1>  %if %0 >= 3
   321                              <1>  mov ecx, %3
   321                              <1>  %if %0 = 4
   321                              <1>  mov edx, %4
   321                              <1>  %endif
   321                              <1>  %endif
   321                              <1>  %endif
   321 00000239 B801000000          <1>  mov eax, %1
   321                              <1> 
   321 0000023E CD40                <1>  int 40h
   322                                  
   323                                  ;=============================================================================
   324                                  ;      
   325                                  ;=============================================================================
   326                                  
   327                                  ModPlay:
   328                                  	; 23/06/2017   
   329                                  	; 21/06/2017
   330                                  	; 19/06/2017
   331                                  
   332                                  	; 05/03/2017 (TRDOS 386)
   333                                  	; 14/02/2017
   334                                  	; 13/02/2017
   335                                  	; 08/12/2016
   336                                  	; 28/11/2016
   337                                  
   338 00000240 EB10                         	jmp	short modp_gs ; 23/06/2017
   339                                  p_loop:
   340 00000242 803D[C70D0000]00        	cmp	byte [srb], 0
   341 00000249 7616                    	jna	short q_loop
   342 0000024B C605[C70D0000]00        	mov	byte [srb], 0
   343                                  modp_gs:
   344 00000252 BF[00800000]            	mov     edi, Audio_Buffer
   345 00000257 BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   346 0000025C E89E060000              	call    GetSamples
   347                                  q_loop:
   348 00000261 B401                    	mov     ah, 1		; any key pressed?
   349 00000263 CD32                    	int     32h		; no, Loop.
   350 00000265 7405                    	jz	short r_loop
   351                                  
   352 00000267 B400                    	mov     ah, 0		; flush key buffer...
   353 00000269 CD32                    	int     32h
   354                                  q_return:
   355 0000026B C3                      	retn
   356                                  r_loop:
   357                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   358                                  	; 23/06/2017
   359                                  	; 22/06/2017
   360                                  	; bh = 15, get current sound data/samples
   361                                  	; bl = 0, for PCM OUT
   362                                  	; ecx = count of sample/data bytes (1 to 4096)
   363                                  	; edx = destination buffer address 
   364                                  	;	(page aligned address is better)
   365                                  	;
   366                                  	sys	_audio, 0F00h, 320, g_buff
   366                              <1> 
   366                              <1> 
   366                              <1> 
   366                              <1> 
   366                              <1>  %if %0 >= 2
   366 0000026C BB000F0000          <1>  mov ebx, %2
   366                              <1>  %if %0 >= 3
   366 00000271 B940010000          <1>  mov ecx, %3
   366                              <1>  %if %0 = 4
   366 00000276 BA[00000100]        <1>  mov edx, %4
   366                              <1>  %endif
   366                              <1>  %endif
   366                              <1>  %endif
   366 0000027B B820000000          <1>  mov eax, %1
   366                              <1> 
   366 00000280 CD40                <1>  int 40h
   367                                  ScopeLoop:
   368 00000282 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   369                                  	; 19/06/2017
   370 00000287 BE[00000100]            	mov     esi, g_buff	; display current samples
   371 0000028C 31C9                    	xor     ecx, ecx	; to be drawed ...
   372 0000028E 31D2                    	xor     edx, edx
   373                                  DrawLoop:       
   374 00000290 89D3                    	mov     ebx, edx	; (save Index)
   375 00000292 668BBB[606C0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   376 00000299 C60700                  	mov     byte [edi], 0	; erase it!
   377                                  	;lodsb
   378                                  	;mov	bl, al
   379 0000029C 8A1E                    	mov	bl, [esi]	; get a sample (8-bit)
   380 0000029E 46                      	inc	esi		; calc new pixel address...
   381 0000029F 30FF                    	xor     bh, bh
   382 000002A1 66D1E3                  	shl     bx, 1
   383 000002A4 668BBB[E06E0000]        	mov     di, [RowOfs+ebx]
   384 000002AB 6601CF                  	add     di, cx
   385 000002AE 6689D3                  	mov     bx, dx		; (restore Index)
   386 000002B1 6689BB[606C0000]        	mov     [Scope+ebx], di	; save new address...
   387 000002B8 C6070A                  	mov     byte [edi], 10	; and DRAW.
   388 000002BB 6683C202                	add     dx, 2		; the next pixel...
   389 000002BF 41                      	inc     ecx
   390 000002C0 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   391 000002C5 72C9                    	jb      short DrawLoop
   392 000002C7 E976FFFFFF              	jmp	p_loop
   393                                  
   394                                  
   395                                  ;=============================================================================
   396                                  ;               MODLOAD.ASM
   397                                  ;=============================================================================
   398                                  
   399                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   400                                  ;	July 10th, 1993.
   401                                  
   402                                  ; STRUCTURES
   403                                  
   404                                  struc ModSample
   405 00000000 <res 00000016>          .msName:	resb 22
   406 00000016 <res 00000002>          .msLength:	resw 1
   407 00000018 <res 00000001>          .msFinetune:	resb 1
   408 00000019 <res 00000001>          .msVolume:	resb 1
   409 0000001A <res 00000002>          .msRepeat:	resw 1
   410 0000001C <res 00000002>          .msRepLen:	resw 1
   411                                  .size:
   412                                  endstruc
   413                                  
   414                                  struc ModHeader
   415 00000000 <res 00000014>          .mhName:	resb 20
   416 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   417 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   418 000003B7 <res 00000001>          .mhReStart:	resb 1
   419 000003B8 <res 00000080>          .mhOrder:	resb 128
   420 00000438 <res 00000004>          .mhSign:	resw 2
   421                                  .size:	
   422                                  endstruc
   423                                  
   424                                  struc ModInfoRec
   425 00000000 <res 00000001>          .OrderLen:	resb 1
   426 00000001 <res 00000001>          .ReStart:	resb 1
   427 00000002 <res 00000080>          .Order:	resb 128
   428 00000082 <res 00000004>          .Patterns:	resd 1
   429 00000086 <res 0000003E>          .SampOfs:	resw 31
   430 000000C4 <res 0000003E>          .SampSeg:	resw 31
   431 00000102 <res 0000003E>          .SampLen:	resw 31
   432 00000140 <res 0000003E>          .SampRep:	resw 31
   433 0000017E <res 0000003E>          .SampRepLen:	resw 31
   434 000001BC <res 0000003E>          .SampVol:	resw 31
   435                                  .size:	
   436                                  endstruc
   437                                  
   438                                  ; CODE
   439                                  
   440                                  ; 07/10/2017 (playmod.s)
   441                                  
   442                                  LoadModule:
   443                                  	; edi = file name address
   444                                  
   445 000002CC 60                      	pushad
   446                                  	
   447                                  	;call    ClearModInfo ; 07/10/2017 (not necessary.)
   448                                  OpenFile:       
   449                                  	; ebx = ASCIIZ file name address
   450                                  	; ecx = open mode (0 = open for read)	
   451                                  	sys	_open, edi, 0 ; open for reading
   451                              <1> 
   451                              <1> 
   451                              <1> 
   451                              <1> 
   451                              <1>  %if %0 >= 2
   451 000002CD 89FB                <1>  mov ebx, %2
   451                              <1>  %if %0 >= 3
   451 000002CF B900000000          <1>  mov ecx, %3
   451                              <1>  %if %0 = 4
   451                              <1>  mov edx, %4
   451                              <1>  %endif
   451                              <1>  %endif
   451                              <1>  %endif
   451 000002D4 B805000000          <1>  mov eax, %1
   451                              <1> 
   451 000002D9 CD40                <1>  int 40h
   452 000002DB 0F8244010000            	jc	Failed
   453 000002E1 A3[C80D0000]            	mov     [FileHandle], eax
   454                                  ReadHeader:
   455                                  	; ebx = File handle
   456                                  	; ecx = Buffer address
   457                                  	; edx = Byte count
   458                                  	sys	_read, [FileHandle], Header, ModHeader.size
   458                              <1> 
   458                              <1> 
   458                              <1> 
   458                              <1> 
   458                              <1>  %if %0 >= 2
   458 000002E6 8B1D[C80D0000]      <1>  mov ebx, %2
   458                              <1>  %if %0 >= 3
   458 000002EC B9[CC0D0000]        <1>  mov ecx, %3
   458                              <1>  %if %0 = 4
   458 000002F1 BA3C040000          <1>  mov edx, %4
   458                              <1>  %endif
   458                              <1>  %endif
   458                              <1>  %endif
   458 000002F6 B803000000          <1>  mov eax, %1
   458                              <1> 
   458 000002FB CD40                <1>  int 40h
   459 000002FD 0F8213010000            	jc      CloseFile
   460                                  CheckMK:        
   461 00000303 813D[04120000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   461 0000030B 4B2E               
   462 0000030D 7412                    	je      short IsModFile
   463                                  CheckFLT4:
   464 0000030F 813D[04120000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   464 00000317 5434               
   465 00000319 7406                    	je      short IsModFile
   466                                  	; 07/10/2017
   467 0000031B F9                      	stc
   468 0000031C E9F5000000              	jmp	CloseFile
   469                                  IsModFile:
   470 00000321 A0[82110000]            	mov     al, [Header+ModHeader.mhOrderLen]
   471 00000326 A2[08120000]            	mov     [ModInfo.OrderLen], al
   472                                  
   473 0000032B A0[83110000]            	mov     al, [Header+ModHeader.mhReStart]
   474 00000330 3A05[82110000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   475 00000336 7202                    	jb      short SetReStart
   476 00000338 B07F                    	mov     al, 7Fh
   477                                  SetReStart:
   478 0000033A A2[09120000]            	mov     [ModInfo.ReStart], al
   479                                  
   480                                  	;mov	ecx, 128
   481 0000033F 66B98000                	mov	cx, 128
   482 00000343 31D2                    	xor     edx, edx
   483 00000345 31DB                    	xor     ebx, ebx
   484                                  CopyOrder:
   485 00000347 8AB3[84110000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   486 0000034D 88B3[0A120000]          	mov     [ModInfo.Order+ebx], dh
   487 00000353 38D6                    	cmp     dh, dl
   488 00000355 7202                    	jb      short NextOrder
   489 00000357 88F2                    	mov     dl, dh
   490                                  NextOrder:
   491 00000359 43                      	inc     ebx
   492 0000035A E2EB                    	loop    CopyOrder
   493                                  AllocPatterns:  
   494 0000035C 81E2FF000000            	and	edx, 0FFh
   495                                  	;inc	dx
   496 00000362 FEC2                    	inc	dl  ; 07/10/2017
   497                                  	; dl = count of 1024 bytes ; count of patterns (04/07/2017)
   498 00000364 C1E20A                  	shl	edx, 10 ; *1024 ; (count of patterns *64*16)
   499                                  
   500 00000367 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   501                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   502 00000369 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   503                                  	;
   504 0000036E 890D[8A120000]          	mov	[ModInfo.Patterns], ecx
   505                                  	;
   506 00000374 01CD                    	add	ebp, ecx ; next offset for samples
   507                                  ReadPatterns:  
   508                                  	;mov	ebx, [FileHandle] 
   509                                  	; ebx = File handle
   510                                  	; ecx = Buffer address
   511                                  	; edx = Byte count
   512                                  	sys	_read, [FileHandle]
   512                              <1> 
   512                              <1> 
   512                              <1> 
   512                              <1> 
   512                              <1>  %if %0 >= 2
   512 00000376 8B1D[C80D0000]      <1>  mov ebx, %2
   512                              <1>  %if %0 >= 3
   512                              <1>  mov ecx, %3
   512                              <1>  %if %0 = 4
   512                              <1>  mov edx, %4
   512                              <1>  %endif
   512                              <1>  %endif
   512                              <1>  %endif
   512 0000037C B803000000          <1>  mov eax, %1
   512                              <1> 
   512 00000381 CD40                <1>  int 40h
   513 00000383 0F828D000000            	jc      CloseFile
   514                                  
   515                                  	; patterns have been loaded here... (04/07/2017)
   516                                  
   517 00000389 BE[E00D0000]            	mov	esi, Header+ModHeader.mhSamples
   518 0000038E 31FF                    	xor     edi, edi
   519                                  CopySamples:
   520 00000390 668B4616                	mov     ax, [esi+ModSample.msLength]
   521 00000394 86C4                    	xchg    al, ah
   522 00000396 66D1E0                  	shl     ax, 1
   523 00000399 668987[0A130000]        	mov     [ModInfo.SampLen+edi], ax
   524 000003A0 8A4619                  	mov     al, [esi+ModSample.msVolume]
   525 000003A3 30E4                    	xor     ah, ah
   526 000003A5 668987[C4130000]        	mov     [ModInfo.SampVol+edi], ax
   527 000003AC 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   528 000003B0 86C4                    	xchg    al, ah
   529 000003B2 66D1E0                  	shl     ax, 1
   530 000003B5 668987[48130000]        	mov     [ModInfo.SampRep+edi], ax
   531 000003BC 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   532 000003C0 86C4                    	xchg    al, ah
   533 000003C2 66D1E0                  	shl     ax, 1
   534 000003C5 668987[86130000]        	mov     [ModInfo.SampRepLen+edi], ax
   535 000003CC 83C61E                  	add     esi, ModSample.size
   536 000003CF 6683C702                	add     di, 2
   537 000003D3 6683FF3E                	cmp     di, 2*31
   538 000003D7 72B7                    	jb      short CopySamples
   539                                  
   540 000003D9 31F6                    	xor     esi, esi
   541                                  AllocSamples:
   542 000003DB 0FB796[0A130000]        	movzx	edx, word [ModInfo.SampLen+esi]
   543                                  	; 07/10/2017
   544                                  	;shr	dx, 4 ; ***
   545 000003E2 21D2                    	and	edx, edx
   546 000003E4 7426                    	jz      short NextSample
   547                                  	;inc	dx  ; number of paragraphs ; ***
   548                                  	;shl	dx, 4 ; ***
   549 000003E6 89E8                    	mov	eax, ebp
   550 000003E8 668986[8E120000]        	mov	[ModInfo.SampOfs+esi], ax
   551 000003EF C1E810                  	shr	eax, 16
   552 000003F2 668986[CC120000]        	mov	[ModInfo.SampSeg+esi], ax
   553 000003F9 89E9                    	mov	ecx, ebp
   554 000003FB 01D5                    	add	ebp, edx ; next offset for sample 
   555                                  ReadSample:
   556                                  	;mov	ebx, [FileHandle]
   557                                  	;movzx  edx, [ModInfo.SampLen+esi]
   558                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   559                                  
   560                                  	; ebx = File handle
   561                                  	; ecx = Buffer address
   562                                  	; edx = Byte count
   563                                  	sys	_read, [FileHandle]
   563                              <1> 
   563                              <1> 
   563                              <1> 
   563                              <1> 
   563                              <1>  %if %0 >= 2
   563 000003FD 8B1D[C80D0000]      <1>  mov ebx, %2
   563                              <1>  %if %0 >= 3
   563                              <1>  mov ecx, %3
   563                              <1>  %if %0 = 4
   563                              <1>  mov edx, %4
   563                              <1>  %endif
   563                              <1>  %endif
   563                              <1>  %endif
   563 00000403 B803000000          <1>  mov eax, %1
   563                              <1> 
   563 00000408 CD40                <1>  int 40h
   564 0000040A 720A                    	jc      short CloseFile
   565                                  
   566                                  NextSample:
   567 0000040C 6683C602                	add     si, 2
   568 00000410 6683FE3E                	cmp     si, 2*31
   569 00000414 72C5                    	jb      short AllocSamples
   570                                  CloseFile:      
   571 00000416 9C                      	pushf
   572                                  	sys	_close, [FileHandle]
   572                              <1> 
   572                              <1> 
   572                              <1> 
   572                              <1> 
   572                              <1>  %if %0 >= 2
   572 00000417 8B1D[C80D0000]      <1>  mov ebx, %2
   572                              <1>  %if %0 >= 3
   572                              <1>  mov ecx, %3
   572                              <1>  %if %0 = 4
   572                              <1>  mov edx, %4
   572                              <1>  %endif
   572                              <1>  %endif
   572                              <1>  %endif
   572 0000041D B806000000          <1>  mov eax, %1
   572                              <1> 
   572 00000422 CD40                <1>  int 40h
   573 00000424 9D                      	popf
   574                                  Failed:         
   575 00000425 61                      	popad
   576                                  
   577 00000426 C3                      	retn
   578                                  
   579                                  FreeModule:
   580                                  	; Erdogan Tan (13/02/2017)
   581                                  	; nothing to do here for memory de-allocation
   582                                  ClearModInfo:
   583 00000427 57                      	push	edi
   584 00000428 BF[08120000]            	mov	edi, ModInfo
   585 0000042D B9FA010000              	mov     ecx, ModInfoRec.size
   586                                  	;cld
   587 00000432 30C0                    	xor     al, al
   588 00000434 F3AA                    	rep     stosb
   589 00000436 5F                      	pop	edi
   590 00000437 C3                      	retn
   591                                  
   592                                  ;=============================================================================
   593                                  ;               MODPLAY.ASM
   594                                  ;=============================================================================
   595                                  
   596                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   597                                  ;	July 23th, 1993.
   598                                  
   599                                  ; EQUATES
   600                                  
   601                                  NumTracks       equ 4
   602                                  DefTempo        equ 6
   603                                  DefBpm          equ 125
   604                                  MidCRate        equ 8448
   605                                  MixBufSize      equ 4096
   606                                  
   607                                  ; STRUCTURES
   608                                  
   609                                  struc TrackInfo
   610 00000000 <res 00000004>          .Samples:	resd 1
   611 00000004 <res 00000004>          .Position:	resd 1
   612 00000008 <res 00000002>          .Len:	resw 1
   613 0000000A <res 00000002>          .Repeat:	resw 1
   614 0000000C <res 00000002>          .RepLen:	resw 1
   615 0000000E <res 00000001>          .Volume: 	resb 1
   616 0000000F <res 00000001>          .Error:	resb 1
   617 00000010 <res 00000002>          .Period:	resw 1
   618 00000012 <res 00000002>          .Pitch:	resw 1
   619 00000014 <res 00000002>          .Effect:	resw 1
   620 00000016 <res 00000002>          .PortTo:	resw 1
   621 00000018 <res 00000001>          .PortParm:	resb 1
   622 00000019 <res 00000001>          .VibPos:	resb 1
   623 0000001A <res 00000001>          .VibParm:	resb 1
   624 0000001B <res 00000001>          .OldSampOfs:	resb 1
   625 0000001C <res 00000006>          .Arp:	resw 3
   626 00000022 <res 00000002>          .ArpIndex:	resw 1
   627                                  .size:
   628                                  endstruc
   629                                  
   630                                  ; CODE
   631                                  
   632                                  ;--------------------------------------------------------------------------
   633                                  ; BeatTrack:  Process the next beat in one track.
   634                                  ;  In:
   635                                  ;    ds:di -  Track info Address.
   636                                  ;--------------------------------------------------------------------------
   637                                  
   638                                  ; edi = Track info address
   639                                  
   640                                  BeatTrack:
   641 00000438 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   642 0000043C 6685D2                  	test    dx, dx
   643 0000043F 743C                    	je      short None
   644 00000441 80FE00                  	cmp     dh, 00h
   645 00000444 7438                    	je      short Arpeggio
   646 00000446 80FE01                  	cmp     dh, 01h
   647 00000449 7451                    	je      short PortUp
   648 0000044B 80FE02                  	cmp     dh, 02h
   649 0000044E 7471                    	je      short PortDown
   650 00000450 80FE03                  	cmp     dh, 03h
   651 00000453 0F848E000000            	je      TonePort
   652 00000459 80FE04                  	cmp     dh, 04h
   653 0000045C 0F84BD000000            	je      Vibrato
   654 00000462 80FE05                  	cmp     dh, 05h
   655 00000465 0F840E010000            	je      PortSlide
   656 0000046B 80FE06                  	cmp     dh, 06h
   657 0000046E 0F8412010000            	je      VibSlide
   658 00000474 80FE0A                  	cmp     dh, 0Ah
   659 00000477 0F8413010000            	je      VolSlide
   660                                  None:           
   661 0000047D C3                      	retn
   662                                  Arpeggio:
   663 0000047E 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   664 00000482 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   665 00000487 66894712                	mov     [edi+TrackInfo.Pitch], ax
   666 0000048B 6683C302                	add     bx, 2
   667 0000048F 6683FB06                	cmp     bx, 6
   668 00000493 7202                    	jb      short SetArpIndex
   669 00000495 31DB                    	xor     ebx, ebx
   670                                  SetArpIndex:
   671 00000497 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   672 0000049B C3                      	retn
   673                                  PortUp:
   674 0000049C 30F6                    	xor     dh, dh
   675 0000049E 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   676 000004A2 6629D3                  	sub     bx, dx
   677 000004A5 6683FB71                	cmp     bx, 113
   678 000004A9 7D04                    	jge     short NotSmall
   679 000004AB 66BB7100                	mov     bx, 113
   680                                  NotSmall:
   681 000004AF 66895F10                	mov     [edi+TrackInfo.Period], bx
   682 000004B3 6601DB                  	add     bx, bx
   683 000004B6 66678B87[0214]          	mov     ax, [PitchTable+bx]
   684 000004BC 66894712                	mov     [edi+TrackInfo.Pitch], ax
   685 000004C0 C3                      	retn
   686                                  PortDown:
   687 000004C1 30F6                    	xor     dh, dh
   688 000004C3 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   689 000004C7 6601D3                  	add     bx, dx
   690 000004CA 6681FB5803              	cmp     bx, 856
   691 000004CF 7E04                    	jle     short NotBig
   692 000004D1 66BB5803                	mov     bx, 856
   693 000004D5 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   694 000004D9 6601DB                  	add     bx, bx
   695 000004DC 66678B87[0214]          	mov     ax, [PitchTable+bx]
   696 000004E2 66894712                	mov     [edi+TrackInfo.Pitch], ax
   697 000004E6 C3                      	retn
   698                                  TonePort:
   699 000004E7 30F6                    	xor     dh, dh
   700 000004E9 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   701 000004ED 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   702 000004F1 6639C3                  	cmp     bx, ax
   703 000004F4 7428                    	je      short NoPort
   704 000004F6 7F0D                    	jg      short PortToUp
   705                                  PortToDown:     
   706 000004F8 6601D3                  	add     bx, dx
   707 000004FB 6639C3                  	cmp     bx, ax
   708 000004FE 7E0D                    	jle     short SetPort
   709                                  FixPort:        
   710 00000500 6689C3                  	mov     bx, ax
   711 00000503 EB08                    	jmp     short SetPort
   712                                  PortToUp:
   713 00000505 6629D3                  	sub     bx, dx
   714 00000508 6639C3                  	cmp     bx, ax
   715 0000050B 7CF3                    	jl      short FixPort
   716                                  SetPort:        
   717 0000050D 66895F10                	mov     [edi+TrackInfo.Period], bx
   718 00000511 6601DB                  	add     bx, bx
   719 00000514 66678B87[0214]          	mov     ax, [PitchTable+bx]
   720 0000051A 66894712                	mov     [edi+TrackInfo.Pitch], ax
   721                                  NoPort:         
   722 0000051E C3                      	retn
   723                                  Vibrato:
   724 0000051F 88D6                    	mov     dh, dl
   725 00000521 80E20F                  	and     dl, 0Fh
   726 00000524 C0EE04                  	shr     dh, 4
   727 00000527 C0E602                  	shl     dh, 2
   728 0000052A 007719                  	add     [edi+TrackInfo.VibPos], dh
   729 0000052D 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   730 00000530 88F3                    	mov     bl, dh
   731 00000532 C0EB02                  	shr     bl, 2
   732 00000535 6683E31F                	and     bx, 1Fh
   733 00000539 678A87[AB0C]            	mov     al, [SinTable+bx]
   734 0000053E F6E2                    	mul     dl
   735 00000540 66D1C0                  	rol     ax, 1
   736 00000543 86C4                    	xchg    al, ah
   737 00000545 80E401                  	and     ah, 1
   738 00000548 84F6                    	test    dh, dh
   739 0000054A 7903                    	jns     short VibUp
   740 0000054C 66F7D8                  	neg     ax
   741                                  VibUp:          
   742 0000054F 66034710                	add     ax, [edi+TrackInfo.Period]
   743 00000553 6689C3                  	mov     bx, ax
   744 00000556 6683FB71                	cmp     bx, 113
   745 0000055A 7D04                    	jge     short NoLoVib
   746 0000055C 66BB7100                	mov     bx, 113
   747                                  NoLoVib:        
   748 00000560 6681FB5803              	cmp     bx, 856
   749 00000565 7E04                    	jle     short NoHiVib
   750 00000567 66BB5803                	mov     bx, 856
   751                                  NoHiVib:        
   752 0000056B 6601DB                  	add     bx, bx
   753 0000056E 66678B87[0214]          	mov     ax, [PitchTable+bx]
   754 00000574 66894712                	mov     [edi+TrackInfo.Pitch], ax
   755 00000578 C3                      	retn
   756                                  PortSlide:
   757 00000579 E812000000              	call    VolSlide
   758 0000057E 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   759 00000581 E961FFFFFF              	jmp     TonePort
   760                                  VibSlide:
   761 00000586 E805000000              	call    VolSlide
   762 0000058B 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   763 0000058E EB8F                    	jmp     short Vibrato
   764                                  VolSlide:
   765 00000590 88D6                    	mov     dh, dl
   766 00000592 80E20F                  	and     dl, 0Fh
   767 00000595 C0EE04                  	shr     dh, 4
   768 00000598 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   769 0000059B 28D0                    	sub     al, dl
   770 0000059D 7D02                    	jge     short NoLoVol
   771 0000059F 30C0                    	xor     al, al
   772                                  NoLoVol:        
   773 000005A1 00F0                    	add     al, dh
   774 000005A3 3C40                    	cmp     al, 64
   775 000005A5 7602                    	jbe     short NoHiVol
   776 000005A7 B040                    	mov     al, 64
   777                                  NoHiVol:        
   778 000005A9 88470E                  	mov     [edi+TrackInfo.Volume], al
   779 000005AC C3                      	retn
   780                                  
   781                                  ;--------------------------------------------------------------------------
   782                                  ; GetTrack:   Get the next Note from a pattern.
   783                                  ;  In:
   784                                  ;    ds:di -  Track info Address.
   785                                  ;    es:si -  Pattern Note Address.
   786                                  ; Out:
   787                                  ;    es:si -  The Next Pattern Note address.
   788                                  ;--------------------------------------------------------------------------
   789                                  
   790                                  ; esi = Pattern note address
   791                                  ; edi = Track info address
   792                                  
   793                                  GetTrack:
   794 000005AD 66AD                    	lodsw
   795 000005AF 86C4                    	xchg    al, ah
   796 000005B1 88E3                    	mov	bl, ah
   797 000005B3 80E40F                  	and     ah, 0Fh
   798 000005B6 6689C1                  	mov     cx, ax
   799 000005B9 66AD                    	lodsw
   800 000005BB 86C4                    	xchg    al, ah
   801 000005BD 88E7                    	mov     bh, ah
   802 000005BF 80E40F                  	and     ah, 0Fh
   803 000005C2 6689C2                  	mov     dx, ax
   804 000005C5 66895714                	mov     [edi+TrackInfo.Effect], dx
   805 000005C9 80E3F0                  	and     bl, 0F0h
   806 000005CC C0EF04                  	shr     bh, 4
   807 000005CF 08FB                    	or      bl, bh
   808 000005D1 7449                    	je      short SetPeriod
   809                                  SetSample:
   810                                  	;xor    bh, bh
   811 000005D3 81E3FF000000            	and	ebx, 0FFh
   812 000005D9 4B                      	dec     ebx
   813 000005DA 01DB                    	add     ebx, ebx
   814 000005DC 668B83[C4130000]        	mov     ax, [ModInfo.SampVol+ebx]
   815 000005E3 88470E                  	mov     [edi+TrackInfo.Volume], al
   816 000005E6 668B83[8E120000]        	mov     ax, [ModInfo.SampOfs+ebx]
   817 000005ED 668907                  	mov     [edi+TrackInfo.Samples], ax
   818 000005F0 668B83[CC120000]        	mov     ax, [ModInfo.SampSeg+ebx]
   819 000005F7 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   820 000005FB 668B83[0A130000]        	mov     ax, [ModInfo.SampLen+ebx]
   821 00000602 66894708                	mov     [edi+TrackInfo.Len], ax
   822 00000606 668B83[48130000]        	mov     ax, [ModInfo.SampRep+ebx]
   823 0000060D 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   824 00000611 668B83[86130000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   825 00000618 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   826                                  SetPeriod:      
   827 0000061C 6685C9                  	test    cx, cx
   828 0000061F 7424                    	jz      short SetEffect
   829                                  
   830 00000621 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   831 00000625 80FE03                  	cmp     dh, 03h
   832 00000628 741B                    	je      short SetEffect
   833                                  
   834 0000062A 66894F10                	mov     [edi+TrackInfo.Period], cx
   835 0000062E 6689CB                  	mov     bx, cx
   836 00000631 6601DB                  	add     bx, bx
   837 00000634 66678B87[0214]          	mov     ax, [PitchTable+bx]
   838 0000063A 66894712                	mov     [edi+TrackInfo.Pitch], ax
   839 0000063E C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   840                                  SetEffect:
   841 00000645 6685D2                  	test    dx, dx
   842 00000648 7430                    	jz      short InitNone
   843 0000064A 80FE00                  	cmp     dh, 00h
   844 0000064D 0F84E5000000            	je      InitArpeggio
   845 00000653 80FE03                  	cmp     dh, 03h
   846 00000656 7423                    	je      short InitTonePort
   847 00000658 80FE04                  	cmp     dh, 04h
   848 0000065B 742D                    	je      short InitVibrato
   849 0000065D 80FE09                  	cmp     dh, 09h
   850 00000660 7451                    	je      short SampleOfs
   851 00000662 80FE0B                  	cmp     dh, 0Bh
   852 00000665 7462                    	je      short PosJump
   853 00000667 80FE0C                  	cmp     dh, 0Ch
   854 0000066A 746B                    	je      short SetVolume
   855 0000066C 80FE0D                  	cmp     dh, 0Dh
   856 0000066F 7471                    	je      short Break
   857 00000671 80FE0F                  	cmp     dh, 0Fh
   858 00000674 0F8487000000            	je      SetSpeed
   859                                  InitNone:
   860 0000067A C3                      	retn
   861                                  InitTonePort:
   862 0000067B 84D2                    	test    dl, dl
   863 0000067D 7503                    	jnz     short SetPortParm
   864 0000067F 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   865                                  SetPortParm:    
   866 00000682 885718                  	mov     [edi+TrackInfo.PortParm], dl
   867 00000685 66895714                	mov     [edi+TrackInfo.Effect], dx
   868 00000689 C3                      	retn
   869                                  InitVibrato:
   870 0000068A 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   871 0000068D 88C4                    	mov     ah, al
   872 0000068F 240F                    	and     al, 0Fh
   873 00000691 80E4F0                  	and     ah, 0F0h
   874 00000694 F6C20F                  	test    dl, 0Fh
   875 00000697 7502                    	jne     short OkDepth
   876 00000699 08C2                    	or      dl, al
   877                                  OkDepth:        
   878 0000069B F6C2F0                  	test    dl, 0F0h
   879 0000069E 7502                    	jnz     short OkRate
   880 000006A0 08E2                    	or      dl, ah
   881                                  OkRate:         
   882 000006A2 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   883 000006A5 66895714                	mov     [edi+TrackInfo.Effect], dx
   884 000006A9 6685C9                  	test    cx, cx
   885 000006AC 7404                    	jz      short OkPos
   886 000006AE C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   887                                  OkPos:          
   888 000006B2 C3                      	retn
   889                                  SampleOfs:      
   890 000006B3 84D2                    	test    dl, dl
   891 000006B5 7503                    	jnz     short SetSampleOfs
   892 000006B7 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   893                                  SetSampleOfs:
   894 000006BA 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   895 000006BD 88D6                    	mov     dh, dl
   896 000006BF 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   897 000006C5 895704                  	mov     [edi+TrackInfo.Position], edx
   898 000006C8 C3                      	retn
   899                                  PosJump:
   900 000006C9 8815[B46B0000]          	mov     [OrderPos], dl
   901 000006CF C605[B86B0000]40        	mov     byte [Row], 64
   902 000006D6 C3                      	retn
   903                                  SetVolume:
   904 000006D7 80FA40                  	cmp     dl, 64
   905 000006DA 7602                    	jbe     short OkVol
   906 000006DC B240                    	mov     dl, 64
   907                                  OkVol:
   908 000006DE 88570E                  	mov     [edi+TrackInfo.Volume], dl
   909 000006E1 C3                      	retn
   910                                  Break:
   911 000006E2 88D6                    	mov     dh, dl
   912 000006E4 80E20F                  	and     dl, 0Fh
   913 000006E7 C0EE04                  	shr     dh, 4
   914 000006EA 00F6                    	add     dh, dh
   915 000006EC 00F2                    	add     dl, dh
   916 000006EE C0E602                  	shl     dh, 2
   917 000006F1 00F2                    	add     dl, dh
   918 000006F3 8815[B96B0000]          	mov     [BreakRow], dl
   919 000006F9 C605[B86B0000]40        	mov     byte [Row], 64
   920 00000700 C3                      	retn
   921                                  SetSpeed:
   922 00000701 84D2                    	test    dl,dl
   923 00000703 7432                    	je      Skip
   924 00000705 80FA1F                  	cmp     dl,31
   925 00000708 770D                    	ja      short SetBpm
   926                                  SetTempo:       
   927 0000070A 8815[B56B0000]          	mov     [Tempo], dl
   928 00000710 8815[B66B0000]          	mov     [TempoWait], dl
   929 00000716 C3                      	retn
   930                                  SetBpm:
   931 00000717 8815[B76B0000]          	mov     [Bpm], dl
   932 0000071D B067                    	mov     al, 103
   933 0000071F F6E2                    	mul     dl
   934 00000721 88E3                    	mov     bl, ah
   935 00000723 30FF                    	xor     bh, bh
   936 00000725 66A1[150D0000]          	mov     ax, [MixSpeed]
   937 0000072B 6631D2                  	xor     dx, dx
   938 0000072E 66F7F3                  	div     bx
   939 00000731 66A3[BA6B0000]          	mov     [BpmSamples], ax
   940                                  Skip:           
   941 00000737 C3                      	retn
   942                                  InitArpeggio:
   943 00000738 88D6                    	mov     dh, dl
   944 0000073A 80E20F                  	and     dl, 0Fh
   945 0000073D C0EE04                  	shr     dh, 4
   946 00000740 66B92400                	mov     cx, 36
   947 00000744 31DB                    	xor     ebx, ebx
   948 00000746 668B4710                	mov     ax, [edi+TrackInfo.Period]
   949                                  gt_ScanPeriod:
   950 0000074A 66673B87[CB0C]          	cmp     ax, [PeriodTable+bx]
   951 00000750 7306                    	jae     short SetArp
   952 00000752 6683C302                	add     bx, 2
   953 00000756 E2F2                    	loop    gt_ScanPeriod
   954                                  SetArp:         
   955 00000758 6601D2                  	add     dx, dx
   956 0000075B 00DE                    	add     dh, bl
   957 0000075D 00DA                    	add     dl, bl
   958 0000075F 66678B9F[CB0C]          	mov     bx, [PeriodTable+bx]
   959 00000765 6601DB                  	add     bx, bx
   960 00000768 66678B87[0214]          	mov     ax, [PitchTable+bx]
   961 0000076E 6689471C                	mov     [edi+TrackInfo.Arp], ax
   962 00000772 88F3                    	mov     bl, dh
   963 00000774 30FF                    	xor     bh, bh
   964 00000776 66678B9F[CB0C]          	mov     bx, [PeriodTable+bx]
   965 0000077C 6601DB                  	add     bx, bx
   966 0000077F 66678B87[0214]          	mov     ax, [PitchTable+bx]
   967 00000785 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
   968 00000789 88D3                    	mov     bl, dl
   969 0000078B 30FF                    	xor     bh, bh
   970 0000078D 66678B9F[CB0C]          	mov     bx, [PeriodTable+bx]
   971 00000793 6601DB                  	add     bx, bx
   972 00000796 66678B87[0214]          	mov     ax, [PitchTable+bx]
   973 0000079C 66894720                	mov     [edi+TrackInfo.Arp+4], ax
   974 000007A0 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
   975 000007A6 C3                      	retn
   976                                  
   977                                  ;--------------------------------------------------------------------------
   978                                  ; UpdateTracks:  Main code to process the next tick to be played.
   979                                  ;--------------------------------------------------------------------------
   980                                  
   981                                  UpdateTracks:
   982 000007A7 FE0D[B66B0000]          	dec     byte [TempoWait]
   983 000007AD 7415                    	jz      short GetTracks
   984                                  
   985 000007AF B904000000              	mov	ecx, NumTracks
   986 000007B4 BF[CA6B0000]            	mov	edi, Tracks
   987                                  BeatTracks:
   988 000007B9 E87AFCFFFF              	call	BeatTrack	
   989 000007BE 83C724                  	add	edi, TrackInfo.size
   990 000007C1 E2F6                    	loop	BeatTracks
   991 000007C3 C3                      	retn
   992                                  GetTracks:
   993 000007C4 A0[B56B0000]            	mov     al, [Tempo]
   994 000007C9 A2[B66B0000]            	mov     [TempoWait], al
   995                                  
   996 000007CE 8B35[C66B0000]          	mov	esi, [Note]
   997 000007D4 803D[B86B0000]40        	cmp     byte [Row], 64
   998 000007DB 7263                    	jb      short NoPattWrap
   999                                  
  1000 000007DD 8B35[8A120000]          	mov	esi, [ModInfo.Patterns]
  1001 000007E3 8A1D[B46B0000]          	mov     bl, [OrderPos]
  1002 000007E9 3A1D[08120000]          	cmp     bl, [ModInfo.OrderLen]
  1003 000007EF 7214                    	jb      short NoOrderWrap
  1004 000007F1 8A1D[09120000]          	mov     bl, [ModInfo.ReStart]
  1005 000007F7 881D[B46B0000]          	mov     [OrderPos], bl
  1006 000007FD 3A1D[08120000]          	cmp     bl, [ModInfo.OrderLen]
  1007 00000803 735D                    	jae     short NoUpdate
  1008                                  NoOrderWrap:    
  1009                                  	;xor	bh, bh
  1010 00000805 81E3FF000000            	and	ebx, 0FFh
  1011 0000080B 8A9B[0A120000]          	mov     bl, [ModInfo.Order+ebx]
  1012 00000811 C1E30A                  	shl     ebx, 10 ; *1024
  1013 00000814 01DE                    	add     esi, ebx
  1014 00000816 8A1D[B96B0000]          	mov     bl, [BreakRow]
  1015 0000081C 881D[B86B0000]          	mov     [Row], bl
  1016                                  	;xor     bh, bh
  1017 00000822 81E3FF000000            	and	ebx, 0FFh
  1018 00000828 883D[B96B0000]          	mov     [BreakRow], bh ; 0
  1019 0000082E 66C1E304                	shl     bx, 4
  1020 00000832 01DE                    	add     esi, ebx
  1021 00000834 8935[C66B0000]          	mov     [Note], esi
  1022 0000083A FE05[B46B0000]          	inc     byte [OrderPos]
  1023                                  NoPattWrap:     
  1024 00000840 FE05[B86B0000]          	inc     byte [Row]
  1025                                  
  1026                                  	;cld
  1027 00000846 B904000000              	mov	ecx, NumTracks
  1028 0000084B BF[CA6B0000]            	mov	edi, Tracks
  1029                                  GetTracks_next:
  1030 00000850 51                      	push	ecx	
  1031 00000851 E857FDFFFF              	call	GetTrack
  1032 00000856 59                      	pop	ecx
  1033 00000857 83C724                  	add	edi, TrackInfo.size
  1034 0000085A E2F4                    	loop	GetTracks_next
  1035                                  
  1036 0000085C 8935[C66B0000]          	mov     [Note], esi
  1037                                  NoUpdate:
  1038 00000862 C3                      	retn
  1039                                  
  1040                                  ;--------------------------------------------------------------------------
  1041                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1042                                  ;  In:
  1043                                  ;   ds:si -  Track Info Address.
  1044                                  ;   ds:di -  Buffer Address.
  1045                                  ;    cx   -  Buffer Size.
  1046                                  ;--------------------------------------------------------------------------
  1047                                  
  1048                                  ; esi = Track info address
  1049                                  ; edi = Buffer address
  1050                                  ; ecx = Buffer size
  1051                                  
  1052                                  MixTrack:
  1053 00000863 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1054 00000868 7748                    	ja      short MixLooped
  1055                                  MixNonLooped:   
  1056 0000086A 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1057 0000086C 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1058 0000086F 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1059 00000873 52                      	push    edx
  1060 00000874 56                      	push    esi
  1061 00000875 01D3                    	add     ebx, edx
  1062 00000877 01D5                    	add     ebp, edx
  1063 00000879 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1064 0000087D 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1065 00000880 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1066 00000883 89DE                    	mov     esi, ebx
  1067 00000885 88C7                    	mov     bh, al
  1068 00000887 88D0                    	mov     al, dl
  1069 00000889 88F2                    	mov     dl, dh
  1070                                  	;xor	dh, dh
  1071 0000088B 81E2FF000000            	and	edx, 0FFh
  1072                                  nlMixSamp:      
  1073 00000891 39EE                    	cmp     esi, ebp
  1074 00000893 7310                    	jae     short nlMixBye
  1075 00000895 8A1E                    	mov     bl, [esi]
  1076 00000897 678A9F[B41A]            	mov     bl, [VolTable+bx]
  1077 0000089C 001F                    	add     [edi], bl
  1078 0000089E 47                      	inc     edi
  1079 0000089F 00C4                    	add     ah, al
  1080 000008A1 11D6                    	adc     esi, edx
  1081 000008A3 E2EC                    	loop    nlMixSamp
  1082                                  nlMixBye:       
  1083 000008A5 89F3                    	mov     ebx, esi
  1084 000008A7 5E                      	pop     esi
  1085 000008A8 5A                      	pop     edx
  1086 000008A9 29D3                    	sub     ebx, edx
  1087 000008AB 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1088 000008AE 88660F                  	mov     [esi+TrackInfo.Error], ah
  1089 000008B1 C3                      	retn
  1090                                  MixLooped:
  1091 000008B2 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1092 000008B4 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1093 000008B7 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1094 000008BB 892D[C26B0000]          	mov     [BufRep], ebp
  1095                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1096 000008C1 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1097 000008C5 52                      	push    edx
  1098 000008C6 56                      	push    esi
  1099 000008C7 01D3                    	add     ebx, edx
  1100 000008C9 01D5                    	add     ebp, edx
  1101 000008CB 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1102 000008CF 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1103 000008D2 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1104                                  	;mov    si, bx
  1105 000008D5 89DE                    	mov	esi, ebx ; 04/09/2017
  1106 000008D7 88C7                    	mov     bh, al
  1107 000008D9 88D0                    	mov     al, dl
  1108 000008DB 88F2                    	mov     dl, dh
  1109                                  	;xor	dh, dh
  1110 000008DD 81E2FF000000            	and	edx, 0FFh
  1111                                  lpMixSamp:      
  1112 000008E3 39EE                    	cmp     esi, ebp
  1113 000008E5 7206                    	jb      short lpMixNow
  1114 000008E7 2B35[C26B0000]          	sub     esi, [BufRep]
  1115                                  lpMixNow:       
  1116 000008ED 8A1E                    	mov     bl, [esi]
  1117 000008EF 678A9F[B41A]            	mov     bl, [VolTable+bx]
  1118 000008F4 001F                    	add     [edi], bl
  1119 000008F6 47                      	inc     edi
  1120 000008F7 00C4                    	add     ah, al
  1121 000008F9 11D6                    	adc	esi, edx
  1122 000008FB E2E6                    	loop    lpMixSamp
  1123                                  lpMixBye:       
  1124                                  ;	mov     ebx, esi
  1125                                  ;	pop     esi
  1126                                  ;	pop     edx
  1127                                  ;	sub     ebx, edx
  1128                                  ;	mov     [esi+TrackInfo.Position], ebx
  1129                                  ;	mov     [esi+TrackInfo.Error], ah
  1130                                  ;	retn
  1131 000008FD EBA6                    	jmp	short nlMixBye
  1132                                  
  1133                                  ;--------------------------------------------------------------------------
  1134                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1135                                  ;  In:
  1136                                  ;    Buffer  - Buffer Address.
  1137                                  ;    Count   - Buffer Size.
  1138                                  ;--------------------------------------------------------------------------
  1139                                  
  1140                                  GetSamples:
  1141                                  	; edi = buffer address
  1142                                  	; ebx = count
  1143                                  
  1144 000008FF 60                      	pushad
  1145                                  
  1146                                  	;cld
  1147                                  NextChunk:      
  1148 00000900 66833D[C06B0000]00      	cmp     word [BufLen], 0
  1149 00000908 7548                    	jne     short CopyChunk
  1150                                  
  1151 0000090A 53                      	push    ebx
  1152 0000090B 57                      	push    edi
  1153                                  MixChunk:       
  1154 0000090C BF[B45B0000]            	mov	edi, MixBuffer
  1155 00000911 0FB70D[BA6B0000]        	movzx	ecx, word [BpmSamples]
  1156 00000918 893D[BC6B0000]          	mov     [BufPtr], edi
  1157 0000091E 66890D[C06B0000]        	mov     [BufLen], cx
  1158                                  
  1159 00000925 B080                    	mov     al, 80h
  1160 00000927 F3AA                    	rep     stosb
  1161                                  
  1162 00000929 66B90400                	mov	cx, NumTracks
  1163 0000092D BE[A66B0000]            	mov	esi, Tracks - TrackInfo.size
  1164                                  GetSamples_next:
  1165 00000932 51                      	push	ecx
  1166 00000933 83C624                  	add	esi, TrackInfo.size
  1167 00000936 668B0D[C06B0000]        	mov	cx, [BufLen]
  1168 0000093D 8B3D[BC6B0000]          	mov	edi, [BufPtr]
  1169 00000943 E81BFFFFFF              	call	MixTrack
  1170 00000948 59                      	pop	ecx
  1171 00000949 E2E7                    	loop	GetSamples_next	
  1172                                  
  1173 0000094B E857FEFFFF              	call    UpdateTracks
  1174                                  
  1175 00000950 5F                      	pop     edi
  1176 00000951 5B                      	pop     ebx
  1177                                  CopyChunk:      
  1178                                  	;mov	cx, [BufLen]
  1179 00000952 0FB70D[C06B0000]        	movzx	ecx, word [BufLen]
  1180 00000959 39D9                    	cmp	ecx, ebx
  1181                                  	;cmp	cx, bx
  1182 0000095B 7602                    	jbe     short MoveChunk
  1183                                  	;mov	cx, bx
  1184 0000095D 89D9                    	mov     ecx, ebx
  1185                                  MoveChunk:
  1186 0000095F 8B35[BC6B0000]          	mov     esi, [BufPtr]
  1187 00000965 010D[BC6B0000]          	add     [BufPtr], ecx
  1188 0000096B 66290D[C06B0000]        	sub     [BufLen], cx
  1189 00000972 29CB                    	sub     ebx, ecx
  1190 00000974 F3A4                    	rep     movsb
  1191 00000976 85DB                    	test    ebx, ebx
  1192 00000978 7586                    	jnz     short NextChunk
  1193                                  
  1194 0000097A 61                      	popad
  1195 0000097B C3                      	retn
  1196                                  
  1197                                  ;--------------------------------------------------------------------------
  1198                                  ; StartPlaying: Initializes the Sound System.
  1199                                  ;  In:
  1200                                  ;   Module Information Resources.
  1201                                  ;--------------------------------------------------------------------------
  1202                                  
  1203                                  StartPlaying:
  1204 0000097C 60                      	pushad
  1205                                  SetModParms:    
  1206 0000097D C605[B46B0000]00        	mov     byte [OrderPos], 0
  1207 00000984 C605[B56B0000]06        	mov     byte [Tempo], DefTempo
  1208 0000098B C605[B66B0000]06        	mov     byte [TempoWait], DefTempo
  1209 00000992 C605[B76B0000]7D        	mov     byte [Bpm], DefBpm
  1210 00000999 C605[B86B0000]40        	mov     byte [Row], 64
  1211 000009A0 C605[B96B0000]00        	mov     byte [BreakRow], 0
  1212 000009A7 66A1[150D0000]          	mov     ax, [MixSpeed]
  1213 000009AD 31D2                    	xor     edx, edx
  1214 000009AF 66BB3200                	mov     bx, 24*DefBpm/60
  1215 000009B3 66F7F3                  	div     bx
  1216 000009B6 66A3[BA6B0000]          	mov     [BpmSamples], ax
  1217                                  ClearTracks:    
  1218 000009BC BF[CA6B0000]            	mov     edi, Tracks
  1219 000009C1 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1220 000009C6 31C0                    	xor     eax, eax
  1221                                  	;cld
  1222 000009C8 F3AA                    	rep     stosb
  1223                                  
  1224 000009CA A3[BC6B0000]            	mov     [BufPtr], eax
  1225 000009CF 66A3[C06B0000]          	mov     [BufLen], ax
  1226                                  MakePitch:
  1227 000009D5 66B80021                	mov     ax, MidCRate
  1228 000009D9 66BBAC01                	mov     bx, 428
  1229 000009DD 66F7E3                  	mul     bx
  1230 000009E0 66F735[150D0000]        	div     word [MixSpeed]
  1231 000009E7 30F6                    	xor     dh, dh
  1232 000009E9 88E2                    	mov     dl, ah
  1233 000009EB 88C4                    	mov     ah, al
  1234 000009ED 30C0                    	xor     al, al
  1235 000009EF 66B95903                	mov     cx, 857
  1236 000009F3 31DB                    	xor     ebx, ebx
  1237 000009F5 BF[02140000]            	mov     edi, PitchTable
  1238                                  PitchLoop:      
  1239 000009FA 50                      	push    eax
  1240 000009FB 52                      	push    edx
  1241 000009FC 6639DA                  	cmp     dx, bx
  1242 000009FF 7303                    	jae     short NoDiv
  1243 00000A01 66F7F3                  	div     bx
  1244                                  NoDiv:          
  1245 00000A04 66AB                    	stosw
  1246 00000A06 5A                      	pop     edx
  1247 00000A07 58                      	pop     eax
  1248 00000A08 43                      	inc     ebx
  1249 00000A09 E2EF                    	loop    PitchLoop
  1250                                  MakeVolume:     
  1251 00000A0B 66B90041                	mov     cx, 16640
  1252 00000A0F 89CB                    	mov     ebx, ecx
  1253                                  VolLoop:
  1254 00000A11 4B                      	dec     ebx
  1255 00000A12 88D8                    	mov     al, bl
  1256 00000A14 F6EF                    	imul    bh
  1257 00000A16 88A3[B41A0000]          	mov     [VolTable+ebx], ah
  1258 00000A1C E2F3                    	loop    VolLoop
  1259                                  
  1260 00000A1E 61                      	popad
  1261 00000A1F C3                      	retn
  1262                                  
  1263                                  ;--------------------------------------------------------------------------
  1264                                  ; StopPlaying: ShutDown the Sound System.
  1265                                  ;--------------------------------------------------------------------------
  1266                                  
  1267                                  StopPlaying:
  1268                                  	; 19/06/2017
  1269                                  	; Stop Playing
  1270                                  	sys	_audio, 0700h
  1270                              <1> 
  1270                              <1> 
  1270                              <1> 
  1270                              <1> 
  1270                              <1>  %if %0 >= 2
  1270 00000A20 BB00070000          <1>  mov ebx, %2
  1270                              <1>  %if %0 >= 3
  1270                              <1>  mov ecx, %3
  1270                              <1>  %if %0 = 4
  1270                              <1>  mov edx, %4
  1270                              <1>  %endif
  1270                              <1>  %endif
  1270                              <1>  %endif
  1270 00000A25 B820000000          <1>  mov eax, %1
  1270                              <1> 
  1270 00000A2A CD40                <1>  int 40h
  1271                                  	; Cancel callback service (for user)
  1272                                  	sys	_audio, 0900h
  1272                              <1> 
  1272                              <1> 
  1272                              <1> 
  1272                              <1> 
  1272                              <1>  %if %0 >= 2
  1272 00000A2C BB00090000          <1>  mov ebx, %2
  1272                              <1>  %if %0 >= 3
  1272                              <1>  mov ecx, %3
  1272                              <1>  %if %0 = 4
  1272                              <1>  mov edx, %4
  1272                              <1>  %endif
  1272                              <1>  %endif
  1272                              <1>  %endif
  1272 00000A31 B820000000          <1>  mov eax, %1
  1272                              <1> 
  1272 00000A36 CD40                <1>  int 40h
  1273                                  	; Deallocate Audio Buffer (for user)
  1274                                  	sys	_audio, 0A00h
  1274                              <1> 
  1274                              <1> 
  1274                              <1> 
  1274                              <1> 
  1274                              <1>  %if %0 >= 2
  1274 00000A38 BB000A0000          <1>  mov ebx, %2
  1274                              <1>  %if %0 >= 3
  1274                              <1>  mov ecx, %3
  1274                              <1>  %if %0 = 4
  1274                              <1>  mov edx, %4
  1274                              <1>  %endif
  1274                              <1>  %endif
  1274                              <1>  %endif
  1274 00000A3D B820000000          <1>  mov eax, %1
  1274                              <1> 
  1274 00000A42 CD40                <1>  int 40h
  1275                                  	; Disable Audio Device
  1276                                  	sys	_audio, 0C00h
  1276                              <1> 
  1276                              <1> 
  1276                              <1> 
  1276                              <1> 
  1276                              <1>  %if %0 >= 2
  1276 00000A44 BB000C0000          <1>  mov ebx, %2
  1276                              <1>  %if %0 >= 3
  1276                              <1>  mov ecx, %3
  1276                              <1>  %if %0 = 4
  1276                              <1>  mov edx, %4
  1276                              <1>  %endif
  1276                              <1>  %endif
  1276                              <1>  %endif
  1276 00000A49 B820000000          <1>  mov eax, %1
  1276                              <1> 
  1276 00000A4E CD40                <1>  int 40h
  1277                                  
  1278 00000A50 C3                      	retn
  1279                                  
  1280                                  ;=============================================================================
  1281                                  ; 
  1282                                  ;=============================================================================
  1283                                  
  1284                                  ;dword2str:
  1285                                  ;	; 13/11/2016 - Erdogan Tan 
  1286                                  ;	; eax = dword value
  1287                                  ;	;
  1288                                  ;	call	dwordtohex
  1289                                  ;	mov	[dword_str], edx
  1290                                  ;	mov	[dword_str+4], eax
  1291                                  ;	mov	si, dword_str
  1292                                  ;	retn
  1293                                  
  1294                                  	; 05/03/2017 (TRDOS 386)
  1295                                  	; trdos386.s (unix386.s) - 10/05/2015
  1296                                  	; Convert binary number to hexadecimal string
  1297                                  
  1298                                  ;bytetohex:
  1299                                  ;	; INPUT ->
  1300                                  ;	; 	AL = byte (binary number)
  1301                                  ;	; OUTPUT ->
  1302                                  ;	;	AX = hexadecimal string
  1303                                  ;	;
  1304                                  ;	push	ebx
  1305                                  ;	movzx	ebx, al
  1306                                  ;	shr	bl, 4
  1307                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1308                                  ;	xchg	bl, al
  1309                                  ;	and	bl, 0Fh
  1310                                  ;	mov	ah, [ebx+hex_chars] 
  1311                                  ;	pop	ebx	
  1312                                  ;	retn
  1313                                  
  1314                                  ;wordtohex:
  1315                                  ;	; INPUT ->
  1316                                  ;	; 	AX = word (binary number)
  1317                                  ;	; OUTPUT ->
  1318                                  ;	;	EAX = hexadecimal string
  1319                                  ;	;
  1320                                  ;	push	ebx
  1321                                  ;	xor	ebx, ebx
  1322                                  ;	xchg	ah, al
  1323                                  ;	push	eax
  1324                                  ;	mov	bl, ah
  1325                                  ;	shr	bl, 4
  1326                                  ;	mov	al, [ebx+hex_chars] 	 	
  1327                                  ;	mov	bl, ah
  1328                                  ;	and	bl, 0Fh
  1329                                  ;	mov	ah, [ebx+hex_chars]
  1330                                  ;	shl	eax, 16
  1331                                  ;	pop	eax
  1332                                  ;	pop	ebx
  1333                                  ;	jmp	short bytetohex
  1334                                  
  1335                                  ;dwordtohex:
  1336                                  ;	; INPUT ->
  1337                                  ;	; 	EAX = dword (binary number)
  1338                                  ;	; OUTPUT ->
  1339                                  ;	;	EDX:EAX = hexadecimal string
  1340                                  ;	;
  1341                                  ;	push	eax
  1342                                  ;	shr	eax, 16
  1343                                  ;	call	wordtohex
  1344                                  ;	mov	edx, eax
  1345                                  ;	pop	eax
  1346                                  ;	call	wordtohex
  1347                                  ;	retn
  1348                                  
  1349                                  	; 19/06/2017
  1350                                  	; 05/03/2017 (TRDOS 386)
  1351                                  	; 13/11/2016 - Erdogan Tan
  1352                                  write_audio_dev_info:
  1353                                  	; BUS/DEV/FN
  1354                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1355                                  	; DEV/VENDOR
  1356                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1357                                  
  1358 00000A51 8B35[B80D0000]          	mov	esi, [dev_vendor]
  1359 00000A57 6689F0                  	mov	ax, si
  1360 00000A5A 0FB6D8                  	movzx	ebx, al
  1361 00000A5D 88DA                    	mov	dl, bl
  1362 00000A5F 80E30F                  	and	bl, 0Fh
  1363 00000A62 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1364 00000A68 A2[5C0D0000]            	mov	[msgVendorId+3], al
  1365 00000A6D 88D3                    	mov	bl, dl
  1366 00000A6F C0EB04                  	shr	bl, 4
  1367 00000A72 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1368 00000A78 A2[5B0D0000]            	mov	[msgVendorId+2], al
  1369 00000A7D 88E3                    	mov	bl, ah
  1370 00000A7F 88DA                    	mov	dl, bl
  1371 00000A81 80E30F                  	and	bl, 0Fh
  1372 00000A84 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1373 00000A8A A2[5A0D0000]            	mov	[msgVendorId+1], al
  1374 00000A8F 88D3                    	mov	bl, dl
  1375 00000A91 C0EB04                  	shr	bl, 4
  1376 00000A94 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1377 00000A9A A2[590D0000]            	mov	[msgVendorId], al
  1378 00000A9F C1EE10                  	shr	esi, 16
  1379 00000AA2 6689F0                  	mov	ax, si
  1380 00000AA5 88C3                    	mov	bl, al
  1381 00000AA7 88DA                    	mov	dl, bl
  1382 00000AA9 80E30F                  	and	bl, 0Fh
  1383 00000AAC 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1384 00000AB2 A2[6D0D0000]            	mov	[msgDevId+3], al
  1385 00000AB7 88D3                    	mov	bl, dl
  1386 00000AB9 C0EB04                  	shr	bl, 4
  1387 00000ABC 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1388 00000AC2 A2[6C0D0000]            	mov	[msgDevId+2], al
  1389 00000AC7 88E3                    	mov	bl, ah
  1390 00000AC9 88DA                    	mov	dl, bl
  1391 00000ACB 80E30F                  	and	bl, 0Fh
  1392 00000ACE 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1393 00000AD4 A2[6B0D0000]            	mov	[msgDevId+1], al
  1394 00000AD9 88D3                    	mov	bl, dl
  1395 00000ADB C0EB04                  	shr	bl, 4
  1396 00000ADE 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1397 00000AE4 A2[6A0D0000]            	mov	[msgDevId], al
  1398                                  
  1399 00000AE9 8B35[BC0D0000]          	mov	esi, [bus_dev_fn]
  1400 00000AEF C1EE08                  	shr	esi, 8
  1401 00000AF2 6689F0                  	mov	ax, si
  1402 00000AF5 88C3                    	mov	bl, al
  1403 00000AF7 88DA                    	mov	dl, bl
  1404 00000AF9 80E307                  	and	bl, 7 ; bit 0,1,2
  1405 00000AFC 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1406 00000B02 A2[910D0000]            	mov	[msgFncNo+1], al
  1407 00000B07 88D3                    	mov	bl, dl
  1408 00000B09 C0EB03                  	shr	bl, 3
  1409 00000B0C 88DA                    	mov	dl, bl
  1410 00000B0E 80E30F                  	and	bl, 0Fh
  1411 00000B11 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1412 00000B17 A2[830D0000]            	mov	[msgDevNo+1], al
  1413 00000B1C 88D3                    	mov	bl, dl
  1414 00000B1E C0EB04                  	shr	bl, 4
  1415 00000B21 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1416 00000B27 A2[820D0000]            	mov	[msgDevNo], al
  1417 00000B2C 88E3                    	mov	bl, ah
  1418 00000B2E 88DA                    	mov	dl, bl
  1419 00000B30 80E30F                  	and	bl, 0Fh
  1420 00000B33 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1421 00000B39 A2[770D0000]            	mov	[msgBusNo+1], al
  1422 00000B3E 88D3                    	mov	bl, dl
  1423 00000B40 C0EB04                  	shr	bl, 4
  1424 00000B43 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1425 00000B49 A2[760D0000]            	mov	[msgBusNo], al
  1426                                  
  1427 00000B4E 66A1[C40D0000]          	mov	ax, [ac97_io_base]
  1428 00000B54 88C3                    	mov	bl, al
  1429 00000B56 88DA                    	mov	dl, bl
  1430 00000B58 80E30F                  	and	bl, 0Fh
  1431 00000B5B 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1432 00000B61 A2[AA0D0000]            	mov	[msgIOBaseAddr+3], al
  1433 00000B66 88D3                    	mov	bl, dl
  1434 00000B68 C0EB04                  	shr	bl, 4
  1435 00000B6B 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1436 00000B71 A2[A90D0000]            	mov	[msgIOBaseAddr+2], al
  1437 00000B76 88E3                    	mov	bl, ah
  1438 00000B78 88DA                    	mov	dl, bl
  1439 00000B7A 80E30F                  	and	bl, 0Fh
  1440 00000B7D 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1441 00000B83 A2[A80D0000]            	mov	[msgIOBaseAddr+1], al
  1442 00000B88 88D3                    	mov	bl, dl
  1443 00000B8A C0EB04                  	shr	bl, 4
  1444 00000B8D 8A83[170D0000]          	mov	al, [ebx+hex_chars]
  1445 00000B93 A2[A70D0000]            	mov	[msgIOBaseAddr], al
  1446                                  
  1447                                  	; 24/11/2016
  1448 00000B98 30E4                    	xor	ah, ah
  1449 00000B9A A0[C60D0000]            	mov	al, [ac97_int_ln_reg]
  1450 00000B9F B10A                    	mov	cl, 10
  1451 00000BA1 F6F1                    	div	cl
  1452 00000BA3 660105[B20D0000]        	add	[msgIRQ], ax
  1453 00000BAA 20C0                    	and	al, al
  1454 00000BAC 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1455 00000BAE A0[B30D0000]            	mov	al, [msgIRQ+1]
  1456 00000BB3 B420                    	mov	ah, ' '
  1457 00000BB5 66A3[B20D0000]          	mov	[msgIRQ], ax
  1458                                  _w_ac97imsg_:
  1459                                  	; EBX = Message address
  1460                                  	; ECX = Max. message length (or stop on ZERO character)
  1461                                  	;	(1 to 255)
  1462                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1463                                       	sys 	_msg, msgAC97Info, 255, 07h
  1463                              <1> 
  1463                              <1> 
  1463                              <1> 
  1463                              <1> 
  1463                              <1>  %if %0 >= 2
  1463 00000BBB BB[280D0000]        <1>  mov ebx, %2
  1463                              <1>  %if %0 >= 3
  1463 00000BC0 B9FF000000          <1>  mov ecx, %3
  1463                              <1>  %if %0 = 4
  1463 00000BC5 BA07000000          <1>  mov edx, %4
  1463                              <1>  %endif
  1463                              <1>  %endif
  1463                              <1>  %endif
  1463 00000BCA B823000000          <1>  mov eax, %1
  1463                              <1> 
  1463 00000BCF CD40                <1>  int 40h
  1464 00000BD1 C3                              retn
  1465                                  
  1466                                  ;=============================================================================
  1467                                  ;               preinitialized data
  1468                                  ;=============================================================================
  1469                                  
  1470                                  ;=============================================================================
  1471                                  ;               PLAY.ASM - DATA
  1472                                  ;=============================================================================
  1473                                  
  1474                                  msg_2017:
  1475 00000BD2 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1475 00000BDB 506C6179657220666F-
  1475 00000BE4 72205452444F532033-
  1475 00000BED 383620627920457264-
  1475 00000BF6 6F67616E2054616E2E-
  1475 00000BFF 20                 
  1476 00000C00 4F63746F6265722032-     	db	'October 2017.',10,13
  1476 00000C09 3031372E0A0D       
  1477 00000C0F 75736167653A20706C-     	db	'usage: playmod filename.mod', 10,13,0
  1477 00000C18 61796D6F642066696C-
  1477 00000C21 656E616D652E6D6F64-
  1477 00000C2A 0A0D00             
  1478 00000C2D 30382F31302F323031-     	db	'08/10/2017',10,13,0
  1478 00000C36 370A0D00           
  1479                                  
  1480 00000C3A 54696E79204D4F4420-     Credits:	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1480 00000C43 506C61796572207630-
  1480 00000C4C 2E3162206279204361-
  1480 00000C55 726C6F732048617361-
  1480 00000C5E 6E2E204A756C792031-
  1480 00000C67 3939332E           
  1481 00000C6B 0A0D00                  		db	10,13,0
  1482 00000C6E 4572726F72206C6F61-     ErrorMesg:	db	'Error loading Module file.',10,13,0
  1482 00000C77 64696E67204D6F6475-
  1482 00000C80 6C652066696C652E0A-
  1482 00000C89 0D00               
  1483                                  ;MsgNotFound:	db	'Sound Blaster not found or IRQ error.',10,13,0
  1484                                  ;MsgFound:	db	'Sound Blaster found at Address 2'
  1485                                  ;PortText:	db	'x0h, IRQ '
  1486                                  ;IrqText:	db	'x.',10,13,0
  1487                                  
  1488                                  trdos386_err_msg:
  1489 00000C8B 5452444F5320333836-     		db	'TRDOS 386 System call error !', 10, 13,0
  1489 00000C94 2053797374656D2063-
  1489 00000C9D 616C6C206572726F72-
  1489 00000CA6 20210A0D00         
  1490                                  
  1491                                  ;=============================================================================
  1492                                  ;               MODPLAY.ASM - DATA
  1493                                  ;=============================================================================
  1494                                  
  1495                                  ;Credits:	db	'Amiga Module Player v0.3b by Carlos Hasan.'
  1496                                  
  1497 00000CAB 0019324A62788EA2B4-     SinTable:	db	0,25,50,74,98,120,142,162,180,197,212,225
  1497 00000CB4 C5D4E1             
  1498 00000CB7 ECF4FAFEFFFEFAF4EC-     		db	236,244,250,254,255,254,250,244,236,225
  1498 00000CC0 E1                 
  1499 00000CC1 D4C5B4A28E78624A32-     		db	212,197,180,162,142,120,98,74,50,25
  1499 00000CCA 19                 
  1500                                  
  1501 00000CCB 58032803FA02D002A6-     PeriodTable:	dw	856,808,762,720,678,640,604,570,538,508,480,453
  1501 00000CD4 0280025C023A021A02-
  1501 00000CDD FC01E001C501       
  1502 00000CE3 AC0194017D01680153-     		dw	428,404,381,360,339,320,302,285,269,254,240,226
  1502 00000CEC 0140012E011D010D01-
  1502 00000CF5 FE00F000E200       
  1503 00000CFB D600CA00BE00B400AA-     		dw	214,202,190,180,170,160,151,143,135,127,120,113
  1503 00000D04 00A00097008F008700-
  1503 00000D0D 7F0078007100       
  1504                                  
  1505                                  ;=============================================================================
  1506                                  ;               PLAYER.ASM - DATA
  1507                                  ;=============================================================================
  1508                                  
  1509 00000D13 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1510 00000D14 08                      bps:		db 8 ; bits per sample (8 or 16)
  1511                                  Sample_Rate:
  1512 00000D15 2256                    MixSpeed:	dw 22050 ; Hz
  1513                                  
  1514                                  ; 13/11/2016
  1515 00000D17 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1515 00000D20 3941424344454600   
  1516                                  msgAC97Info:	
  1517 00000D28 0D0A                    		db 0Dh, 0Ah
  1518 00000D2A 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  1518 00000D33 6F20436F6E74726F6C-
  1518 00000D3C 6C6572202620436F64-
  1518 00000D45 656320496E666F0D0A 
  1519 00000D4E 56656E646F72204944-     		db "Vendor ID: "
  1519 00000D57 3A20               
  1520 00000D59 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  1520 00000D62 6963652049443A20   
  1521 00000D6A 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  1522 00000D71 4275733A20              		db "Bus: "
  1523 00000D76 303068204465766963-     msgBusNo:	db "00h Device: "
  1523 00000D7F 653A20             
  1524 00000D82 3030682046756E6374-     msgDevNo:	db "00h Function: "
  1524 00000D8B 696F6E3A20         
  1525 00000D90 303068                  msgFncNo:	db "00h"
  1526 00000D93 0D0A                    		db 0Dh, 0Ah
  1527 00000D95 492F4F204261736520-     		db "I/O Base Address: "
  1527 00000D9E 416464726573733A20 
  1528 00000DA7 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  1528 00000DB0 3A20               
  1529 00000DB2 3030                    msgIRQ:		dw 3030h
  1530 00000DB4 0D0A00                  		db 0Dh, 0Ah, 0
  1531                                  ;msgSampleRate:	db "Sample Rate: "
  1532                                  ;msgHertz:	db "00000 Hz ", 0
  1533                                  ;msg8Bits:	db "8 bits ", 0
  1534                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1535                                  ;msg16Bits:	db "16 bits ", "$" 
  1536                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  1537                                  
  1538                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1539                                  ;codec_id:	   dd 0
  1540                                  ;codec_chip_id:	   dd 0
  1541                                  ;codec_vendor_ids: dw 0
  1542                                  ;codec_chip_ids:   dw 0
  1543                                  
  1544                                  ;dword_str:	dd 30303030h, 30303030h
  1545                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1546                                  
  1547                                  ;=============================================================================
  1548                                  ;        	uninitialized data
  1549                                  ;=============================================================================
  1550                                  
  1551                                  bss_start:
  1552                                  
  1553                                  ABSOLUTE bss_start
  1554                                  
  1555 00000DB7 <res 00000001>          alignb 4
  1556                                  
  1557 00000DB8 <res 00000004>          dev_vendor:	resd 1
  1558 00000DBC <res 00000004>          bus_dev_fn:	resd 1
  1559 00000DC0 <res 00000004>          stats_cmd:	resd 1
  1560 00000DC4 <res 00000002>          ac97_io_base:	resw 1
  1561 00000DC6 <res 00000001>          ac97_int_ln_reg: resb 1
  1562 00000DC7 <res 00000001>          srb:		resb 1
  1563                                  
  1564                                  ; MODLOAD.ASM
  1565 00000DC8 <res 00000004>          FileHandle:	resd 1
  1566 00000DCC <res 0000043C>          Header:		resb ModHeader.size
  1567                                  
  1568                                  ; MODPLAY.ASM
  1569                                  ;MixSpeed:	    resw 1
  1570                                  
  1571                                  ModInfo:
  1572 00001208 <res 00000001>          ModInfo.OrderLen:   resb 1
  1573 00001209 <res 00000001>          ModInfo.ReStart:    resb 1
  1574 0000120A <res 00000080>          ModInfo.Order:	    resb 128
  1575 0000128A <res 00000004>          ModInfo.Patterns:   resd 1
  1576                                  
  1577 0000128E <res 0000003E>          ModInfo.SampOfs:    resw 31
  1578 000012CC <res 0000003E>          ModInfo.SampSeg:    resw 31
  1579 0000130A <res 0000003E>          ModInfo.SampLen:    resw 31
  1580 00001348 <res 0000003E>          ModInfo.SampRep:    resw 31
  1581 00001386 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1582 000013C4 <res 0000003E>          ModInfo.SampVol:    resw 31
  1583                                  
  1584                                  ; MODPLAY.ASM
  1585 00001402 <res 000006B2>          PitchTable:	resw 857
  1586 00001AB4 <res 00004100>          VolTable:	resb 16640
  1587 00005BB4 <res 00001000>          MixBuffer       resb MixBufSize
  1588                                  
  1589                                  ; MODPLAY.ASM
  1590 00006BB4 <res 00000001>          OrderPos:	resb 1
  1591 00006BB5 <res 00000001>          Tempo:		resb 1
  1592 00006BB6 <res 00000001>          TempoWait:	resb 1
  1593 00006BB7 <res 00000001>          Bpm:		resb 1
  1594 00006BB8 <res 00000001>          Row:		resb 1
  1595 00006BB9 <res 00000001>          BreakRow:	resb 1
  1596 00006BBA <res 00000002>          BpmSamples:	resw 1
  1597 00006BBC <res 00000004>          BufPtr:		resd 1
  1598 00006BC0 <res 00000002>          BufLen:		resw 1
  1599 00006BC2 <res 00000004>          BufRep:		resd 1
  1600 00006BC6 <res 00000004>          Note:		resd 1
  1601 00006BCA <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1602                                  
  1603 00006C5A <res 00000006>          alignb 16
  1604                                  
  1605                                  ; PLAY.ASM
  1606 00006C60 <res 00000280>          Scope:		resw 320
  1607 00006EE0 <res 00000200>          RowOfs:		resw 256
  1608                                  
  1609                                  mod_file_name:
  1610 000070E0 <res 00000050>          		resb 80
  1611                                  
  1612 00007130 <res 00000ED0>          alignb 4096
  1613                                  
  1614                                  Audio_Buffer:
  1615 00008000 <res 00008000>          		resb 32768
  1616                                  
  1617                                  g_buff:
  1618 00010000 <res 00000140>          		resb 320
  1619 00010140 <res 000000C0>          		resb 192			
  1620                                  
  1621 00010200 <res 0000FE00>          alignb 65536
  1622                                  
  1623                                  file_buffer:
  1624 00020000 <res 00070000>          		resb 65536*7
  1625                                  EOF:
