     1                                  ; ****************************************************************************
     2                                  ; tmodply3.s (for TRDOS 386)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; TMODPLY3.PRG ! C'97 (ICH) MOD PLAYER & VGA DEMO program by Erdogan TAN
     5                                  ;
     6                                  ; 28/10/2017
     7                                  ;
     8                                  ; [ Last Modification: 29/10/2017 ]  !!! STEREO MOD PLAYING !!!
     9                                  ;
    10                                  ; Derived from 'tmodplay.s' (TMODPLAY.PRG, SB16) source code by Erdogan Tan
    11                                  ; (27/10/2017). ((Stereo mod playing with TRDOS 386 audio system calls...))
    12                                  ;
    13                                  ; <tmodplay.s> note:
    14                                  ;
    15                                  ; For 640x480x16 display, 'TNYPL211' source code ('EX1A.ASM' and 'EX1B.ASM'
    16                                  ; by Carlos Hasan, 1994) is modified in order to use previous ('modplay7.s')
    17                                  ; scope method as stereo. (Track/channel scope method -in TNYPL211 files- 
    18                                  ; is/was not applied because TRDOS 386 adaption of the tiny mod player uses 
    19                                  ; dma buffer for immediate -synchronized- displaying of sound waves.
    20                                  ; So, stereo wave display -two waves, two scopes- is normally applicable.)
    21                                  ;
    22                                  ; Derived from source code of 'PLAY.EXE' (TINYPLAY) by Carlos Hasan (1993)
    23                                  ;          PLAY.EXE: PLAY.ASM, MODLOAD.ASM, MODPLAY.ASM, SB.ASM
    24                                  ;
    25                                  ; Stereophonic mod playing code prototype: 
    26                                  ;		'modplay6.s' (AC97) by Erdogan Tan (20/10/2017)
    27                                  ;
    28                                  ; Modified by using the source code of 'playmod6.s' ('PLAYMOD6.PRG') 
    29                                  ; by Erdogan Tan (15/10/2017)
    30                                  ;
    31                                  ; Derived from source code of 'TINYPLAY.COM' ('TINYPLAY.ASM')
    32                                  ; by Erdogan Tan (04/03/2017)
    33                                  ; 
    34                                  ; Assembler: NASM 2.11
    35                                  ; ----------------------------------------------------------------------------
    36                                  ;	   nasm  tmodplay.s -l tmodplay.txt -o TMODPLAY.PRG	
    37                                  ; ****************************************************************************
    38                                  ; PLAYMOD.ASM by Erdogan Tan (for MSDOS) (15/02/2017)
    39                                  ; TMODPLAY.ASM by Erdogan Tan (for MSDOS) (01/10/2017)
    40                                  
    41                                  ; 01/03/2017
    42                                  ; 16/10/2016
    43                                  ; 29/04/2016
    44                                  ; TRDOS 386 system calls (temporary list!)
    45                                  _ver 	equ 0
    46                                  _exit 	equ 1
    47                                  _fork 	equ 2
    48                                  _read 	equ 3
    49                                  _write	equ 4
    50                                  _open	equ 5
    51                                  _close 	equ 6
    52                                  _wait 	equ 7
    53                                  _creat 	equ 8
    54                                  _link 	equ 9
    55                                  _unlink	equ 10
    56                                  _exec	equ 11
    57                                  _chdir	equ 12
    58                                  _time 	equ 13
    59                                  _mkdir 	equ 14
    60                                  _chmod	equ 15
    61                                  _chown	equ 16
    62                                  _break	equ 17
    63                                  _stat	equ 18
    64                                  _seek	equ 19
    65                                  _tell 	equ 20
    66                                  _mount	equ 21
    67                                  _umount	equ 22
    68                                  _setuid	equ 23
    69                                  _getuid	equ 24
    70                                  _stime	equ 25
    71                                  _quit	equ 26	
    72                                  _intr	equ 27
    73                                  _fstat	equ 28
    74                                  _emt 	equ 29
    75                                  _mdate 	equ 30
    76                                  _video 	equ 31
    77                                  _audio	equ 32
    78                                  _timer	equ 33
    79                                  _sleep	equ 34
    80                                  _msg    equ 35
    81                                  _geterr	equ 36
    82                                  _fpsave	equ 37
    83                                  _pri	equ 38
    84                                  _rele	equ 39
    85                                  _fff	equ 40
    86                                  _fnf	equ 41
    87                                  _alloc	equ 42
    88                                  _dalloc equ 43
    89                                  _calbac equ 44		
    90                                  
    91                                  %macro sys 1-4
    92                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    93                                      ; 03/09/2015	
    94                                      ; 13/04/2015
    95                                      ; Retro UNIX 386 v1 system call.	
    96                                      %if %0 >= 2   
    97                                          mov ebx, %2
    98                                          %if %0 >= 3    
    99                                              mov ecx, %3
   100                                              %if %0 = 4
   101                                                 mov edx, %4   
   102                                              %endif
   103                                          %endif
   104                                      %endif
   105                                      mov eax, %1
   106                                      ;int 30h
   107                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
   108                                  %endmacro
   109                                  
   110                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
   111                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
   112                                  
   113                                  ; 19/06/2017
   114                                  BUFFERSIZE equ 32768
   115                                  
   116                                  ; ----------------------------------------------------------------------------
   117                                  ; Tiny MOD Player v0.1b by Carlos Hasan.
   118                                  ;	July 14th, 1993.
   119                                  
   120                                  ;=============================================================================
   121                                  ;  
   122                                  ;=============================================================================
   123                                  
   124                                  [BITS 32]
   125                                  [org 0]
   126                                  
   127                                  Start:
   128                                  	; clear bss
   129 00000000 B9[00000900]            	mov	ecx, EOF
   130 00000005 BF[48520000]            	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 E80E020000              	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
   143                              <1> 
   144                              <1> 
   145                              <1> 
   146                              <1> 
   147                              <1>  %if %0 >= 2
   148 0000001A BB[33020000]        <1>  mov ebx, %2
   149                              <1>  %if %0 >= 3
   150 0000001F B9FF000000          <1>  mov ecx, %3
   151                              <1>  %if %0 = 4
   152 00000024 BA0F000000          <1>  mov edx, %4
   153                              <1>  %endif
   154                              <1>  %endif
   155                              <1>  %endif
   156 00000029 B823000000          <1>  mov eax, %1
   157                              <1> 
   158 0000002E CD40                <1>  int 40h
   159 00000030 E9D0010000                      jmp     Exit
   160                                  
   161                                  GetFileName:
   162 00000035 89E6                    	mov	esi, esp
   163 00000037 AD                      	lodsd
   164 00000038 83F802                  	cmp	eax, 2 ; two arguments 
   165                                  		; (program file name & mod file name)
   166 0000003B 0F82CD010000            	jb	pmsg_usage ; nothing to do
   167                                  
   168 00000041 AD                      	lodsd ; program file name address 
   169 00000042 AD                      	lodsd ; mod file name address (file to be read)
   170 00000043 89C6                    	mov	esi, eax
   171 00000045 BF[A0DF0000]            	mov	edi, mod_file_name
   172                                  ScanName:       
   173 0000004A AC                      	lodsb
   174 0000004B 84C0                    	test	al, al
   175 0000004D 0F84BB010000            	je	pmsg_usage
   176 00000053 3C20                    	cmp	al, 20h
   177 00000055 74F3                    	je	short ScanName	; scan start of name.
   178 00000057 AA                      	stosb
   179 00000058 B4FF                    	mov	ah, 0FFh
   180                                  a_0:	
   181 0000005A FEC4                    	inc	ah
   182                                  a_1:
   183 0000005C AC                      	lodsb
   184 0000005D AA                      	stosb
   185 0000005E 3C2E                    	cmp	al, '.'
   186 00000060 74F8                    	je	short a_0	
   187 00000062 20C0                    	and	al, al
   188 00000064 75F6                    	jnz	short a_1
   189                                  
   190 00000066 08E4                    	or	ah, ah		 ; if period NOT found,
   191 00000068 750B                    	jnz	short PrintPMesg ; then add a .MOD extension.
   192                                  SetExt:
   193 0000006A 4F                      	dec	edi
   194 0000006B C7072E4D4F44            	mov	dword [edi], '.MOD'
   195 00000071 C6470400                	mov	byte [edi+4], 0
   196                                  PrintPMesg:      
   197                                  	; Prints the Credits Text.
   198                                  	sys	_msg, Credits, 255, 0Fh
   199                              <1> 
   200                              <1> 
   201                              <1> 
   202                              <1> 
   203                              <1>  %if %0 >= 2
   204 00000075 BB[2E510000]        <1>  mov ebx, %2
   205                              <1>  %if %0 >= 3
   206 0000007A B9FF000000          <1>  mov ecx, %3
   207                              <1>  %if %0 = 4
   208 0000007F BA0F000000          <1>  mov edx, %4
   209                              <1>  %endif
   210                              <1>  %endif
   211                              <1>  %endif
   212 00000084 B823000000          <1>  mov eax, %1
   213                              <1> 
   214 00000089 CD40                <1>  int 40h
   215                                  _1:
   216                                  	; 19/06/2017
   217                                  	; Allocate Audio Buffer (for user)
   218                                  	sys	_audio, 0200h, BUFFERSIZE, Audio_Buffer
   219                              <1> 
   220                              <1> 
   221                              <1> 
   222                              <1> 
   223                              <1>  %if %0 >= 2
   224 0000008B BB00020000          <1>  mov ebx, %2
   225                              <1>  %if %0 >= 3
   226 00000090 B900800000          <1>  mov ecx, %3
   227                              <1>  %if %0 = 4
   228 00000095 BA[00E00000]        <1>  mov edx, %4
   229                              <1>  %endif
   230                              <1>  %endif
   231                              <1>  %endif
   232 0000009A B820000000          <1>  mov eax, %1
   233                              <1> 
   234 0000009F CD40                <1>  int 40h
   235 000000A1 0F8207010000            	jc	error_exit
   236                                  _2:
   237                                  	;; Initialize Audio Device (bl = 1 -> Interrupt method)
   238                                  	;sys	_audio, 0301h, 0, ac97_int_handler 
   239                                  	;jc	error_exit
   240                                  	
   241                                  	; 20/10/2017
   242                                  	; Initialize Audio Device (bl = 0 -> SRB method)
   243                                  	sys	_audio, 0300h, 1, srb 
   244                              <1> 
   245                              <1> 
   246                              <1> 
   247                              <1> 
   248                              <1>  %if %0 >= 2
   249 000000A7 BB00030000          <1>  mov ebx, %2
   250                              <1>  %if %0 >= 3
   251 000000AC B901000000          <1>  mov ecx, %3
   252                              <1>  %if %0 = 4
   253 000000B1 BA[67520000]        <1>  mov edx, %4
   254                              <1>  %endif
   255                              <1>  %endif
   256                              <1>  %endif
   257 000000B6 B820000000          <1>  mov eax, %1
   258                              <1> 
   259 000000BB CD40                <1>  int 40h
   260 000000BD 0F82EB000000            	jc	error_exit
   261                                  
   262                                  LoadMod:  
   263 000000C3 BF[A0DF0000]            	mov	edi, mod_file_name
   264 000000C8 E855020000              	call    LoadModule		; Load the MODule...
   265                                  	; 08/10/2017
   266 000000CD 731B                    	jnc	short _3		; any error loading?
   267                                  
   268                                  	; yes, print error and Exit.
   269                                  
   270                                  	sys	_msg, ErrorMesg, 255, 0Fh
   271                              <1> 
   272                              <1> 
   273                              <1> 
   274                              <1> 
   275                              <1>  %if %0 >= 2
   276 000000CF BB[62510000]        <1>  mov ebx, %2
   277                              <1>  %if %0 >= 3
   278 000000D4 B9FF000000          <1>  mov ecx, %3
   279                              <1>  %if %0 = 4
   280 000000D9 BA0F000000          <1>  mov edx, %4
   281                              <1>  %endif
   282                              <1>  %endif
   283                              <1>  %endif
   284 000000DE B823000000          <1>  mov eax, %1
   285                              <1> 
   286 000000E3 CD40                <1>  int 40h
   287 000000E5 E91B010000              	jmp     Exit
   288                                  _3:
   289                                  	; 10/06/2017
   290                                  	sys	_audio, 0E00h ; get audio controller info
   291                              <1> 
   292                              <1> 
   293                              <1> 
   294                              <1> 
   295                              <1>  %if %0 >= 2
   296 000000EA BB000E0000          <1>  mov ebx, %2
   297                              <1>  %if %0 >= 3
   298                              <1>  mov ecx, %3
   299                              <1>  %if %0 = 4
   300                              <1>  mov edx, %4
   301                              <1>  %endif
   302                              <1>  %endif
   303                              <1>  %endif
   304 000000EF B820000000          <1>  mov eax, %1
   305                              <1> 
   306 000000F4 CD40                <1>  int 40h
   307 000000F6 0F82B2000000            	jc	error_exit
   308                                  
   309                                  	;cmp	ah, 3 ; VT 8233? (VIA AC'97 Audio Controller)
   310                                  	;jne	_dev_not_ready		
   311                                  
   312                                  	; EAX = IRQ Number in AL
   313                                  	;	Audio Device Number in AH 
   314                                  	; EBX = DEV/VENDOR ID
   315                                  	;       (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
   316                                  	; ECX = BUS/DEV/FN 
   317                                  	;       (00000000BBBBBBBBDDDDDFFF00000000)
   318                                  	; EDX = Base IO Addr (DX) for SB16 & VT8233
   319                                  	; EDX = NABMBAR/NAMBAR (for AC97)
   320                                  	;      (Low word, DX = NAMBAR address)
   321                                  
   322 000000FC A2[66520000]            	mov	[ac97_int_ln_reg], al
   323 00000101 891D[58520000]          	mov	[dev_vendor], ebx
   324 00000107 890D[5C520000]          	mov	[bus_dev_fn], ecx
   325 0000010D 668915[64520000]        	mov	[ac97_io_base], dx	
   326                                    
   327 00000114 E8C30A0000              	call	write_audio_dev_info 
   328                                  
   329                                  PlayNow: 
   330 00000119 E8DD090000              	call    StartPlaying
   331                                  
   332                                          ; load 32768 bytes into audio buffer
   333 0000011E BF[00E00000]            	mov	edi, Audio_Buffer
   334                                  	; 19/10/2017
   335                                  	;mov	ebx, BUFFERSIZE
   336 00000123 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   337 00000128 E87C080000              	call	GetSamples
   338 0000012D 727F                    	jc	error_exit
   339                                  
   340                                  ;	;mov	ecx, 128	; Make a lookup table
   341                                  ;	mov	cl, 128
   342                                  ;	xor     ebx, ebx	; for fastest pixel
   343                                  ;	mov     edx, 320*(100-64)	; addressing.
   344                                  ;MakeOfs:        
   345                                  ;	mov     [RowOfs+ebx], dx
   346                                  ;	mov     [RowOfs+ebx+2], dx
   347                                  ;	add     dx, 320
   348                                  ;	add     ebx, 4
   349                                  ;	loop    MakeOfs
   350                                  
   351                                  	; 27/10/2017
   352 0000012F 66B90001                	mov	cx, 256
   353 00000133 31DB                    	xor	ebx, ebx
   354 00000135 BF[A0D50000]            	mov	edi, RowOfs
   355                                  MakeOfs:
   356                                  	; 29/10/2017
   357                                  	;mov	ax, 128
   358                                  	;mul	bx
   359                                  	;mov	al, ah
   360                                  	;mov	ah, 80
   361                                  	;mul	ah
   362 0000013A 89D8                    	mov	eax, ebx
   363 0000013C 66C1E007                	shl	ax, 7 ; * 128
   364 00000140 B050                    	mov	al, 80
   365 00000142 F6E4                    	mul	ah
   366 00000144 66AB                    	stosw
   367 00000146 43                      	inc	ebx
   368 00000147 E2F1                    	loop	MakeOfs
   369                                  	
   370                                  	; 09/10/2017 (2*BUFFERSIZE, 64K)
   371                                  	; 23/06/2017
   372                                  	; Map DMA buffer to user's memory space
   373                                  	sys	_audio, 0D00h, 2*BUFFERSIZE, DMA_Buffer
   374                              <1> 
   375                              <1> 
   376                              <1> 
   377                              <1> 
   378                              <1>  %if %0 >= 2
   379 00000149 BB000D0000          <1>  mov ebx, %2
   380                              <1>  %if %0 >= 3
   381 0000014E B900000100          <1>  mov ecx, %3
   382                              <1>  %if %0 = 4
   383 00000153 BA[00000200]        <1>  mov edx, %4
   384                              <1>  %endif
   385                              <1>  %endif
   386                              <1>  %endif
   387 00000158 B820000000          <1>  mov eax, %1
   388                              <1> 
   389 0000015D CD40                <1>  int 40h
   390                                  	;jc	error_exit
   391                                  
   392                                  	; 24/06/2017
   393                                  	; Set Master Volume Level (BL=0 or 80h)
   394                                  	; 	 	for next playing (BL>=80h)
   395                                  	sys	_audio, 0B80h, 1D1Dh
   396                              <1> 
   397                              <1> 
   398                              <1> 
   399                              <1> 
   400                              <1>  %if %0 >= 2
   401 0000015F BB800B0000          <1>  mov ebx, %2
   402                              <1>  %if %0 >= 3
   403 00000164 B91D1D0000          <1>  mov ecx, %3
   404                              <1>  %if %0 = 4
   405                              <1>  mov edx, %4
   406                              <1>  %endif
   407                              <1>  %endif
   408                              <1>  %endif
   409 00000169 B820000000          <1>  mov eax, %1
   410                              <1> 
   411 0000016E CD40                <1>  int 40h
   412                                  
   413                                  	; 20/10/2017
   414 00000170 C605[F1DF0000]1D        	mov	byte [volume_level], 1Dh
   415                                  
   416                                  	;mov	word [MixSpeed], 22050	; Mixing at 22.050 kHz
   417                                  	
   418                                  	; Start	to play
   419 00000177 A0[A5510000]            	mov	al, [bps]
   420 0000017C C0E804                  	shr	al, 4 ; 8 -> 0, 16 -> 1
   421 0000017F D0E0                    	shl	al, 1 ; 16 -> 2, 8 -> 0
   422 00000181 8A1D[A4510000]          	mov	bl, [stmo]
   423 00000187 FECB                    	dec	bl
   424 00000189 08C3                    	or	bl, al
   425 0000018B 668B0D[A6510000]        	mov	cx, [MixSpeed] ; [Sample_Rate] ; Hz 
   426 00000192 B704                    	mov	bh, 4 ; start to play	
   427                                  	sys	_audio
   428                              <1> 
   429                              <1> 
   430                              <1> 
   431                              <1> 
   432                              <1>  %if %0 >= 2
   433                              <1>  mov ebx, %2
   434                              <1>  %if %0 >= 3
   435                              <1>  mov ecx, %3
   436                              <1>  %if %0 = 4
   437                              <1>  mov edx, %4
   438                              <1>  %endif
   439                              <1>  %endif
   440                              <1>  %endif
   441 00000194 B820000000          <1>  mov eax, %1
   442                              <1> 
   443 00000199 CD40                <1>  int 40h
   444                                      
   445                                  	;; SETUP SIGNAL RESPONSE BYTE
   446                                  	;; 06/03/2017
   447                                  	;mov	bl, [ac97_int_ln_reg] ; IRQ number
   448                                  	;mov	bh, 1 ; Link IRQ to user for Signal Response Byte
   449                                  	;mov	edx, srb  ; Signal Response/Return Byte address  
   450                                  	;mov	ecx, 0FFh ; Signal Response/Return Byte value  
   451                                  	;sys	_calbac
   452                                  	;jc	short error_exit
   453                                  
   454                                  	; DIRECT VGA MEMORY ACCESS
   455                                  	; bl = 0, bh = 5
   456                                  	; Direct access/map to VGA memory (0A0000h)
   457                                  
   458                                  	sys	_video, 0500h
   459                              <1> 
   460                              <1> 
   461                              <1> 
   462                              <1> 
   463                              <1>  %if %0 >= 2
   464 0000019B BB00050000          <1>  mov ebx, %2
   465                              <1>  %if %0 >= 3
   466                              <1>  mov ecx, %3
   467                              <1>  %if %0 = 4
   468                              <1>  mov edx, %4
   469                              <1>  %endif
   470                              <1>  %endif
   471                              <1>  %endif
   472 000001A0 B81F000000          <1>  mov eax, %1
   473                              <1> 
   474 000001A5 CD40                <1>  int 40h
   475 000001A7 3D00000A00              	cmp	eax, 0A0000h
   476 000001AC 7418                    	je	short _a3
   477                                  error_exit:
   478                                  	sys	_msg, trdos386_err_msg, 255, 0Eh
   479                              <1> 
   480                              <1> 
   481                              <1> 
   482                              <1> 
   483                              <1>  %if %0 >= 2
   484 000001AE BB[7F510000]        <1>  mov ebx, %2
   485                              <1>  %if %0 >= 3
   486 000001B3 B9FF000000          <1>  mov ecx, %3
   487                              <1>  %if %0 = 4
   488 000001B8 BA0E000000          <1>  mov edx, %4
   489                              <1>  %endif
   490                              <1>  %endif
   491                              <1>  %endif
   492 000001BD B823000000          <1>  mov eax, %1
   493                              <1> 
   494 000001C2 CD40                <1>  int 40h
   495 000001C4 EB3F                    	jmp	short Exit
   496                                  
   497                                  ; Note: Normally IRQ 0 calls the ModPlay Polling at 18.2Hz thru
   498                                  ;       the software interrupt 1Ch. If the IRQ 0 is disabled, then
   499                                  ;       the INT 1Ch MUST BE CALLED at least MixSpeed/1024 times per
   500                                  ;       second, or the module will sound "looped".
   501                                  ;       Because we need better sync with the ModPlayer to draw the scope,
   502                                  ;       the polling is called from my routine, and then the irq 0 must be
   503                                  ;       disabled. The [DmaBuffer] points to the current buffer of 8-bit
   504                                  ;       samples played by the Sound Blaster. Note that some samples are
   505                                  ;       discarded in the next code, just for fun!
   506                                  
   507                                  _a3:
   508                                  	;mov     ax, 0013h	; Set Mode 320x200x256
   509                                  	;int     31h
   510                                  
   511                                  	; 21/10/2017
   512                                  	;mov	ax, 0012h	; Set Mode 640x480x16
   513                                  	;int	31h
   514                                  
   515                                  	; 22/10/2017
   516 000001C6 E8920B0000              	call	setgraphmode	; Set video mode to 640*480x16
   517                                  
   518                                  	; 22/10/2017
   519                                  	;call	loadlbm
   520                                  	;jc	short loadlbm_err
   521                                  
   522 000001CB BE[8A0F0000]            	mov	esi, LOGO_ADDRESS
   523 000001D0 E87A0C0000              	call	putlbm
   524                                  	;jnc	short loadlbm_ok
   525 000001D5 731F                    	jnc	short _a4 ; 
   526                                  
   527                                  	;mov	byte [error_color], 0Eh ; Yellow
   528                                  
   529                                  loadlbm_err:
   530                                  	; 21/10/2017
   531                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   532                                  	;int	31h
   533                                  	; 22/10/2017
   534 000001D7 E89E0B0000              	call	settextmode
   535                                  
   536                                  	sys	_msg, LOGO_ERROR_MSG, 255, [error_color]
   537                              <1> 
   538                              <1> 
   539                              <1> 
   540                              <1> 
   541                              <1>  %if %0 >= 2
   542 000001DC BB[5D0F0000]        <1>  mov ebx, %2
   543                              <1>  %if %0 >= 3
   544 000001E1 B9FF000000          <1>  mov ecx, %3
   545                              <1>  %if %0 = 4
   546 000001E6 8B15[F5010000]      <1>  mov edx, %4
   547                              <1>  %endif
   548                              <1>  %endif
   549                              <1>  %endif
   550 000001EC B823000000          <1>  mov eax, %1
   551                              <1> 
   552 000001F1 CD40                <1>  int 40h
   553 000001F3 EB10                    	jmp	short Exit
   554                                  
   555                                  	; 21/10/2017
   556                                  error_color:
   557 000001F5 0C                      	db	0Ch  ; Light Red
   558                                  	
   559                                  loadlbm_ok: 
   560                                  	; 21/10/2017
   561                                  _a4:
   562                                  	; 24/06/2017
   563 000001F6 E86F000000              	call	PlayMod ; 13/02/2017 (ModPlay)
   564                                  
   565                                  _s_exit:
   566 000001FB E8AB090000              	call	StopPlaying	; STOP!
   567                                  	
   568                                  	; 22/10/2017
   569                                  	;mov	ax, 0003h	; Set Text Mode 80x25x16
   570                                  	;int	31h
   571 00000200 E8750B0000              	call	settextmode
   572                                  Exit:           
   573                                  	;call	FreeModule	; Free MODule core.
   574                                  	
   575                                  	sys 	_exit	; Bye !
   576                              <1> 
   577                              <1> 
   578                              <1> 
   579                              <1> 
   580                              <1>  %if %0 >= 2
   581                              <1>  mov ebx, %2
   582                              <1>  %if %0 >= 3
   583                              <1>  mov ecx, %3
   584                              <1>  %if %0 = 4
   585                              <1>  mov edx, %4
   586                              <1>  %endif
   587                              <1>  %endif
   588                              <1>  %endif
   589 00000205 B801000000          <1>  mov eax, %1
   590                              <1> 
   591 0000020A CD40                <1>  int 40h
   592                                  here:
   593 0000020C EBFE                    	jmp	short here
   594                                  
   595                                  pmsg_usage:
   596                                  	sys	_msg, msg_usage, 255, 0Fh
   597                              <1> 
   598                              <1> 
   599                              <1> 
   600                              <1> 
   601                              <1>  %if %0 >= 2
   602 0000020E BB[C5500000]        <1>  mov ebx, %2
   603                              <1>  %if %0 >= 3
   604 00000213 B9FF000000          <1>  mov ecx, %3
   605                              <1>  %if %0 = 4
   606 00000218 BA0F000000          <1>  mov edx, %4
   607                              <1>  %endif
   608                              <1>  %endif
   609                              <1>  %endif
   610 0000021D B823000000          <1>  mov eax, %1
   611                              <1> 
   612 00000222 CD40                <1>  int 40h
   613 00000224 EBDF                    	jmp	short Exit
   614                                  
   615                                  DetectVT8233:
   616                                  	; Detect (BH=1) VT8233 (BL=3) Audio Controller
   617                                          sys	_audio, 0103h
   618                              <1> 
   619                              <1> 
   620                              <1> 
   621                              <1> 
   622                              <1>  %if %0 >= 2
   623 00000226 BB03010000          <1>  mov ebx, %2
   624                              <1>  %if %0 >= 3
   625                              <1>  mov ecx, %3
   626                              <1>  %if %0 = 4
   627                              <1>  mov edx, %4
   628                              <1>  %endif
   629                              <1>  %endif
   630                              <1>  %endif
   631 0000022B B820000000          <1>  mov eax, %1
   632                              <1> 
   633 00000230 CD40                <1>  int 40h
   634 00000232 C3                      	retn
   635                                  
   636                                  noDevMsg:
   637 00000233 4572726F723A20556E-     	db "Error: Unable to find VIA VT8233 based audio device!",13,10,0
   638 0000023C 61626C6520746F2066-
   639 00000245 696E64205649412056-
   640 0000024E 543832333320626173-
   641 00000257 656420617564696F20-
   642 00000260 646576696365210D0A-
   643 00000269 00                 
   644                                  
   645                                  ;ac97_int_handler: ; 28/10/2017
   646                                  ;	; 14/10/2017
   647                                  ;	; 09/10/2017
   648                                  ;	; 19/06/2017
   649                                  ;	mov	byte [srb], 1 ; interrupt (or signal response byte)
   650                                  ;
   651                                  ;	;mov	ebx, BUFFERSIZE
   652                                  ;	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   653                                  ;	call	GetSamples
   654                                  ;	jc	error_exit
   655                                  ;
   656                                  ;	sys	_rele ; return from callback service 
   657                                  ;	; we must not come here !
   658                                  ;	sys	_exit
   659                                  
   660                                  ;=============================================================================
   661                                  ;      
   662                                  ;=============================================================================
   663                                  
   664                                  PlayMod:
   665                                  	; 27/10/2017
   666                                  	; 19/10/2017
   667                                  	; 23/06/2017   
   668                                  	; 21/06/2017
   669                                  	; 19/06/2017
   670                                  
   671                                  	; 05/03/2017 (TRDOS 386)
   672                                  	; 14/02/2017
   673                                  	; 13/02/2017
   674                                  	; 08/12/2016
   675                                  	; 28/11/2016
   676                                  
   677 0000026A EB10                         	jmp	short modp_gs ; 23/06/2017
   678                                  p_loop:
   679 0000026C 803D[67520000]00        	cmp	byte [srb], 0
   680 00000273 761C                    	jna	short q_loop
   681 00000275 C605[67520000]00        	mov	byte [srb], 0
   682                                  modp_gs:
   683 0000027C BF[00E00000]            	mov	edi, Audio_Buffer
   684                                  	; 19/10/2017
   685                                  	;mov	ebx, BUFFERSIZE ; 32768 bytes ; 14/03/2017
   686 00000281 BB00200000              	mov	ebx, BUFFERSIZE/4  ; 16 bits, stereo sound buffer
   687 00000286 E81E070000              	call	GetSamples
   688 0000028B 0F821DFFFFFF            	jc	error_exit
   689                                  q_loop:
   690 00000291 B401                    	mov     ah, 1		; any key pressed?
   691 00000293 CD32                    	int     32h		; no, Loop.
   692 00000295 745C                    	jz	short r_loop
   693                                  
   694 00000297 B400                    	mov     ah, 0		; flush key buffer...
   695 00000299 CD32                    	int     32h
   696                                  
   697                                  	; 19/10/2017 (modplay6.s)
   698 0000029B 3C20                    	cmp	al, 20h
   699 0000029D 740E                    	je	short change_pan
   700                                  	; 09/10/2017 (playmod5.s)
   701 0000029F 3C2B                    	cmp	al, '+' ; increase sound volume
   702 000002A1 741D                    	je	short inc_volume_level
   703 000002A3 3C2D                    	cmp	al, '-'
   704 000002A5 743C                    	je	short dec_volume_level
   705                                  
   706                                  	; 19/10/2017 (modplay6.s)
   707 000002A7 24DF                    	and	al, 0DFh
   708 000002A9 3C50                    	cmp	al, 'P'
   709 000002AB 7545                    	jne	short q_return
   710                                  
   711                                  change_pan:
   712                                  	; 19/10/2017 (modplay6.s)
   713 000002AD 8A0D[F0DF0000]          	mov	cl, [pan_shift]
   714 000002B3 FEC1                    	inc	cl
   715 000002B5 80E103                  	and	cl, 3
   716 000002B8 880D[F0DF0000]          	mov	[pan_shift], cl
   717 000002BE EB33                    	jmp	short r_loop
   718                                  
   719                                  	; 09/10/2017 (playmod5.s)
   720                                  	; 24/06/2017 (wavplay2.s)
   721                                  inc_volume_level:
   722 000002C0 8A0D[F1DF0000]          	mov	cl, [volume_level]
   723 000002C6 80F91F                  	cmp	cl, 1Fh ; 31
   724 000002C9 7328                    	jnb	short r_loop
   725 000002CB FEC1                    	inc	cl
   726                                  change_volume_level:
   727 000002CD 880D[F1DF0000]          	mov	[volume_level], cl
   728 000002D3 88CD                    	mov	ch, cl
   729                                  	; Set Master Volume Level
   730                                  	sys	_audio, 0B00h
   731                              <1> 
   732                              <1> 
   733                              <1> 
   734                              <1> 
   735                              <1>  %if %0 >= 2
   736 000002D5 BB000B0000          <1>  mov ebx, %2
   737                              <1>  %if %0 >= 3
   738                              <1>  mov ecx, %3
   739                              <1>  %if %0 = 4
   740                              <1>  mov edx, %4
   741                              <1>  %endif
   742                              <1>  %endif
   743                              <1>  %endif
   744 000002DA B820000000          <1>  mov eax, %1
   745                              <1> 
   746 000002DF CD40                <1>  int 40h
   747 000002E1 EB10                    	jmp	short r_loop
   748                                  dec_volume_level:
   749 000002E3 8A0D[F1DF0000]          	mov	cl, [volume_level]
   750 000002E9 80F901                  	cmp	cl, 1 ; 1
   751 000002EC 7605                    	jna	short r_loop
   752 000002EE FEC9                    	dec	cl
   753 000002F0 EBDB                    	jmp	short change_volume_level
   754                                  
   755                                  q_return:
   756 000002F2 C3                      	retn
   757                                  r_loop:
   758                                  	; 27/10/2017
   759                                  	; Get Current DMA buffer Pointer 
   760                                  	; 23/06/2017 ('modplay6.s')
   761                                  	; bh = 15, get current pointer (DMA buffer offset)
   762                                  	; bl = 0, for PCM OUT
   763                                  	; ecx = 0
   764                                  	;
   765                                  	sys	_audio, 0F00h, 0
   766                              <1> 
   767                              <1> 
   768                              <1> 
   769                              <1> 
   770                              <1>  %if %0 >= 2
   771 000002F3 BB000F0000          <1>  mov ebx, %2
   772                              <1>  %if %0 >= 3
   773 000002F8 B900000000          <1>  mov ecx, %3
   774                              <1>  %if %0 = 4
   775                              <1>  mov edx, %4
   776                              <1>  %endif
   777                              <1>  %endif
   778                              <1>  %endif
   779 000002FD B820000000          <1>  mov eax, %1
   780                              <1> 
   781 00000302 CD40                <1>  int 40h
   782                                  
   783                                  	; 28/10/2017
   784 00000304 24FC                    	and	al, 0FCh  ; dword alignment (stereo, 16 bit)	
   785                                  	; 23/06/2017
   786 00000306 BE[00000200]            	mov     esi, DMA_Buffer
   787 0000030B 01C6                    	add     esi, eax	; add offset value
   788                                  	; 24/06/2017
   789 0000030D B9[00FC0200]            	mov	ecx, DMA_Buffer + (65536 - (256*4))
   790 00000312 39CE                    	cmp	esi, ecx 
   791 00000314 7602                    	jna	short _4
   792 00000316 89CE                    	mov	esi, ecx
   793                                  _4:
   794                                  	; 23/10/2017 ('tmodplay.s')
   795 00000318 E8640A0000              	call	drawscopes
   796                                  
   797 0000031D E94AFFFFFF              	jmp	p_loop
   798                                  
   799                                  ;=============================================================================
   800                                  ;               MODLOAD.ASM
   801                                  ;=============================================================================
   802                                  
   803                                  ; Amiga Module Loader v0.1b by Carlos Hasan.
   804                                  ;	July 10th, 1993.
   805                                  
   806                                  ; STRUCTURES
   807                                  
   808                                  struc ModSample
   809 00000000 <res 00000016>          .msName:	resb 22
   810 00000016 <res 00000002>          .msLength:	resw 1
   811 00000018 <res 00000001>          .msFinetune:	resb 1
   812 00000019 <res 00000001>          .msVolume:	resb 1
   813 0000001A <res 00000002>          .msRepeat:	resw 1
   814 0000001C <res 00000002>          .msRepLen:	resw 1
   815                                  .size:		; 30 bytes
   816                                  endstruc
   817                                  
   818                                  struc ModHeader
   819 00000000 <res 00000014>          .mhName:	resb 20
   820 00000014 <res 000003A2>          .mhSamples:	resb ModSample.size*31
   821 000003B6 <res 00000001>          .mhOrderLen:	resb 1
   822 000003B7 <res 00000001>          .mhReStart:	resb 1
   823 000003B8 <res 00000080>          .mhOrder:	resb 128
   824 00000438 <res 00000004>          .mhSign:	resw 2
   825                                  .size:		; 1084 bytes
   826                                  endstruc
   827                                  
   828                                  struc ModInfoRec
   829 00000000 <res 00000001>          .OrderLen:	resb 1
   830 00000001 <res 00000001>          .ReStart:	resb 1
   831 00000002 <res 00000080>          .Order:		resb 128
   832 00000082 <res 00000004>          .Patterns:	resd 1
   833 00000086 <res 0000003E>          .SampOfs:	resw 31
   834 000000C4 <res 0000003E>          .SampSeg:	resw 31
   835 00000102 <res 0000003E>          .SampLen:	resw 31
   836 00000140 <res 0000003E>          .SampRep:	resw 31
   837 0000017E <res 0000003E>          .SampRepLen:	resw 31
   838 000001BC <res 0000003E>          .SampVol:	resw 31
   839                                  .size:		; 506 bytes	
   840                                  endstruc
   841                                  
   842                                  ; CODE
   843                                  
   844                                  ; modplay5.s
   845                                  ; 07/10/2017
   846                                  ; tinyply3.s
   847                                  ; 06/10/2017
   848                                  ; 04/10/2017
   849                                  ; /* MOD FileFormat */
   850                                  
   851                                  ID_MK	equ 2E4B2E4Dh ; "M.K."
   852                                  ID_FLT4 equ 34544C46h ; "FLT4"
   853                                  ID_8CHN equ 4E484338h ; "8CHN"
   854                                  ID_FLT8 equ 34544C46h ; "FLT8"
   855                                  
   856                                  ; CODE
   857                                  
   858                                  LoadModule:
   859                                  	; edi = file name address
   860                                  
   861 00000322 60                      	pushad
   862                                  
   863 00000323 E878010000              	call    ClearModInfo
   864                                  OpenFile:       
   865                                  	; ebx = ASCIIZ file name address
   866                                  	; ecx = open mode (0 = open for read)	
   867                                  	sys	_open, edi, 0 ; open for reading
   868                              <1> 
   869                              <1> 
   870                              <1> 
   871                              <1> 
   872                              <1>  %if %0 >= 2
   873 00000328 89FB                <1>  mov ebx, %2
   874                              <1>  %if %0 >= 3
   875 0000032A B900000000          <1>  mov ecx, %3
   876                              <1>  %if %0 = 4
   877                              <1>  mov edx, %4
   878                              <1>  %endif
   879                              <1>  %endif
   880                              <1>  %endif
   881 0000032F B805000000          <1>  mov eax, %1
   882                              <1> 
   883 00000334 CD40                <1>  int 40h
   884 00000336 0F8262010000            	jc	Failed
   885 0000033C A3[68520000]            	mov     [FileHandle], eax
   886                                  ReadHeader:
   887                                  	; ebx = File handle
   888                                  	; ecx = Buffer address
   889                                  	; edx = Byte count
   890                                  	sys	_read, [FileHandle], Header, ModHeader.size
   891                              <1> 
   892                              <1> 
   893                              <1> 
   894                              <1> 
   895                              <1>  %if %0 >= 2
   896 00000341 8B1D[68520000]      <1>  mov ebx, %2
   897                              <1>  %if %0 >= 3
   898 00000347 B9[6C520000]        <1>  mov ecx, %3
   899                              <1>  %if %0 = 4
   900 0000034C BA3C040000          <1>  mov edx, %4
   901                              <1>  %endif
   902                              <1>  %endif
   903                              <1>  %endif
   904 00000351 B803000000          <1>  mov eax, %1
   905                              <1> 
   906 00000356 CD40                <1>  int 40h
   907 00000358 0F8231010000            	jc      CloseFile
   908                                  CheckMK:  
   909                                  	; 04/10/2017
   910 0000035E A1[A4560000]            	mov	eax, [Header+ModHeader.mhSign]
   911                                        
   912 00000363 3D4D2E4B2E              	cmp	eax, ID_MK   ; cmp eax, '.K.M'
   913                                  	;je	short Is4chnMod
   914 00000368 742B                    	je	short IsModFile
   915                                  CheckFLT4:
   916 0000036A 3D464C5434              	cmp	eax, ID_FLT4 ; cmp eax, '4TLF'
   917                                  	;je	short Is4chnMod
   918 0000036F 7424                    	je	short IsModFile
   919                                  Check8CHN:
   920 00000371 3D3843484E              	cmp	eax, ID_8CHN ; cmp eax,	'NHC8'
   921 00000376 740D                    	je	short Is8chnMod
   922                                  CheckFLT8:
   923 00000378 3D464C5434              	cmp	eax, ID_FLT8 ; cmp eax, '8TLF'
   924                                  	; 06/10/2017
   925 0000037D 7406                    	je	short Is8chnMod
   926 0000037F F9                      	stc
   927 00000380 E90A010000              	jmp	CloseFile
   928                                  Is8chnMod:
   929 00000385 C605[A0510000]08        	mov	byte [numtracks], 8	; 8-CHANNEL-MOD
   930 0000038C C605[9F510000]0B        	mov	byte [pattern_shift], 11 ; Pattern Size = 2048 bytes
   931 00000393 EB00                    	jmp	short IsModFile
   932                                  ;Is4chnMod:
   933                                  ;	mov	byte [numtracks], 4	; 4-CHANNEL-MOD
   934                                  ;	mov	byte [pattern_shift], 11 ; Pattern Size = 1024 bytes
   935                                  
   936                                  IsModFile:
   937 00000395 A0[22560000]            	mov     al, [Header+ModHeader.mhOrderLen]
   938 0000039A A2[A8560000]            	mov     [ModInfo.OrderLen], al
   939                                  
   940 0000039F A0[23560000]            	mov     al, [Header+ModHeader.mhReStart]
   941 000003A4 3A05[22560000]          	cmp     al, [Header+ModHeader.mhOrderLen]
   942 000003AA 7202                    	jb      short SetReStart
   943 000003AC B07F                    	mov     al, 7Fh
   944                                  SetReStart:
   945 000003AE A2[A9560000]            	mov     [ModInfo.ReStart], al
   946                                  
   947                                  	;mov	ecx, 128
   948 000003B3 66B98000                	mov	cx, 128
   949 000003B7 31D2                    	xor     edx, edx
   950 000003B9 31DB                    	xor     ebx, ebx
   951                                  CopyOrder:
   952 000003BB 8AB3[24560000]          	mov     dh, [Header+ModHeader.mhOrder+ebx]
   953 000003C1 88B3[AA560000]          	mov     [ModInfo.Order+ebx], dh
   954 000003C7 38D6                    	cmp     dh, dl
   955 000003C9 7202                    	jb      short NextOrder
   956 000003CB 88F2                    	mov     dl, dh ; Max. pattern number ; 04/10/2017
   957                                  NextOrder:
   958 000003CD 43                      	inc     ebx
   959 000003CE E2EB                    	loop    CopyOrder
   960                                  AllocPatterns:  
   961 000003D0 81E2FF000000            	and	edx, 0FFh
   962                                  	; 04/10/2017
   963                                  	;inx	dx  ; 12/03/2017
   964 000003D6 FEC2                    	inc	dl
   965                                  	; dl = number of patterns (04/07/2017)
   966 000003D8 8A0D[9F510000]          	mov	cl, [pattern_shift] ; 10 for 4 channels, 11 for 8 channels
   967 000003DE D3E2                    	shl	edx, cl ; 10 ; *1024 ; (byte count of patterns *64*4*4)
   968                                  		     	     ; *2048 ; (byte count of patterns *64*8*4)
   969                                  	;
   970 000003E0 89D5                    	mov	ebp, edx ; offset of samples (04/07/2017)
   971                                  	;mov	ecx, 10000h ; next 64K (4096*16)
   972 000003E2 B9[00000300]            	mov	ecx, file_buffer ; 12/03/2017
   973                                  	;
   974 000003E7 890D[2A570000]          	mov	[ModInfo.Patterns], ecx
   975                                  	;
   976 000003ED 01CD                    	add	ebp, ecx ; next offset for samples
   977                                  ReadPatterns:  
   978                                  	;mov	ebx, [FileHandle] 
   979                                  	; ebx = File handle
   980                                  	; ecx = Buffer address
   981                                  	; edx = Byte count
   982                                  	sys	_read, [FileHandle]
   983                              <1> 
   984                              <1> 
   985                              <1> 
   986                              <1> 
   987                              <1>  %if %0 >= 2
   988 000003EF 8B1D[68520000]      <1>  mov ebx, %2
   989                              <1>  %if %0 >= 3
   990                              <1>  mov ecx, %3
   991                              <1>  %if %0 = 4
   992                              <1>  mov edx, %4
   993                              <1>  %endif
   994                              <1>  %endif
   995                              <1>  %endif
   996 000003F5 B803000000          <1>  mov eax, %1
   997                              <1> 
   998 000003FA CD40                <1>  int 40h
   999 000003FC 0F828D000000            	jc      CloseFile
  1000                                  
  1001                                  	; patterns have been loaded here... (04/07/2017)
  1002                                  
  1003 00000402 BE[80520000]            	mov	esi, Header+ModHeader.mhSamples
  1004 00000407 31FF                    	xor     edi, edi
  1005                                  CopySamples:
  1006 00000409 668B4616                	mov     ax, [esi+ModSample.msLength]
  1007 0000040D 86C4                    	xchg    al, ah
  1008 0000040F 66D1E0                  	shl     ax, 1
  1009 00000412 668987[AA570000]        	mov     [ModInfo.SampLen+edi], ax
  1010 00000419 8A4619                  	mov     al, [esi+ModSample.msVolume]
  1011 0000041C 30E4                    	xor     ah, ah
  1012 0000041E 668987[64580000]        	mov     [ModInfo.SampVol+edi], ax
  1013 00000425 668B461A                	mov     ax, [esi+ModSample.msRepeat]
  1014 00000429 86C4                    	xchg    al, ah
  1015 0000042B 66D1E0                  	shl     ax, 1
  1016 0000042E 668987[E8570000]        	mov     [ModInfo.SampRep+edi], ax
  1017 00000435 668B461C                	mov     ax, [esi+ModSample.msRepLen]
  1018 00000439 86C4                    	xchg    al, ah
  1019 0000043B 66D1E0                  	shl     ax, 1
  1020 0000043E 668987[26580000]        	mov     [ModInfo.SampRepLen+edi], ax
  1021 00000445 83C61E                  	add     esi, ModSample.size
  1022 00000448 6683C702                	add     di, 2
  1023 0000044C 6683FF3E                	cmp     di, 2*31
  1024 00000450 72B7                    	jb      short CopySamples
  1025                                  
  1026 00000452 31F6                    	xor     esi, esi
  1027                                  AllocSamples:
  1028 00000454 0FB796[AA570000]        	movzx	edx, word [ModInfo.SampLen+esi]
  1029                                  	; 07/10/2017
  1030                                  	;shr	dx, 4 ; ***
  1031 0000045B 21D2                    	and	edx, edx
  1032 0000045D 7426                    	jz      short NextSample
  1033                                  	;inc	dx  ; number of paragraphs ; ***
  1034                                  	;shl	dx, 4 ; ***
  1035 0000045F 89E8                    	mov	eax, ebp
  1036 00000461 668986[2E570000]        	mov	[ModInfo.SampOfs+esi], ax
  1037 00000468 C1E810                  	shr	eax, 16
  1038 0000046B 668986[6C570000]        	mov	[ModInfo.SampSeg+esi], ax
  1039 00000472 89E9                    	mov	ecx, ebp
  1040 00000474 01D5                    	add	ebp, edx ; next offset for sample 
  1041                                  ReadSample:
  1042                                  	;mov	ebx, [FileHandle]
  1043                                  	;movzx  edx, [ModInfo.SampLen+esi]
  1044                                  	;mov    ecx, [ModInfo.SampOfs+esi]
  1045                                  
  1046                                  	; ebx = File handle
  1047                                  	; ecx = Buffer address
  1048                                  	; edx = Byte count
  1049                                  	sys	_read, [FileHandle]
  1050                              <1> 
  1051                              <1> 
  1052                              <1> 
  1053                              <1> 
  1054                              <1>  %if %0 >= 2
  1055 00000476 8B1D[68520000]      <1>  mov ebx, %2
  1056                              <1>  %if %0 >= 3
  1057                              <1>  mov ecx, %3
  1058                              <1>  %if %0 = 4
  1059                              <1>  mov edx, %4
  1060                              <1>  %endif
  1061                              <1>  %endif
  1062                              <1>  %endif
  1063 0000047C B803000000          <1>  mov eax, %1
  1064                              <1> 
  1065 00000481 CD40                <1>  int 40h
  1066 00000483 720A                    	jc      short CloseFile
  1067                                  
  1068                                  NextSample:
  1069 00000485 6683C602                	add     si, 2
  1070 00000489 6683FE3E                	cmp     si, 2*31
  1071 0000048D 72C5                    	jb      short AllocSamples
  1072                                  CloseFile:      
  1073 0000048F 9C                      	pushf
  1074                                  	sys	_close, [FileHandle]
  1075                              <1> 
  1076                              <1> 
  1077                              <1> 
  1078                              <1> 
  1079                              <1>  %if %0 >= 2
  1080 00000490 8B1D[68520000]      <1>  mov ebx, %2
  1081                              <1>  %if %0 >= 3
  1082                              <1>  mov ecx, %3
  1083                              <1>  %if %0 = 4
  1084                              <1>  mov edx, %4
  1085                              <1>  %endif
  1086                              <1>  %endif
  1087                              <1>  %endif
  1088 00000496 B806000000          <1>  mov eax, %1
  1089                              <1> 
  1090 0000049B CD40                <1>  int 40h
  1091 0000049D 9D                      	popf
  1092                                  Failed:       
  1093 0000049E 61                      	popad
  1094 0000049F C3                      	retn
  1095                                  
  1096                                  FreeModule:
  1097                                  	; Erdogan Tan (13/02/2017)
  1098                                  	; nothing to do here for memory de-allocation
  1099                                  ClearModInfo:
  1100 000004A0 57                      	push	edi
  1101 000004A1 BF[A8560000]            	mov	edi, ModInfo
  1102 000004A6 B9FA010000              	mov     ecx, ModInfoRec.size
  1103                                  	;cld
  1104 000004AB 30C0                    	xor     al, al
  1105 000004AD F3AA                    	rep     stosb
  1106 000004AF 5F                      	pop	edi
  1107 000004B0 C3                      	retn
  1108                                  
  1109                                  ;=============================================================================
  1110                                  ;               MODPLAY.ASM
  1111                                  ;=============================================================================
  1112                                  
  1113                                  ; Amiga Module Loader v0.3b by Carlos Hasan.
  1114                                  ;	July 23th, 1993.
  1115                                  
  1116                                  ; EQUATES
  1117                                  
  1118                                  ;NumTracks	equ 4 ; 07/10/2017 ([numtracks])
  1119                                  DefTempo        equ 6
  1120                                  DefBpm          equ 125
  1121                                  MidCRate        equ 8448
  1122                                  MixBufSize	equ 4096
  1123                                  ;MixBufSize	equ 7680 ; 17/10/2017 ; ((48000/50)*8)
  1124                                  
  1125                                  ; STRUCTURES
  1126                                  
  1127                                  struc TrackInfo  ; 01/10/2017 (TMODPLAY.ASM) modif. by Erdogan Tan
  1128 00000000 <res 00000004>          .Samples:	resd 1
  1129                                  ;.Position:	resw 1
  1130 00000004 <res 00000004>          .Position:	resd 1 ; 01/10/2017 - TRDOS 386 modification ! 
  1131 00000008 <res 00000002>          .Len:		resw 1
  1132 0000000A <res 00000002>          .Repeat:	resw 1
  1133 0000000C <res 00000002>          .RepLen:	resw 1
  1134 0000000E <res 00000001>          .Volume: 	resb 1 ; Volume
  1135 0000000F <res 00000001>          .VolDiff:	resb 1 ; 01/10/2017 ; Volume difference (Tremolo)
  1136                                  ;.Error:	resb 1
  1137                                  ;.Reserved:	resb 1 ; 01/10/2017
  1138 00000010 <res 00000002>          .Period:	resw 1 ; Period
  1139 00000012 <res 00000002>          .Pitch:		resw 1 
  1140 00000014 <res 00000002>          .Effect:	resw 1 ; Effect
  1141 00000016 <res 00000002>          .PortTo:	resw 1 ; Toneporta wanted period
  1142 00000018 <res 00000001>          .PortParm:	resb 1 ; Toneporta speed
  1143 00000019 <res 00000001>          .VibPos:	resb 1 ; Vibrato wave position 
  1144 0000001A <res 00000001>          .VibParm:	resb 1 ; Vibrato depth/rate
  1145 0000001B <res 00000001>          .TremPos:	resb 1 ; 01/10/2017 ; Tremolo wave position
  1146 0000001C <res 00000001>          .TremParm:	resb 1 ; 01/10/2017 ; Tremolo depth/rate
  1147                                  ;.OldSampOfs:	resb 1 ; ******* ; 01/10/2017
  1148 0000001D <res 00000001>          .Error:		resb 1 ; 01/10/2017
  1149 0000001E <res 00000006>          .Arp:		resw 3
  1150 00000024 <res 00000002>          .ArpIndex:	resw 1
  1151                                  .size:		; 38 bytes ; 01/10/2017 -  TRDOS 386
  1152                                  endstruc
  1153                                  
  1154                                  ; CODE
  1155                                  
  1156                                  ;--------------------------------------------------------------------------
  1157                                  ; updatechannel - update the track using the current effect
  1158                                  ;--------------------------------------------------------------------------
  1159                                  ; 
  1160                                  ;--------------------------------------------------------------------------
  1161                                  ; 	Track:  Process the next 	 in one track.
  1162                                  ;  In:
  1163                                  ;    ds:di -  Track info Address.
  1164                                  ;--------------------------------------------------------------------------
  1165                                  
  1166                                  ; edi = Track info address
  1167                                  
  1168                                  updatechannel:
  1169                                  BeatTrack:	; updatechannel ; 01/10/2017 (TMODPLAY.ASM)
  1170                                  
  1171 000004B1 668B5714                	mov     dx, [edi+TrackInfo.Effect]
  1172                                  
  1173                                  	;test   dx, dx
  1174                                  	;je     short None
  1175                                  	;cmp    dh, 00h
  1176                                  	;je     short Arpeggio
  1177                                  	;cmp    dh, 01h
  1178                                  	;je     short PortUp
  1179                                  	;cmp    dh, 02h
  1180                                  	;je     short PortDown
  1181                                  	;cmp    dh, 03h
  1182                                  	;je     TonePort
  1183                                  	;cmp    dh, 04h
  1184                                  	;je     Vibrato
  1185                                  	;cmp    dh, 05h
  1186                                  	;je     PortSlide
  1187                                  	;cmp    dh, 06h
  1188                                  	;je     VibSlide
  1189                                  	;cmp    dh, 0Ah
  1190                                  	;je     VolSlide
  1191                                  	;retn
  1192                                  
  1193 000004B5 0FB6C6                  	movzx	eax, dh
  1194 000004B8 240F                    	and	al, 0Fh
  1195 000004BA FF2485[BC4F0000]        	jmp	dword [4*eax+efxtable2] ; TRDOS 386 ! (32 bits)
  1196                                  efxnull:
  1197                                  None:           
  1198 000004C1 C3                      	retn
  1199                                  efxarpeggio2:
  1200                                  	; 01/10/2017
  1201 000004C2 84D2                    	test    dl, dl
  1202 000004C4 74FB                    	jz      short efxnull
  1203                                  Arpeggio:
  1204 000004C6 0FB75F24                	movzx   ebx, word [edi+TrackInfo.ArpIndex]
  1205 000004CA 668B441F1E              	mov     ax, [edi+TrackInfo.Arp+ebx]
  1206 000004CF 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1207 000004D3 6683C302                	add     bx, 2
  1208 000004D7 6683FB06                	cmp     bx, 6
  1209 000004DB 7202                    	jb      short SetArpIndex
  1210 000004DD 31DB                    	xor     ebx, ebx
  1211                                  SetArpIndex:
  1212 000004DF 66895F24                	mov     [edi+TrackInfo.ArpIndex], bx
  1213 000004E3 C3                      	retn
  1214                                  efxportaup:
  1215                                  PortUp:
  1216 000004E4 30F6                    	xor     dh, dh
  1217                                  	;mov	bx, [edi+TrackInfo.Period]
  1218 000004E6 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1219 000004EA 6629D3                  	sub     bx, dx
  1220                                  	;cmp	bx, 113
  1221 000004ED 6683FB1C                	cmp	bx, 28 ; 01/10/2017 
  1222 000004F1 7D04                    	jge     short NotSmall
  1223                                  	;mov	bx, 113
  1224 000004F3 66BB1C00                	mov	bx, 28 ; 01/10/2017
  1225                                  NotSmall:
  1226 000004F7 66895F10                	mov     [edi+TrackInfo.Period], bx
  1227 000004FB 6601DB                  	add     bx, bx
  1228                                  	;mov	ax, [PitchTable+bx]
  1229 000004FE 668B83[A2580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1230 00000505 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1231 00000509 C3                      	retn
  1232                                  efxportadown:
  1233                                  PortDown:
  1234 0000050A 30F6                    	xor     dh, dh
  1235                                  	;mov	bx, [edi+TrackInfo.Period]
  1236 0000050C 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1237 00000510 6601D3                  	add     bx, dx
  1238 00000513 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1239                                  	;cmp	bx, 856
  1240 00000518 7E04                    	jle     short NotBig
  1241                                  	;mov	bx, 856
  1242 0000051A 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1243                                  NotBig:         
  1244 0000051E 66895F10                	mov     [edi+TrackInfo.Period], bx
  1245 00000522 6601DB                  	add     bx, bx
  1246                                  	;mov	ax, [PitchTable+bx]
  1247 00000525 668B83[A2580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1248 0000052C 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1249 00000530 C3                      	retn
  1250                                  efxtoneporta2:
  1251                                  TonePort:
  1252 00000531 30F6                    	xor     dh, dh
  1253 00000533 668B4716                	mov     ax, [edi+TrackInfo.PortTo]
  1254                                  	;mov	bx, [edi+TrackInfo.Period]
  1255 00000537 0FB75F10                	movzx	ebx, word [edi+TrackInfo.Period] ; 02/10/2017
  1256 0000053B 6639C3                  	cmp     bx, ax
  1257 0000053E 7429                    	je      short NoPort
  1258 00000540 7F0D                    	jg      short PortToUp
  1259                                  PortToDown:     
  1260 00000542 6601D3                  	add     bx, dx
  1261 00000545 6639C3                  	cmp     bx, ax
  1262 00000548 7E0D                    	jle     short SetPort
  1263                                  FixPort:        
  1264 0000054A 6689C3                  	mov     bx, ax
  1265 0000054D EB08                    	jmp     short SetPort
  1266                                  PortToUp:
  1267 0000054F 6629D3                  	sub     bx, dx
  1268 00000552 6639C3                  	cmp     bx, ax
  1269 00000555 7CF3                    	jl      short FixPort
  1270                                  SetPort:        
  1271 00000557 66895F10                	mov     [edi+TrackInfo.Period], bx
  1272 0000055B 6601DB                  	add     bx, bx
  1273                                  	;mov	ax, [PitchTable+bx]
  1274 0000055E 668B83[A2580000]        	mov	ax, [PitchTable+ebx]  ; 02/10/2017
  1275 00000565 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1276                                  NoPort:         
  1277 00000569 C3                      	retn
  1278                                  efxvibrato2:
  1279                                  	; 01/10/2017
  1280                                  Vibrato:
  1281 0000056A 88D6                    	mov     dh, dl
  1282                                  	;and	dl, 0Fh
  1283                                  	;shr	dh, 4
  1284                                  	;shl	dh, 2
  1285 0000056C 6681E20FF0              	and     dx, 0F00Fh
  1286 00000571 C0EE02                  	shr     dh, 2
  1287                                  	;add	[edi+TrackInfo.VibPos], dh
  1288                                  	;mov	dh, [edi+TrackInfo.VibPos]
  1289                                  	;mov	bl, dh
  1290 00000574 8A5F19                  	mov	bl, [edi+TrackInfo.VibPos]  ; 01/10/2017
  1291 00000577 007719                  	add	[edi+TrackInfo.VibPos], dh
  1292 0000057A 88DE                    	mov	dh, bl ; 01/10/2017
  1293 0000057C C0EB02                  	shr     bl, 2
  1294                                  	;and	bx, 1Fh
  1295                                  	;mov	al, [SinTable+bx]
  1296 0000057F 83E31F                  	and	ebx, 1Fh
  1297 00000582 8A83[A4500000]          	mov	al, [SinTable+ebx]
  1298 00000588 F6E2                    	mul     dl
  1299                                  	;rol	ax, 1
  1300                                  	;xchg	al, ah
  1301                                  	;and	ah, 1
  1302 0000058A 66C1E807                	shr	ax, 7
  1303 0000058E 84F6                    	test    dh, dh
  1304 00000590 7903                    	jns     short VibUp
  1305 00000592 66F7D8                  	neg     ax
  1306                                  VibUp:          
  1307 00000595 66034710                	add     ax, [edi+TrackInfo.Period]
  1308 00000599 6689C3                  	mov	bx, ax
  1309                                  	;movzx	ebx, ax
  1310 0000059C 6683FB71                	cmp     bx, 113
  1311                                  	;cmp	bx, 113
  1312 000005A0 6683FB1C                	cmp	bx, 28  ; 01/10/2017
  1313 000005A4 7D06                    	jge     short NoLoVib
  1314                                  	;mov	bx, 113
  1315 000005A6 66BB1C00                	mov	bx, 28	; 01/10/2017
  1316 000005AA EB0B                    	jmp	short NoHiVib ; 01/10/2017	
  1317                                  NoLoVib:        
  1318 000005AC 6681FB600D              	cmp	bx, 3424 ; 01/10/2017 
  1319                                  	;cmp	bx, 856
  1320 000005B1 7E04                    	jle     short NoHiVib
  1321                                  	;mov	bx, 856
  1322 000005B3 66BB600D                	mov	bx, 3424 ; 01/10/2017
  1323                                  NoHiVib:        
  1324 000005B7 6601DB                  	add     bx, bx
  1325                                  	;mov	ax, [PitchTable+bx]
  1326 000005BA 668B83[A2580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1327 000005C1 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1328 000005C5 C3                      	retn
  1329                                  efxtoneslide:
  1330                                  PortSlide:
  1331 000005C6 E812000000              	call    VolSlide
  1332 000005CB 8A5718                  	mov     dl, [edi+TrackInfo.PortParm]  ; .tonespeed
  1333 000005CE E95EFFFFFF              	jmp     TonePort  ; efxtoneporta2
  1334                                  efxvibslide:
  1335                                  VibSlide:
  1336 000005D3 E805000000              	call    VolSlide
  1337 000005D8 8A571A                  	mov     dl, [edi+TrackInfo.VibParm]
  1338 000005DB EB8D                    	jmp     short Vibrato  ; efxvibrato2
  1339                                  efxvolslide:
  1340                                  VolSlide:
  1341 000005DD 88D6                    	mov     dh, dl
  1342 000005DF 80E20F                  	and     dl, 0Fh
  1343 000005E2 C0EE04                  	shr     dh, 4
  1344 000005E5 8A470E                  	mov     al, [edi+TrackInfo.Volume]
  1345 000005E8 28D0                    	sub     al, dl
  1346 000005EA 7D02                    	jge     short NoLoVol
  1347 000005EC 30C0                    	xor     al, al
  1348                                  NoLoVol:        
  1349 000005EE 00F0                    	add     al, dh
  1350 000005F0 3C40                    	cmp     al, 64
  1351 000005F2 7602                    	jbe     short NoHiVol
  1352 000005F4 B040                    	mov     al, 64
  1353                                  NoHiVol:        
  1354 000005F6 88470E                  	mov     [edi+TrackInfo.Volume], al
  1355 000005F9 C3                      	retn
  1356                                  
  1357                                  efxtremolo2:
  1358                                  	; 01/10/2017 (TMODPLAY.ASM)
  1359                                  Tremolo:
  1360 000005FA 88D6                    	mov     dh, dl
  1361 000005FC 6681E20FF0              	and     dx, 0F00Fh
  1362 00000601 C0EE02                  	shr     dh, 2
  1363 00000604 8A5F1B                  	mov	bl, [edi+TrackInfo.TremPos]
  1364 00000607 00771B                  	add	[edi+TrackInfo.TremPos], dh
  1365 0000060A 88DE                    	mov	dh, bl
  1366 0000060C C0EB02                  	shr     bl, 2
  1367                                  	; 01/10/2017 - TRDOS 386
  1368                                  	;and	bx, 1Fh
  1369 0000060F 83E31F                  	and	ebx, 1Fh 
  1370                                  	;mov	al, [SinTable+bx]
  1371 00000612 8A83[A4500000]          	mov     al, [SinTable+ebx]
  1372 00000618 F6E2                    	mul     dl
  1373 0000061A 66C1E806                	shr	ax, 6
  1374 0000061E 84F6                    	test    dh, dh
  1375 00000620 7D03                    	jge	short Tremolo_1 ; efxtremolof2
  1376 00000622 66F7D8                  	neg     ax
  1377                                  efxtremolof2:
  1378                                  Tremolo_1:      
  1379 00000625 8A670E                  	mov	ah, [edi+TrackInfo.Volume]    
  1380 00000628 00E0                    	add     al, ah
  1381 0000062A 7D02                    	jge     short Tremolo_2 ; efxtremolof3
  1382 0000062C 30C0                    	xor     al, al
  1383                                  efxtremolof3:
  1384                                  Tremolo_2:       
  1385 0000062E 3C40                    	cmp     al, 64 ; 40h
  1386 00000630 7E02                    	jle     short Tremolo_3 ; efxtremolof4
  1387 00000632 B040                    	mov     al, 64 ; 40h
  1388                                  efxtremolof4:
  1389                                  Tremolo_3:       
  1390 00000634 28E0                    	sub	al, ah  ; ****** 
  1391 00000636 88470F                  	mov     [edi+TrackInfo.VolDiff], al
  1392 00000639 C3                      	retn	
  1393                                  
  1394                                  ;--------------------------------------------------------------------------
  1395                                  ; readchannel - read the next note event from the pattern sheet
  1396                                  ;--------------------------------------------------------------------------
  1397                                  ;
  1398                                  ;--------------------------------------------------------------------------
  1399                                  ; GetTrack:   Get the next Note from a pattern.
  1400                                  ;  In:
  1401                                  ;    ds:di -  Track info Address.
  1402                                  ;    es:si -  Pattern Note Address.
  1403                                  ; Out:
  1404                                  ;    es:si -  The Next Pattern Note address.
  1405                                  ;--------------------------------------------------------------------------
  1406                                  
  1407                                  ; esi = Pattern note address
  1408                                  ; edi = Track info address
  1409                                  
  1410                                  readchannel:
  1411                                  GetTrack: 	; readchannel ; 01/10/2017 (TMODPLAY.ASM)
  1412 0000063A 66AD                    	lodsw
  1413 0000063C 86C4                    	xchg    al, ah
  1414 0000063E 88E3                    	mov	bl, ah
  1415 00000640 80E40F                  	and     ah, 0Fh
  1416 00000643 6689C1                  	mov     cx, ax
  1417 00000646 66AD                    	lodsw
  1418 00000648 86C4                    	xchg    al, ah
  1419 0000064A 88E7                    	mov     bh, ah
  1420 0000064C 80E40F                  	and     ah, 0Fh
  1421 0000064F 6689C2                  	mov     dx, ax
  1422 00000652 66895714                	mov     [edi+TrackInfo.Effect], dx
  1423                                  	; 01/10/2017 - TRDOS 386
  1424                                  	;and	bl, 0F0h
  1425 00000656 81E3F0FF0000            	and	ebx, 0FFF0h
  1426 0000065C C0EF04                  	shr     bh, 4
  1427 0000065F 08FB                    	or      bl, bh
  1428 00000661 7446                    	jz      short SetPeriod
  1429                                  SetSample:
  1430 00000663 30FF                    	xor	bh, bh
  1431                                  	;and	ebx, 0FFh
  1432 00000665 FECB                    	dec     bl
  1433 00000667 01DB                    	add     ebx, ebx
  1434 00000669 668B83[64580000]        	mov     ax, [ModInfo.SampVol+ebx]
  1435 00000670 88470E                  	mov     [edi+TrackInfo.Volume], al
  1436 00000673 668B83[2E570000]        	mov     ax, [ModInfo.SampOfs+ebx]
  1437 0000067A 668907                  	mov     [edi+TrackInfo.Samples], ax
  1438 0000067D 668B83[6C570000]        	mov     ax, [ModInfo.SampSeg+ebx]
  1439 00000684 66894702                	mov     [edi+TrackInfo.Samples+2], ax
  1440 00000688 668B83[AA570000]        	mov     ax, [ModInfo.SampLen+ebx]
  1441 0000068F 66894708                	mov     [edi+TrackInfo.Len], ax
  1442 00000693 668B83[E8570000]        	mov     ax, [ModInfo.SampRep+ebx]
  1443 0000069A 6689470A                	mov     [edi+TrackInfo.Repeat], ax
  1444 0000069E 668B83[26580000]        	mov     ax, [ModInfo.SampRepLen+ebx]
  1445 000006A5 6689470C                	mov     [edi+TrackInfo.RepLen], ax
  1446                                  SetPeriod:      
  1447 000006A9 6685C9                  	test    cx, cx
  1448 000006AC 7425                    	jz      short SetEffect
  1449                                  
  1450 000006AE 66894F16                	mov     [edi+TrackInfo.PortTo], cx ; *
  1451                                  	
  1452 000006B2 80FE03                  	cmp     dh, 03h
  1453                                  	;je	short SetEffect
  1454 000006B5 7428                    	je	short efxtoneporta ; 01/10/2017
  1455                                  
  1456 000006B7 66894F10                	mov     [edi+TrackInfo.Period], cx
  1457                                  	;movzx	ebx, cx
  1458 000006BB 6689CB                  	mov     bx, cx
  1459 000006BE 6601DB                  	add     bx, bx
  1460                                  	;mov	ax, [PitchTable+bx]
  1461 000006C1 668B83[A2580000]        	mov	ax, [PitchTable+ebx] ; 01/10/2017
  1462 000006C8 66894712                	mov     [edi+TrackInfo.Pitch], ax
  1463 000006CC C7470400000000          	mov     dword [edi+TrackInfo.Position], 0
  1464                                  SetEffect:
  1465                                  	;test	dx, dx
  1466                                  	;je	short InitNone
  1467                                  	;cmp	dh, 00h
  1468                                  	;je	InitArpeggio
  1469                                  	;cmp	dh, 03h
  1470                                  	;je	short InitTonePort
  1471                                  	;cmp	dh, 04h
  1472                                  	;je	short InitVibrato
  1473                                  	;cmp	dh, 09h
  1474                                  	;je	short SampleOfs
  1475                                  	;cmp	dh, 0Bh
  1476                                  	;je	short PosJump
  1477                                  	;cmp	dh, 0Ch
  1478                                  	;je	short SetVolume
  1479                                  	;cmp	dh, 0Dh
  1480                                  	;je	short Break
  1481                                  	;cmp	dh, 0Fh
  1482                                  	;je	SetSpeed
  1483                                  	;retn
  1484                                  
  1485                                  	; 01/10/2017 (TMODPLAY.ASM)
  1486                                  	
  1487                                  	; dx = [di+TrackInfo.Effect]
  1488                                  	
  1489 000006D3 0FB6C6                  	movzx	eax, dh
  1490 000006D6 240F                    	and	al, 0Fh
  1491 000006D8 FF2485[7C4F0000]        	jmp	dword [4*eax+efxtable] ; TRDOS 386 ! (32 bits)
  1492                                  ;efxnull:
  1493                                  ;InitNone:
  1494                                  ;	retn
  1495                                  efxtoneporta:
  1496                                  	; 01/10/2017
  1497                                  	; cx = period
  1498                                  	;mov	[edi+TrackInfo.PortTo], cx ; *
  1499                                  InitTonePort:
  1500 000006DF 84D2                    	test    dl, dl
  1501 000006E1 7503                    	jnz     short SetPortParm
  1502 000006E3 8A5718                  	mov     dl, [edi+TrackInfo.PortParm] ; .tonespeed
  1503                                  SetPortParm:    
  1504 000006E6 885718                  	mov     [edi+TrackInfo.PortParm], dl
  1505 000006E9 66895714                	mov     [edi+TrackInfo.Effect], dx
  1506 000006ED C3                      	retn
  1507                                  efxvibrato:
  1508                                  InitVibrato:
  1509 000006EE 8A471A                  	mov     al, [edi+TrackInfo.VibParm]
  1510 000006F1 88C4                    	mov     ah, al
  1511                                  	;and	al, 0Fh
  1512                                  	;and	ah, 0F0h
  1513 000006F3 66250FF0                	and	ax, 0F00Fh
  1514 000006F7 F6C20F                  	test    dl, 0Fh
  1515 000006FA 7502                    	jne     short OkDepth
  1516 000006FC 08C2                    	or      dl, al
  1517                                  OkDepth:        
  1518 000006FE F6C2F0                  	test    dl, 0F0h
  1519 00000701 7502                    	jnz     short OkRate
  1520 00000703 08E2                    	or      dl, ah
  1521                                  OkRate:         
  1522 00000705 88571A                  	mov     [edi+TrackInfo.VibParm], dl
  1523 00000708 66895714                	mov     [edi+TrackInfo.Effect], dx
  1524 0000070C 6685C9                  	test    cx, cx
  1525 0000070F 7404                    	jz      short OkPos
  1526 00000711 C6471900                	mov     byte [edi+TrackInfo.VibPos], 0
  1527                                  OkPos:          
  1528 00000715 C3                      	retn
  1529                                  efxsampoffset:
  1530                                  	; 01/10/2017 ; *******
  1531                                  SampleOfs:         
  1532                                  ;	test    dl, dl
  1533                                  ;	jnz     short SetSampleOfs
  1534                                  ;	mov     dl, [edi+TrackInfo.OldSampOfs]
  1535                                  ;SetSampleOfs:
  1536                                  ;	mov     [edi+TrackInfo.OldSampOfs], dl
  1537 00000716 88D6                    	mov     dh, dl
  1538 00000718 81E200FF0000            	and 	edx, 0FF00h ; 05/03/2017
  1539 0000071E 895704                  	mov     [edi+TrackInfo.Position], edx
  1540 00000721 C3                      	retn
  1541                                  efxpattjump:
  1542                                  PosJump:
  1543 00000722 8815[50D40000]          	mov     [OrderPos], dl
  1544 00000728 C605[54D40000]40        	mov     byte [Row], 64
  1545 0000072F C3                      	retn
  1546                                  efxsetvolume:
  1547                                  SetVolume:
  1548 00000730 80FA40                  	cmp     dl, 64
  1549 00000733 7602                    	jbe     short OkVol
  1550 00000735 B240                    	mov     dl, 64
  1551                                  OkVol:
  1552                                  	; 01/10/2017 (TrackInfo.VolDiff, tremolo effect)
  1553 00000737 30F6                    	xor	dh, dh ; reset TrackInfo.VolDiff ; Not necessary !?
  1554                                  	;mov	[edi+TrackInfo.Volume], dl
  1555 00000739 6689570E                	mov	[edi+TrackInfo.Volume], dx 
  1556 0000073D C3                      	retn
  1557                                  efxbreak:
  1558                                  Break:
  1559 0000073E 88D6                    	mov     dh, dl
  1560 00000740 80E20F                  	and     dl, 0Fh
  1561 00000743 C0EE04                  	shr     dh, 4
  1562 00000746 00F6                    	add     dh, dh
  1563 00000748 00F2                    	add     dl, dh
  1564 0000074A C0E602                  	shl     dh, 2
  1565 0000074D 00F2                    	add     dl, dh
  1566 0000074F 8815[55D40000]          	mov     [BreakRow], dl
  1567 00000755 C605[54D40000]40        	mov     byte [Row], 64
  1568 0000075C C3                      	retn
  1569                                  efxsetspeed:
  1570                                  SetSpeed:
  1571 0000075D 84D2                    	test    dl,dl
  1572 0000075F 7432                    	je      Skip
  1573 00000761 80FA1F                  	cmp     dl,31
  1574 00000764 770D                    	ja      short SetBpm
  1575                                  SetTempo:       
  1576 00000766 8815[51D40000]          	mov     [Tempo], dl
  1577 0000076C 8815[52D40000]          	mov     [TempoWait], dl
  1578 00000772 C3                      	retn
  1579                                  SetBpm:
  1580 00000773 8815[53D40000]          	mov     [Bpm], dl
  1581 00000779 B067                    	mov     al, 103
  1582 0000077B F6E2                    	mul     dl
  1583 0000077D 88E3                    	mov     bl, ah
  1584 0000077F 30FF                    	xor     bh, bh
  1585 00000781 66A1[A6510000]          	mov     ax, [MixSpeed]
  1586 00000787 6631D2                  	xor     dx, dx
  1587 0000078A 66F7F3                  	div     bx
  1588 0000078D 66A3[56D40000]          	mov     [BpmSamples], ax
  1589                                  Skip:           
  1590 00000793 C3                      	retn
  1591                                  efxarpeggio:
  1592                                  	; 01/10/2017
  1593 00000794 84D2                    	test    dl, dl
  1594                                  	;je	efxnull
  1595 00000796 74FB                    	je	short Skip
  1596                                  InitArpeggio:
  1597 00000798 88D6                    	mov     dh, dl
  1598 0000079A 80E20F                  	and     dl, 0Fh
  1599 0000079D C0EE04                  	shr     dh, 4
  1600                                  	; 01/10/2017
  1601                                  	;mov	cx, 36
  1602 000007A0 66B95400                	mov	cx, 84 ; 84 notes/periods
  1603 000007A4 31DB                    	xor     ebx, ebx
  1604 000007A6 668B4710                	mov     ax, [edi+TrackInfo.Period]
  1605                                  gt_ScanPeriod:
  1606                                  	;cmp	ax, [PeriodTable+bx]
  1607 000007AA 663B83[FC4F0000]        	cmp	ax, [PeriodTable+ebx]
  1608 000007B1 7306                    	jae     short SetArp
  1609 000007B3 6683C302                	add     bx, 2
  1610 000007B7 E2F1                    	loop    gt_ScanPeriod
  1611                                  SetArp:         
  1612 000007B9 6601D2                  	add     dx, dx
  1613 000007BC 00DE                    	add     dh, bl
  1614 000007BE 00DA                    	add     dl, bl
  1615                                  	; 01/10/2017
  1616                                  	;mov	bx, [PeriodTable+bx]
  1617 000007C0 668B9B[FC4F0000]        	mov	bx, [PeriodTable+ebx]
  1618                                  	;add	bx, bx
  1619 000007C7 01DB                    	add	ebx, ebx
  1620                                  	;mov	ax, [PitchTable+bx]
  1621 000007C9 668B83[A2580000]        	mov	ax, [PitchTable+ebx]
  1622 000007D0 6689471E                	mov     [edi+TrackInfo.Arp], ax
  1623 000007D4 88F3                    	mov     bl, dh
  1624 000007D6 30FF                    	xor     bh, bh
  1625 000007D8 668B9B[FC4F0000]        	mov	bx, [PeriodTable+ebx]
  1626                                  	;add	bx, bx
  1627 000007DF 01DB                    	add	ebx, ebx
  1628                                  	;mov	ax, [PitchTable+bx]
  1629 000007E1 668B83[A2580000]        	mov	ax, [PitchTable+ebx]
  1630 000007E8 66894720                	mov     [edi+TrackInfo.Arp+2], ax
  1631 000007EC 88D3                    	mov     bl, dl
  1632 000007EE 30FF                    	xor     bh, bh
  1633 000007F0 668B9B[FC4F0000]        	mov	bx, [PeriodTable+ebx]
  1634                                  	;add	bx, bx
  1635 000007F7 01DB                    	add	ebx, ebx
  1636                                  	;mov	ax, [PitchTable+bx]
  1637 000007F9 668B83[A2580000]        	mov	ax, [PitchTable+ebx]
  1638 00000800 66894722                	mov     [edi+TrackInfo.Arp+4], ax
  1639 00000804 66C747240000            	mov     word [edi+TrackInfo.ArpIndex], 0
  1640 0000080A C3                      	retn
  1641                                  
  1642                                  efxtremolo:
  1643                                  	; 01/10/2017 (TMODPLAY.ASM)
  1644                                  InitTremolo:
  1645 0000080B 8A471C                  	mov     al, [edi+TrackInfo.TremParm]
  1646 0000080E 88C4                    	mov     ah, al
  1647 00000810 66250FF0                	and     ax, 0F00Fh
  1648 00000814 F6C20F                  	test    dl, 0Fh
  1649 00000817 7502                    	jnz     short InitTremolo_1 ; efxtremolof0
  1650 00000819 08C2                    	or      dl, al
  1651                                  efxtremolof0:
  1652                                  InitTremolo_1: 
  1653 0000081B F6C2F0                  	test    dl, 0F0h
  1654 0000081E 7502                    	jnz     short InitTremolo_2 ; efxtremolof1
  1655 00000820 08E2                    	or      dl, ah
  1656                                  efxtremolof1:
  1657                                  InitTremolo_2:
  1658 00000822 88571C                  	mov     [edi+TrackInfo.TremParm], dl
  1659 00000825 66895714                	mov     [edi+TrackInfo.Effect], dx
  1660 00000829 C3                      	retn
  1661                                  
  1662                                  ;--------------------------------------------------------------------------
  1663                                  ; pollmodule - polls the module player
  1664                                  ;--------------------------------------------------------------------------
  1665                                  ;--------------------------------------------------------------------------
  1666                                  ; UpdateTracks:  Main code to process the next tick to be played.
  1667                                  ;--------------------------------------------------------------------------
  1668                                  
  1669                                  pollmodule:
  1670                                  UpdateTracks:	; polmodule ; 01/10/2017 (TMODPLAY.ASM)
  1671 0000082A FE0D[52D40000]          	dec     byte [TempoWait]
  1672 00000830 7417                    	jz      short GetTracks
  1673                                  
  1674                                  	;mov	ecx, NumTracks
  1675 00000832 0FB70D[A0510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1676 00000839 BF[66D40000]            	mov	edi, Tracks
  1677                                  BeatTracks:
  1678 0000083E E86EFCFFFF              	call	BeatTrack	
  1679 00000843 83C726                  	add	edi, TrackInfo.size
  1680 00000846 E2F6                    	loop	BeatTracks
  1681 00000848 C3                      	retn
  1682                                  GetTracks:
  1683 00000849 A0[51D40000]            	mov     al, [Tempo]
  1684 0000084E A2[52D40000]            	mov     [TempoWait], al
  1685                                  
  1686 00000853 8B35[62D40000]          	mov	esi, [Note]
  1687 00000859 803D[54D40000]40        	cmp     byte [Row], 64
  1688 00000860 7268                    	jb      short NoPattWrap
  1689                                  
  1690 00000862 8B35[2A570000]          	mov	esi, [ModInfo.Patterns]
  1691 00000868 8A1D[50D40000]          	mov     bl, [OrderPos]
  1692 0000086E 3A1D[A8560000]          	cmp     bl, [ModInfo.OrderLen]
  1693 00000874 7214                    	jb      short NoOrderWrap
  1694 00000876 8A1D[A9560000]          	mov     bl, [ModInfo.ReStart]
  1695 0000087C 881D[50D40000]          	mov     [OrderPos], bl
  1696 00000882 3A1D[A8560000]          	cmp     bl, [ModInfo.OrderLen]
  1697 00000888 7364                    	jae     short NoUpdate
  1698                                  NoOrderWrap:    
  1699                                  	;xor	bh, bh
  1700 0000088A 81E3FF000000            	and	ebx, 0FFh
  1701 00000890 8A9B[AA560000]          	mov     bl, [ModInfo.Order+ebx]
  1702                                  	; 05/10/2017
  1703                                  	;shl	ebx, 10 ; *1024
  1704 00000896 8A0D[9F510000]          	mov	cl, [pattern_shift] ; 10 or 11
  1705 0000089C D3E3                    	shl	ebx, cl ; *1024 or *2048
  1706                                  	;
  1707 0000089E 01DE                    	add     esi, ebx
  1708 000008A0 8A1D[55D40000]          	mov     bl, [BreakRow]
  1709 000008A6 881D[54D40000]          	mov     [Row], bl
  1710                                  	;xor	bh, bh
  1711 000008AC 81E3FF000000            	and	ebx, 0FFh
  1712 000008B2 883D[55D40000]          	mov     [BreakRow], bh ; 0
  1713 000008B8 66C1E304                	shl     bx, 4
  1714 000008BC 01DE                    	add     esi, ebx
  1715 000008BE 8935[62D40000]          	mov     [Note], esi
  1716 000008C4 FE05[50D40000]          	inc     byte [OrderPos]
  1717                                  NoPattWrap:     
  1718 000008CA FE05[54D40000]          	inc     byte [Row]
  1719                                  
  1720                                  	;cld
  1721                                  	;mov	ecx, NumTracks
  1722 000008D0 0FB70D[A0510000]        	movzx	ecx, word [numtracks] ; 06/10/2017
  1723 000008D7 BF[66D40000]            	mov	edi, Tracks
  1724                                  GetTracks_next:
  1725 000008DC 51                      	push	ecx	
  1726 000008DD E858FDFFFF              	call	GetTrack ; readchannel
  1727 000008E2 59                      	pop	ecx
  1728 000008E3 83C726                  	add	edi, TrackInfo.size
  1729 000008E6 E2F4                    	loop	GetTracks_next
  1730                                  
  1731 000008E8 8935[62D40000]          	mov     [Note], esi
  1732                                  NoUpdate:
  1733 000008EE C3                      	retn
  1734                                  
  1735                                  ;--------------------------------------------------------------------------
  1736                                  ; MixTrack:  Mixes one track into a CLEAN buffer.
  1737                                  ;  In:
  1738                                  ;   ds:si -  Track Info Address.
  1739                                  ;   ds:di -  Buffer Address.
  1740                                  ;    cx   -  Buffer Size.
  1741                                  ;--------------------------------------------------------------------------
  1742                                  
  1743                                  ; esi = Track info address
  1744                                  ; edi = Buffer address
  1745                                  ; ecx = Buffer size
  1746                                  
  1747                                  MixTrack:
  1748 000008EF 66837E0C02              	cmp     word [esi+TrackInfo.RepLen], 2
  1749 000008F4 7757                    	ja      short MixLooped
  1750                                  MixNonLooped:   
  1751 000008F6 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1752 000008F8 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1753 000008FB 0FB76E08                	movzx   ebp, word [esi+TrackInfo.Len]
  1754 000008FF 52                      	push    edx
  1755 00000900 56                      	push    esi
  1756 00000901 01D3                    	add     ebx, edx
  1757 00000903 01D5                    	add     ebp, edx
  1758 00000905 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1759                                  	; 01/10/2017
  1760                                  	;mov	al, [esi+TrackInfo.Volume]
  1761 00000909 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1762                                  	; ah = [esi+TrackInfo.VolDiff]
  1763 0000090D 00E0                    	add	al, ah ; ****** 
  1764 0000090F C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1765 00000913 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1766 00000916 89DE                    	mov     esi, ebx
  1767 00000918 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1768 0000091A 88C7                    	mov     bh, al
  1769 0000091C 88D0                    	mov     al, dl
  1770 0000091E 88F2                    	mov     dl, dh
  1771                                  	;xor	dh, dh
  1772 00000920 81E2FF000000            	and	edx, 0FFh
  1773                                  nlMixSamp:      
  1774 00000926 39EE                    	cmp     esi, ebp
  1775 00000928 7316                    	jae     short nlMixBye
  1776 0000092A 8A1E                    	mov     bl, [esi]
  1777                                  	;mov	bl, [VolTable+bx]
  1778 0000092C 8A9B[64730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *	
  1779                                  	; 17/10/2017
  1780 00000932 001F                    	add     [edi], bl
  1781                                  	; 18/10/2017
  1782 00000934 00C4                    	add     ah, al
  1783 00000936 11D6                    	adc     esi, edx
  1784 00000938 033D[A0510000]          	add	edi, [numtracks]
  1785 0000093E E2E6                    	loop    nlMixSamp
  1786                                  nlMixBye:       
  1787 00000940 89F3                    	mov     ebx, esi
  1788 00000942 5E                      	pop     esi
  1789 00000943 5A                      	pop     edx
  1790 00000944 29D3                    	sub     ebx, edx
  1791 00000946 895E04                  	mov     [esi+TrackInfo.Position], ebx
  1792 00000949 88661D                  	mov     [esi+TrackInfo.Error], ah
  1793 0000094C C3                      	retn
  1794                                  MixLooped:
  1795 0000094D 8B16                    	mov	edx, [esi+TrackInfo.Samples]
  1796 0000094F 8B5E04                  	mov	ebx, [esi+TrackInfo.Position]
  1797 00000952 0FB76E0C                	movzx	ebp, word [esi+TrackInfo.RepLen]
  1798 00000956 892D[5ED40000]          	mov     [BufRep], ebp
  1799                                  	;add	ebp, [esi+TrackInfo.Repeat] ; BUG !
  1800 0000095C 66036E0A                	add     bp, [esi+TrackInfo.Repeat] ; 07/10/2017 (BUGfix!)
  1801 00000960 52                      	push    edx
  1802 00000961 56                      	push    esi
  1803 00000962 01D3                    	add     ebx, edx
  1804 00000964 01D5                    	add     ebp, edx
  1805 00000966 668B5612                	mov     dx, [esi+TrackInfo.Pitch]
  1806                                  	; 01/10/2017
  1807                                  	;mov	al, [esi+TrackInfo.Volume]
  1808 0000096A 668B460E                	mov	ax, [esi+TrackInfo.Volume]
  1809                                  	; ah = [esi+TrackInfo.VolDiff]
  1810 0000096E 00E0                    	add	al, ah ; ****** 
  1811 00000970 C6460F00                	mov	byte [esi+TrackInfo.VolDiff], 0
  1812 00000974 8A661D                  	mov     ah, [esi+TrackInfo.Error]
  1813                                  	;mov	si, bx
  1814 00000977 89DE                    	mov	esi, ebx ; 04/09/2017
  1815 00000979 31DB                    	xor	ebx, ebx ; 01/10/2017 ; *
  1816 0000097B 88C7                    	mov     bh, al
  1817 0000097D 88D0                    	mov     al, dl
  1818 0000097F 88F2                    	mov     dl, dh
  1819                                  	;xor	dh, dh
  1820 00000981 81E2FF000000            	and	edx, 0FFh
  1821                                  lpMixSamp:      
  1822 00000987 39EE                    	cmp     esi, ebp
  1823 00000989 7206                    	jb      short lpMixNow
  1824 0000098B 2B35[5ED40000]          	sub     esi, [BufRep]
  1825                                  lpMixNow:       
  1826 00000991 8A1E                    	mov     bl, [esi]
  1827                                  	;mov	bl, [VolTable+bx]
  1828 00000993 8A9B[64730000]          	mov	bl, [VolTable+ebx] ; 01/10/2017 ; *
  1829                                  	; 17/10/2017
  1830 00000999 001F                    	add     [edi], bl
  1831                                  	; 18/10/2017
  1832 0000099B 00C4                    	add     ah, al
  1833 0000099D 11D6                    	adc     esi, edx
  1834 0000099F 033D[A0510000]          	add	edi, [numtracks]
  1835 000009A5 E2E0                    	loop    lpMixSamp
  1836                                  lpMixBye:       
  1837                                  ;	mov     ebx, esi
  1838                                  ;	pop     esi
  1839                                  ;	pop     edx
  1840                                  ;	sub     ebx, edx
  1841                                  ;	mov     [esi+TrackInfo.Position], ebx
  1842                                  ;	mov     [esi+TrackInfo.Error], ah
  1843                                  ;	retn
  1844 000009A7 EB97                    	jmp	short nlMixBye
  1845                                  
  1846                                  ;--------------------------------------------------------------------------
  1847                                  ; mixpoll - updates the output buffer
  1848                                  ;--------------------------------------------------------------------------
  1849                                  ;
  1850                                  ;--------------------------------------------------------------------------
  1851                                  ; GetSamples:  Returns the next chunk of samples to be played.
  1852                                  ;  In:
  1853                                  ;    Buffer  - Buffer Address.
  1854                                  ;    Count   - Buffer Size.
  1855                                  ;--------------------------------------------------------------------------
  1856                                  
  1857                                  mixpoll:
  1858                                  GetSamples:	; mixpoll ; 01/10/2017 (TMODPLAY.ASM)
  1859                                  	; edi = buffer address
  1860                                  	; ebx = count
  1861                                  
  1862 000009A9 60                      	pushad
  1863                                  
  1864                                  	;cld
  1865                                  NextChunk:      
  1866 000009AA 66833D[5CD40000]00      	cmp     word [BufLen], 0
  1867 000009B2 756B                    	jne     short CopyChunk
  1868                                  
  1869 000009B4 53                      	push    ebx
  1870 000009B5 57                      	push    edi
  1871                                  MixChunk:       
  1872 000009B6 BF[64B40000]            	mov	edi, MixBuffer
  1873                                  
  1874                                  	; 17/10/2017
  1875 000009BB 0FB70D[56D40000]        	movzx	ecx, word [BpmSamples]
  1876                                  	;mov	cx, [BpmSamples]
  1877 000009C2 893D[58D40000]          	mov     [BufPtr], edi
  1878 000009C8 66890D[5CD40000]        	mov	[BufLen], cx
  1879                                  
  1880 000009CF 803D[A0510000]04        	cmp	byte [numtracks], 4
  1881 000009D6 7603                    	jna	short ch_silence
  1882 000009D8 66D1E1                  	shl	cx, 1 
  1883                                  ch_silence:
  1884 000009DB B880808080              	mov	eax, 80808080h
  1885 000009E0 F3AB                    	rep	stosd
  1886                                  
  1887                                  	;mov	cx, NumTracks
  1888                                  	;mov	cl, NumTracks ; 01/10/2017
  1889 000009E2 8A0D[A0510000]          	mov	cl, [numtracks] ; 06/10/2017
  1890 000009E8 BE[40D40000]            	mov	esi, Tracks - TrackInfo.size
  1891                                  GetSamples_next:
  1892 000009ED 51                      	push	ecx
  1893 000009EE 83C626                  	add	esi, TrackInfo.size
  1894 000009F1 668B0D[5CD40000]        	mov	cx, [BufLen]
  1895 000009F8 8B3D[58D40000]          	mov	edi, [BufPtr]
  1896 000009FE E8ECFEFFFF              	call	MixTrack
  1897 00000A03 59                      	pop	ecx
  1898 00000A04 FF05[58D40000]          	inc	dword [BufPtr] ; 18/10/2017
  1899 00000A0A E2E1                    	loop	GetSamples_next
  1900                                  
  1901                                   	; 18/10/2017	
  1902 00000A0C 8B1D[A0510000]          	mov	ebx, [numtracks]
  1903 00000A12 291D[58D40000]          	sub	dword [BufPtr], ebx
  1904                                  
  1905 00000A18 E80DFEFFFF              	call    UpdateTracks
  1906                                  
  1907 00000A1D 5F                      	pop     edi
  1908 00000A1E 5B                      	pop     ebx
  1909                                  CopyChunk:      
  1910                                  	;mov	cx, [BufLen]
  1911 00000A1F 0FB70D[5CD40000]        	movzx	ecx, word [BufLen]
  1912 00000A26 39D9                    	cmp	ecx, ebx
  1913                                  	;cmp	cx, bx
  1914 00000A28 7602                    	jbe     short MoveChunk
  1915                                  	;mov	cx, bx
  1916 00000A2A 89D9                    	mov     ecx, ebx
  1917                                  MoveChunk:
  1918 00000A2C 8B35[58D40000]          	mov     esi, [BufPtr]
  1919 00000A32 010D[58D40000]          	add     [BufPtr], ecx
  1920 00000A38 66290D[5CD40000]        	sub     [BufLen], cx
  1921 00000A3F 29CB                    	sub     ebx, ecx
  1922                                  	; 17/10/2017 ; STEREO MIXING
  1923                                  	;rep	movsb
  1924                                  	; 18/10/2017
  1925 00000A41 803D[A0510000]04        	cmp	byte [numtracks], 4
  1926                                  	;jna	short _4_channels_mix
  1927 00000A48 762F                    	jna	_4_channels_mix
  1928                                  	
  1929                                  _8_channels_mix:
  1930                                  	; 18/10/2017
  1931 00000A4A AD                      	lodsd 
  1932 00000A4B 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1933 00000A4D C1EA10                  	shr	edx, 16 ; ch3 (dl), ch4 (dh)
  1934 00000A50 00C6                    	add	dh, al ; ch1 + ch4
  1935 00000A52 00E2                    	add	dl, ah ; ch2 + ch3
  1936                                  
  1937 00000A54 AD                      	lodsd
  1938 00000A55 00C6                    	add	dh, al ; ch1 + ch4 + ch5
  1939 00000A57 00E2                    	add	dl, ah ; ch2 + ch3 + ch6
  1940 00000A59 C1E810                  	shr	eax, 16 ; ch7 (al), ch8 (ah)
  1941                                  	; 19/10/2017
  1942 00000A5C 00E6                    	add	dh, ah ; ch1 + ch4 + ch5 + ch8
  1943 00000A5E 00C2                    	add	dl, al ; ch2 + ch3 + ch6 + ch7
  1944                                  
  1945                                  	; L = ch1 + ch4 + ch5 + ch8
  1946                                  	; R = ch2 + ch3 + ch6 + ch7
  1947                                  
  1948 00000A60 6681C28080              	add	dx, 8080h
  1949                                  
  1950                                  	; 19/10/2017
  1951 00000A65 88F4                    	mov	ah, dh
  1952 00000A67 80EC80                  	sub	ah, 80h
  1953 00000A6A 30C0                    	xor	al, al
  1954 00000A6C 66AB                    	stosw ; Left Channel
  1955 00000A6E 88D4                    	mov	ah, dl
  1956 00000A70 80EC80                  	sub	ah, 80h
  1957 00000A73 66AB                    	stosw ; Right Channel
  1958                                  
  1959 00000A75 E2D3                    	loop	_8_channels_mix
  1960                                  	
  1961 00000A77 EB21                    	jmp	short channel_mix_ok
  1962                                  	
  1963                                  _4_channels_mix:
  1964                                  	; 18/10/2017
  1965 00000A79 AD                      	lodsd 
  1966 00000A7A 89C2                    	mov	edx, eax ; ch1 (al), ch2 (ah)
  1967                                  	; 19/10/2017
  1968 00000A7C C1E810                  	shr	eax, 16 ; ch3 (al), ch4 (ah)
  1969 00000A7F 00E2                    	add	dl, ah ; ch1 + ch4
  1970 00000A81 00C6                    	add	dh, al ; ch2 + ch3
  1971                                  
  1972                                  	; L = ch1 + ch4
  1973                                  	; R = ch2 + ch3
  1974                                  
  1975                                  	; 19/10/2017
  1976 00000A83 6681C28080              	add	dx, 8080h
  1977                                  
  1978                                  	; 19/10/2017
  1979 00000A88 88D4                    	mov	ah, dl
  1980 00000A8A 80EC80                  	sub	ah, 80h
  1981 00000A8D 30C0                    	xor	al, al
  1982 00000A8F 66AB                    	stosw ; Left Channel
  1983 00000A91 88F4                    	mov	ah, dh
  1984 00000A93 80EC80                  	sub	ah, 80h
  1985 00000A96 66AB                    	stosw ; Right Channel
  1986                                  	
  1987 00000A98 E2DF                    	loop	_4_channels_mix
  1988                                  
  1989                                  channel_mix_ok:
  1990 00000A9A 85DB                    	test    ebx, ebx
  1991                                  	;jnz	short NextChunk
  1992 00000A9C 0F8508FFFFFF            	jnz	NextChunk ; 17/10/2017
  1993                                  
  1994                                  	; 20/10/2017
  1995                                  	; 19/10/2017
  1996                                  	; Pan Control
  1997 00000AA2 8A0D[F0DF0000]          	mov	cl, [pan_shift]
  1998 00000AA8 08C9                    	or	cl, cl
  1999 00000AAA 744D                    	jz	short c_smpl_2
  2000                                  
  2001                                  	; 20/10/2017
  2002 00000AAC BB00200000              	mov	ebx, BUFFERSIZE/4 ; 8192
  2003 00000AB1 BF[00E00000]            	mov	edi, Audio_Buffer
  2004                                  
  2005 00000AB6 B508                    	mov	ch, 8
  2006 00000AB8 D2E5                    	shl	ch, cl
  2007                                  c_smpl_1:
  2008 00000ABA 8B17                    	mov	edx, [edi]
  2009 00000ABC 6689D0                  	mov	ax, dx
  2010 00000ABF 80FC80                  	cmp	ah, 80h
  2011 00000AC2 7208                    	jb	short _cs1	
  2012 00000AC4 00EC                    	add	ah, ch
  2013 00000AC6 730A                    	jnc	short _cs2
  2014 00000AC8 B4FF                    	mov	ah, 255
  2015 00000ACA EB06                    	jmp	short _cs2
  2016                                  _cs1:
  2017 00000ACC 28EC                    	sub	ah, ch
  2018 00000ACE 7302                    	jnc	short _cs2
  2019 00000AD0 B400                    	mov	ah, 0
  2020                                  _cs2:
  2021 00000AD2 C1CA10                  	ror	edx, 16 ; dx = [edi+2]
  2022 00000AD5 00F4                    	add	ah, dh
  2023 00000AD7 6692                    	xchg	dx, ax ; xchg [edi+2], ax
  2024 00000AD9 80FC80                  	cmp	ah, 80h
  2025 00000ADC 7208                    	jb	short _cs3	
  2026 00000ADE 00EC                    	add	ah, ch
  2027 00000AE0 730A                    	jnc	short _cs4
  2028 00000AE2 B4FF                    	mov	ah, 255
  2029 00000AE4 EB06                    	jmp	short _cs4
  2030                                  _cs3:
  2031 00000AE6 28EC                    	sub	ah, ch
  2032 00000AE8 7302                    	jnc	short _cs4
  2033 00000AEA B400                    	mov	ah, 0
  2034                                  _cs4:
  2035 00000AEC C1CA10                  	ror	edx, 16 ; dx = [edi]
  2036 00000AEF 00E6                    	add	dh, ah
  2037 00000AF1 8917                    	mov	[edi], edx
  2038                                  _cs5:
  2039                                  	; 20/10/2017
  2040 00000AF3 83C704                  	add	edi, 4
  2041 00000AF6 4B                      	dec	ebx
  2042 00000AF7 75C1                    	jnz	short c_smpl_1	
  2043                                  c_smpl_2:
  2044 00000AF9 61                      	popad	
  2045 00000AFA C3                      	retn
  2046                                  
  2047                                  ;--------------------------------------------------------------------------
  2048                                  ; StartPlaying: Initializes the Sound System.
  2049                                  ;  In:
  2050                                  ;   Module Information Resources.
  2051                                  ;--------------------------------------------------------------------------
  2052                                  
  2053                                  StartPlaying:
  2054 00000AFB 60                      	pushad
  2055                                  SetModParms:    
  2056 00000AFC C605[50D40000]00        	mov     byte [OrderPos], 0
  2057 00000B03 C605[51D40000]06        	mov     byte [Tempo], DefTempo
  2058 00000B0A C605[52D40000]06        	mov     byte [TempoWait], DefTempo
  2059 00000B11 C605[53D40000]7D        	mov     byte [Bpm], DefBpm
  2060 00000B18 C605[54D40000]40        	mov     byte [Row], 64
  2061 00000B1F C605[55D40000]00        	mov     byte [BreakRow], 0
  2062 00000B26 66A1[A6510000]          	mov     ax, [MixSpeed]
  2063 00000B2C 31D2                    	xor     edx, edx
  2064 00000B2E 66BB3200                	mov     bx, 24*DefBpm/60
  2065 00000B32 66F7F3                  	div     bx
  2066 00000B35 66A3[56D40000]          	mov     [BpmSamples], ax
  2067                                  ClearTracks:    
  2068 00000B3B BF[66D40000]            	mov     edi, Tracks
  2069                                  	; 07/10/2017
  2070                                  	;mov	ecx, NumTracks*TrackInfo.size
  2071 00000B40 B826000000              	mov	eax, TrackInfo.size
  2072 00000B45 0FB70D[A0510000]        	movzx	ecx, word [numtracks]
  2073 00000B4C F7E1                    	mul	ecx
  2074 00000B4E 89C1                    	mov	ecx, eax
  2075 00000B50 31C0                    	xor     eax, eax
  2076                                  	;cld
  2077 00000B52 F3AA                    	rep     stosb
  2078                                  
  2079 00000B54 A3[58D40000]            	mov     [BufPtr], eax
  2080 00000B59 66A3[5CD40000]          	mov     [BufLen], ax
  2081                                  MakePitch:
  2082 00000B5F 66B80021                	mov     ax, MidCRate
  2083 00000B63 66BBAC01                	mov     bx, 428
  2084 00000B67 66F7E3                  	mul     bx
  2085 00000B6A 66F735[A6510000]        	div     word [MixSpeed]
  2086 00000B71 30F6                    	xor     dh, dh
  2087 00000B73 88E2                    	mov     dl, ah
  2088 00000B75 88C4                    	mov     ah, al
  2089 00000B77 30C0                    	xor     al, al
  2090                                  	;mov	cx, 857
  2091 00000B79 66B9610D                	mov	cx, 3425  ; 01/10/2017 (TMODPLAY.ASM)
  2092 00000B7D 31DB                    	xor     ebx, ebx
  2093 00000B7F BF[A2580000]            	mov     edi, PitchTable
  2094                                  PitchLoop:      
  2095 00000B84 50                      	push    eax
  2096 00000B85 52                      	push    edx
  2097 00000B86 6639DA                  	cmp     dx, bx
  2098 00000B89 7303                    	jae     short NoDiv
  2099 00000B8B 66F7F3                  	div     bx
  2100                                  NoDiv:          
  2101 00000B8E 66AB                    	stosw
  2102 00000B90 5A                      	pop     edx
  2103 00000B91 58                      	pop     eax
  2104                                  	;inc	bx
  2105 00000B92 43                      	inc	ebx
  2106 00000B93 E2EF                    	loop    PitchLoop
  2107                                  MakeVolume:     
  2108 00000B95 66B90041                	mov     cx, 16640
  2109 00000B99 89CB                    	mov     ebx, ecx
  2110                                  VolLoop:
  2111 00000B9B 664B                    	dec     bx
  2112 00000B9D 88D8                    	mov     al, bl
  2113 00000B9F F6EF                    	imul    bh
  2114                                  	;mov	[VolTable+bx], ah
  2115 00000BA1 88A3[64730000]          	mov     [VolTable+ebx], ah
  2116 00000BA7 E2F2                    	loop    VolLoop
  2117                                  
  2118 00000BA9 61                      	popad
  2119 00000BAA C3                      	retn
  2120                                  
  2121                                  ;--------------------------------------------------------------------------
  2122                                  ; StopPlaying: ShutDown the Sound System.
  2123                                  ;--------------------------------------------------------------------------
  2124                                  
  2125                                  StopPlaying:
  2126                                  	; 19/06/2017
  2127                                  	; Stop Playing
  2128                                  	sys	_audio, 0700h
  2129                              <1> 
  2130                              <1> 
  2131                              <1> 
  2132                              <1> 
  2133                              <1>  %if %0 >= 2
  2134 00000BAB BB00070000          <1>  mov ebx, %2
  2135                              <1>  %if %0 >= 3
  2136                              <1>  mov ecx, %3
  2137                              <1>  %if %0 = 4
  2138                              <1>  mov edx, %4
  2139                              <1>  %endif
  2140                              <1>  %endif
  2141                              <1>  %endif
  2142 00000BB0 B820000000          <1>  mov eax, %1
  2143                              <1> 
  2144 00000BB5 CD40                <1>  int 40h
  2145                                  	; Cancel callback service (for user)
  2146                                  	sys	_audio, 0900h
  2147                              <1> 
  2148                              <1> 
  2149                              <1> 
  2150                              <1> 
  2151                              <1>  %if %0 >= 2
  2152 00000BB7 BB00090000          <1>  mov ebx, %2
  2153                              <1>  %if %0 >= 3
  2154                              <1>  mov ecx, %3
  2155                              <1>  %if %0 = 4
  2156                              <1>  mov edx, %4
  2157                              <1>  %endif
  2158                              <1>  %endif
  2159                              <1>  %endif
  2160 00000BBC B820000000          <1>  mov eax, %1
  2161                              <1> 
  2162 00000BC1 CD40                <1>  int 40h
  2163                                  	; Deallocate Audio Buffer (for user)
  2164                                  	sys	_audio, 0A00h
  2165                              <1> 
  2166                              <1> 
  2167                              <1> 
  2168                              <1> 
  2169                              <1>  %if %0 >= 2
  2170 00000BC3 BB000A0000          <1>  mov ebx, %2
  2171                              <1>  %if %0 >= 3
  2172                              <1>  mov ecx, %3
  2173                              <1>  %if %0 = 4
  2174                              <1>  mov edx, %4
  2175                              <1>  %endif
  2176                              <1>  %endif
  2177                              <1>  %endif
  2178 00000BC8 B820000000          <1>  mov eax, %1
  2179                              <1> 
  2180 00000BCD CD40                <1>  int 40h
  2181                                  	; Disable Audio Device
  2182                                  	sys	_audio, 0C00h
  2183                              <1> 
  2184                              <1> 
  2185                              <1> 
  2186                              <1> 
  2187                              <1>  %if %0 >= 2
  2188 00000BCF BB000C0000          <1>  mov ebx, %2
  2189                              <1>  %if %0 >= 3
  2190                              <1>  mov ecx, %3
  2191                              <1>  %if %0 = 4
  2192                              <1>  mov edx, %4
  2193                              <1>  %endif
  2194                              <1>  %endif
  2195                              <1>  %endif
  2196 00000BD4 B820000000          <1>  mov eax, %1
  2197                              <1> 
  2198 00000BD9 CD40                <1>  int 40h
  2199                                  
  2200 00000BDB C3                      	retn
  2201                                  
  2202                                  ;=============================================================================
  2203                                  ; 
  2204                                  ;=============================================================================
  2205                                  
  2206                                  ;dword2str:
  2207                                  ;	; 13/11/2016 - Erdogan Tan 
  2208                                  ;	; eax = dword value
  2209                                  ;	;
  2210                                  ;	call	dwordtohex
  2211                                  ;	mov	[dword_str], edx
  2212                                  ;	mov	[dword_str+4], eax
  2213                                  ;	mov	si, dword_str
  2214                                  ;	retn
  2215                                  
  2216                                  	; 05/03/2017 (TRDOS 386)
  2217                                  	; trdos386.s (unix386.s) - 10/05/2015
  2218                                  	; Convert binary number to hexadecimal string
  2219                                  
  2220                                  ;bytetohex:
  2221                                  ;	; INPUT ->
  2222                                  ;	; 	AL = byte (binary number)
  2223                                  ;	; OUTPUT ->
  2224                                  ;	;	AX = hexadecimal string
  2225                                  ;	;
  2226                                  ;	push	ebx
  2227                                  ;	movzx	ebx, al
  2228                                  ;	shr	bl, 4
  2229                                  ;	mov	bl, [ebx+hex_chars] 	 	
  2230                                  ;	xchg	bl, al
  2231                                  ;	and	bl, 0Fh
  2232                                  ;	mov	ah, [ebx+hex_chars] 
  2233                                  ;	pop	ebx	
  2234                                  ;	retn
  2235                                  
  2236                                  ;wordtohex:
  2237                                  ;	; INPUT ->
  2238                                  ;	; 	AX = word (binary number)
  2239                                  ;	; OUTPUT ->
  2240                                  ;	;	EAX = hexadecimal string
  2241                                  ;	;
  2242                                  ;	push	ebx
  2243                                  ;	xor	ebx, ebx
  2244                                  ;	xchg	ah, al
  2245                                  ;	push	eax
  2246                                  ;	mov	bl, ah
  2247                                  ;	shr	bl, 4
  2248                                  ;	mov	al, [ebx+hex_chars] 	 	
  2249                                  ;	mov	bl, ah
  2250                                  ;	and	bl, 0Fh
  2251                                  ;	mov	ah, [ebx+hex_chars]
  2252                                  ;	shl	eax, 16
  2253                                  ;	pop	eax
  2254                                  ;	pop	ebx
  2255                                  ;	jmp	short bytetohex
  2256                                  
  2257                                  ;dwordtohex:
  2258                                  ;	; INPUT ->
  2259                                  ;	; 	EAX = dword (binary number)
  2260                                  ;	; OUTPUT ->
  2261                                  ;	;	EDX:EAX = hexadecimal string
  2262                                  ;	;
  2263                                  ;	push	eax
  2264                                  ;	shr	eax, 16
  2265                                  ;	call	wordtohex
  2266                                  ;	mov	edx, eax
  2267                                  ;	pop	eax
  2268                                  ;	call	wordtohex
  2269                                  ;	retn
  2270                                  
  2271                                  	; 19/06/2017
  2272                                  	; 05/03/2017 (TRDOS 386)
  2273                                  	; 13/11/2016 - Erdogan Tan
  2274                                  write_audio_dev_info:
  2275                                  	; BUS/DEV/FN
  2276                                  	;	00000000BBBBBBBBDDDDDFFF00000000
  2277                                  	; DEV/VENDOR
  2278                                  	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  2279                                  
  2280 00000BDC 8B35[58520000]          	mov	esi, [dev_vendor]
  2281 00000BE2 6689F0                  	mov	ax, si
  2282 00000BE5 0FB6D8                  	movzx	ebx, al
  2283 00000BE8 88DA                    	mov	dl, bl
  2284 00000BEA 80E30F                  	and	bl, 0Fh
  2285 00000BED 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2286 00000BF3 A2[ED510000]            	mov	[msgVendorId+3], al
  2287 00000BF8 88D3                    	mov	bl, dl
  2288 00000BFA C0EB04                  	shr	bl, 4
  2289 00000BFD 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2290 00000C03 A2[EC510000]            	mov	[msgVendorId+2], al
  2291 00000C08 88E3                    	mov	bl, ah
  2292 00000C0A 88DA                    	mov	dl, bl
  2293 00000C0C 80E30F                  	and	bl, 0Fh
  2294 00000C0F 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2295 00000C15 A2[EB510000]            	mov	[msgVendorId+1], al
  2296 00000C1A 88D3                    	mov	bl, dl
  2297 00000C1C C0EB04                  	shr	bl, 4
  2298 00000C1F 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2299 00000C25 A2[EA510000]            	mov	[msgVendorId], al
  2300 00000C2A C1EE10                  	shr	esi, 16
  2301 00000C2D 6689F0                  	mov	ax, si
  2302 00000C30 88C3                    	mov	bl, al
  2303 00000C32 88DA                    	mov	dl, bl
  2304 00000C34 80E30F                  	and	bl, 0Fh
  2305 00000C37 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2306 00000C3D A2[FE510000]            	mov	[msgDevId+3], al
  2307 00000C42 88D3                    	mov	bl, dl
  2308 00000C44 C0EB04                  	shr	bl, 4
  2309 00000C47 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2310 00000C4D A2[FD510000]            	mov	[msgDevId+2], al
  2311 00000C52 88E3                    	mov	bl, ah
  2312 00000C54 88DA                    	mov	dl, bl
  2313 00000C56 80E30F                  	and	bl, 0Fh
  2314 00000C59 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2315 00000C5F A2[FC510000]            	mov	[msgDevId+1], al
  2316 00000C64 88D3                    	mov	bl, dl
  2317 00000C66 C0EB04                  	shr	bl, 4
  2318 00000C69 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2319 00000C6F A2[FB510000]            	mov	[msgDevId], al
  2320                                  
  2321 00000C74 8B35[5C520000]          	mov	esi, [bus_dev_fn]
  2322 00000C7A C1EE08                  	shr	esi, 8
  2323 00000C7D 6689F0                  	mov	ax, si
  2324 00000C80 88C3                    	mov	bl, al
  2325 00000C82 88DA                    	mov	dl, bl
  2326 00000C84 80E307                  	and	bl, 7 ; bit 0,1,2
  2327 00000C87 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2328 00000C8D A2[22520000]            	mov	[msgFncNo+1], al
  2329 00000C92 88D3                    	mov	bl, dl
  2330 00000C94 C0EB03                  	shr	bl, 3
  2331 00000C97 88DA                    	mov	dl, bl
  2332 00000C99 80E30F                  	and	bl, 0Fh
  2333 00000C9C 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2334 00000CA2 A2[14520000]            	mov	[msgDevNo+1], al
  2335 00000CA7 88D3                    	mov	bl, dl
  2336 00000CA9 C0EB04                  	shr	bl, 4
  2337 00000CAC 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2338 00000CB2 A2[13520000]            	mov	[msgDevNo], al
  2339 00000CB7 88E3                    	mov	bl, ah
  2340 00000CB9 88DA                    	mov	dl, bl
  2341 00000CBB 80E30F                  	and	bl, 0Fh
  2342 00000CBE 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2343 00000CC4 A2[08520000]            	mov	[msgBusNo+1], al
  2344 00000CC9 88D3                    	mov	bl, dl
  2345 00000CCB C0EB04                  	shr	bl, 4
  2346 00000CCE 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2347 00000CD4 A2[07520000]            	mov	[msgBusNo], al
  2348                                  
  2349 00000CD9 66A1[64520000]          	mov	ax, [ac97_io_base]
  2350 00000CDF 88C3                    	mov	bl, al
  2351 00000CE1 88DA                    	mov	dl, bl
  2352 00000CE3 80E30F                  	and	bl, 0Fh
  2353 00000CE6 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2354 00000CEC A2[3B520000]            	mov	[msgIOBaseAddr+3], al
  2355 00000CF1 88D3                    	mov	bl, dl
  2356 00000CF3 C0EB04                  	shr	bl, 4
  2357 00000CF6 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2358 00000CFC A2[3A520000]            	mov	[msgIOBaseAddr+2], al
  2359 00000D01 88E3                    	mov	bl, ah
  2360 00000D03 88DA                    	mov	dl, bl
  2361 00000D05 80E30F                  	and	bl, 0Fh
  2362 00000D08 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2363 00000D0E A2[39520000]            	mov	[msgIOBaseAddr+1], al
  2364 00000D13 88D3                    	mov	bl, dl
  2365 00000D15 C0EB04                  	shr	bl, 4
  2366 00000D18 8A83[A8510000]          	mov	al, [ebx+hex_chars]
  2367 00000D1E A2[38520000]            	mov	[msgIOBaseAddr], al
  2368                                  
  2369                                  	; 24/11/2016
  2370 00000D23 30E4                    	xor	ah, ah
  2371 00000D25 A0[66520000]            	mov	al, [ac97_int_ln_reg]
  2372 00000D2A B10A                    	mov	cl, 10
  2373 00000D2C F6F1                    	div	cl
  2374 00000D2E 660105[43520000]        	add	[msgIRQ], ax
  2375 00000D35 20C0                    	and	al, al
  2376 00000D37 750D                    	jnz	short _w_ac97imsg_ ; 19/06/2017
  2377 00000D39 A0[44520000]            	mov	al, [msgIRQ+1]
  2378 00000D3E B420                    	mov	ah, ' '
  2379 00000D40 66A3[43520000]          	mov	[msgIRQ], ax
  2380                                  _w_ac97imsg_:
  2381                                  	; EBX = Message address
  2382                                  	; ECX = Max. message length (or stop on ZERO character)
  2383                                  	;	(1 to 255)
  2384                                  	; DL  = Message color (07h = light gray, 0Fh = white) 
  2385                                       	sys 	_msg, msgAC97Info, 255, 07h
  2386                              <1> 
  2387                              <1> 
  2388                              <1> 
  2389                              <1> 
  2390                              <1>  %if %0 >= 2
  2391 00000D46 BB[B9510000]        <1>  mov ebx, %2
  2392                              <1>  %if %0 >= 3
  2393 00000D4B B9FF000000          <1>  mov ecx, %3
  2394                              <1>  %if %0 = 4
  2395 00000D50 BA07000000          <1>  mov edx, %4
  2396                              <1>  %endif
  2397                              <1>  %endif
  2398                              <1>  %endif
  2399 00000D55 B823000000          <1>  mov eax, %1
  2400                              <1> 
  2401 00000D5A CD40                <1>  int 40h
  2402 00000D5C C3                              retn
  2403                                  
  2404                                  ;=============================================================================
  2405                                  ;	gfx.asm - draw scopes in VGA 640x480x16 mode      
  2406                                  ;=============================================================================
  2407                                  
  2408                                  ; EX1A.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2409                                  
  2410                                  ;-----------------------------------------------------------------------------
  2411                                  ; setgraphmode - setup the VGA 640x480x16 graphics mode
  2412                                  ;-----------------------------------------------------------------------------
  2413                                  	; 22/10/2017
  2414                                  setgraphmode:
  2415                                  	;pushad
  2416 00000D5D 66B81200                	mov	ax,0012h
  2417                                  	;int	10h
  2418 00000D61 CD31                    	int 	31h
  2419 00000D63 66BAC003                	mov	dx,3C0h
  2420 00000D67 30C0                    	xor	al,al
  2421                                  setgraphmodel0:
  2422                                  	;out	dx,al
  2423 00000D69 B401                    	mov	ah, 1 ; outb
  2424 00000D6B CD34                    	int	34h
  2425                                  	;out	dx, al
  2426                                  	;mov	ah, 1
  2427 00000D6D CD34                    	int	34h
  2428 00000D6F FEC0                    	inc	al
  2429 00000D71 3C10                    	cmp	al, 10h
  2430 00000D73 72F4                    	jb	short setgraphmodel0
  2431 00000D75 B020                    	mov	al, 20h
  2432                                  	;out	dx, al
  2433                                  	;mov	ah, 1
  2434 00000D77 CD34                    	int	34h
  2435                                  	;popad
  2436 00000D79 C3                      	retn
  2437                                  
  2438                                  ;-----------------------------------------------------------------------------
  2439                                  ; settextmode - restore the VGA 80x25x16 text mode
  2440                                  ;-----------------------------------------------------------------------------
  2441                                  	; 22/10/2017
  2442                                  settextmode:
  2443                                  	;pushad
  2444 00000D7A 66B80300                	mov	ax, 0003h
  2445                                  	;int	10h
  2446 00000D7E CD31                    	int	31h
  2447                                  	;popad
  2448 00000D80 C3                      	retn
  2449                                  
  2450                                  ;-----------------------------------------------------------------------------
  2451                                  ; drawscopes - draw the track voices sample scopes
  2452                                  ; In:
  2453                                  ;  ESI = (current) sample buffer
  2454                                  ;-----------------------------------------------------------------------------
  2455                                  	; 29/10/2017
  2456                                  	; 28/10/2017
  2457                                  	; (ESI = Current DMA buffer offset)
  2458                                  	; 27/10/2017
  2459                                  	; 26/10/2017
  2460                                  	; 23/10/2017
  2461                                  drawscopes:
  2462                                  	;pushad
  2463                                    	;mov	esi, g_buff
  2464                                  	;mov	esi, edx
  2465 00000D81 31C9                    	xor     ecx, ecx	
  2466 00000D83 31D2                    	xor     edx, edx
  2467 00000D85 31FF                    	xor	edi, edi
  2468                                  drawscope0:
  2469 00000D87 66AD                    	lodsw
  2470 00000D89 80F480                  	xor	ah, 80h
  2471 00000D8C 0FB6DC                  	movzx	ebx, ah  ; Left Channel
  2472 00000D8F 66D1E3                  	shl	bx, 1
  2473 00000D92 668B83[A0D50000]        	mov	ax, [RowOfs+ebx]
  2474 00000D99 668987[A0D70000]        	mov	[NewScope_L+edi], ax
  2475 00000DA0 30FF                    	xor	bh, bh
  2476 00000DA2 66AD                    	lodsw
  2477 00000DA4 80F480                  	xor	ah, 80h
  2478 00000DA7 88E3                    	mov	bl, ah	; Right Channel
  2479 00000DA9 66D1E3                  	shl	bx, 1
  2480 00000DAC 668B83[A0D50000]        	mov	ax, [RowOfs+ebx]
  2481 00000DB3 668987[A0D90000]        	mov	[NewScope_R+edi], ax
  2482 00000DBA 6683C702                	add	di, 2
  2483 00000DBE FEC1                    	inc	cl
  2484 00000DC0 75C5                    	jnz	short drawscope0	
  2485                                  
  2486 00000DC2 66BAC403                        mov	dx, 3C4h
  2487                                          ;mov	ax, 0802h
  2488                                          ;out	dx, ax
  2489 00000DC6 66BB0208                        mov	bx, 0802h
  2490 00000DCA B403                    	mov	ah, 3 ; outw
  2491 00000DCC CD34                    	int	34h
  2492 00000DCE 66BACE03                	mov	dx, 3CEh
  2493 00000DD2 B008                            mov	al, 08h
  2494                                         ;out	dx, al
  2495 00000DD4 B401                            mov	ah, 1 ; outb
  2496 00000DD6 CD34                    	int	34h
  2497 00000DD8 6642                    	inc	dx
  2498                                  
  2499                                  	; 26/10/2017
  2500 00000DDA 31F6                            xor	esi, esi
  2501                                         ;xor	edi, edi
  2502 00000DDC BB45060A00                      mov     ebx, 0A0645h
  2503                                  drawscopel4:
  2504 00000DE1 B080                            mov     al, 80h
  2505                                  drawscopel2:
  2506 00000DE3 50                              push    eax ; *
  2507 00000DE4 52                              push    edx ; **
  2508                                  	;out	dx, al
  2509 00000DE5 B401                    	mov	ah, 1 ; outb
  2510 00000DE7 CD34                    	int	34h
  2511                                  
  2512 00000DE9 B4FF                            mov	ah, 0FFh
  2513                                          ;mov	ecx, 32
  2514 00000DEB B120                    	mov	cl, 32
  2515 00000DED 28C0                    	sub     al, al
  2516                                  drawscopel3:
  2517                                  	; 23/10/2017
  2518 00000DEF 668B96[A0DB0000]                mov	dx, [OldScope_L+esi]
  2519 00000DF6 663B96[A0D70000]                cmp	dx, [NewScope_L+esi]
  2520 00000DFD 7414                            je	short drawscopef3
  2521 00000DFF 88041A                          mov	[edx+ebx], al ; L
  2522 00000E02 668B96[A0D70000]                mov     dx, [NewScope_L+esi]
  2523 00000E09 88241A                  	mov	[edx+ebx], ah ; L
  2524 00000E0C 668996[A0DB0000]                mov     [OldScope_L+esi], dx
  2525                                  drawscopef3:
  2526                                  	; 27/10/2017
  2527 00000E13 668B96[A0DD0000]                mov	dx, [OldScope_R+esi]
  2528 00000E1A 663B96[A0D90000]                cmp	dx, [NewScope_R+esi]
  2529 00000E21 7416                            je	short drawscopef4
  2530 00000E23 88441A26                	mov	[edx+ebx+38], al ; R
  2531 00000E27 668B96[A0D90000]                mov     dx, [NewScope_R+esi]
  2532 00000E2E 88641A26                        mov	[edx+ebx+38], ah ; R
  2533 00000E32 668996[A0DD0000]                mov     [OldScope_R+esi], dx
  2534                                  drawscopef4:
  2535 00000E39 83C610                  	add	esi, 2*8
  2536 00000E3C 43                      	inc	ebx
  2537 00000E3D E2B0                    	loop    drawscopel3
  2538                                  
  2539 00000E3F 5A                              pop     edx ; **
  2540 00000E40 58                              pop     eax ; *
  2541 00000E41 81EEFE010000            	sub	esi, 2*256-2
  2542 00000E47 83EB20                  	sub	ebx, 32
  2543 00000E4A D0E8                            shr     al, 1
  2544 00000E4C 7595                            jnz	short drawscopel2
  2545                                  	;popad
  2546 00000E4E C3                              retn
  2547                                  
  2548                                  ;=============================================================================
  2549                                  ;	Load IFF/ILBM files for VGA 640x480x16 graphics mode       
  2550                                  ;=============================================================================
  2551                                  
  2552                                  ; EX1B.ASM (21/6/1994, Carlos Hasan; MSDOS, 'RUNME.EXE', 'TNYPL211')
  2553                                  
  2554                                  ; 21/10/2017 (TRDOS 386, 'tmodplay.s', Erdogan Tan, NASM syntax)
  2555                                  
  2556                                  ;-----------------------------------------------------------------------------
  2557                                  ; EQUATES AND STRUCTURES
  2558                                  ;-----------------------------------------------------------------------------
  2559                                  
  2560                                  ID_FORM equ 4D524F46h		; IFF/ILBM chunk IDs
  2561                                  ID_ILBM equ 4D424C49h
  2562                                  ID_BMHD equ 44484D42h
  2563                                  ID_CMAP equ 50414D43h
  2564                                  ID_BODY equ 59444F42h
  2565                                  
  2566                                  struc Form			; IFF/ILBM header file format
  2567 00000000 <res 00000004>            .ID:		resd 1
  2568 00000004 <res 00000004>            .Length:	resd 1
  2569 00000008 <res 00000004>            .Type:	resd 1
  2570                                    .size:
  2571                                  endstruc
  2572                                  
  2573                                  struc Chunk			; IFF/ILBM header chunk format
  2574 00000000 <res 00000004>            .ID:		resd 1
  2575 00000004 <res 00000004>            .Length:	resd 1
  2576                                    .size:	
  2577                                  endstruc
  2578                                  
  2579                                  struc BMHD			; IFF/ILBM BMHD chunk format
  2580 00000000 <res 00000002>            .Width: 	resw 1
  2581 00000002 <res 00000002>            .Height:	resw 1
  2582 00000004 <res 00000002>            .PosX:	resw 1
  2583 00000006 <res 00000002>            .PosY:	resw 1
  2584 00000008 <res 00000001>            .Planes:	resb 1
  2585 00000009 <res 00000001>            .Masking:	resb 1
  2586 0000000A <res 00000001>            .Compression:	resb 1
  2587 0000000B <res 00000001>            .Pad:		resb 1
  2588 0000000C <res 00000002>            .Transparent:	resw 1
  2589 0000000E <res 00000001>            .AspectX	resb 1
  2590 0000000F <res 00000001>            .AspectY:	resb 1
  2591 00000010 <res 00000002>            .PageWidth:	resw 1
  2592 00000012 <res 00000002>            .PageHeight:	resw 1
  2593                                    .size:	
  2594                                  endstruc
  2595                                  
  2596                                  struc CMAP			; IFF/ILBM CMAP chunk format
  2597 00000000 <res 00000300>            .Colors:	resb 768
  2598                                    .size:	
  2599                                  endstruc
  2600                                  
  2601                                  ;LOGO_ADDRESS	equ 100000h	; virtual address at the end of the 1st 1MB
  2602                                  
  2603                                  ;------------------------------------------------------------------------------
  2604                                  ; bswap - macro to reverse the byte order of a 32-bit register, converting
  2605                                  ;         a value in little/big endian form to big/little endian form.
  2606                                  ;------------------------------------------------------------------------------
  2607                                  %macro	bswap   1
  2608                                          xchg    al, ah
  2609                                          rol     eax, 16
  2610                                          xchg    al, ah
  2611                                  %endmacro
  2612                                  
  2613                                  ;------------------------------------------------------------------------------
  2614                                  ; putlbm - draw the IFF/ILBM picture on VGA 640x480x16 graphics mode
  2615                                  ; In:
  2616                                  ;  ESI = IFF/ILBM image file address
  2617                                  ;------------------------------------------------------------------------------
  2618                                  putlbm:
  2619 00000E4F 60                              pushad
  2620                                  
  2621                                  ; check if this is a valid IFF/ILBM Deluxe Paint file
  2622                                  
  2623 00000E50 813E464F524D                    cmp     dword [esi+Form.ID], ID_FORM
  2624 00000E56 7551                            jne     short putlbmd0
  2625 00000E58 817E08494C424D                  cmp     dword [esi+Form.Type], ID_ILBM
  2626 00000E5F 7548                            jne     short putlbmd0
  2627                                  
  2628                                  ; get the IFF/ILBM file length in bytes
  2629                                  
  2630 00000E61 8B4604                          mov     eax, [esi+Form.Length]
  2631                                          bswap   eax
  2632 00000E64 86C4                <1>  xchg al, ah
  2633 00000E66 C1C010              <1>  rol eax, 16
  2634 00000E69 86C4                <1>  xchg al, ah
  2635 00000E6B 89C1                            mov     ecx, eax
  2636                                  
  2637                                  ; decrease the file length and updates the file pointer
  2638                                  
  2639 00000E6D 83E904                          sub     ecx, 4
  2640 00000E70 83C60C                          add     esi, Form.size
  2641                                  
  2642                                  ; IFF/ILBM main parser body loop
  2643                                  
  2644                                  putlbml0:
  2645 00000E73 85C9                            test    ecx, ecx
  2646 00000E75 7E64                            jle     short putlbmd1
  2647                                  
  2648                                  ; get the next chunk ID and length in bytes
  2649                                  
  2650 00000E77 8B1E                            mov     ebx, [esi+Chunk.ID]
  2651 00000E79 8B4604                          mov     eax, [esi+Chunk.Length]
  2652                                          bswap   eax
  2653 00000E7C 86C4                <1>  xchg al, ah
  2654 00000E7E C1C010              <1>  rol eax, 16
  2655 00000E81 86C4                <1>  xchg al, ah
  2656 00000E83 93                              xchg    ebx, eax
  2657 00000E84 83C608                          add     esi, Chunk.size
  2658                                  
  2659                                  ; word align the chunk length and decrease the file length counter
  2660                                  
  2661 00000E87 43                              inc     ebx
  2662 00000E88 80E3FE                          and     bl, 0FEh ; ~1
  2663 00000E8B 83E908                          sub     ecx, Chunk.size
  2664 00000E8E 29D9                            sub     ecx, ebx
  2665                                  
  2666                                  ; check for the BMHD/CMAP/BODY chunk headers
  2667                                  
  2668 00000E90 3D424D4844                      cmp     eax, ID_BMHD
  2669 00000E95 7415                            je      short putlbmf0
  2670 00000E97 3D434D4150                      cmp     eax, ID_CMAP
  2671 00000E9C 7440                            je      short putlbmf1
  2672 00000E9E 3D424F4459                      cmp     eax, ID_BODY
  2673 00000EA3 7455                            je      short putlbmf2
  2674                                  
  2675                                  ; advance to the next IFF/ILBM chunk structure
  2676                                  
  2677                                  putlbmc0:
  2678 00000EA5 01DE                            add     esi, ebx
  2679 00000EA7 EBCA                            jmp     short putlbml0
  2680                                  
  2681                                  putlbmd0:
  2682 00000EA9 F9                              stc
  2683 00000EAA 61                              popad
  2684 00000EAB C3                              retn
  2685                                  
  2686                                  ; process the BMHD bitmap header chunk
  2687                                  
  2688                                  putlbmf0:
  2689 00000EAC 807E0804                        cmp     byte [esi+BMHD.Planes], 4
  2690 00000EB0 75F7                            jne     short putlbmd0
  2691 00000EB2 807E0A01                        cmp     byte [esi+BMHD.Compression], 1
  2692 00000EB6 75F1                            jne     short putlbmd0
  2693 00000EB8 807E0B00                        cmp     byte [esi+BMHD.Pad], 0
  2694 00000EBC 75EB                            jne     short putlbmd0
  2695 00000EBE 0FB706                          movzx   eax, word [esi+BMHD.Width]
  2696 00000EC1 86C4                            xchg    al, ah
  2697 00000EC3 83C007                          add     eax, 7
  2698 00000EC6 C1E803                          shr     eax, 3
  2699 00000EC9 A3[50520000]                    mov     [picture.width], eax
  2700 00000ECE 0FB74602                        movzx   eax, word [esi+BMHD.Height]
  2701 00000ED2 86C4                            xchg    al, ah
  2702 00000ED4 A3[54520000]                    mov     [picture.height], eax
  2703 00000ED9 EBCA                            jmp     short putlbmc0
  2704                                  
  2705                                  putlbmd1:
  2706 00000EDB F8                              clc
  2707 00000EDC 61                              popad
  2708 00000EDD C3                              retn
  2709                                  
  2710                                  ; process the CMAP colormap chunk
  2711                                  
  2712                                  putlbmf1:
  2713 00000EDE 66BAC803                        mov     dx, 3C8h
  2714 00000EE2 30C0                            xor     al, al
  2715                                          ;out	dx, al
  2716 00000EE4 B401                    	mov	ah, 1 ; outb
  2717 00000EE6 CD34                    	int	34h
  2718 00000EE8 6642                            inc     dx
  2719                                  putlbml1:
  2720 00000EEA 8A06                            mov     al, [esi]
  2721 00000EEC C0E802                          shr     al, 2
  2722                                          ;out	dx, al
  2723                                  	;mov	ah, 1 ; outb
  2724 00000EEF CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2725 00000EF1 46                              inc     esi
  2726 00000EF2 4B                              dec     ebx
  2727 00000EF3 7FF5                            jg      short putlbml1
  2728 00000EF5 E979FFFFFF                      jmp     putlbml0
  2729                                  
  2730                                  ; process the BODY bitmap body chunk
  2731                                  
  2732                                  putlbmf2:
  2733 00000EFA 60                              pushad
  2734 00000EFB BF00000A00                      mov     edi, 0A0000h
  2735                                          ;cld
  2736 00000F00 66BACE03                        mov     dx, 3CEh
  2737                                          ;mov	ax, 0FF08h
  2738                                          ;out	dx, ax
  2739 00000F04 66BB08FF                	mov	bx, 0FF08h
  2740 00000F08 B403                    	mov	ah, 3 ; outw
  2741 00000F0A CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2742 00000F0C 66BAC403                        mov     dx, 3C4h
  2743 00000F10 B002                            mov     al, 02h
  2744                                          ;out	dx, al
  2745 00000F12 B401                    	mov	ah, 1 ; outb
  2746 00000F14 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2747 00000F16 6642                            inc     dx
  2748 00000F18 8B0D[54520000]                  mov     ecx, [picture.height]
  2749                                  putlbml2:
  2750 00000F1E 51                              push    ecx
  2751 00000F1F B011                            mov     al, 11h
  2752                                  putlbml3:
  2753 00000F21 50                              push    eax
  2754 00000F22 57                              push    edi
  2755                                          ;out	dx, al
  2756 00000F23 B401                    	mov	ah, 1 ; outb
  2757 00000F25 CD34                    	int	34h ; IOCTL interrupt (IN/OUT)
  2758 00000F27 8B1D[50520000]                  mov     ebx, [picture.width]
  2759                                  putlbml4:
  2760 00000F2D AC                              lodsb
  2761 00000F2E 84C0                            test    al, al
  2762 00000F30 7C0A                            jl      short putlbmf3
  2763 00000F32 0FB6C8                          movzx   ecx, al
  2764 00000F35 41                              inc     ecx
  2765 00000F36 29CB                            sub     ebx, ecx
  2766 00000F38 F3A4                            rep     movsb
  2767 00000F3A EB0B                            jmp     short putlbmc4
  2768                                  putlbmf3:
  2769 00000F3C F6D8                            neg     al
  2770 00000F3E 0FB6C8                          movzx   ecx, al
  2771 00000F41 41                              inc     ecx
  2772 00000F42 29CB                            sub     ebx, ecx
  2773 00000F44 AC                              lodsb
  2774 00000F45 F3AA                            rep     stosb
  2775                                  putlbmc4:
  2776 00000F47 85DB                            test    ebx, ebx
  2777 00000F49 7FE2                            jg      short putlbml4
  2778 00000F4B 5F                              pop     edi
  2779 00000F4C 58                              pop     eax
  2780 00000F4D 00C0                            add     al, al
  2781 00000F4F 73D0                            jnc     short putlbml3
  2782 00000F51 83C750                          add     edi, 80
  2783 00000F54 59                              pop     ecx
  2784 00000F55 E2C7                            loop    putlbml2
  2785 00000F57 61                      	popad
  2786 00000F58 E948FFFFFF                      jmp	putlbmc0
  2787                                  
  2788                                  ; EX1.C (Carlos Hasan, 21/06/1994)
  2789                                  ;------------------------------------------------------------------------------
  2790                                  ; loadlbm - load the IFF/ILBM image file ("LOGO.LBM") at memory
  2791                                  ;  ESI = IFF/ILBM image file address
  2792                                  ;------------------------------------------------------------------------------
  2793                                  
  2794                                  ;if ((Logo = loadlbm("LOGO.LBM")) == NULL) {
  2795                                  ;       printf("Error loading the IFF/ILBM logo picture\n");
  2796                                  ;       MODStopModule();
  2797                                  ;       MODFreeModule(Song);
  2798                                  ;       return;
  2799                                  ;   }
  2800                                  ;   setgraphmode();
  2801                                  ;   putlbm(Logo);
  2802                                  ;   while (!kbhit())
  2803                                  ;       drawscopes(Song->NumTracks);
  2804                                  ;   settextmode();
  2805                                  ;   free(Logo);
  2806                                  ;   MODStopModule();
  2807                                  ;   MODFreeModule(Song);
  2808                                  
  2809                                  ;loadlbm:
  2810                                  ;	; ebx = ASCIIZ file name address
  2811                                  ;	; ecx = open mode (0 = open for read)	
  2812                                  ;	sys	_open, LOGO_FILE_NAME, 0 ; open for reading
  2813                                  ;	jc	short loadlbm_retn
  2814                                  ;
  2815                                  ;	mov     [LBM_FileHandle], eax
  2816                                  ;
  2817                                  ;	; get file size by moving file pointer to the end of file
  2818                                  ;	; ebx = file handle/number
  2819                                  ;	; ecx : offset = 0
  2820                                  ;	; edx : switch = 2 (move fp to end of file + offset)
  2821                                  ;	sys	_seek, eax, 0, 2
  2822                                  ;	jc	short loadlbm_cf
  2823                                  ;
  2824                                  ;	mov	[LBM_FileSize], eax
  2825                                  ;
  2826                                  ;	; move file pointer to the beginning of the file
  2827                                  ;	; ecx = 0
  2828                                  ;	; edx = 0
  2829                                  ;	;xor	ecx, ecx
  2830                                  ; 	xor	dl, dl
  2831                                  ;	; ebx = [LBM_FileHandle]
  2832                                  ;	sys	_seek
  2833                                  ;	;jc	short loadlbm_cf
  2834                                  ;
  2835                                  ;	; ebx = File handle
  2836                                  ;	; ecx = Buffer address
  2837                                  ;	; edx = Byte count
  2838                                  ;	;sys	_read, [LBM_FileHandle], LOGO_ADDRESS, [LBM_FileSize]
  2839                                  ;	mov	ecx, LOGO_ADDRESS
  2840                                  ;	mov	edx, [LBM_FileSize]
  2841                                  ;	sys	_read
  2842                                  ;	jc	short loadlbm_cf
  2843                                  ;
  2844                                  ;	cmp	eax, edx  ; read count = file size ?
  2845                                  ;	;jb	short loadlbm_cf		 
  2846                                  ;loadlbm_cf:
  2847                                  ;	pushf
  2848                                  ;	sys	_close, [LBM_FileHandle]	
  2849                                  ;	popf
  2850                                  ;loadlbm_retn:
  2851                                  ;	retn	
  2852                                  ;
  2853                                  ;LOGO_FILE_NAME:
  2854                                  ;	db	"LOGO.LBM", 0
  2855                                  
  2856                                  LOGO_ERROR_MSG:
  2857 00000F5D 4572726F72206C6F61-     	db	"Error loading the IFF/ILBM logo picture !", 0Dh, 0Ah, 0 
  2858 00000F66 64696E672074686520-
  2859 00000F6F 4946462F494C424D20-
  2860 00000F78 6C6F676F2070696374-
  2861 00000F81 75726520210D0A00   
  2862                                  
  2863 00000F89 90                      align 2
  2864                                  ; 22/10/2017
  2865                                  LOGO_ADDRESS:
  2866                                  ;incbin "LOGO.LBM"	  	 
  2867                                  ; 27/10/2017
  2868 00000F8A <incbin>                incbin "TINYPLAY.LBM"
  2869                                  
  2870                                  ;=============================================================================
  2871                                  ;               preinitialized data
  2872                                  ;=============================================================================
  2873                                  
  2874                                  ;=============================================================================
  2875                                  ; Protracker effects stuff
  2876                                  ;=============================================================================
  2877                                  
  2878                                  ;-----------------------------------------------------------------------------
  2879                                  ; Effect jump tables
  2880                                  ;-----------------------------------------------------------------------------
  2881                                  
  2882 00004F7A 90<rept>                align 4
  2883                                  
  2884                                  efxtable:
  2885 00004F7C [94070000]              	dd      efxarpeggio	; 0 - arpeggio
  2886 00004F80 [C1040000]              	dd      efxnull		; 1 - porta up
  2887 00004F84 [C1040000]              	dd      efxnull		; 2 - porta down
  2888 00004F88 [DF060000]              	dd      efxtoneporta	; 3 - tone porta
  2889 00004F8C [EE060000]              	dd      efxvibrato	; 4 - vibrato
  2890 00004F90 [C1040000]              	dd      efxnull		; 5 - tone+slide
  2891 00004F94 [C1040000]              	dd      efxnull		; 6 - vibrato+slide
  2892 00004F98 [0B080000]              	dd      efxtremolo	; 7 - tremolo
  2893 00004F9C [C1040000]              	dd      efxnull		; 8 - unused
  2894 00004FA0 [16070000]              	dd      efxsampoffset	; 9 - sample offset
  2895 00004FA4 [C1040000]              	dd      efxnull		; A - volume slide
  2896 00004FA8 [22070000]              	dd      efxpattjump	; B - pattern jump
  2897 00004FAC [30070000]              	dd      efxsetvolume	; C - set volume
  2898 00004FB0 [3E070000]              	dd      efxbreak	; D - break pattern
  2899 00004FB4 [C1040000]              	dd      efxnull		; E - extra effects
  2900 00004FB8 [5D070000]              	dd      efxsetspeed	; F - set speed
  2901                                  
  2902                                  efxtable2:
  2903 00004FBC [C2040000]              	dd      efxarpeggio2	; 0 - arpeggio
  2904 00004FC0 [E4040000]              	dd      efxportaup	; 1 - porta up
  2905 00004FC4 [0A050000]              	dd      efxportadown	; 2 - porta down
  2906 00004FC8 [31050000]              	dd      efxtoneporta2	; 3 - tone porta
  2907 00004FCC [6A050000]              	dd      efxvibrato2	; 4 - vibrato
  2908 00004FD0 [C6050000]              	dd      efxtoneslide	; 5 - tone+slide
  2909 00004FD4 [D3050000]              	dd      efxvibslide	; 6 - vibrato+slide
  2910 00004FD8 [FA050000]              	dd      efxtremolo2	; 7 - tremolo
  2911 00004FDC [C1040000]              	dd      efxnull		; 8 - unused
  2912 00004FE0 [C1040000]              	dd      efxnull		; 9 - sample offset
  2913 00004FE4 [DD050000]              	dd      efxvolslide	; A - volume slide
  2914 00004FE8 [C1040000]              	dd      efxnull		; B - pattern jump
  2915 00004FEC [C1040000]              	dd      efxnull		; C - set volume
  2916 00004FF0 [C1040000]              	dd      efxnull		; D - break pattern
  2917 00004FF4 [C1040000]              	dd      efxnull		; E - extra effects
  2918 00004FF8 [C1040000]              	dd      efxnull		; F - set speed
  2919                                  
  2920                                  ;-----------------------------------------------------------------------------
  2921                                  ; Amiga period table
  2922                                  ;-----------------------------------------------------------------------------
  2923                                  
  2924                                  ;PeriodTable0:	
  2925                                  ;	dw	0
  2926                                  PeriodTable:
  2927 00004FFC 600DA00CE80B400B98-     	dw	3424,3232,3048,2880,2712,2560,2416,2280,2152,2032,1920,1812
  2928 00005005 0A000A7009E8086808-
  2929 0000500E F00780071407       
  2930 00005014 B0065006F405A0054C-     	dw	1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906
  2931 0000501D 050005B80474043404-
  2932 00005026 F803C0038A03       
  2933 0000502C 58032803FA02D002A6-     	dw	856,808,762,720,678,640,604,570,538,508,480,453
  2934 00005035 0280025C023A021A02-
  2935 0000503E FC01E001C501       
  2936 00005044 AC0194017D01680153-     	dw	428,404,381,360,339,320,302,285,269,254,240,226
  2937 0000504D 0140012E011D010D01-
  2938 00005056 FE00F000E200       
  2939 0000505C D600CA00BE00B400AA-     	dw	214,202,190,180,170,160,151,143,135,127,120,113
  2940 00005065 00A00097008F008700-
  2941 0000506E 7F0078007100       
  2942 00005074 6B0065005F005A0055-     	dw	107,101,95,90,85,80,75,71,67,63,60,56
  2943 0000507D 0050004B0047004300-
  2944 00005086 3F003C003800       
  2945 0000508C 350032002F002D002A-     	dw	53,50,47,45,42,40,37,35,33,31,30,28
  2946 00005095 002800250023002100-
  2947 0000509E 1F001E001C00       
  2948                                  
  2949                                  ;-----------------------------------------------------------------------------
  2950                                  ; Sinus wave table
  2951                                  ;-----------------------------------------------------------------------------
  2952                                  
  2953                                  SinTable:
  2954 000050A4 0019324A62788EA2B4-     	db	0,25,50,74,98,120,142,162,180,197,212,225
  2955 000050AD C5D4E1             
  2956 000050B0 ECF4FAFEFFFEFAF4EC-     	db	236,244,250,254,255,254,250,244,236,225
  2957 000050B9 E1                 
  2958 000050BA D4C5B4A28E78624A32-     	db	212,197,180,162,142,120,98,74,50,25
  2959 000050C3 19                 
  2960                                  
  2961                                  ;=============================================================================
  2962                                  ;               PLAY.ASM - DATA
  2963                                  ;=============================================================================
  2964 000050C4 00                      	db	0
  2965                                  msg_usage:
  2966 000050C5 54696E79204D4F4420-     	db	'Tiny MOD Player for TRDOS 386 by Erdogan Tan. '
  2967 000050CE 506C6179657220666F-
  2968 000050D7 72205452444F532033-
  2969 000050E0 383620627920457264-
  2970 000050E9 6F67616E2054616E2E-
  2971 000050F2 20                 
  2972 000050F3 4F63746F6265722032-     	db	'October 2017.',10,13
  2973 000050FC 3031372E0A0D       
  2974 00005102 75736167653A20746D-     	db	'usage: tmodplay filename.mod', 10,13,0
  2975 0000510B 6F64706C6179206669-
  2976 00005114 6C656E616D652E6D6F-
  2977 0000511D 640A0D00           
  2978 00005121 32392F31302F323031-     	db	'29/10/2017',10,13,0
  2979 0000512A 370A0D00           
  2980                                  
  2981                                  Credits:
  2982 0000512E 54696E79204D4F4420-     	db	'Tiny MOD Player v0.1b by Carlos Hasan. July 1993.'
  2983 00005137 506C61796572207630-
  2984 00005140 2E3162206279204361-
  2985 00005149 726C6F732048617361-
  2986 00005152 6E2E204A756C792031-
  2987 0000515B 3939332E           
  2988 0000515F 0A0D00                  	db	10,13,0
  2989                                  ErrorMesg:    
  2990 00005162 4572726F72206C6F61-     	db	'Error loading Module file.',10,13,0
  2991 0000516B 64696E67204D6F6475-
  2992 00005174 6C652066696C652E0A-
  2993 0000517D 0D00               
  2994                                  
  2995                                  ;MsgNotFound: db 'Sound Blaster not found or IRQ error.',10,13,0
  2996                                  ;MsgFound:    db 'Sound Blaster found at Address 2'
  2997                                  ;PortText:    db 'x0h, IRQ '
  2998                                  ;IrqText:     db 'x.',10,13,0
  2999                                  
  3000                                  trdos386_err_msg:
  3001 0000517F 5452444F5320333836-     		db 'TRDOS 386 System call error !', 10, 13,0
  3002 00005188 2053797374656D2063-
  3003 00005191 616C6C206572726F72-
  3004 0000519A 20210A0D00         
  3005                                  
  3006                                  ; 07/10/2017
  3007 0000519F 0A                      pattern_shift:	db 10
  3008                                  ;numtracks:	dw 4
  3009                                  ; 18/10/2017
  3010 000051A0 04000000                numtracks:	dd 4
  3011                                  
  3012                                  ;=============================================================================
  3013                                  ;               PLAYER.ASM - DATA
  3014                                  ;=============================================================================
  3015                                  
  3016                                  ;stmo:		db 1 ; stereo (2) or mono (1)  
  3017                                  ;bps:		db 8 ; bits per sample (8 or 16)
  3018                                  
  3019                                  ;19/10/2017
  3020 000051A4 02                      stmo:		db 2 ; stereo (2) or mono (1)  
  3021 000051A5 10                      bps:		db 16 ; bits per sample (8 or 16)
  3022                                  
  3023                                  Sample_Rate:
  3024 000051A6 2256                    MixSpeed:	dw 22050 ; Hz
  3025                                  
  3026                                  ; 13/11/2016
  3027 000051A8 303132333435363738-     hex_chars:	db "0123456789ABCDEF", 0
  3028 000051B1 3941424344454600   
  3029                                  ;
  3030                                  msgAC97Info:	
  3031 000051B9 0D0A                    		db 0Dh, 0Ah
  3032 000051BB 414339372041756469-     		db "AC97 Audio Controller & Codec Info", 0Dh, 0Ah 
  3033 000051C4 6F20436F6E74726F6C-
  3034 000051CD 6C6572202620436F64-
  3035 000051D6 656320496E666F0D0A 
  3036 000051DF 56656E646F72204944-     		db "Vendor ID: "
  3037 000051E8 3A20               
  3038 000051EA 303030306820446576-     msgVendorId:	db "0000h Device ID: "
  3039 000051F3 6963652049443A20   
  3040 000051FB 30303030680D0A          msgDevId:	db "0000h", 0Dh, 0Ah
  3041 00005202 4275733A20              		db "Bus: "
  3042 00005207 303068204465766963-     msgBusNo:	db "00h Device: "
  3043 00005210 653A20             
  3044 00005213 3030682046756E6374-     msgDevNo:	db "00h Function: "
  3045 0000521C 696F6E3A20         
  3046 00005221 303068                  msgFncNo	db "00h"
  3047 00005224 0D0A                    		db 0Dh, 0Ah
  3048 00005226 492F4F204261736520-     		db "I/O Base Address: "
  3049 0000522F 416464726573733A20 
  3050 00005238 303030306820495251-     msgIOBaseAddr:	db "0000h IRQ: "
  3051 00005241 3A20               
  3052 00005243 3030                    msgIRQ:		dw 3030h
  3053 00005245 0D0A00                  		db 0Dh, 0Ah, 0
  3054                                  ;msgSampleRate:	db "Sample Rate: "
  3055                                  ;msgHertz:	db "00000 Hz ", 0
  3056                                  ;msg8Bits:	db "8 bits ", 0
  3057                                  ;msgMono:	db "Mono", 0Dh, 0Ah, 0Dh, 0Ah, 0
  3058                                  ;msg16Bits:	db "16 bits ", 0
  3059                                  ;msgStereo:	db "Stereo", 0Dh, 0Ah, 0Dh, 0Ah, 0
  3060                                  ;
  3061                                  ;; 13/11/2016 - Erdogan Tan (Ref: KolibriOS, codec.inc)
  3062                                  ;codec_id:	   dd 0
  3063                                  ;codec_chip_id:	   dd 0
  3064                                  ;codec_vendor_ids: dw 0
  3065                                  ;codec_chip_ids:   dw 0
  3066                                  
  3067                                  ;dword_str:	dd 30303030h, 30303030h
  3068                                  ;	 	db 'h', 0Dh, 0Ah, 0
  3069                                  
  3070                                  ;=============================================================================
  3071                                  ;        	uninitialized data
  3072                                  ;=============================================================================
  3073                                  
  3074                                  bss_start:
  3075                                  
  3076                                  ABSOLUTE bss_start
  3077                                  
  3078                                  alignb 4
  3079                                  
  3080                                  ;------------------------------------------------------------------------------
  3081                                  ; IFF/ILBM DATA
  3082                                  ;------------------------------------------------------------------------------
  3083                                  
  3084 00005248 <res 00000004>          LBM_FileHandle:	resd 1
  3085 0000524C <res 00000004>          LBM_FileSize:	resd 1
  3086                                  ;
  3087 00005250 <res 00000004>          picture.width:	resd 1 		; current picture width and height
  3088 00005254 <res 00000004>          picture.height:	resd 1
  3089                                  
  3090                                  ;------------------------------------------------------------------------------
  3091                                  
  3092 00005258 <res 00000004>          dev_vendor:	resd 1
  3093 0000525C <res 00000004>          bus_dev_fn:	resd 1
  3094 00005260 <res 00000004>          stats_cmd:	resd 1
  3095 00005264 <res 00000002>          ac97_io_base:	resw 1
  3096 00005266 <res 00000001>          ac97_int_ln_reg: resb 1
  3097 00005267 <res 00000001>          srb:		resb 1
  3098                                  
  3099                                  ; MODLOAD.ASM
  3100 00005268 <res 00000004>          FileHandle:	resd 1
  3101 0000526C <res 0000043C>          Header:		resb ModHeader.size
  3102                                  
  3103                                  ; MODPLAY.ASM
  3104                                  ;MixSpeed:	    resw 1
  3105                                  
  3106                                  ModInfo:
  3107 000056A8 <res 00000001>          ModInfo.OrderLen:   resb 1
  3108 000056A9 <res 00000001>          ModInfo.ReStart:    resb 1
  3109 000056AA <res 00000080>          ModInfo.Order:	    resb 128
  3110 0000572A <res 00000004>          ModInfo.Patterns:   resd 1
  3111                                  
  3112 0000572E <res 0000003E>          ModInfo.SampOfs:    resw 31
  3113 0000576C <res 0000003E>          ModInfo.SampSeg:    resw 31
  3114 000057AA <res 0000003E>          ModInfo.SampLen:    resw 31
  3115 000057E8 <res 0000003E>          ModInfo.SampRep:    resw 31
  3116 00005826 <res 0000003E>          ModInfo.SampRepLen: resw 31
  3117 00005864 <res 0000003E>          ModInfo.SampVol:    resw 31
  3118                                  
  3119                                  ; MODPLAY.ASM
  3120                                  PitchTable:	;resw 857
  3121 000058A2 <res 00001AC2>          		resw 3425 ; 01/10/2017 (TMODPLAY.ASM)
  3122 00007364 <res 00004100>          VolTable:	resb 16640
  3123 0000B464 <res 00001FEC>          MixBuffer       resb 8172 ; MixBufSize ; 7680 (960*8) ; 18/10/2017
  3124                                  
  3125                                  ; MODPLAY.ASM
  3126 0000D450 <res 00000001>          OrderPos:	resb 1
  3127 0000D451 <res 00000001>          Tempo:		resb 1
  3128 0000D452 <res 00000001>          TempoWait:	resb 1
  3129 0000D453 <res 00000001>          Bpm:		resb 1
  3130 0000D454 <res 00000001>          Row:		resb 1
  3131 0000D455 <res 00000001>          BreakRow:	resb 1
  3132 0000D456 <res 00000002>          BpmSamples:	resw 1
  3133 0000D458 <res 00000004>          BufPtr:		resd 1
  3134 0000D45C <res 00000002>          BufLen:		resw 1
  3135 0000D45E <res 00000004>          BufRep:		resd 1
  3136 0000D462 <res 00000004>          Note:		resd 1
  3137                                  ;Tracks:	resb TrackInfo.size*NumTracks
  3138                                  ; 07/10/2017
  3139 0000D466 <res 00000130>          Tracks:		resb TrackInfo.size*8
  3140                                  
  3141 0000D596 <res 0000000A>          alignb 16
  3142                                  
  3143                                  ; PLAY.ASM
  3144                                  ;Scope:		resw 320
  3145 0000D5A0 <res 00000200>          RowOfs:		resw 256
  3146                                  
  3147                                  ; 23/10/2017
  3148 0000D7A0 <res 00000200>          NewScope_L:	resw 256
  3149 0000D9A0 <res 00000200>          NewScope_R:	resw 256
  3150 0000DBA0 <res 00000200>          OldScope_L:	resw 256
  3151 0000DDA0 <res 00000200>          OldScope_R:	resw 256
  3152                                  
  3153                                  mod_file_name:
  3154 0000DFA0 <res 00000050>          		resb 80
  3155                                  
  3156                                  ; 20/10/2017 (modplay7.s, SB16)
  3157                                  ; 19/10/2017 (modplay6.s, AC97)
  3158 0000DFF0 <res 00000001>          pan_shift:	resb 1
  3159 0000DFF1 <res 00000001>          volume_level:	resb 1
  3160                                  
  3161 0000DFF2 <res 0000000E>          alignb 4096
  3162                                  
  3163                                  Audio_Buffer:
  3164 0000E000 <res 00008000>          		resb BUFFERSIZE ; DMA Buffer Size / 2  (32768)
  3165                                  ;temp_buffer:
  3166                                  ;		;resb BUFFERSIZE / 4 ; 8192
  3167                                  ;		resb BUFFERSIZE / 2 ; 17/10/2017
  3168                                  
  3169 00016000 <res 0000A000>          alignb 65536
  3170                                  
  3171                                  DMA_Buffer:
  3172 00020000 <res 00010000>          		resb 2*BUFFERSIZE  ; 65536 ; 09/10/2017 
  3173                                  file_buffer:
  3174 00030000 <res 00060000>          	resb 65536*6
  3175                                  EOF:
