     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: 28/10/2017 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of '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[9B520000]            	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 E81B020000              	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
   146                              <1> 
   146                              <1> 
   146                              <1> 
   146                              <1> 
   146                              <1>  %if %0 >= 2
   146 0000001A BB[40020000]        <1>  mov ebx, %2
   146                              <1>  %if %0 >= 3
   146 0000001F B9FF000000          <1>  mov ecx, %3
   146                              <1>  %if %0 = 4
   146 00000024 BA0F000000          <1>  mov edx, %4
   146                              <1>  %endif
   146                              <1>  %endif
   146                              <1>  %endif
   146 00000029 B823000000          <1>  mov eax, %1
   146                              <1> 
   146 0000002E CD40                <1>  int 40h
   147 00000030 E9DD010000                      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 0F82DA010000            	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 0F84C8010000            	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
   189                              <1> 
   189                              <1> 
   189                              <1> 
   189                              <1> 
   189                              <1>  %if %0 >= 2
   189 00000075 BB[7A510000]        <1>  mov ebx, %2
   189                              <1>  %if %0 >= 3
   189 0000007A B9FF000000          <1>  mov ecx, %3
   189                              <1>  %if %0 = 4
   189 0000007F BA0F000000          <1>  mov edx, %4
   189                              <1>  %endif
   189                              <1>  %endif
   189                              <1>  %endif
   189 00000084 B823000000          <1>  mov eax, %1
   189                              <1> 
   189 00000089 CD40                <1>  int 40h
   190                                  _1:
   191                                  	; 19/06/2017
   192                                  	; Allocate Audio Buffer (for user)
   193                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   193                              <1> 
   193                              <1> 
   193                              <1> 
   193                              <1> 
   193                              <1>  %if %0 >= 2
   193 0000008B BB00020000          <1>  mov ebx, %2
   193                              <1>  %if %0 >= 3
   193 00000090 B900800000          <1>  mov ecx, %3
   193                              <1>  %if %0 = 4
   193 00000095 BA[00F00000]        <1>  mov edx, %4
   193                              <1>  %endif
   193                              <1>  %endif
   193                              <1>  %endif
   193 0000009A B820000000          <1>  mov eax, %1
   193                              <1> 
   193 0000009F CD40                <1>  int 40h
   194 000000A1 0F8214010000            	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 
   202                              <1> 
   202                              <1> 
   202                              <1> 
   202                              <1> 
   202                              <1>  %if %0 >= 2
   202 000000A7 BB00030000          <1>  mov ebx, %2
   202                              <1>  %if %0 >= 3
   202 000000AC B901000000          <1>  mov ecx, %3
   202                              <1>  %if %0 = 4
   202 000000B1 BA[BD520000]        <1>  mov edx, %4
   202                              <1>  %endif
   202                              <1>  %endif
   202                              <1>  %endif
   202 000000B6 B820000000          <1>  mov eax, %1
   202                              <1> 
   202 000000BB CD40                <1>  int 40h
   203 000000BD 0F82F8000000            	jc	error_exit
   204                                  
   205                                  LoadMod:  
   206 000000C3 BF[F0DF0000]            	mov	edi, mod_file_name
   207 000000C8 E856020000              	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
   213                              <1> 
   213                              <1> 
   213                              <1> 
   213                              <1> 
   213                              <1>  %if %0 >= 2
   213 000000CF BB[AE510000]        <1>  mov ebx, %2
   213                              <1>  %if %0 >= 3
   213 000000D4 B9FF000000          <1>  mov ecx, %3
   213                              <1>  %if %0 = 4
   213 000000D9 BA0F000000          <1>  mov edx, %4
   213                              <1>  %endif
   213                              <1>  %endif
   213                              <1>  %endif
   213 000000DE B823000000          <1>  mov eax, %1
   213                              <1> 
   213 000000E3 CD40                <1>  int 40h
   214 000000E5 E928010000              	jmp     Exit
   215                                  _3:
   216                                  	; 10/06/2017
   217                                  	sys	_audio, 0E00h ; get audio controller info
   217                              <1> 
   217                              <1> 
   217                              <1> 
   217                              <1> 
   217                              <1>  %if %0 >= 2
   217 000000EA BB000E0000          <1>  mov ebx, %2
   217                              <1>  %if %0 >= 3
   217                              <1>  mov ecx, %3
   217                              <1>  %if %0 = 4
   217                              <1>  mov edx, %4
   217                              <1>  %endif
   217                              <1>  %endif
   217                              <1>  %endif
   217 000000EF B820000000          <1>  mov eax, %1
   217                              <1> 
   217 000000F4 CD40                <1>  int 40h
   218 000000F6 0F82BF000000            	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[BC520000]            	mov	[ac97_int_ln_reg], al
   234 00000101 891D[AC520000]          	mov	[dev_vendor], ebx
   235 00000107 890D[B0520000]          	mov	[bus_dev_fn], ecx
   236 0000010D 668915[B8520000]        	mov	[ac97_NamBar], dx
   237                                  	;mov	[ac97_NamBar], dx
   238                                  	;shr	dx, 16
   239                                  	;mov	[ac97_NabmBar], dx
   240 00000114 8915[B8520000]          	mov	[ac97_NamBar], edx	
   241                                    
   242 0000011A E8BE0A0000              	call	write_audio_dev_info 
   243                                  
   244                                  PlayNow: 
   245 0000011F E8D8090000              	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 E877080000              	call	GetSamples
   253 00000133 0F8282000000            	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 00000139 66B90001                	mov	cx, 256
   268 0000013D 31DB                    	xor	ebx, ebx
   269 0000013F BF[F0D50000]            	mov	edi, RowOfs
   270                                  MakeOfs:
   271 00000144 66B88000                	mov	ax, 128
   272 00000148 66F7E3                  	mul	bx
   273 0000014B 88E0                    	mov	al, ah
   274 0000014D B450                    	mov	ah, 80
   275 0000014F F6E4                    	mul	ah
   276 00000151 66AB                    	stosw
   277 00000153 43                      	inc	ebx
   278 00000154 E2EE                    	loop	MakeOfs
   279                                  	
   280                                  	; 23/06/2017
   281                                  	; Map DMA buffer to user's memory space
   282                                  	sys	_audio, 0D00h, 65536, DMA_Buffer
   282                              <1> 
   282                              <1> 
   282                              <1> 
   282                              <1> 
   282                              <1>  %if %0 >= 2
   282 00000156 BB000D0000          <1>  mov ebx, %2
   282                              <1>  %if %0 >= 3
   282 0000015B B900000100          <1>  mov ecx, %3
   282                              <1>  %if %0 = 4
   282 00000160 BA[00000200]        <1>  mov edx, %4
   282                              <1>  %endif
   282                              <1>  %endif
   282                              <1>  %endif
   282 00000165 B820000000          <1>  mov eax, %1
   282                              <1> 
   282 0000016A CD40                <1>  int 40h
   283                                  	;jc	error_exit
   284                                  
   285                                  	; 24/06/2017
   286                                  	; Set Master Volume Level (BL=0 or 80h)
   287                                  	; 	 	for next playing (BL>=80h)
   288                                  	sys	_audio, 0B80h, 1D1Dh
   288                              <1> 
   288                              <1> 
   288                              <1> 
   288                              <1> 
   288                              <1>  %if %0 >= 2
   288 0000016C BB800B0000          <1>  mov ebx, %2
   288                              <1>  %if %0 >= 3
   288 00000171 B91D1D0000          <1>  mov ecx, %3
   288                              <1>  %if %0 = 4
   288                              <1>  mov edx, %4
   288                              <1>  %endif
   288                              <1>  %endif
   288                              <1>  %endif
   288 00000176 B820000000          <1>  mov eax, %1
   288                              <1> 
   288 0000017B CD40                <1>  int 40h
   289                                  
   290                                  	; 20/10/2017
   291 0000017D C605[41E00000]1D        	mov	byte [volume_level], 1Dh
   292                                  
   293                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   294                                  	
   295                                  	; Start	to play
   296 00000184 A0[F1510000]            	mov	al, [bps]
   297 00000189 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   298 0000018C D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   299 0000018E 8A1D[F0510000]          	mov	bl, [stmo]
   300 00000194 FECB                    	dec	bl
   301 00000196 08C3                    	or	bl, al
   302 00000198 668B0D[F2510000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   303 0000019F B704                    	mov	bh, 4 ; start to play	
   304                                  	sys	_audio
   304                              <1> 
   304                              <1> 
   304                              <1> 
   304                              <1> 
   304                              <1>  %if %0 >= 2
   304                              <1>  mov ebx, %2
   304                              <1>  %if %0 >= 3
   304                              <1>  mov ecx, %3
   304                              <1>  %if %0 = 4
   304                              <1>  mov edx, %4
   304                              <1>  %endif
   304                              <1>  %endif
   304                              <1>  %endif
   304 000001A1 B820000000          <1>  mov eax, %1
   304                              <1> 
   304 000001A6 CD40                <1>  int 40h
   305                                      
   306                                  	;; SETUP SIGNAL RESPONSE BYTE
   307                                  	;; 06/03/2017
   308                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   309                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   310                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   311                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   312                                  	;sys	_calbac
   313                                  	;jc	short error_exit
   314                                  
   315                                  	; DIRECT VGA MEMORY ACCESS
   316                                  	; bl = 0, bh = 5
   317                                  	; Direct access/map to VGA memory (0A0000h)
   318                                  
   319                                  	sys	_video, 0500h
   319                              <1> 
   319                              <1> 
   319                              <1> 
   319                              <1> 
   319                              <1>  %if %0 >= 2
   319 000001A8 BB00050000          <1>  mov ebx, %2
   319                              <1>  %if %0 >= 3
   319                              <1>  mov ecx, %3
   319                              <1>  %if %0 = 4
   319                              <1>  mov edx, %4
   319                              <1>  %endif
   319                              <1>  %endif
   319                              <1>  %endif
   319 000001AD B81F000000          <1>  mov eax, %1
   319                              <1> 
   319 000001B2 CD40                <1>  int 40h
   320 000001B4 3D00000A00              	cmp	eax, 0A0000h
   321 000001B9 7418                    	je	short _a3
   322                                  error_exit:
   323                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   323                              <1> 
   323                              <1> 
   323                              <1> 
   323                              <1> 
   323                              <1>  %if %0 >= 2
   323 000001BB BB[CB510000]        <1>  mov ebx, %2
   323                              <1>  %if %0 >= 3
   323 000001C0 B9FF000000          <1>  mov ecx, %3
   323                              <1>  %if %0 = 4
   323 000001C5 BA0E000000          <1>  mov edx, %4
   323                              <1>  %endif
   323                              <1>  %endif
   323                              <1>  %endif
   323 000001CA B823000000          <1>  mov eax, %1
   323                              <1> 
   323 000001CF CD40                <1>  int 40h
   324 000001D1 EB3F                    	jmp	short Exit
   325                                  
   326                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   327                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   328                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   329                                  ;       second, or the module will sound "looped".
   330                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   331                                  ;       the polling is called from my routine, and then the irq 0 must be
   332                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   333                                  ;       samples played by the Sound Blaster. Note that some samples are
   334                                  ;       discarded in the next code, just for fun!
   335                                  
   336                                  _a3:
   337                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   338                                  	;int     31h
   339                                  
   340                                  	; 21/10/2017
   341                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   342                                  	;int	31h
   343                                  
   344                                  	; 22/10/2017
   345 000001D3 E8D00B0000              	call	setgraphmode	; Set video mode to 640*480x16
   346                                  
   347                                  	; 22/10/2017
   348                                  	;call	loadlbm
   349                                  	;jc	short loadlbm_err
   350                                  
   351 000001D8 BE[D80F0000]            	mov	esi, LOGO_ADDRESS
   352 000001DD E8BC0C0000              	call	putlbm
   353                                  	;jnc	short loadlbm_ok
   354 000001E2 731F                    	jnc	short _a4 ; 
   355                                  
   356                                  	;mov	byte [error_color], 0Eh ; Yellow
   357                                  
   358                                  loadlbm_err:
   359                                  	; 21/10/2017
   360                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   361                                  	;int	31h
   362                                  	; 22/10/2017
   363 000001E4 E8DC0B0000              	call	settextmode
   364                                  
   365                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
   365                              <1> 
   365                              <1> 
   365                              <1> 
   365                              <1> 
   365                              <1>  %if %0 >= 2
   365 000001E9 BB[AC0F0000]        <1>  mov ebx, %2
   365                              <1>  %if %0 >= 3
   365 000001EE B9FF000000          <1>  mov ecx, %3
   365                              <1>  %if %0 = 4
   365 000001F3 8B15[02020000]      <1>  mov edx, %4
   365                              <1>  %endif
   365                              <1>  %endif
   365                              <1>  %endif
   365 000001F9 B823000000          <1>  mov eax, %1
   365                              <1> 
   365 000001FE CD40                <1>  int 40h
   366 00000200 EB10                    	jmp	short Exit
   367                                  
   368                                  	; 21/10/2017
   369                                  error_color:
   370 00000202 0C                      	db	0Ch  ; Light Red
   371                                  	
   372                                  loadlbm_ok: 
   373                                  	; 21/10/2017
   374                                  _a4:
   375                                  	; 24/06/2017
   376 00000203 E863000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   377                                  
   378                                  _s_exit:
   379 00000208 E89F090000              	call	StopPlaying	; STOP!
   380                                  	
   381                                  	; 22/10/2017
   382                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   383                                  	;int	31h
   384 0000020D E8B30B0000              	call	settextmode
   385                                  Exit:           
   386                                  	;call	FreeModule	; Free MODule core.
   387                                  	
   388                                  	sys 	_exit	; Bye !
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1> 
   388                              <1>  %if %0 >= 2
   388                              <1>  mov ebx, %2
   388                              <1>  %if %0 >= 3
   388                              <1>  mov ecx, %3
   388                              <1>  %if %0 = 4
   388                              <1>  mov edx, %4
   388                              <1>  %endif
   388                              <1>  %endif
   388                              <1>  %endif
   388 00000212 B801000000          <1>  mov eax, %1
   388                              <1> 
   388 00000217 CD40                <1>  int 40h
   389                                  here:
   390 00000219 EBFE                    	jmp	short here
   391                                  
   392                                  pmsg_usage:
   393                                  	sys	_msg, msg_usage, 255, 0Fh
   393                              <1> 
   393                              <1> 
   393                              <1> 
   393                              <1> 
   393                              <1>  %if %0 >= 2
   393 0000021B BB[11510000]        <1>  mov ebx, %2
   393                              <1>  %if %0 >= 3
   393 00000220 B9FF000000          <1>  mov ecx, %3
   393                              <1>  %if %0 = 4
   393 00000225 BA0F000000          <1>  mov edx, %4
   393                              <1>  %endif
   393                              <1>  %endif
   393                              <1>  %endif
   393 0000022A B823000000          <1>  mov eax, %1
   393                              <1> 
   393 0000022F CD40                <1>  int 40h
   394 00000231 EBDF                    	jmp	short Exit
   395                                  
   396                                  DetectICH:
   397                                  	; 24/06/2017
   398                                  	; Detect (BH=1) AC97 (BL=2) Audio Controller
   399                                          sys	_audio, 0102h
   399                              <1> 
   399                              <1> 
   399                              <1> 
   399                              <1> 
   399                              <1>  %if %0 >= 2
   399 00000233 BB02010000          <1>  mov ebx, %2
   399                              <1>  %if %0 >= 3
   399                              <1>  mov ecx, %3
   399                              <1>  %if %0 = 4
   399                              <1>  mov edx, %4
   399                              <1>  %endif
   399                              <1>  %endif
   399                              <1>  %endif
   399 00000238 B820000000          <1>  mov eax, %1
   399                              <1> 
   399 0000023D CD40                <1>  int 40h
   400 0000023F C3                      	retn
   401                                  
   402                                  noDevMsg:
   403 00000240 4572726F723A20556E-     	db "Error: Unable to find AC97 audio device!",13,10,0
   403 00000249 61626C6520746F2066-
   403 00000252 696E64204143393720-
   403 0000025B 617564696F20646576-
   403 00000264 696365210D0A00     
   404                                  
   405                                  ;ac97_int_handler:
   406                                  ;	; 19/06/2017
   407                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   408                                  ;
   409                                  ;	sys	_rele ; return from callback service 
   410                                  ;	; we must not come here !
   411                                  ;	sys	_exit
   412                                  
   413                                  ;=============================================================================
   414                                  ;      
   415                                  ;=============================================================================
   416                                  
   417                                  PlayMod:
   418                                  	; 27/10/2017
   419                                  	; 19/10/2017
   420                                  	; 23/06/2017   
   421                                  	; 21/06/2017
   422                                  	; 19/06/2017
   423                                  
   424                                  	; 05/03/2017 (TRDOS 386)
   425                                  	; 14/02/2017
   426                                  	; 13/02/2017
   427                                  	; 08/12/2016
   428                                  	; 28/11/2016
   429                                  
   430 0000026B EB10                         	jmp	short modp_gs ; 23/06/2017
   431                                  p_loop:
   432 0000026D 803D[BD520000]00        	cmp	byte [srb], 0
   433 00000274 761C                    	jna	short q_loop
   434 00000276 C605[BD520000]00        	mov	byte [srb], 0
   435                                  modp_gs:
   436 0000027D BF[00F00000]            	mov	edi, Audio_Buffer
   437                                  	; 19/10/2017
   438                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   439 00000282 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   440 00000287 E81E070000              	call	GetSamples
   441 0000028C 0F8229FFFFFF            	jc	error_exit
   442                                  q_loop:
   443 00000292 B401                    	mov     ah, 1		; any key pressed?
   444 00000294 CD32                    	int     32h		; no, Loop.
   445 00000296 745C                    	jz	short r_loop
   446                                  
   447 00000298 B400                    	mov     ah, 0		; flush key buffer...
   448 0000029A CD32                    	int     32h
   449                                  
   450                                  	; 19/10/2017 (modplay6.s)
   451 0000029C 3C20                    	cmp	al, 20h
   452 0000029E 740E                    	je	short change_pan
   453                                  	; 09/10/2017 (playmod5.s)
   454 000002A0 3C2B                    	cmp	al, '+' ; increase sound volume
   455 000002A2 741D                    	je	short inc_volume_level
   456 000002A4 3C2D                    	cmp	al, '-'
   457 000002A6 743C                    	je	short dec_volume_level
   458                                  
   459                                  	; 19/10/2017 (modplay6.s)
   460 000002A8 24DF                    	and	al, 0DFh
   461 000002AA 3C50                    	cmp	al, 'P'
   462 000002AC 7545                    	jne	short q_return
   463                                  
   464                                  change_pan:
   465                                  	; 19/10/2017 (modplay6.s)
   466 000002AE 8A0D[40E00000]          	mov	cl, [pan_shift]
   467 000002B4 FEC1                    	inc	cl
   468 000002B6 80E103                  	and	cl, 3
   469 000002B9 880D[40E00000]          	mov	[pan_shift], cl
   470 000002BF EB33                    	jmp	short r_loop
   471                                  
   472                                  	; 09/10/2017 (playmod5.s)
   473                                  	; 24/06/2017 (wavplay2.s)
   474                                  inc_volume_level:
   475 000002C1 8A0D[41E00000]          	mov	cl, [volume_level]
   476 000002C7 80F91F                  	cmp	cl, 1Fh ; 31
   477 000002CA 7328                    	jnb	short r_loop
   478 000002CC FEC1                    	inc	cl
   479                                  change_volume_level:
   480 000002CE 880D[41E00000]          	mov	[volume_level], cl
   481 000002D4 88CD                    	mov	ch, cl
   482                                  	; Set Master Volume Level
   483                                  	sys	_audio, 0B00h
   483                              <1> 
   483                              <1> 
   483                              <1> 
   483                              <1> 
   483                              <1>  %if %0 >= 2
   483 000002D6 BB000B0000          <1>  mov ebx, %2
   483                              <1>  %if %0 >= 3
   483                              <1>  mov ecx, %3
   483                              <1>  %if %0 = 4
   483                              <1>  mov edx, %4
   483                              <1>  %endif
   483                              <1>  %endif
   483                              <1>  %endif
   483 000002DB B820000000          <1>  mov eax, %1
   483                              <1> 
   483 000002E0 CD40                <1>  int 40h
   484 000002E2 EB10                    	jmp	short r_loop
   485                                  dec_volume_level:
   486 000002E4 8A0D[41E00000]          	mov	cl, [volume_level]
   487 000002EA 80F901                  	cmp	cl, 1 ; 1
   488 000002ED 7605                    	jna	short r_loop
   489 000002EF FEC9                    	dec	cl
   490 000002F1 EBDB                    	jmp	short change_volume_level
   491                                  
   492                                  q_return:
   493 000002F3 C3                      	retn
   494                                  r_loop:
   495                                  	; 27/10/2017
   496                                  	; Get Current DMA buffer Pointer 
   497                                  	; 23/06/2017 ('modplay6.s')
   498                                  	; bh = 15, get current pointer (DMA buffer offset)
   499                                  	; bl = 0, for PCM OUT
   500                                  	; ecx = 0
   501                                  	;
   502                                  	sys	_audio, 0F00h, 0
   502                              <1> 
   502                              <1> 
   502                              <1> 
   502                              <1> 
   502                              <1>  %if %0 >= 2
   502 000002F4 BB000F0000          <1>  mov ebx, %2
   502                              <1>  %if %0 >= 3
   502 000002F9 B900000000          <1>  mov ecx, %3
   502                              <1>  %if %0 = 4
   502                              <1>  mov edx, %4
   502                              <1>  %endif
   502                              <1>  %endif
   502                              <1>  %endif
   502 000002FE B820000000          <1>  mov eax, %1
   502                              <1> 
   502 00000303 CD40                <1>  int 40h
   503                                  
   504                                  	; 28/10/2017
   505 00000305 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   506                                  	; 23/06/2017
   507 00000307 BE[00000200]            	mov     esi, DMA_Buffer
   508 0000030C 01C6                    	add     esi, eax	; add offset value
   509                                  	; 24/06/2017
   510 0000030E B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   511 00000313 39CE                    	cmp	esi, ecx 
   512 00000315 7602                    	jna	short _4
   513 00000317 89CE                    	mov	esi, ecx
   514                                  _4:
   515                                  	; 23/10/2017 ('tmodplay.s')
   516 00000319 E8AE0A0000              	call	drawscopes
   517                                  
   518 0000031E E94AFFFFFF              	jmp	p_loop
   519                                  
   520                                  ;=============================================================================
   521                                  ;               MODLOAD.ASM
   522                                  ;=============================================================================
   523                                  
   524                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   525                                  ;	July 10th, 1993.
   526                                  
   527                                  ; STRUCTURES
   528                                  
   529                                  struc ModSample
   530 00000000 <res 00000016>          .msName:	resb 22
   531 00000016 <res 00000002>          .msLength:	resw 1
   532 00000018 <res 00000001>          .msFinetune:	resb 1
   533 00000019 <res 00000001>          .msVolume:	resb 1
   534 0000001A <res 00000002>          .msRepeat:	resw 1
   535 0000001C <res 00000002>          .msRepLen:	resw 1
   536                                  .size:		; 30 bytes
   537                                  endstruc
   538                                  
   539                                  struc ModHeader
   540 00000000 <res 00000014>          .mhName:	resb 20
   541 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   542 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   543 000003B7 <res 00000001>          .mhReStart:	resb 1
   544 000003B8 <res 00000080>          .mhOrder:	resb 128
   545 00000438 <res 00000004>          .mhSign:	resw 2
   546                                  .size:		; 1084 bytes
   547                                  endstruc
   548                                  
   549                                  struc ModInfoRec
   550 00000000 <res 00000001>          .OrderLen:	resb 1
   551 00000001 <res 00000001>          .ReStart:	resb 1
   552 00000002 <res 00000080>          .Order:		resb 128
   553 00000082 <res 00000004>          .Patterns:	resd 1
   554 00000086 <res 0000003E>          .SampOfs:	resw 31
   555 000000C4 <res 0000003E>          .SampSeg:	resw 31
   556 00000102 <res 0000003E>          .SampLen:	resw 31
   557 00000140 <res 0000003E>          .SampRep:	resw 31
   558 0000017E <res 0000003E>          .SampRepLen:	resw 31
   559 000001BC <res 0000003E>          .SampVol:	resw 31
   560                                  .size:		; 506 bytes	
   561                                  endstruc
   562                                  
   563                                  ; CODE
   564                                  
   565                                  ; modplay5.s
   566                                  ; 07/10/2017
   567                                  ; tinyply3.s
   568                                  ; 06/10/2017
   569                                  ; 04/10/2017
   570                                  ; /* MOD FileFormat */
   571                                  
   572                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   573                                  ID_FLT4 equ 34544C46h ; "FLT4"
   574                                  ID_8CHN equ 4E484338h ; "8CHN"
   575                                  ID_FLT8 equ 34544C46h ; "FLT8"
   576                                  
   577                                  ; CODE
   578                                  
   579                                  LoadModule:
   580                                  	; edi = file name address
   581                                  
   582 00000323 60                      	pushad
   583                                  
   584 00000324 E878010000              	call    ClearModInfo
   585                                  OpenFile:       
   586                                  	; ebx = ASCIIZ file name address
   587                                  	; ecx = open mode (0 = open for read)	
   588                                  	sys	_open, edi, 0 ; open for reading
   588                              <1> 
   588                              <1> 
   588                              <1> 
   588                              <1> 
   588                              <1>  %if %0 >= 2
   588 00000329 89FB                <1>  mov ebx, %2
   588                              <1>  %if %0 >= 3
   588 0000032B B900000000          <1>  mov ecx, %3
   588                              <1>  %if %0 = 4
   588                              <1>  mov edx, %4
   588                              <1>  %endif
   588                              <1>  %endif
   588                              <1>  %endif
   588 00000330 B805000000          <1>  mov eax, %1
   588                              <1> 
   588 00000335 CD40                <1>  int 40h
   589 00000337 0F8262010000            	jc	Failed
   590 0000033D A3[BE520000]            	mov     [FileHandle], eax
   591                                  ReadHeader:
   592                                  	; ebx = File handle
   593                                  	; ecx = Buffer address
   594                                  	; edx = Byte count
   595                                  	sys	_read, [FileHandle], Header, ModHeader.size
   595                              <1> 
   595                              <1> 
   595                              <1> 
   595                              <1> 
   595                              <1>  %if %0 >= 2
   595 00000342 8B1D[BE520000]      <1>  mov ebx, %2
   595                              <1>  %if %0 >= 3
   595 00000348 B9[C2520000]        <1>  mov ecx, %3
   595                              <1>  %if %0 = 4
   595 0000034D BA3C040000          <1>  mov edx, %4
   595                              <1>  %endif
   595                              <1>  %endif
   595                              <1>  %endif
   595 00000352 B803000000          <1>  mov eax, %1
   595                              <1> 
   595 00000357 CD40                <1>  int 40h
   596 00000359 0F8231010000            	jc      CloseFile
   597                                  CheckMK:  
   598                                  	; 04/10/2017
   599 0000035F A1[FA560000]            	mov	eax, [Header+ModHeader.mhSign]
   600                                        
   601 00000364 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   602                                  	;je	short Is4chnMod
   603 00000369 742B                    	je	short IsModFile
   604                                  CheckFLT4:
   605 0000036B 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   606                                  	;je	short Is4chnMod
   607 00000370 7424                    	je	short IsModFile
   608                                  Check8CHN:
   609 00000372 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   610 00000377 740D                    	je	short Is8chnMod
   611                                  CheckFLT8:
   612 00000379 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   613                                  	; 06/10/2017
   614 0000037E 7406                    	je	short Is8chnMod
   615 00000380 F9                      	stc
   616 00000381 E90A010000              	jmp	CloseFile
   617                                  Is8chnMod:
   618 00000386 C605[EC510000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   619 0000038D C605[EB510000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   620 00000394 EB00                    	jmp	short IsModFile
   621                                  ;Is4chnMod:
   622                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   623                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   624                                  
   625                                  IsModFile:
   626 00000396 A0[78560000]            	mov     al, [Header+ModHeader.mhOrderLen]
   627 0000039B A2[FE560000]            	mov     [ModInfo.OrderLen], al
   628                                  
   629 000003A0 A0[79560000]            	mov     al, [Header+ModHeader.mhReStart]
   630 000003A5 3A05[78560000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   631 000003AB 7202                    	jb      short SetReStart
   632 000003AD B07F                    	mov     al, 7Fh
   633                                  SetReStart:
   634 000003AF A2[FF560000]            	mov     [ModInfo.ReStart], al
   635                                  
   636                                  	;mov	ecx, 128
   637 000003B4 66B98000                	mov	cx, 128
   638 000003B8 31D2                    	xor     edx, edx
   639 000003BA 31DB                    	xor     ebx, ebx
   640                                  CopyOrder:
   641 000003BC 8AB3[7A560000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   642 000003C2 88B3[00570000]          	mov     [ModInfo.Order+ebx], dh
   643 000003C8 38D6                    	cmp     dh, dl
   644 000003CA 7202                    	jb      short NextOrder
   645 000003CC 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   646                                  NextOrder:
   647 000003CE 43                      	inc     ebx
   648 000003CF E2EB                    	loop    CopyOrder
   649                                  AllocPatterns:  
   650 000003D1 81E2FF000000            	and	edx, 0FFh
   651                                  	; 04/10/2017
   652                                  	;inx	dx  ; 12/03/2017
   653 000003D7 FEC2                    	inc	dl
   654                                  	; dl = number of patterns (04/07/2017)
   655 000003D9 8A0D[EB510000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   656 000003DF D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   657                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   658                                  	;
   659 000003E1 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   660                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   661 000003E3 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   662                                  	;
   663 000003E8 890D[80570000]          	mov	[ModInfo.Patterns], ecx
   664                                  	;
   665 000003EE 01CD                    	add	ebp, ecx ; next offset for samples
   666                                  ReadPatterns:  
   667                                  	;mov	ebx, [FileHandle] 
   668                                  	; ebx = File handle
   669                                  	; ecx = Buffer address
   670                                  	; edx = Byte count
   671                                  	sys	_read, [FileHandle]
   671                              <1> 
   671                              <1> 
   671                              <1> 
   671                              <1> 
   671                              <1>  %if %0 >= 2
   671 000003F0 8B1D[BE520000]      <1>  mov ebx, %2
   671                              <1>  %if %0 >= 3
   671                              <1>  mov ecx, %3
   671                              <1>  %if %0 = 4
   671                              <1>  mov edx, %4
   671                              <1>  %endif
   671                              <1>  %endif
   671                              <1>  %endif
   671 000003F6 B803000000          <1>  mov eax, %1
   671                              <1> 
   671 000003FB CD40                <1>  int 40h
   672 000003FD 0F828D000000            	jc      CloseFile
   673                                  
   674                                  	; patterns have been loaded here... (04/07/2017)
   675                                  
   676 00000403 BE[D6520000]            	mov	esi, Header+ModHeader.mhSamples
   677 00000408 31FF                    	xor     edi, edi
   678                                  CopySamples:
   679 0000040A 668B4616                	mov     ax, [esi+ModSample.msLength]
   680 0000040E 86C4                    	xchg    al, ah
   681 00000410 66D1E0                  	shl     ax, 1
   682 00000413 668987[00580000]        	mov     [ModInfo.SampLen+edi], ax
   683 0000041A 8A4619                  	mov     al, [esi+ModSample.msVolume]
   684 0000041D 30E4                    	xor     ah, ah
   685 0000041F 668987[BA580000]        	mov     [ModInfo.SampVol+edi], ax
   686 00000426 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   687 0000042A 86C4                    	xchg    al, ah
   688 0000042C 66D1E0                  	shl     ax, 1
   689 0000042F 668987[3E580000]        	mov     [ModInfo.SampRep+edi], ax
   690 00000436 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   691 0000043A 86C4                    	xchg    al, ah
   692 0000043C 66D1E0                  	shl     ax, 1
   693 0000043F 668987[7C580000]        	mov     [ModInfo.SampRepLen+edi], ax
   694 00000446 83C61E                  	add     esi, ModSample.size
   695 00000449 6683C702                	add     di, 2
   696 0000044D 6683FF3E                	cmp     di, 2*31
   697 00000451 72B7                    	jb      short CopySamples
   698                                  
   699 00000453 31F6                    	xor     esi, esi
   700                                  AllocSamples:
   701 00000455 0FB796[00580000]        	movzx	edx, word [ModInfo.SampLen+esi]
   702                                  	; 07/10/2017
   703                                  	;shr	dx, 4 ; ***
   704 0000045C 21D2                    	and	edx, edx
   705 0000045E 7426                    	jz      short NextSample
   706                                  	;inc	dx  ; number of paragraphs ; ***
   707                                  	;shl	dx, 4 ; ***
   708 00000460 89E8                    	mov	eax, ebp
   709 00000462 668986[84570000]        	mov	[ModInfo.SampOfs+esi], ax
   710 00000469 C1E810                  	shr	eax, 16
   711 0000046C 668986[C2570000]        	mov	[ModInfo.SampSeg+esi], ax
   712 00000473 89E9                    	mov	ecx, ebp
   713 00000475 01D5                    	add	ebp, edx ; next offset for sample 
   714                                  ReadSample:
   715                                  	;mov	ebx, [FileHandle]
   716                                  	;movzx  edx, [ModInfo.SampLen+esi]
   717                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   718                                  
   719                                  	; ebx = File handle
   720                                  	; ecx = Buffer address
   721                                  	; edx = Byte count
   722                                  	sys	_read, [FileHandle]
   722                              <1> 
   722                              <1> 
   722                              <1> 
   722                              <1> 
   722                              <1>  %if %0 >= 2
   722 00000477 8B1D[BE520000]      <1>  mov ebx, %2
   722                              <1>  %if %0 >= 3
   722                              <1>  mov ecx, %3
   722                              <1>  %if %0 = 4
   722                              <1>  mov edx, %4
   722                              <1>  %endif
   722                              <1>  %endif
   722                              <1>  %endif
   722 0000047D B803000000          <1>  mov eax, %1
   722                              <1> 
   722 00000482 CD40                <1>  int 40h
   723 00000484 720A                    	jc      short CloseFile
   724                                  
   725                                  NextSample:
   726 00000486 6683C602                	add     si, 2
   727 0000048A 6683FE3E                	cmp     si, 2*31
   728 0000048E 72C5                    	jb      short AllocSamples
   729                                  CloseFile:      
   730 00000490 9C                      	pushf
   731                                  	sys	_close, [FileHandle]
   731                              <1> 
   731                              <1> 
   731                              <1> 
   731                              <1> 
   731                              <1>  %if %0 >= 2
   731 00000491 8B1D[BE520000]      <1>  mov ebx, %2
   731                              <1>  %if %0 >= 3
   731                              <1>  mov ecx, %3
   731                              <1>  %if %0 = 4
   731                              <1>  mov edx, %4
   731                              <1>  %endif
   731                              <1>  %endif
   731                              <1>  %endif
   731 00000497 B806000000          <1>  mov eax, %1
   731                              <1> 
   731 0000049C CD40                <1>  int 40h
   732 0000049E 9D                      	popf
   733                                  Failed:       
   734 0000049F 61                      	popad
   735 000004A0 C3                      	retn
   736                                  
   737                                  FreeModule:
   738                                  	; Erdogan Tan (13/02/2017)
   739                                  	; nothing to do here for memory de-allocation
   740                                  ClearModInfo:
   741 000004A1 57                      	push	edi
   742 000004A2 BF[FE560000]            	mov	edi, ModInfo
   743 000004A7 B9FA010000              	mov     ecx, ModInfoRec.size
   744                                  	;cld
   745 000004AC 30C0                    	xor     al, al
   746 000004AE F3AA                    	rep     stosb
   747 000004B0 5F                      	pop	edi
   748 000004B1 C3                      	retn
   749                                  
   750                                  ;=============================================================================
   751                                  ;               MODPLAY.ASM
   752                                  ;=============================================================================
   753                                  
   754                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   755                                  ;	July 23th, 1993.
   756                                  
   757                                  ; EQUATES
   758                                  
   759                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   760                                  DefTempo        equ 6
   761                                  DefBpm          equ 125
   762                                  MidCRate        equ 8448
   763                                  MixBufSize	equ 4096
   764                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   765                                  
   766                                  ; STRUCTURES
   767                                  
   768                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   769 00000000 <res 00000004>          .Samples:	resd 1
   770                                  ;.Position:	resw 1
   771 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   772 00000008 <res 00000002>          .Len:		resw 1
   773 0000000A <res 00000002>          .Repeat:	resw 1
   774 0000000C <res 00000002>          .RepLen:	resw 1
   775 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   776 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   777                                  ;.Error:	resb 1
   778                                  ;.Reserved:	resb 1 ; 01/10/2017
   779 00000010 <res 00000002>          .Period:	resw 1 ; Period
   780 00000012 <res 00000002>          .Pitch:		resw 1 
   781 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   782 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   783 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   784 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   785 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   786 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   787 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   788                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   789 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
   790 0000001E <res 00000006>          .Arp:		resw 3
   791 00000024 <res 00000002>          .ArpIndex:	resw 1
   792                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   793                                  endstruc
   794                                  
   795                                  ; CODE
   796                                  
   797                                  ;--------------------------------------------------------------------------
   798                                  ; updatechannel - update the track using the current effect
   799                                  ;--------------------------------------------------------------------------
   800                                  ; 
   801                                  ;--------------------------------------------------------------------------
   802                                  ; 	Track:  Process the next 	 in one track.
   803                                  ;  In:
   804                                  ;    ds:di -  Track info Address.
   805                                  ;--------------------------------------------------------------------------
   806                                  
   807                                  ; edi = Track info address
   808                                  
   809                                  updatechannel:
   810                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   811                                  
   812 000004B2 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   813                                  
   814                                  	;test   dx, dx
   815                                  	;je     short None
   816                                  	;cmp    dh, 00h
   817                                  	;je     short Arpeggio
   818                                  	;cmp    dh, 01h
   819                                  	;je     short PortUp
   820                                  	;cmp    dh, 02h
   821                                  	;je     short PortDown
   822                                  	;cmp    dh, 03h
   823                                  	;je     TonePort
   824                                  	;cmp    dh, 04h
   825                                  	;je     Vibrato
   826                                  	;cmp    dh, 05h
   827                                  	;je     PortSlide
   828                                  	;cmp    dh, 06h
   829                                  	;je     VibSlide
   830                                  	;cmp    dh, 0Ah
   831                                  	;je     VolSlide
   832                                  	;retn
   833                                  
   834 000004B6 0FB6C6                  	movzx	eax, dh
   835 000004B9 240F                    	and	al, 0Fh
   836 000004BB FF2485[08500000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   837                                  efxnull:
   838                                  None:           
   839 000004C2 C3                      	retn
   840                                  efxarpeggio2:
   841                                  	; 01/10/2017
   842 000004C3 84D2                    	test    dl, dl
   843 000004C5 74FB                    	jz      short efxnull
   844                                  Arpeggio:
   845 000004C7 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   846 000004CB 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   847 000004D0 66894712                	mov     [edi+TrackInfo.Pitch], ax
   848 000004D4 6683C302                	add     bx, 2
   849 000004D8 6683FB06                	cmp     bx, 6
   850 000004DC 7202                    	jb      short SetArpIndex
   851 000004DE 31DB                    	xor     ebx, ebx
   852                                  SetArpIndex:
   853 000004E0 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   854 000004E4 C3                      	retn
   855                                  efxportaup:
   856                                  PortUp:
   857 000004E5 30F6                    	xor     dh, dh
   858                                  	;mov	bx, [edi+TrackInfo.Period]
   859 000004E7 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   860 000004EB 6629D3                  	sub     bx, dx
   861                                  	;cmp	bx, 113
   862 000004EE 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   863 000004F2 7D04                    	jge     short NotSmall
   864                                  	;mov	bx, 113
   865 000004F4 66BB1C00                	mov	bx, 28 ; 01/10/2017
   866                                  NotSmall:
   867 000004F8 66895F10                	mov     [edi+TrackInfo.Period], bx
   868 000004FC 6601DB                  	add     bx, bx
   869                                  	;mov	ax, [PitchTable+bx]
   870 000004FF 668B83[F8580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   871 00000506 66894712                	mov     [edi+TrackInfo.Pitch], ax
   872 0000050A C3                      	retn
   873                                  efxportadown:
   874                                  PortDown:
   875 0000050B 30F6                    	xor     dh, dh
   876                                  	;mov	bx, [edi+TrackInfo.Period]
   877 0000050D 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   878 00000511 6601D3                  	add     bx, dx
   879 00000514 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   880                                  	;cmp	bx, 856
   881 00000519 7E04                    	jle     short NotBig
   882                                  	;mov	bx, 856
   883 0000051B 66BB600D                	mov	bx, 3424 ; 01/10/2017
   884                                  NotBig:         
   885 0000051F 66895F10                	mov     [edi+TrackInfo.Period], bx
   886 00000523 6601DB                  	add     bx, bx
   887                                  	;mov	ax, [PitchTable+bx]
   888 00000526 668B83[F8580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   889 0000052D 66894712                	mov     [edi+TrackInfo.Pitch], ax
   890 00000531 C3                      	retn
   891                                  efxtoneporta2:
   892                                  TonePort:
   893 00000532 30F6                    	xor     dh, dh
   894 00000534 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   895                                  	;mov	bx, [edi+TrackInfo.Period]
   896 00000538 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   897 0000053C 6639C3                  	cmp     bx, ax
   898 0000053F 7429                    	je      short NoPort
   899 00000541 7F0D                    	jg      short PortToUp
   900                                  PortToDown:     
   901 00000543 6601D3                  	add     bx, dx
   902 00000546 6639C3                  	cmp     bx, ax
   903 00000549 7E0D                    	jle     short SetPort
   904                                  FixPort:        
   905 0000054B 6689C3                  	mov     bx, ax
   906 0000054E EB08                    	jmp     short SetPort
   907                                  PortToUp:
   908 00000550 6629D3                  	sub     bx, dx
   909 00000553 6639C3                  	cmp     bx, ax
   910 00000556 7CF3                    	jl      short FixPort
   911                                  SetPort:        
   912 00000558 66895F10                	mov     [edi+TrackInfo.Period], bx
   913 0000055C 6601DB                  	add     bx, bx
   914                                  	;mov	ax, [PitchTable+bx]
   915 0000055F 668B83[F8580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   916 00000566 66894712                	mov     [edi+TrackInfo.Pitch], ax
   917                                  NoPort:         
   918 0000056A C3                      	retn
   919                                  efxvibrato2:
   920                                  	; 01/10/2017
   921                                  Vibrato:
   922 0000056B 88D6                    	mov     dh, dl
   923                                  	;and	dl, 0Fh
   924                                  	;shr	dh, 4
   925                                  	;shl	dh, 2
   926 0000056D 6681E20FF0              	and     dx, 0F00Fh
   927 00000572 C0EE02                  	shr     dh, 2
   928                                  	;add	[edi+TrackInfo.VibPos], dh
   929                                  	;mov	dh, [edi+TrackInfo.VibPos]
   930                                  	;mov	bl, dh
   931 00000575 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   932 00000578 007719                  	add	[edi+TrackInfo.VibPos], dh
   933 0000057B 88DE                    	mov	dh, bl ; 01/10/2017
   934 0000057D C0EB02                  	shr     bl, 2
   935                                  	;and	bx, 1Fh
   936                                  	;mov	al, [SinTable+bx]
   937 00000580 83E31F                  	and	ebx, 1Fh
   938 00000583 8A83[F0500000]          	mov	al, [SinTable+ebx]
   939 00000589 F6E2                    	mul     dl
   940                                  	;rol	ax, 1
   941                                  	;xchg	al, ah
   942                                  	;and	ah, 1
   943 0000058B 66C1E807                	shr	ax, 7
   944 0000058F 84F6                    	test    dh, dh
   945 00000591 7903                    	jns     short VibUp
   946 00000593 66F7D8                  	neg     ax
   947                                  VibUp:          
   948 00000596 66034710                	add     ax, [edi+TrackInfo.Period]
   949 0000059A 6689C3                  	mov	bx, ax
   950                                  	;movzx	ebx, ax
   951 0000059D 6683FB71                	cmp     bx, 113
   952                                  	;cmp	bx, 113
   953 000005A1 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   954 000005A5 7D06                    	jge     short NoLoVib
   955                                  	;mov	bx, 113
   956 000005A7 66BB1C00                	mov	bx, 28	; 01/10/2017
   957 000005AB EB0B                    	jmp	short NoHiVib ; 01/10/2017	
   958                                  NoLoVib:        
   959 000005AD 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   960                                  	;cmp	bx, 856
   961 000005B2 7E04                    	jle     short NoHiVib
   962                                  	;mov	bx, 856
   963 000005B4 66BB600D                	mov	bx, 3424 ; 01/10/2017
   964                                  NoHiVib:        
   965 000005B8 6601DB                  	add     bx, bx
   966                                  	;mov	ax, [PitchTable+bx]
   967 000005BB 668B83[F8580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
   968 000005C2 66894712                	mov     [edi+TrackInfo.Pitch], ax
   969 000005C6 C3                      	retn
   970                                  efxtoneslide:
   971                                  PortSlide:
   972 000005C7 E812000000              	call    VolSlide
   973 000005CC 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
   974 000005CF E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
   975                                  efxvibslide:
   976                                  VibSlide:
   977 000005D4 E805000000              	call    VolSlide
   978 000005D9 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
   979 000005DC EB8D                    	jmp     short Vibrato  ; efxvibrato2
   980                                  efxvolslide:
   981                                  VolSlide:
   982 000005DE 88D6                    	mov     dh, dl
   983 000005E0 80E20F                  	and     dl, 0Fh
   984 000005E3 C0EE04                  	shr     dh, 4
   985 000005E6 8A470E                  	mov     al, [edi+TrackInfo.Volume]
   986 000005E9 28D0                    	sub     al, dl
   987 000005EB 7D02                    	jge     short NoLoVol
   988 000005ED 30C0                    	xor     al, al
   989                                  NoLoVol:        
   990 000005EF 00F0                    	add     al, dh
   991 000005F1 3C40                    	cmp     al, 64
   992 000005F3 7602                    	jbe     short NoHiVol
   993 000005F5 B040                    	mov     al, 64
   994                                  NoHiVol:        
   995 000005F7 88470E                  	mov     [edi+TrackInfo.Volume], al
   996 000005FA C3                      	retn
   997                                  
   998                                  efxtremolo2:
   999                                  	; 01/10/2017 (TMODPLAY.ASM)
  1000                                  Tremolo:
  1001 000005FB 88D6                    	mov     dh, dl
  1002 000005FD 6681E20FF0              	and     dx, 0F00Fh
  1003 00000602 C0EE02                  	shr     dh, 2
  1004 00000605 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1005 00000608 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1006 0000060B 88DE                    	mov	dh, bl
  1007 0000060D C0EB02                  	shr     bl, 2
  1008                                  	; 01/10/2017 - TRDOS 386
  1009                                  	;and	bx, 1Fh
  1010 00000610 83E31F                  	and	ebx, 1Fh 
  1011                                  	;mov	al, [SinTable+bx]
  1012 00000613 8A83[F0500000]          	mov     al, [SinTable+ebx]
  1013 00000619 F6E2                    	mul     dl
  1014 0000061B 66C1E806                	shr	ax, 6
  1015 0000061F 84F6                    	test    dh, dh
  1016 00000621 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1017 00000623 66F7D8                  	neg     ax
  1018                                  efxtremolof2:
  1019                                  Tremolo_1:      
  1020 00000626 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1021 00000629 00E0                    	add     al, ah
  1022 0000062B 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1023 0000062D 30C0                    	xor     al, al
  1024                                  efxtremolof3:
  1025                                  Tremolo_2:       
  1026 0000062F 3C40                    	cmp     al, 64 ; 40h
  1027 00000631 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1028 00000633 B040                    	mov     al, 64 ; 40h
  1029                                  efxtremolof4:
  1030                                  Tremolo_3:       
  1031 00000635 28E0                    	sub	al, ah  ; ****** 
  1032 00000637 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1033 0000063A C3                      	retn	
  1034                                  
  1035                                  ;--------------------------------------------------------------------------
  1036                                  ; readchannel - read the next note event from the pattern sheet
  1037                                  ;--------------------------------------------------------------------------
  1038                                  ;
  1039                                  ;--------------------------------------------------------------------------
  1040                                  ; GetTrack:   Get the next Note from a pattern.
  1041                                  ;  In:
  1042                                  ;    ds:di -  Track info Address.
  1043                                  ;    es:si -  Pattern Note Address.
  1044                                  ; Out:
  1045                                  ;    es:si -  The Next Pattern Note address.
  1046                                  ;--------------------------------------------------------------------------
  1047                                  
  1048                                  ; esi = Pattern note address
  1049                                  ; edi = Track info address
  1050                                  
  1051                                  readchannel:
  1052                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1053 0000063B 66AD                    	lodsw
  1054 0000063D 86C4                    	xchg    al, ah
  1055 0000063F 88E3                    	mov	bl, ah
  1056 00000641 80E40F                  	and     ah, 0Fh
  1057 00000644 6689C1                  	mov     cx, ax
  1058 00000647 66AD                    	lodsw
  1059 00000649 86C4                    	xchg    al, ah
  1060 0000064B 88E7                    	mov     bh, ah
  1061 0000064D 80E40F                  	and     ah, 0Fh
  1062 00000650 6689C2                  	mov     dx, ax
  1063 00000653 66895714                	mov     [edi+TrackInfo.Effect], dx
  1064                                  	; 01/10/2017 - TRDOS 386
  1065                                  	;and	bl, 0F0h
  1066 00000657 81E3F0FF0000            	and	ebx, 0FFF0h
  1067 0000065D C0EF04                  	shr     bh, 4
  1068 00000660 08FB                    	or      bl, bh
  1069 00000662 7446                    	jz      short SetPeriod
  1070                                  SetSample:
  1071 00000664 30FF                    	xor	bh, bh
  1072                                  	;and	ebx, 0FFh
  1073 00000666 FECB                    	dec     bl
  1074 00000668 01DB                    	add     ebx, ebx
  1075 0000066A 668B83[BA580000]        	mov     ax, [ModInfo.SampVol+ebx]
  1076 00000671 88470E                  	mov     [edi+TrackInfo.Volume], al
  1077 00000674 668B83[84570000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1078 0000067B 668907                  	mov     [edi+TrackInfo.Samples], ax
  1079 0000067E 668B83[C2570000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1080 00000685 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1081 00000689 668B83[00580000]        	mov     ax, [ModInfo.SampLen+ebx]
  1082 00000690 66894708                	mov     [edi+TrackInfo.Len], ax
  1083 00000694 668B83[3E580000]        	mov     ax, [ModInfo.SampRep+ebx]
  1084 0000069B 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1085 0000069F 668B83[7C580000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1086 000006A6 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1087                                  SetPeriod:      
  1088 000006AA 6685C9                  	test    cx, cx
  1089 000006AD 7425                    	jz      short SetEffect
  1090                                  
  1091 000006AF 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1092                                  	
  1093 000006B3 80FE03                  	cmp     dh, 03h
  1094                                  	;je	short SetEffect
  1095 000006B6 7428                    	je	short efxtoneporta ; 01/10/2017
  1096                                  
  1097 000006B8 66894F10                	mov     [edi+TrackInfo.Period], cx
  1098                                  	;movzx	ebx, cx
  1099 000006BC 6689CB                  	mov     bx, cx
  1100 000006BF 6601DB                  	add     bx, bx
  1101                                  	;mov	ax, [PitchTable+bx]
  1102 000006C2 668B83[F8580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1103 000006C9 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1104 000006CD C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1105                                  SetEffect:
  1106                                  	;test	dx, dx
  1107                                  	;je	short InitNone
  1108                                  	;cmp	dh, 00h
  1109                                  	;je	InitArpeggio
  1110                                  	;cmp	dh, 03h
  1111                                  	;je	short InitTonePort
  1112                                  	;cmp	dh, 04h
  1113                                  	;je	short InitVibrato
  1114                                  	;cmp	dh, 09h
  1115                                  	;je	short SampleOfs
  1116                                  	;cmp	dh, 0Bh
  1117                                  	;je	short PosJump
  1118                                  	;cmp	dh, 0Ch
  1119                                  	;je	short SetVolume
  1120                                  	;cmp	dh, 0Dh
  1121                                  	;je	short Break
  1122                                  	;cmp	dh, 0Fh
  1123                                  	;je	SetSpeed
  1124                                  	;retn
  1125                                  
  1126                                  	; 01/10/2017 (TMODPLAY.ASM)
  1127                                  	
  1128                                  	; dx = [di+TrackInfo.Effect]
  1129                                  	
  1130 000006D4 0FB6C6                  	movzx	eax, dh
  1131 000006D7 240F                    	and	al, 0Fh
  1132 000006D9 FF2485[C84F0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1133                                  ;efxnull:
  1134                                  ;InitNone:
  1135                                  ;	retn
  1136                                  efxtoneporta:
  1137                                  	; 01/10/2017
  1138                                  	; cx = period
  1139                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1140                                  InitTonePort:
  1141 000006E0 84D2                    	test    dl, dl
  1142 000006E2 7503                    	jnz     short SetPortParm
  1143 000006E4 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1144                                  SetPortParm:    
  1145 000006E7 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1146 000006EA 66895714                	mov     [edi+TrackInfo.Effect], dx
  1147 000006EE C3                      	retn
  1148                                  efxvibrato:
  1149                                  InitVibrato:
  1150 000006EF 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1151 000006F2 88C4                    	mov     ah, al
  1152                                  	;and	al, 0Fh
  1153                                  	;and	ah, 0F0h
  1154 000006F4 66250FF0                	and	ax, 0F00Fh
  1155 000006F8 F6C20F                  	test    dl, 0Fh
  1156 000006FB 7502                    	jne     short OkDepth
  1157 000006FD 08C2                    	or      dl, al
  1158                                  OkDepth:        
  1159 000006FF F6C2F0                  	test    dl, 0F0h
  1160 00000702 7502                    	jnz     short OkRate
  1161 00000704 08E2                    	or      dl, ah
  1162                                  OkRate:         
  1163 00000706 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1164 00000709 66895714                	mov     [edi+TrackInfo.Effect], dx
  1165 0000070D 6685C9                  	test    cx, cx
  1166 00000710 7404                    	jz      short OkPos
  1167 00000712 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1168                                  OkPos:          
  1169 00000716 C3                      	retn
  1170                                  efxsampoffset:
  1171                                  	; 01/10/2017 ; *******
  1172                                  SampleOfs:         
  1173                                  ;	test    dl, dl
  1174                                  ;	jnz     short SetSampleOfs
  1175                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1176                                  ;SetSampleOfs:
  1177                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1178 00000717 88D6                    	mov     dh, dl
  1179 00000719 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1180 0000071F 895704                  	mov     [edi+TrackInfo.Position], edx
  1181 00000722 C3                      	retn
  1182                                  efxpattjump:
  1183                                  PosJump:
  1184 00000723 8815[A6D40000]          	mov     [OrderPos], dl
  1185 00000729 C605[AAD40000]40        	mov     byte [Row], 64
  1186 00000730 C3                      	retn
  1187                                  efxsetvolume:
  1188                                  SetVolume:
  1189 00000731 80FA40                  	cmp     dl, 64
  1190 00000734 7602                    	jbe     short OkVol
  1191 00000736 B240                    	mov     dl, 64
  1192                                  OkVol:
  1193                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1194 00000738 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1195                                  	;mov	[edi+TrackInfo.Volume], dl
  1196 0000073A 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1197 0000073E C3                      	retn
  1198                                  efxbreak:
  1199                                  Break:
  1200 0000073F 88D6                    	mov     dh, dl
  1201 00000741 80E20F                  	and     dl, 0Fh
  1202 00000744 C0EE04                  	shr     dh, 4
  1203 00000747 00F6                    	add     dh, dh
  1204 00000749 00F2                    	add     dl, dh
  1205 0000074B C0E602                  	shl     dh, 2
  1206 0000074E 00F2                    	add     dl, dh
  1207 00000750 8815[ABD40000]          	mov     [BreakRow], dl
  1208 00000756 C605[AAD40000]40        	mov     byte [Row], 64
  1209 0000075D C3                      	retn
  1210                                  efxsetspeed:
  1211                                  SetSpeed:
  1212 0000075E 84D2                    	test    dl,dl
  1213 00000760 7432                    	je      Skip
  1214 00000762 80FA1F                  	cmp     dl,31
  1215 00000765 770D                    	ja      short SetBpm
  1216                                  SetTempo:       
  1217 00000767 8815[A7D40000]          	mov     [Tempo], dl
  1218 0000076D 8815[A8D40000]          	mov     [TempoWait], dl
  1219 00000773 C3                      	retn
  1220                                  SetBpm:
  1221 00000774 8815[A9D40000]          	mov     [Bpm], dl
  1222 0000077A B067                    	mov     al, 103
  1223 0000077C F6E2                    	mul     dl
  1224 0000077E 88E3                    	mov     bl, ah
  1225 00000780 30FF                    	xor     bh, bh
  1226 00000782 66A1[F2510000]          	mov     ax, [MixSpeed]
  1227 00000788 6631D2                  	xor     dx, dx
  1228 0000078B 66F7F3                  	div     bx
  1229 0000078E 66A3[ACD40000]          	mov     [BpmSamples], ax
  1230                                  Skip:           
  1231 00000794 C3                      	retn
  1232                                  efxarpeggio:
  1233                                  	; 01/10/2017
  1234 00000795 84D2                    	test    dl, dl
  1235                                  	;je	efxnull
  1236 00000797 74FB                    	je	short Skip
  1237                                  InitArpeggio:
  1238 00000799 88D6                    	mov     dh, dl
  1239 0000079B 80E20F                  	and     dl, 0Fh
  1240 0000079E C0EE04                  	shr     dh, 4
  1241                                  	; 01/10/2017
  1242                                  	;mov	cx, 36
  1243 000007A1 66B95400                	mov	cx, 84 ; 84 notes/periods
  1244 000007A5 31DB                    	xor     ebx, ebx
  1245 000007A7 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1246                                  gt_ScanPeriod:
  1247                                  	;cmp	ax, [PeriodTable+bx]
  1248 000007AB 663B83[48500000]        	cmp	ax, [PeriodTable+ebx]
  1249 000007B2 7306                    	jae     short SetArp
  1250 000007B4 6683C302                	add     bx, 2
  1251 000007B8 E2F1                    	loop    gt_ScanPeriod
  1252                                  SetArp:         
  1253 000007BA 6601D2                  	add     dx, dx
  1254 000007BD 00DE                    	add     dh, bl
  1255 000007BF 00DA                    	add     dl, bl
  1256                                  	; 01/10/2017
  1257                                  	;mov	bx, [PeriodTable+bx]
  1258 000007C1 668B9B[48500000]        	mov	bx, [PeriodTable+ebx]
  1259                                  	;add	bx, bx
  1260 000007C8 01DB                    	add	ebx, ebx
  1261                                  	;mov	ax, [PitchTable+bx]
  1262 000007CA 668B83[F8580000]        	mov	ax, [PitchTable+ebx]
  1263 000007D1 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1264 000007D5 88F3                    	mov     bl, dh
  1265 000007D7 30FF                    	xor     bh, bh
  1266 000007D9 668B9B[48500000]        	mov	bx, [PeriodTable+ebx]
  1267                                  	;add	bx, bx
  1268 000007E0 01DB                    	add	ebx, ebx
  1269                                  	;mov	ax, [PitchTable+bx]
  1270 000007E2 668B83[F8580000]        	mov	ax, [PitchTable+ebx]
  1271 000007E9 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1272 000007ED 88D3                    	mov     bl, dl
  1273 000007EF 30FF                    	xor     bh, bh
  1274 000007F1 668B9B[48500000]        	mov	bx, [PeriodTable+ebx]
  1275                                  	;add	bx, bx
  1276 000007F8 01DB                    	add	ebx, ebx
  1277                                  	;mov	ax, [PitchTable+bx]
  1278 000007FA 668B83[F8580000]        	mov	ax, [PitchTable+ebx]
  1279 00000801 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1280 00000805 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1281 0000080B C3                      	retn
  1282                                  
  1283                                  efxtremolo:
  1284                                  	; 01/10/2017 (TMODPLAY.ASM)
  1285                                  InitTremolo:
  1286 0000080C 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1287 0000080F 88C4                    	mov     ah, al
  1288 00000811 66250FF0                	and     ax, 0F00Fh
  1289 00000815 F6C20F                  	test    dl, 0Fh
  1290 00000818 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1291 0000081A 08C2                    	or      dl, al
  1292                                  efxtremolof0:
  1293                                  InitTremolo_1: 
  1294 0000081C F6C2F0                  	test    dl, 0F0h
  1295 0000081F 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1296 00000821 08E2                    	or      dl, ah
  1297                                  efxtremolof1:
  1298                                  InitTremolo_2:
  1299 00000823 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1300 00000826 66895714                	mov     [edi+TrackInfo.Effect], dx
  1301 0000082A C3                      	retn
  1302                                  
  1303                                  ;--------------------------------------------------------------------------
  1304                                  ; pollmodule - polls the module player
  1305                                  ;--------------------------------------------------------------------------
  1306                                  ;--------------------------------------------------------------------------
  1307                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1308                                  ;--------------------------------------------------------------------------
  1309                                  
  1310                                  pollmodule:
  1311                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1312 0000082B FE0D[A8D40000]          	dec     byte [TempoWait]
  1313 00000831 7417                    	jz      short GetTracks
  1314                                  
  1315                                  	;mov	ecx, NumTracks
  1316 00000833 0FB70D[EC510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1317 0000083A BF[BCD40000]            	mov	edi, Tracks
  1318                                  BeatTracks:
  1319 0000083F E86EFCFFFF              	call	BeatTrack	
  1320 00000844 83C726                  	add	edi, TrackInfo.size
  1321 00000847 E2F6                    	loop	BeatTracks
  1322 00000849 C3                      	retn
  1323                                  GetTracks:
  1324 0000084A A0[A7D40000]            	mov     al, [Tempo]
  1325 0000084F A2[A8D40000]            	mov     [TempoWait], al
  1326                                  
  1327 00000854 8B35[B8D40000]          	mov	esi, [Note]
  1328 0000085A 803D[AAD40000]40        	cmp     byte [Row], 64
  1329 00000861 7268                    	jb      short NoPattWrap
  1330                                  
  1331 00000863 8B35[80570000]          	mov	esi, [ModInfo.Patterns]
  1332 00000869 8A1D[A6D40000]          	mov     bl, [OrderPos]
  1333 0000086F 3A1D[FE560000]          	cmp     bl, [ModInfo.OrderLen]
  1334 00000875 7214                    	jb      short NoOrderWrap
  1335 00000877 8A1D[FF560000]          	mov     bl, [ModInfo.ReStart]
  1336 0000087D 881D[A6D40000]          	mov     [OrderPos], bl
  1337 00000883 3A1D[FE560000]          	cmp     bl, [ModInfo.OrderLen]
  1338 00000889 7364                    	jae     short NoUpdate
  1339                                  NoOrderWrap:    
  1340                                  	;xor	bh, bh
  1341 0000088B 81E3FF000000            	and	ebx, 0FFh
  1342 00000891 8A9B[00570000]          	mov     bl, [ModInfo.Order+ebx]
  1343                                  	; 05/10/2017
  1344                                  	;shl	ebx, 10 ; *1024
  1345 00000897 8A0D[EB510000]          	mov	cl, [pattern_shift] ; 10 or 11
  1346 0000089D D3E3                    	shl	ebx, cl ; *1024 or *2048
  1347                                  	;
  1348 0000089F 01DE                    	add     esi, ebx
  1349 000008A1 8A1D[ABD40000]          	mov     bl, [BreakRow]
  1350 000008A7 881D[AAD40000]          	mov     [Row], bl
  1351                                  	;xor	bh, bh
  1352 000008AD 81E3FF000000            	and	ebx, 0FFh
  1353 000008B3 883D[ABD40000]          	mov     [BreakRow], bh ; 0
  1354 000008B9 66C1E304                	shl     bx, 4
  1355 000008BD 01DE                    	add     esi, ebx
  1356 000008BF 8935[B8D40000]          	mov     [Note], esi
  1357 000008C5 FE05[A6D40000]          	inc     byte [OrderPos]
  1358                                  NoPattWrap:     
  1359 000008CB FE05[AAD40000]          	inc     byte [Row]
  1360                                  
  1361                                  	;cld
  1362                                  	;mov	ecx, NumTracks
  1363 000008D1 0FB70D[EC510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1364 000008D8 BF[BCD40000]            	mov	edi, Tracks
  1365                                  GetTracks_next:
  1366 000008DD 51                      	push	ecx	
  1367 000008DE E858FDFFFF              	call	GetTrack ; readchannel
  1368 000008E3 59                      	pop	ecx
  1369 000008E4 83C726                  	add	edi, TrackInfo.size
  1370 000008E7 E2F4                    	loop	GetTracks_next
  1371                                  
  1372 000008E9 8935[B8D40000]          	mov     [Note], esi
  1373                                  NoUpdate:
  1374 000008EF C3                      	retn
  1375                                  
  1376                                  ;--------------------------------------------------------------------------
  1377                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1378                                  ;  In:
  1379                                  ;   ds:si -  Track Info Address.
  1380                                  ;   ds:di -  Buffer Address.
  1381                                  ;    cx   -  Buffer Size.
  1382                                  ;--------------------------------------------------------------------------
  1383                                  
  1384                                  ; esi = Track info address
  1385                                  ; edi = Buffer address
  1386                                  ; ecx = Buffer size
  1387                                  
  1388                                  MixTrack:
  1389 000008F0 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1390 000008F5 7757                    	ja      short MixLooped
  1391                                  MixNonLooped:   
  1392 000008F7 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1393 000008F9 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1394 000008FC 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1395 00000900 52                      	push    edx
  1396 00000901 56                      	push    esi
  1397 00000902 01D3                    	add     ebx, edx
  1398 00000904 01D5                    	add     ebp, edx
  1399 00000906 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1400                                  	; 01/10/2017
  1401                                  	;mov	al, [esi+TrackInfo.Volume]
  1402 0000090A 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1403                                  	; ah = [esi+TrackInfo.VolDiff]
  1404 0000090E 00E0                    	add	al, ah ; ****** 
  1405 00000910 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1406 00000914 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1407 00000917 89DE                    	mov     esi, ebx
  1408 00000919 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1409 0000091B 88C7                    	mov     bh, al
  1410 0000091D 88D0                    	mov     al, dl
  1411 0000091F 88F2                    	mov     dl, dh
  1412                                  	;xor	dh, dh
  1413 00000921 81E2FF000000            	and	edx, 0FFh
  1414                                  nlMixSamp:      
  1415 00000927 39EE                    	cmp     esi, ebp
  1416 00000929 7316                    	jae     short nlMixBye
  1417 0000092B 8A1E                    	mov     bl, [esi]
  1418                                  	;mov	bl, [VolTable+bx]
  1419 0000092D 8A9B[BA730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1420                                  	; 17/10/2017
  1421 00000933 001F                    	add     [edi], bl
  1422                                  	; 18/10/2017
  1423 00000935 00C4                    	add     ah, al
  1424 00000937 11D6                    	adc     esi, edx
  1425 00000939 033D[EC510000]          	add	edi, [numtracks]
  1426 0000093F E2E6                    	loop    nlMixSamp
  1427                                  nlMixBye:       
  1428 00000941 89F3                    	mov     ebx, esi
  1429 00000943 5E                      	pop     esi
  1430 00000944 5A                      	pop     edx
  1431 00000945 29D3                    	sub     ebx, edx
  1432 00000947 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1433 0000094A 88661D                  	mov     [esi+TrackInfo.Error], ah
  1434 0000094D C3                      	retn
  1435                                  MixLooped:
  1436 0000094E 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1437 00000950 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1438 00000953 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1439 00000957 892D[B4D40000]          	mov     [BufRep], ebp
  1440                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1441 0000095D 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1442 00000961 52                      	push    edx
  1443 00000962 56                      	push    esi
  1444 00000963 01D3                    	add     ebx, edx
  1445 00000965 01D5                    	add     ebp, edx
  1446 00000967 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1447                                  	; 01/10/2017
  1448                                  	;mov	al, [esi+TrackInfo.Volume]
  1449 0000096B 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1450                                  	; ah = [esi+TrackInfo.VolDiff]
  1451 0000096F 00E0                    	add	al, ah ; ****** 
  1452 00000971 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1453 00000975 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1454                                  	;mov	si, bx
  1455 00000978 89DE                    	mov	esi, ebx ; 04/09/2017
  1456 0000097A 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1457 0000097C 88C7                    	mov     bh, al
  1458 0000097E 88D0                    	mov     al, dl
  1459 00000980 88F2                    	mov     dl, dh
  1460                                  	;xor	dh, dh
  1461 00000982 81E2FF000000            	and	edx, 0FFh
  1462                                  lpMixSamp:      
  1463 00000988 39EE                    	cmp     esi, ebp
  1464 0000098A 7206                    	jb      short lpMixNow
  1465 0000098C 2B35[B4D40000]          	sub     esi, [BufRep]
  1466                                  lpMixNow:       
  1467 00000992 8A1E                    	mov     bl, [esi]
  1468                                  	;mov	bl, [VolTable+bx]
  1469 00000994 8A9B[BA730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1470                                  	; 17/10/2017
  1471 0000099A 001F                    	add     [edi], bl
  1472                                  	; 18/10/2017
  1473 0000099C 00C4                    	add     ah, al
  1474 0000099E 11D6                    	adc     esi, edx
  1475 000009A0 033D[EC510000]          	add	edi, [numtracks]
  1476 000009A6 E2E0                    	loop    lpMixSamp
  1477                                  lpMixBye:       
  1478                                  ;	mov     ebx, esi
  1479                                  ;	pop     esi
  1480                                  ;	pop     edx
  1481                                  ;	sub     ebx, edx
  1482                                  ;	mov     [esi+TrackInfo.Position], ebx
  1483                                  ;	mov     [esi+TrackInfo.Error], ah
  1484                                  ;	retn
  1485 000009A8 EB97                    	jmp	short nlMixBye
  1486                                  
  1487                                  ;--------------------------------------------------------------------------
  1488                                  ; mixpoll - updates the output buffer
  1489                                  ;--------------------------------------------------------------------------
  1490                                  ;
  1491                                  ;--------------------------------------------------------------------------
  1492                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1493                                  ;  In:
  1494                                  ;    Buffer  - Buffer Address.
  1495                                  ;    Count   - Buffer Size.
  1496                                  ;--------------------------------------------------------------------------
  1497                                  
  1498                                  mixpoll:
  1499                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1500                                  	; edi = buffer address
  1501                                  	; ebx = count
  1502                                  
  1503 000009AA 60                      	pushad
  1504                                  
  1505                                  	;cld
  1506                                  NextChunk:      
  1507 000009AB 66833D[B2D40000]00      	cmp     word [BufLen], 0
  1508 000009B3 756B                    	jne     short CopyChunk
  1509                                  
  1510 000009B5 53                      	push    ebx
  1511 000009B6 57                      	push    edi
  1512                                  MixChunk:       
  1513 000009B7 BF[BAB40000]            	mov	edi, MixBuffer
  1514                                  
  1515                                  	; 17/10/2017
  1516 000009BC 0FB70D[ACD40000]        	movzx	ecx, word [BpmSamples]
  1517                                  	;mov	cx, [BpmSamples]
  1518 000009C3 893D[AED40000]          	mov     [BufPtr], edi
  1519 000009C9 66890D[B2D40000]        	mov	[BufLen], cx
  1520                                  
  1521 000009D0 803D[EC510000]04        	cmp	byte [numtracks], 4
  1522 000009D7 7603                    	jna	short ch_silence
  1523 000009D9 66D1E1                  	shl	cx, 1 
  1524                                  ch_silence:
  1525 000009DC B880808080              	mov	eax, 80808080h
  1526 000009E1 F3AB                    	rep	stosd
  1527                                  
  1528                                  	;mov	cx, NumTracks
  1529                                  	;mov	cl, NumTracks ; 01/10/2017
  1530 000009E3 8A0D[EC510000]          	mov	cl, [numtracks] ; 06/10/2017
  1531 000009E9 BE[96D40000]            	mov	esi, Tracks - TrackInfo.size
  1532                                  GetSamples_next:
  1533 000009EE 51                      	push	ecx
  1534 000009EF 83C626                  	add	esi, TrackInfo.size
  1535 000009F2 668B0D[B2D40000]        	mov	cx, [BufLen]
  1536 000009F9 8B3D[AED40000]          	mov	edi, [BufPtr]
  1537 000009FF E8ECFEFFFF              	call	MixTrack
  1538 00000A04 59                      	pop	ecx
  1539 00000A05 FF05[AED40000]          	inc	dword [BufPtr] ; 18/10/2017
  1540 00000A0B E2E1                    	loop	GetSamples_next
  1541                                  
  1542                                   	; 18/10/2017	
  1543 00000A0D 8B1D[EC510000]          	mov	ebx, [numtracks]
  1544 00000A13 291D[AED40000]          	sub	dword [BufPtr], ebx
  1545                                  
  1546 00000A19 E80DFEFFFF              	call    UpdateTracks
  1547                                  
  1548 00000A1E 5F                      	pop     edi
  1549 00000A1F 5B                      	pop     ebx
  1550                                  CopyChunk:      
  1551                                  	;mov	cx, [BufLen]
  1552 00000A20 0FB70D[B2D40000]        	movzx	ecx, word [BufLen]
  1553 00000A27 39D9                    	cmp	ecx, ebx
  1554                                  	;cmp	cx, bx
  1555 00000A29 7602                    	jbe     short MoveChunk
  1556                                  	;mov	cx, bx
  1557 00000A2B 89D9                    	mov     ecx, ebx
  1558                                  MoveChunk:
  1559 00000A2D 8B35[AED40000]          	mov     esi, [BufPtr]
  1560 00000A33 010D[AED40000]          	add     [BufPtr], ecx
  1561 00000A39 66290D[B2D40000]        	sub     [BufLen], cx
  1562 00000A40 29CB                    	sub     ebx, ecx
  1563                                  	; 17/10/2017 ; STEREO MIXING
  1564                                  	;rep	movsb
  1565                                  	; 18/10/2017
  1566 00000A42 803D[EC510000]04        	cmp	byte [numtracks], 4
  1567                                  	;jna	short _4_channels_mix
  1568 00000A49 762F                    	jna	_4_channels_mix
  1569                                  	
  1570                                  _8_channels_mix:
  1571                                  	; 18/10/2017
  1572 00000A4B AD                      	lodsd 
  1573 00000A4C 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1574 00000A4E C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1575 00000A51 00C6                    	add	dh, al ; ch1 + ch4
  1576 00000A53 00E2                    	add	dl, ah ; ch2 + ch3
  1577                                  
  1578 00000A55 AD                      	lodsd
  1579 00000A56 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1580 00000A58 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1581 00000A5A C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1582                                  	; 19/10/2017
  1583 00000A5D 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1584 00000A5F 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1585                                  
  1586                                  	; L = ch1 + ch4 + ch5 + ch8
  1587                                  	; R = ch2 + ch3 + ch6 + ch7
  1588                                  
  1589 00000A61 6681C28080              	add	dx, 8080h
  1590                                  
  1591                                  	; 19/10/2017
  1592 00000A66 88F4                    	mov	ah, dh
  1593 00000A68 80EC80                  	sub	ah, 80h
  1594 00000A6B 30C0                    	xor	al, al
  1595 00000A6D 66AB                    	stosw ; Left Channel
  1596 00000A6F 88D4                    	mov	ah, dl
  1597 00000A71 80EC80                  	sub	ah, 80h
  1598 00000A74 66AB                    	stosw ; Right Channel
  1599                                  
  1600 00000A76 E2D3                    	loop	_8_channels_mix
  1601                                  	
  1602 00000A78 EB21                    	jmp	short channel_mix_ok
  1603                                  	
  1604                                  _4_channels_mix:
  1605                                  	; 18/10/2017
  1606 00000A7A AD                      	lodsd 
  1607 00000A7B 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1608                                  	; 19/10/2017
  1609 00000A7D C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1610 00000A80 00E2                    	add	dl, ah ; ch1 + ch4
  1611 00000A82 00C6                    	add	dh, al ; ch2 + ch3
  1612                                  
  1613                                  	; L = ch1 + ch4
  1614                                  	; R = ch2 + ch3
  1615                                  
  1616                                  	; 19/10/2017
  1617 00000A84 6681C28080              	add	dx, 8080h
  1618                                  
  1619                                  	; 19/10/2017
  1620 00000A89 88D4                    	mov	ah, dl
  1621 00000A8B 80EC80                  	sub	ah, 80h
  1622 00000A8E 30C0                    	xor	al, al
  1623 00000A90 66AB                    	stosw ; Left Channel
  1624 00000A92 88F4                    	mov	ah, dh
  1625 00000A94 80EC80                  	sub	ah, 80h
  1626 00000A97 66AB                    	stosw ; Right Channel
  1627                                  	
  1628 00000A99 E2DF                    	loop	_4_channels_mix
  1629                                  
  1630                                  channel_mix_ok:
  1631 00000A9B 85DB                    	test    ebx, ebx
  1632                                  	;jnz	short NextChunk
  1633 00000A9D 0F8508FFFFFF            	jnz	NextChunk ; 17/10/2017
  1634                                  
  1635                                  	; 20/10/2017
  1636                                  	; 19/10/2017
  1637                                  	; Pan Control
  1638 00000AA3 8A0D[40E00000]          	mov	cl, [pan_shift]
  1639 00000AA9 08C9                    	or	cl, cl
  1640 00000AAB 744D                    	jz	short c_smpl_2
  1641                                  
  1642                                  	; 20/10/2017
  1643 00000AAD BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1644 00000AB2 BF[00F00000]            	mov	edi, Audio_Buffer
  1645                                  
  1646 00000AB7 B508                    	mov	ch, 8
  1647 00000AB9 D2E5                    	shl	ch, cl
  1648                                  c_smpl_1:
  1649 00000ABB 8B17                    	mov	edx, [edi]
  1650 00000ABD 6689D0                  	mov	ax, dx
  1651 00000AC0 80FC80                  	cmp	ah, 80h
  1652 00000AC3 7208                    	jb	short _cs1	
  1653 00000AC5 00EC                    	add	ah, ch
  1654 00000AC7 730A                    	jnc	short _cs2
  1655 00000AC9 B4FF                    	mov	ah, 255
  1656 00000ACB EB06                    	jmp	short _cs2
  1657                                  _cs1:
  1658 00000ACD 28EC                    	sub	ah, ch
  1659 00000ACF 7302                    	jnc	short _cs2
  1660 00000AD1 B400                    	mov	ah, 0
  1661                                  _cs2:
  1662 00000AD3 C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1663 00000AD6 00F4                    	add	ah, dh
  1664 00000AD8 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1665 00000ADA 80FC80                  	cmp	ah, 80h
  1666 00000ADD 7208                    	jb	short _cs3	
  1667 00000ADF 00EC                    	add	ah, ch
  1668 00000AE1 730A                    	jnc	short _cs4
  1669 00000AE3 B4FF                    	mov	ah, 255
  1670 00000AE5 EB06                    	jmp	short _cs4
  1671                                  _cs3:
  1672 00000AE7 28EC                    	sub	ah, ch
  1673 00000AE9 7302                    	jnc	short _cs4
  1674 00000AEB B400                    	mov	ah, 0
  1675                                  _cs4:
  1676 00000AED C1CA10                  	ror	edx, 16 ; dx = [edi]
  1677 00000AF0 00E6                    	add	dh, ah
  1678 00000AF2 8917                    	mov	[edi], edx
  1679                                  _cs5:
  1680                                  	; 20/10/2017
  1681 00000AF4 83C704                  	add	edi, 4
  1682 00000AF7 4B                      	dec	ebx
  1683 00000AF8 75C1                    	jnz	short c_smpl_1	
  1684                                  c_smpl_2:
  1685 00000AFA 61                      	popad	
  1686 00000AFB C3                      	retn
  1687                                  
  1688                                  ;--------------------------------------------------------------------------
  1689                                  ; StartPlaying: Initializes the Sound System.
  1690                                  ;  In:
  1691                                  ;   Module Information Resources.
  1692                                  ;--------------------------------------------------------------------------
  1693                                  
  1694                                  StartPlaying:
  1695 00000AFC 60                      	pushad
  1696                                  SetModParms:    
  1697 00000AFD C605[A6D40000]00        	mov     byte [OrderPos], 0
  1698 00000B04 C605[A7D40000]06        	mov     byte [Tempo], DefTempo
  1699 00000B0B C605[A8D40000]06        	mov     byte [TempoWait], DefTempo
  1700 00000B12 C605[A9D40000]7D        	mov     byte [Bpm], DefBpm
  1701 00000B19 C605[AAD40000]40        	mov     byte [Row], 64
  1702 00000B20 C605[ABD40000]00        	mov     byte [BreakRow], 0
  1703 00000B27 66A1[F2510000]          	mov     ax, [MixSpeed]
  1704 00000B2D 31D2                    	xor     edx, edx
  1705 00000B2F 66BB3200                	mov     bx, 24*DefBpm/60
  1706 00000B33 66F7F3                  	div     bx
  1707 00000B36 66A3[ACD40000]          	mov     [BpmSamples], ax
  1708                                  ClearTracks:    
  1709 00000B3C BF[BCD40000]            	mov     edi, Tracks
  1710                                  	; 07/10/2017
  1711                                  	;mov	ecx, NumTracks*TrackInfo.size
  1712 00000B41 B826000000              	mov	eax, TrackInfo.size
  1713 00000B46 0FB70D[EC510000]        	movzx	ecx, word [numtracks]
  1714 00000B4D F7E1                    	mul	ecx
  1715 00000B4F 89C1                    	mov	ecx, eax
  1716 00000B51 31C0                    	xor     eax, eax
  1717                                  	;cld
  1718 00000B53 F3AA                    	rep     stosb
  1719                                  
  1720 00000B55 A3[AED40000]            	mov     [BufPtr], eax
  1721 00000B5A 66A3[B2D40000]          	mov     [BufLen], ax
  1722                                  MakePitch:
  1723 00000B60 66B80021                	mov     ax, MidCRate
  1724 00000B64 66BBAC01                	mov     bx, 428
  1725 00000B68 66F7E3                  	mul     bx
  1726 00000B6B 66F735[F2510000]        	div     word [MixSpeed]
  1727 00000B72 30F6                    	xor     dh, dh
  1728 00000B74 88E2                    	mov     dl, ah
  1729 00000B76 88C4                    	mov     ah, al
  1730 00000B78 30C0                    	xor     al, al
  1731                                  	;mov	cx, 857
  1732 00000B7A 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1733 00000B7E 31DB                    	xor     ebx, ebx
  1734 00000B80 BF[F8580000]            	mov     edi, PitchTable
  1735                                  PitchLoop:      
  1736 00000B85 50                      	push    eax
  1737 00000B86 52                      	push    edx
  1738 00000B87 6639DA                  	cmp     dx, bx
  1739 00000B8A 7303                    	jae     short NoDiv
  1740 00000B8C 66F7F3                  	div     bx
  1741                                  NoDiv:          
  1742 00000B8F 66AB                    	stosw
  1743 00000B91 5A                      	pop     edx
  1744 00000B92 58                      	pop     eax
  1745                                  	;inc	bx
  1746 00000B93 43                      	inc	ebx
  1747 00000B94 E2EF                    	loop    PitchLoop
  1748                                  MakeVolume:     
  1749 00000B96 66B90041                	mov     cx, 16640
  1750 00000B9A 89CB                    	mov     ebx, ecx
  1751                                  VolLoop:
  1752 00000B9C 664B                    	dec     bx
  1753 00000B9E 88D8                    	mov     al, bl
  1754 00000BA0 F6EF                    	imul    bh
  1755                                  	;mov	[VolTable+bx], ah
  1756 00000BA2 88A3[BA730000]          	mov     [VolTable+ebx], ah
  1757 00000BA8 E2F2                    	loop    VolLoop
  1758                                  
  1759 00000BAA 61                      	popad
  1760 00000BAB C3                      	retn
  1761                                  
  1762                                  ;--------------------------------------------------------------------------
  1763                                  ; StopPlaying: ShutDown the Sound System.
  1764                                  ;--------------------------------------------------------------------------
  1765                                  
  1766                                  StopPlaying:
  1767                                  	; 19/06/2017
  1768                                  	; Stop Playing
  1769                                  	sys	_audio, 0700h
  1769                              <1> 
  1769                              <1> 
  1769                              <1> 
  1769                              <1> 
  1769                              <1>  %if %0 >= 2
  1769 00000BAC BB00070000          <1>  mov ebx, %2
  1769                              <1>  %if %0 >= 3
  1769                              <1>  mov ecx, %3
  1769                              <1>  %if %0 = 4
  1769                              <1>  mov edx, %4
  1769                              <1>  %endif
  1769                              <1>  %endif
  1769                              <1>  %endif
  1769 00000BB1 B820000000          <1>  mov eax, %1
  1769                              <1> 
  1769 00000BB6 CD40                <1>  int 40h
  1770                                  	; Cancel callback service (for user)
  1771                                  	sys	_audio, 0900h
  1771                              <1> 
  1771                              <1> 
  1771                              <1> 
  1771                              <1> 
  1771                              <1>  %if %0 >= 2
  1771 00000BB8 BB00090000          <1>  mov ebx, %2
  1771                              <1>  %if %0 >= 3
  1771                              <1>  mov ecx, %3
  1771                              <1>  %if %0 = 4
  1771                              <1>  mov edx, %4
  1771                              <1>  %endif
  1771                              <1>  %endif
  1771                              <1>  %endif
  1771 00000BBD B820000000          <1>  mov eax, %1
  1771                              <1> 
  1771 00000BC2 CD40                <1>  int 40h
  1772                                  	; Deallocate Audio Buffer (for user)
  1773                                  	sys	_audio, 0A00h
  1773                              <1> 
  1773                              <1> 
  1773                              <1> 
  1773                              <1> 
  1773                              <1>  %if %0 >= 2
  1773 00000BC4 BB000A0000          <1>  mov ebx, %2
  1773                              <1>  %if %0 >= 3
  1773                              <1>  mov ecx, %3
  1773                              <1>  %if %0 = 4
  1773                              <1>  mov edx, %4
  1773                              <1>  %endif
  1773                              <1>  %endif
  1773                              <1>  %endif
  1773 00000BC9 B820000000          <1>  mov eax, %1
  1773                              <1> 
  1773 00000BCE CD40                <1>  int 40h
  1774                                  	; Disable Audio Device
  1775                                  	sys	_audio, 0C00h
  1775                              <1> 
  1775                              <1> 
  1775                              <1> 
  1775                              <1> 
  1775                              <1>  %if %0 >= 2
  1775 00000BD0 BB000C0000          <1>  mov ebx, %2
  1775                              <1>  %if %0 >= 3
  1775                              <1>  mov ecx, %3
  1775                              <1>  %if %0 = 4
  1775                              <1>  mov edx, %4
  1775                              <1>  %endif
  1775                              <1>  %endif
  1775                              <1>  %endif
  1775 00000BD5 B820000000          <1>  mov eax, %1
  1775                              <1> 
  1775 00000BDA CD40                <1>  int 40h
  1776                                  
  1777 00000BDC C3                      	retn
  1778                                  
  1779                                  ;=============================================================================
  1780                                  ; 
  1781                                  ;=============================================================================
  1782                                  
  1783                                  ;dword2str:
  1784                                  ;	; 13/11/2016 - Erdogan Tan 
  1785                                  ;	; eax = dword value
  1786                                  ;	;
  1787                                  ;	call	dwordtohex
  1788                                  ;	mov	[dword_str], edx
  1789                                  ;	mov	[dword_str+4], eax
  1790                                  ;	mov	si, dword_str
  1791                                  ;	retn
  1792                                  
  1793                                  	; 05/03/2017 (TRDOS 386)
  1794                                  	; trdos386.s (unix386.s) - 10/05/2015
  1795                                  	; Convert binary number to hexadecimal string
  1796                                  
  1797                                  ;bytetohex:
  1798                                  ;	; INPUT ->
  1799                                  ;	; 	AL = byte (binary number)
  1800                                  ;	; OUTPUT ->
  1801                                  ;	;	AX = hexadecimal string
  1802                                  ;	;
  1803                                  ;	push	ebx
  1804                                  ;	movzx	ebx, al
  1805                                  ;	shr	bl, 4
  1806                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1807                                  ;	xchg	bl, al
  1808                                  ;	and	bl, 0Fh
  1809                                  ;	mov	ah, [ebx+hex_chars] 
  1810                                  ;	pop	ebx	
  1811                                  ;	retn
  1812                                  
  1813                                  ;wordtohex:
  1814                                  ;	; INPUT ->
  1815                                  ;	; 	AX = word (binary number)
  1816                                  ;	; OUTPUT ->
  1817                                  ;	;	EAX = hexadecimal string
  1818                                  ;	;
  1819                                  ;	push	ebx
  1820                                  ;	xor	ebx, ebx
  1821                                  ;	xchg	ah, al
  1822                                  ;	push	eax
  1823                                  ;	mov	bl, ah
  1824                                  ;	shr	bl, 4
  1825                                  ;	mov	al, [ebx+hex_chars] 	 	
  1826                                  ;	mov	bl, ah
  1827                                  ;	and	bl, 0Fh
  1828                                  ;	mov	ah, [ebx+hex_chars]
  1829                                  ;	shl	eax, 16
  1830                                  ;	pop	eax
  1831                                  ;	pop	ebx
  1832                                  ;	jmp	short bytetohex
  1833                                  
  1834                                  ;dwordtohex:
  1835                                  ;	; INPUT ->
  1836                                  ;	; 	EAX = dword (binary number)
  1837                                  ;	; OUTPUT ->
  1838                                  ;	;	EDX:EAX = hexadecimal string
  1839                                  ;	;
  1840                                  ;	push	eax
  1841                                  ;	shr	eax, 16
  1842                                  ;	call	wordtohex
  1843                                  ;	mov	edx, eax
  1844                                  ;	pop	eax
  1845                                  ;	call	wordtohex
  1846                                  ;	retn
  1847                                  
  1848                                  	; 24/06/2017
  1849                                  	; 19/06/2017
  1850                                  	; 05/03/2017 (TRDOS 386)
  1851                                  	; 13/11/2016 - Erdogan Tan
  1852                                  write_audio_dev_info:
  1853                                  	; BUS/DEV/FN
  1854                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1855                                  	; DEV/VENDOR
  1856                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1857                                  
  1858 00000BDD 8B35[AC520000]          	mov	esi, [dev_vendor]
  1859 00000BE3 6689F0                  	mov	ax, si
  1860 00000BE6 0FB6D8                  	movzx	ebx, al
  1861 00000BE9 88DA                    	mov	dl, bl
  1862 00000BEB 80E30F                  	and	bl, 0Fh
  1863 00000BEE 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1864 00000BF4 A2[39520000]            	mov	[msgVendorId+3], al
  1865 00000BF9 88D3                    	mov	bl, dl
  1866 00000BFB C0EB04                  	shr	bl, 4
  1867 00000BFE 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1868 00000C04 A2[38520000]            	mov	[msgVendorId+2], al
  1869 00000C09 88E3                    	mov	bl, ah
  1870 00000C0B 88DA                    	mov	dl, bl
  1871 00000C0D 80E30F                  	and	bl, 0Fh
  1872 00000C10 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1873 00000C16 A2[37520000]            	mov	[msgVendorId+1], al
  1874 00000C1B 88D3                    	mov	bl, dl
  1875 00000C1D C0EB04                  	shr	bl, 4
  1876 00000C20 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1877 00000C26 A2[36520000]            	mov	[msgVendorId], al
  1878 00000C2B C1EE10                  	shr	esi, 16
  1879 00000C2E 6689F0                  	mov	ax, si
  1880 00000C31 88C3                    	mov	bl, al
  1881 00000C33 88DA                    	mov	dl, bl
  1882 00000C35 80E30F                  	and	bl, 0Fh
  1883 00000C38 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1884 00000C3E A2[4A520000]            	mov	[msgDevId+3], al
  1885 00000C43 88D3                    	mov	bl, dl
  1886 00000C45 C0EB04                  	shr	bl, 4
  1887 00000C48 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1888 00000C4E A2[49520000]            	mov	[msgDevId+2], al
  1889 00000C53 88E3                    	mov	bl, ah
  1890 00000C55 88DA                    	mov	dl, bl
  1891 00000C57 80E30F                  	and	bl, 0Fh
  1892 00000C5A 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1893 00000C60 A2[48520000]            	mov	[msgDevId+1], al
  1894 00000C65 88D3                    	mov	bl, dl
  1895 00000C67 C0EB04                  	shr	bl, 4
  1896 00000C6A 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1897 00000C70 A2[47520000]            	mov	[msgDevId], al
  1898                                  
  1899 00000C75 8B35[B0520000]          	mov	esi, [bus_dev_fn]
  1900 00000C7B C1EE08                  	shr	esi, 8
  1901 00000C7E 6689F0                  	mov	ax, si
  1902 00000C81 88C3                    	mov	bl, al
  1903 00000C83 88DA                    	mov	dl, bl
  1904 00000C85 80E307                  	and	bl, 7 ; bit 0,1,2
  1905 00000C88 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1906 00000C8E A2[6E520000]            	mov	[msgFncNo+1], al
  1907 00000C93 88D3                    	mov	bl, dl
  1908 00000C95 C0EB03                  	shr	bl, 3
  1909 00000C98 88DA                    	mov	dl, bl
  1910 00000C9A 80E30F                  	and	bl, 0Fh
  1911 00000C9D 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1912 00000CA3 A2[60520000]            	mov	[msgDevNo+1], al
  1913 00000CA8 88D3                    	mov	bl, dl
  1914 00000CAA C0EB04                  	shr	bl, 4
  1915 00000CAD 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1916 00000CB3 A2[5F520000]            	mov	[msgDevNo], al
  1917 00000CB8 88E3                    	mov	bl, ah
  1918 00000CBA 88DA                    	mov	dl, bl
  1919 00000CBC 80E30F                  	and	bl, 0Fh
  1920 00000CBF 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1921 00000CC5 A2[54520000]            	mov	[msgBusNo+1], al
  1922 00000CCA 88D3                    	mov	bl, dl
  1923 00000CCC C0EB04                  	shr	bl, 4
  1924 00000CCF 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1925 00000CD5 A2[53520000]            	mov	[msgBusNo], al
  1926                                  
  1927                                  	; 24/06/2017
  1928 00000CDA 66A1[B8520000]          	mov	ax, [ac97_NamBar]
  1929 00000CE0 88C3                    	mov	bl, al
  1930 00000CE2 88DA                    	mov	dl, bl
  1931 00000CE4 80E30F                  	and	bl, 0Fh
  1932 00000CE7 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1933 00000CED A2[7D520000]            	mov	[msgNamBar+3], al
  1934 00000CF2 88D3                    	mov	bl, dl
  1935 00000CF4 C0EB04                  	shr	bl, 4
  1936 00000CF7 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1937 00000CFD A2[7C520000]            	mov	[msgNamBar+2], al
  1938 00000D02 88E3                    	mov	bl, ah
  1939 00000D04 88DA                    	mov	dl, bl
  1940 00000D06 80E30F                  	and	bl, 0Fh
  1941 00000D09 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1942 00000D0F A2[7B520000]            	mov	[msgNamBar+1], al
  1943 00000D14 88D3                    	mov	bl, dl
  1944 00000D16 C0EB04                  	shr	bl, 4
  1945 00000D19 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1946 00000D1F A2[7A520000]            	mov	[msgNamBar], al
  1947                                  
  1948 00000D24 66A1[BA520000]          	mov	ax, [ac97_NabmBar]
  1949 00000D2A 88C3                    	mov	bl, al
  1950 00000D2C 88DA                    	mov	dl, bl
  1951 00000D2E 80E30F                  	and	bl, 0Fh
  1952 00000D31 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1953 00000D37 A2[8D520000]            	mov	[msgNabmBar+3], al
  1954 00000D3C 88D3                    	mov	bl, dl
  1955 00000D3E C0EB04                  	shr	bl, 4
  1956 00000D41 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1957 00000D47 A2[8C520000]            	mov	[msgNabmBar+2], al
  1958 00000D4C 88E3                    	mov	bl, ah
  1959 00000D4E 88DA                    	mov	dl, bl
  1960 00000D50 80E30F                  	and	bl, 0Fh
  1961 00000D53 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1962 00000D59 A2[8B520000]            	mov	[msgNabmBar+1], al
  1963 00000D5E 88D3                    	mov	bl, dl
  1964 00000D60 C0EB04                  	shr	bl, 4
  1965 00000D63 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1966 00000D69 A2[8A520000]            	mov	[msgNabmBar], al
  1967                                  
  1968                                  	; 24/11/2016
  1969 00000D6E 30E4                    	xor	ah, ah
  1970 00000D70 A0[BC520000]            	mov	al, [ac97_int_ln_reg]
  1971 00000D75 B10A                    	mov	cl, 10
  1972 00000D77 F6F1                    	div	cl
  1973 00000D79 660105[96520000]        	add	[msgIRQ], ax
  1974 00000D80 20C0                    	and	al, al
  1975 00000D82 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  1976 00000D84 A0[97520000]            	mov	al, [msgIRQ+1]
  1977 00000D89 B420                    	mov	ah, ' '
  1978 00000D8B 66A3[96520000]          	mov	[msgIRQ], ax
  1979                                  _w_ac97imsg_:
  1980                                  	; EBX = Message address
  1981                                  	; ECX = Max. message length (or stop on ZERO character)
  1982                                  	;	(1 to 255)
  1983                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  1984                                       	sys 	_msg, msgAC97Info, 255, 07h
  1984                              <1> 
  1984                              <1> 
  1984                              <1> 
  1984                              <1> 
  1984                              <1>  %if %0 >= 2
  1984 00000D91 BB[05520000]        <1>  mov ebx, %2
  1984                              <1>  %if %0 >= 3
  1984 00000D96 B9FF000000          <1>  mov ecx, %3
  1984                              <1>  %if %0 = 4
  1984 00000D9B BA07000000          <1>  mov edx, %4
  1984                              <1>  %endif
  1984                              <1>  %endif
  1984                              <1>  %endif
  1984 00000DA0 B823000000          <1>  mov eax, %1
  1984                              <1> 
  1984 00000DA5 CD40                <1>  int 40h
  1985 00000DA7 C3                              retn
  1986                                  
  1987                                  ;=============================================================================
  1988                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  1989                                  ;=============================================================================
  1990                                  
  1991                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  1992                                  
  1993                                  ;-----------------------------------------------------------------------------
  1994                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  1995                                  ;-----------------------------------------------------------------------------
  1996                                  	; 22/10/2017
  1997                                  setgraphmode:
  1998                                  	;pushad
  1999 00000DA8 66B81200                	mov	ax,0012h
  2000                                  	;int	10h
  2001 00000DAC CD31                    	int 	31h
  2002 00000DAE 66BAC003                	mov	dx,3C0h
  2003 00000DB2 30C0                    	xor	al,al
  2004                                  setgraphmodel0:
  2005                                  	;out	dx,al
  2006 00000DB4 B401                    	mov	ah, 1 ; outb
  2007 00000DB6 CD34                    	int	34h
  2008                                  	;out	dx, al
  2009                                  	;mov	ah, 1
  2010 00000DB8 CD34                    	int	34h
  2011 00000DBA FEC0                    	inc	al
  2012 00000DBC 3C10                    	cmp	al, 10h
  2013 00000DBE 72F4                    	jb	short setgraphmodel0
  2014 00000DC0 B020                    	mov	al, 20h
  2015                                  	;out	dx, al
  2016                                  	;mov	ah, 1
  2017 00000DC2 CD34                    	int	34h
  2018                                  	;popad
  2019 00000DC4 C3                      	retn
  2020                                  
  2021                                  ;-----------------------------------------------------------------------------
  2022                                  ; settextmode - restore the VGA 80x25x16 text mode
  2023                                  ;-----------------------------------------------------------------------------
  2024                                  	; 22/10/2017
  2025                                  settextmode:
  2026                                  	;pushad
  2027 00000DC5 66B80300                	mov	ax, 0003h
  2028                                  	;int	10h
  2029 00000DC9 CD31                    	int	31h
  2030                                  	;popad
  2031 00000DCB C3                      	retn
  2032                                  
  2033                                  ;-----------------------------------------------------------------------------
  2034                                  ; drawscopes - draw the track voices sample scopes
  2035                                  ; In:
  2036                                  ;  ESI = (current) sample buffer
  2037                                  ;-----------------------------------------------------------------------------
  2038                                  	; 27/10/2017
  2039                                  	; 26/10/2017
  2040                                  	; 23/10/2017
  2041                                  drawscopes:
  2042                                  	;pushad
  2043 00000DCC 31C9                      	xor     ecx, ecx	
  2044 00000DCE 31D2                    	xor     edx, edx
  2045 00000DD0 31FF                    	xor	edi, edi
  2046                                  drawscope0:
  2047 00000DD2 66AD                    	lodsw
  2048 00000DD4 80F480                  	xor	ah, 80h
  2049 00000DD7 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2050 00000DDA 66D1E3                  	shl	bx, 1
  2051 00000DDD 668B83[F0D50000]        	mov	ax, [RowOfs+ebx]
  2052 00000DE4 668987[F0D70000]        	mov	[NewScope_L+edi], ax
  2053 00000DEB 30FF                    	xor	bh, bh
  2054 00000DED 66AD                    	lodsw
  2055 00000DEF 80F480                  	xor	ah, 80h
  2056 00000DF2 88E3                    	mov	bl, ah	; Right Channel
  2057 00000DF4 66D1E3                  	shl	bx, 1
  2058 00000DF7 668B83[F0D50000]        	mov	ax, [RowOfs+ebx]
  2059 00000DFE 668987[F0D90000]        	mov	[NewScope_R+edi], ax
  2060 00000E05 6683C702                	add	di, 2
  2061 00000E09 FEC1                    	inc	cl
  2062 00000E0B 75C5                    	jnz	short drawscope0	
  2063                                  
  2064 00000E0D 66BAC403                        mov	dx, 3C4h
  2065                                          ;mov	ax, 0802h
  2066                                          ;out	dx, ax
  2067 00000E11 66BB0208                        mov	bx, 0802h
  2068 00000E15 B403                    	mov	ah, 3 ; outw
  2069 00000E17 CD34                    	int	34h
  2070 00000E19 66BACE03                	mov	dx, 3CEh
  2071 00000E1D B008                            mov	al, 08h
  2072                                         ;out	dx, al
  2073 00000E1F B401                            mov	ah, 1 ; outb
  2074 00000E21 CD34                    	int	34h
  2075 00000E23 6642                    	inc	dx
  2076                                  
  2077                                  	; 26/10/2017
  2078 00000E25 31F6                            xor	esi, esi
  2079 00000E27 31FF                            xor	edi, edi
  2080 00000E29 BB45060A00                      mov     ebx, 0A0645h
  2081                                  drawscopel4:
  2082 00000E2E B080                            mov     al, 80h
  2083                                  drawscopel2:
  2084 00000E30 50                              push    eax ; *
  2085 00000E31 52                              push    edx ; **
  2086                                  	;out	dx, al
  2087 00000E32 B401                    	mov	ah, 1 ; outb
  2088 00000E34 CD34                    	int	34h
  2089                                  
  2090 00000E36 B4FF                            mov	ah, 0FFh
  2091                                          ;mov	ecx, 32
  2092 00000E38 66B92000                	mov	cx, 32
  2093 00000E3C 28C0                            sub     al, al
  2094                                  drawscopel3:
  2095                                  	; 23/10/2017
  2096 00000E3E 668B96[F0DB0000]                mov	dx, [OldScope_L+esi]
  2097 00000E45 663B96[F0D70000]                cmp	dx, [NewScope_L+esi]
  2098 00000E4C 7414                            je	short drawscopef3
  2099 00000E4E 88041A                          mov	[edx+ebx], al ; L
  2100 00000E51 668B96[F0D70000]                mov     dx, [NewScope_L+esi]
  2101 00000E58 88241A                  	mov	[edx+ebx], ah ; L
  2102 00000E5B 668996[F0DB0000]                mov     [OldScope_L+esi], dx
  2103                                  drawscopef3:
  2104                                  	; 27/10/2017
  2105 00000E62 668B96[F0DD0000]                mov	dx, [OldScope_R+esi]
  2106 00000E69 663B96[F0D90000]                cmp	dx, [NewScope_R+esi]
  2107 00000E70 7416                            je	short drawscopef4
  2108 00000E72 88441A26                	mov	[edx+ebx+38], al ; R
  2109 00000E76 668B96[F0D90000]                mov     dx, [NewScope_R+esi]
  2110 00000E7D 88641A26                        mov	[edx+ebx+38], ah ; R
  2111 00000E81 668996[F0DD0000]                mov     [OldScope_R+esi], dx
  2112                                  drawscopef4:
  2113 00000E88 83C610                          add	esi, 2*8
  2114 00000E8B 43                              inc	ebx
  2115 00000E8C E2B0                            loop    drawscopel3
  2116                                  
  2117 00000E8E 5A                              pop     edx ; **
  2118 00000E8F 58                              pop     eax ; *
  2119 00000E90 81EEFE010000                    sub	esi, 2*256-2
  2120 00000E96 83EB20                          sub	ebx, 32
  2121 00000E99 D0E8                            shr     al, 1
  2122 00000E9B 7593                            jnz	short drawscopel2
  2123                                  	;popad
  2124 00000E9D C3                              retn
  2125                                  
  2126                                  ;=============================================================================
  2127                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2128                                  ;=============================================================================
  2129                                  
  2130                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2131                                  
  2132                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2133                                  
  2134                                  ;-----------------------------------------------------------------------------
  2135                                  ; EQUATES AND STRUCTURES
  2136                                  ;-----------------------------------------------------------------------------
  2137                                  
  2138                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2139                                  ID_ILBM equ 4D424C49h
  2140                                  ID_BMHD equ 44484D42h
  2141                                  ID_CMAP equ 50414D43h
  2142                                  ID_BODY equ 59444F42h
  2143                                  
  2144                                  struc Form			; IFF/ILBM header file format
  2145 00000000 <res 00000004>            .ID:		resd 1
  2146 00000004 <res 00000004>            .Length:	resd 1
  2147 00000008 <res 00000004>            .Type:	resd 1
  2148                                    .size:
  2149                                  endstruc
  2150                                  
  2151                                  struc Chunk			; IFF/ILBM header chunk format
  2152 00000000 <res 00000004>            .ID:		resd 1
  2153 00000004 <res 00000004>            .Length:	resd 1
  2154                                    .size:	
  2155                                  endstruc
  2156                                  
  2157                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2158 00000000 <res 00000002>            .Width: 	resw 1
  2159 00000002 <res 00000002>            .Height:	resw 1
  2160 00000004 <res 00000002>            .PosX:	resw 1
  2161 00000006 <res 00000002>            .PosY:	resw 1
  2162 00000008 <res 00000001>            .Planes:	resb 1
  2163 00000009 <res 00000001>            .Masking:	resb 1
  2164 0000000A <res 00000001>            .Compression:	resb 1
  2165 0000000B <res 00000001>            .Pad:		resb 1
  2166 0000000C <res 00000002>            .Transparent:	resw 1
  2167 0000000E <res 00000001>            .AspectX	resb 1
  2168 0000000F <res 00000001>            .AspectY:	resb 1
  2169 00000010 <res 00000002>            .PageWidth:	resw 1
  2170 00000012 <res 00000002>            .PageHeight:	resw 1
  2171                                    .size:	
  2172                                  endstruc
  2173                                  
  2174                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2175 00000000 <res 00000300>            .Colors:	resb 768
  2176                                    .size:	
  2177                                  endstruc
  2178                                  
  2179                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2180                                  
  2181                                  ;------------------------------------------------------------------------------
  2182                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2183                                  ;         a value in little/big endian form to big/little endian form.
  2184                                  ;------------------------------------------------------------------------------
  2185                                  %macro	bswap   1
  2186                                          xchg    al, ah
  2187                                          rol     eax, 16
  2188                                          xchg    al, ah
  2189                                  %endmacro
  2190                                  
  2191                                  ;------------------------------------------------------------------------------
  2192                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2193                                  ; In:
  2194                                  ;  ESI = IFF/ILBM image file address
  2195                                  ;------------------------------------------------------------------------------
  2196                                  putlbm:
  2197 00000E9E 60                              pushad
  2198                                  
  2199                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2200                                  
  2201 00000E9F 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2202 00000EA5 7551                            jne     short putlbmd0
  2203 00000EA7 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2204 00000EAE 7548                            jne     short putlbmd0
  2205                                  
  2206                                  ; get the IFF/ILBM file length in bytes
  2207                                  
  2208 00000EB0 8B4604                          mov     eax, [esi+Form.Length]
  2209                                          bswap   eax
  2209 00000EB3 86C4                <1>  xchg al, ah
  2209 00000EB5 C1C010              <1>  rol eax, 16
  2209 00000EB8 86C4                <1>  xchg al, ah
  2210 00000EBA 89C1                            mov     ecx, eax
  2211                                  
  2212                                  ; decrease the file length and updates the file pointer
  2213                                  
  2214 00000EBC 83E904                          sub     ecx, 4
  2215 00000EBF 83C60C                          add     esi, Form.size
  2216                                  
  2217                                  ; IFF/ILBM main parser body loop
  2218                                  
  2219                                  putlbml0:
  2220 00000EC2 85C9                            test    ecx, ecx
  2221 00000EC4 7E64                            jle     short putlbmd1
  2222                                  
  2223                                  ; get the next chunk ID and length in bytes
  2224                                  
  2225 00000EC6 8B1E                            mov     ebx, [esi+Chunk.ID]
  2226 00000EC8 8B4604                          mov     eax, [esi+Chunk.Length]
  2227                                          bswap   eax
  2227 00000ECB 86C4                <1>  xchg al, ah
  2227 00000ECD C1C010              <1>  rol eax, 16
  2227 00000ED0 86C4                <1>  xchg al, ah
  2228 00000ED2 93                              xchg    ebx, eax
  2229 00000ED3 83C608                          add     esi, Chunk.size
  2230                                  
  2231                                  ; word align the chunk length and decrease the file length counter
  2232                                  
  2233 00000ED6 43                              inc     ebx
  2234 00000ED7 80E3FE                          and     bl, 0FEh ; ~1
  2235 00000EDA 83E908                          sub     ecx, Chunk.size
  2236 00000EDD 29D9                            sub     ecx, ebx
  2237                                  
  2238                                  ; check for the BMHD/CMAP/BODY chunk headers
  2239                                  
  2240 00000EDF 3D424D4844                      cmp     eax, ID_BMHD
  2241 00000EE4 7415                            je      short putlbmf0
  2242 00000EE6 3D434D4150                      cmp     eax, ID_CMAP
  2243 00000EEB 7440                            je      short putlbmf1
  2244 00000EED 3D424F4459                      cmp     eax, ID_BODY
  2245 00000EF2 7455                            je      short putlbmf2
  2246                                  
  2247                                  ; advance to the next IFF/ILBM chunk structure
  2248                                  
  2249                                  putlbmc0:
  2250 00000EF4 01DE                            add     esi, ebx
  2251 00000EF6 EBCA                            jmp     short putlbml0
  2252                                  
  2253                                  putlbmd0:
  2254 00000EF8 F9                              stc
  2255 00000EF9 61                              popad
  2256 00000EFA C3                              retn
  2257                                  
  2258                                  ; process the BMHD bitmap header chunk
  2259                                  
  2260                                  putlbmf0:
  2261 00000EFB 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2262 00000EFF 75F7                            jne     short putlbmd0
  2263 00000F01 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2264 00000F05 75F1                            jne     short putlbmd0
  2265 00000F07 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2266 00000F0B 75EB                            jne     short putlbmd0
  2267 00000F0D 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2268 00000F10 86C4                            xchg    al, ah
  2269 00000F12 83C007                          add     eax, 7
  2270 00000F15 C1E803                          shr     eax, 3
  2271 00000F18 A3[A4520000]                    mov     [picture.width], eax
  2272 00000F1D 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2273 00000F21 86C4                            xchg    al, ah
  2274 00000F23 A3[A8520000]                    mov     [picture.height], eax
  2275 00000F28 EBCA                            jmp     short putlbmc0
  2276                                  
  2277                                  putlbmd1:
  2278 00000F2A F8                              clc
  2279 00000F2B 61                              popad
  2280 00000F2C C3                              retn
  2281                                  
  2282                                  ; process the CMAP colormap chunk
  2283                                  
  2284                                  putlbmf1:
  2285 00000F2D 66BAC803                        mov     dx, 3C8h
  2286 00000F31 30C0                            xor     al, al
  2287                                          ;out	dx, al
  2288 00000F33 B401                    	mov	ah, 1 ; outb
  2289 00000F35 CD34                    	int	34h
  2290 00000F37 6642                            inc     dx
  2291                                  putlbml1:
  2292 00000F39 8A06                            mov     al, [esi]
  2293 00000F3B C0E802                          shr     al, 2
  2294                                          ;out	dx, al
  2295                                  	;mov	ah, 1 ; outb
  2296 00000F3E CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2297 00000F40 46                              inc     esi
  2298 00000F41 4B                              dec     ebx
  2299 00000F42 7FF5                            jg      short putlbml1
  2300 00000F44 E979FFFFFF                      jmp     putlbml0
  2301                                  
  2302                                  ; process the BODY bitmap body chunk
  2303                                  
  2304                                  putlbmf2:
  2305 00000F49 60                              pushad
  2306 00000F4A BF00000A00                      mov     edi, 0A0000h
  2307                                          ;cld
  2308 00000F4F 66BACE03                        mov     dx, 3CEh
  2309                                          ;mov	ax, 0FF08h
  2310                                          ;out	dx, ax
  2311 00000F53 66BB08FF                	mov	bx, 0FF08h
  2312 00000F57 B403                    	mov	ah, 3 ; outw
  2313 00000F59 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2314 00000F5B 66BAC403                        mov     dx, 3C4h
  2315 00000F5F B002                            mov     al, 02h
  2316                                          ;out	dx, al
  2317 00000F61 B401                    	mov	ah, 1 ; outb
  2318 00000F63 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2319 00000F65 6642                            inc     dx
  2320 00000F67 8B0D[A8520000]                  mov     ecx, [picture.height]
  2321                                  putlbml2:
  2322 00000F6D 51                              push    ecx
  2323 00000F6E B011                            mov     al, 11h
  2324                                  putlbml3:
  2325 00000F70 50                              push    eax
  2326 00000F71 57                              push    edi
  2327                                          ;out	dx, al
  2328 00000F72 B401                    	mov	ah, 1 ; outb
  2329 00000F74 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2330 00000F76 8B1D[A4520000]                  mov     ebx, [picture.width]
  2331                                  putlbml4:
  2332 00000F7C AC                              lodsb
  2333 00000F7D 84C0                            test    al, al
  2334 00000F7F 7C0A                            jl      short putlbmf3
  2335 00000F81 0FB6C8                          movzx   ecx, al
  2336 00000F84 41                              inc     ecx
  2337 00000F85 29CB                            sub     ebx, ecx
  2338 00000F87 F3A4                            rep     movsb
  2339 00000F89 EB0B                            jmp     short putlbmc4
  2340                                  putlbmf3:
  2341 00000F8B F6D8                            neg     al
  2342 00000F8D 0FB6C8                          movzx   ecx, al
  2343 00000F90 41                              inc     ecx
  2344 00000F91 29CB                            sub     ebx, ecx
  2345 00000F93 AC                              lodsb
  2346 00000F94 F3AA                            rep     stosb
  2347                                  putlbmc4:
  2348 00000F96 85DB                            test    ebx, ebx
  2349 00000F98 7FE2                            jg      short putlbml4
  2350 00000F9A 5F                              pop     edi
  2351 00000F9B 58                              pop     eax
  2352 00000F9C 00C0                            add     al, al
  2353 00000F9E 73D0                            jnc     short putlbml3
  2354 00000FA0 83C750                          add     edi, 80
  2355 00000FA3 59                              pop     ecx
  2356 00000FA4 E2C7                            loop    putlbml2
  2357 00000FA6 61                      	popad
  2358 00000FA7 E948FFFFFF                      jmp	putlbmc0
  2359                                  
  2360                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2361                                  ;------------------------------------------------------------------------------
  2362                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2363                                  ;  ESI = IFF/ILBM image file address
  2364                                  ;------------------------------------------------------------------------------
  2365                                  
  2366                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2367                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2368                                  ;       MODStopModule();
  2369                                  ;       MODFreeModule(Song);
  2370                                  ;       return;
  2371                                  ;   }
  2372                                  ;   setgraphmode();
  2373                                  ;   putlbm(Logo);
  2374                                  ;   while (!kbhit())
  2375                                  ;       drawscopes(Song->NumTracks);
  2376                                  ;   settextmode();
  2377                                  ;   free(Logo);
  2378                                  ;   MODStopModule();
  2379                                  ;   MODFreeModule(Song);
  2380                                  
  2381                                  ;loadlbm:
  2382                                  ;	; ebx = ASCIIZ file name address
  2383                                  ;	; ecx = open mode (0 = open for read)	
  2384                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2385                                  ;	jc	short loadlbm_retn
  2386                                  ;
  2387                                  ;	mov     [LBM_FileHandle], eax
  2388                                  ;
  2389                                  ;	; get file size by moving file pointer to the end of file
  2390                                  ;	; ebx = file handle/number
  2391                                  ;	; ecx : offset = 0
  2392                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2393                                  ;	sys	_seek, eax, 0, 2
  2394                                  ;	jc	short loadlbm_cf
  2395                                  ;
  2396                                  ;	mov	[LBM_FileSize], eax
  2397                                  ;
  2398                                  ;	; move file pointer to the beginning of the file
  2399                                  ;	; ecx = 0
  2400                                  ;	; edx = 0
  2401                                  ;	;xor	ecx, ecx
  2402                                  ; 	xor	dl, dl
  2403                                  ;	; ebx = [LBM_FileHandle]
  2404                                  ;	sys	_seek
  2405                                  ;	;jc	short loadlbm_cf
  2406                                  ;
  2407                                  ;	; ebx = File handle
  2408                                  ;	; ecx = Buffer address
  2409                                  ;	; edx = Byte count
  2410                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2411                                  ;	mov	ecx, LOGO_ADDRESS
  2412                                  ;	mov	edx, [LBM_FileSize]
  2413                                  ;	sys	_read
  2414                                  ;	jc	short loadlbm_cf
  2415                                  ;
  2416                                  ;	cmp	eax, edx  ; read count = file size ?
  2417                                  ;	;jb	short loadlbm_cf		 
  2418                                  ;loadlbm_cf:
  2419                                  ;	pushf
  2420                                  ;	sys	_close, [LBM_FileHandle]	
  2421                                  ;	popf
  2422                                  ;loadlbm_retn:
  2423                                  ;	retn	
  2424                                  ;
  2425                                  ;LOGO_FILE_NAME:
  2426                                  ;	db	"LOGO.LBM", 0
  2427                                  
  2428                                  LOGO_ERROR_MSG:
  2429 00000FAC 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2429 00000FB5 64696E672074686520-
  2429 00000FBE 4946462F494C424D20-
  2429 00000FC7 6C6F676F2070696374-
  2429 00000FD0 75726520210D0A00   
  2430                                  
  2431                                  align 2
  2432                                  ; 22/10/2017
  2433                                  LOGO_ADDRESS:
  2434                                  ;incbin "LOGO.LBM"	  	 
  2435                                  ; 27/10/2017
  2436 00000FD8 <incbin>                incbin "TINYPLAY.LBM"
  2437                                  
  2438                                  ;=============================================================================
  2439                                  ;               preinitialized data
  2440                                  ;=============================================================================
  2441                                  
  2442                                  ;=============================================================================
  2443                                  ; Protracker effects stuff
  2444                                  ;=============================================================================
  2445                                  
  2446                                  ;-----------------------------------------------------------------------------
  2447                                  ; Effect jump tables
  2448                                  ;-----------------------------------------------------------------------------
  2449                                  
  2450                                  align 4
  2451                                  
  2452                                  efxtable:
  2453 00004FC8 [95070000]              	dd      efxarpeggio	; 0 - arpeggio
  2454 00004FCC [C2040000]              	dd      efxnull		; 1 - porta up
  2455 00004FD0 [C2040000]              	dd      efxnull		; 2 - porta down
  2456 00004FD4 [E0060000]              	dd      efxtoneporta	; 3 - tone porta
  2457 00004FD8 [EF060000]              	dd      efxvibrato	; 4 - vibrato
  2458 00004FDC [C2040000]              	dd      efxnull		; 5 - tone+slide
  2459 00004FE0 [C2040000]              	dd      efxnull		; 6 - vibrato+slide
  2460 00004FE4 [0C080000]              	dd      efxtremolo	; 7 - tremolo
  2461 00004FE8 [C2040000]              	dd      efxnull		; 8 - unused
  2462 00004FEC [17070000]              	dd      efxsampoffset	; 9 - sample offset
  2463 00004FF0 [C2040000]              	dd      efxnull		; A - volume slide
  2464 00004FF4 [23070000]              	dd      efxpattjump	; B - pattern jump
  2465 00004FF8 [31070000]              	dd      efxsetvolume	; C - set volume
  2466 00004FFC [3F070000]              	dd      efxbreak	; D - break pattern
  2467 00005000 [C2040000]              	dd      efxnull		; E - extra effects
  2468 00005004 [5E070000]              	dd      efxsetspeed	; F - set speed
  2469                                  
  2470                                  efxtable2:
  2471 00005008 [C3040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2472 0000500C [E5040000]              	dd      efxportaup	; 1 - porta up
  2473 00005010 [0B050000]              	dd      efxportadown	; 2 - porta down
  2474 00005014 [32050000]              	dd      efxtoneporta2	; 3 - tone porta
  2475 00005018 [6B050000]              	dd      efxvibrato2	; 4 - vibrato
  2476 0000501C [C7050000]              	dd      efxtoneslide	; 5 - tone+slide
  2477 00005020 [D4050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2478 00005024 [FB050000]              	dd      efxtremolo2	; 7 - tremolo
  2479 00005028 [C2040000]              	dd      efxnull		; 8 - unused
  2480 0000502C [C2040000]              	dd      efxnull		; 9 - sample offset
  2481 00005030 [DE050000]              	dd      efxvolslide	; A - volume slide
  2482 00005034 [C2040000]              	dd      efxnull		; B - pattern jump
  2483 00005038 [C2040000]              	dd      efxnull		; C - set volume
  2484 0000503C [C2040000]              	dd      efxnull		; D - break pattern
  2485 00005040 [C2040000]              	dd      efxnull		; E - extra effects
  2486 00005044 [C2040000]              	dd      efxnull		; F - set speed
  2487                                  
  2488                                  ;-----------------------------------------------------------------------------
  2489                                  ; Amiga period table
  2490                                  ;-----------------------------------------------------------------------------
  2491                                  
  2492                                  ;PeriodTable0:	
  2493                                  ;	dw	0
  2494                                  PeriodTable:
  2495 00005048 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2495 00005051 0A000A7009E8086808-
  2495 0000505A F00780071407       
  2496 00005060 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2496 00005069 050005B80474043404-
  2496 00005072 F803C0038A03       
  2497 00005078 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2497 00005081 0280025C023A021A02-
  2497 0000508A FC01E001C501       
  2498 00005090 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2498 00005099 0140012E011D010D01-
  2498 000050A2 FE00F000E200       
  2499 000050A8 D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2499 000050B1 00A00097008F008700-
  2499 000050BA 7F0078007100       
  2500 000050C0 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2500 000050C9 0050004B0047004300-
  2500 000050D2 3F003C003800       
  2501 000050D8 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2501 000050E1 002800250023002100-
  2501 000050EA 1F001E001C00       
  2502                                  
  2503                                  ;-----------------------------------------------------------------------------
  2504                                  ; Sinus wave table
  2505                                  ;-----------------------------------------------------------------------------
  2506                                  
  2507                                  SinTable:
  2508 000050F0 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2508 000050F9 C5D4E1             
  2509 000050FC ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2509 00005105 E1                 
  2510 00005106 D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2510 0000510F 19                 
  2511                                  
  2512                                  ;=============================================================================
  2513                                  ;               PLAY.ASM - DATA
  2514                                  ;=============================================================================
  2515 00005110 00                      	db	0
  2516                                  msg_usage:
  2517 00005111 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2517 0000511A 506C6179657220666F-
  2517 00005123 72205452444F532033-
  2517 0000512C 383620627920457264-
  2517 00005135 6F67616E2054616E2E-
  2517 0000513E 20                 
  2518 0000513F 4F63746F6265722032-     	db	'October 2017.',10,13
  2518 00005148 3031372E0A0D       
  2519 0000514E 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2519 00005157 6F64706C6179206669-
  2519 00005160 6C656E616D652E6D6F-
  2519 00005169 640A0D00           
  2520 0000516D 32382F31302F323031-     	db	'28/10/2017',10,13,0
  2520 00005176 370A0D00           
  2521                                  
  2522                                  Credits:
  2523 0000517A 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2523 00005183 506C61796572207630-
  2523 0000518C 2E3162206279204361-
  2523 00005195 726C6F732048617361-
  2523 0000519E 6E2E204A756C792031-
  2523 000051A7 3939332E           
  2524 000051AB 0A0D00                  	db	10,13,0
  2525                                  ErrorMesg:    
  2526 000051AE 4572726F72206C6F61-     	db 'Error loading Module file.',10,13,0
  2526 000051B7 64696E67204D6F6475-
  2526 000051C0 6C652066696C652E0A-
  2526 000051C9 0D00               
  2527                                  
  2528                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2529                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2530                                  ;PortText:    db 'x0h, IRQ '
  2531                                  ;IrqText:     db 'x.',10,13,0
  2532                                  
  2533                                  trdos386_err_msg:
  2534 000051CB 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2534 000051D4 2053797374656D2063-
  2534 000051DD 616C6C206572726F72-
  2534 000051E6 20210A0D00         
  2535                                  
  2536                                  ; 07/10/2017
  2537 000051EB 0A                      pattern_shift:	db 10
  2538                                  ;numtracks:	dw 4
  2539                                  ; 18/10/2017
  2540 000051EC 04000000                numtracks:	dd 4
  2541                                  
  2542                                  ;=============================================================================
  2543                                  ;               PLAYER.ASM - DATA
  2544                                  ;=============================================================================
  2545                                  
  2546                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2547                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2548                                  
  2549                                  ;19/10/2017
  2550 000051F0 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2551 000051F1 10                      bps:		db 16 ; bits per sample (8 or 16)
  2552                                  
  2553                                  Sample_Rate:
  2554 000051F2 2256                    MixSpeed:	dw 22050 ; Hz
  2555                                  
  2556                                  ; 13/11/2016
  2557 000051F4 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2557 000051FD 3941424344454600   
  2558                                  ;
  2559                                  msgAC97Info:	
  2560 00005205 0D0A                    		db 0Dh, 0Ah
  2561 00005207 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2561 00005210 6F20436F6E74726F6C-
  2561 00005219 6C6572202620436F64-
  2561 00005222 656320496E666F0D0A 
  2562 0000522B 56656E646F72204944-     		db "Vendor ID: "
  2562 00005234 3A20               
  2563 00005236 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2563 0000523F 6963652049443A20   
  2564 00005247 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2565 0000524E 4275733A20              		db "Bus: "
  2566 00005253 303068204465766963-     msgBusNo:	db "00h Device: "
  2566 0000525C 653A20             
  2567 0000525F 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2567 00005268 696F6E3A20         
  2568 0000526D 303068                  msgFncNo	db "00h"
  2569 00005270 0D0A                    		db 0Dh, 0Ah
  2570 00005272 4E414D4241523A20        		db "NAMBAR: "
  2571 0000527A 30303030682020          msgNamBar	db "0000h  "
  2572 00005281 4E41424D4241523A20      		db "NABMBAR: "
  2573 0000528A 303030306820204952-     msgNabmBar	db "0000h  IRQ: "
  2573 00005293 513A20             
  2574 00005296 3030                    msgIRQ:		dw 3030h
  2575 00005298 0D0A00                  		db 0Dh, 0Ah, 0
  2576                                  ;
  2577                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2578                                  ;codec_id:	   dd 0
  2579                                  ;codec_chip_id:	   dd 0
  2580                                  ;codec_vendor_ids: dw 0
  2581                                  ;codec_chip_ids:   dw 0
  2582                                  
  2583                                  ;dword_str:	dd 30303030h, 30303030h
  2584                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2585                                  
  2586                                  ;=============================================================================
  2587                                  ;        	uninitialized data
  2588                                  ;=============================================================================
  2589                                  
  2590                                  bss_start:
  2591                                  
  2592                                  ABSOLUTE bss_start
  2593                                  
  2594 0000529B <res 00000001>          alignb 4
  2595                                  
  2596                                  ;------------------------------------------------------------------------------
  2597                                  ; IFF/ILBM DATA
  2598                                  ;------------------------------------------------------------------------------
  2599                                  
  2600 0000529C <res 00000004>          LBM_FileHandle:	resd 1
  2601 000052A0 <res 00000004>          LBM_FileSize:	resd 1
  2602                                  ;
  2603 000052A4 <res 00000004>          picture.width:	resd 1 		; current picture width and height
  2604 000052A8 <res 00000004>          picture.height:	resd 1
  2605                                  
  2606                                  ;------------------------------------------------------------------------------
  2607                                  
  2608 000052AC <res 00000004>          dev_vendor:	resd 1
  2609 000052B0 <res 00000004>          bus_dev_fn:	resd 1
  2610 000052B4 <res 00000004>          stats_cmd:	resd 1
  2611 000052B8 <res 00000002>          ac97_NamBar:	resw 1
  2612 000052BA <res 00000002>          ac97_NabmBar:	resw 1
  2613 000052BC <res 00000001>          ac97_int_ln_reg: resb 1
  2614 000052BD <res 00000001>          srb:		resb 1
  2615                                  
  2616                                  ; MODLOAD.ASM
  2617 000052BE <res 00000004>          FileHandle:	resd 1
  2618 000052C2 <res 0000043C>          Header:		resb ModHeader.size
  2619                                  
  2620                                  ; MODPLAY.ASM
  2621                                  ;MixSpeed:	    resw 1
  2622                                  
  2623                                  ModInfo:
  2624 000056FE <res 00000001>          ModInfo.OrderLen:   resb 1
  2625 000056FF <res 00000001>          ModInfo.ReStart:    resb 1
  2626 00005700 <res 00000080>          ModInfo.Order:	    resb 128
  2627 00005780 <res 00000004>          ModInfo.Patterns:   resd 1
  2628                                  
  2629 00005784 <res 0000003E>          ModInfo.SampOfs:    resw 31
  2630 000057C2 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2631 00005800 <res 0000003E>          ModInfo.SampLen:    resw 31
  2632 0000583E <res 0000003E>          ModInfo.SampRep:    resw 31
  2633 0000587C <res 0000003E>          ModInfo.SampRepLen: resw 31
  2634 000058BA <res 0000003E>          ModInfo.SampVol:    resw 31
  2635                                  
  2636                                  ; MODPLAY.ASM
  2637                                  PitchTable:	;resw 857
  2638 000058F8 <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2639 000073BA <res 00004100>          VolTable:	resb 16640
  2640 0000B4BA <res 00001FEC>          MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2641                                  
  2642                                  ; MODPLAY.ASM
  2643 0000D4A6 <res 00000001>          OrderPos:	resb 1
  2644 0000D4A7 <res 00000001>          Tempo:		resb 1
  2645 0000D4A8 <res 00000001>          TempoWait:	resb 1
  2646 0000D4A9 <res 00000001>          Bpm:		resb 1
  2647 0000D4AA <res 00000001>          Row:		resb 1
  2648 0000D4AB <res 00000001>          BreakRow:	resb 1
  2649 0000D4AC <res 00000002>          BpmSamples:	resw 1
  2650 0000D4AE <res 00000004>          BufPtr:		resd 1
  2651 0000D4B2 <res 00000002>          BufLen:		resw 1
  2652 0000D4B4 <res 00000004>          BufRep:		resd 1
  2653 0000D4B8 <res 00000004>          Note:		resd 1
  2654                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2655                                  ; 07/10/2017
  2656 0000D4BC <res 00000130>          Tracks:		resb TrackInfo.size*8
  2657                                  
  2658 0000D5EC <res 00000004>          alignb 16
  2659                                  
  2660                                  ; PLAY.ASM
  2661                                  ;Scope:		resw 320
  2662 0000D5F0 <res 00000200>          RowOfs:		resw 256
  2663                                  
  2664                                  ; 23/10/2017
  2665 0000D7F0 <res 00000200>          NewScope_L:	resw 256
  2666 0000D9F0 <res 00000200>          NewScope_R:	resw 256
  2667 0000DBF0 <res 00000200>          OldScope_L:	resw 256
  2668 0000DDF0 <res 00000200>          OldScope_R:	resw 256
  2669                                  
  2670                                  mod_file_name:
  2671 0000DFF0 <res 00000050>          		resb 80
  2672                                  
  2673                                  ; 20/10/2017 (modplay7.s, SB16)
  2674                                  ; 19/10/2017 (modplay6.s, AC97)
  2675 0000E040 <res 00000001>          pan_shift:	resb 1
  2676 0000E041 <res 00000001>          volume_level:	resb 1
  2677                                  
  2678 0000E042 <res 00000FBE>          alignb 4096
  2679                                  
  2680                                  Audio_Buffer:
  2681 0000F000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2682                                  ;temp_buffer:
  2683                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2684                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2685                                  
  2686 00017000 <res 00009000>          alignb 65536
  2687                                  
  2688                                  DMA_Buffer:
  2689 00020000 <res 00010000>          		resb 65536	
  2690                                  file_buffer:
  2691 00030000 <res 00060000>          		resb 65536*6
  2692                                  EOF:
