     1                                  ; ****************************************************************************
     2                                  ; modplay4.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY4.PRG ! SOUND BLASTER 16 MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 24/06/2017
     7                                  ;
     8                                  ; [ Last Modification: 25/06/2017 ]
     9                                  ;
    10                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    11                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    12                                  ;
    13                                  ; Modified from 'playwav3.s' (13/06/2017)
    14                                  ;
    15                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    16                                  ;			                     (23/06/2017)
    17                                  ;
    18                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    19                                  ;				      (04/03/2017) 
    20                                  ; Assembler: NASM 2.11
    21                                  ; ----------------------------------------------------------------------------
    22                                  ;	   nasm  modplay.s -l modplay.txt -o MODPLAY.PRG	
    23                                  ; ****************************************************************************
    24                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    25                                  
    26                                  ; 01/03/2017
    27                                  ; 16/10/2016
    28                                  ; 29/04/2016
    29                                  ; TRDOS 386 system calls (temporary list!)
    30                                  _ver 	equ 0
    31                                  _exit 	equ 1
    32                                  _fork 	equ 2
    33                                  _read 	equ 3
    34                                  _write	equ 4
    35                                  _open	equ 5
    36                                  _close 	equ 6
    37                                  _wait 	equ 7
    38                                  _creat 	equ 8
    39                                  _link 	equ 9
    40                                  _unlink	equ 10
    41                                  _exec	equ 11
    42                                  _chdir	equ 12
    43                                  _time 	equ 13
    44                                  _mkdir 	equ 14
    45                                  _chmod	equ 15
    46                                  _chown	equ 16
    47                                  _break	equ 17
    48                                  _stat	equ 18
    49                                  _seek	equ 19
    50                                  _tell 	equ 20
    51                                  _mount	equ 21
    52                                  _umount	equ 22
    53                                  _setuid	equ 23
    54                                  _getuid	equ 24
    55                                  _stime	equ 25
    56                                  _quit	equ 26	
    57                                  _intr	equ 27
    58                                  _fstat	equ 28
    59                                  _emt 	equ 29
    60                                  _mdate 	equ 30
    61                                  _video 	equ 31
    62                                  _audio	equ 32
    63                                  _timer	equ 33
    64                                  _sleep	equ 34
    65                                  _msg    equ 35
    66                                  _geterr	equ 36
    67                                  _fpsave	equ 37
    68                                  _pri	equ 38
    69                                  _rele	equ 39
    70                                  _fff	equ 40
    71                                  _fnf	equ 41
    72                                  _alloc	equ 42
    73                                  _dalloc equ 43
    74                                  _calbac equ 44		
    75                                  
    76                                  %macro sys 1-4
    77                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    78                                      ; 03/09/2015	
    79                                      ; 13/04/2015
    80                                      ; Retro UNIX 386 v1 system call.	
    81                                      %if %0 >= 2   
    82                                          mov ebx, %2
    83                                          %if %0 >= 3    
    84                                              mov ecx, %3
    85                                              %if %0 = 4
    86                                                 mov edx, %4   
    87                                              %endif
    88                                          %endif
    89                                      %endif
    90                                      mov eax, %1
    91                                      ;int 30h
    92                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    93                                  %endmacro
    94                                  
    95                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    96                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    97                                  
    98                                  ; 19/06/2017
    99                                  BUFFERSIZE equ 32768
   100                                  
   101                                  ; ----------------------------------------------------------------------------
   102                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   103                                  ;	July 14th, 1993.
   104                                  
   105                                  ;=============================================================================
   106                                  ;  
   107                                  ;=============================================================================
   108                                  
   109                                  [BITS 32]
   110                                  [org 0]
   111                                  
   112                                  Start:
   113                                  	; clear bss
   114 00000000 B9[00000800]            	mov	ecx, EOF
   115 00000005 BF[340C0000]            	mov	edi, bss_start
   116 0000000A 29F9                    	sub	ecx, edi
   117 0000000C D1E9                    	shr	ecx, 1
   118 0000000E 31C0                    	xor	eax, eax
   119 00000010 F366AB                  	rep	stosw
   120                                  
   121                                  	; Detect (& Enable) Sound Blaster 16 Audio Device
   122 00000013 E805020000              	call    DetectSB16
   123 00000018 731B                    	jnc     short GetFileName
   124                                  
   125                                  _dev_not_ready:
   126                                  ; couldn't find the audio device!
   127                                  	sys	_msg, MsgNotFound, 255, 0Fh
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1> 
   127                              <1>  %if %0 >= 2
   127 0000001A BB[3E0B0000]        <1>  mov ebx, %2
   127                              <1>  %if %0 >= 3
   127 0000001F B9FF000000          <1>  mov ecx, %3
   127                              <1>  %if %0 = 4
   127 00000024 BA0F000000          <1>  mov edx, %4
   127                              <1>  %endif
   127                              <1>  %endif
   127                              <1>  %endif
   127 00000029 B823000000          <1>  mov eax, %1
   127                              <1> 
   127 0000002E CD40                <1>  int 40h
   128 00000030 E9C7010000                      jmp     Exit
   129                                  
   130                                  GetFileName:
   131                                  	;cmp	ah, 1 ; SB16 Sound card
   132                                  	;jne	_dev_not_ready	
   133                                  	  
   134 00000035 89E6                    	mov	esi, esp
   135 00000037 AD                      	lodsd
   136 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   137                                  		; (program file name & mod file name)
   138 0000003B 0F82C4010000            	jb	pmsg_2017 ; nothing to do
   139                                  
   140 00000041 AD                      	lodsd ; program file name address 
   141 00000042 AD                      	lodsd ; mod file name address (file to be read)
   142 00000043 89C6                    	mov	esi, eax
   143 00000045 BF[606F0000]            	mov	edi, mod_file_name
   144                                  ScanName:       
   145 0000004A AC                      	lodsb
   146 0000004B 84C0                    	test	al, al
   147 0000004D 0F84B2010000            	je	pmsg_2017
   148 00000053 3C20                    	cmp	al, 20h
   149 00000055 74F3                    	je	short ScanName	; scan start of name.
   150 00000057 AA                      	stosb
   151 00000058 B4FF                    	mov	ah, 0FFh
   152                                  a_0:	
   153 0000005A FEC4                    	inc	ah
   154                                  a_1:
   155 0000005C AC                      	lodsb
   156 0000005D AA                      	stosb
   157 0000005E 3C2E                    	cmp	al, '.'
   158 00000060 74F8                    	je	short a_0	
   159 00000062 20C0                    	and	al, al
   160 00000064 75F6                    	jnz	short a_1
   161                                  
   162 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   163 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   164                                  SetExt:
   165 0000006A 4F                      	dec	edi
   166 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   167 00000071 C6470400                	mov	byte [edi+4], 0
   168                                  PrintPMesg:      
   169                                  	; Prints the Credits Text.
   170                                  	sys	_msg, Credits, 255, 0Fh
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1>  %if %0 >= 2
   170 00000075 BB[ED0A0000]        <1>  mov ebx, %2
   170                              <1>  %if %0 >= 3
   170 0000007A B9FF000000          <1>  mov ecx, %3
   170                              <1>  %if %0 = 4
   170 0000007F BA0F000000          <1>  mov edx, %4
   170                              <1>  %endif
   170                              <1>  %endif
   170                              <1>  %endif
   170 00000084 B823000000          <1>  mov eax, %1
   170                              <1> 
   170 00000089 CD40                <1>  int 40h
   171                                  _1:
   172                                  	; 19/06/2017
   173                                  	; Allocate Audio Buffer (for user)
   174                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   174                              <1> 
   174                              <1> 
   174                              <1> 
   174                              <1> 
   174                              <1>  %if %0 >= 2
   174 0000008B BB00020000          <1>  mov ebx, %2
   174                              <1>  %if %0 >= 3
   174 00000090 B900800000          <1>  mov ecx, %3
   174                              <1>  %if %0 = 4
   174 00000095 BA[00700000]        <1>  mov edx, %4
   174                              <1>  %endif
   174                              <1>  %endif
   174                              <1>  %endif
   174 0000009A B820000000          <1>  mov eax, %1
   174                              <1> 
   174 0000009F CD40                <1>  int 40h
   175 000000A1 0F8227010000            	jc	error_exit
   176                                  _2:
   177                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   178                                  	;sys	_audio, 0301h, 0, sb16_int_handler 
   179                                  	;jc	error_exit
   180                                  	
   181                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   182                                  	sys	_audio, 0300h, 1, srb 
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1>  %if %0 >= 2
   182 000000A7 BB00030000          <1>  mov ebx, %2
   182                              <1>  %if %0 >= 3
   182 000000AC B901000000          <1>  mov ecx, %3
   182                              <1>  %if %0 = 4
   182 000000B1 BA[450C0000]        <1>  mov edx, %4
   182                              <1>  %endif
   182                              <1>  %endif
   182                              <1>  %endif
   182 000000B6 B820000000          <1>  mov eax, %1
   182                              <1> 
   182 000000BB CD40                <1>  int 40h
   183 000000BD 0F820B010000            	jc	error_exit
   184                                  
   185                                  LoadMod:  
   186 000000C3 BF[606F0000]            	mov	edi, mod_file_name
   187 000000C8 E8F3010000              	call    LoadModule		; Load the MODule...
   188                                  
   189 000000CD 66833D[480C0000]00      	cmp     word [ErrorInfo], 0	; any error loading?
   190 000000D5 741B                    	je      short short _3
   191                                  
   192                                  	; yes, print error and Exit.
   193                                  
   194                                  	sys	_msg, ErrorMesg, 255, 0Fh
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1> 
   194                              <1>  %if %0 >= 2
   194 000000D7 BB[210B0000]        <1>  mov ebx, %2
   194                              <1>  %if %0 >= 3
   194 000000DC B9FF000000          <1>  mov ecx, %3
   194                              <1>  %if %0 = 4
   194 000000E1 BA0F000000          <1>  mov edx, %4
   194                              <1>  %endif
   194                              <1>  %endif
   194                              <1>  %endif
   194 000000E6 B823000000          <1>  mov eax, %1
   194                              <1> 
   194 000000EB CD40                <1>  int 40h
   195 000000ED E90A010000              	jmp     Exit
   196                                  _3:
   197                                  	; 24/06/2017
   198                                  	sys	_audio, 0E00h ; get audio controller info
   198                              <1> 
   198                              <1> 
   198                              <1> 
   198                              <1> 
   198                              <1>  %if %0 >= 2
   198 000000F2 BB000E0000          <1>  mov ebx, %2
   198                              <1>  %if %0 >= 3
   198                              <1>  mov ecx, %3
   198                              <1>  %if %0 = 4
   198                              <1>  mov edx, %4
   198                              <1>  %endif
   198                              <1>  %endif
   198                              <1>  %endif
   198 000000F7 B820000000          <1>  mov eax, %1
   198                              <1> 
   198 000000FC CD40                <1>  int 40h
   199 000000FE 0F82CA000000            	jc	error_exit
   200                                  
   201                                  	; EAX = IRQ Number in AL
   202                                  	;	Audio Device Number in AH 
   203                                  	; EBX = DEV/VENDOR ID
   204                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   205                                  	; ECX = BUS/DEV/FN 
   206                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   207                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   208                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   209                                  	;      (Low word, DX = NAMBAR address)
   210                                  
   211 00000104 668915[1C0C0000]        	mov	[SbAddr], dx
   212 0000010B A2[1E0C0000]            	mov	[SbIrq], al
   213                                  
   214                                  	; Print Sucessful message.
   215                                  	;mov	dx, [SbAddr]
   216                                  	;mov	al, [SbIrq]
   217 00000110 C0EA04                  	shr     dl, 4
   218 00000113 80C230                  	add     dl, '0'
   219 00000116 8815[860B0000]          	mov     [PortText], dl
   220 0000011C 0430                    	add     al, '0'
   221 0000011E A2[8F0B0000]            	mov     [IrqText], al
   222                                  
   223                                  	sys	_msg, MsgFound, 255, 0Fh
   223                              <1> 
   223                              <1> 
   223                              <1> 
   223                              <1> 
   223                              <1>  %if %0 >= 2
   223 00000123 BB[660B0000]        <1>  mov ebx, %2
   223                              <1>  %if %0 >= 3
   223 00000128 B9FF000000          <1>  mov ecx, %3
   223                              <1>  %if %0 = 4
   223 0000012D BA0F000000          <1>  mov edx, %4
   223                              <1>  %endif
   223                              <1>  %endif
   223                              <1>  %endif
   223 00000132 B823000000          <1>  mov eax, %1
   223                              <1> 
   223 00000137 CD40                <1>  int 40h
   224                                  
   225                                  PlayNow: 
   226 00000139 E875080000              	call    StartPlaying
   227                                  
   228                                          ; load 32768 bytes into audio buffer
   229 0000013E BF[00700000]            	mov	edi, Audio_Buffer
   230 00000143 BB00800000              	mov	ebx, BUFFERSIZE
   231 00000148 E8E9070000              	call	GetSamples
   232 0000014D 727F                    	jc	error_exit
   233                                  
   234                                  	;mov	ecx, 128	; Make a lookup table
   235 0000014F B180                    	mov	cl, 128
   236 00000151 31DB                    	xor     ebx, ebx	; for fastest pixel
   237 00000153 BA002D0000              	mov     edx, 320*(100-64)	; addressing.
   238                                  MakeOfs:        
   239 00000158 668993[606D0000]        	mov     [RowOfs+ebx], dx
   240 0000015F 668993[626D0000]        	mov     [RowOfs+ebx+2], dx
   241 00000166 6681C24001              	add     dx, 320
   242 0000016B 83C304                  	add     ebx, 4
   243 0000016E E2E8                    	loop    MakeOfs
   244                                  
   245                                  	; 23/06/2017
   246                                  	; Map DMA buffer to user's memory space
   247                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
   247                              <1> 
   247                              <1> 
   247                              <1> 
   247                              <1> 
   247                              <1>  %if %0 >= 2
   247 00000170 BB000D0000          <1>  mov ebx, %2
   247                              <1>  %if %0 >= 3
   247 00000175 B900000100          <1>  mov ecx, %3
   247                              <1>  %if %0 = 4
   247 0000017A BA[00000100]        <1>  mov edx, %4
   247                              <1>  %endif
   247                              <1>  %endif
   247                              <1>  %endif
   247 0000017F B820000000          <1>  mov eax, %1
   247                              <1> 
   247 00000184 CD40                <1>  int 40h
   248                                  	;jc	error_exit
   249                                  
   250                                  	; 24/06/2017
   251                                  	; Set Master Volume Level (BL=0 or 80h)
   252                                  	; 	 	for next playing (BL>=80h)
   253                                  	sys	_audio, 0B80h, 1D1Dh
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1> 
   253                              <1>  %if %0 >= 2
   253 00000186 BB800B0000          <1>  mov ebx, %2
   253                              <1>  %if %0 >= 3
   253 0000018B B91D1D0000          <1>  mov ecx, %3
   253                              <1>  %if %0 = 4
   253                              <1>  mov edx, %4
   253                              <1>  %endif
   253                              <1>  %endif
   253                              <1>  %endif
   253 00000190 B820000000          <1>  mov eax, %1
   253                              <1> 
   253 00000195 CD40                <1>  int 40h
   254                                  
   255                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   256                                  	
   257                                  	; Start	to play
   258 00000197 A0[200C0000]            	mov	al, [bps]
   259 0000019C C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   260 0000019F D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   261 000001A1 8A1D[1F0C0000]          	mov	bl, [stmo]
   262 000001A7 FECB                    	dec	bl
   263 000001A9 08C3                    	or	bl, al
   264 000001AB 668B0D[210C0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   265 000001B2 B704                    	mov	bh, 4 ; start to play	
   266                                  	sys	_audio
   266                              <1> 
   266                              <1> 
   266                              <1> 
   266                              <1> 
   266                              <1>  %if %0 >= 2
   266                              <1>  mov ebx, %2
   266                              <1>  %if %0 >= 3
   266                              <1>  mov ecx, %3
   266                              <1>  %if %0 = 4
   266                              <1>  mov edx, %4
   266                              <1>  %endif
   266                              <1>  %endif
   266                              <1>  %endif
   266 000001B4 B820000000          <1>  mov eax, %1
   266                              <1> 
   266 000001B9 CD40                <1>  int 40h
   267                                      
   268                                  	;; SETUP SIGNAL RESPONSE BYTE
   269                                  	;; 06/03/2017
   270                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   271                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   272                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   273                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   274                                  	;sys	_calbac
   275                                  	;jc	short error_exit
   276                                  
   277                                  	; DIRECT VGA MEMORY ACCESS
   278                                  	; bl = 0, bh = 5
   279                                  	; Direct access/map to VGA memory (0A0000h)
   280                                  
   281                                  	sys	_video, 0500h
   281                              <1> 
   281                              <1> 
   281                              <1> 
   281                              <1> 
   281                              <1>  %if %0 >= 2
   281 000001BB BB00050000          <1>  mov ebx, %2
   281                              <1>  %if %0 >= 3
   281                              <1>  mov ecx, %3
   281                              <1>  %if %0 = 4
   281                              <1>  mov edx, %4
   281                              <1>  %endif
   281                              <1>  %endif
   281                              <1>  %endif
   281 000001C0 B81F000000          <1>  mov eax, %1
   281                              <1> 
   281 000001C5 CD40                <1>  int 40h
   282 000001C7 3D00000A00              	cmp	eax, 0A0000h
   283 000001CC 7418                    	je	short _a3
   284                                  error_exit:
   285                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   285                              <1> 
   285                              <1> 
   285                              <1> 
   285                              <1> 
   285                              <1>  %if %0 >= 2
   285 000001CE BB[940B0000]        <1>  mov ebx, %2
   285                              <1>  %if %0 >= 3
   285 000001D3 B9FF000000          <1>  mov ecx, %3
   285                              <1>  %if %0 = 4
   285 000001D8 BA0E000000          <1>  mov edx, %4
   285                              <1>  %endif
   285                              <1>  %endif
   285                              <1>  %endif
   285 000001DD B823000000          <1>  mov eax, %1
   285                              <1> 
   285 000001E2 CD40                <1>  int 40h
   286 000001E4 EB16                    	jmp	short Exit
   287                                  
   288                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   289                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   290                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   291                                  ;       second, or the module will sound "looped".
   292                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   293                                  ;       the polling is called from my routine, and then the irq 0 must be
   294                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   295                                  ;       samples played by the Sound Blaster. Note that some samples are
   296                                  ;       discarded in the next code, just for fun!
   297                                  
   298                                  _a3:
   299 000001E6 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   300 000001EA CD31                    	int     31h
   301                                  
   302                                  	; 24/06/2017
   303 000001EC E839000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   304                                  
   305                                  _s_exit:
   306 000001F1 E861080000              	call	StopPlaying	; STOP!
   307                                  
   308 000001F6 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   309 000001FA CD31                    	int     31h
   310                                  Exit:           
   311                                  	;call    FreeModule	; Free MODule core.
   312                                  	
   313                                  	sys 	_exit	; Bye !
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1>  %if %0 >= 2
   313                              <1>  mov ebx, %2
   313                              <1>  %if %0 >= 3
   313                              <1>  mov ecx, %3
   313                              <1>  %if %0 = 4
   313                              <1>  mov edx, %4
   313                              <1>  %endif
   313                              <1>  %endif
   313                              <1>  %endif
   313 000001FC B801000000          <1>  mov eax, %1
   313                              <1> 
   313 00000201 CD40                <1>  int 40h
   314                                  here:
   315 00000203 EBFE                    	jmp	short here
   316                                  
   317                                  pmsg_2017:
   318                                  	sys	_msg, msg_2017, 255, 0Fh
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1> 
   318                              <1>  %if %0 >= 2
   318 00000205 BB[880A0000]        <1>  mov ebx, %2
   318                              <1>  %if %0 >= 3
   318 0000020A B9FF000000          <1>  mov ecx, %3
   318                              <1>  %if %0 = 4
   318 0000020F BA0F000000          <1>  mov edx, %4
   318                              <1>  %endif
   318                              <1>  %endif
   318                              <1>  %endif
   318 00000214 B823000000          <1>  mov eax, %1
   318                              <1> 
   318 00000219 CD40                <1>  int 40h
   319 0000021B EBDF                    	jmp	short Exit
   320                                  
   321                                  DetectSB16:
   322                                  	; 24/06/2017
   323                                  	; Detect (BH=1) SB16 (BL=1) Sound Card
   324                                          sys	_audio, 0101h
   324                              <1> 
   324                              <1> 
   324                              <1> 
   324                              <1> 
   324                              <1>  %if %0 >= 2
   324 0000021D BB01010000          <1>  mov ebx, %2
   324                              <1>  %if %0 >= 3
   324                              <1>  mov ecx, %3
   324                              <1>  %if %0 = 4
   324                              <1>  mov edx, %4
   324                              <1>  %endif
   324                              <1>  %endif
   324                              <1>  %endif
   324 00000222 B820000000          <1>  mov eax, %1
   324                              <1> 
   324 00000227 CD40                <1>  int 40h
   325 00000229 C3                      	retn
   326                                  
   327                                  ;sb16_int_handler:
   328                                  ;	; 24/06/2017
   329                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   330                                  ;
   331                                  ;	sys	_rele ; return from callback service 
   332                                  ;	; we must not come here !
   333                                  ;	sys	_exit
   334                                  
   335                                  ;=============================================================================
   336                                  ;      
   337                                  ;=============================================================================
   338                                  
   339                                  PlayMod:
   340                                  	; 23/06/2017   
   341                                  	; 21/06/2017
   342                                  	; 19/06/2017
   343                                  
   344                                  	; 05/03/2017 (TRDOS 386)
   345                                  	; 14/02/2017
   346                                  	; 13/02/2017
   347                                  	; 08/12/2016
   348                                  	; 28/11/2016
   349                                  
   350 0000022A EB10                         	jmp	short modp_gs ; 23/06/2017
   351                                  p_loop:
   352 0000022C 803D[450C0000]00        	cmp	byte [srb], 0
   353 00000233 7618                    	jna	short q_loop
   354 00000235 C605[450C0000]00        	mov	byte [srb], 0
   355                                  modp_gs:
   356 0000023C BF[00700000]            	mov	edi, Audio_Buffer
   357 00000241 BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   358 00000246 E8EB060000              	call	GetSamples
   359 0000024B 7281                    	jc	error_exit
   360                                  q_loop:
   361 0000024D B401                    	mov     ah, 1		; any key pressed?
   362 0000024F CD32                    	int     32h		; no, Loop.
   363 00000251 7405                    	jz	short r_loop
   364                                  
   365 00000253 B400                    	mov     ah, 0		; flush key buffer...
   366 00000255 CD32                    	int     32h
   367                                  q_return:
   368 00000257 C3                      	retn
   369                                  r_loop:
   370                                  	; Get Current DMA buffer Pointer 
   371                                  	; 23/06/2017
   372                                  	; bh = 15, get current pointer (DMA buffer offset)
   373                                  	; bl = 0, for PCM OUT
   374                                  	; ecx = 0
   375                                  	;
   376                                  	sys	_audio, 0F00h, 0
   376                              <1> 
   376                              <1> 
   376                              <1> 
   376                              <1> 
   376                              <1>  %if %0 >= 2
   376 00000258 BB000F0000          <1>  mov ebx, %2
   376                              <1>  %if %0 >= 3
   376 0000025D B900000000          <1>  mov ecx, %3
   376                              <1>  %if %0 = 4
   376                              <1>  mov edx, %4
   376                              <1>  %endif
   376                              <1>  %endif
   376                              <1>  %endif
   376 00000262 B820000000          <1>  mov eax, %1
   376                              <1> 
   376 00000267 CD40                <1>  int 40h
   377                                  ScopeLoop:
   378 00000269 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   379                                  	; 23/06/2017
   380 0000026E BE[00000100]            	mov     esi, DMA_Buffer
   381 00000273 01C6                    	add     esi, eax	; add offset value
   382                                  	; 24/06/2017
   383 00000275 B9[C0FE0100]            	mov	ecx, DMA_Buffer + (65536 - 320) 
   384 0000027A 39CE                    	cmp	esi, ecx 
   385 0000027C 7602                    	jna	short _4
   386 0000027E 89CE                    	mov	esi, ecx
   387                                  _4:
   388 00000280 31C9                    	xor     ecx, ecx	; to be drawed ...
   389 00000282 31D2                    	xor     edx, edx
   390                                  DrawLoop:       
   391 00000284 89D3                    	mov     ebx, edx	; (save Index)
   392 00000286 668BBB[E06A0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   393 0000028D C60700                  	mov     byte [edi], 0	; erase it!
   394                                  	;lodsb			; get a sample (8-bit)
   395                                  	;mov	bl, al
   396 00000290 8A1E                    	mov	bl, [esi]
   397 00000292 46                      	inc	esi
   398 00000293 30FF                    	xor     bh, bh
   399 00000295 66D1E3                  	shl     bx, 1
   400 00000298 668BBB[606D0000]        	mov     di, [RowOfs+ebx]
   401 0000029F 6601CF                  	add     di, cx
   402 000002A2 6689D3                  	mov     bx, dx		; (restore Index)
   403 000002A5 6689BB[E06A0000]        	mov     [Scope+ebx], di	; save new address...
   404 000002AC C6070A                  	mov     byte [edi], 10	; and DRAW.
   405 000002AF 6683C202                	add     dx, 2		; the next pixel...
   406 000002B3 41                      	inc     ecx
   407 000002B4 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   408 000002B9 72C9                    	jb      short DrawLoop
   409 000002BB E96CFFFFFF              	jmp	p_loop
   410                                  
   411                                  ;=============================================================================
   412                                  ;               MODLOAD.ASM
   413                                  ;=============================================================================
   414                                  
   415                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   416                                  ;	July 10th, 1993.
   417                                  
   418                                  ; STRUCTURES
   419                                  
   420                                  struc ModSample
   421 00000000 <res 00000016>          .msName:	resb 22
   422 00000016 <res 00000002>          .msLength:	resw 1
   423 00000018 <res 00000001>          .msFinetune:	resb 1
   424 00000019 <res 00000001>          .msVolume:	resb 1
   425 0000001A <res 00000002>          .msRepeat:	resw 1
   426 0000001C <res 00000002>          .msRepLen:	resw 1
   427                                  .size:
   428                                  endstruc
   429                                  
   430                                  struc ModHeader
   431 00000000 <res 00000014>          .mhName:	resb 20
   432 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   433 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   434 000003B7 <res 00000001>          .mhReStart:	resb 1
   435 000003B8 <res 00000080>          .mhOrder:	resb 128
   436 00000438 <res 00000004>          .mhSign:	resw 2
   437                                  .size:	
   438                                  endstruc
   439                                  
   440                                  struc ModInfoRec
   441 00000000 <res 00000001>          .OrderLen:	resb 1
   442 00000001 <res 00000001>          .ReStart:	resb 1
   443 00000002 <res 00000080>          .Order:	resb 128
   444 00000082 <res 00000004>          .Patterns:	resd 1
   445 00000086 <res 0000003E>          .SampOfs:	resw 31
   446 000000C4 <res 0000003E>          .SampSeg:	resw 31
   447 00000102 <res 0000003E>          .SampLen:	resw 31
   448 00000140 <res 0000003E>          .SampRep:	resw 31
   449 0000017E <res 0000003E>          .SampRepLen:	resw 31
   450 000001BC <res 0000003E>          .SampVol:	resw 31
   451                                  .size:	
   452                                  endstruc
   453                                  
   454                                  ; CODE
   455                                  
   456                                  LoadModule:
   457                                  	; edi = file name address
   458                                  
   459 000002C0 60                      	pushad
   460                                  
   461 000002C1 66C705[480C0000]01-     	mov	word [ErrorInfo], 1
   461 000002C9 00                 
   462                                  
   463 000002CA E88F010000              	call    ClearModInfo
   464                                  OpenFile:       
   465                                  	; ebx = ASCIIZ file name address
   466                                  	; ecx = open mode (0 = open for read)	
   467                                  	sys	_open, edi, 0 ; open for reading
   467                              <1> 
   467                              <1> 
   467                              <1> 
   467                              <1> 
   467                              <1>  %if %0 >= 2
   467 000002CF 89FB                <1>  mov ebx, %2
   467                              <1>  %if %0 >= 3
   467 000002D1 B900000000          <1>  mov ecx, %3
   467                              <1>  %if %0 = 4
   467                              <1>  mov edx, %4
   467                              <1>  %endif
   467                              <1>  %endif
   467                              <1>  %endif
   467 000002D6 B805000000          <1>  mov eax, %1
   467                              <1> 
   467 000002DB CD40                <1>  int 40h
   468 000002DD 0F8279010000            	jc	Failed
   469 000002E3 A3[460C0000]            	mov     [FileHandle], eax
   470                                  ReadHeader:
   471                                  	; ebx = File handle
   472                                  	; ecx = Buffer address
   473                                  	; edx = Byte count
   474                                  	sys	_read, [FileHandle], Header, ModHeader.size
   474                              <1> 
   474                              <1> 
   474                              <1> 
   474                              <1> 
   474                              <1>  %if %0 >= 2
   474 000002E8 8B1D[460C0000]      <1>  mov ebx, %2
   474                              <1>  %if %0 >= 3
   474 000002EE B9[4A0C0000]        <1>  mov ecx, %3
   474                              <1>  %if %0 = 4
   474 000002F3 BA3C040000          <1>  mov edx, %4
   474                              <1>  %endif
   474                              <1>  %endif
   474                              <1>  %endif
   474 000002F8 B803000000          <1>  mov eax, %1
   474                              <1> 
   474 000002FD CD40                <1>  int 40h
   475 000002FF 0F824A010000            	jc      CloseFile
   476                                  CheckMK:        
   477 00000305 813D[82100000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   477 0000030D 4B2E               
   478 0000030F 7440                    	je      short IsModFile
   479                                  CheckFLT4:
   480 00000311 813D[82100000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   480 00000319 5434               
   481 0000031B 7434                    	je      short IsModFile
   482                                  Is15Inst:
   483 0000031D BE[200E0000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   484 00000322 BF[00100000]            	mov     edi, Header+ModHeader.mhOrderLen
   485                                  	;cld
   486                                  	;mov	ecx, 130
   487 00000327 66B98200                	mov	cx, 130
   488 0000032B F3A4                    	rep     movsb
   489 0000032D BF[200E0000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   490 00000332 30C0                    	xor     al, al
   491 00000334 66B9E001                	mov     cx, 16*ModSample.size
   492 00000338 F3AA                    	rep     stosb
   493                                  SeekPatterns:   
   494                                  	; ebx = [FileHandle]
   495                                  	; ecx = offset
   496                                  	; edx = switch (0 = from beginning)
   497                                  	sys	_seek, [FileHandle], 600, 0
   497                              <1> 
   497                              <1> 
   497                              <1> 
   497                              <1> 
   497                              <1>  %if %0 >= 2
   497 0000033A 8B1D[460C0000]      <1>  mov ebx, %2
   497                              <1>  %if %0 >= 3
   497 00000340 B958020000          <1>  mov ecx, %3
   497                              <1>  %if %0 = 4
   497 00000345 BA00000000          <1>  mov edx, %4
   497                              <1>  %endif
   497                              <1>  %endif
   497                              <1>  %endif
   497 0000034A B813000000          <1>  mov eax, %1
   497                              <1> 
   497 0000034F CD40                <1>  int 40h
   498                                  IsModFile:
   499 00000351 A0[00100000]            	mov     al, [Header+ModHeader.mhOrderLen]
   500 00000356 A2[86100000]            	mov     [ModInfo.OrderLen], al
   501                                  
   502 0000035B A0[01100000]            	mov     al, [Header+ModHeader.mhReStart]
   503 00000360 3A05[00100000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   504 00000366 7202                    	jb      short SetReStart
   505 00000368 B07F                    	mov     al, 7Fh
   506                                  SetReStart:
   507 0000036A A2[87100000]            	mov     [ModInfo.ReStart], al
   508                                  
   509                                  	;mov	ecx, 128
   510 0000036F 66B98000                	mov	cx, 128
   511 00000373 31D2                    	xor     edx, edx
   512 00000375 31DB                    	xor     ebx, ebx
   513                                  CopyOrder:
   514 00000377 8AB3[02100000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   515 0000037D 88B3[88100000]          	mov     [ModInfo.Order+ebx], dh
   516 00000383 38D6                    	cmp     dh, dl
   517 00000385 7202                    	jb      short NextOrder
   518 00000387 88F2                    	mov     dl, dh
   519                                  NextOrder:
   520 00000389 43                      	inc     ebx
   521 0000038A E2EB                    	loop    CopyOrder
   522                                  AllocPatterns:  
   523 0000038C 81E2FF000000            	and	edx, 0FFh
   524 00000392 6642                    	inc	dx ; 14/03/2017
   525                                  	; dl = count of 1024 bytes
   526 00000394 C1E20A                  	shl	edx, 10 ; *1024
   527                                  
   528 00000397 89D5                    	mov	ebp, edx
   529                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   530 00000399 B9[00000200]            	mov	ecx, file_buffer ; 12/03/2017
   531                                  	;
   532 0000039E 890D[08110000]          	mov	[ModInfo.Patterns], ecx
   533                                  	;
   534 000003A4 01CD                    	add	ebp, ecx ; next offset for samples
   535                                  ReadPatterns:  
   536                                  	;mov	ebx, [FileHandle] 
   537                                  	; ebx = File handle
   538                                  	; ecx = Buffer address
   539                                  	; edx = Byte count
   540                                  	sys	_read, [FileHandle]
   540                              <1> 
   540                              <1> 
   540                              <1> 
   540                              <1> 
   540                              <1>  %if %0 >= 2
   540 000003A6 8B1D[460C0000]      <1>  mov ebx, %2
   540                              <1>  %if %0 >= 3
   540                              <1>  mov ecx, %3
   540                              <1>  %if %0 = 4
   540                              <1>  mov edx, %4
   540                              <1>  %endif
   540                              <1>  %endif
   540                              <1>  %endif
   540 000003AC B803000000          <1>  mov eax, %1
   540                              <1> 
   540 000003B1 CD40                <1>  int 40h
   541 000003B3 0F8296000000            	jc      CloseFile
   542                                  
   543 000003B9 BE[5E0C0000]            	mov	esi, Header+ModHeader.mhSamples
   544 000003BE 31FF                    	xor     edi, edi
   545                                  CopySamples:
   546 000003C0 668B4616                	mov     ax, [esi+ModSample.msLength]
   547 000003C4 86C4                    	xchg    al, ah
   548 000003C6 66D1E0                  	shl     ax, 1
   549 000003C9 668987[88110000]        	mov     [ModInfo.SampLen+edi], ax
   550 000003D0 8A4619                  	mov     al, [esi+ModSample.msVolume]
   551 000003D3 30E4                    	xor     ah, ah
   552 000003D5 668987[42120000]        	mov     [ModInfo.SampVol+edi], ax
   553 000003DC 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   554 000003E0 86C4                    	xchg    al, ah
   555 000003E2 66D1E0                  	shl     ax, 1
   556 000003E5 668987[C6110000]        	mov     [ModInfo.SampRep+edi], ax
   557 000003EC 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   558 000003F0 86C4                    	xchg    al, ah
   559 000003F2 66D1E0                  	shl     ax, 1
   560 000003F5 668987[04120000]        	mov     [ModInfo.SampRepLen+edi], ax
   561 000003FC 83C61E                  	add     esi, ModSample.size
   562 000003FF 6683C702                	add     di, 2
   563 00000403 6683FF3E                	cmp     di, 2*31
   564 00000407 72B7                    	jb      short CopySamples
   565                                  
   566 00000409 31F6                    	xor     esi, esi
   567                                  AllocSamples:
   568 0000040B 0FB796[88110000]        	movzx	edx, word [ModInfo.SampLen+esi]
   569 00000412 09D2                    	or	edx, edx ; byte count
   570 00000414 7426                    	jz      short NextSample
   571 00000416 89E8                    	mov	eax, ebp
   572 00000418 668986[0C110000]        	mov	[ModInfo.SampOfs+esi], ax
   573 0000041F C1E810                  	shr	eax, 16
   574 00000422 668986[4A110000]        	mov	[ModInfo.SampSeg+esi], ax
   575 00000429 89E9                    	mov	ecx, ebp
   576 0000042B 01D5                    	add	ebp, edx ; next offset for sample 
   577                                  ReadSample:
   578                                  	;mov	ebx, [FileHandle]
   579                                  	;movzx  edx, [ModInfo.SampLen+esi]
   580                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   581                                  
   582                                  	; ebx = File handle
   583                                  	; ecx = Buffer address
   584                                  	; edx = Byte count
   585                                  	sys	_read, [FileHandle]
   585                              <1> 
   585                              <1> 
   585                              <1> 
   585                              <1> 
   585                              <1>  %if %0 >= 2
   585 0000042D 8B1D[460C0000]      <1>  mov ebx, %2
   585                              <1>  %if %0 >= 3
   585                              <1>  mov ecx, %3
   585                              <1>  %if %0 = 4
   585                              <1>  mov edx, %4
   585                              <1>  %endif
   585                              <1>  %endif
   585                              <1>  %endif
   585 00000433 B803000000          <1>  mov eax, %1
   585                              <1> 
   585 00000438 CD40                <1>  int 40h
   586 0000043A 7213                    	jc      short CloseFile
   587                                  
   588                                  NextSample:
   589 0000043C 6683C602                	add     si, 2
   590 00000440 6683FE3E                	cmp     si, 2*31
   591 00000444 72C5                    	jb      short AllocSamples
   592                                  
   593 00000446 66C705[480C0000]00-     	mov     word [ErrorInfo], 0
   593 0000044E 00                 
   594                                  CloseFile:      
   595                                  	sys	_close, [FileHandle]
   595                              <1> 
   595                              <1> 
   595                              <1> 
   595                              <1> 
   595                              <1>  %if %0 >= 2
   595 0000044F 8B1D[460C0000]      <1>  mov ebx, %2
   595                              <1>  %if %0 >= 3
   595                              <1>  mov ecx, %3
   595                              <1>  %if %0 = 4
   595                              <1>  mov edx, %4
   595                              <1>  %endif
   595                              <1>  %endif
   595                              <1>  %endif
   595 00000455 B806000000          <1>  mov eax, %1
   595                              <1> 
   595 0000045A CD40                <1>  int 40h
   596                                  Failed:         
   597 0000045C 61                      	popad
   598                                  
   599 0000045D C3                      	retn
   600                                  
   601                                  FreeModule:
   602                                  	; Erdogan Tan (13/02/2017)
   603                                  	; nothing to do here for memory de-allocation
   604                                  ClearModInfo:
   605 0000045E 57                      	push	edi
   606 0000045F BF[86100000]            	mov	edi, ModInfo
   607 00000464 B9FA010000              	mov     ecx, ModInfoRec.size
   608                                  	;cld
   609 00000469 30C0                    	xor     al, al
   610 0000046B F3AA                    	rep     stosb
   611 0000046D 5F                      	pop	edi
   612 0000046E C3                      	retn
   613                                  
   614                                  ;=============================================================================
   615                                  ;               MODPLAY.ASM
   616                                  ;=============================================================================
   617                                  
   618                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   619                                  ;	July 23th, 1993.
   620                                  
   621                                  ; EQUATES
   622                                  
   623                                  NumTracks       equ 4
   624                                  DefTempo        equ 6
   625                                  DefBpm          equ 125
   626                                  MidCRate        equ 8448
   627                                  MixBufSize      equ 4096
   628                                  
   629                                  ; STRUCTURES
   630                                  
   631                                  struc TrackInfo
   632 00000000 <res 00000004>          .Samples:	resd 1
   633 00000004 <res 00000004>          .Position:	resd 1
   634 00000008 <res 00000002>          .Len:	resw 1
   635 0000000A <res 00000002>          .Repeat:	resw 1
   636 0000000C <res 00000002>          .RepLen:	resw 1
   637 0000000E <res 00000001>          .Volume: 	resb 1
   638 0000000F <res 00000001>          .Error:	resb 1
   639 00000010 <res 00000002>          .Period:	resw 1
   640 00000012 <res 00000002>          .Pitch:	resw 1
   641 00000014 <res 00000002>          .Effect:	resw 1
   642 00000016 <res 00000002>          .PortTo:	resw 1
   643 00000018 <res 00000001>          .PortParm:	resb 1
   644 00000019 <res 00000001>          .VibPos:	resb 1
   645 0000001A <res 00000001>          .VibParm:	resb 1
   646 0000001B <res 00000001>          .OldSampOfs:	resb 1
   647 0000001C <res 00000006>          .Arp:	resw 3
   648 00000022 <res 00000002>          .ArpIndex:	resw 1
   649                                  .size:
   650                                  endstruc
   651                                  
   652                                  ; CODE
   653                                  
   654                                  ;--------------------------------------------------------------------------
   655                                  ; BeatTrack:  Process the next beat in one track.
   656                                  ;  In:
   657                                  ;    ds:di -  Track info Address.
   658                                  ;--------------------------------------------------------------------------
   659                                  
   660                                  ; edi = Track info address
   661                                  
   662                                  BeatTrack:
   663 0000046F 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   664 00000473 6685D2                  	test    dx, dx
   665 00000476 743C                    	je      short None
   666 00000478 80FE00                  	cmp     dh, 00h
   667 0000047B 7438                    	je      short Arpeggio
   668 0000047D 80FE01                  	cmp     dh, 01h
   669 00000480 7451                    	je      short PortUp
   670 00000482 80FE02                  	cmp     dh, 02h
   671 00000485 7471                    	je      short PortDown
   672 00000487 80FE03                  	cmp     dh, 03h
   673 0000048A 0F848E000000            	je      TonePort
   674 00000490 80FE04                  	cmp     dh, 04h
   675 00000493 0F84BD000000            	je      Vibrato
   676 00000499 80FE05                  	cmp     dh, 05h
   677 0000049C 0F840E010000            	je      PortSlide
   678 000004A2 80FE06                  	cmp     dh, 06h
   679 000004A5 0F8412010000            	je      VibSlide
   680 000004AB 80FE0A                  	cmp     dh, 0Ah
   681 000004AE 0F8413010000            	je      VolSlide
   682                                  None:           
   683 000004B4 C3                      	retn
   684                                  Arpeggio:
   685 000004B5 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   686 000004B9 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   687 000004BE 66894712                	mov     [edi+TrackInfo.Pitch], ax
   688 000004C2 6683C302                	add     bx, 2
   689 000004C6 6683FB06                	cmp     bx, 6
   690 000004CA 7202                    	jb      short SetArpIndex
   691 000004CC 31DB                    	xor     ebx, ebx
   692                                  SetArpIndex:
   693 000004CE 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   694 000004D2 C3                      	retn
   695                                  PortUp:
   696 000004D3 30F6                    	xor     dh, dh
   697 000004D5 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   698 000004D9 6629D3                  	sub     bx, dx
   699 000004DC 6683FB71                	cmp     bx, 113
   700 000004E0 7D04                    	jge     short NotSmall
   701 000004E2 66BB7100                	mov     bx, 113
   702                                  NotSmall:
   703 000004E6 66895F10                	mov     [edi+TrackInfo.Period], bx
   704 000004EA 6601DB                  	add     bx, bx
   705 000004ED 66678B87[8012]          	mov     ax, [PitchTable+bx]
   706 000004F3 66894712                	mov     [edi+TrackInfo.Pitch], ax
   707 000004F7 C3                      	retn
   708                                  PortDown:
   709 000004F8 30F6                    	xor     dh, dh
   710 000004FA 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   711 000004FE 6601D3                  	add     bx, dx
   712 00000501 6681FB5803              	cmp     bx, 856
   713 00000506 7E04                    	jle     short NotBig
   714 00000508 66BB5803                	mov     bx, 856
   715 0000050C 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   716 00000510 6601DB                  	add     bx, bx
   717 00000513 66678B87[8012]          	mov     ax, [PitchTable+bx]
   718 00000519 66894712                	mov     [edi+TrackInfo.Pitch], ax
   719 0000051D C3                      	retn
   720                                  TonePort:
   721 0000051E 30F6                    	xor     dh, dh
   722 00000520 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   723 00000524 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   724 00000528 6639C3                  	cmp     bx, ax
   725 0000052B 7428                    	je      short NoPort
   726 0000052D 7F0D                    	jg      short PortToUp
   727                                  PortToDown:     
   728 0000052F 6601D3                  	add     bx, dx
   729 00000532 6639C3                  	cmp     bx, ax
   730 00000535 7E0D                    	jle     short SetPort
   731                                  FixPort:        
   732 00000537 6689C3                  	mov     bx, ax
   733 0000053A EB08                    	jmp     short SetPort
   734                                  PortToUp:
   735 0000053C 6629D3                  	sub     bx, dx
   736 0000053F 6639C3                  	cmp     bx, ax
   737 00000542 7CF3                    	jl      short FixPort
   738                                  SetPort:        
   739 00000544 66895F10                	mov     [edi+TrackInfo.Period], bx
   740 00000548 6601DB                  	add     bx, bx
   741 0000054B 66678B87[8012]          	mov     ax, [PitchTable+bx]
   742 00000551 66894712                	mov     [edi+TrackInfo.Pitch], ax
   743                                  NoPort:         
   744 00000555 C3                      	retn
   745                                  Vibrato:
   746 00000556 88D6                    	mov     dh, dl
   747 00000558 80E20F                  	and     dl, 0Fh
   748 0000055B C0EE04                  	shr     dh, 4
   749 0000055E C0E602                  	shl     dh, 2
   750 00000561 007719                  	add     [edi+TrackInfo.VibPos], dh
   751 00000564 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   752 00000567 88F3                    	mov     bl, dh
   753 00000569 C0EB02                  	shr     bl, 2
   754 0000056C 6683E31F                	and     bx, 1Fh
   755 00000570 678A87[B40B]            	mov     al, [SinTable+bx]
   756 00000575 F6E2                    	mul     dl
   757 00000577 66D1C0                  	rol     ax, 1
   758 0000057A 86C4                    	xchg    al, ah
   759 0000057C 80E401                  	and     ah, 1
   760 0000057F 84F6                    	test    dh, dh
   761 00000581 7903                    	jns     short VibUp
   762 00000583 66F7D8                  	neg     ax
   763                                  VibUp:          
   764 00000586 66034710                	add     ax, [edi+TrackInfo.Period]
   765 0000058A 6689C3                  	mov     bx, ax
   766 0000058D 6683FB71                	cmp     bx, 113
   767 00000591 7D04                    	jge     short NoLoVib
   768 00000593 66BB7100                	mov     bx, 113
   769                                  NoLoVib:        
   770 00000597 6681FB5803              	cmp     bx, 856
   771 0000059C 7E04                    	jle     short NoHiVib
   772 0000059E 66BB5803                	mov     bx, 856
   773                                  NoHiVib:        
   774 000005A2 6601DB                  	add     bx, bx
   775 000005A5 66678B87[8012]          	mov     ax, [PitchTable+bx]
   776 000005AB 66894712                	mov     [edi+TrackInfo.Pitch], ax
   777 000005AF C3                      	retn
   778                                  PortSlide:
   779 000005B0 E812000000              	call    VolSlide
   780 000005B5 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   781 000005B8 E961FFFFFF              	jmp     TonePort
   782                                  VibSlide:
   783 000005BD E805000000              	call    VolSlide
   784 000005C2 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   785 000005C5 EB8F                    	jmp     short Vibrato
   786                                  VolSlide:
   787 000005C7 88D6                    	mov     dh, dl
   788 000005C9 80E20F                  	and     dl, 0Fh
   789 000005CC C0EE04                  	shr     dh, 4
   790 000005CF 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   791 000005D2 28D0                    	sub     al, dl
   792 000005D4 7D02                    	jge     short NoLoVol
   793 000005D6 30C0                    	xor     al, al
   794                                  NoLoVol:        
   795 000005D8 00F0                    	add     al, dh
   796 000005DA 3C40                    	cmp     al, 64
   797 000005DC 7602                    	jbe     short NoHiVol
   798 000005DE B040                    	mov     al, 64
   799                                  NoHiVol:        
   800 000005E0 88470E                  	mov     [edi+TrackInfo.Volume], al
   801 000005E3 C3                      	retn
   802                                  
   803                                  ;--------------------------------------------------------------------------
   804                                  ; GetTrack:   Get the next Note from a pattern.
   805                                  ;  In:
   806                                  ;    ds:di -  Track info Address.
   807                                  ;    es:si -  Pattern Note Address.
   808                                  ; Out:
   809                                  ;    es:si -  The Next Pattern Note address.
   810                                  ;--------------------------------------------------------------------------
   811                                  
   812                                  ; esi = Pattern note address
   813                                  ; edi = Track info address
   814                                  
   815                                  GetTrack:
   816 000005E4 66AD                    	lodsw
   817 000005E6 86C4                    	xchg    al, ah
   818 000005E8 88E3                    	mov	bl, ah
   819 000005EA 80E40F                  	and     ah, 0Fh
   820 000005ED 6689C1                  	mov     cx, ax
   821 000005F0 66AD                    	lodsw
   822 000005F2 86C4                    	xchg    al, ah
   823 000005F4 88E7                    	mov     bh, ah
   824 000005F6 80E40F                  	and     ah, 0Fh
   825 000005F9 6689C2                  	mov     dx, ax
   826 000005FC 66895714                	mov     [edi+TrackInfo.Effect], dx
   827 00000600 80E3F0                  	and     bl, 0F0h
   828 00000603 C0EF04                  	shr     bh, 4
   829 00000606 08FB                    	or      bl, bh
   830 00000608 7449                    	je      short SetPeriod
   831                                  SetSample:
   832                                  	;xor    bh, bh
   833 0000060A 81E3FF000000            	and	ebx, 0FFh
   834 00000610 4B                      	dec     ebx
   835 00000611 01DB                    	add     ebx, ebx
   836 00000613 668B83[42120000]        	mov     ax, [ModInfo.SampVol+ebx]
   837 0000061A 88470E                  	mov     [edi+TrackInfo.Volume], al
   838 0000061D 668B83[0C110000]        	mov     ax, [ModInfo.SampOfs+ebx]
   839 00000624 668907                  	mov     [edi+TrackInfo.Samples], ax
   840 00000627 668B83[4A110000]        	mov     ax, [ModInfo.SampSeg+ebx]
   841 0000062E 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   842 00000632 668B83[88110000]        	mov     ax, [ModInfo.SampLen+ebx]
   843 00000639 66894708                	mov     [edi+TrackInfo.Len], ax
   844 0000063D 668B83[C6110000]        	mov     ax, [ModInfo.SampRep+ebx]
   845 00000644 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   846 00000648 668B83[04120000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   847 0000064F 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   848                                  SetPeriod:      
   849 00000653 6685C9                  	test    cx, cx
   850 00000656 7424                    	jz      short SetEffect
   851                                  
   852 00000658 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   853 0000065C 80FE03                  	cmp     dh, 03h
   854 0000065F 741B                    	je      short SetEffect
   855                                  
   856 00000661 66894F10                	mov     [edi+TrackInfo.Period], cx
   857 00000665 6689CB                  	mov     bx, cx
   858 00000668 6601DB                  	add     bx, bx
   859 0000066B 66678B87[8012]          	mov     ax, [PitchTable+bx]
   860 00000671 66894712                	mov     [edi+TrackInfo.Pitch], ax
   861 00000675 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   862                                  SetEffect:
   863 0000067C 6685D2                  	test    dx, dx
   864 0000067F 7430                    	jz      short InitNone
   865 00000681 80FE00                  	cmp     dh, 00h
   866 00000684 0F84E5000000            	je      InitArpeggio
   867 0000068A 80FE03                  	cmp     dh, 03h
   868 0000068D 7423                    	je      short InitTonePort
   869 0000068F 80FE04                  	cmp     dh, 04h
   870 00000692 742D                    	je      short InitVibrato
   871 00000694 80FE09                  	cmp     dh, 09h
   872 00000697 7451                    	je      short SampleOfs
   873 00000699 80FE0B                  	cmp     dh, 0Bh
   874 0000069C 7462                    	je      short PosJump
   875 0000069E 80FE0C                  	cmp     dh, 0Ch
   876 000006A1 746B                    	je      short SetVolume
   877 000006A3 80FE0D                  	cmp     dh, 0Dh
   878 000006A6 7471                    	je      short Break
   879 000006A8 80FE0F                  	cmp     dh, 0Fh
   880 000006AB 0F8487000000            	je      SetSpeed
   881                                  InitNone:
   882 000006B1 C3                      	retn
   883                                  InitTonePort:
   884 000006B2 84D2                    	test    dl, dl
   885 000006B4 7503                    	jnz     short SetPortParm
   886 000006B6 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   887                                  SetPortParm:    
   888 000006B9 885718                  	mov     [edi+TrackInfo.PortParm], dl
   889 000006BC 66895714                	mov     [edi+TrackInfo.Effect], dx
   890 000006C0 C3                      	retn
   891                                  InitVibrato:
   892 000006C1 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   893 000006C4 88C4                    	mov     ah, al
   894 000006C6 240F                    	and     al, 0Fh
   895 000006C8 80E4F0                  	and     ah, 0F0h
   896 000006CB F6C20F                  	test    dl, 0Fh
   897 000006CE 7502                    	jne     short OkDepth
   898 000006D0 08C2                    	or      dl, al
   899                                  OkDepth:        
   900 000006D2 F6C2F0                  	test    dl, 0F0h
   901 000006D5 7502                    	jnz     short OkRate
   902 000006D7 08E2                    	or      dl, ah
   903                                  OkRate:         
   904 000006D9 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   905 000006DC 66895714                	mov     [edi+TrackInfo.Effect], dx
   906 000006E0 6685C9                  	test    cx, cx
   907 000006E3 7404                    	jz      short OkPos
   908 000006E5 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   909                                  OkPos:          
   910 000006E9 C3                      	retn
   911                                  SampleOfs:      
   912 000006EA 84D2                    	test    dl, dl
   913 000006EC 7503                    	jnz     short SetSampleOfs
   914 000006EE 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   915                                  SetSampleOfs:
   916 000006F1 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   917 000006F4 88D6                    	mov     dh, dl
   918 000006F6 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   919 000006FC 895704                  	mov     [edi+TrackInfo.Position], edx
   920 000006FF C3                      	retn
   921                                  PosJump:
   922 00000700 8815[326A0000]          	mov     [OrderPos], dl
   923 00000706 C605[366A0000]40        	mov     byte [Row], 64
   924 0000070D C3                      	retn
   925                                  SetVolume:
   926 0000070E 80FA40                  	cmp     dl, 64
   927 00000711 7602                    	jbe     short OkVol
   928 00000713 B240                    	mov     dl, 64
   929                                  OkVol:
   930 00000715 88570E                  	mov     [edi+TrackInfo.Volume], dl
   931 00000718 C3                      	retn
   932                                  Break:
   933 00000719 88D6                    	mov     dh, dl
   934 0000071B 80E20F                  	and     dl, 0Fh
   935 0000071E C0EE04                  	shr     dh, 4
   936 00000721 00F6                    	add     dh, dh
   937 00000723 00F2                    	add     dl, dh
   938 00000725 C0E602                  	shl     dh, 2
   939 00000728 00F2                    	add     dl, dh
   940 0000072A 8815[376A0000]          	mov     [BreakRow], dl
   941 00000730 C605[366A0000]40        	mov     byte [Row], 64
   942 00000737 C3                      	retn
   943                                  SetSpeed:
   944 00000738 84D2                    	test    dl,dl
   945 0000073A 7432                    	je      Skip
   946 0000073C 80FA1F                  	cmp     dl,31
   947 0000073F 770D                    	ja      short SetBpm
   948                                  SetTempo:       
   949 00000741 8815[336A0000]          	mov     [Tempo], dl
   950 00000747 8815[346A0000]          	mov     [TempoWait], dl
   951 0000074D C3                      	retn
   952                                  SetBpm:
   953 0000074E 8815[356A0000]          	mov     [Bpm], dl
   954 00000754 B067                    	mov     al, 103
   955 00000756 F6E2                    	mul     dl
   956 00000758 88E3                    	mov     bl, ah
   957 0000075A 30FF                    	xor     bh, bh
   958 0000075C 66A1[210C0000]          	mov     ax, [MixSpeed]
   959 00000762 6631D2                  	xor     dx, dx
   960 00000765 66F7F3                  	div     bx
   961 00000768 66A3[386A0000]          	mov     [BpmSamples], ax
   962                                  Skip:           
   963 0000076E C3                      	retn
   964                                  InitArpeggio:
   965 0000076F 88D6                    	mov     dh, dl
   966 00000771 80E20F                  	and     dl, 0Fh
   967 00000774 C0EE04                  	shr     dh, 4
   968 00000777 66B92400                	mov     cx, 36
   969 0000077B 31DB                    	xor     ebx, ebx
   970 0000077D 668B4710                	mov     ax, [edi+TrackInfo.Period]
   971                                  gt_ScanPeriod:
   972 00000781 66673B87[D40B]          	cmp     ax, [PeriodTable+bx]
   973 00000787 7306                    	jae     short SetArp
   974 00000789 6683C302                	add     bx, 2
   975 0000078D E2F2                    	loop    gt_ScanPeriod
   976                                  SetArp:         
   977 0000078F 6601D2                  	add     dx, dx
   978 00000792 00DE                    	add     dh, bl
   979 00000794 00DA                    	add     dl, bl
   980 00000796 66678B9F[D40B]          	mov     bx, [PeriodTable+bx]
   981 0000079C 6601DB                  	add     bx, bx
   982 0000079F 66678B87[8012]          	mov     ax, [PitchTable+bx]
   983 000007A5 6689471C                	mov     [edi+TrackInfo.Arp], ax
   984 000007A9 88F3                    	mov     bl, dh
   985 000007AB 30FF                    	xor     bh, bh
   986 000007AD 66678B9F[D40B]          	mov     bx, [PeriodTable+bx]
   987 000007B3 6601DB                  	add     bx, bx
   988 000007B6 66678B87[8012]          	mov     ax, [PitchTable+bx]
   989 000007BC 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
   990 000007C0 88D3                    	mov     bl, dl
   991 000007C2 30FF                    	xor     bh, bh
   992 000007C4 66678B9F[D40B]          	mov     bx, [PeriodTable+bx]
   993 000007CA 6601DB                  	add     bx, bx
   994 000007CD 66678B87[8012]          	mov     ax, [PitchTable+bx]
   995 000007D3 66894720                	mov     [edi+TrackInfo.Arp+4], ax
   996 000007D7 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
   997 000007DD C3                      	retn
   998                                  
   999                                  ;--------------------------------------------------------------------------
  1000                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1001                                  ;--------------------------------------------------------------------------
  1002                                  
  1003                                  UpdateTracks:
  1004 000007DE FE0D[346A0000]          	dec     byte [TempoWait]
  1005 000007E4 7415                    	jz      short GetTracks
  1006                                  
  1007 000007E6 B904000000              	mov	ecx, NumTracks
  1008 000007EB BF[486A0000]            	mov	edi, Tracks
  1009                                  BeatTracks:
  1010 000007F0 E87AFCFFFF              	call	BeatTrack	
  1011 000007F5 83C724                  	add	edi, TrackInfo.size
  1012 000007F8 E2F6                    	loop	BeatTracks
  1013 000007FA C3                      	retn
  1014                                  GetTracks:
  1015 000007FB A0[336A0000]            	mov     al, [Tempo]
  1016 00000800 A2[346A0000]            	mov     [TempoWait], al
  1017                                  
  1018 00000805 8B35[446A0000]          	mov	esi, [Note]
  1019 0000080B 803D[366A0000]40        	cmp     byte [Row], 64
  1020 00000812 7263                    	jb      short NoPattWrap
  1021                                  
  1022 00000814 8B35[08110000]          	mov	esi, [ModInfo.Patterns]
  1023 0000081A 8A1D[326A0000]          	mov     bl, [OrderPos]
  1024 00000820 3A1D[86100000]          	cmp     bl, [ModInfo.OrderLen]
  1025 00000826 7214                    	jb      short NoOrderWrap
  1026 00000828 8A1D[87100000]          	mov     bl, [ModInfo.ReStart]
  1027 0000082E 881D[326A0000]          	mov     [OrderPos], bl
  1028 00000834 3A1D[86100000]          	cmp     bl, [ModInfo.OrderLen]
  1029 0000083A 735D                    	jae     short NoUpdate
  1030                                  NoOrderWrap:    
  1031                                  	;xor	bh, bh
  1032 0000083C 81E3FF000000            	and	ebx, 0FFh
  1033 00000842 8A9B[88100000]          	mov     bl, [ModInfo.Order+ebx]
  1034 00000848 C1E30A                  	shl     ebx, 10 ; *1024
  1035 0000084B 01DE                    	add     esi, ebx
  1036 0000084D 8A1D[376A0000]          	mov     bl, [BreakRow]
  1037 00000853 881D[366A0000]          	mov     [Row], bl
  1038                                  	;xor     bh, bh
  1039 00000859 81E3FF000000            	and	ebx, 0FFh
  1040 0000085F 883D[376A0000]          	mov     [BreakRow], bh ; 0
  1041 00000865 66C1E304                	shl     bx, 4
  1042 00000869 01DE                    	add     esi, ebx
  1043 0000086B 8935[446A0000]          	mov     [Note], esi
  1044 00000871 FE05[326A0000]          	inc     byte [OrderPos]
  1045                                  NoPattWrap:     
  1046 00000877 FE05[366A0000]          	inc     byte [Row]
  1047                                  
  1048                                  	;cld
  1049 0000087D B904000000              	mov	ecx, NumTracks
  1050 00000882 BF[486A0000]            	mov	edi, Tracks
  1051                                  GetTracks_next:
  1052 00000887 51                      	push	ecx	
  1053 00000888 E857FDFFFF              	call	GetTrack
  1054 0000088D 59                      	pop	ecx
  1055 0000088E 83C724                  	add	edi, TrackInfo.size
  1056 00000891 E2F4                    	loop	GetTracks_next
  1057                                  
  1058 00000893 8935[446A0000]          	mov     [Note], esi
  1059                                  NoUpdate:
  1060 00000899 C3                      	retn
  1061                                  
  1062                                  ;--------------------------------------------------------------------------
  1063                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1064                                  ;  In:
  1065                                  ;   ds:si -  Track Info Address.
  1066                                  ;   ds:di -  Buffer Address.
  1067                                  ;    cx   -  Buffer Size.
  1068                                  ;--------------------------------------------------------------------------
  1069                                  
  1070                                  ; esi = Track info address
  1071                                  ; edi = Buffer address
  1072                                  ; ecx = Buffer size
  1073                                  
  1074                                  MixTrack:
  1075 0000089A 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1076 0000089F 7748                    	ja      short MixLooped
  1077                                  MixNonLooped:   
  1078 000008A1 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1079 000008A3 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1080 000008A6 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1081 000008AA 52                      	push    edx
  1082 000008AB 56                      	push    esi
  1083 000008AC 01D3                    	add     ebx, edx
  1084 000008AE 01D5                    	add     ebp, edx
  1085 000008B0 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1086 000008B4 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1087 000008B7 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1088 000008BA 89DE                    	mov     esi, ebx
  1089 000008BC 88C7                    	mov     bh, al
  1090 000008BE 88D0                    	mov     al, dl
  1091 000008C0 88F2                    	mov     dl, dh
  1092                                  	;xor	dh, dh
  1093 000008C2 81E2FF000000            	and	edx, 0FFh
  1094                                  nlMixSamp:      
  1095 000008C8 39EE                    	cmp     esi, ebp
  1096 000008CA 7310                    	jae     short nlMixBye
  1097 000008CC 8A1E                    	mov     bl, [esi]
  1098 000008CE 678A9F[3219]            	mov     bl, [VolTable+bx]
  1099 000008D3 001F                    	add     [edi], bl
  1100 000008D5 47                      	inc     edi
  1101 000008D6 00C4                    	add     ah, al
  1102 000008D8 11D6                    	adc     esi, edx
  1103 000008DA E2EC                    	loop    nlMixSamp
  1104                                  nlMixBye:       
  1105 000008DC 89F3                    	mov     ebx, esi
  1106 000008DE 5E                      	pop     esi
  1107 000008DF 5A                      	pop     edx
  1108 000008E0 29D3                    	sub     ebx, edx
  1109 000008E2 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1110 000008E5 88660F                  	mov     [esi+TrackInfo.Error], ah
  1111 000008E8 C3                      	retn
  1112                                  MixLooped:
  1113 000008E9 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1114 000008EB 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1115 000008EE 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1116 000008F2 892D[406A0000]          	mov     [BufRep], ebp
  1117 000008F8 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1118 000008FB 52                      	push    edx
  1119 000008FC 56                      	push    esi
  1120 000008FD 01D3                    	add     ebx, edx
  1121 000008FF 01D5                    	add     ebp, edx
  1122 00000901 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1123 00000905 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1124 00000908 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1125 0000090B 6689DE                  	mov     si, bx
  1126 0000090E 88C7                    	mov     bh, al
  1127 00000910 88D0                    	mov     al, dl
  1128 00000912 88F2                    	mov     dl, dh
  1129                                  	;xor	dh, dh
  1130 00000914 81E2FF000000            	and	edx, 0FFh
  1131                                  lpMixSamp:      
  1132 0000091A 39EE                    	cmp     esi, ebp
  1133 0000091C 7206                    	jb      short lpMixNow
  1134 0000091E 2B35[406A0000]          	sub     esi, [BufRep]
  1135                                  lpMixNow:       
  1136 00000924 8A1E                    	mov     bl, [esi]
  1137 00000926 678A9F[3219]            	mov     bl, [VolTable+bx]
  1138 0000092B 001F                    	add     [edi], bl
  1139 0000092D 47                      	inc     edi
  1140 0000092E 00C4                    	add     ah, al
  1141 00000930 11D6                    	adc	esi, edx
  1142 00000932 E2E6                    	loop    lpMixSamp
  1143                                  lpMixBye:       
  1144                                  ;	mov     ebx, esi
  1145                                  ;	pop     esi
  1146                                  ;	pop     edx
  1147                                  ;	sub     ebx, edx
  1148                                  ;	mov     [esi+TrackInfo.Position], ebx
  1149                                  ;	mov     [esi+TrackInfo.Error], ah
  1150                                  ;	retn
  1151 00000934 EBA6                    	jmp	short nlMixBye
  1152                                  
  1153                                  ;--------------------------------------------------------------------------
  1154                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1155                                  ;  In:
  1156                                  ;    Buffer  - Buffer Address.
  1157                                  ;    Count   - Buffer Size.
  1158                                  ;--------------------------------------------------------------------------
  1159                                  
  1160                                  GetSamples:
  1161                                  	; edi = buffer address
  1162                                  	; ebx = count
  1163                                  
  1164 00000936 60                      	pushad
  1165                                  
  1166                                  	;cld
  1167                                  NextChunk:      
  1168 00000937 66833D[3E6A0000]00      	cmp     word [BufLen], 0
  1169 0000093F 7548                    	jne     short CopyChunk
  1170                                  
  1171 00000941 53                      	push    ebx
  1172 00000942 57                      	push    edi
  1173                                  MixChunk:       
  1174 00000943 BF[325A0000]            	mov	edi, MixBuffer
  1175 00000948 0FB70D[386A0000]        	movzx	ecx, word [BpmSamples]
  1176 0000094F 893D[3A6A0000]          	mov     [BufPtr], edi
  1177 00000955 66890D[3E6A0000]        	mov     [BufLen], cx
  1178                                  
  1179 0000095C B080                    	mov     al, 80h
  1180 0000095E F3AA                    	rep     stosb
  1181                                  
  1182 00000960 66B90400                	mov	cx, NumTracks
  1183 00000964 BE[246A0000]            	mov	esi, Tracks - TrackInfo.size
  1184                                  GetSamples_next:
  1185 00000969 51                      	push	ecx
  1186 0000096A 83C624                  	add	esi, TrackInfo.size
  1187 0000096D 668B0D[3E6A0000]        	mov	cx, [BufLen]
  1188 00000974 8B3D[3A6A0000]          	mov	edi, [BufPtr]
  1189 0000097A E81BFFFFFF              	call	MixTrack
  1190 0000097F 59                      	pop	ecx
  1191 00000980 E2E7                    	loop	GetSamples_next	
  1192                                  
  1193 00000982 E857FEFFFF              	call    UpdateTracks
  1194                                  
  1195 00000987 5F                      	pop     edi
  1196 00000988 5B                      	pop     ebx
  1197                                  CopyChunk:      
  1198                                  	;mov	cx, [BufLen]
  1199 00000989 0FB70D[3E6A0000]        	movzx	ecx, word [BufLen]
  1200 00000990 39D9                    	cmp	ecx, ebx
  1201                                  	;cmp	cx, bx
  1202 00000992 7602                    	jbe     short MoveChunk
  1203                                  	;mov	cx, bx
  1204 00000994 89D9                    	mov     ecx, ebx
  1205                                  MoveChunk:
  1206 00000996 8B35[3A6A0000]          	mov     esi, [BufPtr]
  1207 0000099C 010D[3A6A0000]          	add     [BufPtr], ecx
  1208 000009A2 66290D[3E6A0000]        	sub     [BufLen], cx
  1209 000009A9 29CB                    	sub     ebx, ecx
  1210 000009AB F3A4                    	rep     movsb
  1211 000009AD 85DB                    	test    ebx, ebx
  1212 000009AF 7586                    	jnz     short NextChunk
  1213                                  
  1214 000009B1 61                      	popad
  1215 000009B2 C3                      	retn
  1216                                  
  1217                                  ;--------------------------------------------------------------------------
  1218                                  ; StartPlaying: Initializes the Sound System.
  1219                                  ;  In:
  1220                                  ;   Module Information Resources.
  1221                                  ;--------------------------------------------------------------------------
  1222                                  
  1223                                  StartPlaying:
  1224 000009B3 60                      	pushad
  1225                                  SetModParms:    
  1226 000009B4 C605[326A0000]00        	mov     byte [OrderPos], 0
  1227 000009BB C605[336A0000]06        	mov     byte [Tempo], DefTempo
  1228 000009C2 C605[346A0000]06        	mov     byte [TempoWait], DefTempo
  1229 000009C9 C605[356A0000]7D        	mov     byte [Bpm], DefBpm
  1230 000009D0 C605[366A0000]40        	mov     byte [Row], 64
  1231 000009D7 C605[376A0000]00        	mov     byte [BreakRow], 0
  1232 000009DE 66A1[210C0000]          	mov     ax, [MixSpeed]
  1233 000009E4 31D2                    	xor     edx, edx
  1234 000009E6 66BB3200                	mov     bx, 24*DefBpm/60
  1235 000009EA 66F7F3                  	div     bx
  1236 000009ED 66A3[386A0000]          	mov     [BpmSamples], ax
  1237                                  ClearTracks:    
  1238 000009F3 BF[486A0000]            	mov     edi, Tracks
  1239 000009F8 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1240 000009FD 31C0                    	xor     eax, eax
  1241                                  	;cld
  1242 000009FF F3AA                    	rep     stosb
  1243                                  
  1244 00000A01 A3[3A6A0000]            	mov     [BufPtr], eax
  1245 00000A06 66A3[3E6A0000]          	mov     [BufLen], ax
  1246                                  MakePitch:
  1247 00000A0C 66B80021                	mov     ax, MidCRate
  1248 00000A10 66BBAC01                	mov     bx, 428
  1249 00000A14 66F7E3                  	mul     bx
  1250 00000A17 66F735[210C0000]        	div     word [MixSpeed]
  1251 00000A1E 30F6                    	xor     dh, dh
  1252 00000A20 88E2                    	mov     dl, ah
  1253 00000A22 88C4                    	mov     ah, al
  1254 00000A24 30C0                    	xor     al, al
  1255 00000A26 66B95903                	mov     cx, 857
  1256 00000A2A 31DB                    	xor     ebx, ebx
  1257 00000A2C BF[80120000]            	mov     edi, PitchTable
  1258                                  PitchLoop:      
  1259 00000A31 50                      	push    eax
  1260 00000A32 52                      	push    edx
  1261 00000A33 6639DA                  	cmp     dx, bx
  1262 00000A36 7303                    	jae     short NoDiv
  1263 00000A38 66F7F3                  	div     bx
  1264                                  NoDiv:          
  1265 00000A3B 66AB                    	stosw
  1266 00000A3D 5A                      	pop     edx
  1267 00000A3E 58                      	pop     eax
  1268 00000A3F 43                      	inc     ebx
  1269 00000A40 E2EF                    	loop    PitchLoop
  1270                                  MakeVolume:     
  1271 00000A42 66B90041                	mov     cx, 16640
  1272 00000A46 89CB                    	mov     ebx, ecx
  1273                                  VolLoop:
  1274 00000A48 4B                      	dec     ebx
  1275 00000A49 88D8                    	mov     al, bl
  1276 00000A4B F6EF                    	imul    bh
  1277 00000A4D 88A3[32190000]          	mov     [VolTable+ebx], ah
  1278 00000A53 E2F3                    	loop    VolLoop
  1279                                  
  1280 00000A55 61                      	popad
  1281 00000A56 C3                      	retn
  1282                                  
  1283                                  ;--------------------------------------------------------------------------
  1284                                  ; StopPlaying: ShutDown the Sound System.
  1285                                  ;--------------------------------------------------------------------------
  1286                                  
  1287                                  StopPlaying:
  1288                                  	; 19/06/2017
  1289                                  	; Stop Playing
  1290                                  	sys	_audio, 0700h
  1290                              <1> 
  1290                              <1> 
  1290                              <1> 
  1290                              <1> 
  1290                              <1>  %if %0 >= 2
  1290 00000A57 BB00070000          <1>  mov ebx, %2
  1290                              <1>  %if %0 >= 3
  1290                              <1>  mov ecx, %3
  1290                              <1>  %if %0 = 4
  1290                              <1>  mov edx, %4
  1290                              <1>  %endif
  1290                              <1>  %endif
  1290                              <1>  %endif
  1290 00000A5C B820000000          <1>  mov eax, %1
  1290                              <1> 
  1290 00000A61 CD40                <1>  int 40h
  1291                                  	; Cancel callback service (for user)
  1292                                  	sys	_audio, 0900h
  1292                              <1> 
  1292                              <1> 
  1292                              <1> 
  1292                              <1> 
  1292                              <1>  %if %0 >= 2
  1292 00000A63 BB00090000          <1>  mov ebx, %2
  1292                              <1>  %if %0 >= 3
  1292                              <1>  mov ecx, %3
  1292                              <1>  %if %0 = 4
  1292                              <1>  mov edx, %4
  1292                              <1>  %endif
  1292                              <1>  %endif
  1292                              <1>  %endif
  1292 00000A68 B820000000          <1>  mov eax, %1
  1292                              <1> 
  1292 00000A6D CD40                <1>  int 40h
  1293                                  	; Deallocate Audio Buffer (for user)
  1294                                  	sys	_audio, 0A00h
  1294                              <1> 
  1294                              <1> 
  1294                              <1> 
  1294                              <1> 
  1294                              <1>  %if %0 >= 2
  1294 00000A6F BB000A0000          <1>  mov ebx, %2
  1294                              <1>  %if %0 >= 3
  1294                              <1>  mov ecx, %3
  1294                              <1>  %if %0 = 4
  1294                              <1>  mov edx, %4
  1294                              <1>  %endif
  1294                              <1>  %endif
  1294                              <1>  %endif
  1294 00000A74 B820000000          <1>  mov eax, %1
  1294                              <1> 
  1294 00000A79 CD40                <1>  int 40h
  1295                                  	; Disable Audio Device
  1296                                  	sys	_audio, 0C00h
  1296                              <1> 
  1296                              <1> 
  1296                              <1> 
  1296                              <1> 
  1296                              <1>  %if %0 >= 2
  1296 00000A7B BB000C0000          <1>  mov ebx, %2
  1296                              <1>  %if %0 >= 3
  1296                              <1>  mov ecx, %3
  1296                              <1>  %if %0 = 4
  1296                              <1>  mov edx, %4
  1296                              <1>  %endif
  1296                              <1>  %endif
  1296                              <1>  %endif
  1296 00000A80 B820000000          <1>  mov eax, %1
  1296                              <1> 
  1296 00000A85 CD40                <1>  int 40h
  1297                                  
  1298 00000A87 C3                      	retn
  1299                                  
  1300                                  ;=============================================================================
  1301                                  ;               preinitialized data
  1302                                  ;=============================================================================
  1303                                  
  1304                                  ;=============================================================================
  1305                                  ;               PLAY.ASM - DATA
  1306                                  ;=============================================================================
  1307                                  
  1308                                  msg_2017:
  1309 00000A88 54696E79204D4F4420-     		db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1309 00000A91 506C6179657220666F-
  1309 00000A9A 72205452444F532033-
  1309 00000AA3 383620627920457264-
  1309 00000AAC 6F67616E2054616E2E-
  1309 00000AB5 20                 
  1310 00000AB6 4A756E652032303137-     		db 'June 2017.',10,13
  1310 00000ABF 2E0A0D             
  1311 00000AC2 75736167653A206D6F-     		db 'usage: modplay filename.mod', 10,13,0
  1311 00000ACB 64706C61792066696C-
  1311 00000AD4 656E616D652E6D6F64-
  1311 00000ADD 0A0D00             
  1312 00000AE0 32352F30362F323031-     		db '25/06/2017',10,13,0
  1312 00000AE9 370A0D00           
  1313                                  
  1314 00000AED 54696E79204D4F4420-     Credits:	db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1314 00000AF6 506C61796572207630-
  1314 00000AFF 2E3162206279204361-
  1314 00000B08 726C6F732048617361-
  1314 00000B11 6E2E204A756C792031-
  1314 00000B1A 3939332E           
  1315 00000B1E 0A0D00                  		db 10,13,0
  1316 00000B21 4572726F72206C6F61-     ErrorMesg:	db 'Error loading Module file.',10,13,0
  1316 00000B2A 64696E67204D6F6475-
  1316 00000B33 6C652066696C652E0A-
  1316 00000B3C 0D00               
  1317 00000B3E 536F756E6420426C61-     MsgNotFound:	db 'Sound Blaster not found or IRQ error.',10,13,0
  1317 00000B47 73746572206E6F7420-
  1317 00000B50 666F756E64206F7220-
  1317 00000B59 495251206572726F72-
  1317 00000B62 2E0A0D00           
  1318 00000B66 536F756E6420426C61-     MsgFound:	db 'Sound Blaster found at Address 2'
  1318 00000B6F 7374657220666F756E-
  1318 00000B78 642061742041646472-
  1318 00000B81 6573732032         
  1319 00000B86 7830682C2049525120      PortText:	db 'x0h, IRQ '
  1320 00000B8F 782E0A0D00              IrqText:	db 'x.',10,13,0
  1321                                  
  1322                                  trdos386_err_msg:
  1323 00000B94 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  1323 00000B9D 2053797374656D2063-
  1323 00000BA6 616C6C206572726F72-
  1323 00000BAF 20210A0D00         
  1324                                  
  1325                                  ;=============================================================================
  1326                                  ;               MODPLAY.ASM - DATA
  1327                                  ;=============================================================================
  1328                                  
  1329                                  ;Credits:	db 'Amiga Module Player v0.3b by Carlos Hasan.'
  1330                                  
  1331 00000BB4 0019324A62788EA2B4-     SinTable:	db 0,25,50,74,98,120,142,162,180,197,212,225
  1331 00000BBD C5D4E1             
  1332 00000BC0 ECF4FAFEFFFEFAF4EC-     		db 236,244,250,254,255,254,250,244,236,225
  1332 00000BC9 E1                 
  1333 00000BCA D4C5B4A28E78624A32-     		db 212,197,180,162,142,120,98,74,50,25
  1333 00000BD3 19                 
  1334                                  
  1335 00000BD4 58032803FA02D002A6-     PeriodTable:	dw 856,808,762,720,678,640,604,570,538,508,480,453
  1335 00000BDD 0280025C023A021A02-
  1335 00000BE6 FC01E001C501       
  1336 00000BEC AC0194017D01680153-     		dw 428,404,381,360,339,320,302,285,269,254,240,226
  1336 00000BF5 0140012E011D010D01-
  1336 00000BFE FE00F000E200       
  1337 00000C04 D600CA00BE00B400AA-     		dw 214,202,190,180,170,160,151,143,135,127,120,113
  1337 00000C0D 00A00097008F008700-
  1337 00000C16 7F0078007100       
  1338                                  
  1339                                  ;=============================================================================
  1340                                  ;               SB.ASM - DATA
  1341                                  ;=============================================================================
  1342                                  
  1343 00000C1C 2002                    SbAddr:		dw 220h
  1344 00000C1E 07                      SbIrq:		db 7
  1345                                  
  1346                                  ;=============================================================================
  1347                                  ;               PLAYER.ASM - DATA
  1348                                  ;=============================================================================
  1349                                  
  1350 00000C1F 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1351 00000C20 08                      bps:		db 8 ; bits per sample (8 or 16)
  1352                                  Sample_Rate:
  1353 00000C21 2256                    MixSpeed:	dw 22050 ; Hz
  1354                                  
  1355                                  ; 13/11/2016
  1356 00000C23 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1356 00000C2C 3941424344454600   
  1357                                  ;
  1358                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1359                                  ;codec_id:	   dd 0
  1360                                  ;codec_chip_id:	   dd 0
  1361                                  ;codec_vendor_ids: dw 0
  1362                                  ;codec_chip_ids:   dw 0
  1363                                  
  1364                                  ;dword_str:	dd 30303030h, 30303030h
  1365                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1366                                  
  1367                                  ;=============================================================================
  1368                                  ;        	uninitialized data
  1369                                  ;=============================================================================
  1370                                  
  1371                                  bss_start:
  1372                                  
  1373                                  ABSOLUTE bss_start
  1374                                  
  1375                                  alignb 4
  1376                                  
  1377 00000C34 <res 00000004>          dev_vendor:	resd 1
  1378 00000C38 <res 00000004>          bus_dev_fn:	resd 1
  1379 00000C3C <res 00000004>          stats_cmd:	resd 1
  1380 00000C40 <res 00000002>          ac97_NamBar:	resw 1
  1381 00000C42 <res 00000002>          ac97_NabmBar:	resw 1
  1382 00000C44 <res 00000001>          ac97_int_ln_reg: resb 1
  1383 00000C45 <res 00000001>          srb:		resb 1
  1384                                  
  1385                                  ; MODLOAD.ASM
  1386 00000C46 <res 00000002>          FileHandle:	resw 1
  1387 00000C48 <res 00000002>          ErrorInfo:	resw 1
  1388 00000C4A <res 0000043C>          Header:	resb	ModHeader.size
  1389                                  
  1390                                  ; MODPLAY.ASM
  1391                                  ;MixSpeed:	    resw 1
  1392                                  
  1393                                  ModInfo:
  1394 00001086 <res 00000001>          ModInfo.OrderLen:   resb 1
  1395 00001087 <res 00000001>          ModInfo.ReStart:    resb 1
  1396 00001088 <res 00000080>          ModInfo.Order:	    resb 128
  1397 00001108 <res 00000004>          ModInfo.Patterns:   resd 1
  1398                                  
  1399 0000110C <res 0000003E>          ModInfo.SampOfs:    resw 31
  1400 0000114A <res 0000003E>          ModInfo.SampSeg:    resw 31
  1401 00001188 <res 0000003E>          ModInfo.SampLen:    resw 31
  1402 000011C6 <res 0000003E>          ModInfo.SampRep:    resw 31
  1403 00001204 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1404 00001242 <res 0000003E>          ModInfo.SampVol:    resw 31
  1405                                  
  1406                                  ; MODPLAY.ASM
  1407 00001280 <res 000006B2>          PitchTable:	resw 857
  1408 00001932 <res 00004100>          VolTable:	resb 16640
  1409 00005A32 <res 00001000>          MixBuffer       resb MixBufSize
  1410                                  
  1411                                  ; MODPLAY.ASM
  1412 00006A32 <res 00000001>          OrderPos:	resb 1
  1413 00006A33 <res 00000001>          Tempo:		resb 1
  1414 00006A34 <res 00000001>          TempoWait:	resb 1
  1415 00006A35 <res 00000001>          Bpm:		resb 1
  1416 00006A36 <res 00000001>          Row:		resb 1
  1417 00006A37 <res 00000001>          BreakRow:	resb 1
  1418 00006A38 <res 00000002>          BpmSamples:	resw 1
  1419 00006A3A <res 00000004>          BufPtr:		resd 1
  1420 00006A3E <res 00000002>          BufLen:		resw 1
  1421 00006A40 <res 00000004>          BufRep:		resd 1
  1422 00006A44 <res 00000004>          Note:		resd 1
  1423 00006A48 <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1424                                  
  1425 00006AD8 <res 00000008>          alignb 16
  1426                                  
  1427                                  ; PLAY.ASM
  1428 00006AE0 <res 00000280>          Scope:		resw 320
  1429 00006D60 <res 00000200>          RowOfs:		resw 256
  1430                                  
  1431                                  mod_file_name:
  1432 00006F60 <res 00000050>          		resb 80
  1433                                  
  1434 00006FB0 <res 00000050>          alignb 4096
  1435                                  
  1436                                  Audio_Buffer:
  1437 00007000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1438 0000F000 <res 00001000>          alignb 65536
  1439                                  
  1440                                  DMA_Buffer:
  1441 00010000 <res 00010000>          		resb 65536	
  1442                                  file_buffer:
  1443 00020000 <res 00060000>          		resb 65536*6
  1444                                  EOF:
