     1                                  ; ****************************************************************************
     2                                  ; tmodply2.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY2.PRG ! AC'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 27/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 02/06/2024 ]  !!! 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 'tinyply3.s' ('TINYPLY3.PRG') 
    29                                  ; by Erdogan Tan (07/10/2017)
    30                                  ;
    31                                  ; Modified from 'playwav3.s' (13/06/2017)
    32                                  ;
    33                                  ; Modified from 'PLAYMOD.PRG' ('playmod.s') source code by Erdogan Tan
    34                                  ;			                     (23/06/2017)
    35                                  ;
    36                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM') by Erdogan Tan
    37                                  ;				      (04/03/2017) 
    38                                  ; Assembler: NASM 2.11
    39                                  ; ----------------------------------------------------------------------------
    40                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    41                                  ; ****************************************************************************
    42                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    43                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    44                                  
    45                                  ; 01/03/2017
    46                                  ; 16/10/2016
    47                                  ; 29/04/2016
    48                                  ; TRDOS 386 system calls (temporary list!)
    49                                  _ver 	equ 0
    50                                  _exit 	equ 1
    51                                  _fork 	equ 2
    52                                  _read 	equ 3
    53                                  _write	equ 4
    54                                  _open	equ 5
    55                                  _close 	equ 6
    56                                  _wait 	equ 7
    57                                  _creat 	equ 8
    58                                  _link 	equ 9
    59                                  _unlink	equ 10
    60                                  _exec	equ 11
    61                                  _chdir	equ 12
    62                                  _time 	equ 13
    63                                  _mkdir 	equ 14
    64                                  _chmod	equ 15
    65                                  _chown	equ 16
    66                                  _break	equ 17
    67                                  _stat	equ 18
    68                                  _seek	equ 19
    69                                  _tell 	equ 20
    70                                  _mount	equ 21
    71                                  _umount	equ 22
    72                                  _setuid	equ 23
    73                                  _getuid	equ 24
    74                                  _stime	equ 25
    75                                  _quit	equ 26	
    76                                  _intr	equ 27
    77                                  _fstat	equ 28
    78                                  _emt 	equ 29
    79                                  _mdate 	equ 30
    80                                  _video 	equ 31
    81                                  _audio	equ 32
    82                                  _timer	equ 33
    83                                  _sleep	equ 34
    84                                  _msg    equ 35
    85                                  _geterr	equ 36
    86                                  _fpsave	equ 37
    87                                  _pri	equ 38
    88                                  _rele	equ 39
    89                                  _fff	equ 40
    90                                  _fnf	equ 41
    91                                  _alloc	equ 42
    92                                  _dalloc equ 43
    93                                  _calbac equ 44		
    94                                  
    95                                  %macro sys 1-4
    96                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    97                                      ; 03/09/2015	
    98                                      ; 13/04/2015
    99                                      ; Retro UNIX 386 v1 system call.	
   100                                      %if %0 >= 2   
   101                                          mov ebx, %2
   102                                          %if %0 >= 3    
   103                                              mov ecx, %3
   104                                              %if %0 = 4
   105                                                 mov edx, %4   
   106                                              %endif
   107                                          %endif
   108                                      %endif
   109                                      mov eax, %1
   110                                      ;int 30h
   111                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   112                                  %endmacro
   113                                  
   114                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   115                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   116                                  
   117                                  ; 19/06/2017
   118                                  BUFFERSIZE equ 32768
   119                                  
   120                                  ; ----------------------------------------------------------------------------
   121                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   122                                  ;	July 14th, 1993.
   123                                  
   124                                  ;=============================================================================
   125                                  ;  
   126                                  ;=============================================================================
   127                                  
   128                                  [BITS 32]
   129                                  [org 0]
   130                                  
   131                                  Start:
   132                                  	; clear bss
   133 00000000 B9[00000900]            	mov	ecx, EOF
   134 00000005 BF[9D520000]            	mov	edi, bss_start
   135 0000000A 29F9                    	sub	ecx, edi
   136 0000000C D1E9                    	shr	ecx, 1
   137 0000000E 31C0                    	xor	eax, eax
   138 00000010 F366AB                  	rep	stosw
   139                                  
   140                                  	; Detect (& Enable) AC'97 (ICH) Audio Device
   141 00000013 E814020000              	call    DetectICH
   142 00000018 731B                    	jnc     short GetFileName
   143                                  
   144                                  _dev_not_ready:
   145                                  ; couldn't find the audio device!
   146                                  	sys	_msg, noDevMsg, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000001A BB[39020000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000001F B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000024 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000029 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 0000002E CD40                <1>  int 40h
   147 00000030 E9D6010000                      jmp     Exit
   148                                  
   149                                  GetFileName:
   150                                  	;cmp	ah, 1 ; SB16 Sound card
   151                                  	;jne	_dev_not_ready	
   152                                  	  
   153 00000035 89E6                    	mov	esi, esp
   154 00000037 AD                      	lodsd
   155 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   156                                  		; (program file name & mod file name)
   157 0000003B 0F82D3010000            	jb	pmsg_usage ; nothing to do
   158                                  
   159 00000041 AD                      	lodsd ; program file name address 
   160 00000042 AD                      	lodsd ; mod file name address (file to be read)
   161 00000043 89C6                    	mov	esi, eax
   162 00000045 BF[F0DF0000]            	mov	edi, mod_file_name
   163                                  ScanName:       
   164 0000004A AC                      	lodsb
   165 0000004B 84C0                    	test	al, al
   166 0000004D 0F84C1010000            	je	pmsg_usage
   167 00000053 3C20                    	cmp	al, 20h
   168 00000055 74F3                    	je	short ScanName	; scan start of name.
   169 00000057 AA                      	stosb
   170 00000058 B4FF                    	mov	ah, 0FFh
   171                                  a_0:	
   172 0000005A FEC4                    	inc	ah
   173                                  a_1:
   174 0000005C AC                      	lodsb
   175 0000005D AA                      	stosb
   176 0000005E 3C2E                    	cmp	al, '.'
   177 00000060 74F8                    	je	short a_0	
   178 00000062 20C0                    	and	al, al
   179 00000064 75F6                    	jnz	short a_1
   180                                  
   181 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   182 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   183                                  SetExt:
   184 0000006A 4F                      	dec	edi
   185 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   186 00000071 C6470400                	mov	byte [edi+4], 0
   187                                  PrintPMesg:      
   188                                  	; Prints the Credits Text.
   189                                  	sys	_msg, Credits, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000075 BB[7C510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000007A B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000007F BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000084 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000089 CD40                <1>  int 40h
   190                                  _1:
   191                                  	; 19/06/2017
   192                                  	; Allocate Audio Buffer (for user)
   193                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000008B BB00020000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000090 B900800000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000095 BA[00F00000]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000009A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000009F CD40                <1>  int 40h
   194 000000A1 0F820D010000            	jc	error_exit
   195                                  _2:
   196                                  	;; Initialize Audio Device (bl = 1 -> Interrupt method)
   197                                  	;sys	_audio, 0301h, 0, sb16_int_handler 
   198                                  	;jc	error_exit
   199                                  	
   200                                  	; 20/10/2017
   201                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   202                                  	sys	_audio, 0300h, 1, srb 
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000A7 BB00030000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000000AC B901000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000000B1 BA[C1520000]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000B6 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000000BB CD40                <1>  int 40h
   203 000000BD 0F82F1000000            	jc	error_exit
   204                                  
   205                                  LoadMod:  
   206 000000C3 BF[F0DF0000]            	mov	edi, mod_file_name
   207 000000C8 E84F020000              	call    LoadModule		; Load the MODule...
   208                                  	; 08/10/2017
   209 000000CD 731B                    	jnc	short _3		; any error loading?
   210                                  
   211                                  	; yes, print error and Exit.
   212                                  
   213                                  	sys	_msg, ErrorMesg, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000CF BB[B0510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000000D4 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000000D9 BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000DE B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000000E3 CD40                <1>  int 40h
   214 000000E5 E921010000              	jmp     Exit
   215                                  _3:
   216                                  	; 10/06/2017
   217                                  	sys	_audio, 0E00h ; get audio controller info
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000000EA BB000E0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000000EF B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000000F4 CD40                <1>  int 40h
   218 000000F6 0F82B8000000            	jc	error_exit
   219                                  
   220                                  	;cmp	ah, 2 ; AC'97 (Intel ICH) Audio Controller
   221                                  	;jne	_dev_not_ready	
   222                                  
   223                                  	; EAX = IRQ Number in AL
   224                                  	;	Audio Device Number in AH 
   225                                  	; EBX = DEV/VENDOR ID
   226                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   227                                  	; ECX = BUS/DEV/FN 
   228                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   229                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   230                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   231                                  	;      (Low word, DX = NAMBAR address)
   232                                  
   233 000000FC A2[C0520000]            	mov	[ac97_int_ln_reg], al
   234 00000101 891D[B0520000]          	mov	[dev_vendor], ebx
   235 00000107 890D[B4520000]          	mov	[bus_dev_fn], ecx
   236 0000010D 668915[BC520000]        	mov	[ac97_NamBar], dx
   237                                  	;mov	[ac97_NamBar], dx
   238                                  	;shr	dx, 16
   239                                  	;mov	[ac97_NabmBar], dx
   240 00000114 8915[BC520000]          	mov	[ac97_NamBar], edx	
   241                                    
   242 0000011A E8B70A0000              	call	write_audio_dev_info 
   243                                  
   244                                  PlayNow: 
   245 0000011F E8D1090000              	call    StartPlaying
   246                                  
   247                                          ; load 32768 bytes into audio buffer
   248 00000124 BF[00F00000]            	mov	edi, Audio_Buffer
   249                                  	; 19/10/2017
   250                                  	;mov	ebx, BUFFERSIZE
   251 00000129 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   252 0000012E E870080000              	call	GetSamples
   253 00000133 727F                    	jc	error_exit
   254                                  
   255                                  ;	;mov	ecx, 128	; Make a lookup table
   256                                  ;	mov	cl, 128
   257                                  ;	xor     ebx, ebx	; for fastest pixel
   258                                  ;	mov     edx, 320*(100-64)	; addressing.
   259                                  ;MakeOfs:        
   260                                  ;	mov     [RowOfs+ebx], dx
   261                                  ;	mov     [RowOfs+ebx+2], dx
   262                                  ;	add     dx, 320
   263                                  ;	add     ebx, 4
   264                                  ;	loop    MakeOfs
   265                                  
   266                                  	; 27/10/2017
   267 00000135 66B90001                	mov	cx, 256
   268 00000139 31DB                    	xor	ebx, ebx
   269 0000013B BF[F0D50000]            	mov	edi, RowOfs
   270                                  MakeOfs:
   271                                  	; 29/10/2017
   272                                  	;mov	ax, 128
   273                                  	;mul	bx
   274                                  	;mov	al, ah
   275                                  	;mov	ah, 80
   276                                  	;mul	ah
   277 00000140 89D8                    	mov	eax, ebx
   278 00000142 66C1E007                	shl	ax, 7 ; * 128
   279 00000146 B050                    	mov	al, 80
   280 00000148 F6E4                    	mul	ah
   281 0000014A 66AB                    	stosw
   282 0000014C 43                      	inc	ebx
   283 0000014D E2F1                    	loop	MakeOfs
   284                                  	
   285                                  	; 23/06/2017
   286                                  	; Map DMA buffer to user's memory space
   287                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000014F BB000D0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000154 B900000100          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000159 BA[00000200]        <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000015E B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000163 CD40                <1>  int 40h
   288                                  	;jc	error_exit
   289                                  
   290                                  	; 24/06/2017
   291                                  	; Set Master Volume Level (BL=0 or 80h)
   292                                  	; 	 	for next playing (BL>=80h)
   293                                  	sys	_audio, 0B80h, 1D1Dh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000165 BB800B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 0000016A B91D1D0000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000016F B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000174 CD40                <1>  int 40h
   294                                  
   295                                  	; 20/10/2017
   296 00000176 C605[41E00000]1D        	mov	byte [volume_level], 1Dh
   297                                  
   298                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   299                                  	
   300                                  	; Start	to play
   301 0000017D A0[F3510000]            	mov	al, [bps]
   302 00000182 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   303 00000185 D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   304 00000187 8A1D[F2510000]          	mov	bl, [stmo]
   305 0000018D FECB                    	dec	bl
   306 0000018F 08C3                    	or	bl, al
   307 00000191 668B0D[F4510000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   308 00000198 B704                    	mov	bh, 4 ; start to play	
   309                                  	sys	_audio
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000019A B820000000          <1>  mov eax, %1
   110                              <1> 
   111 0000019F CD40                <1>  int 40h
   310                                      
   311                                  	;; SETUP SIGNAL RESPONSE BYTE
   312                                  	;; 06/03/2017
   313                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   314                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   315                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   316                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   317                                  	;sys	_calbac
   318                                  	;jc	short error_exit
   319                                  
   320                                  	; DIRECT VGA MEMORY ACCESS
   321                                  	; bl = 0, bh = 5
   322                                  	; Direct access/map to VGA memory (0A0000h)
   323                                  
   324                                  	sys	_video, 0500h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001A1 BB00050000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001A6 B81F000000          <1>  mov eax, %1
   110                              <1> 
   111 000001AB CD40                <1>  int 40h
   325 000001AD 3D00000A00              	cmp	eax, 0A0000h
   326 000001B2 7418                    	je	short _a3
   327                                  error_exit:
   328                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001B4 BB[CD510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001B9 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001BE BA0E000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001C3 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001C8 CD40                <1>  int 40h
   329 000001CA EB3F                    	jmp	short Exit
   330                                  
   331                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   332                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   333                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   334                                  ;       second, or the module will sound "looped".
   335                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   336                                  ;       the polling is called from my routine, and then the irq 0 must be
   337                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   338                                  ;       samples played by the Sound Blaster. Note that some samples are
   339                                  ;       discarded in the next code, just for fun!
   340                                  
   341                                  _a3:
   342                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   343                                  	;int     31h
   344                                  
   345                                  	; 21/10/2017
   346                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   347                                  	;int	31h
   348                                  
   349                                  	; 22/10/2017
   350 000001CC E8D00B0000              	call	setgraphmode	; Set video mode to 640*480x16
   351                                  
   352                                  	; 22/10/2017
   353                                  	;call	loadlbm
   354                                  	;jc	short loadlbm_err
   355                                  
   356 000001D1 BE[CE0F0000]            	mov	esi, LOGO_ADDRESS
   357 000001D6 E8B80C0000              	call	putlbm
   358                                  	;jnc	short loadlbm_ok
   359 000001DB 731F                    	jnc	short _a4 ; 
   360                                  
   361                                  	;mov	byte [error_color], 0Eh ; Yellow
   362                                  
   363                                  loadlbm_err:
   364                                  	; 21/10/2017
   365                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   366                                  	;int	31h
   367                                  	; 22/10/2017
   368 000001DD E8DC0B0000              	call	settextmode
   369                                  
   370                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000001E2 BB[A10F0000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000001E7 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 000001EC 8B15[FB010000]      <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000001F2 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 000001F7 CD40                <1>  int 40h
   371 000001F9 EB10                    	jmp	short Exit
   372                                  
   373                                  	; 21/10/2017
   374                                  error_color:
   375 000001FB 0C                      	db	0Ch  ; Light Red
   376                                  	
   377                                  loadlbm_ok: 
   378                                  	; 21/10/2017
   379                                  _a4:
   380                                  	; 24/06/2017
   381 000001FC E863000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   382                                  
   383                                  _s_exit:
   384 00000201 E89F090000              	call	StopPlaying	; STOP!
   385                                  	
   386                                  	; 22/10/2017
   387                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   388                                  	;int	31h
   389 00000206 E8B30B0000              	call	settextmode
   390                                  Exit:           
   391                                  	;call	FreeModule	; Free MODule core.
   392                                  	
   393                                  	sys 	_exit	; Bye !
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101                              <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000020B B801000000          <1>  mov eax, %1
   110                              <1> 
   111 00000210 CD40                <1>  int 40h
   394                                  here:
   395 00000212 EBFE                    	jmp	short here
   396                                  
   397                                  pmsg_usage:
   398                                  	sys	_msg, msg_usage, 255, 0Fh
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000214 BB[09510000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000219 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 0000021E BA0F000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000223 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000228 CD40                <1>  int 40h
   399 0000022A EBDF                    	jmp	short Exit
   400                                  
   401                                  DetectICH:
   402                                  	; 24/06/2017
   403                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   404                                          sys	_audio, 0102h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000022C BB02010000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000231 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000236 CD40                <1>  int 40h
   405 00000238 C3                      	retn
   406                                  
   407                                  noDevMsg:
   408 00000239 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   408 00000242 61626C6520746F2066-
   408 0000024B 696E64204143393720-
   408 00000254 617564696F20646576-
   408 0000025D 696365210D0A00     
   409                                  
   410                                  ;ac97_int_handler:
   411                                  ;	; 19/06/2017
   412                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   413                                  ;
   414                                  ;	sys	_rele ; return from callback service 
   415                                  ;	; we must not come here !
   416                                  ;	sys	_exit
   417                                  
   418                                  ;=============================================================================
   419                                  ;      
   420                                  ;=============================================================================
   421                                  
   422                                  PlayMod:
   423                                  	; 27/10/2017
   424                                  	; 19/10/2017
   425                                  	; 23/06/2017   
   426                                  	; 21/06/2017
   427                                  	; 19/06/2017
   428                                  
   429                                  	; 05/03/2017 (TRDOS 386)
   430                                  	; 14/02/2017
   431                                  	; 13/02/2017
   432                                  	; 08/12/2016
   433                                  	; 28/11/2016
   434                                  
   435 00000264 EB10                         	jmp	short modp_gs ; 23/06/2017
   436                                  p_loop:
   437 00000266 803D[C1520000]00        	cmp	byte [srb], 0
   438 0000026D 761C                    	jna	short q_loop
   439 0000026F C605[C1520000]00        	mov	byte [srb], 0
   440                                  modp_gs:
   441 00000276 BF[00F00000]            	mov	edi, Audio_Buffer
   442                                  	; 19/10/2017
   443                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   444 0000027B BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   445 00000280 E81E070000              	call	GetSamples
   446 00000285 0F8229FFFFFF            	jc	error_exit
   447                                  q_loop:
   448 0000028B B401                    	mov     ah, 1		; any key pressed?
   449 0000028D CD32                    	int     32h		; no, Loop.
   450 0000028F 745C                    	jz	short r_loop
   451                                  
   452 00000291 B400                    	mov     ah, 0		; flush key buffer...
   453 00000293 CD32                    	int     32h
   454                                  
   455                                  	; 19/10/2017 (modplay6.s)
   456 00000295 3C20                    	cmp	al, 20h
   457 00000297 740E                    	je	short change_pan
   458                                  	; 09/10/2017 (playmod5.s)
   459 00000299 3C2B                    	cmp	al, '+' ; increase sound volume
   460 0000029B 741D                    	je	short inc_volume_level
   461 0000029D 3C2D                    	cmp	al, '-'
   462 0000029F 743C                    	je	short dec_volume_level
   463                                  
   464                                  	; 19/10/2017 (modplay6.s)
   465 000002A1 24DF                    	and	al, 0DFh
   466 000002A3 3C50                    	cmp	al, 'P'
   467 000002A5 7545                    	jne	short q_return
   468                                  
   469                                  change_pan:
   470                                  	; 19/10/2017 (modplay6.s)
   471 000002A7 8A0D[40E00000]          	mov	cl, [pan_shift]
   472 000002AD FEC1                    	inc	cl
   473 000002AF 80E103                  	and	cl, 3
   474 000002B2 880D[40E00000]          	mov	[pan_shift], cl
   475 000002B8 EB33                    	jmp	short r_loop
   476                                  
   477                                  	; 09/10/2017 (playmod5.s)
   478                                  	; 24/06/2017 (wavplay2.s)
   479                                  inc_volume_level:
   480 000002BA 8A0D[41E00000]          	mov	cl, [volume_level]
   481 000002C0 80F91F                  	cmp	cl, 1Fh ; 31
   482 000002C3 7328                    	jnb	short r_loop
   483 000002C5 FEC1                    	inc	cl
   484                                  change_volume_level:
   485 000002C7 880D[41E00000]          	mov	[volume_level], cl
   486 000002CD 88CD                    	mov	ch, cl
   487                                  	; Set Master Volume Level
   488                                  	sys	_audio, 0B00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000002CF BB000B0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000002D4 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000002D9 CD40                <1>  int 40h
   489 000002DB EB10                    	jmp	short r_loop
   490                                  dec_volume_level:
   491 000002DD 8A0D[41E00000]          	mov	cl, [volume_level]
   492 000002E3 80F901                  	cmp	cl, 1 ; 1
   493 000002E6 7605                    	jna	short r_loop
   494 000002E8 FEC9                    	dec	cl
   495 000002EA EBDB                    	jmp	short change_volume_level
   496                                  
   497                                  q_return:
   498 000002EC C3                      	retn
   499                                  r_loop:
   500                                  	; 27/10/2017
   501                                  	; Get Current DMA buffer Pointer 
   502                                  	; 23/06/2017 ('modplay6.s')
   503                                  	; bh = 15, get current pointer (DMA buffer offset)
   504                                  	; bl = 0, for PCM OUT
   505                                  	; ecx = 0
   506                                  	;
   507                                  	sys	_audio, 0F00h, 0
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000002ED BB000F0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 000002F2 B900000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000002F7 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 000002FC CD40                <1>  int 40h
   508                                  
   509                                  	; 28/10/2017
   510 000002FE 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   511                                  	; 23/06/2017
   512 00000300 BE[00000200]            	mov     esi, DMA_Buffer
   513 00000305 01C6                    	add     esi, eax	; add offset value
   514                                  	; 24/06/2017
   515 00000307 B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   516 0000030C 39CE                    	cmp	esi, ecx 
   517 0000030E 7602                    	jna	short _4
   518 00000310 89CE                    	mov	esi, ecx
   519                                  _4:
   520                                  	; 23/10/2017 ('tmodplay.s')
   521 00000312 E8AE0A0000              	call	drawscopes
   522                                  
   523 00000317 E94AFFFFFF              	jmp	p_loop
   524                                  
   525                                  ;=============================================================================
   526                                  ;               MODLOAD.ASM
   527                                  ;=============================================================================
   528                                  
   529                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   530                                  ;	July 10th, 1993.
   531                                  
   532                                  ; STRUCTURES
   533                                  
   534                                  struc ModSample
   535 00000000 <res 16h>               .msName:	resb 22
   536 00000016 ????                    .msLength:	resw 1
   537 00000018 ??                      .msFinetune:	resb 1
   538 00000019 ??                      .msVolume:	resb 1
   539 0000001A ????                    .msRepeat:	resw 1
   540 0000001C ????                    .msRepLen:	resw 1
   541                                  .size:		; 30 bytes
   542                                  endstruc
   543                                  
   544                                  struc ModHeader
   545 00000000 <res 14h>               .mhName:	resb 20
   546 00000014 <res 3A2h>              .mhSamples:	resb ModSample.size*31
   547 000003B6 ??                      .mhOrderLen:	resb 1
   548 000003B7 ??                      .mhReStart:	resb 1
   549 000003B8 <res 80h>               .mhOrder:	resb 128
   550 00000438 ????????                .mhSign:	resw 2
   551                                  .size:		; 1084 bytes
   552                                  endstruc
   553                                  
   554                                  struc ModInfoRec
   555 00000000 ??                      .OrderLen:	resb 1
   556 00000001 ??                      .ReStart:	resb 1
   557 00000002 <res 80h>               .Order:		resb 128
   558 00000082 ????????                .Patterns:	resd 1
   559 00000086 <res 3Eh>               .SampOfs:	resw 31
   560 000000C4 <res 3Eh>               .SampSeg:	resw 31
   561 00000102 <res 3Eh>               .SampLen:	resw 31
   562 00000140 <res 3Eh>               .SampRep:	resw 31
   563 0000017E <res 3Eh>               .SampRepLen:	resw 31
   564 000001BC <res 3Eh>               .SampVol:	resw 31
   565                                  .size:		; 506 bytes	
   566                                  endstruc
   567                                  
   568                                  ; CODE
   569                                  
   570                                  ; modplay5.s
   571                                  ; 07/10/2017
   572                                  ; tinyply3.s
   573                                  ; 06/10/2017
   574                                  ; 04/10/2017
   575                                  ; /* MOD FileFormat */
   576                                  
   577                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   578                                  ID_FLT4 equ 34544C46h ; "FLT4"
   579                                  ID_8CHN equ 4E484338h ; "8CHN"
   580                                  ID_FLT8 equ 34544C46h ; "FLT8"
   581                                  
   582                                  ; CODE
   583                                  
   584                                  LoadModule:
   585                                  	; edi = file name address
   586                                  
   587 0000031C 60                      	pushad
   588                                  
   589 0000031D E878010000              	call    ClearModInfo
   590                                  OpenFile:       
   591                                  	; ebx = ASCIIZ file name address
   592                                  	; ecx = open mode (0 = open for read)	
   593                                  	sys	_open, edi, 0 ; open for reading
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000322 89FB                <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000324 B900000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000329 B805000000          <1>  mov eax, %1
   110                              <1> 
   111 0000032E CD40                <1>  int 40h
   594 00000330 0F8262010000            	jc	Failed
   595 00000336 A3[C2520000]            	mov     [FileHandle], eax
   596                                  ReadHeader:
   597                                  	; ebx = File handle
   598                                  	; ecx = Buffer address
   599                                  	; edx = Byte count
   600                                  	sys	_read, [FileHandle], Header, ModHeader.size
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000033B 8B1D[C2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000341 B9[C6520000]        <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000346 BA3C040000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 0000034B B803000000          <1>  mov eax, %1
   110                              <1> 
   111 00000350 CD40                <1>  int 40h
   601 00000352 0F8231010000            	jc      CloseFile
   602                                  CheckMK:  
   603                                  	; 04/10/2017
   604 00000358 A1[FE560000]            	mov	eax, [Header+ModHeader.mhSign]
   605                                        
   606 0000035D 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   607                                  	;je	short Is4chnMod
   608 00000362 742B                    	je	short IsModFile
   609                                  CheckFLT4:
   610 00000364 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   611                                  	;je	short Is4chnMod
   612 00000369 7424                    	je	short IsModFile
   613                                  Check8CHN:
   614 0000036B 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   615 00000370 740D                    	je	short Is8chnMod
   616                                  CheckFLT8:
   617 00000372 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   618                                  	; 06/10/2017
   619 00000377 7406                    	je	short Is8chnMod
   620 00000379 F9                      	stc
   621 0000037A E90A010000              	jmp	CloseFile
   622                                  Is8chnMod:
   623 0000037F C605[EE510000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   624 00000386 C605[ED510000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   625 0000038D EB00                    	jmp	short IsModFile
   626                                  ;Is4chnMod:
   627                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   628                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   629                                  
   630                                  IsModFile:
   631 0000038F A0[7C560000]            	mov     al, [Header+ModHeader.mhOrderLen]
   632 00000394 A2[02570000]            	mov     [ModInfo.OrderLen], al
   633                                  
   634 00000399 A0[7D560000]            	mov     al, [Header+ModHeader.mhReStart]
   635 0000039E 3A05[7C560000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   636 000003A4 7202                    	jb      short SetReStart
   637 000003A6 B07F                    	mov     al, 7Fh
   638                                  SetReStart:
   639 000003A8 A2[03570000]            	mov     [ModInfo.ReStart], al
   640                                  
   641                                  	;mov	ecx, 128
   642 000003AD 66B98000                	mov	cx, 128
   643 000003B1 31D2                    	xor     edx, edx
   644 000003B3 31DB                    	xor     ebx, ebx
   645                                  CopyOrder:
   646 000003B5 8AB3[7E560000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   647 000003BB 88B3[04570000]          	mov     [ModInfo.Order+ebx], dh
   648 000003C1 38D6                    	cmp     dh, dl
   649 000003C3 7202                    	jb      short NextOrder
   650 000003C5 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   651                                  NextOrder:
   652 000003C7 43                      	inc     ebx
   653 000003C8 E2EB                    	loop    CopyOrder
   654                                  AllocPatterns:  
   655 000003CA 81E2FF000000            	and	edx, 0FFh
   656                                  	; 04/10/2017
   657                                  	;inx	dx  ; 12/03/2017
   658 000003D0 FEC2                    	inc	dl
   659                                  	; dl = number of patterns (04/07/2017)
   660 000003D2 8A0D[ED510000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   661 000003D8 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   662                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   663                                  	;
   664 000003DA 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   665                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   666 000003DC B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   667                                  	;
   668 000003E1 890D[84570000]          	mov	[ModInfo.Patterns], ecx
   669                                  	;
   670 000003E7 01CD                    	add	ebp, ecx ; next offset for samples
   671                                  ReadPatterns:  
   672                                  	;mov	ebx, [FileHandle] 
   673                                  	; ebx = File handle
   674                                  	; ecx = Buffer address
   675                                  	; edx = Byte count
   676                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 000003E9 8B1D[C2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 000003EF B803000000          <1>  mov eax, %1
   110                              <1> 
   111 000003F4 CD40                <1>  int 40h
   677 000003F6 0F828D000000            	jc      CloseFile
   678                                  
   679                                  	; patterns have been loaded here... (04/07/2017)
   680                                  
   681 000003FC BE[DA520000]            	mov	esi, Header+ModHeader.mhSamples
   682 00000401 31FF                    	xor     edi, edi
   683                                  CopySamples:
   684 00000403 668B4616                	mov     ax, [esi+ModSample.msLength]
   685 00000407 86C4                    	xchg    al, ah
   686 00000409 66D1E0                  	shl     ax, 1
   687 0000040C 668987[04580000]        	mov     [ModInfo.SampLen+edi], ax
   688 00000413 8A4619                  	mov     al, [esi+ModSample.msVolume]
   689 00000416 30E4                    	xor     ah, ah
   690 00000418 668987[BE580000]        	mov     [ModInfo.SampVol+edi], ax
   691 0000041F 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   692 00000423 86C4                    	xchg    al, ah
   693 00000425 66D1E0                  	shl     ax, 1
   694 00000428 668987[42580000]        	mov     [ModInfo.SampRep+edi], ax
   695 0000042F 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   696 00000433 86C4                    	xchg    al, ah
   697 00000435 66D1E0                  	shl     ax, 1
   698 00000438 668987[80580000]        	mov     [ModInfo.SampRepLen+edi], ax
   699 0000043F 83C61E                  	add     esi, ModSample.size
   700 00000442 6683C702                	add     di, 2
   701 00000446 6683FF3E                	cmp     di, 2*31
   702 0000044A 72B7                    	jb      short CopySamples
   703                                  
   704 0000044C 31F6                    	xor     esi, esi
   705                                  AllocSamples:
   706 0000044E 0FB796[04580000]        	movzx	edx, word [ModInfo.SampLen+esi]
   707                                  	; 07/10/2017
   708                                  	;shr	dx, 4 ; ***
   709 00000455 21D2                    	and	edx, edx
   710 00000457 7426                    	jz      short NextSample
   711                                  	;inc	dx  ; number of paragraphs ; ***
   712                                  	;shl	dx, 4 ; ***
   713 00000459 89E8                    	mov	eax, ebp
   714 0000045B 668986[88570000]        	mov	[ModInfo.SampOfs+esi], ax
   715 00000462 C1E810                  	shr	eax, 16
   716 00000465 668986[C6570000]        	mov	[ModInfo.SampSeg+esi], ax
   717 0000046C 89E9                    	mov	ecx, ebp
   718 0000046E 01D5                    	add	ebp, edx ; next offset for sample 
   719                                  ReadSample:
   720                                  	;mov	ebx, [FileHandle]
   721                                  	;movzx  edx, [ModInfo.SampLen+esi]
   722                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   723                                  
   724                                  	; ebx = File handle
   725                                  	; ecx = Buffer address
   726                                  	; edx = Byte count
   727                                  	sys	_read, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000470 8B1D[C2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000476 B803000000          <1>  mov eax, %1
   110                              <1> 
   111 0000047B CD40                <1>  int 40h
   728 0000047D 720A                    	jc      short CloseFile
   729                                  
   730                                  NextSample:
   731 0000047F 6683C602                	add     si, 2
   732 00000483 6683FE3E                	cmp     si, 2*31
   733 00000487 72C5                    	jb      short AllocSamples
   734                                  CloseFile:      
   735 00000489 9C                      	pushf
   736                                  	sys	_close, [FileHandle]
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 0000048A 8B1D[C2520000]      <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000490 B806000000          <1>  mov eax, %1
   110                              <1> 
   111 00000495 CD40                <1>  int 40h
   737 00000497 9D                      	popf
   738                                  Failed:       
   739 00000498 61                      	popad
   740 00000499 C3                      	retn
   741                                  
   742                                  FreeModule:
   743                                  	; Erdogan Tan (13/02/2017)
   744                                  	; nothing to do here for memory de-allocation
   745                                  ClearModInfo:
   746 0000049A 57                      	push	edi
   747 0000049B BF[02570000]            	mov	edi, ModInfo
   748 000004A0 B9FA010000              	mov     ecx, ModInfoRec.size
   749                                  	;cld
   750 000004A5 30C0                    	xor     al, al
   751 000004A7 F3AA                    	rep     stosb
   752 000004A9 5F                      	pop	edi
   753 000004AA C3                      	retn
   754                                  
   755                                  ;=============================================================================
   756                                  ;               MODPLAY.ASM
   757                                  ;=============================================================================
   758                                  
   759                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   760                                  ;	July 23th, 1993.
   761                                  
   762                                  ; EQUATES
   763                                  
   764                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   765                                  DefTempo        equ 6
   766                                  DefBpm          equ 125
   767                                  MidCRate        equ 8448
   768                                  MixBufSize	equ 4096
   769                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   770                                  
   771                                  ; STRUCTURES
   772                                  
   773                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   774 00000000 ????????                .Samples:	resd 1
   775                                  ;.Position:	resw 1
   776 00000004 ????????                .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   777 00000008 ????                    .Len:		resw 1
   778 0000000A ????                    .Repeat:	resw 1
   779 0000000C ????                    .RepLen:	resw 1
   780 0000000E ??                      .Volume: 	resb 1 ; Volume
   781 0000000F ??                      .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   782                                  ;.Error:	resb 1
   783                                  ;.Reserved:	resb 1 ; 01/10/2017
   784 00000010 ????                    .Period:	resw 1 ; Period
   785 00000012 ????                    .Pitch:		resw 1 
   786 00000014 ????                    .Effect:	resw 1 ; Effect
   787 00000016 ????                    .PortTo:	resw 1 ; Toneporta wanted period
   788 00000018 ??                      .PortParm:	resb 1 ; Toneporta speed
   789 00000019 ??                      .VibPos:	resb 1 ; Vibrato wave position 
   790 0000001A ??                      .VibParm:	resb 1 ; Vibrato depth/rate
   791 0000001B ??                      .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   792 0000001C ??                      .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   793                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   794 0000001D ??                      .Error:		resb 1 ; 01/10/2017
   795 0000001E ????????????            .Arp:		resw 3
   796 00000024 ????                    .ArpIndex:	resw 1
   797                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   798                                  endstruc
   799                                  
   800                                  ; CODE
   801                                  
   802                                  ;--------------------------------------------------------------------------
   803                                  ; updatechannel - update the track using the current effect
   804                                  ;--------------------------------------------------------------------------
   805                                  ; 
   806                                  ;--------------------------------------------------------------------------
   807                                  ; 	Track:  Process the next 	 in one track.
   808                                  ;  In:
   809                                  ;    ds:di -  Track info Address.
   810                                  ;--------------------------------------------------------------------------
   811                                  
   812                                  ; edi = Track info address
   813                                  
   814                                  updatechannel:
   815                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   816                                  
   817 000004AB 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   818                                  
   819                                  	;test   dx, dx
   820                                  	;je     short None
   821                                  	;cmp    dh, 00h
   822                                  	;je     short Arpeggio
   823                                  	;cmp    dh, 01h
   824                                  	;je     short PortUp
   825                                  	;cmp    dh, 02h
   826                                  	;je     short PortDown
   827                                  	;cmp    dh, 03h
   828                                  	;je     TonePort
   829                                  	;cmp    dh, 04h
   830                                  	;je     Vibrato
   831                                  	;cmp    dh, 05h
   832                                  	;je     PortSlide
   833                                  	;cmp    dh, 06h
   834                                  	;je     VibSlide
   835                                  	;cmp    dh, 0Ah
   836                                  	;je     VolSlide
   837                                  	;retn
   838                                  
   839 000004AF 0FB6C6                  	movzx	eax, dh
   840 000004B2 240F                    	and	al, 0Fh
   841 000004B4 FF2485[00500000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   842                                  efxnull:
   843                                  None:           
   844 000004BB C3                      	retn
   845                                  efxarpeggio2:
   846                                  	; 01/10/2017
   847 000004BC 84D2                    	test    dl, dl
   848 000004BE 74FB                    	jz      short efxnull
   849                                  Arpeggio:
   850 000004C0 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   851 000004C4 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   852 000004C9 66894712                	mov     [edi+TrackInfo.Pitch], ax
   853 000004CD 6683C302                	add     bx, 2
   854 000004D1 6683FB06                	cmp     bx, 6
   855 000004D5 7202                    	jb      short SetArpIndex
   856 000004D7 31DB                    	xor     ebx, ebx
   857                                  SetArpIndex:
   858 000004D9 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   859 000004DD C3                      	retn
   860                                  efxportaup:
   861                                  PortUp:
   862 000004DE 30F6                    	xor     dh, dh
   863                                  	;mov	bx, [edi+TrackInfo.Period]
   864 000004E0 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   865 000004E4 6629D3                  	sub     bx, dx
   866                                  	;cmp	bx, 113
   867 000004E7 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   868 000004EB 7D04                    	jge     short NotSmall
   869                                  	;mov	bx, 113
   870 000004ED 66BB1C00                	mov	bx, 28 ; 01/10/2017
   871                                  NotSmall:
   872 000004F1 66895F10                	mov     [edi+TrackInfo.Period], bx
   873 000004F5 6601DB                  	add     bx, bx
   874                                  	;mov	ax, [PitchTable+bx]
   875 000004F8 668B83[FC580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   876 000004FF 66894712                	mov     [edi+TrackInfo.Pitch], ax
   877 00000503 C3                      	retn
   878                                  efxportadown:
   879                                  PortDown:
   880 00000504 30F6                    	xor     dh, dh
   881                                  	;mov	bx, [edi+TrackInfo.Period]
   882 00000506 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   883 0000050A 6601D3                  	add     bx, dx
   884 0000050D 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   885                                  	;cmp	bx, 856
   886 00000512 7E04                    	jle     short NotBig
   887                                  	;mov	bx, 856
   888 00000514 66BB600D                	mov	bx, 3424 ; 01/10/2017
   889                                  NotBig:         
   890 00000518 66895F10                	mov     [edi+TrackInfo.Period], bx
   891 0000051C 6601DB                  	add     bx, bx
   892                                  	;mov	ax, [PitchTable+bx]
   893 0000051F 668B83[FC580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   894 00000526 66894712                	mov     [edi+TrackInfo.Pitch], ax
   895 0000052A C3                      	retn
   896                                  efxtoneporta2:
   897                                  TonePort:
   898 0000052B 30F6                    	xor     dh, dh
   899 0000052D 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   900                                  	;mov	bx, [edi+TrackInfo.Period]
   901 00000531 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   902 00000535 6639C3                  	cmp     bx, ax
   903 00000538 7429                    	je      short NoPort
   904 0000053A 7F0D                    	jg      short PortToUp
   905                                  PortToDown:     
   906 0000053C 6601D3                  	add     bx, dx
   907 0000053F 6639C3                  	cmp     bx, ax
   908 00000542 7E0D                    	jle     short SetPort
   909                                  FixPort:        
   910 00000544 6689C3                  	mov     bx, ax
   911 00000547 EB08                    	jmp     short SetPort
   912                                  PortToUp:
   913 00000549 6629D3                  	sub     bx, dx
   914 0000054C 6639C3                  	cmp     bx, ax
   915 0000054F 7CF3                    	jl      short FixPort
   916                                  SetPort:        
   917 00000551 66895F10                	mov     [edi+TrackInfo.Period], bx
   918 00000555 6601DB                  	add     bx, bx
   919                                  	;mov	ax, [PitchTable+bx]
   920 00000558 668B83[FC580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   921 0000055F 66894712                	mov     [edi+TrackInfo.Pitch], ax
   922                                  NoPort:         
   923 00000563 C3                      	retn
   924                                  efxvibrato2:
   925                                  	; 01/10/2017
   926                                  Vibrato:
   927 00000564 88D6                    	mov     dh, dl
   928                                  	;and	dl, 0Fh
   929                                  	;shr	dh, 4
   930                                  	;shl	dh, 2
   931 00000566 6681E20FF0              	and     dx, 0F00Fh
   932 0000056B C0EE02                  	shr     dh, 2
   933                                  	;add	[edi+TrackInfo.VibPos], dh
   934                                  	;mov	dh, [edi+TrackInfo.VibPos]
   935                                  	;mov	bl, dh
   936 0000056E 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   937 00000571 007719                  	add	[edi+TrackInfo.VibPos], dh
   938 00000574 88DE                    	mov	dh, bl ; 01/10/2017
   939 00000576 C0EB02                  	shr     bl, 2
   940                                  	;and	bx, 1Fh
   941                                  	;mov	al, [SinTable+bx]
   942 00000579 83E31F                  	and	ebx, 1Fh
   943 0000057C 8A83[E8500000]          	mov	al, [SinTable+ebx]
   944 00000582 F6E2                    	mul     dl
   945                                  	;rol	ax, 1
   946                                  	;xchg	al, ah
   947                                  	;and	ah, 1
   948 00000584 66C1E807                	shr	ax, 7
   949 00000588 84F6                    	test    dh, dh
   950 0000058A 7903                    	jns     short VibUp
   951 0000058C 66F7D8                  	neg     ax
   952                                  VibUp:          
   953 0000058F 66034710                	add     ax, [edi+TrackInfo.Period]
   954 00000593 6689C3                  	mov	bx, ax
   955                                  	;movzx	ebx, ax
   956 00000596 6683FB71                	cmp     bx, 113
   957                                  	;cmp	bx, 113
   958 0000059A 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   959 0000059E 7D06                    	jge     short NoLoVib
   960                                  	;mov	bx, 113
   961 000005A0 66BB1C00                	mov	bx, 28	; 01/10/2017
   962 000005A4 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   963                                  NoLoVib:        
   964 000005A6 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   965                                  	;cmp	bx, 856
   966 000005AB 7E04                    	jle     short NoHiVib
   967                                  	;mov	bx, 856
   968 000005AD 66BB600D                	mov	bx, 3424 ; 01/10/2017
   969                                  NoHiVib:        
   970 000005B1 6601DB                  	add     bx, bx
   971                                  	;mov	ax, [PitchTable+bx]
   972 000005B4 668B83[FC580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   973 000005BB 66894712                	mov     [edi+TrackInfo.Pitch], ax
   974 000005BF C3                      	retn
   975                                  efxtoneslide:
   976                                  PortSlide:
   977 000005C0 E812000000              	call    VolSlide
   978 000005C5 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   979 000005C8 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   980                                  efxvibslide:
   981                                  VibSlide:
   982 000005CD E805000000              	call    VolSlide
   983 000005D2 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   984 000005D5 EB8D                    	jmp     short Vibrato  ; efxvibrato2
   985                                  efxvolslide:
   986                                  VolSlide:
   987 000005D7 88D6                    	mov     dh, dl
   988 000005D9 80E20F                  	and     dl, 0Fh
   989 000005DC C0EE04                  	shr     dh, 4
   990 000005DF 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   991 000005E2 28D0                    	sub     al, dl
   992 000005E4 7D02                    	jge     short NoLoVol
   993 000005E6 30C0                    	xor     al, al
   994                                  NoLoVol:        
   995 000005E8 00F0                    	add     al, dh
   996 000005EA 3C40                    	cmp     al, 64
   997 000005EC 7602                    	jbe     short NoHiVol
   998 000005EE B040                    	mov     al, 64
   999                                  NoHiVol:        
  1000 000005F0 88470E                  	mov     [edi+TrackInfo.Volume], al
  1001 000005F3 C3                      	retn
  1002                                  
  1003                                  efxtremolo2:
  1004                                  	; 01/10/2017 (TMODPLAY.ASM)
  1005                                  Tremolo:
  1006 000005F4 88D6                    	mov     dh, dl
  1007 000005F6 6681E20FF0              	and     dx, 0F00Fh
  1008 000005FB C0EE02                  	shr     dh, 2
  1009 000005FE 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1010 00000601 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1011 00000604 88DE                    	mov	dh, bl
  1012 00000606 C0EB02                  	shr     bl, 2
  1013                                  	; 01/10/2017 - TRDOS 386
  1014                                  	;and	bx, 1Fh
  1015 00000609 83E31F                  	and	ebx, 1Fh 
  1016                                  	;mov	al, [SinTable+bx]
  1017 0000060C 8A83[E8500000]          	mov     al, [SinTable+ebx]
  1018 00000612 F6E2                    	mul     dl
  1019 00000614 66C1E806                	shr	ax, 6
  1020 00000618 84F6                    	test    dh, dh
  1021 0000061A 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1022 0000061C 66F7D8                  	neg     ax
  1023                                  efxtremolof2:
  1024                                  Tremolo_1:      
  1025 0000061F 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1026 00000622 00E0                    	add     al, ah
  1027 00000624 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1028 00000626 30C0                    	xor     al, al
  1029                                  efxtremolof3:
  1030                                  Tremolo_2:       
  1031 00000628 3C40                    	cmp     al, 64 ; 40h
  1032 0000062A 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1033 0000062C B040                    	mov     al, 64 ; 40h
  1034                                  efxtremolof4:
  1035                                  Tremolo_3:       
  1036 0000062E 28E0                    	sub	al, ah  ; ****** 
  1037 00000630 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1038 00000633 C3                      	retn	
  1039                                  
  1040                                  ;--------------------------------------------------------------------------
  1041                                  ; readchannel - read the next note event from the pattern sheet
  1042                                  ;--------------------------------------------------------------------------
  1043                                  ;
  1044                                  ;--------------------------------------------------------------------------
  1045                                  ; GetTrack:   Get the next Note from a pattern.
  1046                                  ;  In:
  1047                                  ;    ds:di -  Track info Address.
  1048                                  ;    es:si -  Pattern Note Address.
  1049                                  ; Out:
  1050                                  ;    es:si -  The Next Pattern Note address.
  1051                                  ;--------------------------------------------------------------------------
  1052                                  
  1053                                  ; esi = Pattern note address
  1054                                  ; edi = Track info address
  1055                                  
  1056                                  readchannel:
  1057                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1058 00000634 66AD                    	lodsw
  1059 00000636 86C4                    	xchg    al, ah
  1060 00000638 88E3                    	mov	bl, ah
  1061 0000063A 80E40F                  	and     ah, 0Fh
  1062 0000063D 6689C1                  	mov     cx, ax
  1063 00000640 66AD                    	lodsw
  1064 00000642 86C4                    	xchg    al, ah
  1065 00000644 88E7                    	mov     bh, ah
  1066 00000646 80E40F                  	and     ah, 0Fh
  1067 00000649 6689C2                  	mov     dx, ax
  1068 0000064C 66895714                	mov     [edi+TrackInfo.Effect], dx
  1069                                  	; 01/10/2017 - TRDOS 386
  1070                                  	;and	bl, 0F0h
  1071 00000650 81E3F0FF0000            	and	ebx, 0FFF0h
  1072 00000656 C0EF04                  	shr     bh, 4
  1073 00000659 08FB                    	or      bl, bh
  1074 0000065B 7446                    	jz      short SetPeriod
  1075                                  SetSample:
  1076 0000065D 30FF                    	xor	bh, bh
  1077                                  	;and	ebx, 0FFh
  1078 0000065F FECB                    	dec     bl
  1079 00000661 01DB                    	add     ebx, ebx
  1080 00000663 668B83[BE580000]        	mov     ax, [ModInfo.SampVol+ebx]
  1081 0000066A 88470E                  	mov     [edi+TrackInfo.Volume], al
  1082 0000066D 668B83[88570000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1083 00000674 668907                  	mov     [edi+TrackInfo.Samples], ax
  1084 00000677 668B83[C6570000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1085 0000067E 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1086 00000682 668B83[04580000]        	mov     ax, [ModInfo.SampLen+ebx]
  1087 00000689 66894708                	mov     [edi+TrackInfo.Len], ax
  1088 0000068D 668B83[42580000]        	mov     ax, [ModInfo.SampRep+ebx]
  1089 00000694 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1090 00000698 668B83[80580000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1091 0000069F 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1092                                  SetPeriod:      
  1093 000006A3 6685C9                  	test    cx, cx
  1094 000006A6 7425                    	jz      short SetEffect
  1095                                  
  1096 000006A8 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1097                                  	
  1098 000006AC 80FE03                  	cmp     dh, 03h
  1099                                  	;je	short SetEffect
  1100 000006AF 7428                    	je	short efxtoneporta ; 01/10/2017
  1101                                  
  1102 000006B1 66894F10                	mov     [edi+TrackInfo.Period], cx
  1103                                  	;movzx	ebx, cx
  1104 000006B5 6689CB                  	mov     bx, cx
  1105 000006B8 6601DB                  	add     bx, bx
  1106                                  	;mov	ax, [PitchTable+bx]
  1107 000006BB 668B83[FC580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1108 000006C2 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1109 000006C6 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1110                                  SetEffect:
  1111                                  	;test	dx, dx
  1112                                  	;je	short InitNone
  1113                                  	;cmp	dh, 00h
  1114                                  	;je	InitArpeggio
  1115                                  	;cmp	dh, 03h
  1116                                  	;je	short InitTonePort
  1117                                  	;cmp	dh, 04h
  1118                                  	;je	short InitVibrato
  1119                                  	;cmp	dh, 09h
  1120                                  	;je	short SampleOfs
  1121                                  	;cmp	dh, 0Bh
  1122                                  	;je	short PosJump
  1123                                  	;cmp	dh, 0Ch
  1124                                  	;je	short SetVolume
  1125                                  	;cmp	dh, 0Dh
  1126                                  	;je	short Break
  1127                                  	;cmp	dh, 0Fh
  1128                                  	;je	SetSpeed
  1129                                  	;retn
  1130                                  
  1131                                  	; 01/10/2017 (TMODPLAY.ASM)
  1132                                  	
  1133                                  	; dx = [di+TrackInfo.Effect]
  1134                                  	
  1135 000006CD 0FB6C6                  	movzx	eax, dh
  1136 000006D0 240F                    	and	al, 0Fh
  1137 000006D2 FF2485[C04F0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1138                                  ;efxnull:
  1139                                  ;InitNone:
  1140                                  ;	retn
  1141                                  efxtoneporta:
  1142                                  	; 01/10/2017
  1143                                  	; cx = period
  1144                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1145                                  InitTonePort:
  1146 000006D9 84D2                    	test    dl, dl
  1147 000006DB 7503                    	jnz     short SetPortParm
  1148 000006DD 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1149                                  SetPortParm:    
  1150 000006E0 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1151 000006E3 66895714                	mov     [edi+TrackInfo.Effect], dx
  1152 000006E7 C3                      	retn
  1153                                  efxvibrato:
  1154                                  InitVibrato:
  1155 000006E8 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1156 000006EB 88C4                    	mov     ah, al
  1157                                  	;and	al, 0Fh
  1158                                  	;and	ah, 0F0h
  1159 000006ED 66250FF0                	and	ax, 0F00Fh
  1160 000006F1 F6C20F                  	test    dl, 0Fh
  1161 000006F4 7502                    	jne     short OkDepth
  1162 000006F6 08C2                    	or      dl, al
  1163                                  OkDepth:        
  1164 000006F8 F6C2F0                  	test    dl, 0F0h
  1165 000006FB 7502                    	jnz     short OkRate
  1166 000006FD 08E2                    	or      dl, ah
  1167                                  OkRate:         
  1168 000006FF 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1169 00000702 66895714                	mov     [edi+TrackInfo.Effect], dx
  1170 00000706 6685C9                  	test    cx, cx
  1171 00000709 7404                    	jz      short OkPos
  1172 0000070B C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1173                                  OkPos:          
  1174 0000070F C3                      	retn
  1175                                  efxsampoffset:
  1176                                  	; 01/10/2017 ; *******
  1177                                  SampleOfs:         
  1178                                  ;	test    dl, dl
  1179                                  ;	jnz     short SetSampleOfs
  1180                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1181                                  ;SetSampleOfs:
  1182                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1183 00000710 88D6                    	mov     dh, dl
  1184 00000712 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1185 00000718 895704                  	mov     [edi+TrackInfo.Position], edx
  1186 0000071B C3                      	retn
  1187                                  efxpattjump:
  1188                                  PosJump:
  1189 0000071C 8815[AAD40000]          	mov     [OrderPos], dl
  1190 00000722 C605[AED40000]40        	mov     byte [Row], 64
  1191 00000729 C3                      	retn
  1192                                  efxsetvolume:
  1193                                  SetVolume:
  1194 0000072A 80FA40                  	cmp     dl, 64
  1195 0000072D 7602                    	jbe     short OkVol
  1196 0000072F B240                    	mov     dl, 64
  1197                                  OkVol:
  1198                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1199 00000731 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1200                                  	;mov	[edi+TrackInfo.Volume], dl
  1201 00000733 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1202 00000737 C3                      	retn
  1203                                  efxbreak:
  1204                                  Break:
  1205 00000738 88D6                    	mov     dh, dl
  1206 0000073A 80E20F                  	and     dl, 0Fh
  1207 0000073D C0EE04                  	shr     dh, 4
  1208 00000740 00F6                    	add     dh, dh
  1209 00000742 00F2                    	add     dl, dh
  1210 00000744 C0E602                  	shl     dh, 2
  1211 00000747 00F2                    	add     dl, dh
  1212 00000749 8815[AFD40000]          	mov     [BreakRow], dl
  1213 0000074F C605[AED40000]40        	mov     byte [Row], 64
  1214 00000756 C3                      	retn
  1215                                  efxsetspeed:
  1216                                  SetSpeed:
  1217 00000757 84D2                    	test    dl,dl
  1218 00000759 7432                    	je      Skip
  1219 0000075B 80FA1F                  	cmp     dl,31
  1220 0000075E 770D                    	ja      short SetBpm
  1221                                  SetTempo:       
  1222 00000760 8815[ABD40000]          	mov     [Tempo], dl
  1223 00000766 8815[ACD40000]          	mov     [TempoWait], dl
  1224 0000076C C3                      	retn
  1225                                  SetBpm:
  1226 0000076D 8815[ADD40000]          	mov     [Bpm], dl
  1227 00000773 B067                    	mov     al, 103
  1228 00000775 F6E2                    	mul     dl
  1229 00000777 88E3                    	mov     bl, ah
  1230 00000779 30FF                    	xor     bh, bh
  1231 0000077B 66A1[F4510000]          	mov     ax, [MixSpeed]
  1232 00000781 6631D2                  	xor     dx, dx
  1233 00000784 66F7F3                  	div     bx
  1234 00000787 66A3[B0D40000]          	mov     [BpmSamples], ax
  1235                                  Skip:           
  1236 0000078D C3                      	retn
  1237                                  efxarpeggio:
  1238                                  	; 01/10/2017
  1239 0000078E 84D2                    	test    dl, dl
  1240                                  	;je	efxnull
  1241 00000790 74FB                    	je	short Skip
  1242                                  InitArpeggio:
  1243 00000792 88D6                    	mov     dh, dl
  1244 00000794 80E20F                  	and     dl, 0Fh
  1245 00000797 C0EE04                  	shr     dh, 4
  1246                                  	; 01/10/2017
  1247                                  	;mov	cx, 36
  1248 0000079A 66B95400                	mov	cx, 84 ; 84 notes/periods
  1249 0000079E 31DB                    	xor     ebx, ebx
  1250 000007A0 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1251                                  gt_ScanPeriod:
  1252                                  	;cmp	ax, [PeriodTable+bx]
  1253 000007A4 663B83[40500000]        	cmp	ax, [PeriodTable+ebx]
  1254 000007AB 7306                    	jae     short SetArp
  1255 000007AD 6683C302                	add     bx, 2
  1256 000007B1 E2F1                    	loop    gt_ScanPeriod
  1257                                  SetArp:         
  1258 000007B3 6601D2                  	add     dx, dx
  1259 000007B6 00DE                    	add     dh, bl
  1260 000007B8 00DA                    	add     dl, bl
  1261                                  	; 01/10/2017
  1262                                  	;mov	bx, [PeriodTable+bx]
  1263 000007BA 668B9B[40500000]        	mov	bx, [PeriodTable+ebx]
  1264                                  	;add	bx, bx
  1265 000007C1 01DB                    	add	ebx, ebx
  1266                                  	;mov	ax, [PitchTable+bx]
  1267 000007C3 668B83[FC580000]        	mov	ax, [PitchTable+ebx]
  1268 000007CA 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1269 000007CE 88F3                    	mov     bl, dh
  1270 000007D0 30FF                    	xor     bh, bh
  1271 000007D2 668B9B[40500000]        	mov	bx, [PeriodTable+ebx]
  1272                                  	;add	bx, bx
  1273 000007D9 01DB                    	add	ebx, ebx
  1274                                  	;mov	ax, [PitchTable+bx]
  1275 000007DB 668B83[FC580000]        	mov	ax, [PitchTable+ebx]
  1276 000007E2 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1277 000007E6 88D3                    	mov     bl, dl
  1278 000007E8 30FF                    	xor     bh, bh
  1279 000007EA 668B9B[40500000]        	mov	bx, [PeriodTable+ebx]
  1280                                  	;add	bx, bx
  1281 000007F1 01DB                    	add	ebx, ebx
  1282                                  	;mov	ax, [PitchTable+bx]
  1283 000007F3 668B83[FC580000]        	mov	ax, [PitchTable+ebx]
  1284 000007FA 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1285 000007FE 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1286 00000804 C3                      	retn
  1287                                  
  1288                                  efxtremolo:
  1289                                  	; 01/10/2017 (TMODPLAY.ASM)
  1290                                  InitTremolo:
  1291 00000805 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1292 00000808 88C4                    	mov     ah, al
  1293 0000080A 66250FF0                	and     ax, 0F00Fh
  1294 0000080E F6C20F                  	test    dl, 0Fh
  1295 00000811 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1296 00000813 08C2                    	or      dl, al
  1297                                  efxtremolof0:
  1298                                  InitTremolo_1: 
  1299 00000815 F6C2F0                  	test    dl, 0F0h
  1300 00000818 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1301 0000081A 08E2                    	or      dl, ah
  1302                                  efxtremolof1:
  1303                                  InitTremolo_2:
  1304 0000081C 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1305 0000081F 66895714                	mov     [edi+TrackInfo.Effect], dx
  1306 00000823 C3                      	retn
  1307                                  
  1308                                  ;--------------------------------------------------------------------------
  1309                                  ; pollmodule - polls the module player
  1310                                  ;--------------------------------------------------------------------------
  1311                                  ;--------------------------------------------------------------------------
  1312                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1313                                  ;--------------------------------------------------------------------------
  1314                                  
  1315                                  pollmodule:
  1316                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1317 00000824 FE0D[ACD40000]          	dec     byte [TempoWait]
  1318 0000082A 7417                    	jz      short GetTracks
  1319                                  
  1320                                  	;mov	ecx, NumTracks
  1321 0000082C 0FB70D[EE510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1322 00000833 BF[C0D40000]            	mov	edi, Tracks
  1323                                  BeatTracks:
  1324 00000838 E86EFCFFFF              	call	BeatTrack	
  1325 0000083D 83C726                  	add	edi, TrackInfo.size
  1326 00000840 E2F6                    	loop	BeatTracks
  1327 00000842 C3                      	retn
  1328                                  GetTracks:
  1329 00000843 A0[ABD40000]            	mov     al, [Tempo]
  1330 00000848 A2[ACD40000]            	mov     [TempoWait], al
  1331                                  
  1332 0000084D 8B35[BCD40000]          	mov	esi, [Note]
  1333 00000853 803D[AED40000]40        	cmp     byte [Row], 64
  1334 0000085A 7268                    	jb      short NoPattWrap
  1335                                  
  1336 0000085C 8B35[84570000]          	mov	esi, [ModInfo.Patterns]
  1337 00000862 8A1D[AAD40000]          	mov     bl, [OrderPos]
  1338 00000868 3A1D[02570000]          	cmp     bl, [ModInfo.OrderLen]
  1339 0000086E 7214                    	jb      short NoOrderWrap
  1340 00000870 8A1D[03570000]          	mov     bl, [ModInfo.ReStart]
  1341 00000876 881D[AAD40000]          	mov     [OrderPos], bl
  1342 0000087C 3A1D[02570000]          	cmp     bl, [ModInfo.OrderLen]
  1343 00000882 7364                    	jae     short NoUpdate
  1344                                  NoOrderWrap:    
  1345                                  	;xor	bh, bh
  1346 00000884 81E3FF000000            	and	ebx, 0FFh
  1347 0000088A 8A9B[04570000]          	mov     bl, [ModInfo.Order+ebx]
  1348                                  	; 05/10/2017
  1349                                  	;shl	ebx, 10 ; *1024
  1350 00000890 8A0D[ED510000]          	mov	cl, [pattern_shift] ; 10 or 11
  1351 00000896 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1352                                  	;
  1353 00000898 01DE                    	add     esi, ebx
  1354 0000089A 8A1D[AFD40000]          	mov     bl, [BreakRow]
  1355 000008A0 881D[AED40000]          	mov     [Row], bl
  1356                                  	;xor	bh, bh
  1357 000008A6 81E3FF000000            	and	ebx, 0FFh
  1358 000008AC 883D[AFD40000]          	mov     [BreakRow], bh ; 0
  1359 000008B2 66C1E304                	shl     bx, 4
  1360 000008B6 01DE                    	add     esi, ebx
  1361 000008B8 8935[BCD40000]          	mov     [Note], esi
  1362 000008BE FE05[AAD40000]          	inc     byte [OrderPos]
  1363                                  NoPattWrap:     
  1364 000008C4 FE05[AED40000]          	inc     byte [Row]
  1365                                  
  1366                                  	;cld
  1367                                  	;mov	ecx, NumTracks
  1368 000008CA 0FB70D[EE510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1369 000008D1 BF[C0D40000]            	mov	edi, Tracks
  1370                                  GetTracks_next:
  1371 000008D6 51                      	push	ecx	
  1372 000008D7 E858FDFFFF              	call	GetTrack ; readchannel
  1373 000008DC 59                      	pop	ecx
  1374 000008DD 83C726                  	add	edi, TrackInfo.size
  1375 000008E0 E2F4                    	loop	GetTracks_next
  1376                                  
  1377 000008E2 8935[BCD40000]          	mov     [Note], esi
  1378                                  NoUpdate:
  1379 000008E8 C3                      	retn
  1380                                  
  1381                                  ;--------------------------------------------------------------------------
  1382                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1383                                  ;  In:
  1384                                  ;   ds:si -  Track Info Address.
  1385                                  ;   ds:di -  Buffer Address.
  1386                                  ;    cx   -  Buffer Size.
  1387                                  ;--------------------------------------------------------------------------
  1388                                  
  1389                                  ; esi = Track info address
  1390                                  ; edi = Buffer address
  1391                                  ; ecx = Buffer size
  1392                                  
  1393                                  MixTrack:
  1394 000008E9 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1395 000008EE 7757                    	ja      short MixLooped
  1396                                  MixNonLooped:   
  1397 000008F0 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1398 000008F2 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1399 000008F5 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1400 000008F9 52                      	push    edx
  1401 000008FA 56                      	push    esi
  1402 000008FB 01D3                    	add     ebx, edx
  1403 000008FD 01D5                    	add     ebp, edx
  1404 000008FF 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1405                                  	; 01/10/2017
  1406                                  	;mov	al, [esi+TrackInfo.Volume]
  1407 00000903 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1408                                  	; ah = [esi+TrackInfo.VolDiff]
  1409 00000907 00E0                    	add	al, ah ; ****** 
  1410 00000909 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1411 0000090D 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1412 00000910 89DE                    	mov     esi, ebx
  1413 00000912 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1414 00000914 88C7                    	mov     bh, al
  1415 00000916 88D0                    	mov     al, dl
  1416 00000918 88F2                    	mov     dl, dh
  1417                                  	;xor	dh, dh
  1418 0000091A 81E2FF000000            	and	edx, 0FFh
  1419                                  nlMixSamp:      
  1420 00000920 39EE                    	cmp     esi, ebp
  1421 00000922 7316                    	jae     short nlMixBye
  1422 00000924 8A1E                    	mov     bl, [esi]
  1423                                  	;mov	bl, [VolTable+bx]
  1424 00000926 8A9B[BE730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1425                                  	; 17/10/2017
  1426 0000092C 001F                    	add     [edi], bl
  1427                                  	; 18/10/2017
  1428 0000092E 00C4                    	add     ah, al
  1429 00000930 11D6                    	adc     esi, edx
  1430 00000932 033D[EE510000]          	add	edi, [numtracks]
  1431 00000938 E2E6                    	loop    nlMixSamp
  1432                                  nlMixBye:       
  1433 0000093A 89F3                    	mov     ebx, esi
  1434 0000093C 5E                      	pop     esi
  1435 0000093D 5A                      	pop     edx
  1436 0000093E 29D3                    	sub     ebx, edx
  1437 00000940 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1438 00000943 88661D                  	mov     [esi+TrackInfo.Error], ah
  1439 00000946 C3                      	retn
  1440                                  MixLooped:
  1441 00000947 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1442 00000949 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1443 0000094C 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1444 00000950 892D[B8D40000]          	mov     [BufRep], ebp
  1445                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1446 00000956 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1447 0000095A 52                      	push    edx
  1448 0000095B 56                      	push    esi
  1449 0000095C 01D3                    	add     ebx, edx
  1450 0000095E 01D5                    	add     ebp, edx
  1451 00000960 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1452                                  	; 01/10/2017
  1453                                  	;mov	al, [esi+TrackInfo.Volume]
  1454 00000964 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1455                                  	; ah = [esi+TrackInfo.VolDiff]
  1456 00000968 00E0                    	add	al, ah ; ****** 
  1457 0000096A C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1458 0000096E 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1459                                  	;mov	si, bx
  1460 00000971 89DE                    	mov	esi, ebx ; 04/09/2017
  1461 00000973 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1462 00000975 88C7                    	mov     bh, al
  1463 00000977 88D0                    	mov     al, dl
  1464 00000979 88F2                    	mov     dl, dh
  1465                                  	;xor	dh, dh
  1466 0000097B 81E2FF000000            	and	edx, 0FFh
  1467                                  lpMixSamp:      
  1468 00000981 39EE                    	cmp     esi, ebp
  1469 00000983 7206                    	jb      short lpMixNow
  1470 00000985 2B35[B8D40000]          	sub     esi, [BufRep]
  1471                                  lpMixNow:       
  1472 0000098B 8A1E                    	mov     bl, [esi]
  1473                                  	;mov	bl, [VolTable+bx]
  1474 0000098D 8A9B[BE730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1475                                  	; 17/10/2017
  1476 00000993 001F                    	add     [edi], bl
  1477                                  	; 18/10/2017
  1478 00000995 00C4                    	add     ah, al
  1479 00000997 11D6                    	adc     esi, edx
  1480 00000999 033D[EE510000]          	add	edi, [numtracks]
  1481 0000099F E2E0                    	loop    lpMixSamp
  1482                                  lpMixBye:       
  1483                                  ;	mov     ebx, esi
  1484                                  ;	pop     esi
  1485                                  ;	pop     edx
  1486                                  ;	sub     ebx, edx
  1487                                  ;	mov     [esi+TrackInfo.Position], ebx
  1488                                  ;	mov     [esi+TrackInfo.Error], ah
  1489                                  ;	retn
  1490 000009A1 EB97                    	jmp	short nlMixBye
  1491                                  
  1492                                  ;--------------------------------------------------------------------------
  1493                                  ; mixpoll - updates the output buffer
  1494                                  ;--------------------------------------------------------------------------
  1495                                  ;
  1496                                  ;--------------------------------------------------------------------------
  1497                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1498                                  ;  In:
  1499                                  ;    Buffer  - Buffer Address.
  1500                                  ;    Count   - Buffer Size.
  1501                                  ;--------------------------------------------------------------------------
  1502                                  
  1503                                  mixpoll:
  1504                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1505                                  	; edi = buffer address
  1506                                  	; ebx = count
  1507                                  
  1508 000009A3 60                      	pushad
  1509                                  
  1510                                  	;cld
  1511                                  NextChunk:      
  1512 000009A4 66833D[B6D40000]00      	cmp     word [BufLen], 0
  1513 000009AC 756B                    	jne     short CopyChunk
  1514                                  
  1515 000009AE 53                      	push    ebx
  1516 000009AF 57                      	push    edi
  1517                                  MixChunk:       
  1518 000009B0 BF[BEB40000]            	mov	edi, MixBuffer
  1519                                  
  1520                                  	; 17/10/2017
  1521 000009B5 0FB70D[B0D40000]        	movzx	ecx, word [BpmSamples]
  1522                                  	;mov	cx, [BpmSamples]
  1523 000009BC 893D[B2D40000]          	mov     [BufPtr], edi
  1524 000009C2 66890D[B6D40000]        	mov	[BufLen], cx
  1525                                  
  1526 000009C9 803D[EE510000]04        	cmp	byte [numtracks], 4
  1527 000009D0 7603                    	jna	short ch_silence
  1528 000009D2 66D1E1                  	shl	cx, 1 
  1529                                  ch_silence:
  1530 000009D5 B880808080              	mov	eax, 80808080h
  1531 000009DA F3AB                    	rep	stosd
  1532                                  
  1533                                  	;mov	cx, NumTracks
  1534                                  	;mov	cl, NumTracks ; 01/10/2017
  1535 000009DC 8A0D[EE510000]          	mov	cl, [numtracks] ; 06/10/2017
  1536 000009E2 BE[9AD40000]            	mov	esi, Tracks - TrackInfo.size
  1537                                  GetSamples_next:
  1538 000009E7 51                      	push	ecx
  1539 000009E8 83C626                  	add	esi, TrackInfo.size
  1540 000009EB 668B0D[B6D40000]        	mov	cx, [BufLen]
  1541 000009F2 8B3D[B2D40000]          	mov	edi, [BufPtr]
  1542 000009F8 E8ECFEFFFF              	call	MixTrack
  1543 000009FD 59                      	pop	ecx
  1544 000009FE FF05[B2D40000]          	inc	dword [BufPtr] ; 18/10/2017
  1545 00000A04 E2E1                    	loop	GetSamples_next
  1546                                  
  1547                                   	; 18/10/2017	
  1548 00000A06 8B1D[EE510000]          	mov	ebx, [numtracks]
  1549 00000A0C 291D[B2D40000]          	sub	dword [BufPtr], ebx
  1550                                  
  1551 00000A12 E80DFEFFFF              	call    UpdateTracks
  1552                                  
  1553 00000A17 5F                      	pop     edi
  1554 00000A18 5B                      	pop     ebx
  1555                                  CopyChunk:      
  1556                                  	;mov	cx, [BufLen]
  1557 00000A19 0FB70D[B6D40000]        	movzx	ecx, word [BufLen]
  1558 00000A20 39D9                    	cmp	ecx, ebx
  1559                                  	;cmp	cx, bx
  1560 00000A22 7602                    	jbe     short MoveChunk
  1561                                  	;mov	cx, bx
  1562 00000A24 89D9                    	mov     ecx, ebx
  1563                                  MoveChunk:
  1564 00000A26 8B35[B2D40000]          	mov     esi, [BufPtr]
  1565 00000A2C 010D[B2D40000]          	add     [BufPtr], ecx
  1566 00000A32 66290D[B6D40000]        	sub     [BufLen], cx
  1567 00000A39 29CB                    	sub     ebx, ecx
  1568                                  	; 17/10/2017 ; STEREO MIXING
  1569                                  	;rep	movsb
  1570                                  	; 18/10/2017
  1571 00000A3B 803D[EE510000]04        	cmp	byte [numtracks], 4
  1572                                  	;jna	short _4_channels_mix
  1573 00000A42 762F                    	jna	_4_channels_mix
  1574                                  	
  1575                                  _8_channels_mix:
  1576                                  	; 18/10/2017
  1577 00000A44 AD                      	lodsd 
  1578 00000A45 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1579 00000A47 C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1580 00000A4A 00C6                    	add	dh, al ; ch1 + ch4
  1581 00000A4C 00E2                    	add	dl, ah ; ch2 + ch3
  1582                                  
  1583 00000A4E AD                      	lodsd
  1584 00000A4F 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1585 00000A51 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1586 00000A53 C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1587                                  	; 19/10/2017
  1588 00000A56 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1589 00000A58 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1590                                  
  1591                                  	; L = ch1 + ch4 + ch5 + ch8
  1592                                  	; R = ch2 + ch3 + ch6 + ch7
  1593                                  
  1594 00000A5A 6681C28080              	add	dx, 8080h
  1595                                  
  1596                                  	; 19/10/2017
  1597 00000A5F 88F4                    	mov	ah, dh
  1598 00000A61 80EC80                  	sub	ah, 80h
  1599 00000A64 30C0                    	xor	al, al
  1600 00000A66 66AB                    	stosw ; Left Channel
  1601 00000A68 88D4                    	mov	ah, dl
  1602 00000A6A 80EC80                  	sub	ah, 80h
  1603 00000A6D 66AB                    	stosw ; Right Channel
  1604                                  
  1605 00000A6F E2D3                    	loop	_8_channels_mix
  1606                                  	
  1607 00000A71 EB21                    	jmp	short channel_mix_ok
  1608                                  	
  1609                                  _4_channels_mix:
  1610                                  	; 18/10/2017
  1611 00000A73 AD                      	lodsd 
  1612 00000A74 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1613                                  	; 19/10/2017
  1614 00000A76 C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1615 00000A79 00E2                    	add	dl, ah ; ch1 + ch4
  1616 00000A7B 00C6                    	add	dh, al ; ch2 + ch3
  1617                                  
  1618                                  	; L = ch1 + ch4
  1619                                  	; R = ch2 + ch3
  1620                                  
  1621                                  	; 19/10/2017
  1622 00000A7D 6681C28080              	add	dx, 8080h
  1623                                  
  1624                                  	; 19/10/2017
  1625 00000A82 88D4                    	mov	ah, dl
  1626 00000A84 80EC80                  	sub	ah, 80h
  1627 00000A87 30C0                    	xor	al, al
  1628 00000A89 66AB                    	stosw ; Left Channel
  1629 00000A8B 88F4                    	mov	ah, dh
  1630 00000A8D 80EC80                  	sub	ah, 80h
  1631 00000A90 66AB                    	stosw ; Right Channel
  1632                                  	
  1633 00000A92 E2DF                    	loop	_4_channels_mix
  1634                                  
  1635                                  channel_mix_ok:
  1636 00000A94 85DB                    	test    ebx, ebx
  1637                                  	;jnz	short NextChunk
  1638 00000A96 0F8508FFFFFF            	jnz	NextChunk ; 17/10/2017
  1639                                  
  1640                                  	; 20/10/2017
  1641                                  	; 19/10/2017
  1642                                  	; Pan Control
  1643 00000A9C 8A0D[40E00000]          	mov	cl, [pan_shift]
  1644 00000AA2 08C9                    	or	cl, cl
  1645 00000AA4 744D                    	jz	short c_smpl_2
  1646                                  
  1647                                  	; 20/10/2017
  1648 00000AA6 BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1649 00000AAB BF[00F00000]            	mov	edi, Audio_Buffer
  1650                                  
  1651 00000AB0 B508                    	mov	ch, 8
  1652 00000AB2 D2E5                    	shl	ch, cl
  1653                                  c_smpl_1:
  1654 00000AB4 8B17                    	mov	edx, [edi]
  1655 00000AB6 6689D0                  	mov	ax, dx
  1656 00000AB9 80FC80                  	cmp	ah, 80h
  1657 00000ABC 7208                    	jb	short _cs1	
  1658 00000ABE 00EC                    	add	ah, ch
  1659 00000AC0 730A                    	jnc	short _cs2
  1660 00000AC2 B4FF                    	mov	ah, 255
  1661 00000AC4 EB06                    	jmp	short _cs2
  1662                                  _cs1:
  1663 00000AC6 28EC                    	sub	ah, ch
  1664 00000AC8 7302                    	jnc	short _cs2
  1665 00000ACA B400                    	mov	ah, 0
  1666                                  _cs2:
  1667 00000ACC C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1668 00000ACF 00F4                    	add	ah, dh
  1669 00000AD1 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1670 00000AD3 80FC80                  	cmp	ah, 80h
  1671 00000AD6 7208                    	jb	short _cs3	
  1672 00000AD8 00EC                    	add	ah, ch
  1673 00000ADA 730A                    	jnc	short _cs4
  1674 00000ADC B4FF                    	mov	ah, 255
  1675 00000ADE EB06                    	jmp	short _cs4
  1676                                  _cs3:
  1677 00000AE0 28EC                    	sub	ah, ch
  1678 00000AE2 7302                    	jnc	short _cs4
  1679 00000AE4 B400                    	mov	ah, 0
  1680                                  _cs4:
  1681 00000AE6 C1CA10                  	ror	edx, 16 ; dx = [edi]
  1682 00000AE9 00E6                    	add	dh, ah
  1683 00000AEB 8917                    	mov	[edi], edx
  1684                                  _cs5:
  1685                                  	; 20/10/2017
  1686 00000AED 83C704                  	add	edi, 4
  1687 00000AF0 4B                      	dec	ebx
  1688 00000AF1 75C1                    	jnz	short c_smpl_1	
  1689                                  c_smpl_2:
  1690 00000AF3 61                      	popad	
  1691 00000AF4 C3                      	retn
  1692                                  
  1693                                  ;--------------------------------------------------------------------------
  1694                                  ; StartPlaying: Initializes the Sound System.
  1695                                  ;  In:
  1696                                  ;   Module Information Resources.
  1697                                  ;--------------------------------------------------------------------------
  1698                                  
  1699                                  StartPlaying:
  1700 00000AF5 60                      	pushad
  1701                                  SetModParms:    
  1702 00000AF6 C605[AAD40000]00        	mov     byte [OrderPos], 0
  1703 00000AFD C605[ABD40000]06        	mov     byte [Tempo], DefTempo
  1704 00000B04 C605[ACD40000]06        	mov     byte [TempoWait], DefTempo
  1705 00000B0B C605[ADD40000]7D        	mov     byte [Bpm], DefBpm
  1706 00000B12 C605[AED40000]40        	mov     byte [Row], 64
  1707 00000B19 C605[AFD40000]00        	mov     byte [BreakRow], 0
  1708 00000B20 66A1[F4510000]          	mov     ax, [MixSpeed]
  1709 00000B26 31D2                    	xor     edx, edx
  1710 00000B28 66BB3200                	mov     bx, 24*DefBpm/60
  1711 00000B2C 66F7F3                  	div     bx
  1712 00000B2F 66A3[B0D40000]          	mov     [BpmSamples], ax
  1713                                  ClearTracks:    
  1714 00000B35 BF[C0D40000]            	mov     edi, Tracks
  1715                                  	; 07/10/2017
  1716                                  	;mov	ecx, NumTracks*TrackInfo.size
  1717 00000B3A B826000000              	mov	eax, TrackInfo.size
  1718 00000B3F 0FB70D[EE510000]        	movzx	ecx, word [numtracks]
  1719 00000B46 F7E1                    	mul	ecx
  1720 00000B48 89C1                    	mov	ecx, eax
  1721 00000B4A 31C0                    	xor     eax, eax
  1722                                  	;cld
  1723 00000B4C F3AA                    	rep     stosb
  1724                                  
  1725 00000B4E A3[B2D40000]            	mov     [BufPtr], eax
  1726 00000B53 66A3[B6D40000]          	mov     [BufLen], ax
  1727                                  MakePitch:
  1728 00000B59 66B80021                	mov     ax, MidCRate
  1729 00000B5D 66BBAC01                	mov     bx, 428
  1730 00000B61 66F7E3                  	mul     bx
  1731 00000B64 66F735[F4510000]        	div     word [MixSpeed]
  1732 00000B6B 30F6                    	xor     dh, dh
  1733 00000B6D 88E2                    	mov     dl, ah
  1734 00000B6F 88C4                    	mov     ah, al
  1735 00000B71 30C0                    	xor     al, al
  1736                                  	;mov	cx, 857
  1737 00000B73 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1738 00000B77 31DB                    	xor     ebx, ebx
  1739 00000B79 BF[FC580000]            	mov     edi, PitchTable
  1740                                  PitchLoop:      
  1741 00000B7E 50                      	push    eax
  1742 00000B7F 52                      	push    edx
  1743 00000B80 6639DA                  	cmp     dx, bx
  1744 00000B83 7303                    	jae     short NoDiv
  1745 00000B85 66F7F3                  	div     bx
  1746                                  NoDiv:          
  1747 00000B88 66AB                    	stosw
  1748 00000B8A 5A                      	pop     edx
  1749 00000B8B 58                      	pop     eax
  1750                                  	;inc	bx
  1751 00000B8C 43                      	inc	ebx
  1752 00000B8D E2EF                    	loop    PitchLoop
  1753                                  MakeVolume:     
  1754 00000B8F 66B90041                	mov     cx, 16640
  1755 00000B93 89CB                    	mov     ebx, ecx
  1756                                  VolLoop:
  1757 00000B95 664B                    	dec     bx
  1758 00000B97 88D8                    	mov     al, bl
  1759 00000B99 F6EF                    	imul    bh
  1760                                  	;mov	[VolTable+bx], ah
  1761 00000B9B 88A3[BE730000]          	mov     [VolTable+ebx], ah
  1762 00000BA1 E2F2                    	loop    VolLoop
  1763                                  
  1764 00000BA3 61                      	popad
  1765 00000BA4 C3                      	retn
  1766                                  
  1767                                  ;--------------------------------------------------------------------------
  1768                                  ; StopPlaying: ShutDown the Sound System.
  1769                                  ;--------------------------------------------------------------------------
  1770                                  
  1771                                  StopPlaying:
  1772                                  	; 19/06/2017
  1773                                  	; Stop Playing
  1774                                  	sys	_audio, 0700h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BA5 BB00070000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BAA B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BAF CD40                <1>  int 40h
  1775                                  	; Cancel callback service (for user)
  1776                                  	sys	_audio, 0900h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BB1 BB00090000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BB6 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BBB CD40                <1>  int 40h
  1777                                  	; Deallocate Audio Buffer (for user)
  1778                                  	sys	_audio, 0A00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BBD BB000A0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BC2 B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BC7 CD40                <1>  int 40h
  1779                                  	; Disable Audio Device
  1780                                  	sys	_audio, 0C00h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000BC9 BB000C0000          <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103                              <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105                              <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000BCE B820000000          <1>  mov eax, %1
   110                              <1> 
   111 00000BD3 CD40                <1>  int 40h
  1781                                  
  1782 00000BD5 C3                      	retn
  1783                                  
  1784                                  ;=============================================================================
  1785                                  ; 
  1786                                  ;=============================================================================
  1787                                  
  1788                                  ;dword2str:
  1789                                  ;	; 13/11/2016 - Erdogan Tan 
  1790                                  ;	; eax = dword value
  1791                                  ;	;
  1792                                  ;	call	dwordtohex
  1793                                  ;	mov	[dword_str], edx
  1794                                  ;	mov	[dword_str+4], eax
  1795                                  ;	mov	si, dword_str
  1796                                  ;	retn
  1797                                  
  1798                                  	; 05/03/2017 (TRDOS 386)
  1799                                  	; trdos386.s (unix386.s) - 10/05/2015
  1800                                  	; Convert binary number to hexadecimal string
  1801                                  
  1802                                  ;bytetohex:
  1803                                  ;	; INPUT ->
  1804                                  ;	; 	AL = byte (binary number)
  1805                                  ;	; OUTPUT ->
  1806                                  ;	;	AX = hexadecimal string
  1807                                  ;	;
  1808                                  ;	push	ebx
  1809                                  ;	movzx	ebx, al
  1810                                  ;	shr	bl, 4
  1811                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1812                                  ;	xchg	bl, al
  1813                                  ;	and	bl, 0Fh
  1814                                  ;	mov	ah, [ebx+hex_chars] 
  1815                                  ;	pop	ebx	
  1816                                  ;	retn
  1817                                  
  1818                                  ;wordtohex:
  1819                                  ;	; INPUT ->
  1820                                  ;	; 	AX = word (binary number)
  1821                                  ;	; OUTPUT ->
  1822                                  ;	;	EAX = hexadecimal string
  1823                                  ;	;
  1824                                  ;	push	ebx
  1825                                  ;	xor	ebx, ebx
  1826                                  ;	xchg	ah, al
  1827                                  ;	push	eax
  1828                                  ;	mov	bl, ah
  1829                                  ;	shr	bl, 4
  1830                                  ;	mov	al, [ebx+hex_chars] 	 	
  1831                                  ;	mov	bl, ah
  1832                                  ;	and	bl, 0Fh
  1833                                  ;	mov	ah, [ebx+hex_chars]
  1834                                  ;	shl	eax, 16
  1835                                  ;	pop	eax
  1836                                  ;	pop	ebx
  1837                                  ;	jmp	short bytetohex
  1838                                  
  1839                                  ;dwordtohex:
  1840                                  ;	; INPUT ->
  1841                                  ;	; 	EAX = dword (binary number)
  1842                                  ;	; OUTPUT ->
  1843                                  ;	;	EDX:EAX = hexadecimal string
  1844                                  ;	;
  1845                                  ;	push	eax
  1846                                  ;	shr	eax, 16
  1847                                  ;	call	wordtohex
  1848                                  ;	mov	edx, eax
  1849                                  ;	pop	eax
  1850                                  ;	call	wordtohex
  1851                                  ;	retn
  1852                                  
  1853                                  	; 24/06/2017
  1854                                  	; 19/06/2017
  1855                                  	; 05/03/2017 (TRDOS 386)
  1856                                  	; 13/11/2016 - Erdogan Tan
  1857                                  write_audio_dev_info:
  1858                                  	; BUS/DEV/FN
  1859                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1860                                  	; DEV/VENDOR
  1861                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1862                                  
  1863 00000BD6 8B35[B0520000]          	mov	esi, [dev_vendor]
  1864 00000BDC 6689F0                  	mov	ax, si
  1865 00000BDF 0FB6D8                  	movzx	ebx, al
  1866 00000BE2 88DA                    	mov	dl, bl
  1867 00000BE4 80E30F                  	and	bl, 0Fh
  1868 00000BE7 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1869 00000BED A2[3B520000]            	mov	[msgVendorId+3], al
  1870 00000BF2 88D3                    	mov	bl, dl
  1871 00000BF4 C0EB04                  	shr	bl, 4
  1872 00000BF7 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1873 00000BFD A2[3A520000]            	mov	[msgVendorId+2], al
  1874 00000C02 88E3                    	mov	bl, ah
  1875 00000C04 88DA                    	mov	dl, bl
  1876 00000C06 80E30F                  	and	bl, 0Fh
  1877 00000C09 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1878 00000C0F A2[39520000]            	mov	[msgVendorId+1], al
  1879 00000C14 88D3                    	mov	bl, dl
  1880 00000C16 C0EB04                  	shr	bl, 4
  1881 00000C19 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1882 00000C1F A2[38520000]            	mov	[msgVendorId], al
  1883 00000C24 C1EE10                  	shr	esi, 16
  1884 00000C27 6689F0                  	mov	ax, si
  1885 00000C2A 88C3                    	mov	bl, al
  1886 00000C2C 88DA                    	mov	dl, bl
  1887 00000C2E 80E30F                  	and	bl, 0Fh
  1888 00000C31 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1889 00000C37 A2[4C520000]            	mov	[msgDevId+3], al
  1890 00000C3C 88D3                    	mov	bl, dl
  1891 00000C3E C0EB04                  	shr	bl, 4
  1892 00000C41 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1893 00000C47 A2[4B520000]            	mov	[msgDevId+2], al
  1894 00000C4C 88E3                    	mov	bl, ah
  1895 00000C4E 88DA                    	mov	dl, bl
  1896 00000C50 80E30F                  	and	bl, 0Fh
  1897 00000C53 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1898 00000C59 A2[4A520000]            	mov	[msgDevId+1], al
  1899 00000C5E 88D3                    	mov	bl, dl
  1900 00000C60 C0EB04                  	shr	bl, 4
  1901 00000C63 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1902 00000C69 A2[49520000]            	mov	[msgDevId], al
  1903                                  
  1904 00000C6E 8B35[B4520000]          	mov	esi, [bus_dev_fn]
  1905 00000C74 C1EE08                  	shr	esi, 8
  1906 00000C77 6689F0                  	mov	ax, si
  1907 00000C7A 88C3                    	mov	bl, al
  1908 00000C7C 88DA                    	mov	dl, bl
  1909 00000C7E 80E307                  	and	bl, 7 ; bit 0,1,2
  1910 00000C81 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1911 00000C87 A2[70520000]            	mov	[msgFncNo+1], al
  1912 00000C8C 88D3                    	mov	bl, dl
  1913 00000C8E C0EB03                  	shr	bl, 3
  1914 00000C91 88DA                    	mov	dl, bl
  1915 00000C93 80E30F                  	and	bl, 0Fh
  1916 00000C96 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1917 00000C9C A2[62520000]            	mov	[msgDevNo+1], al
  1918 00000CA1 88D3                    	mov	bl, dl
  1919 00000CA3 C0EB04                  	shr	bl, 4
  1920 00000CA6 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1921 00000CAC A2[61520000]            	mov	[msgDevNo], al
  1922 00000CB1 88E3                    	mov	bl, ah
  1923 00000CB3 88DA                    	mov	dl, bl
  1924 00000CB5 80E30F                  	and	bl, 0Fh
  1925 00000CB8 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1926 00000CBE A2[56520000]            	mov	[msgBusNo+1], al
  1927 00000CC3 88D3                    	mov	bl, dl
  1928 00000CC5 C0EB04                  	shr	bl, 4
  1929 00000CC8 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1930 00000CCE A2[55520000]            	mov	[msgBusNo], al
  1931                                  
  1932                                  	; 24/06/2017
  1933 00000CD3 66A1[BC520000]          	mov	ax, [ac97_NamBar]
  1934 00000CD9 88C3                    	mov	bl, al
  1935 00000CDB 88DA                    	mov	dl, bl
  1936 00000CDD 80E30F                  	and	bl, 0Fh
  1937 00000CE0 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1938 00000CE6 A2[7F520000]            	mov	[msgNamBar+3], al
  1939 00000CEB 88D3                    	mov	bl, dl
  1940 00000CED C0EB04                  	shr	bl, 4
  1941 00000CF0 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1942 00000CF6 A2[7E520000]            	mov	[msgNamBar+2], al
  1943 00000CFB 88E3                    	mov	bl, ah
  1944 00000CFD 88DA                    	mov	dl, bl
  1945 00000CFF 80E30F                  	and	bl, 0Fh
  1946 00000D02 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1947 00000D08 A2[7D520000]            	mov	[msgNamBar+1], al
  1948 00000D0D 88D3                    	mov	bl, dl
  1949 00000D0F C0EB04                  	shr	bl, 4
  1950 00000D12 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1951 00000D18 A2[7C520000]            	mov	[msgNamBar], al
  1952                                  
  1953 00000D1D 66A1[BE520000]          	mov	ax, [ac97_NabmBar]
  1954 00000D23 88C3                    	mov	bl, al
  1955 00000D25 88DA                    	mov	dl, bl
  1956 00000D27 80E30F                  	and	bl, 0Fh
  1957 00000D2A 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1958 00000D30 A2[8F520000]            	mov	[msgNabmBar+3], al
  1959 00000D35 88D3                    	mov	bl, dl
  1960 00000D37 C0EB04                  	shr	bl, 4
  1961 00000D3A 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1962 00000D40 A2[8E520000]            	mov	[msgNabmBar+2], al
  1963 00000D45 88E3                    	mov	bl, ah
  1964 00000D47 88DA                    	mov	dl, bl
  1965 00000D49 80E30F                  	and	bl, 0Fh
  1966 00000D4C 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1967 00000D52 A2[8D520000]            	mov	[msgNabmBar+1], al
  1968 00000D57 88D3                    	mov	bl, dl
  1969 00000D59 C0EB04                  	shr	bl, 4
  1970 00000D5C 8A83[F6510000]          	mov	al, [ebx+hex_chars]
  1971 00000D62 A2[8C520000]            	mov	[msgNabmBar], al
  1972                                  
  1973                                  	; 24/11/2016
  1974 00000D67 30E4                    	xor	ah, ah
  1975 00000D69 A0[C0520000]            	mov	al, [ac97_int_ln_reg]
  1976 00000D6E B10A                    	mov	cl, 10
  1977 00000D70 F6F1                    	div	cl
  1978 00000D72 660105[98520000]        	add	[msgIRQ], ax
  1979 00000D79 20C0                    	and	al, al
  1980 00000D7B 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1981 00000D7D A0[99520000]            	mov	al, [msgIRQ+1]
  1982 00000D82 B420                    	mov	ah, ' '
  1983 00000D84 66A3[98520000]          	mov	[msgIRQ], ax
  1984                                  _w_ac97imsg_:
  1985                                  	; EBX = Message address
  1986                                  	; ECX = Max. message length (or stop on ZERO character)
  1987                                  	;	(1 to 255)
  1988                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1989                                       	sys 	_msg, msgAC97Info, 255, 07h
    96                              <1> 
    97                              <1> 
    98                              <1> 
    99                              <1> 
   100                              <1>  %if %0 >= 2
   101 00000D8A BB[07520000]        <1>  mov ebx, %2
   102                              <1>  %if %0 >= 3
   103 00000D8F B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   105 00000D94 BA07000000          <1>  mov edx, %4
   106                              <1>  %endif
   107                              <1>  %endif
   108                              <1>  %endif
   109 00000D99 B823000000          <1>  mov eax, %1
   110                              <1> 
   111 00000D9E CD40                <1>  int 40h
  1990 00000DA0 C3                              retn
  1991                                  
  1992                                  ;=============================================================================
  1993                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  1994                                  ;=============================================================================
  1995                                  
  1996                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  1997                                  
  1998                                  ;-----------------------------------------------------------------------------
  1999                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  2000                                  ;-----------------------------------------------------------------------------
  2001                                  	; 22/10/2017
  2002                                  setgraphmode:
  2003                                  	;pushad
  2004 00000DA1 66B81200                	mov	ax,0012h
  2005                                  	;int	10h
  2006 00000DA5 CD31                    	int 	31h
  2007 00000DA7 66BAC003                	mov	dx,3C0h
  2008 00000DAB 30C0                    	xor	al,al
  2009                                  setgraphmodel0:
  2010                                  	;out	dx,al
  2011 00000DAD B401                    	mov	ah, 1 ; outb
  2012 00000DAF CD34                    	int	34h
  2013                                  	;out	dx, al
  2014                                  	;mov	ah, 1
  2015 00000DB1 CD34                    	int	34h
  2016 00000DB3 FEC0                    	inc	al
  2017 00000DB5 3C10                    	cmp	al, 10h
  2018 00000DB7 72F4                    	jb	short setgraphmodel0
  2019 00000DB9 B020                    	mov	al, 20h
  2020                                  	;out	dx, al
  2021                                  	;mov	ah, 1
  2022 00000DBB CD34                    	int	34h
  2023                                  	;popad
  2024 00000DBD C3                      	retn
  2025                                  
  2026                                  ;-----------------------------------------------------------------------------
  2027                                  ; settextmode - restore the VGA 80x25x16 text mode
  2028                                  ;-----------------------------------------------------------------------------
  2029                                  	; 22/10/2017
  2030                                  settextmode:
  2031                                  	;pushad
  2032 00000DBE 66B80300                	mov	ax, 0003h
  2033                                  	;int	10h
  2034 00000DC2 CD31                    	int	31h
  2035                                  	;popad
  2036 00000DC4 C3                      	retn
  2037                                  
  2038                                  ;-----------------------------------------------------------------------------
  2039                                  ; drawscopes - draw the track voices sample scopes
  2040                                  ; In:
  2041                                  ;  ESI = (current) sample buffer
  2042                                  ;-----------------------------------------------------------------------------
  2043                                  	; 29/10/2017
  2044                                  	; 28/10/2017
  2045                                  	; (ESI = Current DMA buffer offset)
  2046                                  	; 27/10/2017
  2047                                  	; 26/10/2017
  2048                                  	; 23/10/2017
  2049                                  drawscopes:
  2050                                  	;pushad
  2051                                    	;mov	esi, g_buff
  2052                                  	;mov	esi, edx
  2053 00000DC5 31C9                    	xor     ecx, ecx	
  2054 00000DC7 31D2                    	xor     edx, edx
  2055 00000DC9 31FF                    	xor	edi, edi
  2056                                  drawscope0:
  2057 00000DCB 66AD                    	lodsw
  2058 00000DCD 80F480                  	xor	ah, 80h
  2059 00000DD0 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2060 00000DD3 66D1E3                  	shl	bx, 1
  2061 00000DD6 668B83[F0D50000]        	mov	ax, [RowOfs+ebx]
  2062 00000DDD 668987[F0D70000]        	mov	[NewScope_L+edi], ax
  2063 00000DE4 30FF                    	xor	bh, bh
  2064 00000DE6 66AD                    	lodsw
  2065 00000DE8 80F480                  	xor	ah, 80h
  2066 00000DEB 88E3                    	mov	bl, ah	; Right Channel
  2067 00000DED 66D1E3                  	shl	bx, 1
  2068 00000DF0 668B83[F0D50000]        	mov	ax, [RowOfs+ebx]
  2069 00000DF7 668987[F0D90000]        	mov	[NewScope_R+edi], ax
  2070 00000DFE 6683C702                	add	di, 2
  2071 00000E02 FEC1                    	inc	cl
  2072 00000E04 75C5                    	jnz	short drawscope0	
  2073                                  
  2074 00000E06 66BAC403                        mov	dx, 3C4h
  2075                                          ;mov	ax, 0802h
  2076                                          ;out	dx, ax
  2077 00000E0A 66BB0208                        mov	bx, 0802h
  2078 00000E0E B403                    	mov	ah, 3 ; outw
  2079 00000E10 CD34                    	int	34h
  2080 00000E12 66BACE03                	mov	dx, 3CEh
  2081 00000E16 B008                            mov	al, 08h
  2082                                         ;out	dx, al
  2083 00000E18 B401                            mov	ah, 1 ; outb
  2084 00000E1A CD34                    	int	34h
  2085 00000E1C 6642                    	inc	dx
  2086                                  
  2087                                  	; 26/10/2017
  2088 00000E1E 31F6                            xor	esi, esi
  2089                                         ;xor	edi, edi
  2090 00000E20 BB45060A00                      mov     ebx, 0A0645h
  2091                                  drawscopel4:
  2092 00000E25 B080                            mov     al, 80h
  2093                                  drawscopel2:
  2094 00000E27 50                              push    eax ; *
  2095 00000E28 52                              push    edx ; **
  2096                                  	;out	dx, al
  2097 00000E29 B401                    	mov	ah, 1 ; outb
  2098 00000E2B CD34                    	int	34h
  2099                                  
  2100 00000E2D B4FF                            mov	ah, 0FFh
  2101                                          ;mov	ecx, 32
  2102 00000E2F B120                    	mov	cl, 32
  2103 00000E31 28C0                    	sub     al, al
  2104                                  drawscopel3:
  2105                                  	; 23/10/2017
  2106 00000E33 668B96[F0DB0000]                mov	dx, [OldScope_L+esi]
  2107 00000E3A 663B96[F0D70000]                cmp	dx, [NewScope_L+esi]
  2108 00000E41 7414                            je	short drawscopef3
  2109 00000E43 88041A                          mov	[edx+ebx], al ; L
  2110 00000E46 668B96[F0D70000]                mov     dx, [NewScope_L+esi]
  2111 00000E4D 88241A                  	mov	[edx+ebx], ah ; L
  2112 00000E50 668996[F0DB0000]                mov     [OldScope_L+esi], dx
  2113                                  drawscopef3:
  2114                                  	; 27/10/2017
  2115 00000E57 668B96[F0DD0000]                mov	dx, [OldScope_R+esi]
  2116 00000E5E 663B96[F0D90000]                cmp	dx, [NewScope_R+esi]
  2117 00000E65 7416                            je	short drawscopef4
  2118 00000E67 88441A26                	mov	[edx+ebx+38], al ; R
  2119 00000E6B 668B96[F0D90000]                mov     dx, [NewScope_R+esi]
  2120 00000E72 88641A26                        mov	[edx+ebx+38], ah ; R
  2121 00000E76 668996[F0DD0000]                mov     [OldScope_R+esi], dx
  2122                                  drawscopef4:
  2123 00000E7D 83C610                  	add	esi, 2*8
  2124 00000E80 43                      	inc	ebx
  2125 00000E81 E2B0                    	loop    drawscopel3
  2126                                  
  2127 00000E83 5A                              pop     edx ; **
  2128 00000E84 58                              pop     eax ; *
  2129 00000E85 81EEFE010000            	sub	esi, 2*256-2
  2130 00000E8B 83EB20                  	sub	ebx, 32
  2131 00000E8E D0E8                            shr     al, 1
  2132 00000E90 7595                            jnz	short drawscopel2
  2133                                  	;popad
  2134 00000E92 C3                              retn
  2135                                  
  2136                                  ;=============================================================================
  2137                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2138                                  ;=============================================================================
  2139                                  
  2140                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2141                                  
  2142                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2143                                  
  2144                                  ;-----------------------------------------------------------------------------
  2145                                  ; EQUATES AND STRUCTURES
  2146                                  ;-----------------------------------------------------------------------------
  2147                                  
  2148                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2149                                  ID_ILBM equ 4D424C49h
  2150                                  ID_BMHD equ 44484D42h
  2151                                  ID_CMAP equ 50414D43h
  2152                                  ID_BODY equ 59444F42h
  2153                                  
  2154                                  struc Form			; IFF/ILBM header file format
  2155 00000000 ????????                  .ID:		resd 1
  2156 00000004 ????????                  .Length:	resd 1
  2157 00000008 ????????                  .Type:	resd 1
  2158                                    .size:
  2159                                  endstruc
  2160                                  
  2161                                  struc Chunk			; IFF/ILBM header chunk format
  2162 00000000 ????????                  .ID:		resd 1
  2163 00000004 ????????                  .Length:	resd 1
  2164                                    .size:	
  2165                                  endstruc
  2166                                  
  2167                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2168 00000000 ????                      .Width: 	resw 1
  2169 00000002 ????                      .Height:	resw 1
  2170 00000004 ????                      .PosX:	resw 1
  2171 00000006 ????                      .PosY:	resw 1
  2172 00000008 ??                        .Planes:	resb 1
  2173 00000009 ??                        .Masking:	resb 1
  2174 0000000A ??                        .Compression:	resb 1
  2175 0000000B ??                        .Pad:		resb 1
  2176 0000000C ????                      .Transparent:	resw 1
  2177 0000000E ??                        .AspectX	resb 1
  2178 0000000F ??                        .AspectY:	resb 1
  2179 00000010 ????                      .PageWidth:	resw 1
  2180 00000012 ????                      .PageHeight:	resw 1
  2181                                    .size:	
  2182                                  endstruc
  2183                                  
  2184                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2185 00000000 <res 300h>                .Colors:	resb 768
  2186                                    .size:	
  2187                                  endstruc
  2188                                  
  2189                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2190                                  
  2191                                  ;------------------------------------------------------------------------------
  2192                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2193                                  ;         a value in little/big endian form to big/little endian form.
  2194                                  ;------------------------------------------------------------------------------
  2195                                  %macro	bswap   1
  2196                                          xchg    al, ah
  2197                                          rol     eax, 16
  2198                                          xchg    al, ah
  2199                                  %endmacro
  2200                                  
  2201                                  ;------------------------------------------------------------------------------
  2202                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2203                                  ; In:
  2204                                  ;  ESI = IFF/ILBM image file address
  2205                                  ;------------------------------------------------------------------------------
  2206                                  putlbm:
  2207 00000E93 60                              pushad
  2208                                  
  2209                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2210                                  
  2211 00000E94 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2212 00000E9A 7551                            jne     short putlbmd0
  2213 00000E9C 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2214 00000EA3 7548                            jne     short putlbmd0
  2215                                  
  2216                                  ; get the IFF/ILBM file length in bytes
  2217                                  
  2218 00000EA5 8B4604                          mov     eax, [esi+Form.Length]
  2219                                          bswap   eax
  2196 00000EA8 86C4                <1>  xchg al, ah
  2197 00000EAA C1C010              <1>  rol eax, 16
  2198 00000EAD 86C4                <1>  xchg al, ah
  2220 00000EAF 89C1                            mov     ecx, eax
  2221                                  
  2222                                  ; decrease the file length and updates the file pointer
  2223                                  
  2224 00000EB1 83E904                          sub     ecx, 4
  2225 00000EB4 83C60C                          add     esi, Form.size
  2226                                  
  2227                                  ; IFF/ILBM main parser body loop
  2228                                  
  2229                                  putlbml0:
  2230 00000EB7 85C9                            test    ecx, ecx
  2231 00000EB9 7E64                            jle     short putlbmd1
  2232                                  
  2233                                  ; get the next chunk ID and length in bytes
  2234                                  
  2235 00000EBB 8B1E                            mov     ebx, [esi+Chunk.ID]
  2236 00000EBD 8B4604                          mov     eax, [esi+Chunk.Length]
  2237                                          bswap   eax
  2196 00000EC0 86C4                <1>  xchg al, ah
  2197 00000EC2 C1C010              <1>  rol eax, 16
  2198 00000EC5 86C4                <1>  xchg al, ah
  2238 00000EC7 93                              xchg    ebx, eax
  2239 00000EC8 83C608                          add     esi, Chunk.size
  2240                                  
  2241                                  ; word align the chunk length and decrease the file length counter
  2242                                  
  2243 00000ECB 43                              inc     ebx
  2244 00000ECC 80E3FE                          and     bl, 0FEh ; ~1
  2245 00000ECF 83E908                          sub     ecx, Chunk.size
  2246 00000ED2 29D9                            sub     ecx, ebx
  2247                                  
  2248                                  ; check for the BMHD/CMAP/BODY chunk headers
  2249                                  
  2250 00000ED4 3D424D4844                      cmp     eax, ID_BMHD
  2251 00000ED9 7415                            je      short putlbmf0
  2252 00000EDB 3D434D4150                      cmp     eax, ID_CMAP
  2253 00000EE0 7440                            je      short putlbmf1
  2254 00000EE2 3D424F4459                      cmp     eax, ID_BODY
  2255 00000EE7 7455                            je      short putlbmf2
  2256                                  
  2257                                  ; advance to the next IFF/ILBM chunk structure
  2258                                  
  2259                                  putlbmc0:
  2260 00000EE9 01DE                            add     esi, ebx
  2261 00000EEB EBCA                            jmp     short putlbml0
  2262                                  
  2263                                  putlbmd0:
  2264 00000EED F9                              stc
  2265 00000EEE 61                              popad
  2266 00000EEF C3                              retn
  2267                                  
  2268                                  ; process the BMHD bitmap header chunk
  2269                                  
  2270                                  putlbmf0:
  2271 00000EF0 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2272 00000EF4 75F7                            jne     short putlbmd0
  2273 00000EF6 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2274 00000EFA 75F1                            jne     short putlbmd0
  2275 00000EFC 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2276 00000F00 75EB                            jne     short putlbmd0
  2277 00000F02 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2278 00000F05 86C4                            xchg    al, ah
  2279 00000F07 83C007                          add     eax, 7
  2280 00000F0A C1E803                          shr     eax, 3
  2281 00000F0D A3[A8520000]                    mov     [picture.width], eax
  2282 00000F12 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2283 00000F16 86C4                            xchg    al, ah
  2284 00000F18 A3[AC520000]                    mov     [picture.height], eax
  2285 00000F1D EBCA                            jmp     short putlbmc0
  2286                                  
  2287                                  putlbmd1:
  2288 00000F1F F8                              clc
  2289 00000F20 61                              popad
  2290 00000F21 C3                              retn
  2291                                  
  2292                                  ; process the CMAP colormap chunk
  2293                                  
  2294                                  putlbmf1:
  2295 00000F22 66BAC803                        mov     dx, 3C8h
  2296 00000F26 30C0                            xor     al, al
  2297                                          ;out	dx, al
  2298 00000F28 B401                    	mov	ah, 1 ; outb
  2299 00000F2A CD34                    	int	34h
  2300 00000F2C 6642                            inc     dx
  2301                                  putlbml1:
  2302 00000F2E 8A06                            mov     al, [esi]
  2303 00000F30 C0E802                          shr     al, 2
  2304                                          ;out	dx, al
  2305                                  	;mov	ah, 1 ; outb
  2306 00000F33 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2307 00000F35 46                              inc     esi
  2308 00000F36 4B                              dec     ebx
  2309 00000F37 7FF5                            jg      short putlbml1
  2310 00000F39 E979FFFFFF                      jmp     putlbml0
  2311                                  
  2312                                  ; process the BODY bitmap body chunk
  2313                                  
  2314                                  putlbmf2:
  2315 00000F3E 60                              pushad
  2316 00000F3F BF00000A00                      mov     edi, 0A0000h
  2317                                          ;cld
  2318 00000F44 66BACE03                        mov     dx, 3CEh
  2319                                          ;mov	ax, 0FF08h
  2320                                          ;out	dx, ax
  2321 00000F48 66BB08FF                	mov	bx, 0FF08h
  2322 00000F4C B403                    	mov	ah, 3 ; outw
  2323 00000F4E CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2324 00000F50 66BAC403                        mov     dx, 3C4h
  2325 00000F54 B002                            mov     al, 02h
  2326                                          ;out	dx, al
  2327 00000F56 B401                    	mov	ah, 1 ; outb
  2328 00000F58 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2329 00000F5A 6642                            inc     dx
  2330 00000F5C 8B0D[AC520000]                  mov     ecx, [picture.height]
  2331                                  putlbml2:
  2332 00000F62 51                              push    ecx
  2333 00000F63 B011                            mov     al, 11h
  2334                                  putlbml3:
  2335 00000F65 50                              push    eax
  2336 00000F66 57                              push    edi
  2337                                          ;out	dx, al
  2338 00000F67 B401                    	mov	ah, 1 ; outb
  2339 00000F69 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2340 00000F6B 8B1D[A8520000]                  mov     ebx, [picture.width]
  2341                                  putlbml4:
  2342 00000F71 AC                              lodsb
  2343 00000F72 84C0                            test    al, al
  2344 00000F74 7C0A                            jl      short putlbmf3
  2345 00000F76 0FB6C8                          movzx   ecx, al
  2346 00000F79 41                              inc     ecx
  2347 00000F7A 29CB                            sub     ebx, ecx
  2348 00000F7C F3A4                            rep     movsb
  2349 00000F7E EB0B                            jmp     short putlbmc4
  2350                                  putlbmf3:
  2351 00000F80 F6D8                            neg     al
  2352 00000F82 0FB6C8                          movzx   ecx, al
  2353 00000F85 41                              inc     ecx
  2354 00000F86 29CB                            sub     ebx, ecx
  2355 00000F88 AC                              lodsb
  2356 00000F89 F3AA                            rep     stosb
  2357                                  putlbmc4:
  2358 00000F8B 85DB                            test    ebx, ebx
  2359 00000F8D 7FE2                            jg      short putlbml4
  2360 00000F8F 5F                              pop     edi
  2361 00000F90 58                              pop     eax
  2362 00000F91 00C0                            add     al, al
  2363 00000F93 73D0                            jnc     short putlbml3
  2364 00000F95 83C750                          add     edi, 80
  2365 00000F98 59                              pop     ecx
  2366 00000F99 E2C7                            loop    putlbml2
  2367 00000F9B 61                      	popad
  2368 00000F9C E948FFFFFF                      jmp	putlbmc0
  2369                                  
  2370                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2371                                  ;------------------------------------------------------------------------------
  2372                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2373                                  ;  ESI = IFF/ILBM image file address
  2374                                  ;------------------------------------------------------------------------------
  2375                                  
  2376                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2377                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2378                                  ;       MODStopModule();
  2379                                  ;       MODFreeModule(Song);
  2380                                  ;       return;
  2381                                  ;   }
  2382                                  ;   setgraphmode();
  2383                                  ;   putlbm(Logo);
  2384                                  ;   while (!kbhit())
  2385                                  ;       drawscopes(Song->NumTracks);
  2386                                  ;   settextmode();
  2387                                  ;   free(Logo);
  2388                                  ;   MODStopModule();
  2389                                  ;   MODFreeModule(Song);
  2390                                  
  2391                                  ;loadlbm:
  2392                                  ;	; ebx = ASCIIZ file name address
  2393                                  ;	; ecx = open mode (0 = open for read)	
  2394                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2395                                  ;	jc	short loadlbm_retn
  2396                                  ;
  2397                                  ;	mov     [LBM_FileHandle], eax
  2398                                  ;
  2399                                  ;	; get file size by moving file pointer to the end of file
  2400                                  ;	; ebx = file handle/number
  2401                                  ;	; ecx : offset = 0
  2402                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2403                                  ;	sys	_seek, eax, 0, 2
  2404                                  ;	jc	short loadlbm_cf
  2405                                  ;
  2406                                  ;	mov	[LBM_FileSize], eax
  2407                                  ;
  2408                                  ;	; move file pointer to the beginning of the file
  2409                                  ;	; ecx = 0
  2410                                  ;	; edx = 0
  2411                                  ;	;xor	ecx, ecx
  2412                                  ; 	xor	dl, dl
  2413                                  ;	; ebx = [LBM_FileHandle]
  2414                                  ;	sys	_seek
  2415                                  ;	;jc	short loadlbm_cf
  2416                                  ;
  2417                                  ;	; ebx = File handle
  2418                                  ;	; ecx = Buffer address
  2419                                  ;	; edx = Byte count
  2420                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2421                                  ;	mov	ecx, LOGO_ADDRESS
  2422                                  ;	mov	edx, [LBM_FileSize]
  2423                                  ;	sys	_read
  2424                                  ;	jc	short loadlbm_cf
  2425                                  ;
  2426                                  ;	cmp	eax, edx  ; read count = file size ?
  2427                                  ;	;jb	short loadlbm_cf		 
  2428                                  ;loadlbm_cf:
  2429                                  ;	pushf
  2430                                  ;	sys	_close, [LBM_FileHandle]	
  2431                                  ;	popf
  2432                                  ;loadlbm_retn:
  2433                                  ;	retn	
  2434                                  ;
  2435                                  ;LOGO_FILE_NAME:
  2436                                  ;	db	"LOGO.LBM", 0
  2437                                  
  2438                                  LOGO_ERROR_MSG:
  2439 00000FA1 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2439 00000FAA 64696E672074686520-
  2439 00000FB3 4946462F494C424D20-
  2439 00000FBC 6C6F676F2070696374-
  2439 00000FC5 75726520210D0A00   
  2440                                  
  2441 00000FCD 90                      align 2
  2442                                  ; 22/10/2017
  2443                                  LOGO_ADDRESS:
  2444                                  ;incbin "LOGO.LBM"	  	 
  2445                                  ; 27/10/2017
  2446 00000FCE <bin 3FF0h>             incbin "TINYPLAY.LBM"
  2447                                  
  2448                                  ;=============================================================================
  2449                                  ;               preinitialized data
  2450                                  ;=============================================================================
  2451                                  
  2452                                  ;=============================================================================
  2453                                  ; Protracker effects stuff
  2454                                  ;=============================================================================
  2455                                  
  2456                                  ;-----------------------------------------------------------------------------
  2457                                  ; Effect jump tables
  2458                                  ;-----------------------------------------------------------------------------
  2459                                  
  2460 00004FBE 90<rep 2h>              align 4
  2461                                  
  2462                                  efxtable:
  2463 00004FC0 [8E070000]              	dd      efxarpeggio	; 0 - arpeggio
  2464 00004FC4 [BB040000]              	dd      efxnull		; 1 - porta up
  2465 00004FC8 [BB040000]              	dd      efxnull		; 2 - porta down
  2466 00004FCC [D9060000]              	dd      efxtoneporta	; 3 - tone porta
  2467 00004FD0 [E8060000]              	dd      efxvibrato	; 4 - vibrato
  2468 00004FD4 [BB040000]              	dd      efxnull		; 5 - tone+slide
  2469 00004FD8 [BB040000]              	dd      efxnull		; 6 - vibrato+slide
  2470 00004FDC [05080000]              	dd      efxtremolo	; 7 - tremolo
  2471 00004FE0 [BB040000]              	dd      efxnull		; 8 - unused
  2472 00004FE4 [10070000]              	dd      efxsampoffset	; 9 - sample offset
  2473 00004FE8 [BB040000]              	dd      efxnull		; A - volume slide
  2474 00004FEC [1C070000]              	dd      efxpattjump	; B - pattern jump
  2475 00004FF0 [2A070000]              	dd      efxsetvolume	; C - set volume
  2476 00004FF4 [38070000]              	dd      efxbreak	; D - break pattern
  2477 00004FF8 [BB040000]              	dd      efxnull		; E - extra effects
  2478 00004FFC [57070000]              	dd      efxsetspeed	; F - set speed
  2479                                  
  2480                                  efxtable2:
  2481 00005000 [BC040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2482 00005004 [DE040000]              	dd      efxportaup	; 1 - porta up
  2483 00005008 [04050000]              	dd      efxportadown	; 2 - porta down
  2484 0000500C [2B050000]              	dd      efxtoneporta2	; 3 - tone porta
  2485 00005010 [64050000]              	dd      efxvibrato2	; 4 - vibrato
  2486 00005014 [C0050000]              	dd      efxtoneslide	; 5 - tone+slide
  2487 00005018 [CD050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2488 0000501C [F4050000]              	dd      efxtremolo2	; 7 - tremolo
  2489 00005020 [BB040000]              	dd      efxnull		; 8 - unused
  2490 00005024 [BB040000]              	dd      efxnull		; 9 - sample offset
  2491 00005028 [D7050000]              	dd      efxvolslide	; A - volume slide
  2492 0000502C [BB040000]              	dd      efxnull		; B - pattern jump
  2493 00005030 [BB040000]              	dd      efxnull		; C - set volume
  2494 00005034 [BB040000]              	dd      efxnull		; D - break pattern
  2495 00005038 [BB040000]              	dd      efxnull		; E - extra effects
  2496 0000503C [BB040000]              	dd      efxnull		; F - set speed
  2497                                  
  2498                                  ;-----------------------------------------------------------------------------
  2499                                  ; Amiga period table
  2500                                  ;-----------------------------------------------------------------------------
  2501                                  
  2502                                  ;PeriodTable0:	
  2503                                  ;	dw	0
  2504                                  PeriodTable:
  2505 00005040 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2505 00005049 0A000A7009E8086808-
  2505 00005052 F00780071407       
  2506 00005058 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2506 00005061 050005B80474043404-
  2506 0000506A F803C0038A03       
  2507 00005070 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2507 00005079 0280025C023A021A02-
  2507 00005082 FC01E001C501       
  2508 00005088 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2508 00005091 0140012E011D010D01-
  2508 0000509A FE00F000E200       
  2509 000050A0 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2509 000050A9 00A00097008F008700-
  2509 000050B2 7F0078007100       
  2510 000050B8 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2510 000050C1 0050004B0047004300-
  2510 000050CA 3F003C003800       
  2511 000050D0 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2511 000050D9 002800250023002100-
  2511 000050E2 1F001E001C00       
  2512                                  
  2513                                  ;-----------------------------------------------------------------------------
  2514                                  ; Sinus wave table
  2515                                  ;-----------------------------------------------------------------------------
  2516                                  
  2517                                  SinTable:
  2518 000050E8 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2518 000050F1 C5D4E1             
  2519 000050F4 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2519 000050FD E1                 
  2520 000050FE D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2520 00005107 19                 
  2521                                  
  2522                                  ;=============================================================================
  2523                                  ;               PLAY.ASM - DATA
  2524                                  ;=============================================================================
  2525 00005108 00                      	db	0
  2526                                  msg_usage:
  2527 00005109 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2527 00005112 506C6179657220666F-
  2527 0000511B 72205452444F532033-
  2527 00005124 383620627920457264-
  2527 0000512D 6F67616E2054616E2E-
  2527 00005136 20                 
  2528                                  	;db	'October 2017.',10,13
  2529 00005137 4A756E652032303234-     	db	'June 2024.',10,13
  2529 00005140 2E0A0D             
  2530 00005143 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2530 0000514C 6F64706C6179206669-
  2530 00005155 6C656E616D652E6D6F-
  2530 0000515E 640A0D00           
  2531 00005162 32392F31302F323031-     	db	'29/10/2017',10,13,0
  2531 0000516B 370A0D00           
  2532 0000516F 30322F30362F323032-     	db	'02/06/2024',10,13,0
  2532 00005178 340A0D00           
  2533                                  
  2534                                  Credits:
  2535 0000517C 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2535 00005185 506C61796572207630-
  2535 0000518E 2E3162206279204361-
  2535 00005197 726C6F732048617361-
  2535 000051A0 6E2E204A756C792031-
  2535 000051A9 3939332E           
  2536 000051AD 0A0D00                  	db	10,13,0
  2537                                  ErrorMesg:    
  2538 000051B0 4572726F72206C6F61-     	db 'Error loading Module file.',10,13,0
  2538 000051B9 64696E67204D6F6475-
  2538 000051C2 6C652066696C652E0A-
  2538 000051CB 0D00               
  2539                                  
  2540                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2541                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2542                                  ;PortText:    db 'x0h, IRQ '
  2543                                  ;IrqText:     db 'x.',10,13,0
  2544                                  
  2545                                  trdos386_err_msg:
  2546 000051CD 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2546 000051D6 2053797374656D2063-
  2546 000051DF 616C6C206572726F72-
  2546 000051E8 20210A0D00         
  2547                                  
  2548                                  ; 07/10/2017
  2549 000051ED 0A                      pattern_shift:	db 10
  2550                                  ;numtracks:	dw 4
  2551                                  ; 18/10/2017
  2552 000051EE 04000000                numtracks:	dd 4
  2553                                  
  2554                                  ;=============================================================================
  2555                                  ;               PLAYER.ASM - DATA
  2556                                  ;=============================================================================
  2557                                  
  2558                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2559                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2560                                  
  2561                                  ;19/10/2017
  2562 000051F2 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2563 000051F3 10                      bps:		db 16 ; bits per sample (8 or 16)
  2564                                  
  2565                                  Sample_Rate:
  2566                                  MixSpeed:	;dw 22050 ; Hz
  2567                                  		; 02/06/2024
  2568 000051F4 80BB                    		dw 48000 ; Hz
  2569                                  
  2570                                  ; 13/11/2016
  2571 000051F6 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2571 000051FF 3941424344454600   
  2572                                  ;
  2573                                  msgAC97Info:	
  2574 00005207 0D0A                    		db 0Dh, 0Ah
  2575 00005209 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2575 00005212 6F20436F6E74726F6C-
  2575 0000521B 6C6572202620436F64-
  2575 00005224 656320496E666F0D0A 
  2576 0000522D 56656E646F72204944-     		db "Vendor ID: "
  2576 00005236 3A20               
  2577 00005238 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2577 00005241 6963652049443A20   
  2578 00005249 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2579 00005250 4275733A20              		db "Bus: "
  2580 00005255 303068204465766963-     msgBusNo:	db "00h Device: "
  2580 0000525E 653A20             
  2581 00005261 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2581 0000526A 696F6E3A20         
  2582 0000526F 303068                  msgFncNo	db "00h"
  2583 00005272 0D0A                    		db 0Dh, 0Ah
  2584 00005274 4E414D4241523A20        		db "NAMBAR: "
  2585 0000527C 30303030682020          msgNamBar	db "0000h  "
  2586 00005283 4E41424D4241523A20      		db "NABMBAR: "
  2587 0000528C 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2587 00005295 513A20             
  2588 00005298 3030                    msgIRQ:		dw 3030h
  2589 0000529A 0D0A00                  		db 0Dh, 0Ah, 0
  2590                                  ;
  2591                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2592                                  ;codec_id:	   dd 0
  2593                                  ;codec_chip_id:	   dd 0
  2594                                  ;codec_vendor_ids: dw 0
  2595                                  ;codec_chip_ids:   dw 0
  2596                                  
  2597                                  ;dword_str:	dd 30303030h, 30303030h
  2598                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2599                                  
  2600                                  ;=============================================================================
  2601                                  ;        	uninitialized data
  2602                                  ;=============================================================================
  2603                                  
  2604                                  bss_start:
  2605                                  
  2606                                  ABSOLUTE bss_start
  2607                                  
  2608 0000529D ??????                  alignb 4
  2609                                  
  2610                                  ;------------------------------------------------------------------------------
  2611                                  ; IFF/ILBM DATA
  2612                                  ;------------------------------------------------------------------------------
  2613                                  
  2614 000052A0 ????????                LBM_FileHandle:	resd 1
  2615 000052A4 ????????                LBM_FileSize:	resd 1
  2616                                  ;
  2617 000052A8 ????????                picture.width:	resd 1 		; current picture width and height
  2618 000052AC ????????                picture.height:	resd 1
  2619                                  
  2620                                  ;------------------------------------------------------------------------------
  2621                                  
  2622 000052B0 ????????                dev_vendor:	resd 1
  2623 000052B4 ????????                bus_dev_fn:	resd 1
  2624 000052B8 ????????                stats_cmd:	resd 1
  2625 000052BC ????                    ac97_NamBar:	resw 1
  2626 000052BE ????                    ac97_NabmBar:	resw 1
  2627 000052C0 ??                      ac97_int_ln_reg: resb 1
  2628 000052C1 ??                      srb:		resb 1
  2629                                  
  2630                                  ; MODLOAD.ASM
  2631 000052C2 ????????                FileHandle:	resd 1
  2632 000052C6 <res 43Ch>              Header:		resb ModHeader.size
  2633                                  
  2634                                  ; MODPLAY.ASM
  2635                                  ;MixSpeed:	    resw 1
  2636                                  
  2637                                  ModInfo:
  2638 00005702 ??                      ModInfo.OrderLen:   resb 1
  2639 00005703 ??                      ModInfo.ReStart:    resb 1
  2640 00005704 <res 80h>               ModInfo.Order:	    resb 128
  2641 00005784 ????????                ModInfo.Patterns:   resd 1
  2642                                  
  2643 00005788 <res 3Eh>               ModInfo.SampOfs:    resw 31
  2644 000057C6 <res 3Eh>               ModInfo.SampSeg:    resw 31
  2645 00005804 <res 3Eh>               ModInfo.SampLen:    resw 31
  2646 00005842 <res 3Eh>               ModInfo.SampRep:    resw 31
  2647 00005880 <res 3Eh>               ModInfo.SampRepLen: resw 31
  2648 000058BE <res 3Eh>               ModInfo.SampVol:    resw 31
  2649                                  
  2650                                  ; MODPLAY.ASM
  2651                                  PitchTable:	;resw 857
  2652 000058FC <res 1AC2h>             		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2653 000073BE <res 4100h>             VolTable:	resb 16640
  2654 0000B4BE <res 1FECh>             MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2655                                  
  2656                                  ; MODPLAY.ASM
  2657 0000D4AA ??                      OrderPos:	resb 1
  2658 0000D4AB ??                      Tempo:		resb 1
  2659 0000D4AC ??                      TempoWait:	resb 1
  2660 0000D4AD ??                      Bpm:		resb 1
  2661 0000D4AE ??                      Row:		resb 1
  2662 0000D4AF ??                      BreakRow:	resb 1
  2663 0000D4B0 ????                    BpmSamples:	resw 1
  2664 0000D4B2 ????????                BufPtr:		resd 1
  2665 0000D4B6 ????                    BufLen:		resw 1
  2666 0000D4B8 ????????                BufRep:		resd 1
  2667 0000D4BC ????????                Note:		resd 1
  2668                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2669                                  ; 07/10/2017
  2670 0000D4C0 <res 130h>              Tracks:		resb TrackInfo.size*8
  2671                                  
  2672                                  alignb 16
  2673                                  
  2674                                  ; PLAY.ASM
  2675                                  ;Scope:		resw 320
  2676 0000D5F0 <res 200h>              RowOfs:		resw 256
  2677                                  
  2678                                  ; 23/10/2017
  2679 0000D7F0 <res 200h>              NewScope_L:	resw 256
  2680 0000D9F0 <res 200h>              NewScope_R:	resw 256
  2681 0000DBF0 <res 200h>              OldScope_L:	resw 256
  2682 0000DDF0 <res 200h>              OldScope_R:	resw 256
  2683                                  
  2684                                  mod_file_name:
  2685 0000DFF0 <res 50h>               		resb 80
  2686                                  
  2687                                  ; 20/10/2017 (modplay7.s, SB16)
  2688                                  ; 19/10/2017 (modplay6.s, AC97)
  2689 0000E040 ??                      pan_shift:	resb 1
  2690 0000E041 ??                      volume_level:	resb 1
  2691                                  
  2692 0000E042 <res FBEh>              alignb 4096
  2693                                  
  2694                                  Audio_Buffer:
  2695 0000F000 <res 8000h>             		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2696                                  ;temp_buffer:
  2697                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2698                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2699                                  
  2700 00017000 <res 9000h>             alignb 65536
  2701                                  
  2702                                  DMA_Buffer:
  2703 00020000 <res 10000h>            		resb 65536	
  2704                                  file_buffer:
  2705 00030000 <res 60000h>            		resb 65536*6
  2706                                  EOF:
