     1                                  ; ****************************************************************************
     2                                  ; tmodply3.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY3.PRG ! VIA VT8237R MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 28/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 24/08/2020 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of 'playmod6.s' ('PLAYMOD6.PRG') 
    29                                  ; by Erdogan Tan (15/10/2017)
    30                                  ;
    31                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM')
    32                                  ; by Erdogan Tan (04/03/2017)
    33                                  ; 
    34                                  ; Assembler: NASM 2.11
    35                                  ; ----------------------------------------------------------------------------
    36                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    37                                  ; ****************************************************************************
    38                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    39                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    40                                  
    41                                  ; 01/03/2017
    42                                  ; 16/10/2016
    43                                  ; 29/04/2016
    44                                  ; TRDOS 386 system calls (temporary list!)
    45                                  _ver 	equ 0
    46                                  _exit 	equ 1
    47                                  _fork 	equ 2
    48                                  _read 	equ 3
    49                                  _write	equ 4
    50                                  _open	equ 5
    51                                  _close 	equ 6
    52                                  _wait 	equ 7
    53                                  _creat 	equ 8
    54                                  _link 	equ 9
    55                                  _unlink	equ 10
    56                                  _exec	equ 11
    57                                  _chdir	equ 12
    58                                  _time 	equ 13
    59                                  _mkdir 	equ 14
    60                                  _chmod	equ 15
    61                                  _chown	equ 16
    62                                  _break	equ 17
    63                                  _stat	equ 18
    64                                  _seek	equ 19
    65                                  _tell 	equ 20
    66                                  _mount	equ 21
    67                                  _umount	equ 22
    68                                  _setuid	equ 23
    69                                  _getuid	equ 24
    70                                  _stime	equ 25
    71                                  _quit	equ 26	
    72                                  _intr	equ 27
    73                                  _fstat	equ 28
    74                                  _emt 	equ 29
    75                                  _mdate 	equ 30
    76                                  _video 	equ 31
    77                                  _audio	equ 32
    78                                  _timer	equ 33
    79                                  _sleep	equ 34
    80                                  _msg    equ 35
    81                                  _geterr	equ 36
    82                                  _fpsave	equ 37
    83                                  _pri	equ 38
    84                                  _rele	equ 39
    85                                  _fff	equ 40
    86                                  _fnf	equ 41
    87                                  _alloc	equ 42
    88                                  _dalloc equ 43
    89                                  _calbac equ 44		
    90                                  
    91                                  %macro sys 1-4
    92                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    93                                      ; 03/09/2015	
    94                                      ; 13/04/2015
    95                                      ; Retro UNIX 386 v1 system call.	
    96                                      %if %0 >= 2   
    97                                          mov ebx, %2
    98                                          %if %0 >= 3    
    99                                              mov ecx, %3
   100                                              %if %0 = 4
   101                                                 mov edx, %4   
   102                                              %endif
   103                                          %endif
   104                                      %endif
   105                                      mov eax, %1
   106                                      ;int 30h
   107                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   108                                  %endmacro
   109                                  
   110                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   111                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   112                                  
   113                                  ; 19/06/2017
   114                                  BUFFERSIZE equ 32768
   115                                  
   116                                  ; ----------------------------------------------------------------------------
   117                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   118                                  ;	July 14th, 1993.
   119                                  
   120                                  ;=============================================================================
   121                                  ;  
   122                                  ;=============================================================================
   123                                  
   124                                  [BITS 32]
   125                                  [org 0]
   126                                  
   127                                  Start:
   128                                  	; clear bss
   129 00000000 B9[00000900]            	mov	ecx, EOF
   130 00000005 BF[94520000]            	mov	edi, bss_start
   131 0000000A 29F9                    	sub	ecx, edi
   132 0000000C D1E9                    	shr	ecx, 1
   133 0000000E 31C0                    	xor	eax, eax
   134 00000010 F366AB                  	rep	stosw
   135                                  
   136                                  	; Detect (& Enable) VT8233 Audio Device
   137 00000013 E81A020000              	call    DetectVT8233
   138 00000018 731B                    	jnc     short GetFileName
   139                                  
   140                                  _dev_not_ready:
   141                                  ; couldn't find the audio device!
   142                                  	sys	_msg, noDevMsg, 255, 0Fh
   142                              <1> 
   142                              <1> 
   142                              <1> 
   142                              <1> 
   142                              <1>  %if %0 >= 2
   142 0000001A BB[3F020000]        <1>  mov ebx, %2
   142                              <1>  %if %0 >= 3
   142 0000001F B9FF000000          <1>  mov ecx, %3
   142                              <1>  %if %0 = 4
   142 00000024 BA0F000000          <1>  mov edx, %4
   142                              <1>  %endif
   142                              <1>  %endif
   142                              <1>  %endif
   142 00000029 B823000000          <1>  mov eax, %1
   142                              <1> 
   142 0000002E CD40                <1>  int 40h
   143 00000030 E9DC010000                      jmp     Exit
   144                                  
   145                                  GetFileName:
   146 00000035 89E6                    	mov	esi, esp
   147 00000037 AD                      	lodsd
   148 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   149                                  		; (program file name & mod file name)
   150 0000003B 0F82D9010000            	jb	pmsg_usage ; nothing to do
   151                                  
   152 00000041 AD                      	lodsd ; program file name address 
   153 00000042 AD                      	lodsd ; mod file name address (file to be read)
   154 00000043 89C6                    	mov	esi, eax
   155 00000045 BF[D8C10000]            	mov	edi, mod_file_name
   156                                  ScanName:       
   157 0000004A AC                      	lodsb
   158 0000004B 84C0                    	test	al, al
   159 0000004D 0F84C7010000            	je	pmsg_usage
   160 00000053 3C20                    	cmp	al, 20h
   161 00000055 74F3                    	je	short ScanName	; scan start of name.
   162 00000057 AA                      	stosb
   163 00000058 B4FF                    	mov	ah, 0FFh
   164                                  a_0:	
   165 0000005A FEC4                    	inc	ah
   166                                  a_1:
   167 0000005C AC                      	lodsb
   168 0000005D AA                      	stosb
   169 0000005E 3C2E                    	cmp	al, '.'
   170 00000060 74F8                    	je	short a_0	
   171 00000062 20C0                    	and	al, al
   172 00000064 75F6                    	jnz	short a_1
   173                                  
   174 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   175 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   176                                  SetExt:
   177 0000006A 4F                      	dec	edi
   178 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   179 00000071 C6470400                	mov	byte [edi+4], 0
   180                                  PrintPMesg:      
   181                                  	; Prints the Credits Text.
   182                                  	sys	_msg, Credits, 255, 0Fh
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1> 
   182                              <1>  %if %0 >= 2
   182 00000075 BB[7A510000]        <1>  mov ebx, %2
   182                              <1>  %if %0 >= 3
   182 0000007A B9FF000000          <1>  mov ecx, %3
   182                              <1>  %if %0 = 4
   182 0000007F BA0F000000          <1>  mov edx, %4
   182                              <1>  %endif
   182                              <1>  %endif
   182                              <1>  %endif
   182 00000084 B823000000          <1>  mov eax, %1
   182                              <1> 
   182 00000089 CD40                <1>  int 40h
   183                                  _1:
   184                                  	; 19/06/2017
   185                                  	; Allocate Audio Buffer (for user)
   186                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   186                              <1> 
   186                              <1> 
   186                              <1> 
   186                              <1> 
   186                              <1>  %if %0 >= 2
   186 0000008B BB00020000          <1>  mov ebx, %2
   186                              <1>  %if %0 >= 3
   186 00000090 B900800000          <1>  mov ecx, %3
   186                              <1>  %if %0 = 4
   186 00000095 BA[00D00000]        <1>  mov edx, %4
   186                              <1>  %endif
   186                              <1>  %endif
   186                              <1>  %endif
   186 0000009A B820000000          <1>  mov eax, %1
   186                              <1> 
   186 0000009F CD40                <1>  int 40h
   187 000000A1 0F8213010000            	jc	error_exit
   188                                  _2:
   189                                  	; 23/08/2020
   190                                  	; Initialize Audio Device (bl = 1 -> Interrupt method)
   191                                  	sys	_audio, 0301h, 0, ac97_int_handler 
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1>  %if %0 >= 2
   191 000000A7 BB01030000          <1>  mov ebx, %2
   191                              <1>  %if %0 >= 3
   191 000000AC B900000000          <1>  mov ecx, %3
   191                              <1>  %if %0 = 4
   191 000000B1 BA[76020000]        <1>  mov edx, %4
   191                              <1>  %endif
   191                              <1>  %endif
   191                              <1>  %endif
   191 000000B6 B820000000          <1>  mov eax, %1
   191                              <1> 
   191 000000BB CD40                <1>  int 40h
   192 000000BD 0F82F7000000            	jc	error_exit
   193                                  	
   194                                  	; 20/10/2017
   195                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   196                                  	;sys	_audio, 0300h, 1, srb
   197                                  	;jc	error_exit
   198                                  
   199                                  LoadMod:  
   200 000000C3 BF[D8C10000]            	mov	edi, mod_file_name
   201 000000C8 E87D020000              	call    LoadModule		; Load the MODule...
   202                                  	; 08/10/2017
   203 000000CD 731B                    	jnc	short _3		; any error loading?
   204                                  
   205                                  	; yes, print error and Exit.
   206                                  
   207                                  	sys	_msg, ErrorMesg, 255, 0Fh
   207                              <1> 
   207                              <1> 
   207                              <1> 
   207                              <1> 
   207                              <1>  %if %0 >= 2
   207 000000CF BB[AE510000]        <1>  mov ebx, %2
   207                              <1>  %if %0 >= 3
   207 000000D4 B9FF000000          <1>  mov ecx, %3
   207                              <1>  %if %0 = 4
   207 000000D9 BA0F000000          <1>  mov edx, %4
   207                              <1>  %endif
   207                              <1>  %endif
   207                              <1>  %endif
   207 000000DE B823000000          <1>  mov eax, %1
   207                              <1> 
   207 000000E3 CD40                <1>  int 40h
   208 000000E5 E927010000              	jmp     Exit
   209                                  _3:
   210                                  	; 10/06/2017
   211                                  	sys	_audio, 0E00h ; get audio controller info
   211                              <1> 
   211                              <1> 
   211                              <1> 
   211                              <1> 
   211                              <1>  %if %0 >= 2
   211 000000EA BB000E0000          <1>  mov ebx, %2
   211                              <1>  %if %0 >= 3
   211                              <1>  mov ecx, %3
   211                              <1>  %if %0 = 4
   211                              <1>  mov edx, %4
   211                              <1>  %endif
   211                              <1>  %endif
   211                              <1>  %endif
   211 000000EF B820000000          <1>  mov eax, %1
   211                              <1> 
   211 000000F4 CD40                <1>  int 40h
   212 000000F6 0F82BE000000            	jc	error_exit
   213                                  
   214                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   215                                  	;jne	_dev_not_ready		
   216                                  
   217                                  	; EAX = IRQ Number in AL
   218                                  	;	Audio Device Number in AH 
   219                                  	; EBX = DEV/VENDOR ID
   220                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   221                                  	; ECX = BUS/DEV/FN 
   222                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   223                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   224                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   225                                  	;      (Low word, DX = NAMBAR address)
   226                                  
   227 000000FC A2[B2520000]            	mov	[ac97_int_ln_reg], al
   228 00000101 891D[A4520000]          	mov	[dev_vendor], ebx
   229 00000107 890D[A8520000]          	mov	[bus_dev_fn], ecx
   230 0000010D 668915[B0520000]        	mov	[ac97_io_base], dx	
   231                                    
   232 00000114 E8050B0000              	call	write_audio_dev_info 
   233                                  
   234                                  PlayNow: 
   235 00000119 E81F0A0000              	call    StartPlaying
   236                                  
   237                                  	; 03/08/2020
   238                                          ; load 32768 bytes into audio buffer
   239                                  	;mov	edi, Audio_Buffer
   240                                  	; 19/10/2017
   241                                  	;;mov	ebx, BUFFERSIZE
   242                                  	;mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   243 0000011E E8AE080000              	call	GetSamples
   244 00000123 0F8291000000            	jc	error_exit
   245                                  
   246                                  ;	;mov	ecx, 128	; Make a lookup table
   247                                  ;	mov	cl, 128
   248                                  ;	xor     ebx, ebx	; for fastest pixel
   249                                  ;	mov     edx, 320*(100-64)	; addressing.
   250                                  ;MakeOfs:        
   251                                  ;	mov     [RowOfs+ebx], dx
   252                                  ;	mov     [RowOfs+ebx+2], dx
   253                                  ;	add     dx, 320
   254                                  ;	add     ebx, 4
   255                                  ;	loop    MakeOfs
   256                                  
   257                                  	; 03/08/2020
   258                                  	; bh = 16 : update (current) dma half buffer
   259                                  	; bl = 0  : then switch to the next half buffer
   260                                  	sys	_audio, 1000h ; 29/07/2020
   260                              <1> 
   260                              <1> 
   260                              <1> 
   260                              <1> 
   260                              <1>  %if %0 >= 2
   260 00000129 BB00100000          <1>  mov ebx, %2
   260                              <1>  %if %0 >= 3
   260                              <1>  mov ecx, %3
   260                              <1>  %if %0 = 4
   260                              <1>  mov edx, %4
   260                              <1>  %endif
   260                              <1>  %endif
   260                              <1>  %endif
   260 0000012E B820000000          <1>  mov eax, %1
   260                              <1> 
   260 00000133 CD40                <1>  int 40h
   261                                  
   262                                  	; 03/08/2020
   263                                          ; load 32768 bytes into audio buffer
   264                                  	;mov	edi, Audio_Buffer
   265                                  	; 19/10/2017
   266                                  	;mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   267 00000135 E897080000              	call	GetSamples
   268 0000013A 727E                    	jc	error_exit
   269                                  
   270                                  	; 27/10/2017
   271 0000013C 66B90001                	mov	cx, 256
   272 00000140 31DB                    	xor	ebx, ebx
   273 00000142 BF[30C20000]            	mov	edi, RowOfs
   274                                  MakeOfs:
   275                                  	; 29/10/2017
   276                                  	;mov	ax, 128
   277                                  	;mul	bx
   278                                  	;mov	al, ah
   279                                  	;mov	ah, 80
   280                                  	;mul	ah
   281 00000147 89D8                    	mov	eax, ebx
   282 00000149 66C1E007                	shl	ax, 7 ; * 128
   283 0000014D B050                    	mov	al, 80
   284 0000014F F6E4                    	mul	ah
   285 00000151 66AB                    	stosw
   286 00000153 43                      	inc	ebx
   287 00000154 E2F1                    	loop	MakeOfs
   288                                  	
   289                                  	; 09/10/2017 (2*BUFFERSIZE, 64K)
   290                                  	; 23/06/2017
   291                                  	; Map DMA buffer to user's memory space
   292                                  	sys	_audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer
   292                              <1> 
   292                              <1> 
   292                              <1> 
   292                              <1> 
   292                              <1>  %if %0 >= 2
   292 00000156 BB000D0000          <1>  mov ebx, %2
   292                              <1>  %if %0 >= 3
   292 0000015B B900000100          <1>  mov ecx, %3
   292                              <1>  %if %0 = 4
   292 00000160 BA[00000200]        <1>  mov edx, %4
   292                              <1>  %endif
   292                              <1>  %endif
   292                              <1>  %endif
   292 00000165 B820000000          <1>  mov eax, %1
   292                              <1> 
   292 0000016A CD40                <1>  int 40h
   293                                  	;jc	error_exit
   294                                  
   295                                  	; 24/06/2017
   296                                  	; Set Master Volume Level (BL=0 or 80h)
   297                                  	; 	 	for next playing (BL>=80h)
   298                                  	;sys	_audio, 0B80h, 1D1Dh
   299                                  
   300                                  	; 23/08/2020
   301                                  	; Set Master Volume Level (BL=0 or 80h)
   302                                  	sys	_audio, 0B00h, 1D1Dh
   302                              <1> 
   302                              <1> 
   302                              <1> 
   302                              <1> 
   302                              <1>  %if %0 >= 2
   302 0000016C BB000B0000          <1>  mov ebx, %2
   302                              <1>  %if %0 >= 3
   302 00000171 B91D1D0000          <1>  mov ecx, %3
   302                              <1>  %if %0 = 4
   302                              <1>  mov edx, %4
   302                              <1>  %endif
   302                              <1>  %endif
   302                              <1>  %endif
   302 00000176 B820000000          <1>  mov eax, %1
   302                              <1> 
   302 0000017B CD40                <1>  int 40h
   303                                  
   304                                  	; 20/10/2017
   305                                  	;mov	byte [volume_level], 1Dh
   306 0000017D 880D[31CC0000]          	mov	[volume_level], cl ; 03/08/2020
   307                                  
   308                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   309                                  	
   310                                  	; Start	to play
   311 00000183 A0[F1510000]            	mov	al, [bps]
   312 00000188 C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   313 0000018B D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   314 0000018D 8A1D[F0510000]          	mov	bl, [stmo]
   315 00000193 FECB                    	dec	bl
   316 00000195 08C3                    	or	bl, al
   317 00000197 668B0D[F2510000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   318 0000019E B704                    	mov	bh, 4 ; start to play	
   319                                  	sys	_audio
   319                              <1> 
   319                              <1> 
   319                              <1> 
   319                              <1> 
   319                              <1>  %if %0 >= 2
   319                              <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 000001A0 B820000000          <1>  mov eax, %1
   319                              <1> 
   319 000001A5 CD40                <1>  int 40h
   320                                      
   321                                  	;; SETUP SIGNAL RESPONSE BYTE
   322                                  	;; 06/03/2017
   323                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   324                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   325                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   326                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   327                                  	;sys	_calbac
   328                                  	;jc	short error_exit
   329                                  
   330                                  	; DIRECT VGA MEMORY ACCESS
   331                                  	; bl = 0, bh = 5
   332                                  	; Direct access/map to VGA memory (0A0000h)
   333                                  
   334                                  	sys	_video, 0500h
   334                              <1> 
   334                              <1> 
   334                              <1> 
   334                              <1> 
   334                              <1>  %if %0 >= 2
   334 000001A7 BB00050000          <1>  mov ebx, %2
   334                              <1>  %if %0 >= 3
   334                              <1>  mov ecx, %3
   334                              <1>  %if %0 = 4
   334                              <1>  mov edx, %4
   334                              <1>  %endif
   334                              <1>  %endif
   334                              <1>  %endif
   334 000001AC B81F000000          <1>  mov eax, %1
   334                              <1> 
   334 000001B1 CD40                <1>  int 40h
   335 000001B3 3D00000A00              	cmp	eax, 0A0000h
   336 000001B8 7418                    	je	short _a3
   337                                  error_exit:
   338                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1> 
   338                              <1>  %if %0 >= 2
   338 000001BA BB[CB510000]        <1>  mov ebx, %2
   338                              <1>  %if %0 >= 3
   338 000001BF B9FF000000          <1>  mov ecx, %3
   338                              <1>  %if %0 = 4
   338 000001C4 BA0E000000          <1>  mov edx, %4
   338                              <1>  %endif
   338                              <1>  %endif
   338                              <1>  %endif
   338 000001C9 B823000000          <1>  mov eax, %1
   338                              <1> 
   338 000001CE CD40                <1>  int 40h
   339 000001D0 EB3F                    	jmp	short Exit
   340                                  
   341                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   342                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   343                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   344                                  ;       second, or the module will sound "looped".
   345                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   346                                  ;       the polling is called from my routine, and then the irq 0 must be
   347                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   348                                  ;       samples played by the Sound Blaster. Note that some samples are
   349                                  ;       discarded in the next code, just for fun!
   350                                  
   351                                  _a3:
   352                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   353                                  	;int     31h
   354                                  
   355                                  	; 21/10/2017
   356                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   357                                  	;int	31h
   358                                  
   359                                  	; 22/10/2017
   360 000001D2 E8C80B0000              	call	setgraphmode	; Set video mode to 640*480x16
   361                                  
   362                                  	; 22/10/2017
   363                                  	;call	loadlbm
   364                                  	;jc	short loadlbm_err
   365                                  
   366 000001D7 BE[CC0F0000]            	mov	esi, LOGO_ADDRESS
   367 000001DC E8B00C0000              	call	putlbm
   368                                  	;jnc	short loadlbm_ok
   369 000001E1 731F                    	jnc	short _a4 ; 
   370                                  
   371                                  	;mov	byte [error_color], 0Eh ; Yellow
   372                                  
   373                                  loadlbm_err:
   374                                  	; 21/10/2017
   375                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   376                                  	;int	31h
   377                                  	; 22/10/2017
   378 000001E3 E8D40B0000              	call	settextmode
   379                                  
   380                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
   380                              <1> 
   380                              <1> 
   380                              <1> 
   380                              <1> 
   380                              <1>  %if %0 >= 2
   380 000001E8 BB[9F0F0000]        <1>  mov ebx, %2
   380                              <1>  %if %0 >= 3
   380 000001ED B9FF000000          <1>  mov ecx, %3
   380                              <1>  %if %0 = 4
   380 000001F2 8B15[01020000]      <1>  mov edx, %4
   380                              <1>  %endif
   380                              <1>  %endif
   380                              <1>  %endif
   380 000001F8 B823000000          <1>  mov eax, %1
   380                              <1> 
   380 000001FD CD40                <1>  int 40h
   381 000001FF EB10                    	jmp	short Exit
   382                                  
   383                                  	; 21/10/2017
   384                                  error_color:
   385 00000201 0C                      	db	0Ch  ; Light Red
   386                                  	
   387                                  loadlbm_ok: 
   388                                  	; 21/10/2017
   389                                  _a4:
   390                                  	; 24/06/2017
   391 00000202 E889000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   392                                  
   393                                  _s_exit:
   394 00000207 E8E1090000              	call	StopPlaying	; STOP!
   395                                  	
   396                                  	; 22/10/2017
   397                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   398                                  	;int	31h
   399 0000020C E8AB0B0000              	call	settextmode
   400                                  Exit:           
   401                                  	;call	FreeModule	; Free MODule core.
   402                                  	
   403                                  	sys 	_exit	; Bye !
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1> 
   403                              <1>  %if %0 >= 2
   403                              <1>  mov ebx, %2
   403                              <1>  %if %0 >= 3
   403                              <1>  mov ecx, %3
   403                              <1>  %if %0 = 4
   403                              <1>  mov edx, %4
   403                              <1>  %endif
   403                              <1>  %endif
   403                              <1>  %endif
   403 00000211 B801000000          <1>  mov eax, %1
   403                              <1> 
   403 00000216 CD40                <1>  int 40h
   404                                  here:
   405 00000218 EBFE                    	jmp	short here
   406                                  
   407                                  pmsg_usage:
   408                                  	sys	_msg, msg_usage, 255, 0Fh
   408                              <1> 
   408                              <1> 
   408                              <1> 
   408                              <1> 
   408                              <1>  %if %0 >= 2
   408 0000021A BB[05510000]        <1>  mov ebx, %2
   408                              <1>  %if %0 >= 3
   408 0000021F B9FF000000          <1>  mov ecx, %3
   408                              <1>  %if %0 = 4
   408 00000224 BA0F000000          <1>  mov edx, %4
   408                              <1>  %endif
   408                              <1>  %endif
   408                              <1>  %endif
   408 00000229 B823000000          <1>  mov eax, %1
   408                              <1> 
   408 0000022E CD40                <1>  int 40h
   409 00000230 EBDF                    	jmp	short Exit
   410                                  
   411                                  DetectVT8233:
   412                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   413                                          sys	_audio, 0103h
   413                              <1> 
   413                              <1> 
   413                              <1> 
   413                              <1> 
   413                              <1>  %if %0 >= 2
   413 00000232 BB03010000          <1>  mov ebx, %2
   413                              <1>  %if %0 >= 3
   413                              <1>  mov ecx, %3
   413                              <1>  %if %0 = 4
   413                              <1>  mov edx, %4
   413                              <1>  %endif
   413                              <1>  %endif
   413                              <1>  %endif
   413 00000237 B820000000          <1>  mov eax, %1
   413                              <1> 
   413 0000023C CD40                <1>  int 40h
   414 0000023E C3                      	retn
   415                                  
   416                                  noDevMsg:
   417 0000023F 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   417 00000248 61626C6520746F2066-
   417 00000251 696E64205649412056-
   417 0000025A 543832333320626173-
   417 00000263 656420617564696F20-
   417 0000026C 646576696365210D0A-
   417 00000275 00                 
   418                                  
   419                                  ac97_int_handler: 
   420                                  	; 23/08/2020
   421                                  	; 28/10/2017
   422                                  	; 14/10/2017
   423                                  	; 09/10/2017
   424                                  	; 19/06/2017
   425 00000276 C605[B3520000]01        	mov	byte [srb], 1 ; interrupt (or signal response byte)
   426                                  
   427                                  	;;mov	ebx, BUFFERSIZE
   428                                  	;mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   429 0000027D E84F070000              	call	GetSamples
   430                                  	;jc	error_exit
   431                                  
   432                                  	sys	_rele ; return from callback service 
   432                              <1> 
   432                              <1> 
   432                              <1> 
   432                              <1> 
   432                              <1>  %if %0 >= 2
   432                              <1>  mov ebx, %2
   432                              <1>  %if %0 >= 3
   432                              <1>  mov ecx, %3
   432                              <1>  %if %0 = 4
   432                              <1>  mov edx, %4
   432                              <1>  %endif
   432                              <1>  %endif
   432                              <1>  %endif
   432 00000282 B827000000          <1>  mov eax, %1
   432                              <1> 
   432 00000287 CD40                <1>  int 40h
   433                                  	; we must not come here !
   434                                  	sys	_exit
   434                              <1> 
   434                              <1> 
   434                              <1> 
   434                              <1> 
   434                              <1>  %if %0 >= 2
   434                              <1>  mov ebx, %2
   434                              <1>  %if %0 >= 3
   434                              <1>  mov ecx, %3
   434                              <1>  %if %0 = 4
   434                              <1>  mov edx, %4
   434                              <1>  %endif
   434                              <1>  %endif
   434                              <1>  %endif
   434 00000289 B801000000          <1>  mov eax, %1
   434                              <1> 
   434 0000028E CD40                <1>  int 40h
   435                                  
   436                                  ;=============================================================================
   437                                  ;      
   438                                  ;=============================================================================
   439                                  
   440                                  PlayMod:
   441                                  	; 24/08/2020
   442                                  	; 03/08/2020
   443                                  	; 27/10/2017
   444                                  	; 19/10/2017
   445                                  	; 23/06/2017   
   446                                  	; 21/06/2017
   447                                  	; 19/06/2017
   448                                  
   449                                  	; 05/03/2017 (TRDOS 386)
   450                                  	; 14/02/2017
   451                                  	; 13/02/2017
   452                                  	; 08/12/2016
   453                                  	; 28/11/2016
   454                                  
   455                                  	; 03/08/2020
   456                                       	;jmp	short modp_gs ; 23/06/2017
   457                                  
   458                                  	; 24/08/2020
   459 00000290 FE05[28C20000]          	inc	byte [counter]
   460                                  p_loop:
   461 00000296 803D[B3520000]00        	cmp	byte [srb], 0
   462 0000029D 7609                    	jna	short q_loop
   463                                  
   464 0000029F C605[B3520000]00        	mov	byte [srb], 0
   465                                  modp_gs:
   466                                  	; 23/08/2020
   467                                  	; 03/08/2020
   468                                  	;mov	edi, Audio_Buffer
   469                                  	; 19/10/2017
   470                                  	;;;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   471                                  	;;mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   472                                  	;call	GetSamples
   473                                  	;jc	error_exit
   474                                  	
   475                                  	; 23/08/2020
   476 000002A6 EB6B                    	jmp	r_loop
   477                                  q_loop:
   478                                  	; 24/08/2020
   479 000002A8 F605[28C20000]3F        	test	byte [counter], 63
   480 000002AF 7562                    	jnz	short r_loop
   481                                  k_loop:
   482 000002B1 B401                    	mov     ah, 1		; any key pressed?
   483 000002B3 CD32                    	int     32h		; no, Loop.
   484 000002B5 745C                    	jz	short r_loop
   485                                  
   486 000002B7 B400                    	mov     ah, 0		; flush key buffer...
   487 000002B9 CD32                    	int     32h
   488                                  
   489                                  	; 19/10/2017 (modplay6.s)
   490 000002BB 3C20                    	cmp	al, 20h
   491 000002BD 740E                    	je	short change_pan
   492                                  	; 09/10/2017 (playmod5.s)
   493 000002BF 3C2B                    	cmp	al, '+' ; increase sound volume
   494 000002C1 741D                    	je	short inc_volume_level
   495 000002C3 3C2D                    	cmp	al, '-'
   496 000002C5 743C                    	je	short dec_volume_level
   497                                  
   498                                  	; 19/10/2017 (modplay6.s)
   499 000002C7 24DF                    	and	al, 0DFh
   500 000002C9 3C50                    	cmp	al, 'P'
   501 000002CB 7545                    	jne	short q_return
   502                                  
   503                                  change_pan:
   504                                  	; 19/10/2017 (modplay6.s)
   505 000002CD 8A0D[30CC0000]          	mov	cl, [pan_shift]
   506 000002D3 FEC1                    	inc	cl
   507 000002D5 80E103                  	and	cl, 3
   508 000002D8 880D[30CC0000]          	mov	[pan_shift], cl
   509 000002DE EB33                    	jmp	short r_loop
   510                                  
   511                                  	; 09/10/2017 (playmod5.s)
   512                                  	; 24/06/2017 (wavplay2.s)
   513                                  inc_volume_level:
   514 000002E0 8A0D[31CC0000]          	mov	cl, [volume_level]
   515 000002E6 80F91F                  	cmp	cl, 1Fh ; 31
   516 000002E9 7328                    	jnb	short r_loop
   517 000002EB FEC1                    	inc	cl
   518                                  change_volume_level:
   519 000002ED 880D[31CC0000]          	mov	[volume_level], cl
   520 000002F3 88CD                    	mov	ch, cl
   521                                  	; Set Master Volume Level
   522                                  	sys	_audio, 0B00h
   522                              <1> 
   522                              <1> 
   522                              <1> 
   522                              <1> 
   522                              <1>  %if %0 >= 2
   522 000002F5 BB000B0000          <1>  mov ebx, %2
   522                              <1>  %if %0 >= 3
   522                              <1>  mov ecx, %3
   522                              <1>  %if %0 = 4
   522                              <1>  mov edx, %4
   522                              <1>  %endif
   522                              <1>  %endif
   522                              <1>  %endif
   522 000002FA B820000000          <1>  mov eax, %1
   522                              <1> 
   522 000002FF CD40                <1>  int 40h
   523 00000301 EB10                    	jmp	short r_loop
   524                                  dec_volume_level:
   525 00000303 8A0D[31CC0000]          	mov	cl, [volume_level]
   526 00000309 80F901                  	cmp	cl, 1 ; 1
   527 0000030C 7605                    	jna	short r_loop
   528 0000030E FEC9                    	dec	cl
   529 00000310 EBDB                    	jmp	short change_volume_level
   530                                  q_return:
   531 00000312 C3                      	retn
   532                                  r_loop:
   533                                  	; 24/08/2020
   534 00000313 FE05[28C20000]          	inc	byte [counter]
   535 00000319 758D                    	jnz	short q_loop
   536                                  
   537                                  	; 27/10/2017
   538                                  	; Get Current DMA buffer Pointer 
   539                                  	; 23/06/2017 ('modplay6.s')
   540                                  	; bh = 15, get current pointer (DMA buffer offset)
   541                                  	; bl = 0, for PCM OUT
   542                                  	; ecx = 0
   543                                  	;
   544                                  	sys	_audio, 0F00h, 0
   544                              <1> 
   544                              <1> 
   544                              <1> 
   544                              <1> 
   544                              <1>  %if %0 >= 2
   544 0000031B BB000F0000          <1>  mov ebx, %2
   544                              <1>  %if %0 >= 3
   544 00000320 B900000000          <1>  mov ecx, %3
   544                              <1>  %if %0 = 4
   544                              <1>  mov edx, %4
   544                              <1>  %endif
   544                              <1>  %endif
   544                              <1>  %endif
   544 00000325 B820000000          <1>  mov eax, %1
   544                              <1> 
   544 0000032A CD40                <1>  int 40h
   545                                  
   546                                  	; 28/10/2017
   547 0000032C 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   548                                  	; 23/06/2017
   549 0000032E BE[00000200]            	mov     esi, DMA_Buffer
   550 00000333 01C6                    	add     esi, eax	; add offset value
   551                                  	; 24/06/2017
   552 00000335 B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   553 0000033A 39CE                    	cmp	esi, ecx 
   554 0000033C 7602                    	jna	short _4
   555 0000033E 89CE                    	mov	esi, ecx
   556                                  _4:
   557                                  	; 23/10/2017 ('tmodplay.s')
   558 00000340 E87E0A0000              	call	drawscopes
   559                                  
   560 00000345 E94CFFFFFF              	jmp	p_loop
   561                                  
   562                                  ;=============================================================================
   563                                  ;               MODLOAD.ASM
   564                                  ;=============================================================================
   565                                  
   566                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   567                                  ;	July 10th, 1993.
   568                                  
   569                                  ; STRUCTURES
   570                                  
   571                                  struc ModSample
   572 00000000 <res 00000016>          .msName:	resb 22
   573 00000016 <res 00000002>          .msLength:	resw 1
   574 00000018 <res 00000001>          .msFinetune:	resb 1
   575 00000019 <res 00000001>          .msVolume:	resb 1
   576 0000001A <res 00000002>          .msRepeat:	resw 1
   577 0000001C <res 00000002>          .msRepLen:	resw 1
   578                                  .size:		; 30 bytes
   579                                  endstruc
   580                                  
   581                                  struc ModHeader
   582 00000000 <res 00000014>          .mhName:	resb 20
   583 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   584 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   585 000003B7 <res 00000001>          .mhReStart:	resb 1
   586 000003B8 <res 00000080>          .mhOrder:	resb 128
   587 00000438 <res 00000004>          .mhSign:	resw 2
   588                                  .size:		; 1084 bytes
   589                                  endstruc
   590                                  
   591                                  struc ModInfoRec
   592 00000000 <res 00000001>          .OrderLen:	resb 1
   593 00000001 <res 00000001>          .ReStart:	resb 1
   594 00000002 <res 00000080>          .Order:		resb 128
   595 00000082 <res 00000004>          .Patterns:	resd 1
   596 00000086 <res 0000003E>          .SampOfs:	resw 31
   597 000000C4 <res 0000003E>          .SampSeg:	resw 31
   598 00000102 <res 0000003E>          .SampLen:	resw 31
   599 00000140 <res 0000003E>          .SampRep:	resw 31
   600 0000017E <res 0000003E>          .SampRepLen:	resw 31
   601 000001BC <res 0000003E>          .SampVol:	resw 31
   602                                  .size:		; 506 bytes	
   603                                  endstruc
   604                                  
   605                                  ; CODE
   606                                  
   607                                  ; modplay5.s
   608                                  ; 07/10/2017
   609                                  ; tinyply3.s
   610                                  ; 06/10/2017
   611                                  ; 04/10/2017
   612                                  ; /* MOD FileFormat */
   613                                  
   614                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   615                                  ID_FLT4 equ 34544C46h ; "FLT4"
   616                                  ID_8CHN equ 4E484338h ; "8CHN"
   617                                  ID_FLT8 equ 34544C46h ; "FLT8"
   618                                  
   619                                  ; CODE
   620                                  
   621                                  LoadModule:
   622                                  	; edi = file name address
   623                                  
   624 0000034A 60                      	pushad
   625                                  
   626 0000034B E878010000              	call    ClearModInfo
   627                                  OpenFile:       
   628                                  	; ebx = ASCIIZ file name address
   629                                  	; ecx = open mode (0 = open for read)	
   630                                  	sys	_open, edi, 0 ; open for reading
   630                              <1> 
   630                              <1> 
   630                              <1> 
   630                              <1> 
   630                              <1>  %if %0 >= 2
   630 00000350 89FB                <1>  mov ebx, %2
   630                              <1>  %if %0 >= 3
   630 00000352 B900000000          <1>  mov ecx, %3
   630                              <1>  %if %0 = 4
   630                              <1>  mov edx, %4
   630                              <1>  %endif
   630                              <1>  %endif
   630                              <1>  %endif
   630 00000357 B805000000          <1>  mov eax, %1
   630                              <1> 
   630 0000035C CD40                <1>  int 40h
   631 0000035E 0F8262010000            	jc	Failed
   632 00000364 A3[B4520000]            	mov     [FileHandle], eax
   633                                  ReadHeader:
   634                                  	; ebx = File handle
   635                                  	; ecx = Buffer address
   636                                  	; edx = Byte count
   637                                  	sys	_read, [FileHandle], Header, ModHeader.size
   637                              <1> 
   637                              <1> 
   637                              <1> 
   637                              <1> 
   637                              <1>  %if %0 >= 2
   637 00000369 8B1D[B4520000]      <1>  mov ebx, %2
   637                              <1>  %if %0 >= 3
   637 0000036F B9[B8520000]        <1>  mov ecx, %3
   637                              <1>  %if %0 = 4
   637 00000374 BA3C040000          <1>  mov edx, %4
   637                              <1>  %endif
   637                              <1>  %endif
   637                              <1>  %endif
   637 00000379 B803000000          <1>  mov eax, %1
   637                              <1> 
   637 0000037E CD40                <1>  int 40h
   638 00000380 0F8231010000            	jc      CloseFile
   639                                  CheckMK:  
   640                                  	; 04/10/2017
   641 00000386 A1[F0560000]            	mov	eax, [Header+ModHeader.mhSign]
   642                                        
   643 0000038B 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   644                                  	;je	short Is4chnMod
   645 00000390 742B                    	je	short IsModFile
   646                                  CheckFLT4:
   647 00000392 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   648                                  	;je	short Is4chnMod
   649 00000397 7424                    	je	short IsModFile
   650                                  Check8CHN:
   651 00000399 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   652 0000039E 740D                    	je	short Is8chnMod
   653                                  CheckFLT8:
   654 000003A0 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   655                                  	; 06/10/2017
   656 000003A5 7406                    	je	short Is8chnMod
   657 000003A7 F9                      	stc
   658 000003A8 E90A010000              	jmp	CloseFile
   659                                  Is8chnMod:
   660 000003AD C605[EC510000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   661 000003B4 C605[EB510000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   662 000003BB EB00                    	jmp	short IsModFile
   663                                  ;Is4chnMod:
   664                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   665                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   666                                  
   667                                  IsModFile:
   668 000003BD A0[6E560000]            	mov     al, [Header+ModHeader.mhOrderLen]
   669 000003C2 A2[F4560000]            	mov     [ModInfo.OrderLen], al
   670                                  
   671 000003C7 A0[6F560000]            	mov     al, [Header+ModHeader.mhReStart]
   672 000003CC 3A05[6E560000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   673 000003D2 7202                    	jb      short SetReStart
   674 000003D4 B07F                    	mov     al, 7Fh
   675                                  SetReStart:
   676 000003D6 A2[F5560000]            	mov     [ModInfo.ReStart], al
   677                                  
   678                                  	;mov	ecx, 128
   679 000003DB 66B98000                	mov	cx, 128
   680 000003DF 31D2                    	xor     edx, edx
   681 000003E1 31DB                    	xor     ebx, ebx
   682                                  CopyOrder:
   683 000003E3 8AB3[70560000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   684 000003E9 88B3[F6560000]          	mov     [ModInfo.Order+ebx], dh
   685 000003EF 38D6                    	cmp     dh, dl
   686 000003F1 7202                    	jb      short NextOrder
   687 000003F3 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   688                                  NextOrder:
   689 000003F5 43                      	inc     ebx
   690 000003F6 E2EB                    	loop    CopyOrder
   691                                  AllocPatterns:  
   692 000003F8 81E2FF000000            	and	edx, 0FFh
   693                                  	; 04/10/2017
   694                                  	;inx	dx  ; 12/03/2017
   695 000003FE FEC2                    	inc	dl
   696                                  	; dl = number of patterns (04/07/2017)
   697 00000400 8A0D[EB510000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   698 00000406 D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   699                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   700                                  	;
   701 00000408 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   702                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   703 0000040A B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   704                                  	;
   705 0000040F 890D[76570000]          	mov	[ModInfo.Patterns], ecx
   706                                  	;
   707 00000415 01CD                    	add	ebp, ecx ; next offset for samples
   708                                  ReadPatterns:  
   709                                  	;mov	ebx, [FileHandle] 
   710                                  	; ebx = File handle
   711                                  	; ecx = Buffer address
   712                                  	; edx = Byte count
   713                                  	sys	_read, [FileHandle]
   713                              <1> 
   713                              <1> 
   713                              <1> 
   713                              <1> 
   713                              <1>  %if %0 >= 2
   713 00000417 8B1D[B4520000]      <1>  mov ebx, %2
   713                              <1>  %if %0 >= 3
   713                              <1>  mov ecx, %3
   713                              <1>  %if %0 = 4
   713                              <1>  mov edx, %4
   713                              <1>  %endif
   713                              <1>  %endif
   713                              <1>  %endif
   713 0000041D B803000000          <1>  mov eax, %1
   713                              <1> 
   713 00000422 CD40                <1>  int 40h
   714 00000424 0F828D000000            	jc      CloseFile
   715                                  
   716                                  	; patterns have been loaded here... (04/07/2017)
   717                                  
   718 0000042A BE[CC520000]            	mov	esi, Header+ModHeader.mhSamples
   719 0000042F 31FF                    	xor     edi, edi
   720                                  CopySamples:
   721 00000431 668B4616                	mov     ax, [esi+ModSample.msLength]
   722 00000435 86C4                    	xchg    al, ah
   723 00000437 66D1E0                  	shl     ax, 1
   724 0000043A 668987[F6570000]        	mov     [ModInfo.SampLen+edi], ax
   725 00000441 8A4619                  	mov     al, [esi+ModSample.msVolume]
   726 00000444 30E4                    	xor     ah, ah
   727 00000446 668987[B0580000]        	mov     [ModInfo.SampVol+edi], ax
   728 0000044D 668B461A                	mov     ax, [esi+ModSample.msRepeat]
   729 00000451 86C4                    	xchg    al, ah
   730 00000453 66D1E0                  	shl     ax, 1
   731 00000456 668987[34580000]        	mov     [ModInfo.SampRep+edi], ax
   732 0000045D 668B461C                	mov     ax, [esi+ModSample.msRepLen]
   733 00000461 86C4                    	xchg    al, ah
   734 00000463 66D1E0                  	shl     ax, 1
   735 00000466 668987[72580000]        	mov     [ModInfo.SampRepLen+edi], ax
   736 0000046D 83C61E                  	add     esi, ModSample.size
   737 00000470 6683C702                	add     di, 2
   738 00000474 6683FF3E                	cmp     di, 2*31
   739 00000478 72B7                    	jb      short CopySamples
   740                                  
   741 0000047A 31F6                    	xor     esi, esi
   742                                  AllocSamples:
   743 0000047C 0FB796[F6570000]        	movzx	edx, word [ModInfo.SampLen+esi]
   744                                  	; 07/10/2017
   745                                  	;shr	dx, 4 ; ***
   746 00000483 21D2                    	and	edx, edx
   747 00000485 7426                    	jz      short NextSample
   748                                  	;inc	dx  ; number of paragraphs ; ***
   749                                  	;shl	dx, 4 ; ***
   750 00000487 89E8                    	mov	eax, ebp
   751 00000489 668986[7A570000]        	mov	[ModInfo.SampOfs+esi], ax
   752 00000490 C1E810                  	shr	eax, 16
   753 00000493 668986[B8570000]        	mov	[ModInfo.SampSeg+esi], ax
   754 0000049A 89E9                    	mov	ecx, ebp
   755 0000049C 01D5                    	add	ebp, edx ; next offset for sample 
   756                                  ReadSample:
   757                                  	;mov	ebx, [FileHandle]
   758                                  	;movzx  edx, [ModInfo.SampLen+esi]
   759                                  	;mov    ecx, [ModInfo.SampOfs+esi]
   760                                  
   761                                  	; ebx = File handle
   762                                  	; ecx = Buffer address
   763                                  	; edx = Byte count
   764                                  	sys	_read, [FileHandle]
   764                              <1> 
   764                              <1> 
   764                              <1> 
   764                              <1> 
   764                              <1>  %if %0 >= 2
   764 0000049E 8B1D[B4520000]      <1>  mov ebx, %2
   764                              <1>  %if %0 >= 3
   764                              <1>  mov ecx, %3
   764                              <1>  %if %0 = 4
   764                              <1>  mov edx, %4
   764                              <1>  %endif
   764                              <1>  %endif
   764                              <1>  %endif
   764 000004A4 B803000000          <1>  mov eax, %1
   764                              <1> 
   764 000004A9 CD40                <1>  int 40h
   765 000004AB 720A                    	jc      short CloseFile
   766                                  
   767                                  NextSample:
   768 000004AD 6683C602                	add     si, 2
   769 000004B1 6683FE3E                	cmp     si, 2*31
   770 000004B5 72C5                    	jb      short AllocSamples
   771                                  CloseFile:      
   772 000004B7 9C                      	pushf
   773                                  	sys	_close, [FileHandle]
   773                              <1> 
   773                              <1> 
   773                              <1> 
   773                              <1> 
   773                              <1>  %if %0 >= 2
   773 000004B8 8B1D[B4520000]      <1>  mov ebx, %2
   773                              <1>  %if %0 >= 3
   773                              <1>  mov ecx, %3
   773                              <1>  %if %0 = 4
   773                              <1>  mov edx, %4
   773                              <1>  %endif
   773                              <1>  %endif
   773                              <1>  %endif
   773 000004BE B806000000          <1>  mov eax, %1
   773                              <1> 
   773 000004C3 CD40                <1>  int 40h
   774 000004C5 9D                      	popf
   775                                  Failed:       
   776 000004C6 61                      	popad
   777 000004C7 C3                      	retn
   778                                  
   779                                  FreeModule:
   780                                  	; Erdogan Tan (13/02/2017)
   781                                  	; nothing to do here for memory de-allocation
   782                                  ClearModInfo:
   783 000004C8 57                      	push	edi
   784 000004C9 BF[F4560000]            	mov	edi, ModInfo
   785 000004CE B9FA010000              	mov     ecx, ModInfoRec.size
   786                                  	;cld
   787 000004D3 30C0                    	xor     al, al
   788 000004D5 F3AA                    	rep     stosb
   789 000004D7 5F                      	pop	edi
   790 000004D8 C3                      	retn
   791                                  
   792                                  ;=============================================================================
   793                                  ;               MODPLAY.ASM
   794                                  ;=============================================================================
   795                                  
   796                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
   797                                  ;	July 23th, 1993.
   798                                  
   799                                  ; EQUATES
   800                                  
   801                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
   802                                  DefTempo        equ 6
   803                                  DefBpm          equ 125
   804                                  MidCRate        equ 8448
   805                                  ;MixBufSize	equ 4096
   806                                  ;;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
   807                                  
   808                                  ; STRUCTURES
   809                                  
   810                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
   811 00000000 <res 00000004>          .Samples:	resd 1
   812                                  ;.Position:	resw 1
   813 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
   814 00000008 <res 00000002>          .Len:		resw 1
   815 0000000A <res 00000002>          .Repeat:	resw 1
   816 0000000C <res 00000002>          .RepLen:	resw 1
   817 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
   818 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
   819                                  ;.Error:	resb 1
   820                                  ;.Reserved:	resb 1 ; 01/10/2017
   821 00000010 <res 00000002>          .Period:	resw 1 ; Period
   822 00000012 <res 00000002>          .Pitch:		resw 1 
   823 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
   824 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
   825 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
   826 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
   827 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
   828 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
   829 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
   830                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
   831 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
   832 0000001E <res 00000006>          .Arp:		resw 3
   833 00000024 <res 00000002>          .ArpIndex:	resw 1
   834                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
   835                                  endstruc
   836                                  
   837                                  ; CODE
   838                                  
   839                                  ;--------------------------------------------------------------------------
   840                                  ; updatechannel - update the track using the current effect
   841                                  ;--------------------------------------------------------------------------
   842                                  ; 
   843                                  ;--------------------------------------------------------------------------
   844                                  ; 	Track:  Process the next 	 in one track.
   845                                  ;  In:
   846                                  ;    ds:di -  Track info Address.
   847                                  ;--------------------------------------------------------------------------
   848                                  
   849                                  ; edi = Track info address
   850                                  
   851                                  updatechannel:
   852                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
   853                                  
   854 000004D9 668B5714                	mov     dx, [edi+TrackInfo.Effect]
   855                                  
   856                                  	;test   dx, dx
   857                                  	;je     short None
   858                                  	;cmp    dh, 00h
   859                                  	;je     short Arpeggio
   860                                  	;cmp    dh, 01h
   861                                  	;je     short PortUp
   862                                  	;cmp    dh, 02h
   863                                  	;je     short PortDown
   864                                  	;cmp    dh, 03h
   865                                  	;je     TonePort
   866                                  	;cmp    dh, 04h
   867                                  	;je     Vibrato
   868                                  	;cmp    dh, 05h
   869                                  	;je     PortSlide
   870                                  	;cmp    dh, 06h
   871                                  	;je     VibSlide
   872                                  	;cmp    dh, 0Ah
   873                                  	;je     VolSlide
   874                                  	;retn
   875                                  
   876 000004DD 0FB6C6                  	movzx	eax, dh
   877 000004E0 240F                    	and	al, 0Fh
   878 000004E2 FF2485[FC4F0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
   879                                  efxnull:
   880                                  None:           
   881 000004E9 C3                      	retn
   882                                  efxarpeggio2:
   883                                  	; 01/10/2017
   884 000004EA 84D2                    	test    dl, dl
   885 000004EC 74FB                    	jz      short efxnull
   886                                  Arpeggio:
   887 000004EE 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
   888 000004F2 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
   889 000004F7 66894712                	mov     [edi+TrackInfo.Pitch], ax
   890 000004FB 6683C302                	add     bx, 2
   891 000004FF 6683FB06                	cmp     bx, 6
   892 00000503 7202                    	jb      short SetArpIndex
   893 00000505 31DB                    	xor     ebx, ebx
   894                                  SetArpIndex:
   895 00000507 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
   896 0000050B C3                      	retn
   897                                  efxportaup:
   898                                  PortUp:
   899 0000050C 30F6                    	xor     dh, dh
   900                                  	;mov	bx, [edi+TrackInfo.Period]
   901 0000050E 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   902 00000512 6629D3                  	sub     bx, dx
   903                                  	;cmp	bx, 113
   904 00000515 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
   905 00000519 7D04                    	jge     short NotSmall
   906                                  	;mov	bx, 113
   907 0000051B 66BB1C00                	mov	bx, 28 ; 01/10/2017
   908                                  NotSmall:
   909 0000051F 66895F10                	mov     [edi+TrackInfo.Period], bx
   910 00000523 6601DB                  	add     bx, bx
   911                                  	;mov	ax, [PitchTable+bx]
   912 00000526 668B83[EE580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   913 0000052D 66894712                	mov     [edi+TrackInfo.Pitch], ax
   914 00000531 C3                      	retn
   915                                  efxportadown:
   916                                  PortDown:
   917 00000532 30F6                    	xor     dh, dh
   918                                  	;mov	bx, [edi+TrackInfo.Period]
   919 00000534 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   920 00000538 6601D3                  	add     bx, dx
   921 0000053B 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
   922                                  	;cmp	bx, 856
   923 00000540 7E04                    	jle     short NotBig
   924                                  	;mov	bx, 856
   925 00000542 66BB600D                	mov	bx, 3424 ; 01/10/2017
   926                                  NotBig:         
   927 00000546 66895F10                	mov     [edi+TrackInfo.Period], bx
   928 0000054A 6601DB                  	add     bx, bx
   929                                  	;mov	ax, [PitchTable+bx]
   930 0000054D 668B83[EE580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   931 00000554 66894712                	mov     [edi+TrackInfo.Pitch], ax
   932 00000558 C3                      	retn
   933                                  efxtoneporta2:
   934                                  TonePort:
   935 00000559 30F6                    	xor     dh, dh
   936 0000055B 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
   937                                  	;mov	bx, [edi+TrackInfo.Period]
   938 0000055F 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
   939 00000563 6639C3                  	cmp     bx, ax
   940 00000566 7429                    	je      short NoPort
   941 00000568 7F0D                    	jg      short PortToUp
   942                                  PortToDown:     
   943 0000056A 6601D3                  	add     bx, dx
   944 0000056D 6639C3                  	cmp     bx, ax
   945 00000570 7E0D                    	jle     short SetPort
   946                                  FixPort:        
   947 00000572 6689C3                  	mov     bx, ax
   948 00000575 EB08                    	jmp     short SetPort
   949                                  PortToUp:
   950 00000577 6629D3                  	sub     bx, dx
   951 0000057A 6639C3                  	cmp     bx, ax
   952 0000057D 7CF3                    	jl      short FixPort
   953                                  SetPort:        
   954 0000057F 66895F10                	mov     [edi+TrackInfo.Period], bx
   955 00000583 6601DB                  	add     bx, bx
   956                                  	;mov	ax, [PitchTable+bx]
   957 00000586 668B83[EE580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
   958 0000058D 66894712                	mov     [edi+TrackInfo.Pitch], ax
   959                                  NoPort:         
   960 00000591 C3                      	retn
   961                                  efxvibrato2:
   962                                  	; 01/10/2017
   963                                  Vibrato:
   964 00000592 88D6                    	mov     dh, dl
   965                                  	;and	dl, 0Fh
   966                                  	;shr	dh, 4
   967                                  	;shl	dh, 2
   968 00000594 6681E20FF0              	and     dx, 0F00Fh
   969 00000599 C0EE02                  	shr     dh, 2
   970                                  	;add	[edi+TrackInfo.VibPos], dh
   971                                  	;mov	dh, [edi+TrackInfo.VibPos]
   972                                  	;mov	bl, dh
   973 0000059C 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
   974 0000059F 007719                  	add	[edi+TrackInfo.VibPos], dh
   975 000005A2 88DE                    	mov	dh, bl ; 01/10/2017
   976 000005A4 C0EB02                  	shr     bl, 2
   977                                  	;and	bx, 1Fh
   978                                  	;mov	al, [SinTable+bx]
   979 000005A7 83E31F                  	and	ebx, 1Fh
   980 000005AA 8A83[E4500000]          	mov	al, [SinTable+ebx]
   981 000005B0 F6E2                    	mul     dl
   982                                  	;rol	ax, 1
   983                                  	;xchg	al, ah
   984                                  	;and	ah, 1
   985 000005B2 66C1E807                	shr	ax, 7
   986 000005B6 84F6                    	test    dh, dh
   987 000005B8 7903                    	jns     short VibUp
   988 000005BA 66F7D8                  	neg     ax
   989                                  VibUp:          
   990 000005BD 66034710                	add     ax, [edi+TrackInfo.Period]
   991 000005C1 6689C3                  	mov	bx, ax
   992                                  	;movzx	ebx, ax
   993 000005C4 6683FB71                	cmp     bx, 113
   994                                  	;cmp	bx, 113
   995 000005C8 6683FB1C                	cmp	bx, 28  ; 01/10/2017
   996 000005CC 7D06                    	jge     short NoLoVib
   997                                  	;mov	bx, 113
   998 000005CE 66BB1C00                	mov	bx, 28	; 01/10/2017
   999 000005D2 EB0B                    	jmp	short NoHiVib ; 01/10/2017	
  1000                                  NoLoVib:        
  1001 000005D4 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1002                                  	;cmp	bx, 856
  1003 000005D9 7E04                    	jle     short NoHiVib
  1004                                  	;mov	bx, 856
  1005 000005DB 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1006                                  NoHiVib:        
  1007 000005DF 6601DB                  	add     bx, bx
  1008                                  	;mov	ax, [PitchTable+bx]
  1009 000005E2 668B83[EE580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1010 000005E9 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1011 000005ED C3                      	retn
  1012                                  efxtoneslide:
  1013                                  PortSlide:
  1014 000005EE E812000000              	call    VolSlide
  1015 000005F3 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1016 000005F6 E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
  1017                                  efxvibslide:
  1018                                  VibSlide:
  1019 000005FB E805000000              	call    VolSlide
  1020 00000600 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
  1021 00000603 EB8D                    	jmp     short Vibrato  ; efxvibrato2
  1022                                  efxvolslide:
  1023                                  VolSlide:
  1024 00000605 88D6                    	mov     dh, dl
  1025 00000607 80E20F                  	and     dl, 0Fh
  1026 0000060A C0EE04                  	shr     dh, 4
  1027 0000060D 8A470E                  	mov     al, [edi+TrackInfo.Volume]
  1028 00000610 28D0                    	sub     al, dl
  1029 00000612 7D02                    	jge     short NoLoVol
  1030 00000614 30C0                    	xor     al, al
  1031                                  NoLoVol:        
  1032 00000616 00F0                    	add     al, dh
  1033 00000618 3C40                    	cmp     al, 64
  1034 0000061A 7602                    	jbe     short NoHiVol
  1035 0000061C B040                    	mov     al, 64
  1036                                  NoHiVol:        
  1037 0000061E 88470E                  	mov     [edi+TrackInfo.Volume], al
  1038 00000621 C3                      	retn
  1039                                  
  1040                                  efxtremolo2:
  1041                                  	; 01/10/2017 (TMODPLAY.ASM)
  1042                                  Tremolo:
  1043 00000622 88D6                    	mov     dh, dl
  1044 00000624 6681E20FF0              	and     dx, 0F00Fh
  1045 00000629 C0EE02                  	shr     dh, 2
  1046 0000062C 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1047 0000062F 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1048 00000632 88DE                    	mov	dh, bl
  1049 00000634 C0EB02                  	shr     bl, 2
  1050                                  	; 01/10/2017 - TRDOS 386
  1051                                  	;and	bx, 1Fh
  1052 00000637 83E31F                  	and	ebx, 1Fh 
  1053                                  	;mov	al, [SinTable+bx]
  1054 0000063A 8A83[E4500000]          	mov     al, [SinTable+ebx]
  1055 00000640 F6E2                    	mul     dl
  1056 00000642 66C1E806                	shr	ax, 6
  1057 00000646 84F6                    	test    dh, dh
  1058 00000648 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1059 0000064A 66F7D8                  	neg     ax
  1060                                  efxtremolof2:
  1061                                  Tremolo_1:      
  1062 0000064D 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1063 00000650 00E0                    	add     al, ah
  1064 00000652 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1065 00000654 30C0                    	xor     al, al
  1066                                  efxtremolof3:
  1067                                  Tremolo_2:       
  1068 00000656 3C40                    	cmp     al, 64 ; 40h
  1069 00000658 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1070 0000065A B040                    	mov     al, 64 ; 40h
  1071                                  efxtremolof4:
  1072                                  Tremolo_3:       
  1073 0000065C 28E0                    	sub	al, ah  ; ****** 
  1074 0000065E 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1075 00000661 C3                      	retn	
  1076                                  
  1077                                  ;--------------------------------------------------------------------------
  1078                                  ; readchannel - read the next note event from the pattern sheet
  1079                                  ;--------------------------------------------------------------------------
  1080                                  ;
  1081                                  ;--------------------------------------------------------------------------
  1082                                  ; GetTrack:   Get the next Note from a pattern.
  1083                                  ;  In:
  1084                                  ;    ds:di -  Track info Address.
  1085                                  ;    es:si -  Pattern Note Address.
  1086                                  ; Out:
  1087                                  ;    es:si -  The Next Pattern Note address.
  1088                                  ;--------------------------------------------------------------------------
  1089                                  
  1090                                  ; esi = Pattern note address
  1091                                  ; edi = Track info address
  1092                                  
  1093                                  readchannel:
  1094                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1095 00000662 66AD                    	lodsw
  1096 00000664 86C4                    	xchg    al, ah
  1097 00000666 88E3                    	mov	bl, ah
  1098 00000668 80E40F                  	and     ah, 0Fh
  1099 0000066B 6689C1                  	mov     cx, ax
  1100 0000066E 66AD                    	lodsw
  1101 00000670 86C4                    	xchg    al, ah
  1102 00000672 88E7                    	mov     bh, ah
  1103 00000674 80E40F                  	and     ah, 0Fh
  1104 00000677 6689C2                  	mov     dx, ax
  1105 0000067A 66895714                	mov     [edi+TrackInfo.Effect], dx
  1106                                  	; 01/10/2017 - TRDOS 386
  1107                                  	;and	bl, 0F0h
  1108 0000067E 81E3F0FF0000            	and	ebx, 0FFF0h
  1109 00000684 C0EF04                  	shr     bh, 4
  1110 00000687 08FB                    	or      bl, bh
  1111 00000689 7446                    	jz      short SetPeriod
  1112                                  SetSample:
  1113 0000068B 30FF                    	xor	bh, bh
  1114                                  	;and	ebx, 0FFh
  1115 0000068D FECB                    	dec     bl
  1116 0000068F 01DB                    	add     ebx, ebx
  1117 00000691 668B83[B0580000]        	mov     ax, [ModInfo.SampVol+ebx]
  1118 00000698 88470E                  	mov     [edi+TrackInfo.Volume], al
  1119 0000069B 668B83[7A570000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1120 000006A2 668907                  	mov     [edi+TrackInfo.Samples], ax
  1121 000006A5 668B83[B8570000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1122 000006AC 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1123 000006B0 668B83[F6570000]        	mov     ax, [ModInfo.SampLen+ebx]
  1124 000006B7 66894708                	mov     [edi+TrackInfo.Len], ax
  1125 000006BB 668B83[34580000]        	mov     ax, [ModInfo.SampRep+ebx]
  1126 000006C2 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1127 000006C6 668B83[72580000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1128 000006CD 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1129                                  SetPeriod:      
  1130 000006D1 6685C9                  	test    cx, cx
  1131 000006D4 7425                    	jz      short SetEffect
  1132                                  
  1133 000006D6 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1134                                  	
  1135 000006DA 80FE03                  	cmp     dh, 03h
  1136                                  	;je	short SetEffect
  1137 000006DD 7428                    	je	short efxtoneporta ; 01/10/2017
  1138                                  
  1139 000006DF 66894F10                	mov     [edi+TrackInfo.Period], cx
  1140                                  	;movzx	ebx, cx
  1141 000006E3 6689CB                  	mov     bx, cx
  1142 000006E6 6601DB                  	add     bx, bx
  1143                                  	;mov	ax, [PitchTable+bx]
  1144 000006E9 668B83[EE580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1145 000006F0 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1146 000006F4 C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1147                                  SetEffect:
  1148                                  	;test	dx, dx
  1149                                  	;je	short InitNone
  1150                                  	;cmp	dh, 00h
  1151                                  	;je	InitArpeggio
  1152                                  	;cmp	dh, 03h
  1153                                  	;je	short InitTonePort
  1154                                  	;cmp	dh, 04h
  1155                                  	;je	short InitVibrato
  1156                                  	;cmp	dh, 09h
  1157                                  	;je	short SampleOfs
  1158                                  	;cmp	dh, 0Bh
  1159                                  	;je	short PosJump
  1160                                  	;cmp	dh, 0Ch
  1161                                  	;je	short SetVolume
  1162                                  	;cmp	dh, 0Dh
  1163                                  	;je	short Break
  1164                                  	;cmp	dh, 0Fh
  1165                                  	;je	SetSpeed
  1166                                  	;retn
  1167                                  
  1168                                  	; 01/10/2017 (TMODPLAY.ASM)
  1169                                  	
  1170                                  	; dx = [di+TrackInfo.Effect]
  1171                                  	
  1172 000006FB 0FB6C6                  	movzx	eax, dh
  1173 000006FE 240F                    	and	al, 0Fh
  1174 00000700 FF2485[BC4F0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1175                                  ;efxnull:
  1176                                  ;InitNone:
  1177                                  ;	retn
  1178                                  efxtoneporta:
  1179                                  	; 01/10/2017
  1180                                  	; cx = period
  1181                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1182                                  InitTonePort:
  1183 00000707 84D2                    	test    dl, dl
  1184 00000709 7503                    	jnz     short SetPortParm
  1185 0000070B 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1186                                  SetPortParm:    
  1187 0000070E 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1188 00000711 66895714                	mov     [edi+TrackInfo.Effect], dx
  1189 00000715 C3                      	retn
  1190                                  efxvibrato:
  1191                                  InitVibrato:
  1192 00000716 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1193 00000719 88C4                    	mov     ah, al
  1194                                  	;and	al, 0Fh
  1195                                  	;and	ah, 0F0h
  1196 0000071B 66250FF0                	and	ax, 0F00Fh
  1197 0000071F F6C20F                  	test    dl, 0Fh
  1198 00000722 7502                    	jne     short OkDepth
  1199 00000724 08C2                    	or      dl, al
  1200                                  OkDepth:        
  1201 00000726 F6C2F0                  	test    dl, 0F0h
  1202 00000729 7502                    	jnz     short OkRate
  1203 0000072B 08E2                    	or      dl, ah
  1204                                  OkRate:         
  1205 0000072D 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1206 00000730 66895714                	mov     [edi+TrackInfo.Effect], dx
  1207 00000734 6685C9                  	test    cx, cx
  1208 00000737 7404                    	jz      short OkPos
  1209 00000739 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1210                                  OkPos:          
  1211 0000073D C3                      	retn
  1212                                  efxsampoffset:
  1213                                  	; 01/10/2017 ; *******
  1214                                  SampleOfs:         
  1215                                  ;	test    dl, dl
  1216                                  ;	jnz     short SetSampleOfs
  1217                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1218                                  ;SetSampleOfs:
  1219                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1220 0000073E 88D6                    	mov     dh, dl
  1221 00000740 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1222 00000746 895704                  	mov     [edi+TrackInfo.Position], edx
  1223 00000749 C3                      	retn
  1224                                  efxpattjump:
  1225                                  PosJump:
  1226 0000074A 8815[92C00000]          	mov     [OrderPos], dl
  1227 00000750 C605[96C00000]40        	mov     byte [Row], 64
  1228 00000757 C3                      	retn
  1229                                  efxsetvolume:
  1230                                  SetVolume:
  1231 00000758 80FA40                  	cmp     dl, 64
  1232 0000075B 7602                    	jbe     short OkVol
  1233 0000075D B240                    	mov     dl, 64
  1234                                  OkVol:
  1235                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1236 0000075F 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1237                                  	;mov	[edi+TrackInfo.Volume], dl
  1238 00000761 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1239 00000765 C3                      	retn
  1240                                  efxbreak:
  1241                                  Break:
  1242 00000766 88D6                    	mov     dh, dl
  1243 00000768 80E20F                  	and     dl, 0Fh
  1244 0000076B C0EE04                  	shr     dh, 4
  1245 0000076E 00F6                    	add     dh, dh
  1246 00000770 00F2                    	add     dl, dh
  1247 00000772 C0E602                  	shl     dh, 2
  1248 00000775 00F2                    	add     dl, dh
  1249 00000777 8815[97C00000]          	mov     [BreakRow], dl
  1250 0000077D C605[96C00000]40        	mov     byte [Row], 64
  1251 00000784 C3                      	retn
  1252                                  efxsetspeed:
  1253                                  SetSpeed:
  1254 00000785 84D2                    	test    dl,dl
  1255 00000787 7432                    	je      Skip
  1256 00000789 80FA1F                  	cmp     dl,31
  1257 0000078C 770D                    	ja      short SetBpm
  1258                                  SetTempo:       
  1259 0000078E 8815[93C00000]          	mov     [Tempo], dl
  1260 00000794 8815[94C00000]          	mov     [TempoWait], dl
  1261 0000079A C3                      	retn
  1262                                  SetBpm:
  1263 0000079B 8815[95C00000]          	mov     [Bpm], dl
  1264 000007A1 B067                    	mov     al, 103
  1265 000007A3 F6E2                    	mul     dl
  1266 000007A5 88E3                    	mov     bl, ah
  1267 000007A7 30FF                    	xor     bh, bh
  1268 000007A9 66A1[F2510000]          	mov     ax, [MixSpeed]
  1269 000007AF 6631D2                  	xor     dx, dx
  1270 000007B2 66F7F3                  	div     bx
  1271 000007B5 66A3[98C00000]          	mov     [BpmSamples], ax
  1272                                  Skip:           
  1273 000007BB C3                      	retn
  1274                                  efxarpeggio:
  1275                                  	; 01/10/2017
  1276 000007BC 84D2                    	test    dl, dl
  1277                                  	;je	efxnull
  1278 000007BE 74FB                    	je	short Skip
  1279                                  InitArpeggio:
  1280 000007C0 88D6                    	mov     dh, dl
  1281 000007C2 80E20F                  	and     dl, 0Fh
  1282 000007C5 C0EE04                  	shr     dh, 4
  1283                                  	; 01/10/2017
  1284                                  	;mov	cx, 36
  1285 000007C8 66B95400                	mov	cx, 84 ; 84 notes/periods
  1286 000007CC 31DB                    	xor     ebx, ebx
  1287 000007CE 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1288                                  gt_ScanPeriod:
  1289                                  	;cmp	ax, [PeriodTable+bx]
  1290 000007D2 663B83[3C500000]        	cmp	ax, [PeriodTable+ebx]
  1291 000007D9 7306                    	jae     short SetArp
  1292 000007DB 6683C302                	add     bx, 2
  1293 000007DF E2F1                    	loop    gt_ScanPeriod
  1294                                  SetArp:         
  1295 000007E1 6601D2                  	add     dx, dx
  1296 000007E4 00DE                    	add     dh, bl
  1297 000007E6 00DA                    	add     dl, bl
  1298                                  	; 01/10/2017
  1299                                  	;mov	bx, [PeriodTable+bx]
  1300 000007E8 668B9B[3C500000]        	mov	bx, [PeriodTable+ebx]
  1301                                  	;add	bx, bx
  1302 000007EF 01DB                    	add	ebx, ebx
  1303                                  	;mov	ax, [PitchTable+bx]
  1304 000007F1 668B83[EE580000]        	mov	ax, [PitchTable+ebx]
  1305 000007F8 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1306 000007FC 88F3                    	mov     bl, dh
  1307 000007FE 30FF                    	xor     bh, bh
  1308 00000800 668B9B[3C500000]        	mov	bx, [PeriodTable+ebx]
  1309                                  	;add	bx, bx
  1310 00000807 01DB                    	add	ebx, ebx
  1311                                  	;mov	ax, [PitchTable+bx]
  1312 00000809 668B83[EE580000]        	mov	ax, [PitchTable+ebx]
  1313 00000810 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1314 00000814 88D3                    	mov     bl, dl
  1315 00000816 30FF                    	xor     bh, bh
  1316 00000818 668B9B[3C500000]        	mov	bx, [PeriodTable+ebx]
  1317                                  	;add	bx, bx
  1318 0000081F 01DB                    	add	ebx, ebx
  1319                                  	;mov	ax, [PitchTable+bx]
  1320 00000821 668B83[EE580000]        	mov	ax, [PitchTable+ebx]
  1321 00000828 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1322 0000082C 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1323 00000832 C3                      	retn
  1324                                  
  1325                                  efxtremolo:
  1326                                  	; 01/10/2017 (TMODPLAY.ASM)
  1327                                  InitTremolo:
  1328 00000833 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1329 00000836 88C4                    	mov     ah, al
  1330 00000838 66250FF0                	and     ax, 0F00Fh
  1331 0000083C F6C20F                  	test    dl, 0Fh
  1332 0000083F 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1333 00000841 08C2                    	or      dl, al
  1334                                  efxtremolof0:
  1335                                  InitTremolo_1: 
  1336 00000843 F6C2F0                  	test    dl, 0F0h
  1337 00000846 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1338 00000848 08E2                    	or      dl, ah
  1339                                  efxtremolof1:
  1340                                  InitTremolo_2:
  1341 0000084A 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1342 0000084D 66895714                	mov     [edi+TrackInfo.Effect], dx
  1343 00000851 C3                      	retn
  1344                                  
  1345                                  ;--------------------------------------------------------------------------
  1346                                  ; pollmodule - polls the module player
  1347                                  ;--------------------------------------------------------------------------
  1348                                  ;--------------------------------------------------------------------------
  1349                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1350                                  ;--------------------------------------------------------------------------
  1351                                  
  1352                                  pollmodule:
  1353                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1354 00000852 FE0D[94C00000]          	dec     byte [TempoWait]
  1355 00000858 7417                    	jz      short GetTracks
  1356                                  
  1357                                  	;mov	ecx, NumTracks
  1358 0000085A 0FB70D[EC510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1359 00000861 BF[A8C00000]            	mov	edi, Tracks
  1360                                  BeatTracks:
  1361 00000866 E86EFCFFFF              	call	BeatTrack	
  1362 0000086B 83C726                  	add	edi, TrackInfo.size
  1363 0000086E E2F6                    	loop	BeatTracks
  1364 00000870 C3                      	retn
  1365                                  GetTracks:
  1366 00000871 A0[93C00000]            	mov     al, [Tempo]
  1367 00000876 A2[94C00000]            	mov     [TempoWait], al
  1368                                  
  1369 0000087B 8B35[A4C00000]          	mov	esi, [Note]
  1370 00000881 803D[96C00000]40        	cmp     byte [Row], 64
  1371 00000888 7268                    	jb      short NoPattWrap
  1372                                  
  1373 0000088A 8B35[76570000]          	mov	esi, [ModInfo.Patterns]
  1374 00000890 8A1D[92C00000]          	mov     bl, [OrderPos]
  1375 00000896 3A1D[F4560000]          	cmp     bl, [ModInfo.OrderLen]
  1376 0000089C 7214                    	jb      short NoOrderWrap
  1377 0000089E 8A1D[F5560000]          	mov     bl, [ModInfo.ReStart]
  1378 000008A4 881D[92C00000]          	mov     [OrderPos], bl
  1379 000008AA 3A1D[F4560000]          	cmp     bl, [ModInfo.OrderLen]
  1380 000008B0 7364                    	jae     short NoUpdate
  1381                                  NoOrderWrap:    
  1382                                  	;xor	bh, bh
  1383 000008B2 81E3FF000000            	and	ebx, 0FFh
  1384 000008B8 8A9B[F6560000]          	mov     bl, [ModInfo.Order+ebx]
  1385                                  	; 05/10/2017
  1386                                  	;shl	ebx, 10 ; *1024
  1387 000008BE 8A0D[EB510000]          	mov	cl, [pattern_shift] ; 10 or 11
  1388 000008C4 D3E3                    	shl	ebx, cl ; *1024 or *2048
  1389                                  	;
  1390 000008C6 01DE                    	add     esi, ebx
  1391 000008C8 8A1D[97C00000]          	mov     bl, [BreakRow]
  1392 000008CE 881D[96C00000]          	mov     [Row], bl
  1393                                  	;xor	bh, bh
  1394 000008D4 81E3FF000000            	and	ebx, 0FFh
  1395 000008DA 883D[97C00000]          	mov     [BreakRow], bh ; 0
  1396 000008E0 66C1E304                	shl     bx, 4
  1397 000008E4 01DE                    	add     esi, ebx
  1398 000008E6 8935[A4C00000]          	mov     [Note], esi
  1399 000008EC FE05[92C00000]          	inc     byte [OrderPos]
  1400                                  NoPattWrap:     
  1401 000008F2 FE05[96C00000]          	inc     byte [Row]
  1402                                  
  1403                                  	;cld
  1404                                  	;mov	ecx, NumTracks
  1405 000008F8 0FB70D[EC510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1406 000008FF BF[A8C00000]            	mov	edi, Tracks
  1407                                  GetTracks_next:
  1408 00000904 51                      	push	ecx	
  1409 00000905 E858FDFFFF              	call	GetTrack ; readchannel
  1410 0000090A 59                      	pop	ecx
  1411 0000090B 83C726                  	add	edi, TrackInfo.size
  1412 0000090E E2F4                    	loop	GetTracks_next
  1413                                  
  1414 00000910 8935[A4C00000]          	mov     [Note], esi
  1415                                  NoUpdate:
  1416 00000916 C3                      	retn
  1417                                  
  1418                                  ;--------------------------------------------------------------------------
  1419                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1420                                  ;  In:
  1421                                  ;   ds:si -  Track Info Address.
  1422                                  ;   ds:di -  Buffer Address.
  1423                                  ;    cx   -  Buffer Size.
  1424                                  ;--------------------------------------------------------------------------
  1425                                  
  1426                                  ; esi = Track info address
  1427                                  ; edi = Buffer address
  1428                                  ; ecx = Buffer size
  1429                                  
  1430                                  MixTrack:
  1431 00000917 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1432 0000091C 7757                    	ja      short MixLooped
  1433                                  MixNonLooped:   
  1434 0000091E 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1435 00000920 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1436 00000923 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1437 00000927 52                      	push    edx
  1438 00000928 56                      	push    esi
  1439 00000929 01D3                    	add     ebx, edx
  1440 0000092B 01D5                    	add     ebp, edx
  1441 0000092D 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1442                                  	; 01/10/2017
  1443                                  	;mov	al, [esi+TrackInfo.Volume]
  1444 00000931 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1445                                  	; ah = [esi+TrackInfo.VolDiff]
  1446 00000935 00E0                    	add	al, ah ; ****** 
  1447 00000937 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1448 0000093B 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1449 0000093E 89DE                    	mov     esi, ebx
  1450 00000940 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1451 00000942 88C7                    	mov     bh, al
  1452 00000944 88D0                    	mov     al, dl
  1453 00000946 88F2                    	mov     dl, dh
  1454                                  	;xor	dh, dh
  1455 00000948 81E2FF000000            	and	edx, 0FFh
  1456                                  nlMixSamp:      
  1457 0000094E 39EE                    	cmp     esi, ebp
  1458 00000950 7316                    	jae     short nlMixBye
  1459 00000952 8A1E                    	mov     bl, [esi]
  1460                                  	;mov	bl, [VolTable+bx]
  1461 00000954 8A9B[A65F0000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1462                                  	; 17/10/2017
  1463 0000095A 001F                    	add     [edi], bl
  1464                                  	; 18/10/2017
  1465 0000095C 00C4                    	add     ah, al
  1466 0000095E 11D6                    	adc     esi, edx
  1467 00000960 033D[EC510000]          	add	edi, [numtracks]
  1468 00000966 E2E6                    	loop    nlMixSamp
  1469                                  nlMixBye:       
  1470 00000968 89F3                    	mov     ebx, esi
  1471 0000096A 5E                      	pop     esi
  1472 0000096B 5A                      	pop     edx
  1473 0000096C 29D3                    	sub     ebx, edx
  1474 0000096E 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1475 00000971 88661D                  	mov     [esi+TrackInfo.Error], ah
  1476 00000974 C3                      	retn
  1477                                  MixLooped:
  1478 00000975 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1479 00000977 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1480 0000097A 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1481 0000097E 892D[A0C00000]          	mov     [BufRep], ebp
  1482                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1483 00000984 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1484 00000988 52                      	push    edx
  1485 00000989 56                      	push    esi
  1486 0000098A 01D3                    	add     ebx, edx
  1487 0000098C 01D5                    	add     ebp, edx
  1488 0000098E 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1489                                  	; 01/10/2017
  1490                                  	;mov	al, [esi+TrackInfo.Volume]
  1491 00000992 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1492                                  	; ah = [esi+TrackInfo.VolDiff]
  1493 00000996 00E0                    	add	al, ah ; ****** 
  1494 00000998 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1495 0000099C 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1496                                  	;mov	si, bx
  1497 0000099F 89DE                    	mov	esi, ebx ; 04/09/2017
  1498 000009A1 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1499 000009A3 88C7                    	mov     bh, al
  1500 000009A5 88D0                    	mov     al, dl
  1501 000009A7 88F2                    	mov     dl, dh
  1502                                  	;xor	dh, dh
  1503 000009A9 81E2FF000000            	and	edx, 0FFh
  1504                                  lpMixSamp:      
  1505 000009AF 39EE                    	cmp     esi, ebp
  1506 000009B1 7206                    	jb      short lpMixNow
  1507 000009B3 2B35[A0C00000]          	sub     esi, [BufRep]
  1508                                  lpMixNow:       
  1509 000009B9 8A1E                    	mov     bl, [esi]
  1510                                  	;mov	bl, [VolTable+bx]
  1511 000009BB 8A9B[A65F0000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1512                                  	; 17/10/2017
  1513 000009C1 001F                    	add     [edi], bl
  1514                                  	; 18/10/2017
  1515 000009C3 00C4                    	add     ah, al
  1516 000009C5 11D6                    	adc     esi, edx
  1517 000009C7 033D[EC510000]          	add	edi, [numtracks]
  1518 000009CD E2E0                    	loop    lpMixSamp
  1519                                  lpMixBye:       
  1520                                  ;	mov     ebx, esi
  1521                                  ;	pop     esi
  1522                                  ;	pop     edx
  1523                                  ;	sub     ebx, edx
  1524                                  ;	mov     [esi+TrackInfo.Position], ebx
  1525                                  ;	mov     [esi+TrackInfo.Error], ah
  1526                                  ;	retn
  1527 000009CF EB97                    	jmp	short nlMixBye
  1528                                  
  1529                                  ;--------------------------------------------------------------------------
  1530                                  ; mixpoll - updates the output buffer
  1531                                  ;--------------------------------------------------------------------------
  1532                                  ;
  1533                                  ;--------------------------------------------------------------------------
  1534                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1535                                  ;  In:
  1536                                  ;    Buffer  - Buffer Address.
  1537                                  ;    Count   - Buffer Size.
  1538                                  ;--------------------------------------------------------------------------
  1539                                  
  1540                                  mixpoll:
  1541                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1542                                  
  1543                                  	; 03/08/2020
  1544 000009D1 BF[00D00000]            	mov	edi, Audio_Buffer
  1545 000009D6 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
  1546                                  
  1547                                  	; edi = buffer address
  1548                                  	; ebx = count
  1549                                  
  1550 000009DB 60                      	pushad
  1551                                  
  1552                                  	;cld
  1553                                  
  1554                                  	; 03/08/2020
  1555                                  	; clear audio buffer
  1556 000009DC 89FE                    	mov	esi, edi
  1557 000009DE B900080000              	mov	ecx, BUFFERSIZE/16
  1558 000009E3 B880808080              	mov	eax, 80808080h
  1559 000009E8 F3AB                    	rep	stosd 	
  1560 000009EA 89F7                    	mov	edi, esi
  1561                                  
  1562                                  NextChunk:      
  1563 000009EC 66833D[9EC00000]00      	cmp     word [BufLen], 0
  1564 000009F4 756B                    	jne     short CopyChunk
  1565                                  
  1566 000009F6 53                      	push    ebx
  1567 000009F7 57                      	push    edi
  1568                                  MixChunk:       
  1569 000009F8 BF[A6A00000]            	mov	edi, MixBuffer
  1570                                  
  1571                                  	; 17/10/2017
  1572 000009FD 0FB70D[98C00000]        	movzx	ecx, word [BpmSamples]
  1573                                  	;mov	cx, [BpmSamples]
  1574 00000A04 893D[9AC00000]          	mov     [BufPtr], edi
  1575 00000A0A 66890D[9EC00000]        	mov	[BufLen], cx
  1576                                  
  1577 00000A11 803D[EC510000]04        	cmp	byte [numtracks], 4
  1578 00000A18 7603                    	jna	short ch_silence
  1579 00000A1A 66D1E1                  	shl	cx, 1 
  1580                                  ch_silence:
  1581 00000A1D B880808080              	mov	eax, 80808080h
  1582 00000A22 F3AB                    	rep	stosd
  1583                                  
  1584                                  	;mov	cx, NumTracks
  1585                                  	;mov	cl, NumTracks ; 01/10/2017
  1586 00000A24 8A0D[EC510000]          	mov	cl, [numtracks] ; 06/10/2017
  1587 00000A2A BE[82C00000]            	mov	esi, Tracks - TrackInfo.size
  1588                                  GetSamples_next:
  1589 00000A2F 51                      	push	ecx
  1590 00000A30 83C626                  	add	esi, TrackInfo.size
  1591 00000A33 668B0D[9EC00000]        	mov	cx, [BufLen]
  1592 00000A3A 8B3D[9AC00000]          	mov	edi, [BufPtr]
  1593 00000A40 E8D2FEFFFF              	call	MixTrack
  1594 00000A45 59                      	pop	ecx
  1595 00000A46 FF05[9AC00000]          	inc	dword [BufPtr] ; 18/10/2017
  1596 00000A4C E2E1                    	loop	GetSamples_next
  1597                                  
  1598                                   	; 18/10/2017	
  1599 00000A4E 8B1D[EC510000]          	mov	ebx, [numtracks]
  1600 00000A54 291D[9AC00000]          	sub	dword [BufPtr], ebx
  1601                                  
  1602 00000A5A E8F3FDFFFF              	call    UpdateTracks
  1603                                  
  1604 00000A5F 5F                      	pop     edi
  1605 00000A60 5B                      	pop     ebx
  1606                                  CopyChunk:      
  1607                                  	;mov	cx, [BufLen]
  1608 00000A61 0FB70D[9EC00000]        	movzx	ecx, word [BufLen]
  1609 00000A68 39D9                    	cmp	ecx, ebx
  1610                                  	;cmp	cx, bx
  1611 00000A6A 7602                    	jbe     short MoveChunk
  1612                                  	;mov	cx, bx
  1613 00000A6C 89D9                    	mov     ecx, ebx
  1614                                  MoveChunk:
  1615 00000A6E 8B35[9AC00000]          	mov     esi, [BufPtr]
  1616 00000A74 010D[9AC00000]          	add     [BufPtr], ecx
  1617 00000A7A 66290D[9EC00000]        	sub     [BufLen], cx
  1618 00000A81 29CB                    	sub     ebx, ecx
  1619                                  	; 17/10/2017 ; STEREO MIXING
  1620                                  	;rep	movsb
  1621                                  	; 18/10/2017
  1622 00000A83 803D[EC510000]04        	cmp	byte [numtracks], 4
  1623                                  	;jna	short _4_channels_mix
  1624 00000A8A 762F                    	jna	short _4_channels_mix
  1625                                  	
  1626                                  _8_channels_mix:
  1627                                  	; 18/10/2017
  1628 00000A8C AD                      	lodsd 
  1629 00000A8D 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1630 00000A8F C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1631 00000A92 00C6                    	add	dh, al ; ch1 + ch4
  1632 00000A94 00E2                    	add	dl, ah ; ch2 + ch3
  1633                                  
  1634 00000A96 AD                      	lodsd
  1635 00000A97 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1636 00000A99 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1637 00000A9B C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1638                                  	; 19/10/2017
  1639 00000A9E 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1640 00000AA0 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1641                                  
  1642                                  	; L = ch1 + ch4 + ch5 + ch8
  1643                                  	; R = ch2 + ch3 + ch6 + ch7
  1644                                  
  1645 00000AA2 6681C28080              	add	dx, 8080h
  1646                                  
  1647                                  	; 19/10/2017
  1648 00000AA7 88F4                    	mov	ah, dh
  1649 00000AA9 80EC80                  	sub	ah, 80h
  1650 00000AAC 30C0                    	xor	al, al
  1651 00000AAE 66AB                    	stosw ; Left Channel
  1652 00000AB0 88D4                    	mov	ah, dl
  1653 00000AB2 80EC80                  	sub	ah, 80h
  1654 00000AB5 66AB                    	stosw ; Right Channel
  1655                                  
  1656 00000AB7 E2D3                    	loop	_8_channels_mix
  1657                                  	
  1658 00000AB9 EB21                    	jmp	short channel_mix_ok
  1659                                  	
  1660                                  _4_channels_mix:
  1661                                  	; 18/10/2017
  1662 00000ABB AD                      	lodsd 
  1663 00000ABC 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1664                                  	; 19/10/2017
  1665 00000ABE C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1666 00000AC1 00E2                    	add	dl, ah ; ch1 + ch4
  1667 00000AC3 00C6                    	add	dh, al ; ch2 + ch3
  1668                                  
  1669                                  	; L = ch1 + ch4
  1670                                  	; R = ch2 + ch3
  1671                                  
  1672                                  	; 19/10/2017
  1673 00000AC5 6681C28080              	add	dx, 8080h
  1674                                  
  1675                                  	; 19/10/2017
  1676 00000ACA 88D4                    	mov	ah, dl
  1677 00000ACC 80EC80                  	sub	ah, 80h
  1678 00000ACF 30C0                    	xor	al, al
  1679 00000AD1 66AB                    	stosw ; Left Channel
  1680 00000AD3 88F4                    	mov	ah, dh
  1681 00000AD5 80EC80                  	sub	ah, 80h
  1682 00000AD8 66AB                    	stosw ; Right Channel
  1683                                  	
  1684 00000ADA E2DF                    	loop	_4_channels_mix
  1685                                  
  1686                                  channel_mix_ok:
  1687 00000ADC 85DB                    	test    ebx, ebx
  1688                                  	;jnz	short NextChunk
  1689 00000ADE 0F8508FFFFFF            	jnz	NextChunk ; 17/10/2017
  1690                                  
  1691                                  	; 20/10/2017
  1692                                  	; 19/10/2017
  1693                                  	; Pan Control
  1694 00000AE4 8A0D[30CC0000]          	mov	cl, [pan_shift]
  1695 00000AEA 08C9                    	or	cl, cl
  1696 00000AEC 744D                    	jz	short c_smpl_2
  1697                                  
  1698                                  	; 20/10/2017
  1699 00000AEE BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  1700 00000AF3 BF[00D00000]            	mov	edi, Audio_Buffer
  1701                                  
  1702 00000AF8 B508                    	mov	ch, 8
  1703 00000AFA D2E5                    	shl	ch, cl
  1704                                  c_smpl_1:
  1705 00000AFC 8B17                    	mov	edx, [edi]
  1706 00000AFE 6689D0                  	mov	ax, dx
  1707 00000B01 80FC80                  	cmp	ah, 80h
  1708 00000B04 7208                    	jb	short _cs1	
  1709 00000B06 00EC                    	add	ah, ch
  1710 00000B08 730A                    	jnc	short _cs2
  1711 00000B0A B4FF                    	mov	ah, 255
  1712 00000B0C EB06                    	jmp	short _cs2
  1713                                  _cs1:
  1714 00000B0E 28EC                    	sub	ah, ch
  1715 00000B10 7302                    	jnc	short _cs2
  1716 00000B12 B400                    	mov	ah, 0
  1717                                  _cs2:
  1718 00000B14 C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  1719 00000B17 00F4                    	add	ah, dh
  1720 00000B19 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  1721 00000B1B 80FC80                  	cmp	ah, 80h
  1722 00000B1E 7208                    	jb	short _cs3	
  1723 00000B20 00EC                    	add	ah, ch
  1724 00000B22 730A                    	jnc	short _cs4
  1725 00000B24 B4FF                    	mov	ah, 255
  1726 00000B26 EB06                    	jmp	short _cs4
  1727                                  _cs3:
  1728 00000B28 28EC                    	sub	ah, ch
  1729 00000B2A 7302                    	jnc	short _cs4
  1730 00000B2C B400                    	mov	ah, 0
  1731                                  _cs4:
  1732 00000B2E C1CA10                  	ror	edx, 16 ; dx = [edi]
  1733 00000B31 00E6                    	add	dh, ah
  1734 00000B33 8917                    	mov	[edi], edx
  1735                                  _cs5:
  1736                                  	; 20/10/2017
  1737 00000B35 83C704                  	add	edi, 4
  1738 00000B38 4B                      	dec	ebx
  1739 00000B39 75C1                    	jnz	short c_smpl_1	
  1740                                  c_smpl_2:
  1741 00000B3B 61                      	popad	
  1742 00000B3C C3                      	retn
  1743                                  
  1744                                  ;--------------------------------------------------------------------------
  1745                                  ; StartPlaying: Initializes the Sound System.
  1746                                  ;  In:
  1747                                  ;   Module Information Resources.
  1748                                  ;--------------------------------------------------------------------------
  1749                                  
  1750                                  StartPlaying:
  1751 00000B3D 60                      	pushad
  1752                                  SetModParms:    
  1753 00000B3E C605[92C00000]00        	mov     byte [OrderPos], 0
  1754 00000B45 C605[93C00000]06        	mov     byte [Tempo], DefTempo
  1755 00000B4C C605[94C00000]06        	mov     byte [TempoWait], DefTempo
  1756 00000B53 C605[95C00000]7D        	mov     byte [Bpm], DefBpm
  1757 00000B5A C605[96C00000]40        	mov     byte [Row], 64
  1758 00000B61 C605[97C00000]00        	mov     byte [BreakRow], 0
  1759 00000B68 66A1[F2510000]          	mov     ax, [MixSpeed]
  1760 00000B6E 31D2                    	xor     edx, edx
  1761 00000B70 66BB3200                	mov     bx, 24*DefBpm/60
  1762 00000B74 66F7F3                  	div     bx
  1763 00000B77 66A3[98C00000]          	mov     [BpmSamples], ax
  1764                                  ClearTracks:    
  1765 00000B7D BF[A8C00000]            	mov     edi, Tracks
  1766                                  	; 07/10/2017
  1767                                  	;mov	ecx, NumTracks*TrackInfo.size
  1768 00000B82 B826000000              	mov	eax, TrackInfo.size
  1769 00000B87 0FB70D[EC510000]        	movzx	ecx, word [numtracks]
  1770 00000B8E F7E1                    	mul	ecx
  1771 00000B90 89C1                    	mov	ecx, eax
  1772 00000B92 31C0                    	xor     eax, eax
  1773                                  	;cld
  1774 00000B94 F3AA                    	rep     stosb
  1775                                  
  1776 00000B96 A3[9AC00000]            	mov     [BufPtr], eax
  1777 00000B9B 66A3[9EC00000]          	mov     [BufLen], ax
  1778                                  MakePitch:
  1779 00000BA1 66B80021                	mov     ax, MidCRate
  1780 00000BA5 66BBAC01                	mov     bx, 428
  1781 00000BA9 66F7E3                  	mul     bx
  1782 00000BAC 66F735[F2510000]        	div     word [MixSpeed]
  1783 00000BB3 30F6                    	xor     dh, dh
  1784 00000BB5 88E2                    	mov     dl, ah
  1785 00000BB7 88C4                    	mov     ah, al
  1786 00000BB9 30C0                    	xor     al, al
  1787 00000BBB 66B95903                	mov	cx, 857 ; 23/08/2020
  1788                                  	;mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  1789 00000BBF 31DB                    	xor     ebx, ebx
  1790 00000BC1 BF[EE580000]            	mov     edi, PitchTable
  1791                                  PitchLoop:      
  1792 00000BC6 50                      	push    eax
  1793 00000BC7 52                      	push    edx
  1794 00000BC8 6639DA                  	cmp     dx, bx
  1795 00000BCB 7303                    	jae     short NoDiv
  1796 00000BCD 66F7F3                  	div     bx
  1797                                  NoDiv:          
  1798 00000BD0 66AB                    	stosw
  1799 00000BD2 5A                      	pop     edx
  1800 00000BD3 58                      	pop     eax
  1801                                  	;inc	bx
  1802 00000BD4 43                      	inc	ebx
  1803 00000BD5 E2EF                    	loop    PitchLoop
  1804                                  MakeVolume:     
  1805 00000BD7 66B90041                	mov     cx, 16640
  1806 00000BDB 89CB                    	mov     ebx, ecx
  1807                                  VolLoop:
  1808 00000BDD 664B                    	dec     bx
  1809 00000BDF 88D8                    	mov     al, bl
  1810 00000BE1 F6EF                    	imul    bh
  1811                                  	;mov	[VolTable+bx], ah
  1812 00000BE3 88A3[A65F0000]          	mov     [VolTable+ebx], ah
  1813 00000BE9 E2F2                    	loop    VolLoop
  1814                                  
  1815 00000BEB 61                      	popad
  1816 00000BEC C3                      	retn
  1817                                  
  1818                                  ;--------------------------------------------------------------------------
  1819                                  ; StopPlaying: ShutDown the Sound System.
  1820                                  ;--------------------------------------------------------------------------
  1821                                  
  1822                                  StopPlaying:
  1823                                  	; 19/06/2017
  1824                                  	; Stop Playing
  1825                                  	sys	_audio, 0700h
  1825                              <1> 
  1825                              <1> 
  1825                              <1> 
  1825                              <1> 
  1825                              <1>  %if %0 >= 2
  1825 00000BED BB00070000          <1>  mov ebx, %2
  1825                              <1>  %if %0 >= 3
  1825                              <1>  mov ecx, %3
  1825                              <1>  %if %0 = 4
  1825                              <1>  mov edx, %4
  1825                              <1>  %endif
  1825                              <1>  %endif
  1825                              <1>  %endif
  1825 00000BF2 B820000000          <1>  mov eax, %1
  1825                              <1> 
  1825 00000BF7 CD40                <1>  int 40h
  1826                                  	; Cancel callback service (for user)
  1827                                  	sys	_audio, 0900h
  1827                              <1> 
  1827                              <1> 
  1827                              <1> 
  1827                              <1> 
  1827                              <1>  %if %0 >= 2
  1827 00000BF9 BB00090000          <1>  mov ebx, %2
  1827                              <1>  %if %0 >= 3
  1827                              <1>  mov ecx, %3
  1827                              <1>  %if %0 = 4
  1827                              <1>  mov edx, %4
  1827                              <1>  %endif
  1827                              <1>  %endif
  1827                              <1>  %endif
  1827 00000BFE B820000000          <1>  mov eax, %1
  1827                              <1> 
  1827 00000C03 CD40                <1>  int 40h
  1828                                  	; Deallocate Audio Buffer (for user)
  1829                                  	sys	_audio, 0A00h
  1829                              <1> 
  1829                              <1> 
  1829                              <1> 
  1829                              <1> 
  1829                              <1>  %if %0 >= 2
  1829 00000C05 BB000A0000          <1>  mov ebx, %2
  1829                              <1>  %if %0 >= 3
  1829                              <1>  mov ecx, %3
  1829                              <1>  %if %0 = 4
  1829                              <1>  mov edx, %4
  1829                              <1>  %endif
  1829                              <1>  %endif
  1829                              <1>  %endif
  1829 00000C0A B820000000          <1>  mov eax, %1
  1829                              <1> 
  1829 00000C0F CD40                <1>  int 40h
  1830                                  	; Disable Audio Device
  1831                                  	sys	_audio, 0C00h
  1831                              <1> 
  1831                              <1> 
  1831                              <1> 
  1831                              <1> 
  1831                              <1>  %if %0 >= 2
  1831 00000C11 BB000C0000          <1>  mov ebx, %2
  1831                              <1>  %if %0 >= 3
  1831                              <1>  mov ecx, %3
  1831                              <1>  %if %0 = 4
  1831                              <1>  mov edx, %4
  1831                              <1>  %endif
  1831                              <1>  %endif
  1831                              <1>  %endif
  1831 00000C16 B820000000          <1>  mov eax, %1
  1831                              <1> 
  1831 00000C1B CD40                <1>  int 40h
  1832                                  
  1833 00000C1D C3                      	retn
  1834                                  
  1835                                  ;=============================================================================
  1836                                  ; 
  1837                                  ;=============================================================================
  1838                                  
  1839                                  ;dword2str:
  1840                                  ;	; 13/11/2016 - Erdogan Tan 
  1841                                  ;	; eax = dword value
  1842                                  ;	;
  1843                                  ;	call	dwordtohex
  1844                                  ;	mov	[dword_str], edx
  1845                                  ;	mov	[dword_str+4], eax
  1846                                  ;	mov	si, dword_str
  1847                                  ;	retn
  1848                                  
  1849                                  	; 05/03/2017 (TRDOS 386)
  1850                                  	; trdos386.s (unix386.s) - 10/05/2015
  1851                                  	; Convert binary number to hexadecimal string
  1852                                  
  1853                                  ;bytetohex:
  1854                                  ;	; INPUT ->
  1855                                  ;	; 	AL = byte (binary number)
  1856                                  ;	; OUTPUT ->
  1857                                  ;	;	AX = hexadecimal string
  1858                                  ;	;
  1859                                  ;	push	ebx
  1860                                  ;	movzx	ebx, al
  1861                                  ;	shr	bl, 4
  1862                                  ;	mov	bl, [ebx+hex_chars] 	 	
  1863                                  ;	xchg	bl, al
  1864                                  ;	and	bl, 0Fh
  1865                                  ;	mov	ah, [ebx+hex_chars] 
  1866                                  ;	pop	ebx	
  1867                                  ;	retn
  1868                                  
  1869                                  ;wordtohex:
  1870                                  ;	; INPUT ->
  1871                                  ;	; 	AX = word (binary number)
  1872                                  ;	; OUTPUT ->
  1873                                  ;	;	EAX = hexadecimal string
  1874                                  ;	;
  1875                                  ;	push	ebx
  1876                                  ;	xor	ebx, ebx
  1877                                  ;	xchg	ah, al
  1878                                  ;	push	eax
  1879                                  ;	mov	bl, ah
  1880                                  ;	shr	bl, 4
  1881                                  ;	mov	al, [ebx+hex_chars] 	 	
  1882                                  ;	mov	bl, ah
  1883                                  ;	and	bl, 0Fh
  1884                                  ;	mov	ah, [ebx+hex_chars]
  1885                                  ;	shl	eax, 16
  1886                                  ;	pop	eax
  1887                                  ;	pop	ebx
  1888                                  ;	jmp	short bytetohex
  1889                                  
  1890                                  ;dwordtohex:
  1891                                  ;	; INPUT ->
  1892                                  ;	; 	EAX = dword (binary number)
  1893                                  ;	; OUTPUT ->
  1894                                  ;	;	EDX:EAX = hexadecimal string
  1895                                  ;	;
  1896                                  ;	push	eax
  1897                                  ;	shr	eax, 16
  1898                                  ;	call	wordtohex
  1899                                  ;	mov	edx, eax
  1900                                  ;	pop	eax
  1901                                  ;	call	wordtohex
  1902                                  ;	retn
  1903                                  
  1904                                  	; 19/06/2017
  1905                                  	; 05/03/2017 (TRDOS 386)
  1906                                  	; 13/11/2016 - Erdogan Tan
  1907                                  write_audio_dev_info:
  1908                                  	; BUS/DEV/FN
  1909                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  1910                                  	; DEV/VENDOR
  1911                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  1912                                  
  1913 00000C1E 8B35[A4520000]          	mov	esi, [dev_vendor]
  1914 00000C24 6689F0                  	mov	ax, si
  1915 00000C27 0FB6D8                  	movzx	ebx, al
  1916 00000C2A 88DA                    	mov	dl, bl
  1917 00000C2C 80E30F                  	and	bl, 0Fh
  1918 00000C2F 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1919 00000C35 A2[39520000]            	mov	[msgVendorId+3], al
  1920 00000C3A 88D3                    	mov	bl, dl
  1921 00000C3C C0EB04                  	shr	bl, 4
  1922 00000C3F 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1923 00000C45 A2[38520000]            	mov	[msgVendorId+2], al
  1924 00000C4A 88E3                    	mov	bl, ah
  1925 00000C4C 88DA                    	mov	dl, bl
  1926 00000C4E 80E30F                  	and	bl, 0Fh
  1927 00000C51 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1928 00000C57 A2[37520000]            	mov	[msgVendorId+1], al
  1929 00000C5C 88D3                    	mov	bl, dl
  1930 00000C5E C0EB04                  	shr	bl, 4
  1931 00000C61 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1932 00000C67 A2[36520000]            	mov	[msgVendorId], al
  1933 00000C6C C1EE10                  	shr	esi, 16
  1934 00000C6F 6689F0                  	mov	ax, si
  1935 00000C72 88C3                    	mov	bl, al
  1936 00000C74 88DA                    	mov	dl, bl
  1937 00000C76 80E30F                  	and	bl, 0Fh
  1938 00000C79 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1939 00000C7F A2[4A520000]            	mov	[msgDevId+3], al
  1940 00000C84 88D3                    	mov	bl, dl
  1941 00000C86 C0EB04                  	shr	bl, 4
  1942 00000C89 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1943 00000C8F A2[49520000]            	mov	[msgDevId+2], al
  1944 00000C94 88E3                    	mov	bl, ah
  1945 00000C96 88DA                    	mov	dl, bl
  1946 00000C98 80E30F                  	and	bl, 0Fh
  1947 00000C9B 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1948 00000CA1 A2[48520000]            	mov	[msgDevId+1], al
  1949 00000CA6 88D3                    	mov	bl, dl
  1950 00000CA8 C0EB04                  	shr	bl, 4
  1951 00000CAB 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1952 00000CB1 A2[47520000]            	mov	[msgDevId], al
  1953                                  
  1954 00000CB6 8B35[A8520000]          	mov	esi, [bus_dev_fn]
  1955 00000CBC C1EE08                  	shr	esi, 8
  1956 00000CBF 6689F0                  	mov	ax, si
  1957 00000CC2 88C3                    	mov	bl, al
  1958 00000CC4 88DA                    	mov	dl, bl
  1959 00000CC6 80E307                  	and	bl, 7 ; bit 0,1,2
  1960 00000CC9 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1961 00000CCF A2[6E520000]            	mov	[msgFncNo+1], al
  1962 00000CD4 88D3                    	mov	bl, dl
  1963 00000CD6 C0EB03                  	shr	bl, 3
  1964 00000CD9 88DA                    	mov	dl, bl
  1965 00000CDB 80E30F                  	and	bl, 0Fh
  1966 00000CDE 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1967 00000CE4 A2[60520000]            	mov	[msgDevNo+1], al
  1968 00000CE9 88D3                    	mov	bl, dl
  1969 00000CEB C0EB04                  	shr	bl, 4
  1970 00000CEE 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1971 00000CF4 A2[5F520000]            	mov	[msgDevNo], al
  1972 00000CF9 88E3                    	mov	bl, ah
  1973 00000CFB 88DA                    	mov	dl, bl
  1974 00000CFD 80E30F                  	and	bl, 0Fh
  1975 00000D00 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1976 00000D06 A2[54520000]            	mov	[msgBusNo+1], al
  1977 00000D0B 88D3                    	mov	bl, dl
  1978 00000D0D C0EB04                  	shr	bl, 4
  1979 00000D10 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1980 00000D16 A2[53520000]            	mov	[msgBusNo], al
  1981                                  
  1982 00000D1B 66A1[B0520000]          	mov	ax, [ac97_io_base]
  1983 00000D21 88C3                    	mov	bl, al
  1984 00000D23 88DA                    	mov	dl, bl
  1985 00000D25 80E30F                  	and	bl, 0Fh
  1986 00000D28 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1987 00000D2E A2[87520000]            	mov	[msgIOBaseAddr+3], al
  1988 00000D33 88D3                    	mov	bl, dl
  1989 00000D35 C0EB04                  	shr	bl, 4
  1990 00000D38 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1991 00000D3E A2[86520000]            	mov	[msgIOBaseAddr+2], al
  1992 00000D43 88E3                    	mov	bl, ah
  1993 00000D45 88DA                    	mov	dl, bl
  1994 00000D47 80E30F                  	and	bl, 0Fh
  1995 00000D4A 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  1996 00000D50 A2[85520000]            	mov	[msgIOBaseAddr+1], al
  1997 00000D55 88D3                    	mov	bl, dl
  1998 00000D57 C0EB04                  	shr	bl, 4
  1999 00000D5A 8A83[F4510000]          	mov	al, [ebx+hex_chars]
  2000 00000D60 A2[84520000]            	mov	[msgIOBaseAddr], al
  2001                                  
  2002                                  	; 24/11/2016
  2003 00000D65 30E4                    	xor	ah, ah
  2004 00000D67 A0[B2520000]            	mov	al, [ac97_int_ln_reg]
  2005 00000D6C B10A                    	mov	cl, 10
  2006 00000D6E F6F1                    	div	cl
  2007 00000D70 660105[8F520000]        	add	[msgIRQ], ax
  2008 00000D77 20C0                    	and	al, al
  2009 00000D79 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  2010 00000D7B A0[90520000]            	mov	al, [msgIRQ+1]
  2011 00000D80 B420                    	mov	ah, ' '
  2012 00000D82 66A3[8F520000]          	mov	[msgIRQ], ax
  2013                                  _w_ac97imsg_:
  2014                                  	; EBX = Message address
  2015                                  	; ECX = Max. message length (or stop on ZERO character)
  2016                                  	;	(1 to 255)
  2017                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  2018                                       	sys 	_msg, msgAC97Info, 255, 07h
  2018                              <1> 
  2018                              <1> 
  2018                              <1> 
  2018                              <1> 
  2018                              <1>  %if %0 >= 2
  2018 00000D88 BB[05520000]        <1>  mov ebx, %2
  2018                              <1>  %if %0 >= 3
  2018 00000D8D B9FF000000          <1>  mov ecx, %3
  2018                              <1>  %if %0 = 4
  2018 00000D92 BA07000000          <1>  mov edx, %4
  2018                              <1>  %endif
  2018                              <1>  %endif
  2018                              <1>  %endif
  2018 00000D97 B823000000          <1>  mov eax, %1
  2018                              <1> 
  2018 00000D9C CD40                <1>  int 40h
  2019 00000D9E C3                              retn
  2020                                  
  2021                                  ;=============================================================================
  2022                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  2023                                  ;=============================================================================
  2024                                  
  2025                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2026                                  
  2027                                  ;-----------------------------------------------------------------------------
  2028                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  2029                                  ;-----------------------------------------------------------------------------
  2030                                  	; 22/10/2017
  2031                                  setgraphmode:
  2032                                  	;pushad
  2033 00000D9F 66B81200                	mov	ax,0012h
  2034                                  	;int	10h
  2035 00000DA3 CD31                    	int 	31h
  2036 00000DA5 66BAC003                	mov	dx,3C0h
  2037 00000DA9 30C0                    	xor	al,al
  2038                                  setgraphmodel0:
  2039                                  	;out	dx,al
  2040 00000DAB B401                    	mov	ah, 1 ; outb
  2041 00000DAD CD34                    	int	34h
  2042                                  	;out	dx, al
  2043                                  	;mov	ah, 1
  2044 00000DAF CD34                    	int	34h
  2045 00000DB1 FEC0                    	inc	al
  2046 00000DB3 3C10                    	cmp	al, 10h
  2047 00000DB5 72F4                    	jb	short setgraphmodel0
  2048 00000DB7 B020                    	mov	al, 20h
  2049                                  	;out	dx, al
  2050                                  	;mov	ah, 1
  2051 00000DB9 CD34                    	int	34h
  2052                                  	;popad
  2053 00000DBB C3                      	retn
  2054                                  
  2055                                  ;-----------------------------------------------------------------------------
  2056                                  ; settextmode - restore the VGA 80x25x16 text mode
  2057                                  ;-----------------------------------------------------------------------------
  2058                                  	; 22/10/2017
  2059                                  settextmode:
  2060                                  	;pushad
  2061 00000DBC 66B80300                	mov	ax, 0003h
  2062                                  	;int	10h
  2063 00000DC0 CD31                    	int	31h
  2064                                  	;popad
  2065 00000DC2 C3                      	retn
  2066                                  
  2067                                  ;-----------------------------------------------------------------------------
  2068                                  ; drawscopes - draw the track voices sample scopes
  2069                                  ; In:
  2070                                  ;  ESI = (current) sample buffer
  2071                                  ;-----------------------------------------------------------------------------
  2072                                  	; 29/10/2017
  2073                                  	; 28/10/2017
  2074                                  	; (ESI = Current DMA buffer offset)
  2075                                  	; 27/10/2017
  2076                                  	; 26/10/2017
  2077                                  	; 23/10/2017
  2078                                  drawscopes:
  2079                                  	;pushad
  2080                                    	;mov	esi, g_buff
  2081                                  	;mov	esi, edx
  2082 00000DC3 31C9                    	xor     ecx, ecx	
  2083 00000DC5 31D2                    	xor     edx, edx
  2084 00000DC7 31FF                    	xor	edi, edi
  2085                                  drawscope0:
  2086 00000DC9 66AD                    	lodsw
  2087 00000DCB 80F480                  	xor	ah, 80h
  2088 00000DCE 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2089 00000DD1 66D1E3                  	shl	bx, 1
  2090 00000DD4 668B83[30C20000]        	mov	ax, [RowOfs+ebx]
  2091 00000DDB 668987[30C40000]        	mov	[NewScope_L+edi], ax
  2092 00000DE2 30FF                    	xor	bh, bh
  2093 00000DE4 66AD                    	lodsw
  2094 00000DE6 80F480                  	xor	ah, 80h
  2095 00000DE9 88E3                    	mov	bl, ah	; Right Channel
  2096 00000DEB 66D1E3                  	shl	bx, 1
  2097 00000DEE 668B83[30C20000]        	mov	ax, [RowOfs+ebx]
  2098 00000DF5 668987[30C60000]        	mov	[NewScope_R+edi], ax
  2099 00000DFC 6683C702                	add	di, 2
  2100 00000E00 FEC1                    	inc	cl
  2101 00000E02 75C5                    	jnz	short drawscope0	
  2102                                  
  2103 00000E04 66BAC403                        mov	dx, 3C4h
  2104                                          ;mov	ax, 0802h
  2105                                          ;out	dx, ax
  2106 00000E08 66BB0208                        mov	bx, 0802h
  2107 00000E0C B403                    	mov	ah, 3 ; outw
  2108 00000E0E CD34                    	int	34h
  2109 00000E10 66BACE03                	mov	dx, 3CEh
  2110 00000E14 B008                            mov	al, 08h
  2111                                         ;out	dx, al
  2112 00000E16 B401                            mov	ah, 1 ; outb
  2113 00000E18 CD34                    	int	34h
  2114 00000E1A 6642                    	inc	dx
  2115                                  
  2116                                  	; 26/10/2017
  2117 00000E1C 31F6                            xor	esi, esi
  2118                                         ;xor	edi, edi
  2119 00000E1E BB45060A00                      mov     ebx, 0A0645h
  2120                                  drawscopel4:
  2121 00000E23 B080                            mov     al, 80h
  2122                                  drawscopel2:
  2123 00000E25 50                              push    eax ; *
  2124 00000E26 52                              push    edx ; **
  2125                                  	;out	dx, al
  2126 00000E27 B401                    	mov	ah, 1 ; outb
  2127 00000E29 CD34                    	int	34h
  2128                                  
  2129 00000E2B B4FF                            mov	ah, 0FFh
  2130                                          ;mov	ecx, 32
  2131 00000E2D B120                    	mov	cl, 32
  2132 00000E2F 28C0                    	sub     al, al
  2133                                  drawscopel3:
  2134                                  	; 23/10/2017
  2135 00000E31 668B96[30C80000]                mov	dx, [OldScope_L+esi]
  2136 00000E38 663B96[30C40000]                cmp	dx, [NewScope_L+esi]
  2137 00000E3F 7414                            je	short drawscopef3
  2138 00000E41 88041A                          mov	[edx+ebx], al ; L
  2139 00000E44 668B96[30C40000]                mov     dx, [NewScope_L+esi]
  2140 00000E4B 88241A                  	mov	[edx+ebx], ah ; L
  2141 00000E4E 668996[30C80000]                mov     [OldScope_L+esi], dx
  2142                                  drawscopef3:
  2143                                  	; 27/10/2017
  2144 00000E55 668B96[30CA0000]                mov	dx, [OldScope_R+esi]
  2145 00000E5C 663B96[30C60000]                cmp	dx, [NewScope_R+esi]
  2146 00000E63 7416                            je	short drawscopef4
  2147 00000E65 88441A26                	mov	[edx+ebx+38], al ; R
  2148 00000E69 668B96[30C60000]                mov     dx, [NewScope_R+esi]
  2149 00000E70 88641A26                        mov	[edx+ebx+38], ah ; R
  2150 00000E74 668996[30CA0000]                mov     [OldScope_R+esi], dx
  2151                                  drawscopef4:
  2152 00000E7B 83C610                  	add	esi, 2*8
  2153 00000E7E 43                      	inc	ebx
  2154 00000E7F E2B0                    	loop    drawscopel3
  2155                                  
  2156 00000E81 5A                              pop     edx ; **
  2157 00000E82 58                              pop     eax ; *
  2158 00000E83 81EEFE010000            	sub	esi, 2*256-2
  2159 00000E89 83EB20                  	sub	ebx, 32
  2160 00000E8C D0E8                            shr     al, 1
  2161 00000E8E 7595                            jnz	short drawscopel2
  2162                                  	;popad
  2163 00000E90 C3                              retn
  2164                                  
  2165                                  ;=============================================================================
  2166                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2167                                  ;=============================================================================
  2168                                  
  2169                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2170                                  
  2171                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2172                                  
  2173                                  ;-----------------------------------------------------------------------------
  2174                                  ; EQUATES AND STRUCTURES
  2175                                  ;-----------------------------------------------------------------------------
  2176                                  
  2177                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2178                                  ID_ILBM equ 4D424C49h
  2179                                  ID_BMHD equ 44484D42h
  2180                                  ID_CMAP equ 50414D43h
  2181                                  ID_BODY equ 59444F42h
  2182                                  
  2183                                  struc Form			; IFF/ILBM header file format
  2184 00000000 <res 00000004>            .ID:		resd 1
  2185 00000004 <res 00000004>            .Length:	resd 1
  2186 00000008 <res 00000004>            .Type:	resd 1
  2187                                    .size:
  2188                                  endstruc
  2189                                  
  2190                                  struc Chunk			; IFF/ILBM header chunk format
  2191 00000000 <res 00000004>            .ID:		resd 1
  2192 00000004 <res 00000004>            .Length:	resd 1
  2193                                    .size:	
  2194                                  endstruc
  2195                                  
  2196                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2197 00000000 <res 00000002>            .Width: 	resw 1
  2198 00000002 <res 00000002>            .Height:	resw 1
  2199 00000004 <res 00000002>            .PosX:	resw 1
  2200 00000006 <res 00000002>            .PosY:	resw 1
  2201 00000008 <res 00000001>            .Planes:	resb 1
  2202 00000009 <res 00000001>            .Masking:	resb 1
  2203 0000000A <res 00000001>            .Compression:	resb 1
  2204 0000000B <res 00000001>            .Pad:		resb 1
  2205 0000000C <res 00000002>            .Transparent:	resw 1
  2206 0000000E <res 00000001>            .AspectX	resb 1
  2207 0000000F <res 00000001>            .AspectY:	resb 1
  2208 00000010 <res 00000002>            .PageWidth:	resw 1
  2209 00000012 <res 00000002>            .PageHeight:	resw 1
  2210                                    .size:	
  2211                                  endstruc
  2212                                  
  2213                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2214 00000000 <res 00000300>            .Colors:	resb 768
  2215                                    .size:	
  2216                                  endstruc
  2217                                  
  2218                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2219                                  
  2220                                  ;------------------------------------------------------------------------------
  2221                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2222                                  ;         a value in little/big endian form to big/little endian form.
  2223                                  ;------------------------------------------------------------------------------
  2224                                  %macro	bswap   1
  2225                                          xchg    al, ah
  2226                                          rol     eax, 16
  2227                                          xchg    al, ah
  2228                                  %endmacro
  2229                                  
  2230                                  ;------------------------------------------------------------------------------
  2231                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2232                                  ; In:
  2233                                  ;  ESI = IFF/ILBM image file address
  2234                                  ;------------------------------------------------------------------------------
  2235                                  putlbm:
  2236 00000E91 60                              pushad
  2237                                  
  2238                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2239                                  
  2240 00000E92 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2241 00000E98 7551                            jne     short putlbmd0
  2242 00000E9A 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2243 00000EA1 7548                            jne     short putlbmd0
  2244                                  
  2245                                  ; get the IFF/ILBM file length in bytes
  2246                                  
  2247 00000EA3 8B4604                          mov     eax, [esi+Form.Length]
  2248                                          bswap   eax
  2248 00000EA6 86C4                <1>  xchg al, ah
  2248 00000EA8 C1C010              <1>  rol eax, 16
  2248 00000EAB 86C4                <1>  xchg al, ah
  2249 00000EAD 89C1                            mov     ecx, eax
  2250                                  
  2251                                  ; decrease the file length and update the file pointer
  2252                                  
  2253 00000EAF 83E904                          sub     ecx, 4
  2254 00000EB2 83C60C                          add     esi, Form.size
  2255                                  
  2256                                  ; IFF/ILBM main parser body loop
  2257                                  
  2258                                  putlbml0:
  2259 00000EB5 85C9                            test    ecx, ecx
  2260 00000EB7 7E64                            jle     short putlbmd1
  2261                                  
  2262                                  ; get the next chunk ID and length in bytes
  2263                                  
  2264 00000EB9 8B1E                            mov     ebx, [esi+Chunk.ID]
  2265 00000EBB 8B4604                          mov     eax, [esi+Chunk.Length]
  2266                                          bswap   eax
  2266 00000EBE 86C4                <1>  xchg al, ah
  2266 00000EC0 C1C010              <1>  rol eax, 16
  2266 00000EC3 86C4                <1>  xchg al, ah
  2267 00000EC5 93                              xchg    ebx, eax
  2268 00000EC6 83C608                          add     esi, Chunk.size
  2269                                  
  2270                                  ; word align the chunk length and decrease the file length counter
  2271                                  
  2272 00000EC9 43                              inc     ebx
  2273 00000ECA 80E3FE                          and     bl, 0FEh ; ~1
  2274 00000ECD 83E908                          sub     ecx, Chunk.size
  2275 00000ED0 29D9                            sub     ecx, ebx
  2276                                  
  2277                                  ; check for the BMHD/CMAP/BODY chunk headers
  2278                                  
  2279 00000ED2 3D424D4844                      cmp     eax, ID_BMHD
  2280 00000ED7 7415                            je      short putlbmf0
  2281 00000ED9 3D434D4150                      cmp     eax, ID_CMAP
  2282 00000EDE 7440                            je      short putlbmf1
  2283 00000EE0 3D424F4459                      cmp     eax, ID_BODY
  2284 00000EE5 7455                            je      short putlbmf2
  2285                                  
  2286                                  ; advance to the next IFF/ILBM chunk structure
  2287                                  
  2288                                  putlbmc0:
  2289 00000EE7 01DE                            add     esi, ebx
  2290 00000EE9 EBCA                            jmp     short putlbml0
  2291                                  
  2292                                  putlbmd0:
  2293 00000EEB F9                              stc
  2294 00000EEC 61                              popad
  2295 00000EED C3                              retn
  2296                                  
  2297                                  ; process the BMHD bitmap header chunk
  2298                                  
  2299                                  putlbmf0:
  2300 00000EEE 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2301 00000EF2 75F7                            jne     short putlbmd0
  2302 00000EF4 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2303 00000EF8 75F1                            jne     short putlbmd0
  2304 00000EFA 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2305 00000EFE 75EB                            jne     short putlbmd0
  2306 00000F00 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2307 00000F03 86C4                            xchg    al, ah
  2308 00000F05 83C007                          add     eax, 7
  2309 00000F08 C1E803                          shr     eax, 3
  2310 00000F0B A3[9C520000]                    mov     [picture.width], eax
  2311 00000F10 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2312 00000F14 86C4                            xchg    al, ah
  2313 00000F16 A3[A0520000]                    mov     [picture.height], eax
  2314 00000F1B EBCA                            jmp     short putlbmc0
  2315                                  
  2316                                  putlbmd1:
  2317 00000F1D F8                              clc
  2318 00000F1E 61                              popad
  2319 00000F1F C3                              retn
  2320                                  
  2321                                  ; process the CMAP colormap chunk
  2322                                  
  2323                                  putlbmf1:
  2324 00000F20 66BAC803                        mov     dx, 3C8h
  2325 00000F24 30C0                            xor     al, al
  2326                                          ;out	dx, al
  2327 00000F26 B401                    	mov	ah, 1 ; outb
  2328 00000F28 CD34                    	int	34h
  2329 00000F2A 6642                            inc     dx
  2330                                  putlbml1:
  2331 00000F2C 8A06                            mov     al, [esi]
  2332 00000F2E C0E802                          shr     al, 2
  2333                                          ;out	dx, al
  2334                                  	;mov	ah, 1 ; outb
  2335 00000F31 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2336 00000F33 46                              inc     esi
  2337 00000F34 4B                              dec     ebx
  2338 00000F35 7FF5                            jg      short putlbml1
  2339 00000F37 E979FFFFFF                      jmp     putlbml0
  2340                                  
  2341                                  ; process the BODY bitmap body chunk
  2342                                  
  2343                                  putlbmf2:
  2344 00000F3C 60                              pushad
  2345 00000F3D BF00000A00                      mov     edi, 0A0000h
  2346                                          ;cld
  2347 00000F42 66BACE03                        mov     dx, 3CEh
  2348                                          ;mov	ax, 0FF08h
  2349                                          ;out	dx, ax
  2350 00000F46 66BB08FF                	mov	bx, 0FF08h
  2351 00000F4A B403                    	mov	ah, 3 ; outw
  2352 00000F4C CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2353 00000F4E 66BAC403                        mov     dx, 3C4h
  2354 00000F52 B002                            mov     al, 02h
  2355                                          ;out	dx, al
  2356 00000F54 B401                    	mov	ah, 1 ; outb
  2357 00000F56 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2358 00000F58 6642                            inc     dx
  2359 00000F5A 8B0D[A0520000]                  mov     ecx, [picture.height]
  2360                                  putlbml2:
  2361 00000F60 51                              push    ecx
  2362 00000F61 B011                            mov     al, 11h
  2363                                  putlbml3:
  2364 00000F63 50                              push    eax
  2365 00000F64 57                              push    edi
  2366                                          ;out	dx, al
  2367 00000F65 B401                    	mov	ah, 1 ; outb
  2368 00000F67 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2369 00000F69 8B1D[9C520000]                  mov     ebx, [picture.width]
  2370                                  putlbml4:
  2371 00000F6F AC                              lodsb
  2372 00000F70 84C0                            test    al, al
  2373 00000F72 7C0A                            jl      short putlbmf3
  2374 00000F74 0FB6C8                          movzx   ecx, al
  2375 00000F77 41                              inc     ecx
  2376 00000F78 29CB                            sub     ebx, ecx
  2377 00000F7A F3A4                            rep     movsb
  2378 00000F7C EB0B                            jmp     short putlbmc4
  2379                                  putlbmf3:
  2380 00000F7E F6D8                            neg     al
  2381 00000F80 0FB6C8                          movzx   ecx, al
  2382 00000F83 41                              inc     ecx
  2383 00000F84 29CB                            sub     ebx, ecx
  2384 00000F86 AC                              lodsb
  2385 00000F87 F3AA                            rep     stosb
  2386                                  putlbmc4:
  2387 00000F89 85DB                            test    ebx, ebx
  2388 00000F8B 7FE2                            jg      short putlbml4
  2389 00000F8D 5F                              pop     edi
  2390 00000F8E 58                              pop     eax
  2391 00000F8F 00C0                            add     al, al
  2392 00000F91 73D0                            jnc     short putlbml3
  2393 00000F93 83C750                          add     edi, 80
  2394 00000F96 59                              pop     ecx
  2395 00000F97 E2C7                            loop    putlbml2
  2396 00000F99 61                      	popad
  2397 00000F9A E948FFFFFF                      jmp	putlbmc0
  2398                                  
  2399                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2400                                  ;------------------------------------------------------------------------------
  2401                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2402                                  ;  ESI = IFF/ILBM image file address
  2403                                  ;------------------------------------------------------------------------------
  2404                                  
  2405                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2406                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2407                                  ;       MODStopModule();
  2408                                  ;       MODFreeModule(Song);
  2409                                  ;       return;
  2410                                  ;   }
  2411                                  ;   setgraphmode();
  2412                                  ;   putlbm(Logo);
  2413                                  ;   while (!kbhit())
  2414                                  ;       drawscopes(Song->NumTracks);
  2415                                  ;   settextmode();
  2416                                  ;   free(Logo);
  2417                                  ;   MODStopModule();
  2418                                  ;   MODFreeModule(Song);
  2419                                  
  2420                                  ;loadlbm:
  2421                                  ;	; ebx = ASCIIZ file name address
  2422                                  ;	; ecx = open mode (0 = open for read)	
  2423                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2424                                  ;	jc	short loadlbm_retn
  2425                                  ;
  2426                                  ;	mov     [LBM_FileHandle], eax
  2427                                  ;
  2428                                  ;	; get file size by moving file pointer to the end of file
  2429                                  ;	; ebx = file handle/number
  2430                                  ;	; ecx : offset = 0
  2431                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2432                                  ;	sys	_seek, eax, 0, 2
  2433                                  ;	jc	short loadlbm_cf
  2434                                  ;
  2435                                  ;	mov	[LBM_FileSize], eax
  2436                                  ;
  2437                                  ;	; move file pointer to the beginning of the file
  2438                                  ;	; ecx = 0
  2439                                  ;	; edx = 0
  2440                                  ;	;xor	ecx, ecx
  2441                                  ; 	xor	dl, dl
  2442                                  ;	; ebx = [LBM_FileHandle]
  2443                                  ;	sys	_seek
  2444                                  ;	;jc	short loadlbm_cf
  2445                                  ;
  2446                                  ;	; ebx = File handle
  2447                                  ;	; ecx = Buffer address
  2448                                  ;	; edx = Byte count
  2449                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2450                                  ;	mov	ecx, LOGO_ADDRESS
  2451                                  ;	mov	edx, [LBM_FileSize]
  2452                                  ;	sys	_read
  2453                                  ;	jc	short loadlbm_cf
  2454                                  ;
  2455                                  ;	cmp	eax, edx  ; read count = file size ?
  2456                                  ;	;jb	short loadlbm_cf		 
  2457                                  ;loadlbm_cf:
  2458                                  ;	pushf
  2459                                  ;	sys	_close, [LBM_FileHandle]	
  2460                                  ;	popf
  2461                                  ;loadlbm_retn:
  2462                                  ;	retn	
  2463                                  ;
  2464                                  ;LOGO_FILE_NAME:
  2465                                  ;	db	"LOGO.LBM", 0
  2466                                  
  2467                                  LOGO_ERROR_MSG:
  2468 00000F9F 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2468 00000FA8 64696E672074686520-
  2468 00000FB1 4946462F494C424D20-
  2468 00000FBA 6C6F676F2070696374-
  2468 00000FC3 75726520210D0A00   
  2469                                  
  2470 00000FCB 90                      align 2
  2471                                  ; 22/10/2017
  2472                                  LOGO_ADDRESS:
  2473                                  ;incbin "LOGO.LBM"	  	 
  2474                                  ; 27/10/2017
  2475 00000FCC <incbin>                incbin "TINYPLAY.LBM"
  2476                                  
  2477                                  ;=============================================================================
  2478                                  ;               preinitialized data
  2479                                  ;=============================================================================
  2480                                  
  2481                                  ;=============================================================================
  2482                                  ; Protracker effects stuff
  2483                                  ;=============================================================================
  2484                                  
  2485                                  ;-----------------------------------------------------------------------------
  2486                                  ; Effect jump tables
  2487                                  ;-----------------------------------------------------------------------------
  2488                                  
  2489                                  align 4
  2490                                  
  2491                                  efxtable:
  2492 00004FBC [BC070000]              	dd      efxarpeggio	; 0 - arpeggio
  2493 00004FC0 [E9040000]              	dd      efxnull		; 1 - porta up
  2494 00004FC4 [E9040000]              	dd      efxnull		; 2 - porta down
  2495 00004FC8 [07070000]              	dd      efxtoneporta	; 3 - tone porta
  2496 00004FCC [16070000]              	dd      efxvibrato	; 4 - vibrato
  2497 00004FD0 [E9040000]              	dd      efxnull		; 5 - tone+slide
  2498 00004FD4 [E9040000]              	dd      efxnull		; 6 - vibrato+slide
  2499 00004FD8 [33080000]              	dd      efxtremolo	; 7 - tremolo
  2500 00004FDC [E9040000]              	dd      efxnull		; 8 - unused
  2501 00004FE0 [3E070000]              	dd      efxsampoffset	; 9 - sample offset
  2502 00004FE4 [E9040000]              	dd      efxnull		; A - volume slide
  2503 00004FE8 [4A070000]              	dd      efxpattjump	; B - pattern jump
  2504 00004FEC [58070000]              	dd      efxsetvolume	; C - set volume
  2505 00004FF0 [66070000]              	dd      efxbreak	; D - break pattern
  2506 00004FF4 [E9040000]              	dd      efxnull		; E - extra effects
  2507 00004FF8 [85070000]              	dd      efxsetspeed	; F - set speed
  2508                                  
  2509                                  efxtable2:
  2510 00004FFC [EA040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2511 00005000 [0C050000]              	dd      efxportaup	; 1 - porta up
  2512 00005004 [32050000]              	dd      efxportadown	; 2 - porta down
  2513 00005008 [59050000]              	dd      efxtoneporta2	; 3 - tone porta
  2514 0000500C [92050000]              	dd      efxvibrato2	; 4 - vibrato
  2515 00005010 [EE050000]              	dd      efxtoneslide	; 5 - tone+slide
  2516 00005014 [FB050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2517 00005018 [22060000]              	dd      efxtremolo2	; 7 - tremolo
  2518 0000501C [E9040000]              	dd      efxnull		; 8 - unused
  2519 00005020 [E9040000]              	dd      efxnull		; 9 - sample offset
  2520 00005024 [05060000]              	dd      efxvolslide	; A - volume slide
  2521 00005028 [E9040000]              	dd      efxnull		; B - pattern jump
  2522 0000502C [E9040000]              	dd      efxnull		; C - set volume
  2523 00005030 [E9040000]              	dd      efxnull		; D - break pattern
  2524 00005034 [E9040000]              	dd      efxnull		; E - extra effects
  2525 00005038 [E9040000]              	dd      efxnull		; F - set speed
  2526                                  
  2527                                  ;-----------------------------------------------------------------------------
  2528                                  ; Amiga period table
  2529                                  ;-----------------------------------------------------------------------------
  2530                                  
  2531                                  ;PeriodTable0:	
  2532                                  ;	dw	0
  2533                                  PeriodTable:
  2534 0000503C 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2534 00005045 0A000A7009E8086808-
  2534 0000504E F00780071407       
  2535 00005054 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2535 0000505D 050005B80474043404-
  2535 00005066 F803C0038A03       
  2536 0000506C 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2536 00005075 0280025C023A021A02-
  2536 0000507E FC01E001C501       
  2537 00005084 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2537 0000508D 0140012E011D010D01-
  2537 00005096 FE00F000E200       
  2538 0000509C D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2538 000050A5 00A00097008F008700-
  2538 000050AE 7F0078007100       
  2539 000050B4 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2539 000050BD 0050004B0047004300-
  2539 000050C6 3F003C003800       
  2540 000050CC 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2540 000050D5 002800250023002100-
  2540 000050DE 1F001E001C00       
  2541                                  
  2542                                  ;-----------------------------------------------------------------------------
  2543                                  ; Sinus wave table
  2544                                  ;-----------------------------------------------------------------------------
  2545                                  
  2546                                  SinTable:
  2547 000050E4 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2547 000050ED C5D4E1             
  2548 000050F0 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2548 000050F9 E1                 
  2549 000050FA D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2549 00005103 19                 
  2550                                  
  2551                                  ;=============================================================================
  2552                                  ;               PLAY.ASM - DATA
  2553                                  ;=============================================================================
  2554 00005104 00                      	db	0
  2555                                  msg_usage:
  2556 00005105 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2556 0000510E 506C6179657220666F-
  2556 00005117 72205452444F532033-
  2556 00005120 383620627920457264-
  2556 00005129 6F67616E2054616E2E-
  2556 00005132 20                 
  2557 00005133 417567757374203230-     	db	'August 2020.',10,13
  2557 0000513C 32302E0A0D         
  2558 00005141 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2558 0000514A 6F64706C6179206669-
  2558 00005153 6C656E616D652E6D6F-
  2558 0000515C 640A0D00           
  2559 00005160 32392F31302F323031-     	db	'29/10/2017',10,13,0
  2559 00005169 370A0D00           
  2560 0000516D 32342F30382F323032-     	db	'24/08/2020',10,13,0
  2560 00005176 300A0D00           
  2561                                  
  2562                                  Credits:
  2563 0000517A 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2563 00005183 506C61796572207630-
  2563 0000518C 2E3162206279204361-
  2563 00005195 726C6F732048617361-
  2563 0000519E 6E2E204A756C792031-
  2563 000051A7 3939332E           
  2564 000051AB 0A0D00                  	db	10,13,0
  2565                                  ErrorMesg:    
  2566 000051AE 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  2566 000051B7 64696E67204D6F6475-
  2566 000051C0 6C652066696C652E0A-
  2566 000051C9 0D00               
  2567                                  
  2568                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2569                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2570                                  ;PortText:    db 'x0h, IRQ '
  2571                                  ;IrqText:     db 'x.',10,13,0
  2572                                  
  2573                                  trdos386_err_msg:
  2574 000051CB 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  2574 000051D4 2053797374656D2063-
  2574 000051DD 616C6C206572726F72-
  2574 000051E6 20210A0D00         
  2575                                  
  2576                                  ; 07/10/2017
  2577 000051EB 0A                      pattern_shift:	db 10
  2578                                  ;numtracks:	dw 4
  2579                                  ; 18/10/2017
  2580 000051EC 04000000                numtracks:	dd 4
  2581                                  
  2582                                  ;=============================================================================
  2583                                  ;               PLAYER.ASM - DATA
  2584                                  ;=============================================================================
  2585                                  
  2586                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  2587                                  ;bps:		db 8 ; bits per sample (8 or 16)
  2588                                  
  2589                                  ;19/10/2017
  2590 000051F0 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  2591 000051F1 10                      bps:		db 16 ; bits per sample (8 or 16)
  2592                                  
  2593                                  Sample_Rate:
  2594 000051F2 2256                    MixSpeed:	dw 22050 ; Hz
  2595                                  
  2596                                  ; 13/11/2016
  2597 000051F4 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  2597 000051FD 3941424344454600   
  2598                                  ;
  2599                                  msgAC97Info:	
  2600 00005205 0D0A                    		db 0Dh, 0Ah
  2601 00005207 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  2601 00005210 6F20436F6E74726F6C-
  2601 00005219 6C6572202620436F64-
  2601 00005222 656320496E666F0D0A 
  2602 0000522B 56656E646F72204944-     		db "Vendor ID: "
  2602 00005234 3A20               
  2603 00005236 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  2603 0000523F 6963652049443A20   
  2604 00005247 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  2605 0000524E 4275733A20              		db "Bus: "
  2606 00005253 303068204465766963-     msgBusNo:	db "00h Device: "
  2606 0000525C 653A20             
  2607 0000525F 3030682046756E6374-     msgDevNo:	db "00h Function: "
  2607 00005268 696F6E3A20         
  2608 0000526D 303068                  msgFncNo	db "00h"
  2609 00005270 0D0A                    		db 0Dh, 0Ah
  2610 00005272 492F4F204261736520-     		db "I/O Base Address: "
  2610 0000527B 416464726573733A20 
  2611 00005284 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  2611 0000528D 3A20               
  2612 0000528F 3030                    msgIRQ:		dw 3030h
  2613 00005291 0D0A00                  		db 0Dh, 0Ah, 0
  2614                                  ;msgSampleRate:	db "Sample Rate: "
  2615                                  ;msgHertz:	db "00000 Hz ", 0
  2616                                  ;msg8Bits:	db "8 bits ", 0
  2617                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  2618                                  ;msg16Bits:	db "16 bits ", 0
  2619                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  2620                                  ;
  2621                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  2622                                  ;codec_id:	   dd 0
  2623                                  ;codec_chip_id:	   dd 0
  2624                                  ;codec_vendor_ids: dw 0
  2625                                  ;codec_chip_ids:   dw 0
  2626                                  
  2627                                  ;dword_str:	dd 30303030h, 30303030h
  2628                                  ;	 	db 'h', 0Dh, 0Ah, 0
  2629                                  
  2630                                  ;=============================================================================
  2631                                  ;        	uninitialized data
  2632                                  ;=============================================================================
  2633                                  
  2634                                  bss_start:
  2635                                  
  2636                                  ABSOLUTE bss_start
  2637                                  
  2638                                  alignb 4
  2639                                  
  2640                                  ;------------------------------------------------------------------------------
  2641                                  ; IFF/ILBM DATA
  2642                                  ;------------------------------------------------------------------------------
  2643                                  
  2644 00005294 <res 00000004>          LBM_FileHandle:	resd 1
  2645 00005298 <res 00000004>          LBM_FileSize:	resd 1
  2646                                  ;
  2647 0000529C <res 00000004>          picture.width:	resd 1 		; current picture width and height
  2648 000052A0 <res 00000004>          picture.height:	resd 1
  2649                                  
  2650                                  ;------------------------------------------------------------------------------
  2651                                  
  2652 000052A4 <res 00000004>          dev_vendor:	resd 1
  2653 000052A8 <res 00000004>          bus_dev_fn:	resd 1
  2654 000052AC <res 00000004>          stats_cmd:	resd 1
  2655 000052B0 <res 00000002>          ac97_io_base:	resw 1
  2656 000052B2 <res 00000001>          ac97_int_ln_reg: resb 1
  2657 000052B3 <res 00000001>          srb:		resb 1
  2658                                  
  2659                                  ; MODLOAD.ASM
  2660 000052B4 <res 00000004>          FileHandle:	resd 1
  2661 000052B8 <res 0000043C>          Header:		resb ModHeader.size
  2662                                  
  2663                                  ; MODPLAY.ASM
  2664                                  ;MixSpeed:	    resw 1
  2665                                  
  2666                                  ModInfo:
  2667 000056F4 <res 00000001>          ModInfo.OrderLen:   resb 1
  2668 000056F5 <res 00000001>          ModInfo.ReStart:    resb 1
  2669 000056F6 <res 00000080>          ModInfo.Order:	    resb 128
  2670 00005776 <res 00000004>          ModInfo.Patterns:   resd 1
  2671                                  
  2672 0000577A <res 0000003E>          ModInfo.SampOfs:    resw 31
  2673 000057B8 <res 0000003E>          ModInfo.SampSeg:    resw 31
  2674 000057F6 <res 0000003E>          ModInfo.SampLen:    resw 31
  2675 00005834 <res 0000003E>          ModInfo.SampRep:    resw 31
  2676 00005872 <res 0000003E>          ModInfo.SampRepLen: resw 31
  2677 000058B0 <res 0000003E>          ModInfo.SampVol:    resw 31
  2678                                  
  2679                                  ; MODPLAY.ASM
  2680 000058EE <res 000006B2>          PitchTable:	resw 857 ; 23/08/2020
  2681                                  		;resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  2682 00005FA0 <res 00000006>          		resw 3 ; 23/08/2020
  2683 00005FA6 <res 00004100>          VolTable:	resb 16640
  2684 0000A0A6 <res 00001FEC>          MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  2685                                  
  2686                                  ; MODPLAY.ASM
  2687 0000C092 <res 00000001>          OrderPos:	resb 1
  2688 0000C093 <res 00000001>          Tempo:		resb 1
  2689 0000C094 <res 00000001>          TempoWait:	resb 1
  2690 0000C095 <res 00000001>          Bpm:		resb 1
  2691 0000C096 <res 00000001>          Row:		resb 1
  2692 0000C097 <res 00000001>          BreakRow:	resb 1
  2693 0000C098 <res 00000002>          BpmSamples:	resw 1
  2694 0000C09A <res 00000004>          BufPtr:		resd 1
  2695 0000C09E <res 00000002>          BufLen:		resw 1
  2696 0000C0A0 <res 00000004>          BufRep:		resd 1
  2697 0000C0A4 <res 00000004>          Note:		resd 1
  2698                                  ;Tracks:	resb TrackInfo.size*NumTracks
  2699                                  ; 07/10/2017
  2700 0000C0A8 <res 00000130>          Tracks:		resb TrackInfo.size*8
  2701                                  
  2702                                  mod_file_name:
  2703 0000C1D8 <res 00000050>          		resb 80
  2704                                  
  2705                                  ; 24/08/2020
  2706 0000C228 <res 00000001>          counter:	resb 1
  2707                                  
  2708                                  ; 23/08/2020
  2709 0000C229 <res 00000007>          alignb 16
  2710                                  
  2711                                  ; PLAY.ASM
  2712                                  ;Scope:		resw 320
  2713 0000C230 <res 00000200>          RowOfs:		resw 256
  2714                                  
  2715                                  ; 23/10/2017
  2716 0000C430 <res 00000200>          NewScope_L:	resw 256
  2717 0000C630 <res 00000200>          NewScope_R:	resw 256
  2718 0000C830 <res 00000200>          OldScope_L:	resw 256
  2719 0000CA30 <res 00000200>          OldScope_R:	resw 256
  2720                                  
  2721                                  ; 20/10/2017 (modplay7.s, SB16)
  2722                                  ; 19/10/2017 (modplay6.s, AC97)
  2723 0000CC30 <res 00000001>          pan_shift:	resb 1
  2724 0000CC31 <res 00000001>          volume_level:	resb 1
  2725                                  
  2726 0000CC32 <res 000003CE>          alignb 4096
  2727                                  
  2728                                  Audio_Buffer:
  2729 0000D000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  2730                                  ;temp_buffer:
  2731                                  ;		;resb BUFFERSIZE / 4 ; 8192
  2732                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  2733                                  
  2734 00015000 <res 0000B000>          alignb 65536
  2735                                  
  2736                                  DMA_Buffer:
  2737 00020000 <res 00010000>          		resb 2*BUFFERSIZE  ; 65536 ; 09/10/2017 
  2738                                  file_buffer:
  2739 00030000 <res 00060000>          	resb 65536*6
  2740                                  EOF:
