     1                                  ; ****************************************************************************
     2                                  ; tmodply3.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY3.PRG ! C'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 28/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 28/10/2017 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of 'playmod6.s' ('PLAYMOD6.PRG') 
    29                                  ; by Erdogan Tan (15/10/2017)
    30                                  ;
    31                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM')
    32                                  ; by Erdogan Tan (04/03/2017)
    33                                  ; 
    34                                  ; Assembler: NASM 2.11
    35                                  ; ----------------------------------------------------------------------------
    36                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    37                                  ; ****************************************************************************
    38                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    39                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    40                                  
    41                                  ; 01/03/2017
    42                                  ; 16/10/2016
    43                                  ; 29/04/2016
    44                                  ; TRDOS 386 system calls (temporary list!)
    45                                  _ver 	equ 0
    46                                  _exit 	equ 1
    47                                  _fork 	equ 2
    48                                  _read 	equ 3
    49                                  _write	equ 4
    50                                  _open	equ 5
    51                                  _close 	equ 6
    52                                  _wait 	equ 7
    53                                  _creat 	equ 8
    54                                  _link 	equ 9
    55                                  _unlink	equ 10
    56                                  _exec	equ 11
    57                                  _chdir	equ 12
    58                                  _time 	equ 13
    59                                  _mkdir 	equ 14
    60                                  _chmod	equ 15
    61                                  _chown	equ 16
    62                                  _break	equ 17
    63                                  _stat	equ 18
    64                                  _seek	equ 19
    65                                  _tell 	equ 20
    66                                  _mount	equ 21
    67                                  _umount	equ 22
    68                                  _setuid	equ 23
    69                                  _getuid	equ 24
    70                                  _stime	equ 25
    71                                  _quit	equ 26	
    72                                  _intr	equ 27
    73                                  _fstat	equ 28
    74                                  _emt 	equ 29
    75                                  _mdate 	equ 30
    76                                  _video 	equ 31
    77                                  _audio	equ 32
    78                                  _timer	equ 33
    79                                  _sleep	equ 34
    80                                  _msg    equ 35
    81                                  _geterr	equ 36
    82                                  _fpsave	equ 37
    83                                  _pri	equ 38
    84                                  _rele	equ 39
    85                                  _fff	equ 40
    86                                  _fnf	equ 41
    87                                  _alloc	equ 42
    88                                  _dalloc equ 43
    89                                  _calbac equ 44		
    90                                  
    91                                  %macro sys 1-4
    92                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    93                                      ; 03/09/2015	
    94                                      ; 13/04/2015
    95                                      ; Retro UNIX 386 v1 system call.	
    96                                      %if %0 >= 2   
    97                                          mov ebx, %2
    98                                          %if %0 >= 3    
    99                                              mov ecx, %3
   100                                              %if %0 = 4
   101                                                 mov edx, %4   
   102                                              %endif
   103                                          %endif
   104                                      %endif
   105                                      mov eax, %1
   106                                      ;int 30h
   107                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   108                                  %endmacro
   109                                  
   110                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   111                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   112                                  
   113                                  ; 19/06/2017
   114                                  BUFFERSIZE equ 32768
   115                                  
   116                                  ; ----------------------------------------------------------------------------
   117                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   118                                  ;	July 14th, 1993.
   119                                  
   120                                  ;=============================================================================
   121                                  ;  
   122                                  ;=============================================================================
   123                                  
   124                                  [BITS 32]
   125                                  [org 0]
   126                                  
   127                                  Start:
   128                                  	; clear bss
   129 00000000 B9[00000900]            	mov	ecx, EOF
   130 00000005 BF[50520000]            	mov	edi, bss_start
   131 0000000A 29F9                    	sub	ecx, edi
   132 0000000C D1E9                    	shr	ecx, 1
   133 0000000E 31C0                    	xor	eax, eax
   134 00000010 F366AB                  	rep	stosw
   135                                  
   136                                  	; Detect (& Enable) VT8233 Audio Device
   137 00000013 E815020000              	call    DetectVT8233
   138 00000018 731B                    	jnc     short GetFileName
   139                                  
   140                                  _dev_not_ready:
   141                                  ; couldn't find the audio device!
   142                                  	sys	_msg, noDevMsg, 255, 0Fh
   142                              <1> 
   142                              <1> 
   142                              <1> 
   142                              <1> 
   142                              <1>  %if %0 >= 2
   142 0000001A BB[3A020000]        <1>  mov ebx, %2
   142                              <1>  %if %0 >= 3
   142 0000001F B9FF000000          <1>  mov ecx, %3
   142                              <1>  %if %0 = 4
   142 00000024 BA0F000000          <1>  mov edx, %4
   142                              <1>  %endif
   142                              <1>  %endif
   142                              <1>  %endif
   142 00000029 B823000000          <1>  mov eax, %1
   142                              <1> 
   142 0000002E CD40                <1>  int 40h
   143 00000030 E9D7010000                      jmp     Exit
   144                                  
   145                                  GetFileName:
   146 00000035 89E6                    	mov	esi, esp
   147 00000037 AD                      	lodsd
   148 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   149                                  		; (program file name & mod file name)
   150 0000003B 0F82D4010000            	jb	pmsg_usage ; nothing to do
   151                                  
   152 00000041 AD                      	lodsd ; program file name address 
   153 00000042 AD                      	lodsd ; mod file name address (file to be read)
   154 00000043 89C6                    	mov	esi, eax
   155 00000045 BF[A0DF0000]            	mov	edi, mod_file_name
   156                                  ScanName:       
   157 0000004A AC                      	lodsb
   158 0000004B 84C0                    	test	al, al
   159 0000004D 0F84C2010000            	je	pmsg_usage
   160 00000053 3C20                    	cmp	al, 20h
   161 00000055 74F3                    	je	short ScanName	; scan start of name.
   162 00000057 AA                      	stosb
   163 00000058 B4FF                    	mov	ah, 0FFh
   164                                  a_0:	
   165 0000005A FEC4                    	inc	ah
   166                                  a_1:
   167 0000005C AC                      	lodsb
   168 0000005D AA                      	stosb
   169 0000005E 3C2E                    	cmp	al, '.'
   170 00000060 74F8                    	je	short a_0	
   171 00000062 20C0                    	and	al, al
   172 00000064 75F6                    	jnz	short a_1
   173                                  
   174 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   175 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   176                                  SetExt:
   177 0000006A 4F                      	dec	edi
   178 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   179 00000071 C6470400                	mov	byte [edi+4], 0
   180                                  PrintPMesg:      
   181                                  	; Prints the Credits Text.
   182                                  	sys	_msg, Credits, 255, 0Fh
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1>  %if %0 >= 2
   182 00000075 BB[36510000]        <1>  mov ebx, %2
   182                              <1>  %if %0 >= 3
   182 0000007A B9FF000000          <1>  mov ecx, %3
   182                              <1>  %if %0 = 4
   182 0000007F BA0F000000          <1>  mov edx, %4
   182                              <1>  %endif
   182                              <1>  %endif
   182                              <1>  %endif
   182 00000084 B823000000          <1>  mov eax, %1
   182                              <1> 
   182 00000089 CD40                <1>  int 40h
   183                                  _1:
   184                                  	; 19/06/2017
   185                                  	; Allocate Audio Buffer (for user)
   186                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   186                              <1> 
   186                              <1> 
   186                              <1> 
   186                              <1> 
   186                              <1>  %if %0 >= 2
   186 0000008B BB00020000          <1>  mov ebx, %2
   186                              <1>  %if %0 >= 3
   186 00000090 B900800000          <1>  mov ecx, %3
   186                              <1>  %if %0 = 4
   186 00000095 BA[00E00000]        <1>  mov edx, %4
   186                              <1>  %endif
   186                              <1>  %endif
   186                              <1>  %endif
   186 0000009A B820000000          <1>  mov eax, %1
   186                              <1> 
   186 0000009F CD40                <1>  int 40h
   187 000000A1 0F820E010000            	jc	error_exit
   188                                  _2:
   189                                  	;; Initialize Audio Device (bl = 1 -> Interrupt method)
   190                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   191                                  	;jc	error_exit
   192                                  	
   193                                  	; 20/10/2017
   194                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   195                                  	sys	_audio, 0300h, 1, srb 
   195                              <1> 
   195                              <1> 
   195                              <1> 
   195                              <1> 
   195                              <1>  %if %0 >= 2
   195 000000A7 BB00030000          <1>  mov ebx, %2
   195                              <1>  %if %0 >= 3
   195 000000AC B901000000          <1>  mov ecx, %3
   195                              <1>  %if %0 = 4
   195 000000B1 BA[6F520000]        <1>  mov edx, %4
   195                              <1>  %endif
   195                              <1>  %endif
   195                              <1>  %endif
   195 000000B6 B820000000          <1>  mov eax, %1
   195                              <1> 
   195 000000BB CD40                <1>  int 40h
   196 000000BD 0F82F2000000            	jc	error_exit
   197                                  
   198                                  LoadMod:  
   199 000000C3 BF[A0DF0000]            	mov	edi, mod_file_name
   200 000000C8 E85C020000              	call    LoadModule		; Load the MODule...
   201                                  	; 08/10/2017
   202 000000CD 731B                    	jnc	short _3		; any error loading?
   203                                  
   204                                  	; yes, print error and Exit.
   205                                  
   206                                  	sys	_msg, ErrorMesg, 255, 0Fh
   206                              <1> 
   206                              <1> 
   206                              <1> 
   206                              <1> 
   206                              <1>  %if %0 >= 2
   206 000000CF BB[6A510000]        <1>  mov ebx, %2
   206                              <1>  %if %0 >= 3
   206 000000D4 B9FF000000          <1>  mov ecx, %3
   206                              <1>  %if %0 = 4
   206 000000D9 BA0F000000          <1>  mov edx, %4
   206                              <1>  %endif
   206                              <1>  %endif
   206                              <1>  %endif
   206 000000DE B823000000          <1>  mov eax, %1
   206                              <1> 
   206 000000E3 CD40                <1>  int 40h
   207 000000E5 E922010000              	jmp     Exit
   208                                  _3:
   209                                  	; 10/06/2017
   210                                  	sys	_audio, 0E00h ; get audio controller info
   210                              <1> 
   210                              <1> 
   210                              <1> 
   210                              <1> 
   210                              <1>  %if %0 >= 2
   210 000000EA BB000E0000          <1>  mov ebx, %2
   210                              <1>  %if %0 >= 3
   210                              <1>  mov ecx, %3
   210                              <1>  %if %0 = 4
   210                              <1>  mov edx, %4
   210                              <1>  %endif
   210                              <1>  %endif
   210                              <1>  %endif
   210 000000EF B820000000          <1>  mov eax, %1
   210                              <1> 
   210 000000F4 CD40                <1>  int 40h
   211 000000F6 0F82B9000000            	jc	error_exit
   212                                  
   213                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   214                                  	;jne	_dev_not_ready		
   215                                  
   216                                  	; EAX = IRQ Number in AL
   217                                  	;	Audio Device Number in AH 
   218                                  	; EBX = DEV/VENDOR ID
   219                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   220                                  	; ECX = BUS/DEV/FN 
   221                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   222                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   223                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   224                                  	;      (Low word, DX = NAMBAR address)
   225                                  
   226 000000FC A2[6E520000]            	mov	[ac97_int_ln_reg], al
   227 00000101 891D[60520000]          	mov	[dev_vendor], ebx
   228 00000107 890D[64520000]          	mov	[bus_dev_fn], ecx
   229 0000010D 668915[6C520000]        	mov	[ac97_io_base], dx	
   230                                    
   231 00000114 E8CA0A0000              	call	write_audio_dev_info 
   232                                  
   233                                  PlayNow: 
   234 00000119 E8E4090000              	call    StartPlaying
   235                                  
   236                                          ; load 32768 bytes into audio buffer
   237 0000011E BF[00E00000]            	mov	edi, Audio_Buffer
   238                                  	; 19/10/2017
   239                                  	;mov	ebx, BUFFERSIZE
   240 00000123 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   241 00000128 E883080000              	call	GetSamples
   242 0000012D 0F8282000000            	jc	error_exit
   243                                  
   244                                  ;	;mov	ecx, 128	; Make a lookup table
   245                                  ;	mov	cl, 128
   246                                  ;	xor     ebx, ebx	; for fastest pixel
   247                                  ;	mov     edx, 320*(100-64)	; addressing.
   248                                  ;MakeOfs:        
   249                                  ;	mov     [RowOfs+ebx], dx
   250                                  ;	mov     [RowOfs+ebx+2], dx
   251                                  ;	add     dx, 320
   252                                  ;	add     ebx, 4
   253                                  ;	loop    MakeOfs
   254                                  
   255                                  	; 27/10/2017
   256 00000133 66B90001                	mov	cx, 256
   257 00000137 31DB                    	xor	ebx, ebx
   258 00000139 BF[A0D50000]            	mov	edi, RowOfs
   259                                  MakeOfs:
   260 0000013E 66B88000                	mov	ax, 128
   261 00000142 66F7E3                  	mul	bx
   262 00000145 88E0                    	mov	al, ah
   263 00000147 B450                    	mov	ah, 80
   264 00000149 F6E4                    	mul	ah
   265 0000014B 66AB                    	stosw
   266 0000014D 43                      	inc	ebx
   267 0000014E E2EE                    	loop	MakeOfs
   268                                  	
   269                                  	; 09/10/2017 (2*BUFFERSIZE, 64K)
   270                                  	; 23/06/2017
   271                                  	; Map DMA buffer to user's memory space
   272                                  	sys	_audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer
   272                              <1> 
   272                              <1> 
   272                              <1> 
   272                              <1> 
   272                              <1>  %if %0 >= 2
   272 00000150 BB000D0000          <1>  mov ebx, %2
   272                              <1>  %if %0 >= 3
   272 00000155 B900000100          <1>  mov ecx, %3
   272                              <1>  %if %0 = 4
   272 0000015A BA[00000200]        <1>  mov edx, %4
   272                              <1>  %endif
   272                              <1>  %endif
   272                              <1>  %endif
   272 0000015F B820000000          <1>  mov eax, %1
   272                              <1> 
   272 00000164 CD40                <1>  int 40h
   273                                  	;jc	error_exit
   274                                  
   275                                  	; 24/06/2017
   276                                  	; Set Master Volume Level (BL=0 or 80h)
   277                                  	; 	 	for next playing (BL>=80h)
   278                                  	sys	_audio, 0B80h, 1D1Dh
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1> 
   278                              <1>  %if %0 >= 2
   278 00000166 BB800B0000          <1>  mov ebx, %2
   278                              <1>  %if %0 >= 3
   278 0000016B B91D1D0000          <1>  mov ecx, %3
   278                              <1>  %if %0 = 4
   278                              <1>  mov edx, %4
   278                              <1>  %endif
   278                              <1>  %endif
   278                              <1>  %endif
   278 00000170 B820000000          <1>  mov eax, %1
   278                              <1> 
   278 00000175 CD40                <1>  int 40h
   279                                  
   280                                  	; 20/10/2017
   281 00000177 C605[F1DF0000]1D        	mov	byte [volume_level], 1Dh
   282                                  
   283                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   284                                  	
   285                                  	; Start	to play
   286 0000017E A0[AD510000]            	mov	al, [bps]
   287 00000183 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   288 00000186 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   289 00000188 8A1D[AC510000]          	mov	bl, [stmo]
   290 0000018E FECB                    	dec	bl
   291 00000190 08C3                    	or	bl, al
   292 00000192 668B0D[AE510000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   293 00000199 B704                    	mov	bh, 4 ; start to play	
   294                                  	sys	_audio
   294                              <1> 
   294                              <1> 
   294                              <1> 
   294                              <1> 
   294                              <1>  %if %0 >= 2
   294                              <1>  mov ebx, %2
   294                              <1>  %if %0 >= 3
   294                              <1>  mov ecx, %3
   294                              <1>  %if %0 = 4
   294                              <1>  mov edx, %4
   294                              <1>  %endif
   294                              <1>  %endif
   294                              <1>  %endif
   294 0000019B B820000000          <1>  mov eax, %1
   294                              <1> 
   294 000001A0 CD40                <1>  int 40h
   295                                      
   296                                  	;; SETUP SIGNAL RESPONSE BYTE
   297                                  	;; 06/03/2017
   298                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   299                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   300                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   301                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   302                                  	;sys	_calbac
   303                                  	;jc	short error_exit
   304                                  
   305                                  	; DIRECT VGA MEMORY ACCESS
   306                                  	; bl = 0, bh = 5
   307                                  	; Direct access/map to VGA memory (0A0000h)
   308                                  
   309                                  	sys	_video, 0500h
   309                              <1> 
   309                              <1> 
   309                              <1> 
   309                              <1> 
   309                              <1>  %if %0 >= 2
   309 000001A2 BB00050000          <1>  mov ebx, %2
   309                              <1>  %if %0 >= 3
   309                              <1>  mov ecx, %3
   309                              <1>  %if %0 = 4
   309                              <1>  mov edx, %4
   309                              <1>  %endif
   309                              <1>  %endif
   309                              <1>  %endif
   309 000001A7 B81F000000          <1>  mov eax, %1
   309                              <1> 
   309 000001AC CD40                <1>  int 40h
   310 000001AE 3D00000A00              	cmp	eax, 0A0000h
   311 000001B3 7418                    	je	short _a3
   312                                  error_exit:
   313                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1> 
   313                              <1>  %if %0 >= 2
   313 000001B5 BB[87510000]        <1>  mov ebx, %2
   313                              <1>  %if %0 >= 3
   313 000001BA B9FF000000          <1>  mov ecx, %3
   313                              <1>  %if %0 = 4
   313 000001BF BA0E000000          <1>  mov edx, %4
   313                              <1>  %endif
   313                              <1>  %endif
   313                              <1>  %endif
   313 000001C4 B823000000          <1>  mov eax, %1
   313                              <1> 
   313 000001C9 CD40                <1>  int 40h
   314 000001CB EB3F                    	jmp	short Exit
   315                                  
   316                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   317                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   318                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   319                                  ;       second, or the module will sound "looped".
   320                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   321                                  ;       the polling is called from my routine, and then the irq 0 must be
   322                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   323                                  ;       samples played by the Sound Blaster. Note that some samples are
   324                                  ;       discarded in the next code, just for fun!
   325                                  
   326                                  _a3:
   327                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   328                                  	;int     31h
   329                                  
   330                                  	; 21/10/2017
   331                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   332                                  	;int	31h
   333                                  
   334                                  	; 22/10/2017
   335 000001CD E8920B0000              	call	setgraphmode	; Set video mode to 640*480x16
   336                                  
   337                                  	; 22/10/2017
   338                                  	;call	loadlbm
   339                                  	;jc	short loadlbm_err
   340                                  
   341 000001D2 BE[940F0000]            	mov	esi, LOGO_ADDRESS
   342 000001D7 E87E0C0000              	call	putlbm
   343                                  	;jnc	short loadlbm_ok
   344 000001DC 731F                    	jnc	short _a4 ; 
   345                                  
   346                                  	;mov	byte [error_color], 0Eh ; Yellow
   347                                  
   348                                  loadlbm_err:
   349                                  	; 21/10/2017
   350                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   351                                  	;int	31h
   352                                  	; 22/10/2017
   353 000001DE E89E0B0000              	call	settextmode
   354                                  
   355                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
   355                              <1> 
   355                              <1> 
   355                              <1> 
   355                              <1> 
   355                              <1>  %if %0 >= 2
   355 000001E3 BB[680F0000]        <1>  mov ebx, %2
   355                              <1>  %if %0 >= 3
   355 000001E8 B9FF000000          <1>  mov ecx, %3
   355                              <1>  %if %0 = 4
   355 000001ED 8B15[FC010000]      <1>  mov edx, %4
   355                              <1>  %endif
   355                              <1>  %endif
   355                              <1>  %endif
   355 000001F3 B823000000          <1>  mov eax, %1
   355                              <1> 
   355 000001F8 CD40                <1>  int 40h
   356 000001FA EB10                    	jmp	short Exit
   357                                  
   358                                  	; 21/10/2017
   359                                  error_color:
   360 000001FC 0C                      	db	0Ch  ; Light Red
   361                                  	
   362                                  loadlbm_ok: 
   363                                  	; 21/10/2017
   364                                  _a4:
   365                                  	; 24/06/2017
   366 000001FD E86F000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   367                                  
   368                                  _s_exit:
   369 00000202 E8AB090000              	call	StopPlaying	; STOP!
   370                                  	
   371                                  	; 22/10/2017
   372                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   373                                  	;int	31h
   374 00000207 E8750B0000              	call	settextmode
   375                                  Exit:           
   376                                  	;call	FreeModule	; Free MODule core.
   377                                  	
   378                                  	sys 	_exit	; Bye !
   378                              <1> 
   378                              <1> 
   378                              <1> 
   378                              <1> 
   378                              <1>  %if %0 >= 2
   378                              <1>  mov ebx, %2
   378                              <1>  %if %0 >= 3
   378                              <1>  mov ecx, %3
   378                              <1>  %if %0 = 4
   378                              <1>  mov edx, %4
   378                              <1>  %endif
   378                              <1>  %endif
   378                              <1>  %endif
   378 0000020C B801000000          <1>  mov eax, %1
   378                              <1> 
   378 00000211 CD40                <1>  int 40h
   379                                  here:
   380 00000213 EBFE                    	jmp	short here
   381                                  
   382                                  pmsg_usage:
   383                                  	sys	_msg, msg_usage, 255, 0Fh
   383                              <1> 
   383                              <1> 
   383                              <1> 
   383                              <1> 
   383                              <1>  %if %0 >= 2
   383 00000215 BB[CD500000]        <1>  mov ebx, %2
   383                              <1>  %if %0 >= 3
   383 0000021A B9FF000000          <1>  mov ecx, %3
   383                              <1>  %if %0 = 4
   383 0000021F BA0F000000          <1>  mov edx, %4
   383                              <1>  %endif
   383                              <1>  %endif
   383                              <1>  %endif
   383 00000224 B823000000          <1>  mov eax, %1
   383                              <1> 
   383 00000229 CD40                <1>  int 40h
   384 0000022B EBDF                    	jmp	short Exit
   385                                  
   386                                  DetectVT8233:
   387                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   388                                          sys	_audio, 0103h
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1>  %if %0 >= 2
   388 0000022D BB03010000          <1>  mov ebx, %2
   388                              <1>  %if %0 >= 3
   388                              <1>  mov ecx, %3
   388                              <1>  %if %0 = 4
   388                              <1>  mov edx, %4
   388                              <1>  %endif
   388                              <1>  %endif
   388                              <1>  %endif
   388 00000232 B820000000          <1>  mov eax, %1
   388                              <1> 
   388 00000237 CD40                <1>  int 40h
   389 00000239 C3                      	retn
   390                                  
   391                                  noDevMsg:
   392 0000023A 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   392 00000243 61626C6520746F2066-
   392 0000024C 696E64205649412056-
   392 00000255 543832333320626173-
   392 0000025E 656420617564696F20-
   392 00000267 646576696365210D0A-
   392 00000270 00                 
   393                                  
   394                                  ;ac97_int_handler: ; 28/10/2017
   395                                  ;	; 14/10/2017
   396                                  ;	; 09/10/2017
   397                                  ;	; 19/06/2017
   398                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   399                                  ;
   400                                  ;	;mov	ebx, BUFFERSIZE
   401                                  ;	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   402                                  ;	call	GetSamples
   403                                  ;	jc	error_exit
   404                                  ;
   405                                  ;	sys	_rele ; return from callback service 
   406                                  ;	; we must not come here !
   407                                  ;	sys	_exit
   408                                  
   409                                  ;=============================================================================
   410                                  ;      
   411                                  ;=============================================================================
   412                                  
   413                                  PlayMod:
   414                                  	; 27/10/2017
   415                                  	; 19/10/2017
   416                                  	; 23/06/2017   
   417                                  	; 21/06/2017
   418                                  	; 19/06/2017
   419                                  
   420                                  	; 05/03/2017 (TRDOS 386)
   421                                  	; 14/02/2017
   422                                  	; 13/02/2017
   423                                  	; 08/12/2016
   424                                  	; 28/11/2016
   425                                  
   426 00000271 EB10                         	jmp	short modp_gs ; 23/06/2017
   427                                  p_loop:
   428 00000273 803D[6F520000]00        	cmp	byte [srb], 0
   429 0000027A 761C                    	jna	short q_loop
   430 0000027C C605[6F520000]00        	mov	byte [srb], 0
   431                                  modp_gs:
   432 00000283 BF[00E00000]            	mov	edi, Audio_Buffer
   433                                  	; 19/10/2017
   434                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   435 00000288 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   436 0000028D E81E070000              	call	GetSamples
   437 00000292 0F821DFFFFFF            	jc	error_exit
   438                                  q_loop:
   439 00000298 B401                    	mov     ah, 1		; any key pressed?
   440 0000029A CD32                    	int     32h		; no, Loop.
   441 0000029C 745C                    	jz	short r_loop
   442                                  
   443 0000029E B400                    	mov     ah, 0		; flush key buffer...
   444 000002A0 CD32                    	int     32h
   445                                  
   446                                  	; 19/10/2017 (modplay6.s)
   447 000002A2 3C20                    	cmp	al, 20h
   448 000002A4 740E                    	je	short change_pan
   449                                  	; 09/10/2017 (playmod5.s)
   450 000002A6 3C2B                    	cmp	al, '+' ; increase sound volume
   451 000002A8 741D                    	je	short inc_volume_level
   452 000002AA 3C2D                    	cmp	al, '-'
   453 000002AC 743C                    	je	short dec_volume_level
   454                                  
   455                                  	; 19/10/2017 (modplay6.s)
   456 000002AE 24DF                    	and	al, 0DFh
   457 000002B0 3C50                    	cmp	al, 'P'
   458 000002B2 7545                    	jne	short q_return
   459                                  
   460                                  change_pan:
   461                                  	; 19/10/2017 (modplay6.s)
   462 000002B4 8A0D[F0DF0000]          	mov	cl, [pan_shift]
   463 000002BA FEC1                    	inc	cl
   464 000002BC 80E103                  	and	cl, 3
   465 000002BF 880D[F0DF0000]          	mov	[pan_shift], cl
   466 000002C5 EB33                    	jmp	short r_loop
   467                                  
   468                                  	; 09/10/2017 (playmod5.s)
   469                                  	; 24/06/2017 (wavplay2.s)
   470                                  inc_volume_level:
   471 000002C7 8A0D[F1DF0000]          	mov	cl, [volume_level]
   472 000002CD 80F91F                  	cmp	cl, 1Fh ; 31
   473 000002D0 7328                    	jnb	short r_loop
   474 000002D2 FEC1                    	inc	cl
   475                                  change_volume_level:
   476 000002D4 880D[F1DF0000]          	mov	[volume_level], cl
   477 000002DA 88CD                    	mov	ch, cl
   478                                  	; Set Master Volume Level
   479                                  	sys	_audio, 0B00h
   479                              <1> 
   479                              <1> 
   479                              <1> 
   479                              <1> 
   479                              <1>  %if %0 >= 2
   479 000002DC BB000B0000          <1>  mov ebx, %2
   479                              <1>  %if %0 >= 3
   479                              <1>  mov ecx, %3
   479                              <1>  %if %0 = 4
   479                              <1>  mov edx, %4
   479                              <1>  %endif
   479                              <1>  %endif
   479                              <1>  %endif
   479 000002E1 B820000000          <1>  mov eax, %1
   479                              <1> 
   479 000002E6 CD40                <1>  int 40h
   480 000002E8 EB10                    	jmp	short r_loop
   481                                  dec_volume_level:
   482 000002EA 8A0D[F1DF0000]          	mov	cl, [volume_level]
   483 000002F0 80F901                  	cmp	cl, 1 ; 1
   484 000002F3 7605                    	jna	short r_loop
   485 000002F5 FEC9                    	dec	cl
   486 000002F7 EBDB                    	jmp	short change_volume_level
   487                                  
   488                                  q_return:
   489 000002F9 C3                      	retn
   490                                  r_loop:
   491                                  	; 27/10/2017
   492                                  	; Get Current DMA buffer Pointer 
   493                                  	; 23/06/2017 ('modplay6.s')
   494                                  	; bh = 15, get current pointer (DMA buffer offset)
   495                                  	; bl = 0, for PCM OUT
   496                                  	; ecx = 0
   497                                  	;
   498                                  	sys	_audio, 0F00h, 0
   498                              <1> 
   498                              <1> 
   498                              <1> 
   498                              <1> 
   498                              <1>  %if %0 >= 2
   498 000002FA BB000F0000          <1>  mov ebx, %2
   498                              <1>  %if %0 >= 3
   498 000002FF B900000000          <1>  mov ecx, %3
   498                              <1>  %if %0 = 4
   498                              <1>  mov edx, %4
   498                              <1>  %endif
   498                              <1>  %endif
   498                              <1>  %endif
   498 00000304 B820000000          <1>  mov eax, %1
   498                              <1> 
   498 00000309 CD40                <1>  int 40h
   499                                  
   500                                  	; 28/10/2017
   501 0000030B 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   502                                  	; 23/06/2017
   503 0000030D BE[00000200]            	mov     esi, DMA_Buffer
   504 00000312 01C6                    	add     esi, eax	; add offset value
   505                                  	; 24/06/2017
   506 00000314 B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   507 00000319 39CE                    	cmp	esi, ecx 
   508 0000031B 7602                    	jna	short _4
   509 0000031D 89CE                    	mov	esi, ecx
   510                                  _4:
   511                                  	; 23/10/2017 ('tmodplay.s')
   512 0000031F E8640A0000              	call	drawscopes
   513                                  
   514 00000324 E94AFFFFFF              	jmp	p_loop
   515                                  
   516                                  ;=============================================================================
   517                                  ;               MODLOAD.ASM
   518                                  ;=============================================================================
   519                                  
   520                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   521                                  ;	July 10th, 1993.
   522                                  
   523                                  ; STRUCTURES
   524                                  
   525                                  struc ModSample
   526 00000000 <res 00000016>          .msName:	resb 22
   527 00000016 <res 00000002>          .msLength:	resw 1
   528 00000018 <res 00000001>          .msFinetune:	resb 1
   529 00000019 <res 00000001>          .msVolume:	resb 1
   530 0000001A <res 00000002>          .msRepeat:	resw 1
   531 0000001C <res 00000002>          .msRepLen:	resw 1
   532                                  .size:		; 30 bytes
   533                                  endstruc
   534                                  
   535                                  struc ModHeader
   536 00000000 <res 00000014>          .mhName:	resb 20
   537 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   538 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   539 000003B7 <res 00000001>          .mhReStart:	resb 1
   540 000003B8 <res 00000080>          .mhOrder:	resb 128
   541 00000438 <res 00000004>          .mhSign:	resw 2
   542                                  .size:		; 1084 bytes
   543                                  endstruc
   544                                  
   545                                  struc ModInfoRec
   546 00000000 <res 00000001>          .OrderLen:	resb 1
   547 00000001 <res 00000001>          .ReStart:	resb 1
   548 00000002 <res 00000080>          .Order:		resb 128
   549 00000082 <res 00000004>          .Patterns:	resd 1
   550 00000086 <res 0000003E>          .SampOfs:	resw 31
   551 000000C4 <res 0000003E>          .SampSeg:	resw 31
   552 00000102 <res 0000003E>          .SampLen:	resw 31
   553 00000140 <res 0000003E>          .SampRep:	resw 31
   554 0000017E <res 0000003E>          .SampRepLen:	resw 31
   555 000001BC <res 0000003E>          .SampVol:	resw 31
   556                                  .size:		; 506 bytes	
   557                                  endstruc
   558                                  
   559                                  ; CODE
   560                                  
   561                                  ; modplay5.s
   562                                  ; 07/10/2017
   563                                  ; tinyply3.s
   564                                  ; 06/10/2017
   565                                  ; 04/10/2017
   566                                  ; /* MOD FileFormat */
   567                                  
   568                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   569                                  ID_FLT4 equ 34544C46h ; "FLT4"
   570                                  ID_8CHN equ 4E484338h ; "8CHN"
   571                                  ID_FLT8 equ 34544C46h ; "FLT8"
   572                                  
   573                                  ; CODE
   574                                  
   575                                  LoadModule:
   576                                  	; edi = file name address
   577                                  
   578 00000329 60                      	pushad
   579                                  
   580 0000032A E878010000              	call    ClearModInfo
   581                                  OpenFile:       
   582                                  	; ebx = ASCIIZ file name address
   583                                  	; ecx = open mode (0 = open for read)	
   584                                  	sys	_open, edi, 0 ; open for reading
   584                              <1> 
   584                              <1> 
   584                              <1> 
   584                              <1> 
   584                              <1>  %if %0 >= 2
   584 0000032F 89FB                <1>  mov ebx, %2
   584                              <1>  %if %0 >= 3
   584 00000331 B900000000          <1>  mov ecx, %3
   584                              <1>  %if %0 = 4
   584                              <1>  mov edx, %4
   584                              <1>  %endif
   584                              <1>  %endif
   584                              <1>  %endif
   584 00000336 B805000000          <1>  mov eax, %1
   584                              <1> 
   584 0000033B CD40                <1>  int 40h
   585 0000033D 0F8262010000            	jc	Failed
   586 00000343 A3[70520000]            	mov     [FileHandle], eax
   587                                  ReadHeader:
   588                                  	; ebx = File handle
   589                                  	; ecx = Buffer address
   590                                  	; edx = Byte count
   591                                  	sys	_read, [FileHandle], Header, ModHeader.size
   591                              <1> 
   591                              <1> 
   591                              <1> 
   591                              <1> 
   591                              <1>  %if %0 >= 2
   591 00000348 8B1D[70520000]      <1>  mov ebx, %2
   591                              <1>  %if %0 >= 3
   591 0000034E B9[74520000]        <1>  mov ecx, %3
   591                              <1>  %if %0 = 4
   591 00000353 BA3C040000          <1>  mov edx, %4
   591                              <1>  %endif
   591                              <1>  %endif
   591                              <1>  %endif
   591 00000358 B803000000          <1>  mov eax, %1
   591                              <1> 
   591 0000035D CD40                <1>  int 40h
   592 0000035F 0F8231010000            	jc      CloseFile
   593                                  CheckMK:  
   594                                  	; 04/10/2017
   595 00000365 A1[AC560000]            	mov	eax, [Header+ModHeader.mhSign]
   596                                        
   597 0000036A 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   598                                  	;je	short Is4chnMod
   599 0000036F 742B                    	je	short IsModFile
   600                                  CheckFLT4:
   601 00000371 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   602                                  	;je	short Is4chnMod
   603 00000376 7424                    	je	short IsModFile
   604                                  Check8CHN:
   605 00000378 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   606 0000037D 740D                    	je	short Is8chnMod
   607                                  CheckFLT8:
   608 0000037F 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   609                                  	; 06/10/2017
   610 00000384 7406                    	je	short Is8chnMod
   611 00000386 F9                      	stc
   612 00000387 E90A010000              	jmp	CloseFile
   613                                  Is8chnMod:
   614 0000038C C605[A8510000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   615 00000393 C605[A7510000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   616 0000039A EB00                    	jmp	short IsModFile
   617                                  ;Is4chnMod:
   618                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   619                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   620                                  
   621                                  IsModFile:
   622 0000039C A0[2A560000]            	mov     al, [Header+ModHeader.mhOrderLen]
   623 000003A1 A2[B0560000]            	mov     [ModInfo.OrderLen], al
   624                                  
   625 000003A6 A0[2B560000]            	mov     al, [Header+ModHeader.mhReStart]
   626 000003AB 3A05[2A560000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   627 000003B1 7202                    	jb      short SetReStart
   628 000003B3 B07F                    	mov     al, 7Fh
   629                                  SetReStart:
   630 000003B5 A2[B1560000]            	mov     [ModInfo.ReStart], al
   631                                  
   632                                  	;mov	ecx, 128
   633 000003BA 66B98000                	mov	cx, 128
   634 000003BE 31D2                    	xor     edx, edx
   635 000003C0 31DB                    	xor     ebx, ebx
   636                                  CopyOrder:
   637 000003C2 8AB3[2C560000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   638 000003C8 88B3[B2560000]          	mov     [ModInfo.Order+ebx], dh
   639 000003CE 38D6                    	cmp     dh, dl
   640 000003D0 7202                    	jb      short NextOrder
   641 000003D2 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   642                                  NextOrder:
   643 000003D4 43                      	inc     ebx
   644 000003D5 E2EB                    	loop    CopyOrder
   645                                  AllocPatterns:  
   646 000003D7 81E2FF000000            	and	edx, 0FFh
   647                                  	; 04/10/2017
   648                                  	;inx	dx  ; 12/03/2017
   649 000003DD FEC2                    	inc	dl
   650                                  	; dl = number of patterns (04/07/2017)
   651 000003DF 8A0D[A7510000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   652 000003E5 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   653                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   654                                  	;
   655 000003E7 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   656                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   657 000003E9 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   658                                  	;
   659 000003EE 890D[32570000]          	mov	[ModInfo.Patterns], ecx
   660                                  	;
   661 000003F4 01CD                    	add	ebp, ecx ; next offset for samples
   662                                  ReadPatterns:  
   663                                  	;mov	ebx, [FileHandle] 
   664                                  	; ebx = File handle
   665                                  	; ecx = Buffer address
   666                                  	; edx = Byte count
   667                                  	sys	_read, [FileHandle]
   667                              <1> 
   667                              <1> 
   667                              <1> 
   667                              <1> 
   667                              <1>  %if %0 >= 2
   667 000003F6 8B1D[70520000]      <1>  mov ebx, %2
   667                              <1>  %if %0 >= 3
   667                              <1>  mov ecx, %3
   667                              <1>  %if %0 = 4
   667                              <1>  mov edx, %4
   667                              <1>  %endif
   667                              <1>  %endif
   667                              <1>  %endif
   667 000003FC B803000000          <1>  mov eax, %1
   667                              <1> 
   667 00000401 CD40                <1>  int 40h
   668 00000403 0F828D000000            	jc      CloseFile
   669                                  
   670                                  	; patterns have been loaded here... (04/07/2017)
   671                                  
   672 00000409 BE[88520000]            	mov	esi, Header+ModHeader.mhSamples
   673 0000040E 31FF                    	xor     edi, edi
   674                                  CopySamples:
   675 00000410 668B4616                	mov     ax, [esi+ModSample.msLength]
   676 00000414 86C4                    	xchg    al, ah
   677 00000416 66D1E0                  	shl     ax, 1
   678 00000419 668987[B2570000]        	mov     [ModInfo.SampLen+edi], ax
   679 00000420 8A4619                  	mov     al, [esi+ModSample.msVolume]
   680 00000423 30E4                    	xor     ah, ah
   681 00000425 668987[6C580000]        	mov     [ModInfo.SampVol+edi], ax
   682 0000042C 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   683 00000430 86C4                    	xchg    al, ah
   684 00000432 66D1E0                  	shl     ax, 1
   685 00000435 668987[F0570000]        	mov     [ModInfo.SampRep+edi], ax
   686 0000043C 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   687 00000440 86C4                    	xchg    al, ah
   688 00000442 66D1E0                  	shl     ax, 1
   689 00000445 668987[2E580000]        	mov     [ModInfo.SampRepLen+edi], ax
   690 0000044C 83C61E                  	add     esi, ModSample.size
   691 0000044F 6683C702                	add     di, 2
   692 00000453 6683FF3E                	cmp     di, 2*31
   693 00000457 72B7                    	jb      short CopySamples
   694                                  
   695 00000459 31F6                    	xor     esi, esi
   696                                  AllocSamples:
   697 0000045B 0FB796[B2570000]        	movzx	edx, word [ModInfo.SampLen+esi]
   698                                  	; 07/10/2017
   699                                  	;shr	dx, 4 ; ***
   700 00000462 21D2                    	and	edx, edx
   701 00000464 7426                    	jz      short NextSample
   702                                  	;inc	dx  ; number of paragraphs ; ***
   703                                  	;shl	dx, 4 ; ***
   704 00000466 89E8                    	mov	eax, ebp
   705 00000468 668986[36570000]        	mov	[ModInfo.SampOfs+esi], ax
   706 0000046F C1E810                  	shr	eax, 16
   707 00000472 668986[74570000]        	mov	[ModInfo.SampSeg+esi], ax
   708 00000479 89E9                    	mov	ecx, ebp
   709 0000047B 01D5                    	add	ebp, edx ; next offset for sample 
   710                                  ReadSample:
   711                                  	;mov	ebx, [FileHandle]
   712                                  	;movzx  edx, [ModInfo.SampLen+esi]
   713                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   714                                  
   715                                  	; ebx = File handle
   716                                  	; ecx = Buffer address
   717                                  	; edx = Byte count
   718                                  	sys	_read, [FileHandle]
   718                              <1> 
   718                              <1> 
   718                              <1> 
   718                              <1> 
   718                              <1>  %if %0 >= 2
   718 0000047D 8B1D[70520000]      <1>  mov ebx, %2
   718                              <1>  %if %0 >= 3
   718                              <1>  mov ecx, %3
   718                              <1>  %if %0 = 4
   718                              <1>  mov edx, %4
   718                              <1>  %endif
   718                              <1>  %endif
   718                              <1>  %endif
   718 00000483 B803000000          <1>  mov eax, %1
   718                              <1> 
   718 00000488 CD40                <1>  int 40h
   719 0000048A 720A                    	jc      short CloseFile
   720                                  
   721                                  NextSample:
   722 0000048C 6683C602                	add     si, 2
   723 00000490 6683FE3E                	cmp     si, 2*31
   724 00000494 72C5                    	jb      short AllocSamples
   725                                  CloseFile:      
   726 00000496 9C                      	pushf
   727                                  	sys	_close, [FileHandle]
   727                              <1> 
   727                              <1> 
   727                              <1> 
   727                              <1> 
   727                              <1>  %if %0 >= 2
   727 00000497 8B1D[70520000]      <1>  mov ebx, %2
   727                              <1>  %if %0 >= 3
   727                              <1>  mov ecx, %3
   727                              <1>  %if %0 = 4
   727                              <1>  mov edx, %4
   727                              <1>  %endif
   727                              <1>  %endif
   727                              <1>  %endif
   727 0000049D B806000000          <1>  mov eax, %1
   727                              <1> 
   727 000004A2 CD40                <1>  int 40h
   728 000004A4 9D                      	popf
   729                                  Failed:       
   730 000004A5 61                      	popad
   731 000004A6 C3                      	retn
   732                                  
   733                                  FreeModule:
   734                                  	; Erdogan Tan (13/02/2017)
   735                                  	; nothing to do here for memory de-allocation
   736                                  ClearModInfo:
   737 000004A7 57                      	push	edi
   738 000004A8 BF[B0560000]            	mov	edi, ModInfo
   739 000004AD B9FA010000              	mov     ecx, ModInfoRec.size
   740                                  	;cld
   741 000004B2 30C0                    	xor     al, al
   742 000004B4 F3AA                    	rep     stosb
   743 000004B6 5F                      	pop	edi
   744 000004B7 C3                      	retn
   745                                  
   746                                  ;=============================================================================
   747                                  ;               MODPLAY.ASM
   748                                  ;=============================================================================
   749                                  
   750                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   751                                  ;	July 23th, 1993.
   752                                  
   753                                  ; EQUATES
   754                                  
   755                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   756                                  DefTempo        equ 6
   757                                  DefBpm          equ 125
   758                                  MidCRate        equ 8448
   759                                  MixBufSize	equ 4096
   760                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   761                                  
   762                                  ; STRUCTURES
   763                                  
   764                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   765 00000000 <res 00000004>          .Samples:	resd 1
   766                                  ;.Position:	resw 1
   767 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   768 00000008 <res 00000002>          .Len:		resw 1
   769 0000000A <res 00000002>          .Repeat:	resw 1
   770 0000000C <res 00000002>          .RepLen:	resw 1
   771 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   772 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   773                                  ;.Error:	resb 1
   774                                  ;.Reserved:	resb 1 ; 01/10/2017
   775 00000010 <res 00000002>          .Period:	resw 1 ; Period
   776 00000012 <res 00000002>          .Pitch:		resw 1 
   777 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   778 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   779 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   780 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   781 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   782 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   783 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   784                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   785 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
   786 0000001E <res 00000006>          .Arp:		resw 3
   787 00000024 <res 00000002>          .ArpIndex:	resw 1
   788                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   789                                  endstruc
   790                                  
   791                                  ; CODE
   792                                  
   793                                  ;--------------------------------------------------------------------------
   794                                  ; updatechannel - update the track using the current effect
   795                                  ;--------------------------------------------------------------------------
   796                                  ; 
   797                                  ;--------------------------------------------------------------------------
   798                                  ; 	Track:  Process the next 	 in one track.
   799                                  ;  In:
   800                                  ;    ds:di -  Track info Address.
   801                                  ;--------------------------------------------------------------------------
   802                                  
   803                                  ; edi = Track info address
   804                                  
   805                                  updatechannel:
   806                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   807                                  
   808 000004B8 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   809                                  
   810                                  	;test   dx, dx
   811                                  	;je     short None
   812                                  	;cmp    dh, 00h
   813                                  	;je     short Arpeggio
   814                                  	;cmp    dh, 01h
   815                                  	;je     short PortUp
   816                                  	;cmp    dh, 02h
   817                                  	;je     short PortDown
   818                                  	;cmp    dh, 03h
   819                                  	;je     TonePort
   820                                  	;cmp    dh, 04h
   821                                  	;je     Vibrato
   822                                  	;cmp    dh, 05h
   823                                  	;je     PortSlide
   824                                  	;cmp    dh, 06h
   825                                  	;je     VibSlide
   826                                  	;cmp    dh, 0Ah
   827                                  	;je     VolSlide
   828                                  	;retn
   829                                  
   830 000004BC 0FB6C6                  	movzx	eax, dh
   831 000004BF 240F                    	and	al, 0Fh
   832 000004C1 FF2485[C44F0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   833                                  efxnull:
   834                                  None:           
   835 000004C8 C3                      	retn
   836                                  efxarpeggio2:
   837                                  	; 01/10/2017
   838 000004C9 84D2                    	test    dl, dl
   839 000004CB 74FB                    	jz      short efxnull
   840                                  Arpeggio:
   841 000004CD 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   842 000004D1 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   843 000004D6 66894712                	mov     [edi+TrackInfo.Pitch], ax
   844 000004DA 6683C302                	add     bx, 2
   845 000004DE 6683FB06                	cmp     bx, 6
   846 000004E2 7202                    	jb      short SetArpIndex
   847 000004E4 31DB                    	xor     ebx, ebx
   848                                  SetArpIndex:
   849 000004E6 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   850 000004EA C3                      	retn
   851                                  efxportaup:
   852                                  PortUp:
   853 000004EB 30F6                    	xor     dh, dh
   854                                  	;mov	bx, [edi+TrackInfo.Period]
   855 000004ED 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   856 000004F1 6629D3                  	sub     bx, dx
   857                                  	;cmp	bx, 113
   858 000004F4 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   859 000004F8 7D04                    	jge     short NotSmall
   860                                  	;mov	bx, 113
   861 000004FA 66BB1C00                	mov	bx, 28 ; 01/10/2017
   862                                  NotSmall:
   863 000004FE 66895F10                	mov     [edi+TrackInfo.Period], bx
   864 00000502 6601DB                  	add     bx, bx
   865                                  	;mov	ax, [PitchTable+bx]
   866 00000505 668B83[AA580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   867 0000050C 66894712                	mov     [edi+TrackInfo.Pitch], ax
   868 00000510 C3                      	retn
   869                                  efxportadown:
   870                                  PortDown:
   871 00000511 30F6                    	xor     dh, dh
   872                                  	;mov	bx, [edi+TrackInfo.Period]
   873 00000513 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   874 00000517 6601D3                  	add     bx, dx
   875 0000051A 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   876                                  	;cmp	bx, 856
   877 0000051F 7E04                    	jle     short NotBig
   878                                  	;mov	bx, 856
   879 00000521 66BB600D                	mov	bx, 3424 ; 01/10/2017
   880                                  NotBig:         
   881 00000525 66895F10                	mov     [edi+TrackInfo.Period], bx
   882 00000529 6601DB                  	add     bx, bx
   883                                  	;mov	ax, [PitchTable+bx]
   884 0000052C 668B83[AA580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   885 00000533 66894712                	mov     [edi+TrackInfo.Pitch], ax
   886 00000537 C3                      	retn
   887                                  efxtoneporta2:
   888                                  TonePort:
   889 00000538 30F6                    	xor     dh, dh
   890 0000053A 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   891                                  	;mov	bx, [edi+TrackInfo.Period]
   892 0000053E 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   893 00000542 6639C3                  	cmp     bx, ax
   894 00000545 7429                    	je      short NoPort
   895 00000547 7F0D                    	jg      short PortToUp
   896                                  PortToDown:     
   897 00000549 6601D3                  	add     bx, dx
   898 0000054C 6639C3                  	cmp     bx, ax
   899 0000054F 7E0D                    	jle     short SetPort
   900                                  FixPort:        
   901 00000551 6689C3                  	mov     bx, ax
   902 00000554 EB08                    	jmp     short SetPort
   903                                  PortToUp:
   904 00000556 6629D3                  	sub     bx, dx
   905 00000559 6639C3                  	cmp     bx, ax
   906 0000055C 7CF3                    	jl      short FixPort
   907                                  SetPort:        
   908 0000055E 66895F10                	mov     [edi+TrackInfo.Period], bx
   909 00000562 6601DB                  	add     bx, bx
   910                                  	;mov	ax, [PitchTable+bx]
   911 00000565 668B83[AA580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   912 0000056C 66894712                	mov     [edi+TrackInfo.Pitch], ax
   913                                  NoPort:         
   914 00000570 C3                      	retn
   915                                  efxvibrato2:
   916                                  	; 01/10/2017
   917                                  Vibrato:
   918 00000571 88D6                    	mov     dh, dl
   919                                  	;and	dl, 0Fh
   920                                  	;shr	dh, 4
   921                                  	;shl	dh, 2
   922 00000573 6681E20FF0              	and     dx, 0F00Fh
   923 00000578 C0EE02                  	shr     dh, 2
   924                                  	;add	[edi+TrackInfo.VibPos], dh
   925                                  	;mov	dh, [edi+TrackInfo.VibPos]
   926                                  	;mov	bl, dh
   927 0000057B 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   928 0000057E 007719                  	add	[edi+TrackInfo.VibPos], dh
   929 00000581 88DE                    	mov	dh, bl ; 01/10/2017
   930 00000583 C0EB02                  	shr     bl, 2
   931                                  	;and	bx, 1Fh
   932                                  	;mov	al, [SinTable+bx]
   933 00000586 83E31F                  	and	ebx, 1Fh
   934 00000589 8A83[AC500000]          	mov	al, [SinTable+ebx]
   935 0000058F F6E2                    	mul     dl
   936                                  	;rol	ax, 1
   937                                  	;xchg	al, ah
   938                                  	;and	ah, 1
   939 00000591 66C1E807                	shr	ax, 7
   940 00000595 84F6                    	test    dh, dh
   941 00000597 7903                    	jns     short VibUp
   942 00000599 66F7D8                  	neg     ax
   943                                  VibUp:          
   944 0000059C 66034710                	add     ax, [edi+TrackInfo.Period]
   945 000005A0 6689C3                  	mov	bx, ax
   946                                  	;movzx	ebx, ax
   947 000005A3 6683FB71                	cmp     bx, 113
   948                                  	;cmp	bx, 113
   949 000005A7 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   950 000005AB 7D06                    	jge     short NoLoVib
   951                                  	;mov	bx, 113
   952 000005AD 66BB1C00                	mov	bx, 28	; 01/10/2017
   953 000005B1 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   954                                  NoLoVib:        
   955 000005B3 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   956                                  	;cmp	bx, 856
   957 000005B8 7E04                    	jle     short NoHiVib
   958                                  	;mov	bx, 856
   959 000005BA 66BB600D                	mov	bx, 3424 ; 01/10/2017
   960                                  NoHiVib:        
   961 000005BE 6601DB                  	add     bx, bx
   962                                  	;mov	ax, [PitchTable+bx]
   963 000005C1 668B83[AA580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   964 000005C8 66894712                	mov     [edi+TrackInfo.Pitch], ax
   965 000005CC C3                      	retn
   966                                  efxtoneslide:
   967                                  PortSlide:
   968 000005CD E812000000              	call    VolSlide
   969 000005D2 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   970 000005D5 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   971                                  efxvibslide:
   972                                  VibSlide:
   973 000005DA E805000000              	call    VolSlide
   974 000005DF 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   975 000005E2 EB8D                    	jmp     short Vibrato  ; efxvibrato2
   976                                  efxvolslide:
   977                                  VolSlide:
   978 000005E4 88D6                    	mov     dh, dl
   979 000005E6 80E20F                  	and     dl, 0Fh
   980 000005E9 C0EE04                  	shr     dh, 4
   981 000005EC 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   982 000005EF 28D0                    	sub     al, dl
   983 000005F1 7D02                    	jge     short NoLoVol
   984 000005F3 30C0                    	xor     al, al
   985                                  NoLoVol:        
   986 000005F5 00F0                    	add     al, dh
   987 000005F7 3C40                    	cmp     al, 64
   988 000005F9 7602                    	jbe     short NoHiVol
   989 000005FB B040                    	mov     al, 64
   990                                  NoHiVol:        
   991 000005FD 88470E                  	mov     [edi+TrackInfo.Volume], al
   992 00000600 C3                      	retn
   993                                  
   994                                  efxtremolo2:
   995                                  	; 01/10/2017 (TMODPLAY.ASM)
   996                                  Tremolo:
   997 00000601 88D6                    	mov     dh, dl
   998 00000603 6681E20FF0              	and     dx, 0F00Fh
   999 00000608 C0EE02                  	shr     dh, 2
  1000 0000060B 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1001 0000060E 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1002 00000611 88DE                    	mov	dh, bl
  1003 00000613 C0EB02                  	shr     bl, 2
  1004                                  	; 01/10/2017 - TRDOS 386
  1005                                  	;and	bx, 1Fh
  1006 00000616 83E31F                  	and	ebx, 1Fh 
  1007                                  	;mov	al, [SinTable+bx]
  1008 00000619 8A83[AC500000]          	mov     al, [SinTable+ebx]
  1009 0000061F F6E2                    	mul     dl
  1010 00000621 66C1E806                	shr	ax, 6
  1011 00000625 84F6                    	test    dh, dh
  1012 00000627 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1013 00000629 66F7D8                  	neg     ax
  1014                                  efxtremolof2:
  1015                                  Tremolo_1:      
  1016 0000062C 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1017 0000062F 00E0                    	add     al, ah
  1018 00000631 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1019 00000633 30C0                    	xor     al, al
  1020                                  efxtremolof3:
  1021                                  Tremolo_2:       
  1022 00000635 3C40                    	cmp     al, 64 ; 40h
  1023 00000637 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1024 00000639 B040                    	mov     al, 64 ; 40h
  1025                                  efxtremolof4:
  1026                                  Tremolo_3:       
  1027 0000063B 28E0                    	sub	al, ah  ; ****** 
  1028 0000063D 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1029 00000640 C3                      	retn	
  1030                                  
  1031                                  ;--------------------------------------------------------------------------
  1032                                  ; readchannel - read the next note event from the pattern sheet
  1033                                  ;--------------------------------------------------------------------------
  1034                                  ;
  1035                                  ;--------------------------------------------------------------------------
  1036                                  ; GetTrack:   Get the next Note from a pattern.
  1037                                  ;  In:
  1038                                  ;    ds:di -  Track info Address.
  1039                                  ;    es:si -  Pattern Note Address.
  1040                                  ; Out:
  1041                                  ;    es:si -  The Next Pattern Note address.
  1042                                  ;--------------------------------------------------------------------------
  1043                                  
  1044                                  ; esi = Pattern note address
  1045                                  ; edi = Track info address
  1046                                  
  1047                                  readchannel:
  1048                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1049 00000641 66AD                    	lodsw
  1050 00000643 86C4                    	xchg    al, ah
  1051 00000645 88E3                    	mov	bl, ah
  1052 00000647 80E40F                  	and     ah, 0Fh
  1053 0000064A 6689C1                  	mov     cx, ax
  1054 0000064D 66AD                    	lodsw
  1055 0000064F 86C4                    	xchg    al, ah
  1056 00000651 88E7                    	mov     bh, ah
  1057 00000653 80E40F                  	and     ah, 0Fh
  1058 00000656 6689C2                  	mov     dx, ax
  1059 00000659 66895714                	mov     [edi+TrackInfo.Effect], dx
  1060                                  	; 01/10/2017 - TRDOS 386
  1061                                  	;and	bl, 0F0h
  1062 0000065D 81E3F0FF0000            	and	ebx, 0FFF0h
  1063 00000663 C0EF04                  	shr     bh, 4
  1064 00000666 08FB                    	or      bl, bh
  1065 00000668 7446                    	jz      short SetPeriod
  1066                                  SetSample:
  1067 0000066A 30FF                    	xor	bh, bh
  1068                                  	;and	ebx, 0FFh
  1069 0000066C FECB                    	dec     bl
  1070 0000066E 01DB                    	add     ebx, ebx
  1071 00000670 668B83[6C580000]        	mov     ax, [ModInfo.SampVol+ebx]
  1072 00000677 88470E                  	mov     [edi+TrackInfo.Volume], al
  1073 0000067A 668B83[36570000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1074 00000681 668907                  	mov     [edi+TrackInfo.Samples], ax
  1075 00000684 668B83[74570000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1076 0000068B 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1077 0000068F 668B83[B2570000]        	mov     ax, [ModInfo.SampLen+ebx]
  1078 00000696 66894708                	mov     [edi+TrackInfo.Len], ax
  1079 0000069A 668B83[F0570000]        	mov     ax, [ModInfo.SampRep+ebx]
  1080 000006A1 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1081 000006A5 668B83[2E580000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1082 000006AC 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1083                                  SetPeriod:      
  1084 000006B0 6685C9                  	test    cx, cx
  1085 000006B3 7425                    	jz      short SetEffect
  1086                                  
  1087 000006B5 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1088                                  	
  1089 000006B9 80FE03                  	cmp     dh, 03h
  1090                                  	;je	short SetEffect
  1091 000006BC 7428                    	je	short efxtoneporta ; 01/10/2017
  1092                                  
  1093 000006BE 66894F10                	mov     [edi+TrackInfo.Period], cx
  1094                                  	;movzx	ebx, cx
  1095 000006C2 6689CB                  	mov     bx, cx
  1096 000006C5 6601DB                  	add     bx, bx
  1097                                  	;mov	ax, [PitchTable+bx]
  1098 000006C8 668B83[AA580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1099 000006CF 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1100 000006D3 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1101                                  SetEffect:
  1102                                  	;test	dx, dx
  1103                                  	;je	short InitNone
  1104                                  	;cmp	dh, 00h
  1105                                  	;je	InitArpeggio
  1106                                  	;cmp	dh, 03h
  1107                                  	;je	short InitTonePort
  1108                                  	;cmp	dh, 04h
  1109                                  	;je	short InitVibrato
  1110                                  	;cmp	dh, 09h
  1111                                  	;je	short SampleOfs
  1112                                  	;cmp	dh, 0Bh
  1113                                  	;je	short PosJump
  1114                                  	;cmp	dh, 0Ch
  1115                                  	;je	short SetVolume
  1116                                  	;cmp	dh, 0Dh
  1117                                  	;je	short Break
  1118                                  	;cmp	dh, 0Fh
  1119                                  	;je	SetSpeed
  1120                                  	;retn
  1121                                  
  1122                                  	; 01/10/2017 (TMODPLAY.ASM)
  1123                                  	
  1124                                  	; dx = [di+TrackInfo.Effect]
  1125                                  	
  1126 000006DA 0FB6C6                  	movzx	eax, dh
  1127 000006DD 240F                    	and	al, 0Fh
  1128 000006DF FF2485[844F0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1129                                  ;efxnull:
  1130                                  ;InitNone:
  1131                                  ;	retn
  1132                                  efxtoneporta:
  1133                                  	; 01/10/2017
  1134                                  	; cx = period
  1135                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1136                                  InitTonePort:
  1137 000006E6 84D2                    	test    dl, dl
  1138 000006E8 7503                    	jnz     short SetPortParm
  1139 000006EA 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1140                                  SetPortParm:    
  1141 000006ED 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1142 000006F0 66895714                	mov     [edi+TrackInfo.Effect], dx
  1143 000006F4 C3                      	retn
  1144                                  efxvibrato:
  1145                                  InitVibrato:
  1146 000006F5 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1147 000006F8 88C4                    	mov     ah, al
  1148                                  	;and	al, 0Fh
  1149                                  	;and	ah, 0F0h
  1150 000006FA 66250FF0                	and	ax, 0F00Fh
  1151 000006FE F6C20F                  	test    dl, 0Fh
  1152 00000701 7502                    	jne     short OkDepth
  1153 00000703 08C2                    	or      dl, al
  1154                                  OkDepth:        
  1155 00000705 F6C2F0                  	test    dl, 0F0h
  1156 00000708 7502                    	jnz     short OkRate
  1157 0000070A 08E2                    	or      dl, ah
  1158                                  OkRate:         
  1159 0000070C 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1160 0000070F 66895714                	mov     [edi+TrackInfo.Effect], dx
  1161 00000713 6685C9                  	test    cx, cx
  1162 00000716 7404                    	jz      short OkPos
  1163 00000718 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1164                                  OkPos:          
  1165 0000071C C3                      	retn
  1166                                  efxsampoffset:
  1167                                  	; 01/10/2017 ; *******
  1168                                  SampleOfs:         
  1169                                  ;	test    dl, dl
  1170                                  ;	jnz     short SetSampleOfs
  1171                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1172                                  ;SetSampleOfs:
  1173                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1174 0000071D 88D6                    	mov     dh, dl
  1175 0000071F 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1176 00000725 895704                  	mov     [edi+TrackInfo.Position], edx
  1177 00000728 C3                      	retn
  1178                                  efxpattjump:
  1179                                  PosJump:
  1180 00000729 8815[58D40000]          	mov     [OrderPos], dl
  1181 0000072F C605[5CD40000]40        	mov     byte [Row], 64
  1182 00000736 C3                      	retn
  1183                                  efxsetvolume:
  1184                                  SetVolume:
  1185 00000737 80FA40                  	cmp     dl, 64
  1186 0000073A 7602                    	jbe     short OkVol
  1187 0000073C B240                    	mov     dl, 64
  1188                                  OkVol:
  1189                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1190 0000073E 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1191                                  	;mov	[edi+TrackInfo.Volume], dl
  1192 00000740 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1193 00000744 C3                      	retn
  1194                                  efxbreak:
  1195                                  Break:
  1196 00000745 88D6                    	mov     dh, dl
  1197 00000747 80E20F                  	and     dl, 0Fh
  1198 0000074A C0EE04                  	shr     dh, 4
  1199 0000074D 00F6                    	add     dh, dh
  1200 0000074F 00F2                    	add     dl, dh
  1201 00000751 C0E602                  	shl     dh, 2
  1202 00000754 00F2                    	add     dl, dh
  1203 00000756 8815[5DD40000]          	mov     [BreakRow], dl
  1204 0000075C C605[5CD40000]40        	mov     byte [Row], 64
  1205 00000763 C3                      	retn
  1206                                  efxsetspeed:
  1207                                  SetSpeed:
  1208 00000764 84D2                    	test    dl,dl
  1209 00000766 7432                    	je      Skip
  1210 00000768 80FA1F                  	cmp     dl,31
  1211 0000076B 770D                    	ja      short SetBpm
  1212                                  SetTempo:       
  1213 0000076D 8815[59D40000]          	mov     [Tempo], dl
  1214 00000773 8815[5AD40000]          	mov     [TempoWait], dl
  1215 00000779 C3                      	retn
  1216                                  SetBpm:
  1217 0000077A 8815[5BD40000]          	mov     [Bpm], dl
  1218 00000780 B067                    	mov     al, 103
  1219 00000782 F6E2                    	mul     dl
  1220 00000784 88E3                    	mov     bl, ah
  1221 00000786 30FF                    	xor     bh, bh
  1222 00000788 66A1[AE510000]          	mov     ax, [MixSpeed]
  1223 0000078E 6631D2                  	xor     dx, dx
  1224 00000791 66F7F3                  	div     bx
  1225 00000794 66A3[5ED40000]          	mov     [BpmSamples], ax
  1226                                  Skip:           
  1227 0000079A C3                      	retn
  1228                                  efxarpeggio:
  1229                                  	; 01/10/2017
  1230 0000079B 84D2                    	test    dl, dl
  1231                                  	;je	efxnull
  1232 0000079D 74FB                    	je	short Skip
  1233                                  InitArpeggio:
  1234 0000079F 88D6                    	mov     dh, dl
  1235 000007A1 80E20F                  	and     dl, 0Fh
  1236 000007A4 C0EE04                  	shr     dh, 4
  1237                                  	; 01/10/2017
  1238                                  	;mov	cx, 36
  1239 000007A7 66B95400                	mov	cx, 84 ; 84 notes/periods
  1240 000007AB 31DB                    	xor     ebx, ebx
  1241 000007AD 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1242                                  gt_ScanPeriod:
  1243                                  	;cmp	ax, [PeriodTable+bx]
  1244 000007B1 663B83[04500000]        	cmp	ax, [PeriodTable+ebx]
  1245 000007B8 7306                    	jae     short SetArp
  1246 000007BA 6683C302                	add     bx, 2
  1247 000007BE E2F1                    	loop    gt_ScanPeriod
  1248                                  SetArp:         
  1249 000007C0 6601D2                  	add     dx, dx
  1250 000007C3 00DE                    	add     dh, bl
  1251 000007C5 00DA                    	add     dl, bl
  1252                                  	; 01/10/2017
  1253                                  	;mov	bx, [PeriodTable+bx]
  1254 000007C7 668B9B[04500000]        	mov	bx, [PeriodTable+ebx]
  1255                                  	;add	bx, bx
  1256 000007CE 01DB                    	add	ebx, ebx
  1257                                  	;mov	ax, [PitchTable+bx]
  1258 000007D0 668B83[AA580000]        	mov	ax, [PitchTable+ebx]
  1259 000007D7 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1260 000007DB 88F3                    	mov     bl, dh
  1261 000007DD 30FF                    	xor     bh, bh
  1262 000007DF 668B9B[04500000]        	mov	bx, [PeriodTable+ebx]
  1263                                  	;add	bx, bx
  1264 000007E6 01DB                    	add	ebx, ebx
  1265                                  	;mov	ax, [PitchTable+bx]
  1266 000007E8 668B83[AA580000]        	mov	ax, [PitchTable+ebx]
  1267 000007EF 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1268 000007F3 88D3                    	mov     bl, dl
  1269 000007F5 30FF                    	xor     bh, bh
  1270 000007F7 668B9B[04500000]        	mov	bx, [PeriodTable+ebx]
  1271                                  	;add	bx, bx
  1272 000007FE 01DB                    	add	ebx, ebx
  1273                                  	;mov	ax, [PitchTable+bx]
  1274 00000800 668B83[AA580000]        	mov	ax, [PitchTable+ebx]
  1275 00000807 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1276 0000080B 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1277 00000811 C3                      	retn
  1278                                  
  1279                                  efxtremolo:
  1280                                  	; 01/10/2017 (TMODPLAY.ASM)
  1281                                  InitTremolo:
  1282 00000812 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1283 00000815 88C4                    	mov     ah, al
  1284 00000817 66250FF0                	and     ax, 0F00Fh
  1285 0000081B F6C20F                  	test    dl, 0Fh
  1286 0000081E 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1287 00000820 08C2                    	or      dl, al
  1288                                  efxtremolof0:
  1289                                  InitTremolo_1: 
  1290 00000822 F6C2F0                  	test    dl, 0F0h
  1291 00000825 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1292 00000827 08E2                    	or      dl, ah
  1293                                  efxtremolof1:
  1294                                  InitTremolo_2:
  1295 00000829 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1296 0000082C 66895714                	mov     [edi+TrackInfo.Effect], dx
  1297 00000830 C3                      	retn
  1298                                  
  1299                                  ;--------------------------------------------------------------------------
  1300                                  ; pollmodule - polls the module player
  1301                                  ;--------------------------------------------------------------------------
  1302                                  ;--------------------------------------------------------------------------
  1303                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1304                                  ;--------------------------------------------------------------------------
  1305                                  
  1306                                  pollmodule:
  1307                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1308 00000831 FE0D[5AD40000]          	dec     byte [TempoWait]
  1309 00000837 7417                    	jz      short GetTracks
  1310                                  
  1311                                  	;mov	ecx, NumTracks
  1312 00000839 0FB70D[A8510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1313 00000840 BF[6ED40000]            	mov	edi, Tracks
  1314                                  BeatTracks:
  1315 00000845 E86EFCFFFF              	call	BeatTrack	
  1316 0000084A 83C726                  	add	edi, TrackInfo.size
  1317 0000084D E2F6                    	loop	BeatTracks
  1318 0000084F C3                      	retn
  1319                                  GetTracks:
  1320 00000850 A0[59D40000]            	mov     al, [Tempo]
  1321 00000855 A2[5AD40000]            	mov     [TempoWait], al
  1322                                  
  1323 0000085A 8B35[6AD40000]          	mov	esi, [Note]
  1324 00000860 803D[5CD40000]40        	cmp     byte [Row], 64
  1325 00000867 7268                    	jb      short NoPattWrap
  1326                                  
  1327 00000869 8B35[32570000]          	mov	esi, [ModInfo.Patterns]
  1328 0000086F 8A1D[58D40000]          	mov     bl, [OrderPos]
  1329 00000875 3A1D[B0560000]          	cmp     bl, [ModInfo.OrderLen]
  1330 0000087B 7214                    	jb      short NoOrderWrap
  1331 0000087D 8A1D[B1560000]          	mov     bl, [ModInfo.ReStart]
  1332 00000883 881D[58D40000]          	mov     [OrderPos], bl
  1333 00000889 3A1D[B0560000]          	cmp     bl, [ModInfo.OrderLen]
  1334 0000088F 7364                    	jae     short NoUpdate
  1335                                  NoOrderWrap:    
  1336                                  	;xor	bh, bh
  1337 00000891 81E3FF000000            	and	ebx, 0FFh
  1338 00000897 8A9B[B2560000]          	mov     bl, [ModInfo.Order+ebx]
  1339                                  	; 05/10/2017
  1340                                  	;shl	ebx, 10 ; *1024
  1341 0000089D 8A0D[A7510000]          	mov	cl, [pattern_shift] ; 10 or 11
  1342 000008A3 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1343                                  	;
  1344 000008A5 01DE                    	add     esi, ebx
  1345 000008A7 8A1D[5DD40000]          	mov     bl, [BreakRow]
  1346 000008AD 881D[5CD40000]          	mov     [Row], bl
  1347                                  	;xor	bh, bh
  1348 000008B3 81E3FF000000            	and	ebx, 0FFh
  1349 000008B9 883D[5DD40000]          	mov     [BreakRow], bh ; 0
  1350 000008BF 66C1E304                	shl     bx, 4
  1351 000008C3 01DE                    	add     esi, ebx
  1352 000008C5 8935[6AD40000]          	mov     [Note], esi
  1353 000008CB FE05[58D40000]          	inc     byte [OrderPos]
  1354                                  NoPattWrap:     
  1355 000008D1 FE05[5CD40000]          	inc     byte [Row]
  1356                                  
  1357                                  	;cld
  1358                                  	;mov	ecx, NumTracks
  1359 000008D7 0FB70D[A8510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1360 000008DE BF[6ED40000]            	mov	edi, Tracks
  1361                                  GetTracks_next:
  1362 000008E3 51                      	push	ecx	
  1363 000008E4 E858FDFFFF              	call	GetTrack ; readchannel
  1364 000008E9 59                      	pop	ecx
  1365 000008EA 83C726                  	add	edi, TrackInfo.size
  1366 000008ED E2F4                    	loop	GetTracks_next
  1367                                  
  1368 000008EF 8935[6AD40000]          	mov     [Note], esi
  1369                                  NoUpdate:
  1370 000008F5 C3                      	retn
  1371                                  
  1372                                  ;--------------------------------------------------------------------------
  1373                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1374                                  ;  In:
  1375                                  ;   ds:si -  Track Info Address.
  1376                                  ;   ds:di -  Buffer Address.
  1377                                  ;    cx   -  Buffer Size.
  1378                                  ;--------------------------------------------------------------------------
  1379                                  
  1380                                  ; esi = Track info address
  1381                                  ; edi = Buffer address
  1382                                  ; ecx = Buffer size
  1383                                  
  1384                                  MixTrack:
  1385 000008F6 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1386 000008FB 7757                    	ja      short MixLooped
  1387                                  MixNonLooped:   
  1388 000008FD 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1389 000008FF 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1390 00000902 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1391 00000906 52                      	push    edx
  1392 00000907 56                      	push    esi
  1393 00000908 01D3                    	add     ebx, edx
  1394 0000090A 01D5                    	add     ebp, edx
  1395 0000090C 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1396                                  	; 01/10/2017
  1397                                  	;mov	al, [esi+TrackInfo.Volume]
  1398 00000910 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1399                                  	; ah = [esi+TrackInfo.VolDiff]
  1400 00000914 00E0                    	add	al, ah ; ****** 
  1401 00000916 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1402 0000091A 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1403 0000091D 89DE                    	mov     esi, ebx
  1404 0000091F 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1405 00000921 88C7                    	mov     bh, al
  1406 00000923 88D0                    	mov     al, dl
  1407 00000925 88F2                    	mov     dl, dh
  1408                                  	;xor	dh, dh
  1409 00000927 81E2FF000000            	and	edx, 0FFh
  1410                                  nlMixSamp:      
  1411 0000092D 39EE                    	cmp     esi, ebp
  1412 0000092F 7316                    	jae     short nlMixBye
  1413 00000931 8A1E                    	mov     bl, [esi]
  1414                                  	;mov	bl, [VolTable+bx]
  1415 00000933 8A9B[6C730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1416                                  	; 17/10/2017
  1417 00000939 001F                    	add     [edi], bl
  1418                                  	; 18/10/2017
  1419 0000093B 00C4                    	add     ah, al
  1420 0000093D 11D6                    	adc     esi, edx
  1421 0000093F 033D[A8510000]          	add	edi, [numtracks]
  1422 00000945 E2E6                    	loop    nlMixSamp
  1423                                  nlMixBye:       
  1424 00000947 89F3                    	mov     ebx, esi
  1425 00000949 5E                      	pop     esi
  1426 0000094A 5A                      	pop     edx
  1427 0000094B 29D3                    	sub     ebx, edx
  1428 0000094D 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1429 00000950 88661D                  	mov     [esi+TrackInfo.Error], ah
  1430 00000953 C3                      	retn
  1431                                  MixLooped:
  1432 00000954 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1433 00000956 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1434 00000959 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1435 0000095D 892D[66D40000]          	mov     [BufRep], ebp
  1436                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1437 00000963 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1438 00000967 52                      	push    edx
  1439 00000968 56                      	push    esi
  1440 00000969 01D3                    	add     ebx, edx
  1441 0000096B 01D5                    	add     ebp, edx
  1442 0000096D 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1443                                  	; 01/10/2017
  1444                                  	;mov	al, [esi+TrackInfo.Volume]
  1445 00000971 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1446                                  	; ah = [esi+TrackInfo.VolDiff]
  1447 00000975 00E0                    	add	al, ah ; ****** 
  1448 00000977 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1449 0000097B 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1450                                  	;mov	si, bx
  1451 0000097E 89DE                    	mov	esi, ebx ; 04/09/2017
  1452 00000980 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1453 00000982 88C7                    	mov     bh, al
  1454 00000984 88D0                    	mov     al, dl
  1455 00000986 88F2                    	mov     dl, dh
  1456                                  	;xor	dh, dh
  1457 00000988 81E2FF000000            	and	edx, 0FFh
  1458                                  lpMixSamp:      
  1459 0000098E 39EE                    	cmp     esi, ebp
  1460 00000990 7206                    	jb      short lpMixNow
  1461 00000992 2B35[66D40000]          	sub     esi, [BufRep]
  1462                                  lpMixNow:       
  1463 00000998 8A1E                    	mov     bl, [esi]
  1464                                  	;mov	bl, [VolTable+bx]
  1465 0000099A 8A9B[6C730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1466                                  	; 17/10/2017
  1467 000009A0 001F                    	add     [edi], bl
  1468                                  	; 18/10/2017
  1469 000009A2 00C4                    	add     ah, al
  1470 000009A4 11D6                    	adc     esi, edx
  1471 000009A6 033D[A8510000]          	add	edi, [numtracks]
  1472 000009AC E2E0                    	loop    lpMixSamp
  1473                                  lpMixBye:       
  1474                                  ;	mov     ebx, esi
  1475                                  ;	pop     esi
  1476                                  ;	pop     edx
  1477                                  ;	sub     ebx, edx
  1478                                  ;	mov     [esi+TrackInfo.Position], ebx
  1479                                  ;	mov     [esi+TrackInfo.Error], ah
  1480                                  ;	retn
  1481 000009AE EB97                    	jmp	short nlMixBye
  1482                                  
  1483                                  ;--------------------------------------------------------------------------
  1484                                  ; mixpoll - updates the output buffer
  1485                                  ;--------------------------------------------------------------------------
  1486                                  ;
  1487                                  ;--------------------------------------------------------------------------
  1488                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1489                                  ;  In:
  1490                                  ;    Buffer  - Buffer Address.
  1491                                  ;    Count   - Buffer Size.
  1492                                  ;--------------------------------------------------------------------------
  1493                                  
  1494                                  mixpoll:
  1495                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1496                                  	; edi = buffer address
  1497                                  	; ebx = count
  1498                                  
  1499 000009B0 60                      	pushad
  1500                                  
  1501                                  	;cld
  1502                                  NextChunk:      
  1503 000009B1 66833D[64D40000]00      	cmp     word [BufLen], 0
  1504 000009B9 756B                    	jne     short CopyChunk
  1505                                  
  1506 000009BB 53                      	push    ebx
  1507 000009BC 57                      	push    edi
  1508                                  MixChunk:       
  1509 000009BD BF[6CB40000]            	mov	edi, MixBuffer
  1510                                  
  1511                                  	; 17/10/2017
  1512 000009C2 0FB70D[5ED40000]        	movzx	ecx, word [BpmSamples]
  1513                                  	;mov	cx, [BpmSamples]
  1514 000009C9 893D[60D40000]          	mov     [BufPtr], edi
  1515 000009CF 66890D[64D40000]        	mov	[BufLen], cx
  1516                                  
  1517 000009D6 803D[A8510000]04        	cmp	byte [numtracks], 4
  1518 000009DD 7603                    	jna	short ch_silence
  1519 000009DF 66D1E1                  	shl	cx, 1 
  1520                                  ch_silence:
  1521 000009E2 B880808080              	mov	eax, 80808080h
  1522 000009E7 F3AB                    	rep	stosd
  1523                                  
  1524                                  	;mov	cx, NumTracks
  1525                                  	;mov	cl, NumTracks ; 01/10/2017
  1526 000009E9 8A0D[A8510000]          	mov	cl, [numtracks] ; 06/10/2017
  1527 000009EF BE[48D40000]            	mov	esi, Tracks - TrackInfo.size
  1528                                  GetSamples_next:
  1529 000009F4 51                      	push	ecx
  1530 000009F5 83C626                  	add	esi, TrackInfo.size
  1531 000009F8 668B0D[64D40000]        	mov	cx, [BufLen]
  1532 000009FF 8B3D[60D40000]          	mov	edi, [BufPtr]
  1533 00000A05 E8ECFEFFFF              	call	MixTrack
  1534 00000A0A 59                      	pop	ecx
  1535 00000A0B FF05[60D40000]          	inc	dword [BufPtr] ; 18/10/2017
  1536 00000A11 E2E1                    	loop	GetSamples_next
  1537                                  
  1538                                   	; 18/10/2017	
  1539 00000A13 8B1D[A8510000]          	mov	ebx, [numtracks]
  1540 00000A19 291D[60D40000]          	sub	dword [BufPtr], ebx
  1541                                  
  1542 00000A1F E80DFEFFFF              	call    UpdateTracks
  1543                                  
  1544 00000A24 5F                      	pop     edi
  1545 00000A25 5B                      	pop     ebx
  1546                                  CopyChunk:      
  1547                                  	;mov	cx, [BufLen]
  1548 00000A26 0FB70D[64D40000]        	movzx	ecx, word [BufLen]
  1549 00000A2D 39D9                    	cmp	ecx, ebx
  1550                                  	;cmp	cx, bx
  1551 00000A2F 7602                    	jbe     short MoveChunk
  1552                                  	;mov	cx, bx
  1553 00000A31 89D9                    	mov     ecx, ebx
  1554                                  MoveChunk:
  1555 00000A33 8B35[60D40000]          	mov     esi, [BufPtr]
  1556 00000A39 010D[60D40000]          	add     [BufPtr], ecx
  1557 00000A3F 66290D[64D40000]        	sub     [BufLen], cx
  1558 00000A46 29CB                    	sub     ebx, ecx
  1559                                  	; 17/10/2017 ; STEREO MIXING
  1560                                  	;rep	movsb
  1561                                  	; 18/10/2017
  1562 00000A48 803D[A8510000]04        	cmp	byte [numtracks], 4
  1563                                  	;jna	short _4_channels_mix
  1564 00000A4F 762F                    	jna	_4_channels_mix
  1565                                  	
  1566                                  _8_channels_mix:
  1567                                  	; 18/10/2017
  1568 00000A51 AD                      	lodsd 
  1569 00000A52 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1570 00000A54 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1571 00000A57 00C6                    	add	dh, al ; ch1 + ch4
  1572 00000A59 00E2                    	add	dl, ah ; ch2 + ch3
  1573                                  
  1574 00000A5B AD                      	lodsd
  1575 00000A5C 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1576 00000A5E 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1577 00000A60 C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1578                                  	; 19/10/2017
  1579 00000A63 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1580 00000A65 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1581                                  
  1582                                  	; L = ch1 + ch4 + ch5 + ch8
  1583                                  	; R = ch2 + ch3 + ch6 + ch7
  1584                                  
  1585 00000A67 6681C28080              	add	dx, 8080h
  1586                                  
  1587                                  	; 19/10/2017
  1588 00000A6C 88F4                    	mov	ah, dh
  1589 00000A6E 80EC80                  	sub	ah, 80h
  1590 00000A71 30C0                    	xor	al, al
  1591 00000A73 66AB                    	stosw ; Left Channel
  1592 00000A75 88D4                    	mov	ah, dl
  1593 00000A77 80EC80                  	sub	ah, 80h
  1594 00000A7A 66AB                    	stosw ; Right Channel
  1595                                  
  1596 00000A7C E2D3                    	loop	_8_channels_mix
  1597                                  	
  1598 00000A7E EB21                    	jmp	short channel_mix_ok
  1599                                  	
  1600                                  _4_channels_mix:
  1601                                  	; 18/10/2017
  1602 00000A80 AD                      	lodsd 
  1603 00000A81 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1604                                  	; 19/10/2017
  1605 00000A83 C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1606 00000A86 00E2                    	add	dl, ah ; ch1 + ch4
  1607 00000A88 00C6                    	add	dh, al ; ch2 + ch3
  1608                                  
  1609                                  	; L = ch1 + ch4
  1610                                  	; R = ch2 + ch3
  1611                                  
  1612                                  	; 19/10/2017
  1613 00000A8A 6681C28080              	add	dx, 8080h
  1614                                  
  1615                                  	; 19/10/2017
  1616 00000A8F 88D4                    	mov	ah, dl
  1617 00000A91 80EC80                  	sub	ah, 80h
  1618 00000A94 30C0                    	xor	al, al
  1619 00000A96 66AB                    	stosw ; Left Channel
  1620 00000A98 88F4                    	mov	ah, dh
  1621 00000A9A 80EC80                  	sub	ah, 80h
  1622 00000A9D 66AB                    	stosw ; Right Channel
  1623                                  	
  1624 00000A9F E2DF                    	loop	_4_channels_mix
  1625                                  
  1626                                  channel_mix_ok:
  1627 00000AA1 85DB                    	test    ebx, ebx
  1628                                  	;jnz	short NextChunk
  1629 00000AA3 0F8508FFFFFF            	jnz	NextChunk ; 17/10/2017
  1630                                  
  1631                                  	; 20/10/2017
  1632                                  	; 19/10/2017
  1633                                  	; Pan Control
  1634 00000AA9 8A0D[F0DF0000]          	mov	cl, [pan_shift]
  1635 00000AAF 08C9                    	or	cl, cl
  1636 00000AB1 744D                    	jz	short c_smpl_2
  1637                                  
  1638                                  	; 20/10/2017
  1639 00000AB3 BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1640 00000AB8 BF[00E00000]            	mov	edi, Audio_Buffer
  1641                                  
  1642 00000ABD B508                    	mov	ch, 8
  1643 00000ABF D2E5                    	shl	ch, cl
  1644                                  c_smpl_1:
  1645 00000AC1 8B17                    	mov	edx, [edi]
  1646 00000AC3 6689D0                  	mov	ax, dx
  1647 00000AC6 80FC80                  	cmp	ah, 80h
  1648 00000AC9 7208                    	jb	short _cs1	
  1649 00000ACB 00EC                    	add	ah, ch
  1650 00000ACD 730A                    	jnc	short _cs2
  1651 00000ACF B4FF                    	mov	ah, 255
  1652 00000AD1 EB06                    	jmp	short _cs2
  1653                                  _cs1:
  1654 00000AD3 28EC                    	sub	ah, ch
  1655 00000AD5 7302                    	jnc	short _cs2
  1656 00000AD7 B400                    	mov	ah, 0
  1657                                  _cs2:
  1658 00000AD9 C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1659 00000ADC 00F4                    	add	ah, dh
  1660 00000ADE 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1661 00000AE0 80FC80                  	cmp	ah, 80h
  1662 00000AE3 7208                    	jb	short _cs3	
  1663 00000AE5 00EC                    	add	ah, ch
  1664 00000AE7 730A                    	jnc	short _cs4
  1665 00000AE9 B4FF                    	mov	ah, 255
  1666 00000AEB EB06                    	jmp	short _cs4
  1667                                  _cs3:
  1668 00000AED 28EC                    	sub	ah, ch
  1669 00000AEF 7302                    	jnc	short _cs4
  1670 00000AF1 B400                    	mov	ah, 0
  1671                                  _cs4:
  1672 00000AF3 C1CA10                  	ror	edx, 16 ; dx = [edi]
  1673 00000AF6 00E6                    	add	dh, ah
  1674 00000AF8 8917                    	mov	[edi], edx
  1675                                  _cs5:
  1676                                  	; 20/10/2017
  1677 00000AFA 83C704                  	add	edi, 4
  1678 00000AFD 4B                      	dec	ebx
  1679 00000AFE 75C1                    	jnz	short c_smpl_1	
  1680                                  c_smpl_2:
  1681 00000B00 61                      	popad	
  1682 00000B01 C3                      	retn
  1683                                  
  1684                                  ;--------------------------------------------------------------------------
  1685                                  ; StartPlaying: Initializes the Sound System.
  1686                                  ;  In:
  1687                                  ;   Module Information Resources.
  1688                                  ;--------------------------------------------------------------------------
  1689                                  
  1690                                  StartPlaying:
  1691 00000B02 60                      	pushad
  1692                                  SetModParms:    
  1693 00000B03 C605[58D40000]00        	mov     byte [OrderPos], 0
  1694 00000B0A C605[59D40000]06        	mov     byte [Tempo], DefTempo
  1695 00000B11 C605[5AD40000]06        	mov     byte [TempoWait], DefTempo
  1696 00000B18 C605[5BD40000]7D        	mov     byte [Bpm], DefBpm
  1697 00000B1F C605[5CD40000]40        	mov     byte [Row], 64
  1698 00000B26 C605[5DD40000]00        	mov     byte [BreakRow], 0
  1699 00000B2D 66A1[AE510000]          	mov     ax, [MixSpeed]
  1700 00000B33 31D2                    	xor     edx, edx
  1701 00000B35 66BB3200                	mov     bx, 24*DefBpm/60
  1702 00000B39 66F7F3                  	div     bx
  1703 00000B3C 66A3[5ED40000]          	mov     [BpmSamples], ax
  1704                                  ClearTracks:    
  1705 00000B42 BF[6ED40000]            	mov     edi, Tracks
  1706                                  	; 07/10/2017
  1707                                  	;mov	ecx, NumTracks*TrackInfo.size
  1708 00000B47 B826000000              	mov	eax, TrackInfo.size
  1709 00000B4C 0FB70D[A8510000]        	movzx	ecx, word [numtracks]
  1710 00000B53 F7E1                    	mul	ecx
  1711 00000B55 89C1                    	mov	ecx, eax
  1712 00000B57 31C0                    	xor     eax, eax
  1713                                  	;cld
  1714 00000B59 F3AA                    	rep     stosb
  1715                                  
  1716 00000B5B A3[60D40000]            	mov     [BufPtr], eax
  1717 00000B60 66A3[64D40000]          	mov     [BufLen], ax
  1718                                  MakePitch:
  1719 00000B66 66B80021                	mov     ax, MidCRate
  1720 00000B6A 66BBAC01                	mov     bx, 428
  1721 00000B6E 66F7E3                  	mul     bx
  1722 00000B71 66F735[AE510000]        	div     word [MixSpeed]
  1723 00000B78 30F6                    	xor     dh, dh
  1724 00000B7A 88E2                    	mov     dl, ah
  1725 00000B7C 88C4                    	mov     ah, al
  1726 00000B7E 30C0                    	xor     al, al
  1727                                  	;mov	cx, 857
  1728 00000B80 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1729 00000B84 31DB                    	xor     ebx, ebx
  1730 00000B86 BF[AA580000]            	mov     edi, PitchTable
  1731                                  PitchLoop:      
  1732 00000B8B 50                      	push    eax
  1733 00000B8C 52                      	push    edx
  1734 00000B8D 6639DA                  	cmp     dx, bx
  1735 00000B90 7303                    	jae     short NoDiv
  1736 00000B92 66F7F3                  	div     bx
  1737                                  NoDiv:          
  1738 00000B95 66AB                    	stosw
  1739 00000B97 5A                      	pop     edx
  1740 00000B98 58                      	pop     eax
  1741                                  	;inc	bx
  1742 00000B99 43                      	inc	ebx
  1743 00000B9A E2EF                    	loop    PitchLoop
  1744                                  MakeVolume:     
  1745 00000B9C 66B90041                	mov     cx, 16640
  1746 00000BA0 89CB                    	mov     ebx, ecx
  1747                                  VolLoop:
  1748 00000BA2 664B                    	dec     bx
  1749 00000BA4 88D8                    	mov     al, bl
  1750 00000BA6 F6EF                    	imul    bh
  1751                                  	;mov	[VolTable+bx], ah
  1752 00000BA8 88A3[6C730000]          	mov     [VolTable+ebx], ah
  1753 00000BAE E2F2                    	loop    VolLoop
  1754                                  
  1755 00000BB0 61                      	popad
  1756 00000BB1 C3                      	retn
  1757                                  
  1758                                  ;--------------------------------------------------------------------------
  1759                                  ; StopPlaying: ShutDown the Sound System.
  1760                                  ;--------------------------------------------------------------------------
  1761                                  
  1762                                  StopPlaying:
  1763                                  	; 19/06/2017
  1764                                  	; Stop Playing
  1765                                  	sys	_audio, 0700h
  1765                              <1> 
  1765                              <1> 
  1765                              <1> 
  1765                              <1> 
  1765                              <1>  %if %0 >= 2
  1765 00000BB2 BB00070000          <1>  mov ebx, %2
  1765                              <1>  %if %0 >= 3
  1765                              <1>  mov ecx, %3
  1765                              <1>  %if %0 = 4
  1765                              <1>  mov edx, %4
  1765                              <1>  %endif
  1765                              <1>  %endif
  1765                              <1>  %endif
  1765 00000BB7 B820000000          <1>  mov eax, %1
  1765                              <1> 
  1765 00000BBC CD40                <1>  int 40h
  1766                                  	; Cancel callback service (for user)
  1767                                  	sys	_audio, 0900h
  1767                              <1> 
  1767                              <1> 
  1767                              <1> 
  1767                              <1> 
  1767                              <1>  %if %0 >= 2
  1767 00000BBE BB00090000          <1>  mov ebx, %2
  1767                              <1>  %if %0 >= 3
  1767                              <1>  mov ecx, %3
  1767                              <1>  %if %0 = 4
  1767                              <1>  mov edx, %4
  1767                              <1>  %endif
  1767                              <1>  %endif
  1767                              <1>  %endif
  1767 00000BC3 B820000000          <1>  mov eax, %1
  1767                              <1> 
  1767 00000BC8 CD40                <1>  int 40h
  1768                                  	; Deallocate Audio Buffer (for user)
  1769                                  	sys	_audio, 0A00h
  1769                              <1> 
  1769                              <1> 
  1769                              <1> 
  1769                              <1> 
  1769                              <1>  %if %0 >= 2
  1769 00000BCA BB000A0000          <1>  mov ebx, %2
  1769                              <1>  %if %0 >= 3
  1769                              <1>  mov ecx, %3
  1769                              <1>  %if %0 = 4
  1769                              <1>  mov edx, %4
  1769                              <1>  %endif
  1769                              <1>  %endif
  1769                              <1>  %endif
  1769 00000BCF B820000000          <1>  mov eax, %1
  1769                              <1> 
  1769 00000BD4 CD40                <1>  int 40h
  1770                                  	; Disable Audio Device
  1771                                  	sys	_audio, 0C00h
  1771                              <1> 
  1771                              <1> 
  1771                              <1> 
  1771                              <1> 
  1771                              <1>  %if %0 >= 2
  1771 00000BD6 BB000C0000          <1>  mov ebx, %2
  1771                              <1>  %if %0 >= 3
  1771                              <1>  mov ecx, %3
  1771                              <1>  %if %0 = 4
  1771                              <1>  mov edx, %4
  1771                              <1>  %endif
  1771                              <1>  %endif
  1771                              <1>  %endif
  1771 00000BDB B820000000          <1>  mov eax, %1
  1771                              <1> 
  1771 00000BE0 CD40                <1>  int 40h
  1772                                  
  1773 00000BE2 C3                      	retn
  1774                                  
  1775                                  ;=============================================================================
  1776                                  ; 
  1777                                  ;=============================================================================
  1778                                  
  1779                                  ;dword2str:
  1780                                  ;	; 13/11/2016 - Erdogan Tan 
  1781                                  ;	; eax = dword value
  1782                                  ;	;
  1783                                  ;	call	dwordtohex
  1784                                  ;	mov	[dword_str], edx
  1785                                  ;	mov	[dword_str+4], eax
  1786                                  ;	mov	si, dword_str
  1787                                  ;	retn
  1788                                  
  1789                                  	; 05/03/2017 (TRDOS 386)
  1790                                  	; trdos386.s (unix386.s) - 10/05/2015
  1791                                  	; Convert binary number to hexadecimal string
  1792                                  
  1793                                  ;bytetohex:
  1794                                  ;	; INPUT ->
  1795                                  ;	; 	AL = byte (binary number)
  1796                                  ;	; OUTPUT ->
  1797                                  ;	;	AX = hexadecimal string
  1798                                  ;	;
  1799                                  ;	push	ebx
  1800                                  ;	movzx	ebx, al
  1801                                  ;	shr	bl, 4
  1802                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1803                                  ;	xchg	bl, al
  1804                                  ;	and	bl, 0Fh
  1805                                  ;	mov	ah, [ebx+hex_chars] 
  1806                                  ;	pop	ebx	
  1807                                  ;	retn
  1808                                  
  1809                                  ;wordtohex:
  1810                                  ;	; INPUT ->
  1811                                  ;	; 	AX = word (binary number)
  1812                                  ;	; OUTPUT ->
  1813                                  ;	;	EAX = hexadecimal string
  1814                                  ;	;
  1815                                  ;	push	ebx
  1816                                  ;	xor	ebx, ebx
  1817                                  ;	xchg	ah, al
  1818                                  ;	push	eax
  1819                                  ;	mov	bl, ah
  1820                                  ;	shr	bl, 4
  1821                                  ;	mov	al, [ebx+hex_chars] 	 	
  1822                                  ;	mov	bl, ah
  1823                                  ;	and	bl, 0Fh
  1824                                  ;	mov	ah, [ebx+hex_chars]
  1825                                  ;	shl	eax, 16
  1826                                  ;	pop	eax
  1827                                  ;	pop	ebx
  1828                                  ;	jmp	short bytetohex
  1829                                  
  1830                                  ;dwordtohex:
  1831                                  ;	; INPUT ->
  1832                                  ;	; 	EAX = dword (binary number)
  1833                                  ;	; OUTPUT ->
  1834                                  ;	;	EDX:EAX = hexadecimal string
  1835                                  ;	;
  1836                                  ;	push	eax
  1837                                  ;	shr	eax, 16
  1838                                  ;	call	wordtohex
  1839                                  ;	mov	edx, eax
  1840                                  ;	pop	eax
  1841                                  ;	call	wordtohex
  1842                                  ;	retn
  1843                                  
  1844                                  	; 19/06/2017
  1845                                  	; 05/03/2017 (TRDOS 386)
  1846                                  	; 13/11/2016 - Erdogan Tan
  1847                                  write_audio_dev_info:
  1848                                  	; BUS/DEV/FN
  1849                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1850                                  	; DEV/VENDOR
  1851                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1852                                  
  1853 00000BE3 8B35[60520000]          	mov	esi, [dev_vendor]
  1854 00000BE9 6689F0                  	mov	ax, si
  1855 00000BEC 0FB6D8                  	movzx	ebx, al
  1856 00000BEF 88DA                    	mov	dl, bl
  1857 00000BF1 80E30F                  	and	bl, 0Fh
  1858 00000BF4 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1859 00000BFA A2[F5510000]            	mov	[msgVendorId+3], al
  1860 00000BFF 88D3                    	mov	bl, dl
  1861 00000C01 C0EB04                  	shr	bl, 4
  1862 00000C04 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1863 00000C0A A2[F4510000]            	mov	[msgVendorId+2], al
  1864 00000C0F 88E3                    	mov	bl, ah
  1865 00000C11 88DA                    	mov	dl, bl
  1866 00000C13 80E30F                  	and	bl, 0Fh
  1867 00000C16 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1868 00000C1C A2[F3510000]            	mov	[msgVendorId+1], al
  1869 00000C21 88D3                    	mov	bl, dl
  1870 00000C23 C0EB04                  	shr	bl, 4
  1871 00000C26 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1872 00000C2C A2[F2510000]            	mov	[msgVendorId], al
  1873 00000C31 C1EE10                  	shr	esi, 16
  1874 00000C34 6689F0                  	mov	ax, si
  1875 00000C37 88C3                    	mov	bl, al
  1876 00000C39 88DA                    	mov	dl, bl
  1877 00000C3B 80E30F                  	and	bl, 0Fh
  1878 00000C3E 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1879 00000C44 A2[06520000]            	mov	[msgDevId+3], al
  1880 00000C49 88D3                    	mov	bl, dl
  1881 00000C4B C0EB04                  	shr	bl, 4
  1882 00000C4E 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1883 00000C54 A2[05520000]            	mov	[msgDevId+2], al
  1884 00000C59 88E3                    	mov	bl, ah
  1885 00000C5B 88DA                    	mov	dl, bl
  1886 00000C5D 80E30F                  	and	bl, 0Fh
  1887 00000C60 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1888 00000C66 A2[04520000]            	mov	[msgDevId+1], al
  1889 00000C6B 88D3                    	mov	bl, dl
  1890 00000C6D C0EB04                  	shr	bl, 4
  1891 00000C70 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1892 00000C76 A2[03520000]            	mov	[msgDevId], al
  1893                                  
  1894 00000C7B 8B35[64520000]          	mov	esi, [bus_dev_fn]
  1895 00000C81 C1EE08                  	shr	esi, 8
  1896 00000C84 6689F0                  	mov	ax, si
  1897 00000C87 88C3                    	mov	bl, al
  1898 00000C89 88DA                    	mov	dl, bl
  1899 00000C8B 80E307                  	and	bl, 7 ; bit 0,1,2
  1900 00000C8E 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1901 00000C94 A2[2A520000]            	mov	[msgFncNo+1], al
  1902 00000C99 88D3                    	mov	bl, dl
  1903 00000C9B C0EB03                  	shr	bl, 3
  1904 00000C9E 88DA                    	mov	dl, bl
  1905 00000CA0 80E30F                  	and	bl, 0Fh
  1906 00000CA3 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1907 00000CA9 A2[1C520000]            	mov	[msgDevNo+1], al
  1908 00000CAE 88D3                    	mov	bl, dl
  1909 00000CB0 C0EB04                  	shr	bl, 4
  1910 00000CB3 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1911 00000CB9 A2[1B520000]            	mov	[msgDevNo], al
  1912 00000CBE 88E3                    	mov	bl, ah
  1913 00000CC0 88DA                    	mov	dl, bl
  1914 00000CC2 80E30F                  	and	bl, 0Fh
  1915 00000CC5 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1916 00000CCB A2[10520000]            	mov	[msgBusNo+1], al
  1917 00000CD0 88D3                    	mov	bl, dl
  1918 00000CD2 C0EB04                  	shr	bl, 4
  1919 00000CD5 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1920 00000CDB A2[0F520000]            	mov	[msgBusNo], al
  1921                                  
  1922 00000CE0 66A1[6C520000]          	mov	ax, [ac97_io_base]
  1923 00000CE6 88C3                    	mov	bl, al
  1924 00000CE8 88DA                    	mov	dl, bl
  1925 00000CEA 80E30F                  	and	bl, 0Fh
  1926 00000CED 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1927 00000CF3 A2[43520000]            	mov	[msgIOBaseAddr+3], al
  1928 00000CF8 88D3                    	mov	bl, dl
  1929 00000CFA C0EB04                  	shr	bl, 4
  1930 00000CFD 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1931 00000D03 A2[42520000]            	mov	[msgIOBaseAddr+2], al
  1932 00000D08 88E3                    	mov	bl, ah
  1933 00000D0A 88DA                    	mov	dl, bl
  1934 00000D0C 80E30F                  	and	bl, 0Fh
  1935 00000D0F 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1936 00000D15 A2[41520000]            	mov	[msgIOBaseAddr+1], al
  1937 00000D1A 88D3                    	mov	bl, dl
  1938 00000D1C C0EB04                  	shr	bl, 4
  1939 00000D1F 8A83[B0510000]          	mov	al, [ebx+hex_chars]
  1940 00000D25 A2[40520000]            	mov	[msgIOBaseAddr], al
  1941                                  
  1942                                  	; 24/11/2016
  1943 00000D2A 30E4                    	xor	ah, ah
  1944 00000D2C A0[6E520000]            	mov	al, [ac97_int_ln_reg]
  1945 00000D31 B10A                    	mov	cl, 10
  1946 00000D33 F6F1                    	div	cl
  1947 00000D35 660105[4B520000]        	add	[msgIRQ], ax
  1948 00000D3C 20C0                    	and	al, al
  1949 00000D3E 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1950 00000D40 A0[4C520000]            	mov	al, [msgIRQ+1]
  1951 00000D45 B420                    	mov	ah, ' '
  1952 00000D47 66A3[4B520000]          	mov	[msgIRQ], ax
  1953                                  _w_ac97imsg_:
  1954                                  	; EBX = Message address
  1955                                  	; ECX = Max. message length (or stop on ZERO character)
  1956                                  	;	(1 to 255)
  1957                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1958                                       	sys 	_msg, msgAC97Info, 255, 07h
  1958                              <1> 
  1958                              <1> 
  1958                              <1> 
  1958                              <1> 
  1958                              <1>  %if %0 >= 2
  1958 00000D4D BB[C1510000]        <1>  mov ebx, %2
  1958                              <1>  %if %0 >= 3
  1958 00000D52 B9FF000000          <1>  mov ecx, %3
  1958                              <1>  %if %0 = 4
  1958 00000D57 BA07000000          <1>  mov edx, %4
  1958                              <1>  %endif
  1958                              <1>  %endif
  1958                              <1>  %endif
  1958 00000D5C B823000000          <1>  mov eax, %1
  1958                              <1> 
  1958 00000D61 CD40                <1>  int 40h
  1959 00000D63 C3                              retn
  1960                                  
  1961                                  ;=============================================================================
  1962                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  1963                                  ;=============================================================================
  1964                                  
  1965                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  1966                                  
  1967                                  ;-----------------------------------------------------------------------------
  1968                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  1969                                  ;-----------------------------------------------------------------------------
  1970                                  	; 22/10/2017
  1971                                  setgraphmode:
  1972                                  	;pushad
  1973 00000D64 66B81200                	mov	ax,0012h
  1974                                  	;int	10h
  1975 00000D68 CD31                    	int 	31h
  1976 00000D6A 66BAC003                	mov	dx,3C0h
  1977 00000D6E 30C0                    	xor	al,al
  1978                                  setgraphmodel0:
  1979                                  	;out	dx,al
  1980 00000D70 B401                    	mov	ah, 1 ; outb
  1981 00000D72 CD34                    	int	34h
  1982                                  	;out	dx, al
  1983                                  	;mov	ah, 1
  1984 00000D74 CD34                    	int	34h
  1985 00000D76 FEC0                    	inc	al
  1986 00000D78 3C10                    	cmp	al, 10h
  1987 00000D7A 72F4                    	jb	short setgraphmodel0
  1988 00000D7C B020                    	mov	al, 20h
  1989                                  	;out	dx, al
  1990                                  	;mov	ah, 1
  1991 00000D7E CD34                    	int	34h
  1992                                  	;popad
  1993 00000D80 C3                      	retn
  1994                                  
  1995                                  ;-----------------------------------------------------------------------------
  1996                                  ; settextmode - restore the VGA 80x25x16 text mode
  1997                                  ;-----------------------------------------------------------------------------
  1998                                  	; 22/10/2017
  1999                                  settextmode:
  2000                                  	;pushad
  2001 00000D81 66B80300                	mov	ax, 0003h
  2002                                  	;int	10h
  2003 00000D85 CD31                    	int	31h
  2004                                  	;popad
  2005 00000D87 C3                      	retn
  2006                                  
  2007                                  ;-----------------------------------------------------------------------------
  2008                                  ; drawscopes - draw the track voices sample scopes
  2009                                  ; In:
  2010                                  ;  ESI = (current) sample buffer
  2011                                  ;-----------------------------------------------------------------------------
  2012                                  	; 27/10/2017
  2013                                  	; 26/10/2017
  2014                                  	; 23/10/2017
  2015                                  drawscopes:
  2016                                  	;pushad
  2017 00000D88 31C9                      	xor     ecx, ecx	
  2018 00000D8A 31D2                    	xor     edx, edx
  2019 00000D8C 31FF                    	xor	edi, edi
  2020                                  drawscope0:
  2021 00000D8E 66AD                    	lodsw
  2022 00000D90 80F480                  	xor	ah, 80h
  2023 00000D93 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2024 00000D96 66D1E3                  	shl	bx, 1
  2025 00000D99 668B83[A0D50000]        	mov	ax, [RowOfs+ebx]
  2026 00000DA0 668987[A0D70000]        	mov	[NewScope_L+edi], ax
  2027 00000DA7 30FF                    	xor	bh, bh
  2028 00000DA9 66AD                    	lodsw
  2029 00000DAB 80F480                  	xor	ah, 80h
  2030 00000DAE 88E3                    	mov	bl, ah	; Right Channel
  2031 00000DB0 66D1E3                  	shl	bx, 1
  2032 00000DB3 668B83[A0D50000]        	mov	ax, [RowOfs+ebx]
  2033 00000DBA 668987[A0D90000]        	mov	[NewScope_R+edi], ax
  2034 00000DC1 6683C702                	add	di, 2
  2035 00000DC5 FEC1                    	inc	cl
  2036 00000DC7 75C5                    	jnz	short drawscope0	
  2037                                  
  2038 00000DC9 66BAC403                        mov	dx, 3C4h
  2039                                          ;mov	ax, 0802h
  2040                                          ;out	dx, ax
  2041 00000DCD 66BB0208                        mov	bx, 0802h
  2042 00000DD1 B403                    	mov	ah, 3 ; outw
  2043 00000DD3 CD34                    	int	34h
  2044 00000DD5 66BACE03                	mov	dx, 3CEh
  2045 00000DD9 B008                            mov	al, 08h
  2046                                         ;out	dx, al
  2047 00000DDB B401                            mov	ah, 1 ; outb
  2048 00000DDD CD34                    	int	34h
  2049 00000DDF 6642                    	inc	dx
  2050                                  
  2051                                  	; 26/10/2017
  2052 00000DE1 31F6                            xor	esi, esi
  2053 00000DE3 31FF                            xor	edi, edi
  2054 00000DE5 BB45060A00                      mov     ebx, 0A0645h
  2055                                  drawscopel4:
  2056 00000DEA B080                            mov     al, 80h
  2057                                  drawscopel2:
  2058 00000DEC 50                              push    eax ; *
  2059 00000DED 52                              push    edx ; **
  2060                                  	;out	dx, al
  2061 00000DEE B401                    	mov	ah, 1 ; outb
  2062 00000DF0 CD34                    	int	34h
  2063                                  
  2064 00000DF2 B4FF                            mov	ah, 0FFh
  2065                                          ;mov	ecx, 32
  2066 00000DF4 66B92000                	mov	cx, 32
  2067 00000DF8 28C0                            sub     al, al
  2068                                  drawscopel3:
  2069                                  	; 23/10/2017
  2070 00000DFA 668B96[A0DB0000]                mov	dx, [OldScope_L+esi]
  2071 00000E01 663B96[A0D70000]                cmp	dx, [NewScope_L+esi]
  2072 00000E08 7414                            je	short drawscopef3
  2073 00000E0A 88041A                          mov	[edx+ebx], al ; L
  2074 00000E0D 668B96[A0D70000]                mov     dx, [NewScope_L+esi]
  2075 00000E14 88241A                  	mov	[edx+ebx], ah ; L
  2076 00000E17 668996[A0DB0000]                mov     [OldScope_L+esi], dx
  2077                                  drawscopef3:
  2078                                  	; 27/10/2017
  2079 00000E1E 668B96[A0DD0000]                mov	dx, [OldScope_R+esi]
  2080 00000E25 663B96[A0D90000]                cmp	dx, [NewScope_R+esi]
  2081 00000E2C 7416                            je	short drawscopef4
  2082 00000E2E 88441A26                	mov	[edx+ebx+38], al ; R
  2083 00000E32 668B96[A0D90000]                mov     dx, [NewScope_R+esi]
  2084 00000E39 88641A26                        mov	[edx+ebx+38], ah ; R
  2085 00000E3D 668996[A0DD0000]                mov     [OldScope_R+esi], dx
  2086                                  drawscopef4:
  2087 00000E44 83C610                          add	esi, 2*8
  2088 00000E47 43                              inc	ebx
  2089 00000E48 E2B0                            loop    drawscopel3
  2090                                  
  2091 00000E4A 5A                              pop     edx ; **
  2092 00000E4B 58                              pop     eax ; *
  2093 00000E4C 81EEFE010000                    sub	esi, 2*256-2
  2094 00000E52 83EB20                          sub	ebx, 32
  2095 00000E55 D0E8                            shr     al, 1
  2096 00000E57 7593                            jnz	short drawscopel2
  2097                                  	;popad
  2098 00000E59 C3                              retn
  2099                                  
  2100                                  ;=============================================================================
  2101                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2102                                  ;=============================================================================
  2103                                  
  2104                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2105                                  
  2106                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2107                                  
  2108                                  ;-----------------------------------------------------------------------------
  2109                                  ; EQUATES AND STRUCTURES
  2110                                  ;-----------------------------------------------------------------------------
  2111                                  
  2112                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2113                                  ID_ILBM equ 4D424C49h
  2114                                  ID_BMHD equ 44484D42h
  2115                                  ID_CMAP equ 50414D43h
  2116                                  ID_BODY equ 59444F42h
  2117                                  
  2118                                  struc Form			; IFF/ILBM header file format
  2119 00000000 <res 00000004>            .ID:		resd 1
  2120 00000004 <res 00000004>            .Length:	resd 1
  2121 00000008 <res 00000004>            .Type:	resd 1
  2122                                    .size:
  2123                                  endstruc
  2124                                  
  2125                                  struc Chunk			; IFF/ILBM header chunk format
  2126 00000000 <res 00000004>            .ID:		resd 1
  2127 00000004 <res 00000004>            .Length:	resd 1
  2128                                    .size:	
  2129                                  endstruc
  2130                                  
  2131                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2132 00000000 <res 00000002>            .Width: 	resw 1
  2133 00000002 <res 00000002>            .Height:	resw 1
  2134 00000004 <res 00000002>            .PosX:	resw 1
  2135 00000006 <res 00000002>            .PosY:	resw 1
  2136 00000008 <res 00000001>            .Planes:	resb 1
  2137 00000009 <res 00000001>            .Masking:	resb 1
  2138 0000000A <res 00000001>            .Compression:	resb 1
  2139 0000000B <res 00000001>            .Pad:		resb 1
  2140 0000000C <res 00000002>            .Transparent:	resw 1
  2141 0000000E <res 00000001>            .AspectX	resb 1
  2142 0000000F <res 00000001>            .AspectY:	resb 1
  2143 00000010 <res 00000002>            .PageWidth:	resw 1
  2144 00000012 <res 00000002>            .PageHeight:	resw 1
  2145                                    .size:	
  2146                                  endstruc
  2147                                  
  2148                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2149 00000000 <res 00000300>            .Colors:	resb 768
  2150                                    .size:	
  2151                                  endstruc
  2152                                  
  2153                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2154                                  
  2155                                  ;------------------------------------------------------------------------------
  2156                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2157                                  ;         a value in little/big endian form to big/little endian form.
  2158                                  ;------------------------------------------------------------------------------
  2159                                  %macro	bswap   1
  2160                                          xchg    al, ah
  2161                                          rol     eax, 16
  2162                                          xchg    al, ah
  2163                                  %endmacro
  2164                                  
  2165                                  ;------------------------------------------------------------------------------
  2166                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2167                                  ; In:
  2168                                  ;  ESI = IFF/ILBM image file address
  2169                                  ;------------------------------------------------------------------------------
  2170                                  putlbm:
  2171 00000E5A 60                              pushad
  2172                                  
  2173                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2174                                  
  2175 00000E5B 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2176 00000E61 7551                            jne     short putlbmd0
  2177 00000E63 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2178 00000E6A 7548                            jne     short putlbmd0
  2179                                  
  2180                                  ; get the IFF/ILBM file length in bytes
  2181                                  
  2182 00000E6C 8B4604                          mov     eax, [esi+Form.Length]
  2183                                          bswap   eax
  2183 00000E6F 86C4                <1>  xchg al, ah
  2183 00000E71 C1C010              <1>  rol eax, 16
  2183 00000E74 86C4                <1>  xchg al, ah
  2184 00000E76 89C1                            mov     ecx, eax
  2185                                  
  2186                                  ; decrease the file length and updates the file pointer
  2187                                  
  2188 00000E78 83E904                          sub     ecx, 4
  2189 00000E7B 83C60C                          add     esi, Form.size
  2190                                  
  2191                                  ; IFF/ILBM main parser body loop
  2192                                  
  2193                                  putlbml0:
  2194 00000E7E 85C9                            test    ecx, ecx
  2195 00000E80 7E64                            jle     short putlbmd1
  2196                                  
  2197                                  ; get the next chunk ID and length in bytes
  2198                                  
  2199 00000E82 8B1E                            mov     ebx, [esi+Chunk.ID]
  2200 00000E84 8B4604                          mov     eax, [esi+Chunk.Length]
  2201                                          bswap   eax
  2201 00000E87 86C4                <1>  xchg al, ah
  2201 00000E89 C1C010              <1>  rol eax, 16
  2201 00000E8C 86C4                <1>  xchg al, ah
  2202 00000E8E 93                              xchg    ebx, eax
  2203 00000E8F 83C608                          add     esi, Chunk.size
  2204                                  
  2205                                  ; word align the chunk length and decrease the file length counter
  2206                                  
  2207 00000E92 43                              inc     ebx
  2208 00000E93 80E3FE                          and     bl, 0FEh ; ~1
  2209 00000E96 83E908                          sub     ecx, Chunk.size
  2210 00000E99 29D9                            sub     ecx, ebx
  2211                                  
  2212                                  ; check for the BMHD/CMAP/BODY chunk headers
  2213                                  
  2214 00000E9B 3D424D4844                      cmp     eax, ID_BMHD
  2215 00000EA0 7415                            je      short putlbmf0
  2216 00000EA2 3D434D4150                      cmp     eax, ID_CMAP
  2217 00000EA7 7440                            je      short putlbmf1
  2218 00000EA9 3D424F4459                      cmp     eax, ID_BODY
  2219 00000EAE 7455                            je      short putlbmf2
  2220                                  
  2221                                  ; advance to the next IFF/ILBM chunk structure
  2222                                  
  2223                                  putlbmc0:
  2224 00000EB0 01DE                            add     esi, ebx
  2225 00000EB2 EBCA                            jmp     short putlbml0
  2226                                  
  2227                                  putlbmd0:
  2228 00000EB4 F9                              stc
  2229 00000EB5 61                              popad
  2230 00000EB6 C3                              retn
  2231                                  
  2232                                  ; process the BMHD bitmap header chunk
  2233                                  
  2234                                  putlbmf0:
  2235 00000EB7 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2236 00000EBB 75F7                            jne     short putlbmd0
  2237 00000EBD 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2238 00000EC1 75F1                            jne     short putlbmd0
  2239 00000EC3 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2240 00000EC7 75EB                            jne     short putlbmd0
  2241 00000EC9 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2242 00000ECC 86C4                            xchg    al, ah
  2243 00000ECE 83C007                          add     eax, 7
  2244 00000ED1 C1E803                          shr     eax, 3
  2245 00000ED4 A3[58520000]                    mov     [picture.width], eax
  2246 00000ED9 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2247 00000EDD 86C4                            xchg    al, ah
  2248 00000EDF A3[5C520000]                    mov     [picture.height], eax
  2249 00000EE4 EBCA                            jmp     short putlbmc0
  2250                                  
  2251                                  putlbmd1:
  2252 00000EE6 F8                              clc
  2253 00000EE7 61                              popad
  2254 00000EE8 C3                              retn
  2255                                  
  2256                                  ; process the CMAP colormap chunk
  2257                                  
  2258                                  putlbmf1:
  2259 00000EE9 66BAC803                        mov     dx, 3C8h
  2260 00000EED 30C0                            xor     al, al
  2261                                          ;out	dx, al
  2262 00000EEF B401                    	mov	ah, 1 ; outb
  2263 00000EF1 CD34                    	int	34h
  2264 00000EF3 6642                            inc     dx
  2265                                  putlbml1:
  2266 00000EF5 8A06                            mov     al, [esi]
  2267 00000EF7 C0E802                          shr     al, 2
  2268                                          ;out	dx, al
  2269                                  	;mov	ah, 1 ; outb
  2270 00000EFA CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2271 00000EFC 46                              inc     esi
  2272 00000EFD 4B                              dec     ebx
  2273 00000EFE 7FF5                            jg      short putlbml1
  2274 00000F00 E979FFFFFF                      jmp     putlbml0
  2275                                  
  2276                                  ; process the BODY bitmap body chunk
  2277                                  
  2278                                  putlbmf2:
  2279 00000F05 60                              pushad
  2280 00000F06 BF00000A00                      mov     edi, 0A0000h
  2281                                          ;cld
  2282 00000F0B 66BACE03                        mov     dx, 3CEh
  2283                                          ;mov	ax, 0FF08h
  2284                                          ;out	dx, ax
  2285 00000F0F 66BB08FF                	mov	bx, 0FF08h
  2286 00000F13 B403                    	mov	ah, 3 ; outw
  2287 00000F15 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2288 00000F17 66BAC403                        mov     dx, 3C4h
  2289 00000F1B B002                            mov     al, 02h
  2290                                          ;out	dx, al
  2291 00000F1D B401                    	mov	ah, 1 ; outb
  2292 00000F1F CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2293 00000F21 6642                            inc     dx
  2294 00000F23 8B0D[5C520000]                  mov     ecx, [picture.height]
  2295                                  putlbml2:
  2296 00000F29 51                              push    ecx
  2297 00000F2A B011                            mov     al, 11h
  2298                                  putlbml3:
  2299 00000F2C 50                              push    eax
  2300 00000F2D 57                              push    edi
  2301                                          ;out	dx, al
  2302 00000F2E B401                    	mov	ah, 1 ; outb
  2303 00000F30 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2304 00000F32 8B1D[58520000]                  mov     ebx, [picture.width]
  2305                                  putlbml4:
  2306 00000F38 AC                              lodsb
  2307 00000F39 84C0                            test    al, al
  2308 00000F3B 7C0A                            jl      short putlbmf3
  2309 00000F3D 0FB6C8                          movzx   ecx, al
  2310 00000F40 41                              inc     ecx
  2311 00000F41 29CB                            sub     ebx, ecx
  2312 00000F43 F3A4                            rep     movsb
  2313 00000F45 EB0B                            jmp     short putlbmc4
  2314                                  putlbmf3:
  2315 00000F47 F6D8                            neg     al
  2316 00000F49 0FB6C8                          movzx   ecx, al
  2317 00000F4C 41                              inc     ecx
  2318 00000F4D 29CB                            sub     ebx, ecx
  2319 00000F4F AC                              lodsb
  2320 00000F50 F3AA                            rep     stosb
  2321                                  putlbmc4:
  2322 00000F52 85DB                            test    ebx, ebx
  2323 00000F54 7FE2                            jg      short putlbml4
  2324 00000F56 5F                              pop     edi
  2325 00000F57 58                              pop     eax
  2326 00000F58 00C0                            add     al, al
  2327 00000F5A 73D0                            jnc     short putlbml3
  2328 00000F5C 83C750                          add     edi, 80
  2329 00000F5F 59                              pop     ecx
  2330 00000F60 E2C7                            loop    putlbml2
  2331 00000F62 61                      	popad
  2332 00000F63 E948FFFFFF                      jmp	putlbmc0
  2333                                  
  2334                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2335                                  ;------------------------------------------------------------------------------
  2336                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2337                                  ;  ESI = IFF/ILBM image file address
  2338                                  ;------------------------------------------------------------------------------
  2339                                  
  2340                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2341                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2342                                  ;       MODStopModule();
  2343                                  ;       MODFreeModule(Song);
  2344                                  ;       return;
  2345                                  ;   }
  2346                                  ;   setgraphmode();
  2347                                  ;   putlbm(Logo);
  2348                                  ;   while (!kbhit())
  2349                                  ;       drawscopes(Song->NumTracks);
  2350                                  ;   settextmode();
  2351                                  ;   free(Logo);
  2352                                  ;   MODStopModule();
  2353                                  ;   MODFreeModule(Song);
  2354                                  
  2355                                  ;loadlbm:
  2356                                  ;	; ebx = ASCIIZ file name address
  2357                                  ;	; ecx = open mode (0 = open for read)	
  2358                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2359                                  ;	jc	short loadlbm_retn
  2360                                  ;
  2361                                  ;	mov     [LBM_FileHandle], eax
  2362                                  ;
  2363                                  ;	; get file size by moving file pointer to the end of file
  2364                                  ;	; ebx = file handle/number
  2365                                  ;	; ecx : offset = 0
  2366                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2367                                  ;	sys	_seek, eax, 0, 2
  2368                                  ;	jc	short loadlbm_cf
  2369                                  ;
  2370                                  ;	mov	[LBM_FileSize], eax
  2371                                  ;
  2372                                  ;	; move file pointer to the beginning of the file
  2373                                  ;	; ecx = 0
  2374                                  ;	; edx = 0
  2375                                  ;	;xor	ecx, ecx
  2376                                  ; 	xor	dl, dl
  2377                                  ;	; ebx = [LBM_FileHandle]
  2378                                  ;	sys	_seek
  2379                                  ;	;jc	short loadlbm_cf
  2380                                  ;
  2381                                  ;	; ebx = File handle
  2382                                  ;	; ecx = Buffer address
  2383                                  ;	; edx = Byte count
  2384                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2385                                  ;	mov	ecx, LOGO_ADDRESS
  2386                                  ;	mov	edx, [LBM_FileSize]
  2387                                  ;	sys	_read
  2388                                  ;	jc	short loadlbm_cf
  2389                                  ;
  2390                                  ;	cmp	eax, edx  ; read count = file size ?
  2391                                  ;	;jb	short loadlbm_cf		 
  2392                                  ;loadlbm_cf:
  2393                                  ;	pushf
  2394                                  ;	sys	_close, [LBM_FileHandle]	
  2395                                  ;	popf
  2396                                  ;loadlbm_retn:
  2397                                  ;	retn	
  2398                                  ;
  2399                                  ;LOGO_FILE_NAME:
  2400                                  ;	db	"LOGO.LBM", 0
  2401                                  
  2402                                  LOGO_ERROR_MSG:
  2403 00000F68 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2403 00000F71 64696E672074686520-
  2403 00000F7A 4946462F494C424D20-
  2403 00000F83 6C6F676F2070696374-
  2403 00000F8C 75726520210D0A00   
  2404                                  
  2405                                  align 2
  2406                                  ; 22/10/2017
  2407                                  LOGO_ADDRESS:
  2408                                  ;incbin "LOGO.LBM"	  	 
  2409                                  ; 27/10/2017
  2410 00000F94 <incbin>                incbin "TINYPLAY.LBM"
  2411                                  
  2412                                  ;=============================================================================
  2413                                  ;               preinitialized data
  2414                                  ;=============================================================================
  2415                                  
  2416                                  ;=============================================================================
  2417                                  ; Protracker effects stuff
  2418                                  ;=============================================================================
  2419                                  
  2420                                  ;-----------------------------------------------------------------------------
  2421                                  ; Effect jump tables
  2422                                  ;-----------------------------------------------------------------------------
  2423                                  
  2424                                  align 4
  2425                                  
  2426                                  efxtable:
  2427 00004F84 [9B070000]              	dd      efxarpeggio	; 0 - arpeggio
  2428 00004F88 [C8040000]              	dd      efxnull		; 1 - porta up
  2429 00004F8C [C8040000]              	dd      efxnull		; 2 - porta down
  2430 00004F90 [E6060000]              	dd      efxtoneporta	; 3 - tone porta
  2431 00004F94 [F5060000]              	dd      efxvibrato	; 4 - vibrato
  2432 00004F98 [C8040000]              	dd      efxnull		; 5 - tone+slide
  2433 00004F9C [C8040000]              	dd      efxnull		; 6 - vibrato+slide
  2434 00004FA0 [12080000]              	dd      efxtremolo	; 7 - tremolo
  2435 00004FA4 [C8040000]              	dd      efxnull		; 8 - unused
  2436 00004FA8 [1D070000]              	dd      efxsampoffset	; 9 - sample offset
  2437 00004FAC [C8040000]              	dd      efxnull		; A - volume slide
  2438 00004FB0 [29070000]              	dd      efxpattjump	; B - pattern jump
  2439 00004FB4 [37070000]              	dd      efxsetvolume	; C - set volume
  2440 00004FB8 [45070000]              	dd      efxbreak	; D - break pattern
  2441 00004FBC [C8040000]              	dd      efxnull		; E - extra effects
  2442 00004FC0 [64070000]              	dd      efxsetspeed	; F - set speed
  2443                                  
  2444                                  efxtable2:
  2445 00004FC4 [C9040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2446 00004FC8 [EB040000]              	dd      efxportaup	; 1 - porta up
  2447 00004FCC [11050000]              	dd      efxportadown	; 2 - porta down
  2448 00004FD0 [38050000]              	dd      efxtoneporta2	; 3 - tone porta
  2449 00004FD4 [71050000]              	dd      efxvibrato2	; 4 - vibrato
  2450 00004FD8 [CD050000]              	dd      efxtoneslide	; 5 - tone+slide
  2451 00004FDC [DA050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2452 00004FE0 [01060000]              	dd      efxtremolo2	; 7 - tremolo
  2453 00004FE4 [C8040000]              	dd      efxnull		; 8 - unused
  2454 00004FE8 [C8040000]              	dd      efxnull		; 9 - sample offset
  2455 00004FEC [E4050000]              	dd      efxvolslide	; A - volume slide
  2456 00004FF0 [C8040000]              	dd      efxnull		; B - pattern jump
  2457 00004FF4 [C8040000]              	dd      efxnull		; C - set volume
  2458 00004FF8 [C8040000]              	dd      efxnull		; D - break pattern
  2459 00004FFC [C8040000]              	dd      efxnull		; E - extra effects
  2460 00005000 [C8040000]              	dd      efxnull		; F - set speed
  2461                                  
  2462                                  ;-----------------------------------------------------------------------------
  2463                                  ; Amiga period table
  2464                                  ;-----------------------------------------------------------------------------
  2465                                  
  2466                                  ;PeriodTable0:	
  2467                                  ;	dw	0
  2468                                  PeriodTable:
  2469 00005004 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2469 0000500D 0A000A7009E8086808-
  2469 00005016 F00780071407       
  2470 0000501C B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2470 00005025 050005B80474043404-
  2470 0000502E F803C0038A03       
  2471 00005034 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2471 0000503D 0280025C023A021A02-
  2471 00005046 FC01E001C501       
  2472 0000504C AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2472 00005055 0140012E011D010D01-
  2472 0000505E FE00F000E200       
  2473 00005064 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2473 0000506D 00A00097008F008700-
  2473 00005076 7F0078007100       
  2474 0000507C 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2474 00005085 0050004B0047004300-
  2474 0000508E 3F003C003800       
  2475 00005094 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2475 0000509D 002800250023002100-
  2475 000050A6 1F001E001C00       
  2476                                  
  2477                                  ;-----------------------------------------------------------------------------
  2478                                  ; Sinus wave table
  2479                                  ;-----------------------------------------------------------------------------
  2480                                  
  2481                                  SinTable:
  2482 000050AC 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2482 000050B5 C5D4E1             
  2483 000050B8 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2483 000050C1 E1                 
  2484 000050C2 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2484 000050CB 19                 
  2485                                  
  2486                                  ;=============================================================================
  2487                                  ;               PLAY.ASM - DATA
  2488                                  ;=============================================================================
  2489 000050CC 00                      	db	0
  2490                                  msg_usage:
  2491 000050CD 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2491 000050D6 506C6179657220666F-
  2491 000050DF 72205452444F532033-
  2491 000050E8 383620627920457264-
  2491 000050F1 6F67616E2054616E2E-
  2491 000050FA 20                 
  2492 000050FB 4F63746F6265722032-     	db	'October 2017.',10,13
  2492 00005104 3031372E0A0D       
  2493 0000510A 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2493 00005113 6F64706C6179206669-
  2493 0000511C 6C656E616D652E6D6F-
  2493 00005125 640A0D00           
  2494 00005129 32382F31302F323031-     	db	'28/10/2017',10,13,0
  2494 00005132 370A0D00           
  2495                                  
  2496                                  Credits:
  2497 00005136 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2497 0000513F 506C61796572207630-
  2497 00005148 2E3162206279204361-
  2497 00005151 726C6F732048617361-
  2497 0000515A 6E2E204A756C792031-
  2497 00005163 3939332E           
  2498 00005167 0A0D00                  	db	10,13,0
  2499                                  ErrorMesg:    
  2500 0000516A 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  2500 00005173 64696E67204D6F6475-
  2500 0000517C 6C652066696C652E0A-
  2500 00005185 0D00               
  2501                                  
  2502                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2503                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2504                                  ;PortText:    db 'x0h, IRQ '
  2505                                  ;IrqText:     db 'x.',10,13,0
  2506                                  
  2507                                  trdos386_err_msg:
  2508 00005187 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2508 00005190 2053797374656D2063-
  2508 00005199 616C6C206572726F72-
  2508 000051A2 20210A0D00         
  2509                                  
  2510                                  ; 07/10/2017
  2511 000051A7 0A                      pattern_shift:	db 10
  2512                                  ;numtracks:	dw 4
  2513                                  ; 18/10/2017
  2514 000051A8 04000000                numtracks:	dd 4
  2515                                  
  2516                                  ;=============================================================================
  2517                                  ;               PLAYER.ASM - DATA
  2518                                  ;=============================================================================
  2519                                  
  2520                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2521                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2522                                  
  2523                                  ;19/10/2017
  2524 000051AC 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2525 000051AD 10                      bps:		db 16 ; bits per sample (8 or 16)
  2526                                  
  2527                                  Sample_Rate:
  2528 000051AE 2256                    MixSpeed:	dw 22050 ; Hz
  2529                                  
  2530                                  ; 13/11/2016
  2531 000051B0 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2531 000051B9 3941424344454600   
  2532                                  ;
  2533                                  msgAC97Info:	
  2534 000051C1 0D0A                    		db 0Dh, 0Ah
  2535 000051C3 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2535 000051CC 6F20436F6E74726F6C-
  2535 000051D5 6C6572202620436F64-
  2535 000051DE 656320496E666F0D0A 
  2536 000051E7 56656E646F72204944-     		db "Vendor ID: "
  2536 000051F0 3A20               
  2537 000051F2 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2537 000051FB 6963652049443A20   
  2538 00005203 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2539 0000520A 4275733A20              		db "Bus: "
  2540 0000520F 303068204465766963-     msgBusNo:	db "00h Device: "
  2540 00005218 653A20             
  2541 0000521B 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2541 00005224 696F6E3A20         
  2542 00005229 303068                  msgFncNo	db "00h"
  2543 0000522C 0D0A                    		db 0Dh, 0Ah
  2544 0000522E 492F4F204261736520-     		db "I/O Base Address: "
  2544 00005237 416464726573733A20 
  2545 00005240 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  2545 00005249 3A20               
  2546 0000524B 3030                    msgIRQ:		dw 3030h
  2547 0000524D 0D0A00                  		db 0Dh, 0Ah, 0
  2548                                  ;msgSampleRate:	db "Sample Rate: "
  2549                                  ;msgHertz:	db "00000 Hz ", 0
  2550                                  ;msg8Bits:	db "8 bits ", 0
  2551                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  2552                                  ;msg16Bits:	db "16 bits ", 0
  2553                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  2554                                  ;
  2555                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2556                                  ;codec_id:	   dd 0
  2557                                  ;codec_chip_id:	   dd 0
  2558                                  ;codec_vendor_ids: dw 0
  2559                                  ;codec_chip_ids:   dw 0
  2560                                  
  2561                                  ;dword_str:	dd 30303030h, 30303030h
  2562                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2563                                  
  2564                                  ;=============================================================================
  2565                                  ;        	uninitialized data
  2566                                  ;=============================================================================
  2567                                  
  2568                                  bss_start:
  2569                                  
  2570                                  ABSOLUTE bss_start
  2571                                  
  2572                                  alignb 4
  2573                                  
  2574                                  ;------------------------------------------------------------------------------
  2575                                  ; IFF/ILBM DATA
  2576                                  ;------------------------------------------------------------------------------
  2577                                  
  2578 00005250 <res 00000004>          LBM_FileHandle:	resd 1
  2579 00005254 <res 00000004>          LBM_FileSize:	resd 1
  2580                                  ;
  2581 00005258 <res 00000004>          picture.width:	resd 1 		; current picture width and height
  2582 0000525C <res 00000004>          picture.height:	resd 1
  2583                                  
  2584                                  ;------------------------------------------------------------------------------
  2585                                  
  2586 00005260 <res 00000004>          dev_vendor:	resd 1
  2587 00005264 <res 00000004>          bus_dev_fn:	resd 1
  2588 00005268 <res 00000004>          stats_cmd:	resd 1
  2589 0000526C <res 00000002>          ac97_io_base:	resw 1
  2590 0000526E <res 00000001>          ac97_int_ln_reg: resb 1
  2591 0000526F <res 00000001>          srb:		resb 1
  2592                                  
  2593                                  ; MODLOAD.ASM
  2594 00005270 <res 00000004>          FileHandle:	resd 1
  2595 00005274 <res 0000043C>          Header:		resb ModHeader.size
  2596                                  
  2597                                  ; MODPLAY.ASM
  2598                                  ;MixSpeed:	    resw 1
  2599                                  
  2600                                  ModInfo:
  2601 000056B0 <res 00000001>          ModInfo.OrderLen:   resb 1
  2602 000056B1 <res 00000001>          ModInfo.ReStart:    resb 1
  2603 000056B2 <res 00000080>          ModInfo.Order:	    resb 128
  2604 00005732 <res 00000004>          ModInfo.Patterns:   resd 1
  2605                                  
  2606 00005736 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2607 00005774 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2608 000057B2 <res 0000003E>          ModInfo.SampLen:    resw 31
  2609 000057F0 <res 0000003E>          ModInfo.SampRep:    resw 31
  2610 0000582E <res 0000003E>          ModInfo.SampRepLen: resw 31
  2611 0000586C <res 0000003E>          ModInfo.SampVol:    resw 31
  2612                                  
  2613                                  ; MODPLAY.ASM
  2614                                  PitchTable:	;resw 857
  2615 000058AA <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2616 0000736C <res 00004100>          VolTable:	resb 16640
  2617 0000B46C <res 00001FEC>          MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2618                                  
  2619                                  ; MODPLAY.ASM
  2620 0000D458 <res 00000001>          OrderPos:	resb 1
  2621 0000D459 <res 00000001>          Tempo:		resb 1
  2622 0000D45A <res 00000001>          TempoWait:	resb 1
  2623 0000D45B <res 00000001>          Bpm:		resb 1
  2624 0000D45C <res 00000001>          Row:		resb 1
  2625 0000D45D <res 00000001>          BreakRow:	resb 1
  2626 0000D45E <res 00000002>          BpmSamples:	resw 1
  2627 0000D460 <res 00000004>          BufPtr:		resd 1
  2628 0000D464 <res 00000002>          BufLen:		resw 1
  2629 0000D466 <res 00000004>          BufRep:		resd 1
  2630 0000D46A <res 00000004>          Note:		resd 1
  2631                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2632                                  ; 07/10/2017
  2633 0000D46E <res 00000130>          Tracks:		resb TrackInfo.size*8
  2634                                  
  2635 0000D59E <res 00000002>          alignb 16
  2636                                  
  2637                                  ; PLAY.ASM
  2638                                  ;Scope:		resw 320
  2639 0000D5A0 <res 00000200>          RowOfs:		resw 256
  2640                                  
  2641                                  ; 23/10/2017
  2642 0000D7A0 <res 00000200>          NewScope_L:	resw 256
  2643 0000D9A0 <res 00000200>          NewScope_R:	resw 256
  2644 0000DBA0 <res 00000200>          OldScope_L:	resw 256
  2645 0000DDA0 <res 00000200>          OldScope_R:	resw 256
  2646                                  
  2647                                  mod_file_name:
  2648 0000DFA0 <res 00000050>          		resb 80
  2649                                  
  2650                                  ; 20/10/2017 (modplay7.s, SB16)
  2651                                  ; 19/10/2017 (modplay6.s, AC97)
  2652 0000DFF0 <res 00000001>          pan_shift:	resb 1
  2653 0000DFF1 <res 00000001>          volume_level:	resb 1
  2654                                  
  2655 0000DFF2 <res 0000000E>          alignb 4096
  2656                                  
  2657                                  Audio_Buffer:
  2658 0000E000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2659                                  ;temp_buffer:
  2660                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2661                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2662                                  
  2663 00016000 <res 0000A000>          alignb 65536
  2664                                  
  2665                                  DMA_Buffer:
  2666 00020000 <res 00010000>          		resb 2*BUFFERSIZE  ; 65536 ; 09/10/2017 
  2667                                  file_buffer:
  2668 00030000 <res 00060000>          	resb 65536*6
  2669                                  EOF:
