     1                                  ; ****************************************************************************
     2                                  ; modplay5.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; MODPLAY5.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[00000700]            	mov	ecx, EOF
   115 00000005 BF[2F0C0000]            	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 E8EF010000              	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[390B0000]        <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 E9B1010000                      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 0F82AE010000            	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 0F849C010000            	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[E80A0000]        <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 0F8211010000            	jc	error_exit
   176                                  _2:
   177                                  	; Initialize Audio Device (bl = 1 -> Interrrupt method)
   178                                  	sys	_audio, 0301h, 0, sb16_int_handler 
   178                              <1> 
   178                              <1> 
   178                              <1> 
   178                              <1> 
   178                              <1>  %if %0 >= 2
   178 000000A7 BB01030000          <1>  mov ebx, %2
   178                              <1>  %if %0 >= 3
   178 000000AC B900000000          <1>  mov ecx, %3
   178                              <1>  %if %0 = 4
   178 000000B1 BA[14020000]        <1>  mov edx, %4
   178                              <1>  %endif
   178                              <1>  %endif
   178                              <1>  %endif
   178 000000B6 B820000000          <1>  mov eax, %1
   178                              <1> 
   178 000000BB CD40                <1>  int 40h
   179 000000BD 0F82F5000000            	jc	error_exit
   180                                  	
   181                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   182                                  	;sys	_audio, 0300h, 1, srb 
   183                                  	;jc	error_exit
   184                                  
   185                                  LoadMod:  
   186 000000C3 BF[606F0000]            	mov	edi, mod_file_name
   187 000000C8 E8EE010000              	call    LoadModule		; Load the MODule...
   188                                  
   189 000000CD 66833D[440C0000]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[1C0B0000]        <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 E9F4000000              	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 0F82B4000000            	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[170C0000]        	mov	[SbAddr], dx
   212 0000010B A2[190C0000]            	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[810B0000]          	mov     [PortText], dl
   220 0000011C 0430                    	add     al, '0'
   221 0000011E A2[8A0B0000]            	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[610B0000]        <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 E870080000              	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 E8E4070000              	call	GetSamples
   232 0000014D 7269                    	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
   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 00000170 BB800B0000          <1>  mov ebx, %2
   253                              <1>  %if %0 >= 3
   253 00000175 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 0000017A B820000000          <1>  mov eax, %1
   253                              <1> 
   253 0000017F CD40                <1>  int 40h
   254                                  
   255                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   256                                  	
   257                                  	; Start	to play
   258 00000181 A0[1B0C0000]            	mov	al, [bps]
   259 00000186 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   260 00000189 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   261 0000018B 8A1D[1A0C0000]          	mov	bl, [stmo]
   262 00000191 FECB                    	dec	bl
   263 00000193 08C3                    	or	bl, al
   264 00000195 668B0D[1C0C0000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   265 0000019C 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 0000019E B820000000          <1>  mov eax, %1
   266                              <1> 
   266 000001A3 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 000001A5 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 000001AA B81F000000          <1>  mov eax, %1
   281                              <1> 
   281 000001AF CD40                <1>  int 40h
   282 000001B1 3D00000A00              	cmp	eax, 0A0000h
   283 000001B6 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 000001B8 BB[8F0B0000]        <1>  mov ebx, %2
   285                              <1>  %if %0 >= 3
   285 000001BD B9FF000000          <1>  mov ecx, %3
   285                              <1>  %if %0 = 4
   285 000001C2 BA0E000000          <1>  mov edx, %4
   285                              <1>  %endif
   285                              <1>  %endif
   285                              <1>  %endif
   285 000001C7 B823000000          <1>  mov eax, %1
   285                              <1> 
   285 000001CC CD40                <1>  int 40h
   286 000001CE 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 000001D0 66B81300                	mov     ax, 0013h	; Set Mode 320x200x256
   300 000001D4 CD31                    	int     31h
   301                                  
   302                                  	; 24/06/2017
   303 000001D6 E84E000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   304                                  
   305                                  _s_exit:
   306 000001DB E872080000              	call	StopPlaying	; STOP!
   307                                  
   308 000001E0 66B80300                	mov     ax, 0003h	; Set Text Mode 80x25x16
   309 000001E4 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 000001E6 B801000000          <1>  mov eax, %1
   313                              <1> 
   313 000001EB CD40                <1>  int 40h
   314                                  here:
   315 000001ED 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 000001EF BB[830A0000]        <1>  mov ebx, %2
   318                              <1>  %if %0 >= 3
   318 000001F4 B9FF000000          <1>  mov ecx, %3
   318                              <1>  %if %0 = 4
   318 000001F9 BA0F000000          <1>  mov edx, %4
   318                              <1>  %endif
   318                              <1>  %endif
   318                              <1>  %endif
   318 000001FE B823000000          <1>  mov eax, %1
   318                              <1> 
   318 00000203 CD40                <1>  int 40h
   319 00000205 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 00000207 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 0000020C B820000000          <1>  mov eax, %1
   324                              <1> 
   324 00000211 CD40                <1>  int 40h
   325 00000213 C3                      	retn
   326                                  
   327                                  sb16_int_handler:
   328                                  	; 24/06/2017
   329 00000214 C605[410C0000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   330                                  
   331                                  	sys	_rele ; return from callback service 
   331                              <1> 
   331                              <1> 
   331                              <1> 
   331                              <1> 
   331                              <1>  %if %0 >= 2
   331                              <1>  mov ebx, %2
   331                              <1>  %if %0 >= 3
   331                              <1>  mov ecx, %3
   331                              <1>  %if %0 = 4
   331                              <1>  mov edx, %4
   331                              <1>  %endif
   331                              <1>  %endif
   331                              <1>  %endif
   331 0000021B B827000000          <1>  mov eax, %1
   331                              <1> 
   331 00000220 CD40                <1>  int 40h
   332                                  	; we must not come here !
   333                                  	sys	_exit
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1> 
   333                              <1>  %if %0 >= 2
   333                              <1>  mov ebx, %2
   333                              <1>  %if %0 >= 3
   333                              <1>  mov ecx, %3
   333                              <1>  %if %0 = 4
   333                              <1>  mov edx, %4
   333                              <1>  %endif
   333                              <1>  %endif
   333                              <1>  %endif
   333 00000222 B801000000          <1>  mov eax, %1
   333                              <1> 
   333 00000227 CD40                <1>  int 40h
   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 00000229 EB10                         	jmp	short modp_gs ; 23/06/2017
   351                                  p_loop:
   352 0000022B 803D[410C0000]00        	cmp	byte [srb], 0
   353 00000232 761C                    	jna	short q_loop
   354 00000234 C605[410C0000]00        	mov	byte [srb], 0
   355                                  modp_gs:
   356 0000023B BF[00700000]            	mov	edi, Audio_Buffer
   357 00000240 BB00800000              	mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   358 00000245 E8E7060000              	call	GetSamples
   359 0000024A 0F8268FFFFFF            	jc	error_exit
   360                                  q_loop:
   361 00000250 B401                    	mov     ah, 1		; any key pressed?
   362 00000252 CD32                    	int     32h		; no, Loop.
   363 00000254 7405                    	jz	short r_loop
   364                                  
   365 00000256 B400                    	mov     ah, 0		; flush key buffer...
   366 00000258 CD32                    	int     32h
   367                                  q_return:
   368 0000025A 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
   377                                  	
   378                                  	; Get Current Sound Data (in DMA buffer) ((320 bytes)) 
   379                                  	; 25/06/2017
   380                                  	; 22/06/2017
   381                                  	; bh = 15, get current sound data/samples
   382                                  	; bl = 0, for PCM OUT
   383                                  	; ecx = count of sample/data bytes (1 to 4096)
   384                                  	; edx = destination buffer address 
   385                                  	;	(page aligned address is better)
   386                                  	;
   387                                  	sys	_audio, 0F00h, 320, g_buff
   387                              <1> 
   387                              <1> 
   387                              <1> 
   387                              <1> 
   387                              <1>  %if %0 >= 2
   387 0000025B BB000F0000          <1>  mov ebx, %2
   387                              <1>  %if %0 >= 3
   387 00000260 B940010000          <1>  mov ecx, %3
   387                              <1>  %if %0 = 4
   387 00000265 BA[00F00000]        <1>  mov edx, %4
   387                              <1>  %endif
   387                              <1>  %endif
   387                              <1>  %endif
   387 0000026A B820000000          <1>  mov eax, %1
   387                              <1> 
   387 0000026F CD40                <1>  int 40h
   388                                  ScopeLoop:
   389 00000271 BF00000A00              	mov	edi, 0A0000h	; VGA display memory address
   390                                  	; 23/06/2017
   391                                  	;mov     esi, DMA_Buffer
   392                                  	;add     esi, eax	; add offset value
   393                                  	;; 24/06/2017
   394                                  	;mov	ecx, DMA_Buffer + (65536 - 320) 
   395                                  	;cmp	esi, ecx 
   396                                  	;jna	short _4
   397                                  	;mov	esi, ecx
   398                                  	; 25/06/2017
   399                                  	; 19/06/2017
   400 00000276 BE[00F00000]            	mov     esi, g_buff	; display current samples
   401 0000027B 31C9                    _4:	xor     ecx, ecx	; to be drawed ...
   402 0000027D 31D2                    	xor     edx, edx
   403                                  DrawLoop:       
   404 0000027F 89D3                    	mov     ebx, edx	; (save Index)
   405 00000281 668BBB[E06A0000]        	mov     di, [Scope+ebx]	; get old SCOPE pixel address
   406 00000288 C60700                  	mov     byte [edi], 0	; erase it!
   407                                  	;lodsb			; get a sample (8-bit)
   408                                  	;mov	bl, al
   409 0000028B 8A1E                    	mov	bl, [esi]
   410 0000028D 46                      	inc	esi
   411 0000028E 30FF                    	xor     bh, bh
   412 00000290 66D1E3                  	shl     bx, 1
   413 00000293 668BBB[606D0000]        	mov     di, [RowOfs+ebx]
   414 0000029A 6601CF                  	add     di, cx
   415 0000029D 6689D3                  	mov     bx, dx		; (restore Index)
   416 000002A0 6689BB[E06A0000]        	mov     [Scope+ebx], di	; save new address...
   417 000002A7 C6070A                  	mov     byte [edi], 10	; and DRAW.
   418 000002AA 6683C202                	add     dx, 2		; the next pixel...
   419 000002AE 41                      	inc     ecx
   420 000002AF 6681F94001              	cmp     cx, 320		; 320 pixels drawed?
   421 000002B4 72C9                    	jb      short DrawLoop
   422 000002B6 E970FFFFFF              	jmp	p_loop
   423                                  
   424                                  ;=============================================================================
   425                                  ;               MODLOAD.ASM
   426                                  ;=============================================================================
   427                                  
   428                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   429                                  ;	July 10th, 1993.
   430                                  
   431                                  ; STRUCTURES
   432                                  
   433                                  struc ModSample
   434 00000000 <res 00000016>          .msName:	resb 22
   435 00000016 <res 00000002>          .msLength:	resw 1
   436 00000018 <res 00000001>          .msFinetune:	resb 1
   437 00000019 <res 00000001>          .msVolume:	resb 1
   438 0000001A <res 00000002>          .msRepeat:	resw 1
   439 0000001C <res 00000002>          .msRepLen:	resw 1
   440                                  .size:
   441                                  endstruc
   442                                  
   443                                  struc ModHeader
   444 00000000 <res 00000014>          .mhName:	resb 20
   445 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   446 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   447 000003B7 <res 00000001>          .mhReStart:	resb 1
   448 000003B8 <res 00000080>          .mhOrder:	resb 128
   449 00000438 <res 00000004>          .mhSign:	resw 2
   450                                  .size:	
   451                                  endstruc
   452                                  
   453                                  struc ModInfoRec
   454 00000000 <res 00000001>          .OrderLen:	resb 1
   455 00000001 <res 00000001>          .ReStart:	resb 1
   456 00000002 <res 00000080>          .Order:	resb 128
   457 00000082 <res 00000004>          .Patterns:	resd 1
   458 00000086 <res 0000003E>          .SampOfs:	resw 31
   459 000000C4 <res 0000003E>          .SampSeg:	resw 31
   460 00000102 <res 0000003E>          .SampLen:	resw 31
   461 00000140 <res 0000003E>          .SampRep:	resw 31
   462 0000017E <res 0000003E>          .SampRepLen:	resw 31
   463 000001BC <res 0000003E>          .SampVol:	resw 31
   464                                  .size:	
   465                                  endstruc
   466                                  
   467                                  ; CODE
   468                                  
   469                                  LoadModule:
   470                                  	; edi = file name address
   471                                  
   472 000002BB 60                      	pushad
   473                                  
   474 000002BC 66C705[440C0000]01-     	mov	word [ErrorInfo], 1
   474 000002C4 00                 
   475                                  
   476 000002C5 E88F010000              	call    ClearModInfo
   477                                  OpenFile:       
   478                                  	; ebx = ASCIIZ file name address
   479                                  	; ecx = open mode (0 = open for read)	
   480                                  	sys	_open, edi, 0 ; open for reading
   480                              <1> 
   480                              <1> 
   480                              <1> 
   480                              <1> 
   480                              <1>  %if %0 >= 2
   480 000002CA 89FB                <1>  mov ebx, %2
   480                              <1>  %if %0 >= 3
   480 000002CC B900000000          <1>  mov ecx, %3
   480                              <1>  %if %0 = 4
   480                              <1>  mov edx, %4
   480                              <1>  %endif
   480                              <1>  %endif
   480                              <1>  %endif
   480 000002D1 B805000000          <1>  mov eax, %1
   480                              <1> 
   480 000002D6 CD40                <1>  int 40h
   481 000002D8 0F8279010000            	jc	Failed
   482 000002DE A3[420C0000]            	mov     [FileHandle], eax
   483                                  ReadHeader:
   484                                  	; ebx = File handle
   485                                  	; ecx = Buffer address
   486                                  	; edx = Byte count
   487                                  	sys	_read, [FileHandle], Header, ModHeader.size
   487                              <1> 
   487                              <1> 
   487                              <1> 
   487                              <1> 
   487                              <1>  %if %0 >= 2
   487 000002E3 8B1D[420C0000]      <1>  mov ebx, %2
   487                              <1>  %if %0 >= 3
   487 000002E9 B9[460C0000]        <1>  mov ecx, %3
   487                              <1>  %if %0 = 4
   487 000002EE BA3C040000          <1>  mov edx, %4
   487                              <1>  %endif
   487                              <1>  %endif
   487                              <1>  %endif
   487 000002F3 B803000000          <1>  mov eax, %1
   487                              <1> 
   487 000002F8 CD40                <1>  int 40h
   488 000002FA 0F824A010000            	jc      CloseFile
   489                                  CheckMK:        
   490 00000300 813D[7E100000]4D2E-     	cmp     dword [Header+ModHeader.mhSign], 'M.K.'
   490 00000308 4B2E               
   491 0000030A 7440                    	je      short IsModFile
   492                                  CheckFLT4:
   493 0000030C 813D[7E100000]464C-     	cmp     dword [Header+ModHeader.mhSign], 'FLT4'
   493 00000314 5434               
   494 00000316 7434                    	je      short IsModFile
   495                                  Is15Inst:
   496 00000318 BE[1C0E0000]            	mov     esi, (Header+ModHeader.mhSamples) + (15*ModSample.size)
   497 0000031D BF[FC0F0000]            	mov     edi, Header+ModHeader.mhOrderLen
   498                                  	;cld
   499                                  	;mov	ecx, 130
   500 00000322 66B98200                	mov	cx, 130
   501 00000326 F3A4                    	rep     movsb
   502 00000328 BF[1C0E0000]            	mov     edi, Header+ModHeader.mhSamples + (15*ModSample.size)
   503 0000032D 30C0                    	xor     al, al
   504 0000032F 66B9E001                	mov     cx, 16*ModSample.size
   505 00000333 F3AA                    	rep     stosb
   506                                  SeekPatterns:   
   507                                  	; ebx = [FileHandle]
   508                                  	; ecx = offset
   509                                  	; edx = switch (0 = from beginning)
   510                                  	sys	_seek, [FileHandle], 600, 0
   510                              <1> 
   510                              <1> 
   510                              <1> 
   510                              <1> 
   510                              <1>  %if %0 >= 2
   510 00000335 8B1D[420C0000]      <1>  mov ebx, %2
   510                              <1>  %if %0 >= 3
   510 0000033B B958020000          <1>  mov ecx, %3
   510                              <1>  %if %0 = 4
   510 00000340 BA00000000          <1>  mov edx, %4
   510                              <1>  %endif
   510                              <1>  %endif
   510                              <1>  %endif
   510 00000345 B813000000          <1>  mov eax, %1
   510                              <1> 
   510 0000034A CD40                <1>  int 40h
   511                                  IsModFile:
   512 0000034C A0[FC0F0000]            	mov     al, [Header+ModHeader.mhOrderLen]
   513 00000351 A2[82100000]            	mov     [ModInfo.OrderLen], al
   514                                  
   515 00000356 A0[FD0F0000]            	mov     al, [Header+ModHeader.mhReStart]
   516 0000035B 3A05[FC0F0000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   517 00000361 7202                    	jb      short SetReStart
   518 00000363 B07F                    	mov     al, 7Fh
   519                                  SetReStart:
   520 00000365 A2[83100000]            	mov     [ModInfo.ReStart], al
   521                                  
   522                                  	;mov	ecx, 128
   523 0000036A 66B98000                	mov	cx, 128
   524 0000036E 31D2                    	xor     edx, edx
   525 00000370 31DB                    	xor     ebx, ebx
   526                                  CopyOrder:
   527 00000372 8AB3[FE0F0000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   528 00000378 88B3[84100000]          	mov     [ModInfo.Order+ebx], dh
   529 0000037E 38D6                    	cmp     dh, dl
   530 00000380 7202                    	jb      short NextOrder
   531 00000382 88F2                    	mov     dl, dh
   532                                  NextOrder:
   533 00000384 43                      	inc     ebx
   534 00000385 E2EB                    	loop    CopyOrder
   535                                  AllocPatterns:  
   536 00000387 81E2FF000000            	and	edx, 0FFh
   537 0000038D 6642                    	inc	dx ; 14/03/2017
   538                                  	; dl = count of 1024 bytes
   539 0000038F C1E20A                  	shl	edx, 10 ; *1024
   540                                  
   541 00000392 89D5                    	mov	ebp, edx
   542                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   543 00000394 B9[00000100]            	mov	ecx, file_buffer ; 12/03/2017
   544                                  	;
   545 00000399 890D[04110000]          	mov	[ModInfo.Patterns], ecx
   546                                  	;
   547 0000039F 01CD                    	add	ebp, ecx ; next offset for samples
   548                                  ReadPatterns:  
   549                                  	;mov	ebx, [FileHandle] 
   550                                  	; ebx = File handle
   551                                  	; ecx = Buffer address
   552                                  	; edx = Byte count
   553                                  	sys	_read, [FileHandle]
   553                              <1> 
   553                              <1> 
   553                              <1> 
   553                              <1> 
   553                              <1>  %if %0 >= 2
   553 000003A1 8B1D[420C0000]      <1>  mov ebx, %2
   553                              <1>  %if %0 >= 3
   553                              <1>  mov ecx, %3
   553                              <1>  %if %0 = 4
   553                              <1>  mov edx, %4
   553                              <1>  %endif
   553                              <1>  %endif
   553                              <1>  %endif
   553 000003A7 B803000000          <1>  mov eax, %1
   553                              <1> 
   553 000003AC CD40                <1>  int 40h
   554 000003AE 0F8296000000            	jc      CloseFile
   555                                  
   556 000003B4 BE[5A0C0000]            	mov	esi, Header+ModHeader.mhSamples
   557 000003B9 31FF                    	xor     edi, edi
   558                                  CopySamples:
   559 000003BB 668B4616                	mov     ax, [esi+ModSample.msLength]
   560 000003BF 86C4                    	xchg    al, ah
   561 000003C1 66D1E0                  	shl     ax, 1
   562 000003C4 668987[84110000]        	mov     [ModInfo.SampLen+edi], ax
   563 000003CB 8A4619                  	mov     al, [esi+ModSample.msVolume]
   564 000003CE 30E4                    	xor     ah, ah
   565 000003D0 668987[3E120000]        	mov     [ModInfo.SampVol+edi], ax
   566 000003D7 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   567 000003DB 86C4                    	xchg    al, ah
   568 000003DD 66D1E0                  	shl     ax, 1
   569 000003E0 668987[C2110000]        	mov     [ModInfo.SampRep+edi], ax
   570 000003E7 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   571 000003EB 86C4                    	xchg    al, ah
   572 000003ED 66D1E0                  	shl     ax, 1
   573 000003F0 668987[00120000]        	mov     [ModInfo.SampRepLen+edi], ax
   574 000003F7 83C61E                  	add     esi, ModSample.size
   575 000003FA 6683C702                	add     di, 2
   576 000003FE 6683FF3E                	cmp     di, 2*31
   577 00000402 72B7                    	jb      short CopySamples
   578                                  
   579 00000404 31F6                    	xor     esi, esi
   580                                  AllocSamples:
   581 00000406 0FB796[84110000]        	movzx	edx, word [ModInfo.SampLen+esi]
   582 0000040D 09D2                    	or	edx, edx ; byte count
   583 0000040F 7426                    	jz      short NextSample
   584 00000411 89E8                    	mov	eax, ebp
   585 00000413 668986[08110000]        	mov	[ModInfo.SampOfs+esi], ax
   586 0000041A C1E810                  	shr	eax, 16
   587 0000041D 668986[46110000]        	mov	[ModInfo.SampSeg+esi], ax
   588 00000424 89E9                    	mov	ecx, ebp
   589 00000426 01D5                    	add	ebp, edx ; next offset for sample 
   590                                  ReadSample:
   591                                  	;mov	ebx, [FileHandle]
   592                                  	;movzx  edx, [ModInfo.SampLen+esi]
   593                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   594                                  
   595                                  	; ebx = File handle
   596                                  	; ecx = Buffer address
   597                                  	; edx = Byte count
   598                                  	sys	_read, [FileHandle]
   598                              <1> 
   598                              <1> 
   598                              <1> 
   598                              <1> 
   598                              <1>  %if %0 >= 2
   598 00000428 8B1D[420C0000]      <1>  mov ebx, %2
   598                              <1>  %if %0 >= 3
   598                              <1>  mov ecx, %3
   598                              <1>  %if %0 = 4
   598                              <1>  mov edx, %4
   598                              <1>  %endif
   598                              <1>  %endif
   598                              <1>  %endif
   598 0000042E B803000000          <1>  mov eax, %1
   598                              <1> 
   598 00000433 CD40                <1>  int 40h
   599 00000435 7213                    	jc      short CloseFile
   600                                  
   601                                  NextSample:
   602 00000437 6683C602                	add     si, 2
   603 0000043B 6683FE3E                	cmp     si, 2*31
   604 0000043F 72C5                    	jb      short AllocSamples
   605                                  
   606 00000441 66C705[440C0000]00-     	mov     word [ErrorInfo], 0
   606 00000449 00                 
   607                                  CloseFile:      
   608                                  	sys	_close, [FileHandle]
   608                              <1> 
   608                              <1> 
   608                              <1> 
   608                              <1> 
   608                              <1>  %if %0 >= 2
   608 0000044A 8B1D[420C0000]      <1>  mov ebx, %2
   608                              <1>  %if %0 >= 3
   608                              <1>  mov ecx, %3
   608                              <1>  %if %0 = 4
   608                              <1>  mov edx, %4
   608                              <1>  %endif
   608                              <1>  %endif
   608                              <1>  %endif
   608 00000450 B806000000          <1>  mov eax, %1
   608                              <1> 
   608 00000455 CD40                <1>  int 40h
   609                                  Failed:         
   610 00000457 61                      	popad
   611                                  
   612 00000458 C3                      	retn
   613                                  
   614                                  FreeModule:
   615                                  	; Erdogan Tan (13/02/2017)
   616                                  	; nothing to do here for memory de-allocation
   617                                  ClearModInfo:
   618 00000459 57                      	push	edi
   619 0000045A BF[82100000]            	mov	edi, ModInfo
   620 0000045F B9FA010000              	mov     ecx, ModInfoRec.size
   621                                  	;cld
   622 00000464 30C0                    	xor     al, al
   623 00000466 F3AA                    	rep     stosb
   624 00000468 5F                      	pop	edi
   625 00000469 C3                      	retn
   626                                  
   627                                  ;=============================================================================
   628                                  ;               MODPLAY.ASM
   629                                  ;=============================================================================
   630                                  
   631                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   632                                  ;	July 23th, 1993.
   633                                  
   634                                  ; EQUATES
   635                                  
   636                                  NumTracks       equ 4
   637                                  DefTempo        equ 6
   638                                  DefBpm          equ 125
   639                                  MidCRate        equ 8448
   640                                  MixBufSize      equ 4096
   641                                  
   642                                  ; STRUCTURES
   643                                  
   644                                  struc TrackInfo
   645 00000000 <res 00000004>          .Samples:	resd 1
   646 00000004 <res 00000004>          .Position:	resd 1
   647 00000008 <res 00000002>          .Len:	resw 1
   648 0000000A <res 00000002>          .Repeat:	resw 1
   649 0000000C <res 00000002>          .RepLen:	resw 1
   650 0000000E <res 00000001>          .Volume: 	resb 1
   651 0000000F <res 00000001>          .Error:	resb 1
   652 00000010 <res 00000002>          .Period:	resw 1
   653 00000012 <res 00000002>          .Pitch:	resw 1
   654 00000014 <res 00000002>          .Effect:	resw 1
   655 00000016 <res 00000002>          .PortTo:	resw 1
   656 00000018 <res 00000001>          .PortParm:	resb 1
   657 00000019 <res 00000001>          .VibPos:	resb 1
   658 0000001A <res 00000001>          .VibParm:	resb 1
   659 0000001B <res 00000001>          .OldSampOfs:	resb 1
   660 0000001C <res 00000006>          .Arp:	resw 3
   661 00000022 <res 00000002>          .ArpIndex:	resw 1
   662                                  .size:
   663                                  endstruc
   664                                  
   665                                  ; CODE
   666                                  
   667                                  ;--------------------------------------------------------------------------
   668                                  ; BeatTrack:  Process the next beat in one track.
   669                                  ;  In:
   670                                  ;    ds:di -  Track info Address.
   671                                  ;--------------------------------------------------------------------------
   672                                  
   673                                  ; edi = Track info address
   674                                  
   675                                  BeatTrack:
   676 0000046A 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   677 0000046E 6685D2                  	test    dx, dx
   678 00000471 743C                    	je      short None
   679 00000473 80FE00                  	cmp     dh, 00h
   680 00000476 7438                    	je      short Arpeggio
   681 00000478 80FE01                  	cmp     dh, 01h
   682 0000047B 7451                    	je      short PortUp
   683 0000047D 80FE02                  	cmp     dh, 02h
   684 00000480 7471                    	je      short PortDown
   685 00000482 80FE03                  	cmp     dh, 03h
   686 00000485 0F848E000000            	je      TonePort
   687 0000048B 80FE04                  	cmp     dh, 04h
   688 0000048E 0F84BD000000            	je      Vibrato
   689 00000494 80FE05                  	cmp     dh, 05h
   690 00000497 0F840E010000            	je      PortSlide
   691 0000049D 80FE06                  	cmp     dh, 06h
   692 000004A0 0F8412010000            	je      VibSlide
   693 000004A6 80FE0A                  	cmp     dh, 0Ah
   694 000004A9 0F8413010000            	je      VolSlide
   695                                  None:           
   696 000004AF C3                      	retn
   697                                  Arpeggio:
   698 000004B0 0FB75F22                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   699 000004B4 668B441F1C              	mov     ax, [edi+TrackInfo.Arp+ebx]
   700 000004B9 66894712                	mov     [edi+TrackInfo.Pitch], ax
   701 000004BD 6683C302                	add     bx, 2
   702 000004C1 6683FB06                	cmp     bx, 6
   703 000004C5 7202                    	jb      short SetArpIndex
   704 000004C7 31DB                    	xor     ebx, ebx
   705                                  SetArpIndex:
   706 000004C9 66895F22                	mov     [edi+TrackInfo.ArpIndex], bx
   707 000004CD C3                      	retn
   708                                  PortUp:
   709 000004CE 30F6                    	xor     dh, dh
   710 000004D0 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   711 000004D4 6629D3                  	sub     bx, dx
   712 000004D7 6683FB71                	cmp     bx, 113
   713 000004DB 7D04                    	jge     short NotSmall
   714 000004DD 66BB7100                	mov     bx, 113
   715                                  NotSmall:
   716 000004E1 66895F10                	mov     [edi+TrackInfo.Period], bx
   717 000004E5 6601DB                  	add     bx, bx
   718 000004E8 66678B87[7C12]          	mov     ax, [PitchTable+bx]
   719 000004EE 66894712                	mov     [edi+TrackInfo.Pitch], ax
   720 000004F2 C3                      	retn
   721                                  PortDown:
   722 000004F3 30F6                    	xor     dh, dh
   723 000004F5 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   724 000004F9 6601D3                  	add     bx, dx
   725 000004FC 6681FB5803              	cmp     bx, 856
   726 00000501 7E04                    	jle     short NotBig
   727 00000503 66BB5803                	mov     bx, 856
   728 00000507 66895F10                NotBig:         mov     [edi+TrackInfo.Period], bx
   729 0000050B 6601DB                  	add     bx, bx
   730 0000050E 66678B87[7C12]          	mov     ax, [PitchTable+bx]
   731 00000514 66894712                	mov     [edi+TrackInfo.Pitch], ax
   732 00000518 C3                      	retn
   733                                  TonePort:
   734 00000519 30F6                    	xor     dh, dh
   735 0000051B 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   736 0000051F 668B5F10                	mov     bx, [edi+TrackInfo.Period]
   737 00000523 6639C3                  	cmp     bx, ax
   738 00000526 7428                    	je      short NoPort
   739 00000528 7F0D                    	jg      short PortToUp
   740                                  PortToDown:     
   741 0000052A 6601D3                  	add     bx, dx
   742 0000052D 6639C3                  	cmp     bx, ax
   743 00000530 7E0D                    	jle     short SetPort
   744                                  FixPort:        
   745 00000532 6689C3                  	mov     bx, ax
   746 00000535 EB08                    	jmp     short SetPort
   747                                  PortToUp:
   748 00000537 6629D3                  	sub     bx, dx
   749 0000053A 6639C3                  	cmp     bx, ax
   750 0000053D 7CF3                    	jl      short FixPort
   751                                  SetPort:        
   752 0000053F 66895F10                	mov     [edi+TrackInfo.Period], bx
   753 00000543 6601DB                  	add     bx, bx
   754 00000546 66678B87[7C12]          	mov     ax, [PitchTable+bx]
   755 0000054C 66894712                	mov     [edi+TrackInfo.Pitch], ax
   756                                  NoPort:         
   757 00000550 C3                      	retn
   758                                  Vibrato:
   759 00000551 88D6                    	mov     dh, dl
   760 00000553 80E20F                  	and     dl, 0Fh
   761 00000556 C0EE04                  	shr     dh, 4
   762 00000559 C0E602                  	shl     dh, 2
   763 0000055C 007719                  	add     [edi+TrackInfo.VibPos], dh
   764 0000055F 8A7719                  	mov     dh, [edi+TrackInfo.VibPos]
   765 00000562 88F3                    	mov     bl, dh
   766 00000564 C0EB02                  	shr     bl, 2
   767 00000567 6683E31F                	and     bx, 1Fh
   768 0000056B 678A87[AF0B]            	mov     al, [SinTable+bx]
   769 00000570 F6E2                    	mul     dl
   770 00000572 66D1C0                  	rol     ax, 1
   771 00000575 86C4                    	xchg    al, ah
   772 00000577 80E401                  	and     ah, 1
   773 0000057A 84F6                    	test    dh, dh
   774 0000057C 7903                    	jns     short VibUp
   775 0000057E 66F7D8                  	neg     ax
   776                                  VibUp:          
   777 00000581 66034710                	add     ax, [edi+TrackInfo.Period]
   778 00000585 6689C3                  	mov     bx, ax
   779 00000588 6683FB71                	cmp     bx, 113
   780 0000058C 7D04                    	jge     short NoLoVib
   781 0000058E 66BB7100                	mov     bx, 113
   782                                  NoLoVib:        
   783 00000592 6681FB5803              	cmp     bx, 856
   784 00000597 7E04                    	jle     short NoHiVib
   785 00000599 66BB5803                	mov     bx, 856
   786                                  NoHiVib:        
   787 0000059D 6601DB                  	add     bx, bx
   788 000005A0 66678B87[7C12]          	mov     ax, [PitchTable+bx]
   789 000005A6 66894712                	mov     [edi+TrackInfo.Pitch], ax
   790 000005AA C3                      	retn
   791                                  PortSlide:
   792 000005AB E812000000              	call    VolSlide
   793 000005B0 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   794 000005B3 E961FFFFFF              	jmp     TonePort
   795                                  VibSlide:
   796 000005B8 E805000000              	call    VolSlide
   797 000005BD 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   798 000005C0 EB8F                    	jmp     short Vibrato
   799                                  VolSlide:
   800 000005C2 88D6                    	mov     dh, dl
   801 000005C4 80E20F                  	and     dl, 0Fh
   802 000005C7 C0EE04                  	shr     dh, 4
   803 000005CA 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   804 000005CD 28D0                    	sub     al, dl
   805 000005CF 7D02                    	jge     short NoLoVol
   806 000005D1 30C0                    	xor     al, al
   807                                  NoLoVol:        
   808 000005D3 00F0                    	add     al, dh
   809 000005D5 3C40                    	cmp     al, 64
   810 000005D7 7602                    	jbe     short NoHiVol
   811 000005D9 B040                    	mov     al, 64
   812                                  NoHiVol:        
   813 000005DB 88470E                  	mov     [edi+TrackInfo.Volume], al
   814 000005DE C3                      	retn
   815                                  
   816                                  ;--------------------------------------------------------------------------
   817                                  ; GetTrack:   Get the next Note from a pattern.
   818                                  ;  In:
   819                                  ;    ds:di -  Track info Address.
   820                                  ;    es:si -  Pattern Note Address.
   821                                  ; Out:
   822                                  ;    es:si -  The Next Pattern Note address.
   823                                  ;--------------------------------------------------------------------------
   824                                  
   825                                  ; esi = Pattern note address
   826                                  ; edi = Track info address
   827                                  
   828                                  GetTrack:
   829 000005DF 66AD                    	lodsw
   830 000005E1 86C4                    	xchg    al, ah
   831 000005E3 88E3                    	mov	bl, ah
   832 000005E5 80E40F                  	and     ah, 0Fh
   833 000005E8 6689C1                  	mov     cx, ax
   834 000005EB 66AD                    	lodsw
   835 000005ED 86C4                    	xchg    al, ah
   836 000005EF 88E7                    	mov     bh, ah
   837 000005F1 80E40F                  	and     ah, 0Fh
   838 000005F4 6689C2                  	mov     dx, ax
   839 000005F7 66895714                	mov     [edi+TrackInfo.Effect], dx
   840 000005FB 80E3F0                  	and     bl, 0F0h
   841 000005FE C0EF04                  	shr     bh, 4
   842 00000601 08FB                    	or      bl, bh
   843 00000603 7449                    	je      short SetPeriod
   844                                  SetSample:
   845                                  	;xor    bh, bh
   846 00000605 81E3FF000000            	and	ebx, 0FFh
   847 0000060B 4B                      	dec     ebx
   848 0000060C 01DB                    	add     ebx, ebx
   849 0000060E 668B83[3E120000]        	mov     ax, [ModInfo.SampVol+ebx]
   850 00000615 88470E                  	mov     [edi+TrackInfo.Volume], al
   851 00000618 668B83[08110000]        	mov     ax, [ModInfo.SampOfs+ebx]
   852 0000061F 668907                  	mov     [edi+TrackInfo.Samples], ax
   853 00000622 668B83[46110000]        	mov     ax, [ModInfo.SampSeg+ebx]
   854 00000629 66894702                	mov     [edi+TrackInfo.Samples+2], ax
   855 0000062D 668B83[84110000]        	mov     ax, [ModInfo.SampLen+ebx]
   856 00000634 66894708                	mov     [edi+TrackInfo.Len], ax
   857 00000638 668B83[C2110000]        	mov     ax, [ModInfo.SampRep+ebx]
   858 0000063F 6689470A                	mov     [edi+TrackInfo.Repeat], ax
   859 00000643 668B83[00120000]        	mov     ax, [ModInfo.SampRepLen+ebx]
   860 0000064A 6689470C                	mov     [edi+TrackInfo.RepLen], ax
   861                                  SetPeriod:      
   862 0000064E 6685C9                  	test    cx, cx
   863 00000651 7424                    	jz      short SetEffect
   864                                  
   865 00000653 66894F16                	mov     [edi+TrackInfo.PortTo], cx
   866 00000657 80FE03                  	cmp     dh, 03h
   867 0000065A 741B                    	je      short SetEffect
   868                                  
   869 0000065C 66894F10                	mov     [edi+TrackInfo.Period], cx
   870 00000660 6689CB                  	mov     bx, cx
   871 00000663 6601DB                  	add     bx, bx
   872 00000666 66678B87[7C12]          	mov     ax, [PitchTable+bx]
   873 0000066C 66894712                	mov     [edi+TrackInfo.Pitch], ax
   874 00000670 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
   875                                  SetEffect:
   876 00000677 6685D2                  	test    dx, dx
   877 0000067A 7430                    	jz      short InitNone
   878 0000067C 80FE00                  	cmp     dh, 00h
   879 0000067F 0F84E5000000            	je      InitArpeggio
   880 00000685 80FE03                  	cmp     dh, 03h
   881 00000688 7423                    	je      short InitTonePort
   882 0000068A 80FE04                  	cmp     dh, 04h
   883 0000068D 742D                    	je      short InitVibrato
   884 0000068F 80FE09                  	cmp     dh, 09h
   885 00000692 7451                    	je      short SampleOfs
   886 00000694 80FE0B                  	cmp     dh, 0Bh
   887 00000697 7462                    	je      short PosJump
   888 00000699 80FE0C                  	cmp     dh, 0Ch
   889 0000069C 746B                    	je      short SetVolume
   890 0000069E 80FE0D                  	cmp     dh, 0Dh
   891 000006A1 7471                    	je      short Break
   892 000006A3 80FE0F                  	cmp     dh, 0Fh
   893 000006A6 0F8487000000            	je      SetSpeed
   894                                  InitNone:
   895 000006AC C3                      	retn
   896                                  InitTonePort:
   897 000006AD 84D2                    	test    dl, dl
   898 000006AF 7503                    	jnz     short SetPortParm
   899 000006B1 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]
   900                                  SetPortParm:    
   901 000006B4 885718                  	mov     [edi+TrackInfo.PortParm], dl
   902 000006B7 66895714                	mov     [edi+TrackInfo.Effect], dx
   903 000006BB C3                      	retn
   904                                  InitVibrato:
   905 000006BC 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
   906 000006BF 88C4                    	mov     ah, al
   907 000006C1 240F                    	and     al, 0Fh
   908 000006C3 80E4F0                  	and     ah, 0F0h
   909 000006C6 F6C20F                  	test    dl, 0Fh
   910 000006C9 7502                    	jne     short OkDepth
   911 000006CB 08C2                    	or      dl, al
   912                                  OkDepth:        
   913 000006CD F6C2F0                  	test    dl, 0F0h
   914 000006D0 7502                    	jnz     short OkRate
   915 000006D2 08E2                    	or      dl, ah
   916                                  OkRate:         
   917 000006D4 88571A                  	mov     [edi+TrackInfo.VibParm], dl
   918 000006D7 66895714                	mov     [edi+TrackInfo.Effect], dx
   919 000006DB 6685C9                  	test    cx, cx
   920 000006DE 7404                    	jz      short OkPos
   921 000006E0 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
   922                                  OkPos:          
   923 000006E4 C3                      	retn
   924                                  SampleOfs:      
   925 000006E5 84D2                    	test    dl, dl
   926 000006E7 7503                    	jnz     short SetSampleOfs
   927 000006E9 8A571B                  	mov     dl, [edi+TrackInfo.OldSampOfs]
   928                                  SetSampleOfs:
   929 000006EC 88571B                  	mov     [edi+TrackInfo.OldSampOfs], dl
   930 000006EF 88D6                    	mov     dh, dl
   931 000006F1 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
   932 000006F7 895704                  	mov     [edi+TrackInfo.Position], edx
   933 000006FA C3                      	retn
   934                                  PosJump:
   935 000006FB 8815[2E6A0000]          	mov     [OrderPos], dl
   936 00000701 C605[326A0000]40        	mov     byte [Row], 64
   937 00000708 C3                      	retn
   938                                  SetVolume:
   939 00000709 80FA40                  	cmp     dl, 64
   940 0000070C 7602                    	jbe     short OkVol
   941 0000070E B240                    	mov     dl, 64
   942                                  OkVol:
   943 00000710 88570E                  	mov     [edi+TrackInfo.Volume], dl
   944 00000713 C3                      	retn
   945                                  Break:
   946 00000714 88D6                    	mov     dh, dl
   947 00000716 80E20F                  	and     dl, 0Fh
   948 00000719 C0EE04                  	shr     dh, 4
   949 0000071C 00F6                    	add     dh, dh
   950 0000071E 00F2                    	add     dl, dh
   951 00000720 C0E602                  	shl     dh, 2
   952 00000723 00F2                    	add     dl, dh
   953 00000725 8815[336A0000]          	mov     [BreakRow], dl
   954 0000072B C605[326A0000]40        	mov     byte [Row], 64
   955 00000732 C3                      	retn
   956                                  SetSpeed:
   957 00000733 84D2                    	test    dl,dl
   958 00000735 7432                    	je      Skip
   959 00000737 80FA1F                  	cmp     dl,31
   960 0000073A 770D                    	ja      short SetBpm
   961                                  SetTempo:       
   962 0000073C 8815[2F6A0000]          	mov     [Tempo], dl
   963 00000742 8815[306A0000]          	mov     [TempoWait], dl
   964 00000748 C3                      	retn
   965                                  SetBpm:
   966 00000749 8815[316A0000]          	mov     [Bpm], dl
   967 0000074F B067                    	mov     al, 103
   968 00000751 F6E2                    	mul     dl
   969 00000753 88E3                    	mov     bl, ah
   970 00000755 30FF                    	xor     bh, bh
   971 00000757 66A1[1C0C0000]          	mov     ax, [MixSpeed]
   972 0000075D 6631D2                  	xor     dx, dx
   973 00000760 66F7F3                  	div     bx
   974 00000763 66A3[346A0000]          	mov     [BpmSamples], ax
   975                                  Skip:           
   976 00000769 C3                      	retn
   977                                  InitArpeggio:
   978 0000076A 88D6                    	mov     dh, dl
   979 0000076C 80E20F                  	and     dl, 0Fh
   980 0000076F C0EE04                  	shr     dh, 4
   981 00000772 66B92400                	mov     cx, 36
   982 00000776 31DB                    	xor     ebx, ebx
   983 00000778 668B4710                	mov     ax, [edi+TrackInfo.Period]
   984                                  gt_ScanPeriod:
   985 0000077C 66673B87[CF0B]          	cmp     ax, [PeriodTable+bx]
   986 00000782 7306                    	jae     short SetArp
   987 00000784 6683C302                	add     bx, 2
   988 00000788 E2F2                    	loop    gt_ScanPeriod
   989                                  SetArp:         
   990 0000078A 6601D2                  	add     dx, dx
   991 0000078D 00DE                    	add     dh, bl
   992 0000078F 00DA                    	add     dl, bl
   993 00000791 66678B9F[CF0B]          	mov     bx, [PeriodTable+bx]
   994 00000797 6601DB                  	add     bx, bx
   995 0000079A 66678B87[7C12]          	mov     ax, [PitchTable+bx]
   996 000007A0 6689471C                	mov     [edi+TrackInfo.Arp], ax
   997 000007A4 88F3                    	mov     bl, dh
   998 000007A6 30FF                    	xor     bh, bh
   999 000007A8 66678B9F[CF0B]          	mov     bx, [PeriodTable+bx]
  1000 000007AE 6601DB                  	add     bx, bx
  1001 000007B1 66678B87[7C12]          	mov     ax, [PitchTable+bx]
  1002 000007B7 6689471E                	mov     [edi+TrackInfo.Arp+2], ax
  1003 000007BB 88D3                    	mov     bl, dl
  1004 000007BD 30FF                    	xor     bh, bh
  1005 000007BF 66678B9F[CF0B]          	mov     bx, [PeriodTable+bx]
  1006 000007C5 6601DB                  	add     bx, bx
  1007 000007C8 66678B87[7C12]          	mov     ax, [PitchTable+bx]
  1008 000007CE 66894720                	mov     [edi+TrackInfo.Arp+4], ax
  1009 000007D2 66C747220000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1010 000007D8 C3                      	retn
  1011                                  
  1012                                  ;--------------------------------------------------------------------------
  1013                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1014                                  ;--------------------------------------------------------------------------
  1015                                  
  1016                                  UpdateTracks:
  1017 000007D9 FE0D[306A0000]          	dec     byte [TempoWait]
  1018 000007DF 7415                    	jz      short GetTracks
  1019                                  
  1020 000007E1 B904000000              	mov	ecx, NumTracks
  1021 000007E6 BF[446A0000]            	mov	edi, Tracks
  1022                                  BeatTracks:
  1023 000007EB E87AFCFFFF              	call	BeatTrack	
  1024 000007F0 83C724                  	add	edi, TrackInfo.size
  1025 000007F3 E2F6                    	loop	BeatTracks
  1026 000007F5 C3                      	retn
  1027                                  GetTracks:
  1028 000007F6 A0[2F6A0000]            	mov     al, [Tempo]
  1029 000007FB A2[306A0000]            	mov     [TempoWait], al
  1030                                  
  1031 00000800 8B35[406A0000]          	mov	esi, [Note]
  1032 00000806 803D[326A0000]40        	cmp     byte [Row], 64
  1033 0000080D 7263                    	jb      short NoPattWrap
  1034                                  
  1035 0000080F 8B35[04110000]          	mov	esi, [ModInfo.Patterns]
  1036 00000815 8A1D[2E6A0000]          	mov     bl, [OrderPos]
  1037 0000081B 3A1D[82100000]          	cmp     bl, [ModInfo.OrderLen]
  1038 00000821 7214                    	jb      short NoOrderWrap
  1039 00000823 8A1D[83100000]          	mov     bl, [ModInfo.ReStart]
  1040 00000829 881D[2E6A0000]          	mov     [OrderPos], bl
  1041 0000082F 3A1D[82100000]          	cmp     bl, [ModInfo.OrderLen]
  1042 00000835 735D                    	jae     short NoUpdate
  1043                                  NoOrderWrap:    
  1044                                  	;xor	bh, bh
  1045 00000837 81E3FF000000            	and	ebx, 0FFh
  1046 0000083D 8A9B[84100000]          	mov     bl, [ModInfo.Order+ebx]
  1047 00000843 C1E30A                  	shl     ebx, 10 ; *1024
  1048 00000846 01DE                    	add     esi, ebx
  1049 00000848 8A1D[336A0000]          	mov     bl, [BreakRow]
  1050 0000084E 881D[326A0000]          	mov     [Row], bl
  1051                                  	;xor     bh, bh
  1052 00000854 81E3FF000000            	and	ebx, 0FFh
  1053 0000085A 883D[336A0000]          	mov     [BreakRow], bh ; 0
  1054 00000860 66C1E304                	shl     bx, 4
  1055 00000864 01DE                    	add     esi, ebx
  1056 00000866 8935[406A0000]          	mov     [Note], esi
  1057 0000086C FE05[2E6A0000]          	inc     byte [OrderPos]
  1058                                  NoPattWrap:     
  1059 00000872 FE05[326A0000]          	inc     byte [Row]
  1060                                  
  1061                                  	;cld
  1062 00000878 B904000000              	mov	ecx, NumTracks
  1063 0000087D BF[446A0000]            	mov	edi, Tracks
  1064                                  GetTracks_next:
  1065 00000882 51                      	push	ecx	
  1066 00000883 E857FDFFFF              	call	GetTrack
  1067 00000888 59                      	pop	ecx
  1068 00000889 83C724                  	add	edi, TrackInfo.size
  1069 0000088C E2F4                    	loop	GetTracks_next
  1070                                  
  1071 0000088E 8935[406A0000]          	mov     [Note], esi
  1072                                  NoUpdate:
  1073 00000894 C3                      	retn
  1074                                  
  1075                                  ;--------------------------------------------------------------------------
  1076                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1077                                  ;  In:
  1078                                  ;   ds:si -  Track Info Address.
  1079                                  ;   ds:di -  Buffer Address.
  1080                                  ;    cx   -  Buffer Size.
  1081                                  ;--------------------------------------------------------------------------
  1082                                  
  1083                                  ; esi = Track info address
  1084                                  ; edi = Buffer address
  1085                                  ; ecx = Buffer size
  1086                                  
  1087                                  MixTrack:
  1088 00000895 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1089 0000089A 7748                    	ja      short MixLooped
  1090                                  MixNonLooped:   
  1091 0000089C 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1092 0000089E 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1093 000008A1 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1094 000008A5 52                      	push    edx
  1095 000008A6 56                      	push    esi
  1096 000008A7 01D3                    	add     ebx, edx
  1097 000008A9 01D5                    	add     ebp, edx
  1098 000008AB 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1099 000008AF 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1100 000008B2 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1101 000008B5 89DE                    	mov     esi, ebx
  1102 000008B7 88C7                    	mov     bh, al
  1103 000008B9 88D0                    	mov     al, dl
  1104 000008BB 88F2                    	mov     dl, dh
  1105                                  	;xor	dh, dh
  1106 000008BD 81E2FF000000            	and	edx, 0FFh
  1107                                  nlMixSamp:      
  1108 000008C3 39EE                    	cmp     esi, ebp
  1109 000008C5 7310                    	jae     short nlMixBye
  1110 000008C7 8A1E                    	mov     bl, [esi]
  1111 000008C9 678A9F[2E19]            	mov     bl, [VolTable+bx]
  1112 000008CE 001F                    	add     [edi], bl
  1113 000008D0 47                      	inc     edi
  1114 000008D1 00C4                    	add     ah, al
  1115 000008D3 11D6                    	adc     esi, edx
  1116 000008D5 E2EC                    	loop    nlMixSamp
  1117                                  nlMixBye:       
  1118 000008D7 89F3                    	mov     ebx, esi
  1119 000008D9 5E                      	pop     esi
  1120 000008DA 5A                      	pop     edx
  1121 000008DB 29D3                    	sub     ebx, edx
  1122 000008DD 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1123 000008E0 88660F                  	mov     [esi+TrackInfo.Error], ah
  1124 000008E3 C3                      	retn
  1125                                  MixLooped:
  1126 000008E4 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1127 000008E6 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1128 000008E9 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1129 000008ED 892D[3C6A0000]          	mov     [BufRep], ebp
  1130 000008F3 036E0A                  	add     ebp, [esi+TrackInfo.Repeat]
  1131 000008F6 52                      	push    edx
  1132 000008F7 56                      	push    esi
  1133 000008F8 01D3                    	add     ebx, edx
  1134 000008FA 01D5                    	add     ebp, edx
  1135 000008FC 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1136 00000900 8A460E                  	mov     al, [esi+TrackInfo.Volume]
  1137 00000903 8A660F                  	mov     ah, [esi+TrackInfo.Error]
  1138 00000906 6689DE                  	mov     si, bx
  1139 00000909 88C7                    	mov     bh, al
  1140 0000090B 88D0                    	mov     al, dl
  1141 0000090D 88F2                    	mov     dl, dh
  1142                                  	;xor	dh, dh
  1143 0000090F 81E2FF000000            	and	edx, 0FFh
  1144                                  lpMixSamp:      
  1145 00000915 39EE                    	cmp     esi, ebp
  1146 00000917 7206                    	jb      short lpMixNow
  1147 00000919 2B35[3C6A0000]          	sub     esi, [BufRep]
  1148                                  lpMixNow:       
  1149 0000091F 8A1E                    	mov     bl, [esi]
  1150 00000921 678A9F[2E19]            	mov     bl, [VolTable+bx]
  1151 00000926 001F                    	add     [edi], bl
  1152 00000928 47                      	inc     edi
  1153 00000929 00C4                    	add     ah, al
  1154 0000092B 11D6                    	adc	esi, edx
  1155 0000092D E2E6                    	loop    lpMixSamp
  1156                                  lpMixBye:       
  1157                                  ;	mov     ebx, esi
  1158                                  ;	pop     esi
  1159                                  ;	pop     edx
  1160                                  ;	sub     ebx, edx
  1161                                  ;	mov     [esi+TrackInfo.Position], ebx
  1162                                  ;	mov     [esi+TrackInfo.Error], ah
  1163                                  ;	retn
  1164 0000092F EBA6                    	jmp	short nlMixBye
  1165                                  
  1166                                  ;--------------------------------------------------------------------------
  1167                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1168                                  ;  In:
  1169                                  ;    Buffer  - Buffer Address.
  1170                                  ;    Count   - Buffer Size.
  1171                                  ;--------------------------------------------------------------------------
  1172                                  
  1173                                  GetSamples:
  1174                                  	; edi = buffer address
  1175                                  	; ebx = count
  1176                                  
  1177 00000931 60                      	pushad
  1178                                  
  1179                                  	;cld
  1180                                  NextChunk:      
  1181 00000932 66833D[3A6A0000]00      	cmp     word [BufLen], 0
  1182 0000093A 7548                    	jne     short CopyChunk
  1183                                  
  1184 0000093C 53                      	push    ebx
  1185 0000093D 57                      	push    edi
  1186                                  MixChunk:       
  1187 0000093E BF[2E5A0000]            	mov	edi, MixBuffer
  1188 00000943 0FB70D[346A0000]        	movzx	ecx, word [BpmSamples]
  1189 0000094A 893D[366A0000]          	mov     [BufPtr], edi
  1190 00000950 66890D[3A6A0000]        	mov     [BufLen], cx
  1191                                  
  1192 00000957 B080                    	mov     al, 80h
  1193 00000959 F3AA                    	rep     stosb
  1194                                  
  1195 0000095B 66B90400                	mov	cx, NumTracks
  1196 0000095F BE[206A0000]            	mov	esi, Tracks - TrackInfo.size
  1197                                  GetSamples_next:
  1198 00000964 51                      	push	ecx
  1199 00000965 83C624                  	add	esi, TrackInfo.size
  1200 00000968 668B0D[3A6A0000]        	mov	cx, [BufLen]
  1201 0000096F 8B3D[366A0000]          	mov	edi, [BufPtr]
  1202 00000975 E81BFFFFFF              	call	MixTrack
  1203 0000097A 59                      	pop	ecx
  1204 0000097B E2E7                    	loop	GetSamples_next	
  1205                                  
  1206 0000097D E857FEFFFF              	call    UpdateTracks
  1207                                  
  1208 00000982 5F                      	pop     edi
  1209 00000983 5B                      	pop     ebx
  1210                                  CopyChunk:      
  1211                                  	;mov	cx, [BufLen]
  1212 00000984 0FB70D[3A6A0000]        	movzx	ecx, word [BufLen]
  1213 0000098B 39D9                    	cmp	ecx, ebx
  1214                                  	;cmp	cx, bx
  1215 0000098D 7602                    	jbe     short MoveChunk
  1216                                  	;mov	cx, bx
  1217 0000098F 89D9                    	mov     ecx, ebx
  1218                                  MoveChunk:
  1219 00000991 8B35[366A0000]          	mov     esi, [BufPtr]
  1220 00000997 010D[366A0000]          	add     [BufPtr], ecx
  1221 0000099D 66290D[3A6A0000]        	sub     [BufLen], cx
  1222 000009A4 29CB                    	sub     ebx, ecx
  1223 000009A6 F3A4                    	rep     movsb
  1224 000009A8 85DB                    	test    ebx, ebx
  1225 000009AA 7586                    	jnz     short NextChunk
  1226                                  
  1227 000009AC 61                      	popad
  1228 000009AD C3                      	retn
  1229                                  
  1230                                  ;--------------------------------------------------------------------------
  1231                                  ; StartPlaying: Initializes the Sound System.
  1232                                  ;  In:
  1233                                  ;   Module Information Resources.
  1234                                  ;--------------------------------------------------------------------------
  1235                                  
  1236                                  StartPlaying:
  1237 000009AE 60                      	pushad
  1238                                  SetModParms:    
  1239 000009AF C605[2E6A0000]00        	mov     byte [OrderPos], 0
  1240 000009B6 C605[2F6A0000]06        	mov     byte [Tempo], DefTempo
  1241 000009BD C605[306A0000]06        	mov     byte [TempoWait], DefTempo
  1242 000009C4 C605[316A0000]7D        	mov     byte [Bpm], DefBpm
  1243 000009CB C605[326A0000]40        	mov     byte [Row], 64
  1244 000009D2 C605[336A0000]00        	mov     byte [BreakRow], 0
  1245 000009D9 66A1[1C0C0000]          	mov     ax, [MixSpeed]
  1246 000009DF 31D2                    	xor     edx, edx
  1247 000009E1 66BB3200                	mov     bx, 24*DefBpm/60
  1248 000009E5 66F7F3                  	div     bx
  1249 000009E8 66A3[346A0000]          	mov     [BpmSamples], ax
  1250                                  ClearTracks:    
  1251 000009EE BF[446A0000]            	mov     edi, Tracks
  1252 000009F3 B990000000              	mov     ecx, NumTracks*TrackInfo.size
  1253 000009F8 31C0                    	xor     eax, eax
  1254                                  	;cld
  1255 000009FA F3AA                    	rep     stosb
  1256                                  
  1257 000009FC A3[366A0000]            	mov     [BufPtr], eax
  1258 00000A01 66A3[3A6A0000]          	mov     [BufLen], ax
  1259                                  MakePitch:
  1260 00000A07 66B80021                	mov     ax, MidCRate
  1261 00000A0B 66BBAC01                	mov     bx, 428
  1262 00000A0F 66F7E3                  	mul     bx
  1263 00000A12 66F735[1C0C0000]        	div     word [MixSpeed]
  1264 00000A19 30F6                    	xor     dh, dh
  1265 00000A1B 88E2                    	mov     dl, ah
  1266 00000A1D 88C4                    	mov     ah, al
  1267 00000A1F 30C0                    	xor     al, al
  1268 00000A21 66B95903                	mov     cx, 857
  1269 00000A25 31DB                    	xor     ebx, ebx
  1270 00000A27 BF[7C120000]            	mov     edi, PitchTable
  1271                                  PitchLoop:      
  1272 00000A2C 50                      	push    eax
  1273 00000A2D 52                      	push    edx
  1274 00000A2E 6639DA                  	cmp     dx, bx
  1275 00000A31 7303                    	jae     short NoDiv
  1276 00000A33 66F7F3                  	div     bx
  1277                                  NoDiv:          
  1278 00000A36 66AB                    	stosw
  1279 00000A38 5A                      	pop     edx
  1280 00000A39 58                      	pop     eax
  1281 00000A3A 43                      	inc     ebx
  1282 00000A3B E2EF                    	loop    PitchLoop
  1283                                  MakeVolume:     
  1284 00000A3D 66B90041                	mov     cx, 16640
  1285 00000A41 89CB                    	mov     ebx, ecx
  1286                                  VolLoop:
  1287 00000A43 4B                      	dec     ebx
  1288 00000A44 88D8                    	mov     al, bl
  1289 00000A46 F6EF                    	imul    bh
  1290 00000A48 88A3[2E190000]          	mov     [VolTable+ebx], ah
  1291 00000A4E E2F3                    	loop    VolLoop
  1292                                  
  1293 00000A50 61                      	popad
  1294 00000A51 C3                      	retn
  1295                                  
  1296                                  ;--------------------------------------------------------------------------
  1297                                  ; StopPlaying: ShutDown the Sound System.
  1298                                  ;--------------------------------------------------------------------------
  1299                                  
  1300                                  StopPlaying:
  1301                                  	; 19/06/2017
  1302                                  	; Stop Playing
  1303                                  	sys	_audio, 0700h
  1303                              <1> 
  1303                              <1> 
  1303                              <1> 
  1303                              <1> 
  1303                              <1>  %if %0 >= 2
  1303 00000A52 BB00070000          <1>  mov ebx, %2
  1303                              <1>  %if %0 >= 3
  1303                              <1>  mov ecx, %3
  1303                              <1>  %if %0 = 4
  1303                              <1>  mov edx, %4
  1303                              <1>  %endif
  1303                              <1>  %endif
  1303                              <1>  %endif
  1303 00000A57 B820000000          <1>  mov eax, %1
  1303                              <1> 
  1303 00000A5C CD40                <1>  int 40h
  1304                                  	; Cancel callback service (for user)
  1305                                  	sys	_audio, 0900h
  1305                              <1> 
  1305                              <1> 
  1305                              <1> 
  1305                              <1> 
  1305                              <1>  %if %0 >= 2
  1305 00000A5E BB00090000          <1>  mov ebx, %2
  1305                              <1>  %if %0 >= 3
  1305                              <1>  mov ecx, %3
  1305                              <1>  %if %0 = 4
  1305                              <1>  mov edx, %4
  1305                              <1>  %endif
  1305                              <1>  %endif
  1305                              <1>  %endif
  1305 00000A63 B820000000          <1>  mov eax, %1
  1305                              <1> 
  1305 00000A68 CD40                <1>  int 40h
  1306                                  	; Deallocate Audio Buffer (for user)
  1307                                  	sys	_audio, 0A00h
  1307                              <1> 
  1307                              <1> 
  1307                              <1> 
  1307                              <1> 
  1307                              <1>  %if %0 >= 2
  1307 00000A6A BB000A0000          <1>  mov ebx, %2
  1307                              <1>  %if %0 >= 3
  1307                              <1>  mov ecx, %3
  1307                              <1>  %if %0 = 4
  1307                              <1>  mov edx, %4
  1307                              <1>  %endif
  1307                              <1>  %endif
  1307                              <1>  %endif
  1307 00000A6F B820000000          <1>  mov eax, %1
  1307                              <1> 
  1307 00000A74 CD40                <1>  int 40h
  1308                                  	; Disable Audio Device
  1309                                  	sys	_audio, 0C00h
  1309                              <1> 
  1309                              <1> 
  1309                              <1> 
  1309                              <1> 
  1309                              <1>  %if %0 >= 2
  1309 00000A76 BB000C0000          <1>  mov ebx, %2
  1309                              <1>  %if %0 >= 3
  1309                              <1>  mov ecx, %3
  1309                              <1>  %if %0 = 4
  1309                              <1>  mov edx, %4
  1309                              <1>  %endif
  1309                              <1>  %endif
  1309                              <1>  %endif
  1309 00000A7B B820000000          <1>  mov eax, %1
  1309                              <1> 
  1309 00000A80 CD40                <1>  int 40h
  1310                                  
  1311 00000A82 C3                      	retn
  1312                                  
  1313                                  ;=============================================================================
  1314                                  ;               preinitialized data
  1315                                  ;=============================================================================
  1316                                  
  1317                                  ;=============================================================================
  1318                                  ;               PLAY.ASM - DATA
  1319                                  ;=============================================================================
  1320                                  
  1321                                  msg_2017:
  1322 00000A83 54696E79204D4F4420-     		db 'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  1322 00000A8C 506C6179657220666F-
  1322 00000A95 72205452444F532033-
  1322 00000A9E 383620627920457264-
  1322 00000AA7 6F67616E2054616E2E-
  1322 00000AB0 20                 
  1323 00000AB1 4A756E652032303137-     		db 'June 2017.',10,13
  1323 00000ABA 2E0A0D             
  1324 00000ABD 75736167653A206D6F-     		db 'usage: modplay filename.mod', 10,13,0
  1324 00000AC6 64706C61792066696C-
  1324 00000ACF 656E616D652E6D6F64-
  1324 00000AD8 0A0D00             
  1325 00000ADB 32352F30362F323031-     		db '25/06/2017',10,13,0
  1325 00000AE4 370A0D00           
  1326                                  
  1327 00000AE8 54696E79204D4F4420-     Credits:	db 'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  1327 00000AF1 506C61796572207630-
  1327 00000AFA 2E3162206279204361-
  1327 00000B03 726C6F732048617361-
  1327 00000B0C 6E2E204A756C792031-
  1327 00000B15 3939332E           
  1328 00000B19 0A0D00                  		db 10,13,0
  1329 00000B1C 4572726F72206C6F61-     ErrorMesg:	db 'Error loading Module file.',10,13,0
  1329 00000B25 64696E67204D6F6475-
  1329 00000B2E 6C652066696C652E0A-
  1329 00000B37 0D00               
  1330 00000B39 536F756E6420426C61-     MsgNotFound:	db 'Sound Blaster not found or IRQ error.',10,13,0
  1330 00000B42 73746572206E6F7420-
  1330 00000B4B 666F756E64206F7220-
  1330 00000B54 495251206572726F72-
  1330 00000B5D 2E0A0D00           
  1331 00000B61 536F756E6420426C61-     MsgFound:	db 'Sound Blaster found at Address 2'
  1331 00000B6A 7374657220666F756E-
  1331 00000B73 642061742041646472-
  1331 00000B7C 6573732032         
  1332 00000B81 7830682C2049525120      PortText:	db 'x0h, IRQ '
  1333 00000B8A 782E0A0D00              IrqText:	db 'x.',10,13,0
  1334                                  
  1335                                  trdos386_err_msg:
  1336 00000B8F 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  1336 00000B98 2053797374656D2063-
  1336 00000BA1 616C6C206572726F72-
  1336 00000BAA 20210A0D00         
  1337                                  
  1338                                  ;=============================================================================
  1339                                  ;               MODPLAY.ASM - DATA
  1340                                  ;=============================================================================
  1341                                  
  1342                                  ;Credits:	db 'Amiga Module Player v0.3b by Carlos Hasan.'
  1343                                  
  1344 00000BAF 0019324A62788EA2B4-     SinTable:	db 0,25,50,74,98,120,142,162,180,197,212,225
  1344 00000BB8 C5D4E1             
  1345 00000BBB ECF4FAFEFFFEFAF4EC-     		db 236,244,250,254,255,254,250,244,236,225
  1345 00000BC4 E1                 
  1346 00000BC5 D4C5B4A28E78624A32-     		db 212,197,180,162,142,120,98,74,50,25
  1346 00000BCE 19                 
  1347                                  
  1348 00000BCF 58032803FA02D002A6-     PeriodTable:	dw 856,808,762,720,678,640,604,570,538,508,480,453
  1348 00000BD8 0280025C023A021A02-
  1348 00000BE1 FC01E001C501       
  1349 00000BE7 AC0194017D01680153-     		dw 428,404,381,360,339,320,302,285,269,254,240,226
  1349 00000BF0 0140012E011D010D01-
  1349 00000BF9 FE00F000E200       
  1350 00000BFF D600CA00BE00B400AA-     		dw 214,202,190,180,170,160,151,143,135,127,120,113
  1350 00000C08 00A00097008F008700-
  1350 00000C11 7F0078007100       
  1351                                  
  1352                                  ;=============================================================================
  1353                                  ;               SB.ASM - DATA
  1354                                  ;=============================================================================
  1355                                  
  1356 00000C17 2002                    SbAddr:		dw 220h
  1357 00000C19 07                      SbIrq:		db 7
  1358                                  
  1359                                  ;=============================================================================
  1360                                  ;               PLAYER.ASM - DATA
  1361                                  ;=============================================================================
  1362                                  
  1363 00000C1A 01                      stmo:		db 1 ; stereo (2) or mono (1)  
  1364 00000C1B 08                      bps:		db 8 ; bits per sample (8 or 16)
  1365                                  Sample_Rate:
  1366 00000C1C 2256                    MixSpeed:	dw 22050 ; Hz
  1367                                  
  1368                                  ; 13/11/2016
  1369 00000C1E 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  1369 00000C27 3941424344454600   
  1370                                  ;
  1371                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  1372                                  ;codec_id:	   dd 0
  1373                                  ;codec_chip_id:	   dd 0
  1374                                  ;codec_vendor_ids: dw 0
  1375                                  ;codec_chip_ids:   dw 0
  1376                                  
  1377                                  ;dword_str:	dd 30303030h, 30303030h
  1378                                  ;	 	db 'h', 0Dh, 0Ah, 0
  1379                                  
  1380                                  ;=============================================================================
  1381                                  ;        	uninitialized data
  1382                                  ;=============================================================================
  1383                                  
  1384                                  bss_start:
  1385                                  
  1386                                  ABSOLUTE bss_start
  1387                                  
  1388 00000C2F <res 00000001>          alignb 4
  1389                                  
  1390 00000C30 <res 00000004>          dev_vendor:	resd 1
  1391 00000C34 <res 00000004>          bus_dev_fn:	resd 1
  1392 00000C38 <res 00000004>          stats_cmd:	resd 1
  1393 00000C3C <res 00000002>          ac97_NamBar:	resw 1
  1394 00000C3E <res 00000002>          ac97_NabmBar:	resw 1
  1395 00000C40 <res 00000001>          ac97_int_ln_reg: resb 1
  1396 00000C41 <res 00000001>          srb:		resb 1
  1397                                  
  1398                                  ; MODLOAD.ASM
  1399 00000C42 <res 00000002>          FileHandle:	resw 1
  1400 00000C44 <res 00000002>          ErrorInfo:	resw 1
  1401 00000C46 <res 0000043C>          Header:	resb	ModHeader.size
  1402                                  
  1403                                  ; MODPLAY.ASM
  1404                                  ;MixSpeed:	    resw 1
  1405                                  
  1406                                  ModInfo:
  1407 00001082 <res 00000001>          ModInfo.OrderLen:   resb 1
  1408 00001083 <res 00000001>          ModInfo.ReStart:    resb 1
  1409 00001084 <res 00000080>          ModInfo.Order:	    resb 128
  1410 00001104 <res 00000004>          ModInfo.Patterns:   resd 1
  1411                                  
  1412 00001108 <res 0000003E>          ModInfo.SampOfs:    resw 31
  1413 00001146 <res 0000003E>          ModInfo.SampSeg:    resw 31
  1414 00001184 <res 0000003E>          ModInfo.SampLen:    resw 31
  1415 000011C2 <res 0000003E>          ModInfo.SampRep:    resw 31
  1416 00001200 <res 0000003E>          ModInfo.SampRepLen: resw 31
  1417 0000123E <res 0000003E>          ModInfo.SampVol:    resw 31
  1418                                  
  1419                                  ; MODPLAY.ASM
  1420 0000127C <res 000006B2>          PitchTable:	resw 857
  1421 0000192E <res 00004100>          VolTable:	resb 16640
  1422 00005A2E <res 00001000>          MixBuffer       resb MixBufSize
  1423                                  
  1424                                  ; MODPLAY.ASM
  1425 00006A2E <res 00000001>          OrderPos:	resb 1
  1426 00006A2F <res 00000001>          Tempo:		resb 1
  1427 00006A30 <res 00000001>          TempoWait:	resb 1
  1428 00006A31 <res 00000001>          Bpm:		resb 1
  1429 00006A32 <res 00000001>          Row:		resb 1
  1430 00006A33 <res 00000001>          BreakRow:	resb 1
  1431 00006A34 <res 00000002>          BpmSamples:	resw 1
  1432 00006A36 <res 00000004>          BufPtr:		resd 1
  1433 00006A3A <res 00000002>          BufLen:		resw 1
  1434 00006A3C <res 00000004>          BufRep:		resd 1
  1435 00006A40 <res 00000004>          Note:		resd 1
  1436 00006A44 <res 00000090>          Tracks:		resb TrackInfo.size*NumTracks
  1437                                  
  1438 00006AD4 <res 0000000C>          alignb 16
  1439                                  
  1440                                  ; PLAY.ASM
  1441 00006AE0 <res 00000280>          Scope:		resw 320
  1442 00006D60 <res 00000200>          RowOfs:		resw 256
  1443                                  
  1444                                  mod_file_name:
  1445 00006F60 <res 00000050>          		resb 80
  1446                                  
  1447 00006FB0 <res 00000050>          alignb 4096
  1448                                  
  1449                                  Audio_Buffer:
  1450 00007000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  1451                                  
  1452                                  g_buff:
  1453 0000F000 <res 00000140>          		resb 320
  1454                                  		
  1455 0000F140 <res 00000EC0>          alignb 65536
  1456                                  
  1457                                  ;DMA_Buffer:
  1458                                  ;		resb 65536	
  1459                                  file_buffer:
  1460 00010000 <res 00060000>          		resb 65536*6
  1461                                  EOF:
